Добавьте файлы проекта.
This commit is contained in:
parent
f2ca134fab
commit
5d2759a070
4
.idea/.idea.demo-12-14/.idea/encodings.xml
Normal file
4
.idea/.idea.demo-12-14/.idea/encodings.xml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
|
||||||
|
</project>
|
8
.idea/.idea.demo-12-14/.idea/indexLayout.xml
Normal file
8
.idea/.idea.demo-12-14/.idea/indexLayout.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="UserContentModel">
|
||||||
|
<attachedFolders />
|
||||||
|
<explicitIncludes />
|
||||||
|
<explicitExcludes />
|
||||||
|
</component>
|
||||||
|
</project>
|
7
.idea/.idea.demo-12-14/.idea/projectSettingsUpdater.xml
Normal file
7
.idea/.idea.demo-12-14/.idea/projectSettingsUpdater.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="RiderProjectSettingsUpdater">
|
||||||
|
<option name="singleClickDiffPreview" value="1" />
|
||||||
|
<option name="vcsConfiguration" value="3" />
|
||||||
|
</component>
|
||||||
|
</project>
|
4
.idea/.idea.demo-12-14/.idea/vcs.xml
Normal file
4
.idea/.idea.demo-12-14/.idea/vcs.xml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings" defaultProject="true" />
|
||||||
|
</project>
|
41
.idea/.idea.demo-12-14/.idea/workspace.xml
Normal file
41
.idea/.idea.demo-12-14/.idea/workspace.xml
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ChangeListManager">
|
||||||
|
<list default="true" id="d83cfe2c-bda7-4b3a-acd5-26f0c169074d" name="Changes" comment="" />
|
||||||
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||||
|
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectColorInfo"><![CDATA[{
|
||||||
|
"associatedIndex": 5
|
||||||
|
}]]></component>
|
||||||
|
<component name="ProjectId" id="2qCqnpOg3DCCLb21ifgtk6icg0A" />
|
||||||
|
<component name="ProjectViewState">
|
||||||
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
|
<option name="showLibraryContents" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PropertiesComponent"><![CDATA[{
|
||||||
|
"keyToString": {
|
||||||
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
|
"nodejs_package_manager_path": "npm",
|
||||||
|
"vue.rearranger.settings.migration": "true"
|
||||||
|
}
|
||||||
|
}]]></component>
|
||||||
|
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||||
|
<component name="TaskManager">
|
||||||
|
<task active="true" id="Default" summary="Default task">
|
||||||
|
<changelist id="d83cfe2c-bda7-4b3a-acd5-26f0c169074d" name="Changes" comment="" />
|
||||||
|
<created>1734177075418</created>
|
||||||
|
<option name="number" value="Default" />
|
||||||
|
<option name="presentableId" value="Default" />
|
||||||
|
<updated>1734177075418</updated>
|
||||||
|
<workItem from="1734177077014" duration="1000" />
|
||||||
|
</task>
|
||||||
|
<servers />
|
||||||
|
</component>
|
||||||
|
<component name="UnityProjectConfiguration" hasMinimizedUI="false" />
|
||||||
|
<component name="VcsManagerConfiguration">
|
||||||
|
<option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="true" />
|
||||||
|
</component>
|
||||||
|
</project>
|
25
demo-12-14.sln
Normal file
25
demo-12-14.sln
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.11.35222.181
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "demo-12-14", "demo-12-14\demo-12-14.csproj", "{85150DA8-82FE-41D9-B1EE-915B1231DE5F}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{85150DA8-82FE-41D9-B1EE-915B1231DE5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{85150DA8-82FE-41D9-B1EE-915B1231DE5F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{85150DA8-82FE-41D9-B1EE-915B1231DE5F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{85150DA8-82FE-41D9-B1EE-915B1231DE5F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {5344D68D-4280-42B8-9639-32A65BE8879F}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
10
demo-12-14/App.axaml
Normal file
10
demo-12-14/App.axaml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<Application xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
x:Class="demo.App"
|
||||||
|
RequestedThemeVariant="Default">
|
||||||
|
<!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->
|
||||||
|
|
||||||
|
<Application.Styles>
|
||||||
|
<FluentTheme />
|
||||||
|
</Application.Styles>
|
||||||
|
</Application>
|
24
demo-12-14/App.axaml.cs
Normal file
24
demo-12-14/App.axaml.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
using Avalonia;
|
||||||
|
using Avalonia.Controls.ApplicationLifetimes;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
|
||||||
|
namespace demo
|
||||||
|
{
|
||||||
|
public partial class App : Application
|
||||||
|
{
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
AvaloniaXamlLoader.Load(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnFrameworkInitializationCompleted()
|
||||||
|
{
|
||||||
|
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
||||||
|
{
|
||||||
|
desktop.MainWindow = new MainWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
base.OnFrameworkInitializationCompleted();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
82
demo-12-14/MainWindow.axaml
Normal file
82
demo-12-14/MainWindow.axaml
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
<Window xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
x:Class="demo.MainWindow"
|
||||||
|
x:CompileBindings="False"
|
||||||
|
Title="demo">
|
||||||
|
<DockPanel>
|
||||||
|
<StackPanel
|
||||||
|
DockPanel.Dock="Top"
|
||||||
|
Spacing="5"
|
||||||
|
HorizontalAlignment="Center"
|
||||||
|
Height="40" Orientation="Horizontal">
|
||||||
|
<TextBox
|
||||||
|
TextChanging="SearchBoxChanging"
|
||||||
|
x:Name="SearchBox"
|
||||||
|
Width="200"/>
|
||||||
|
<ComboBox
|
||||||
|
SelectionChanged="ManufactureBox_SelectionChanged"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Width="100"
|
||||||
|
x:Name="ManufactureBox"/>
|
||||||
|
<ComboBox
|
||||||
|
SelectionChanged="SortBox_SelectionChanged"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Width="100"
|
||||||
|
x:Name="SortBox">
|
||||||
|
<ComboBoxItem>
|
||||||
|
без сорт.
|
||||||
|
</ComboBoxItem>
|
||||||
|
<ComboBoxItem>
|
||||||
|
убыв.
|
||||||
|
</ComboBoxItem>
|
||||||
|
<ComboBoxItem>
|
||||||
|
возраст.
|
||||||
|
</ComboBoxItem>
|
||||||
|
</ComboBox>
|
||||||
|
<TextBlock VerticalAlignment="Center" TextAlignment="Center" x:Name="CountTextBlock"/>
|
||||||
|
<Button Width="120" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Height="40" Content="Новый товар" Click="AddNewProduct"/>
|
||||||
|
</StackPanel>
|
||||||
|
<ListBox x:Name="ProductBox">
|
||||||
|
<ListBox.ItemsPanel>
|
||||||
|
<ItemsPanelTemplate>
|
||||||
|
<UniformGrid Columns="3"/>
|
||||||
|
</ItemsPanelTemplate>
|
||||||
|
</ListBox.ItemsPanel>
|
||||||
|
<ListBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<Border
|
||||||
|
Background="{Binding Color}"
|
||||||
|
BorderBrush="Gray"
|
||||||
|
BorderThickness="1"
|
||||||
|
Padding="5">
|
||||||
|
<StackPanel
|
||||||
|
HorizontalAlignment="Center">
|
||||||
|
<Image
|
||||||
|
Source="{Binding Image}"
|
||||||
|
Width="100"
|
||||||
|
Height="100"
|
||||||
|
/>
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding Title}"
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
TextAlignment="Center"
|
||||||
|
/>
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding Cost}"
|
||||||
|
TextAlignment="Center"
|
||||||
|
/>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</DataTemplate>
|
||||||
|
</ListBox.ItemTemplate>
|
||||||
|
<ListBox.ContextMenu>
|
||||||
|
<ContextMenu>
|
||||||
|
<MenuItem Click="ProductItemClick" Header="Remove"/>
|
||||||
|
</ContextMenu>
|
||||||
|
</ListBox.ContextMenu>
|
||||||
|
</ListBox>
|
||||||
|
</DockPanel>
|
||||||
|
</Window>
|
131
demo-12-14/MainWindow.axaml.cs
Normal file
131
demo-12-14/MainWindow.axaml.cs
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Interactivity;
|
||||||
|
using Avalonia.Media;
|
||||||
|
using Avalonia.Media.Imaging;
|
||||||
|
using Avalonia.Utilities;
|
||||||
|
using demoModels;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace demo
|
||||||
|
{
|
||||||
|
public partial class MainWindow : Window
|
||||||
|
{
|
||||||
|
ObservableCollection<ProductPresenter> products = new ObservableCollection<ProductPresenter>();
|
||||||
|
List<ProductPresenter> dataSourceProducts;
|
||||||
|
ObservableCollection<string> manufactures;
|
||||||
|
public MainWindow()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
using var context = new ProductsTradeContext();
|
||||||
|
dataSourceProducts = context.Products.Include(it => it.Manufacturer).Select(product => new ProductPresenter
|
||||||
|
{
|
||||||
|
Id = product.Id,
|
||||||
|
Mainimagepath = product.Mainimagepath,
|
||||||
|
Isactive = product.Isactive,
|
||||||
|
Cost = product.Cost,
|
||||||
|
Title = product.Title,
|
||||||
|
Description = product.Description,
|
||||||
|
Manufacturer = product.Manufacturer,
|
||||||
|
}).ToList();
|
||||||
|
var dataSourceManafacture = context.Manufacturers.Select(it => it.Name).ToList();
|
||||||
|
manufactures = new ObservableCollection<string>(dataSourceManafacture);
|
||||||
|
manufactures.Insert(0,"Âûâåñòè âñå");
|
||||||
|
ProductBox.ItemsSource = products;
|
||||||
|
ManufactureBox.ItemsSource = manufactures;
|
||||||
|
ManufactureBox.SelectedIndex = 0;
|
||||||
|
DisplayProducts();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DisplayProducts()
|
||||||
|
{
|
||||||
|
var temp = dataSourceProducts;
|
||||||
|
products.Clear();
|
||||||
|
if (ManufactureBox.SelectedIndex != 0)
|
||||||
|
{
|
||||||
|
temp = temp.Where(it => it.ManufacatureName.Contains(ManufactureBox.SelectedItem.ToString())).ToList();
|
||||||
|
}
|
||||||
|
if (!string.IsNullOrEmpty(SearchBox.Text))
|
||||||
|
{
|
||||||
|
var searchWord = SearchBox.Text.ToLower();
|
||||||
|
temp = temp.Where(it => IsContains(it.Title, it.Description, searchWord)).ToList();
|
||||||
|
}
|
||||||
|
switch (SortBox.SelectedIndex) {
|
||||||
|
|
||||||
|
case 1: temp = temp.OrderBy(temp => temp.Cost).ToList(); break;
|
||||||
|
case 2: temp = temp.OrderByDescending(temp => temp.Cost).ToList(); break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
foreach (var item in temp)
|
||||||
|
{
|
||||||
|
products.Add(item);
|
||||||
|
}
|
||||||
|
CountTextBlock.Text = $"{temp.Count}\\{dataSourceProducts.Count}";
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsContains(string title, string? description, string searchWord) {
|
||||||
|
string desc = string.Empty;
|
||||||
|
if(description != null) desc = description;
|
||||||
|
string message = (title + desc).ToLower();
|
||||||
|
searchWord = searchWord.ToLower();
|
||||||
|
var result = message.Contains(searchWord);
|
||||||
|
return message.Contains(searchWord);
|
||||||
|
}
|
||||||
|
public void SearchBoxChanging(object sender, TextChangingEventArgs eventArgs)
|
||||||
|
{
|
||||||
|
DisplayProducts();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SortBox_SelectionChanged(object sender, SelectionChangedEventArgs eventArgs) {
|
||||||
|
DisplayProducts();
|
||||||
|
}
|
||||||
|
public void ManufactureBox_SelectionChanged(object sender, SelectionChangedEventArgs eventArgs)
|
||||||
|
{
|
||||||
|
DisplayProducts();
|
||||||
|
}
|
||||||
|
public void ProductItemClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
using var context = new ProductsTradeContext();
|
||||||
|
var product = ProductBox.SelectedItem as ProductPresenter;
|
||||||
|
if (product == null) return;
|
||||||
|
var removeProduct = context.Products.Include(it => it.Productsales).First(it => it.Id == product.Id);
|
||||||
|
if(removeProduct == null) return;
|
||||||
|
if(removeProduct.Productsales.Count() > 0) return;
|
||||||
|
context.Products.Remove(removeProduct);
|
||||||
|
if (context.SaveChanges() > 0) products.Remove(product);
|
||||||
|
}
|
||||||
|
public async void AddNewProduct(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
using ProductsTradeContext context = new ProductsTradeContext();
|
||||||
|
var newProduct = await new ProductWindow().ShowDialog<ProductPresenter>(this);
|
||||||
|
|
||||||
|
context.Products.Add(newProduct);
|
||||||
|
if (context.SaveChanges() > 0) {
|
||||||
|
newProduct.Manufacturer = context.Manufacturers.Find(newProduct.Manufacturerid);
|
||||||
|
dataSourceProducts.Add(newProduct);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class ProductPresenter() : Product{
|
||||||
|
public string ManufacatureName { get => Manufacturer.Name; }
|
||||||
|
Bitmap? Image { get
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return new Bitmap(Mainimagepath);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} }
|
||||||
|
public IBrush Color { get {
|
||||||
|
return Isactive? Brushes.White : Brushes.Gray;
|
||||||
|
} }
|
||||||
|
}
|
||||||
|
}
|
33
demo-12-14/Models/Client.cs
Normal file
33
demo-12-14/Models/Client.cs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace demoModels;
|
||||||
|
|
||||||
|
public partial class Client
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
public string Firstname { get; set; } = null!;
|
||||||
|
|
||||||
|
public string Lastname { get; set; } = null!;
|
||||||
|
|
||||||
|
public string? Patronymic { get; set; }
|
||||||
|
|
||||||
|
public DateOnly? Birthday { get; set; }
|
||||||
|
|
||||||
|
public DateTime Registrationdate { get; set; }
|
||||||
|
|
||||||
|
public string? Email { get; set; }
|
||||||
|
|
||||||
|
public string Phone { get; set; } = null!;
|
||||||
|
|
||||||
|
public char Gendercode { get; set; }
|
||||||
|
|
||||||
|
public string? Photopath { get; set; }
|
||||||
|
|
||||||
|
public virtual ICollection<Clientservice> Clientservices { get; set; } = new List<Clientservice>();
|
||||||
|
|
||||||
|
public virtual Gender GendercodeNavigation { get; set; } = null!;
|
||||||
|
|
||||||
|
public virtual ICollection<Tag> Tags { get; set; } = new List<Tag>();
|
||||||
|
}
|
25
demo-12-14/Models/Clientservice.cs
Normal file
25
demo-12-14/Models/Clientservice.cs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace demoModels;
|
||||||
|
|
||||||
|
public partial class Clientservice
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
public int Clientid { get; set; }
|
||||||
|
|
||||||
|
public int Serviceid { get; set; }
|
||||||
|
|
||||||
|
public DateTime Starttime { get; set; }
|
||||||
|
|
||||||
|
public string? Comment { get; set; }
|
||||||
|
|
||||||
|
public virtual Client Client { get; set; } = null!;
|
||||||
|
|
||||||
|
public virtual ICollection<Documentbyservice> Documentbyservices { get; set; } = new List<Documentbyservice>();
|
||||||
|
|
||||||
|
public virtual ICollection<Productsale> Productsales { get; set; } = new List<Productsale>();
|
||||||
|
|
||||||
|
public virtual Service Service { get; set; } = null!;
|
||||||
|
}
|
15
demo-12-14/Models/Documentbyservice.cs
Normal file
15
demo-12-14/Models/Documentbyservice.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace demoModels;
|
||||||
|
|
||||||
|
public partial class Documentbyservice
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
public int Clientserviceid { get; set; }
|
||||||
|
|
||||||
|
public string Documentpath { get; set; } = null!;
|
||||||
|
|
||||||
|
public virtual Clientservice Clientservice { get; set; } = null!;
|
||||||
|
}
|
13
demo-12-14/Models/Gender.cs
Normal file
13
demo-12-14/Models/Gender.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace demoModels;
|
||||||
|
|
||||||
|
public partial class Gender
|
||||||
|
{
|
||||||
|
public char Code { get; set; }
|
||||||
|
|
||||||
|
public string? Name { get; set; }
|
||||||
|
|
||||||
|
public virtual ICollection<Client> Clients { get; set; } = new List<Client>();
|
||||||
|
}
|
15
demo-12-14/Models/Manufacturer.cs
Normal file
15
demo-12-14/Models/Manufacturer.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace demoModels;
|
||||||
|
|
||||||
|
public partial class Manufacturer
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
public string Name { get; set; } = null!;
|
||||||
|
|
||||||
|
public DateOnly? Startdate { get; set; }
|
||||||
|
|
||||||
|
public virtual ICollection<Product> Products { get; set; } = new List<Product>();
|
||||||
|
}
|
31
demo-12-14/Models/Product.cs
Normal file
31
demo-12-14/Models/Product.cs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace demoModels;
|
||||||
|
|
||||||
|
public partial class Product
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
public string Title { get; set; } = null!;
|
||||||
|
|
||||||
|
public decimal Cost { get; set; }
|
||||||
|
|
||||||
|
public string? Description { get; set; }
|
||||||
|
|
||||||
|
public string? Mainimagepath { get; set; }
|
||||||
|
|
||||||
|
public bool Isactive { get; set; }
|
||||||
|
|
||||||
|
public int? Manufacturerid { get; set; }
|
||||||
|
|
||||||
|
public virtual Manufacturer? Manufacturer { get; set; }
|
||||||
|
|
||||||
|
public virtual ICollection<Productphoto> Productphotos { get; set; } = new List<Productphoto>();
|
||||||
|
|
||||||
|
public virtual ICollection<Productsale> Productsales { get; set; } = new List<Productsale>();
|
||||||
|
|
||||||
|
public virtual ICollection<Product> Attachedproducts { get; set; } = new List<Product>();
|
||||||
|
|
||||||
|
public virtual ICollection<Product> Mainproducts { get; set; } = new List<Product>();
|
||||||
|
}
|
15
demo-12-14/Models/Productphoto.cs
Normal file
15
demo-12-14/Models/Productphoto.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace demoModels;
|
||||||
|
|
||||||
|
public partial class Productphoto
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
public int Productid { get; set; }
|
||||||
|
|
||||||
|
public string Photopath { get; set; } = null!;
|
||||||
|
|
||||||
|
public virtual Product Product { get; set; } = null!;
|
||||||
|
}
|
369
demo-12-14/Models/ProductsTradeContext.cs
Normal file
369
demo-12-14/Models/ProductsTradeContext.cs
Normal file
@ -0,0 +1,369 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace demoModels;
|
||||||
|
|
||||||
|
public partial class ProductsTradeContext : DbContext
|
||||||
|
{
|
||||||
|
public ProductsTradeContext()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductsTradeContext(DbContextOptions<ProductsTradeContext> options)
|
||||||
|
: base(options)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual DbSet<Client> Clients { get; set; }
|
||||||
|
|
||||||
|
public virtual DbSet<Clientservice> Clientservices { get; set; }
|
||||||
|
|
||||||
|
public virtual DbSet<Documentbyservice> Documentbyservices { get; set; }
|
||||||
|
|
||||||
|
public virtual DbSet<Gender> Genders { get; set; }
|
||||||
|
|
||||||
|
public virtual DbSet<Manufacturer> Manufacturers { get; set; }
|
||||||
|
|
||||||
|
public virtual DbSet<Product> Products { get; set; }
|
||||||
|
|
||||||
|
public virtual DbSet<Productphoto> Productphotos { get; set; }
|
||||||
|
|
||||||
|
public virtual DbSet<Productsale> Productsales { get; set; }
|
||||||
|
|
||||||
|
public virtual DbSet<Service> Services { get; set; }
|
||||||
|
|
||||||
|
public virtual DbSet<Servicephoto> Servicephotos { get; set; }
|
||||||
|
|
||||||
|
public virtual DbSet<Tag> Tags { get; set; }
|
||||||
|
|
||||||
|
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||||
|
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see https://go.microsoft.com/fwlink/?LinkId=723263.
|
||||||
|
=> optionsBuilder.UseNpgsql("Host=localhost;Port=5432;Database=products_trade;Username=postgres;Password=123");
|
||||||
|
|
||||||
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
modelBuilder.Entity<Client>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.Id).HasName("client_pkey");
|
||||||
|
|
||||||
|
entity.ToTable("client");
|
||||||
|
|
||||||
|
entity.Property(e => e.Id)
|
||||||
|
.HasDefaultValueSql("nextval('client_seq'::regclass)")
|
||||||
|
.HasColumnName("id");
|
||||||
|
entity.Property(e => e.Birthday).HasColumnName("birthday");
|
||||||
|
entity.Property(e => e.Email)
|
||||||
|
.HasMaxLength(255)
|
||||||
|
.HasColumnName("email");
|
||||||
|
entity.Property(e => e.Firstname)
|
||||||
|
.HasMaxLength(50)
|
||||||
|
.HasColumnName("firstname");
|
||||||
|
entity.Property(e => e.Gendercode)
|
||||||
|
.HasMaxLength(1)
|
||||||
|
.HasColumnName("gendercode");
|
||||||
|
entity.Property(e => e.Lastname)
|
||||||
|
.HasMaxLength(50)
|
||||||
|
.HasColumnName("lastname");
|
||||||
|
entity.Property(e => e.Patronymic)
|
||||||
|
.HasMaxLength(50)
|
||||||
|
.HasColumnName("patronymic");
|
||||||
|
entity.Property(e => e.Phone)
|
||||||
|
.HasMaxLength(20)
|
||||||
|
.HasColumnName("phone");
|
||||||
|
entity.Property(e => e.Photopath)
|
||||||
|
.HasMaxLength(1000)
|
||||||
|
.HasColumnName("photopath");
|
||||||
|
entity.Property(e => e.Registrationdate)
|
||||||
|
.HasColumnType("timestamp(6) without time zone")
|
||||||
|
.HasColumnName("registrationdate");
|
||||||
|
|
||||||
|
entity.HasOne(d => d.GendercodeNavigation).WithMany(p => p.Clients)
|
||||||
|
.HasForeignKey(d => d.Gendercode)
|
||||||
|
.OnDelete(DeleteBehavior.ClientSetNull)
|
||||||
|
.HasConstraintName("fk_client_gender");
|
||||||
|
|
||||||
|
entity.HasMany(d => d.Tags).WithMany(p => p.Clients)
|
||||||
|
.UsingEntity<Dictionary<string, object>>(
|
||||||
|
"Tagofclient",
|
||||||
|
r => r.HasOne<Tag>().WithMany()
|
||||||
|
.HasForeignKey("Tagid")
|
||||||
|
.OnDelete(DeleteBehavior.ClientSetNull)
|
||||||
|
.HasConstraintName("fk_tagofclient_tag"),
|
||||||
|
l => l.HasOne<Client>().WithMany()
|
||||||
|
.HasForeignKey("Clientid")
|
||||||
|
.OnDelete(DeleteBehavior.ClientSetNull)
|
||||||
|
.HasConstraintName("fk_tagofclient_client"),
|
||||||
|
j =>
|
||||||
|
{
|
||||||
|
j.HasKey("Clientid", "Tagid").HasName("tagofclient_pkey");
|
||||||
|
j.ToTable("tagofclient");
|
||||||
|
j.IndexerProperty<int>("Clientid").HasColumnName("clientid");
|
||||||
|
j.IndexerProperty<int>("Tagid").HasColumnName("tagid");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<Clientservice>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.Id).HasName("clientservice_pkey");
|
||||||
|
|
||||||
|
entity.ToTable("clientservice");
|
||||||
|
|
||||||
|
entity.Property(e => e.Id)
|
||||||
|
.HasDefaultValueSql("nextval('clientservice_seq'::regclass)")
|
||||||
|
.HasColumnName("id");
|
||||||
|
entity.Property(e => e.Clientid).HasColumnName("clientid");
|
||||||
|
entity.Property(e => e.Comment).HasColumnName("comment");
|
||||||
|
entity.Property(e => e.Serviceid).HasColumnName("serviceid");
|
||||||
|
entity.Property(e => e.Starttime)
|
||||||
|
.HasColumnType("timestamp(6) without time zone")
|
||||||
|
.HasColumnName("starttime");
|
||||||
|
|
||||||
|
entity.HasOne(d => d.Client).WithMany(p => p.Clientservices)
|
||||||
|
.HasForeignKey(d => d.Clientid)
|
||||||
|
.OnDelete(DeleteBehavior.ClientSetNull)
|
||||||
|
.HasConstraintName("fk_clientservice_client");
|
||||||
|
|
||||||
|
entity.HasOne(d => d.Service).WithMany(p => p.Clientservices)
|
||||||
|
.HasForeignKey(d => d.Serviceid)
|
||||||
|
.OnDelete(DeleteBehavior.ClientSetNull)
|
||||||
|
.HasConstraintName("fk_clientservice_service");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<Documentbyservice>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.Id).HasName("documentbyservice_pkey");
|
||||||
|
|
||||||
|
entity.ToTable("documentbyservice");
|
||||||
|
|
||||||
|
entity.Property(e => e.Id)
|
||||||
|
.HasDefaultValueSql("nextval('documentbyservice_seq'::regclass)")
|
||||||
|
.HasColumnName("id");
|
||||||
|
entity.Property(e => e.Clientserviceid).HasColumnName("clientserviceid");
|
||||||
|
entity.Property(e => e.Documentpath)
|
||||||
|
.HasMaxLength(1000)
|
||||||
|
.HasColumnName("documentpath");
|
||||||
|
|
||||||
|
entity.HasOne(d => d.Clientservice).WithMany(p => p.Documentbyservices)
|
||||||
|
.HasForeignKey(d => d.Clientserviceid)
|
||||||
|
.OnDelete(DeleteBehavior.ClientSetNull)
|
||||||
|
.HasConstraintName("fk_documentbyservice_clientservice");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<Gender>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.Code).HasName("gender_pkey");
|
||||||
|
|
||||||
|
entity.ToTable("gender");
|
||||||
|
|
||||||
|
entity.Property(e => e.Code)
|
||||||
|
.HasMaxLength(1)
|
||||||
|
.ValueGeneratedNever()
|
||||||
|
.HasColumnName("code");
|
||||||
|
entity.Property(e => e.Name)
|
||||||
|
.HasMaxLength(10)
|
||||||
|
.HasColumnName("name");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<Manufacturer>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.Id).HasName("manufacturer_pkey");
|
||||||
|
|
||||||
|
entity.ToTable("manufacturer");
|
||||||
|
|
||||||
|
entity.Property(e => e.Id)
|
||||||
|
.HasDefaultValueSql("nextval('manufacturer_seq'::regclass)")
|
||||||
|
.HasColumnName("id");
|
||||||
|
entity.Property(e => e.Name)
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnName("name");
|
||||||
|
entity.Property(e => e.Startdate).HasColumnName("startdate");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<Product>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.Id).HasName("product_pkey");
|
||||||
|
|
||||||
|
entity.ToTable("product");
|
||||||
|
|
||||||
|
entity.Property(e => e.Id)
|
||||||
|
.HasDefaultValueSql("nextval('product_seq'::regclass)")
|
||||||
|
.HasColumnName("id");
|
||||||
|
entity.Property(e => e.Cost)
|
||||||
|
.HasPrecision(19, 4)
|
||||||
|
.HasColumnName("cost");
|
||||||
|
entity.Property(e => e.Description).HasColumnName("description");
|
||||||
|
entity.Property(e => e.Isactive).HasColumnName("isactive");
|
||||||
|
entity.Property(e => e.Mainimagepath)
|
||||||
|
.HasMaxLength(1000)
|
||||||
|
.HasColumnName("mainimagepath");
|
||||||
|
entity.Property(e => e.Manufacturerid).HasColumnName("manufacturerid");
|
||||||
|
entity.Property(e => e.Title)
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnName("title");
|
||||||
|
|
||||||
|
entity.HasOne(d => d.Manufacturer).WithMany(p => p.Products)
|
||||||
|
.HasForeignKey(d => d.Manufacturerid)
|
||||||
|
.HasConstraintName("fk_product_manufacturer");
|
||||||
|
|
||||||
|
entity.HasMany(d => d.Attachedproducts).WithMany(p => p.Mainproducts)
|
||||||
|
.UsingEntity<Dictionary<string, object>>(
|
||||||
|
"Attachedproduct",
|
||||||
|
r => r.HasOne<Product>().WithMany()
|
||||||
|
.HasForeignKey("Attachedproductid")
|
||||||
|
.OnDelete(DeleteBehavior.ClientSetNull)
|
||||||
|
.HasConstraintName("fk_attachedproduct_product1"),
|
||||||
|
l => l.HasOne<Product>().WithMany()
|
||||||
|
.HasForeignKey("Mainproductid")
|
||||||
|
.OnDelete(DeleteBehavior.ClientSetNull)
|
||||||
|
.HasConstraintName("fk_attachedproduct_product"),
|
||||||
|
j =>
|
||||||
|
{
|
||||||
|
j.HasKey("Mainproductid", "Attachedproductid").HasName("attachedproduct_pkey");
|
||||||
|
j.ToTable("attachedproduct");
|
||||||
|
j.IndexerProperty<int>("Mainproductid").HasColumnName("mainproductid");
|
||||||
|
j.IndexerProperty<int>("Attachedproductid").HasColumnName("attachedproductid");
|
||||||
|
});
|
||||||
|
|
||||||
|
entity.HasMany(d => d.Mainproducts).WithMany(p => p.Attachedproducts)
|
||||||
|
.UsingEntity<Dictionary<string, object>>(
|
||||||
|
"Attachedproduct",
|
||||||
|
r => r.HasOne<Product>().WithMany()
|
||||||
|
.HasForeignKey("Mainproductid")
|
||||||
|
.OnDelete(DeleteBehavior.ClientSetNull)
|
||||||
|
.HasConstraintName("fk_attachedproduct_product"),
|
||||||
|
l => l.HasOne<Product>().WithMany()
|
||||||
|
.HasForeignKey("Attachedproductid")
|
||||||
|
.OnDelete(DeleteBehavior.ClientSetNull)
|
||||||
|
.HasConstraintName("fk_attachedproduct_product1"),
|
||||||
|
j =>
|
||||||
|
{
|
||||||
|
j.HasKey("Mainproductid", "Attachedproductid").HasName("attachedproduct_pkey");
|
||||||
|
j.ToTable("attachedproduct");
|
||||||
|
j.IndexerProperty<int>("Mainproductid").HasColumnName("mainproductid");
|
||||||
|
j.IndexerProperty<int>("Attachedproductid").HasColumnName("attachedproductid");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<Productphoto>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.Id).HasName("productphoto_pkey");
|
||||||
|
|
||||||
|
entity.ToTable("productphoto");
|
||||||
|
|
||||||
|
entity.Property(e => e.Id)
|
||||||
|
.HasDefaultValueSql("nextval('productphoto_seq'::regclass)")
|
||||||
|
.HasColumnName("id");
|
||||||
|
entity.Property(e => e.Photopath)
|
||||||
|
.HasMaxLength(1000)
|
||||||
|
.HasColumnName("photopath");
|
||||||
|
entity.Property(e => e.Productid).HasColumnName("productid");
|
||||||
|
|
||||||
|
entity.HasOne(d => d.Product).WithMany(p => p.Productphotos)
|
||||||
|
.HasForeignKey(d => d.Productid)
|
||||||
|
.OnDelete(DeleteBehavior.ClientSetNull)
|
||||||
|
.HasConstraintName("fk_productphoto_product");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<Productsale>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.Id).HasName("productsale_pkey");
|
||||||
|
|
||||||
|
entity.ToTable("productsale");
|
||||||
|
|
||||||
|
entity.Property(e => e.Id)
|
||||||
|
.HasDefaultValueSql("nextval('productsale_seq'::regclass)")
|
||||||
|
.HasColumnName("id");
|
||||||
|
entity.Property(e => e.Clientserviceid).HasColumnName("clientserviceid");
|
||||||
|
entity.Property(e => e.Productid).HasColumnName("productid");
|
||||||
|
entity.Property(e => e.Quantity).HasColumnName("quantity");
|
||||||
|
entity.Property(e => e.Saledate)
|
||||||
|
.HasColumnType("timestamp(6) without time zone")
|
||||||
|
.HasColumnName("saledate");
|
||||||
|
|
||||||
|
entity.HasOne(d => d.Clientservice).WithMany(p => p.Productsales)
|
||||||
|
.HasForeignKey(d => d.Clientserviceid)
|
||||||
|
.HasConstraintName("fk_productsale_clientservice");
|
||||||
|
|
||||||
|
entity.HasOne(d => d.Product).WithMany(p => p.Productsales)
|
||||||
|
.HasForeignKey(d => d.Productid)
|
||||||
|
.OnDelete(DeleteBehavior.ClientSetNull)
|
||||||
|
.HasConstraintName("fk_productsale_product");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<Service>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.Id).HasName("service_pkey");
|
||||||
|
|
||||||
|
entity.ToTable("service");
|
||||||
|
|
||||||
|
entity.Property(e => e.Id)
|
||||||
|
.HasDefaultValueSql("nextval('service_seq'::regclass)")
|
||||||
|
.HasColumnName("id");
|
||||||
|
entity.Property(e => e.Cost)
|
||||||
|
.HasPrecision(19, 4)
|
||||||
|
.HasColumnName("cost");
|
||||||
|
entity.Property(e => e.Description).HasColumnName("description");
|
||||||
|
entity.Property(e => e.Discount).HasColumnName("discount");
|
||||||
|
entity.Property(e => e.Durationinseconds).HasColumnName("durationinseconds");
|
||||||
|
entity.Property(e => e.Mainimagepath)
|
||||||
|
.HasMaxLength(1000)
|
||||||
|
.HasColumnName("mainimagepath");
|
||||||
|
entity.Property(e => e.Title)
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnName("title");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<Servicephoto>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.Id).HasName("servicephoto_pkey");
|
||||||
|
|
||||||
|
entity.ToTable("servicephoto");
|
||||||
|
|
||||||
|
entity.Property(e => e.Id)
|
||||||
|
.HasDefaultValueSql("nextval('servicephoto_seq'::regclass)")
|
||||||
|
.HasColumnName("id");
|
||||||
|
entity.Property(e => e.Photopath)
|
||||||
|
.HasMaxLength(1000)
|
||||||
|
.HasColumnName("photopath");
|
||||||
|
entity.Property(e => e.Serviceid).HasColumnName("serviceid");
|
||||||
|
|
||||||
|
entity.HasOne(d => d.Service).WithMany(p => p.Servicephotos)
|
||||||
|
.HasForeignKey(d => d.Serviceid)
|
||||||
|
.OnDelete(DeleteBehavior.ClientSetNull)
|
||||||
|
.HasConstraintName("fk_servicephoto_service");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity<Tag>(entity =>
|
||||||
|
{
|
||||||
|
entity.HasKey(e => e.Id).HasName("tag_pkey");
|
||||||
|
|
||||||
|
entity.ToTable("tag");
|
||||||
|
|
||||||
|
entity.Property(e => e.Id)
|
||||||
|
.HasDefaultValueSql("nextval('tag_seq'::regclass)")
|
||||||
|
.HasColumnName("id");
|
||||||
|
entity.Property(e => e.Color)
|
||||||
|
.HasMaxLength(6)
|
||||||
|
.IsFixedLength()
|
||||||
|
.HasColumnName("color");
|
||||||
|
entity.Property(e => e.Title)
|
||||||
|
.HasMaxLength(30)
|
||||||
|
.HasColumnName("title");
|
||||||
|
});
|
||||||
|
modelBuilder.HasSequence("client_seq");
|
||||||
|
modelBuilder.HasSequence("clientservice_seq");
|
||||||
|
modelBuilder.HasSequence("documentbyservice_seq");
|
||||||
|
modelBuilder.HasSequence("manufacturer_seq");
|
||||||
|
modelBuilder.HasSequence("product_seq");
|
||||||
|
modelBuilder.HasSequence("productphoto_seq");
|
||||||
|
modelBuilder.HasSequence("productsale_seq");
|
||||||
|
modelBuilder.HasSequence("service_seq");
|
||||||
|
modelBuilder.HasSequence("servicephoto_seq");
|
||||||
|
modelBuilder.HasSequence("tag_seq");
|
||||||
|
|
||||||
|
OnModelCreatingPartial(modelBuilder);
|
||||||
|
}
|
||||||
|
|
||||||
|
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
|
||||||
|
}
|
21
demo-12-14/Models/Productsale.cs
Normal file
21
demo-12-14/Models/Productsale.cs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace demoModels;
|
||||||
|
|
||||||
|
public partial class Productsale
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
public DateTime Saledate { get; set; }
|
||||||
|
|
||||||
|
public int Productid { get; set; }
|
||||||
|
|
||||||
|
public int Quantity { get; set; }
|
||||||
|
|
||||||
|
public int? Clientserviceid { get; set; }
|
||||||
|
|
||||||
|
public virtual Clientservice? Clientservice { get; set; }
|
||||||
|
|
||||||
|
public virtual Product Product { get; set; } = null!;
|
||||||
|
}
|
25
demo-12-14/Models/Service.cs
Normal file
25
demo-12-14/Models/Service.cs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace demoModels;
|
||||||
|
|
||||||
|
public partial class Service
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
public string Title { get; set; } = null!;
|
||||||
|
|
||||||
|
public decimal Cost { get; set; }
|
||||||
|
|
||||||
|
public int Durationinseconds { get; set; }
|
||||||
|
|
||||||
|
public string? Description { get; set; }
|
||||||
|
|
||||||
|
public double? Discount { get; set; }
|
||||||
|
|
||||||
|
public string? Mainimagepath { get; set; }
|
||||||
|
|
||||||
|
public virtual ICollection<Clientservice> Clientservices { get; set; } = new List<Clientservice>();
|
||||||
|
|
||||||
|
public virtual ICollection<Servicephoto> Servicephotos { get; set; } = new List<Servicephoto>();
|
||||||
|
}
|
15
demo-12-14/Models/Servicephoto.cs
Normal file
15
demo-12-14/Models/Servicephoto.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace demoModels;
|
||||||
|
|
||||||
|
public partial class Servicephoto
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
public int Serviceid { get; set; }
|
||||||
|
|
||||||
|
public string Photopath { get; set; } = null!;
|
||||||
|
|
||||||
|
public virtual Service Service { get; set; } = null!;
|
||||||
|
}
|
15
demo-12-14/Models/Tag.cs
Normal file
15
demo-12-14/Models/Tag.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace demoModels;
|
||||||
|
|
||||||
|
public partial class Tag
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
public string Title { get; set; } = null!;
|
||||||
|
|
||||||
|
public string Color { get; set; } = null!;
|
||||||
|
|
||||||
|
public virtual ICollection<Client> Clients { get; set; } = new List<Client>();
|
||||||
|
}
|
36
demo-12-14/ProductWindow.axaml
Normal file
36
demo-12-14/ProductWindow.axaml
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
<Window xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="500"
|
||||||
|
x:Class="demo.ProductWindow"
|
||||||
|
Padding="5"
|
||||||
|
Title="ProductWindow">
|
||||||
|
|
||||||
|
<StackPanel Spacing="5" Background="AliceBlue">
|
||||||
|
<TextBlock x:Name="ProductIdLabel" Text="ProductId"/>
|
||||||
|
<TextBox x:Name="ProductId" IsReadOnly="True"/>
|
||||||
|
<TextBlock HorizontalAlignment="Center" Text="ProductImage"/>
|
||||||
|
<Image x:Name="ProductImage" Width="100" Height="100"/>
|
||||||
|
<Button HorizontalAlignment="Center" Width="100" x:Name="AddImage" Click="AddImageClick" Content="AddImage"/>
|
||||||
|
<TextBlock Text="ProductCost"/>
|
||||||
|
<TextBox x:Name="ProductCost" />
|
||||||
|
<TextBlock Text="ProductName"/>
|
||||||
|
<TextBox x:Name="ProductName"/>
|
||||||
|
<TextBlock Text="ProductTitle"/>
|
||||||
|
<TextBox x:Name="ProductTitle"/>
|
||||||
|
<TextBlock Text="ProductDesc"/>
|
||||||
|
<TextBox x:Name="ProductDesc"/>
|
||||||
|
<TextBlock Text="ProductManufacture"/>
|
||||||
|
<ComboBox x:Name="ProductManufacture" Width="150"/>
|
||||||
|
<StackPanel Spacing="5" Orientation="Horizontal">
|
||||||
|
<TextBlock VerticalAlignment="Center" Text="IsActive"/>
|
||||||
|
<CheckBox x:Name="IsActiveBox" VerticalAlignment="Center"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Spacing="5" Orientation="Horizontal">
|
||||||
|
<Button x:Name="AddButton" Click="AddClick" Content="Add"/>
|
||||||
|
<Button x:Name="EditButton" Click="EditClick" Content="Edit"/>
|
||||||
|
<Button Content="Exit"/>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Window>
|
80
demo-12-14/ProductWindow.axaml.cs
Normal file
80
demo-12-14/ProductWindow.axaml.cs
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
using Avalonia;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Interactivity;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
using Avalonia.Media.Imaging;
|
||||||
|
using Avalonia.Platform.Storage;
|
||||||
|
using demoModels;
|
||||||
|
using System;
|
||||||
|
using System.ComponentModel.Design;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace demo;
|
||||||
|
|
||||||
|
public partial class ProductWindow : Window
|
||||||
|
{
|
||||||
|
public string PathToImage = string.Empty;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public ProductWindow()
|
||||||
|
{
|
||||||
|
using ProductsTradeContext context = new ProductsTradeContext();
|
||||||
|
InitializeComponent();
|
||||||
|
ProductId.IsVisible = false;
|
||||||
|
ProductIdLabel.IsVisible = false;
|
||||||
|
ProductIdLabel.IsVisible = false;
|
||||||
|
EditButton.IsVisible = false;
|
||||||
|
ProductManufacture.ItemsSource = context.Manufacturers.Select(it => it.Name).ToList();
|
||||||
|
|
||||||
|
}
|
||||||
|
private async Task<Bitmap?> SelectImageAndSaveImage()
|
||||||
|
{
|
||||||
|
var showDilaog = StorageProvider.OpenFilePickerAsync(
|
||||||
|
new Avalonia.Platform.Storage.FilePickerOpenOptions()
|
||||||
|
{
|
||||||
|
Title = "Âûáåðèòå èçîáðàæåíèå",
|
||||||
|
FileTypeFilter = new[] { FilePickerFileTypes.ImageAll }
|
||||||
|
});
|
||||||
|
var storageFile = await showDilaog;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var bmp = new Bitmap(storageFile.First().TryGetLocalPath());
|
||||||
|
string path = $"Òîâàðû àâòîñåðâèñà\\{Guid.NewGuid()}.jpg";
|
||||||
|
bmp.Save(path);
|
||||||
|
PathToImage = path;
|
||||||
|
return bmp;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public async void AddClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
using ProductsTradeContext context = new ProductsTradeContext();
|
||||||
|
ProductPresenter presenter = new ProductPresenter();
|
||||||
|
if (!decimal.TryParse(ProductCost.Text, out decimal cost)) return;
|
||||||
|
if (cost < 0) return;
|
||||||
|
presenter.Cost = cost;
|
||||||
|
if (string.IsNullOrEmpty(ProductName.Text)) return;
|
||||||
|
presenter.Title = ProductName.Text;
|
||||||
|
if (string.IsNullOrEmpty(ProductDesc.Text)) return;
|
||||||
|
presenter.Description = ProductDesc.Text;
|
||||||
|
var findManufacture = context.Manufacturers.First(it => it.Name == ProductManufacture.SelectedItem.ToString());
|
||||||
|
if (findManufacture == null) return;
|
||||||
|
presenter.Manufacturerid = findManufacture.Id;
|
||||||
|
presenter.Isactive = IsActiveBox.IsPressed;
|
||||||
|
if (String.IsNullOrEmpty(PathToImage)) return;
|
||||||
|
presenter.Mainimagepath = PathToImage;
|
||||||
|
Close(presenter);
|
||||||
|
}
|
||||||
|
public void EditClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public async void AddImageClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
ProductImage.Source = await SelectImageAndSaveImage();
|
||||||
|
}
|
||||||
|
}
|
22
demo-12-14/Program.cs
Normal file
22
demo-12-14/Program.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
using Avalonia;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace demo
|
||||||
|
{
|
||||||
|
internal class Program
|
||||||
|
{
|
||||||
|
// Initialization code. Don't use any Avalonia, third-party APIs or any
|
||||||
|
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
|
||||||
|
// yet and stuff might break.
|
||||||
|
[STAThread]
|
||||||
|
public static void Main(string[] args) => BuildAvaloniaApp()
|
||||||
|
.StartWithClassicDesktopLifetime(args);
|
||||||
|
|
||||||
|
// Avalonia configuration, don't remove; also used by visual designer.
|
||||||
|
public static AppBuilder BuildAvaloniaApp()
|
||||||
|
=> AppBuilder.Configure<App>()
|
||||||
|
.UsePlatformDetect()
|
||||||
|
.WithInterFont()
|
||||||
|
.LogToTrace();
|
||||||
|
}
|
||||||
|
}
|
18
demo-12-14/app.manifest
Normal file
18
demo-12-14/app.manifest
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<!-- This manifest is used on Windows only.
|
||||||
|
Don't remove it as it might cause problems with window transparency and embedded controls.
|
||||||
|
For more details visit https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests -->
|
||||||
|
<assemblyIdentity version="1.0.0.0" name="demo.Desktop"/>
|
||||||
|
|
||||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
<application>
|
||||||
|
<!-- A list of the Windows versions that this application has been tested on
|
||||||
|
and is designed to work with. Uncomment the appropriate elements
|
||||||
|
and Windows will automatically select the most compatible environment. -->
|
||||||
|
|
||||||
|
<!-- Windows 10 -->
|
||||||
|
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
|
||||||
|
</application>
|
||||||
|
</compatibility>
|
||||||
|
</assembly>
|
25
demo-12-14/demo-12-14.csproj
Normal file
25
demo-12-14/demo-12-14.csproj
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
|
||||||
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||||
|
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Avalonia" Version="11.1.0" />
|
||||||
|
<PackageReference Include="Avalonia.Desktop" Version="11.1.0" />
|
||||||
|
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.1.0" />
|
||||||
|
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.1.0" />
|
||||||
|
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
|
||||||
|
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.1.0" />
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.10" />
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.10">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.10" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
Loading…
Reference in New Issue
Block a user