================================================================================ PROJECT FULL SOURCE DUMP — AvaloniaApplication1 В этом файле собран весь исходный код проекта на момент создания. Не включено: папки bin/, obj/ и прочие артефакты сборки. ================================================================================ -------------------------------------------------------------------------------- FILE: Packages.txt -------------------------------------------------------------------------------- Avalonia, Avalonia.Desktop, Avalonia.Themes.Fluent — одна версия. Npgsql — PostgreSQL. Строка подключения: services/DbService.cs SQL-скрипт: Database/schema.sql -------------------------------------------------------------------------------- FILE: AvaloniaApplication1.sln -------------------------------------------------------------------------------- Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.5.2.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvaloniaApplication1", "AvaloniaApplication1.csproj", "{4478C37E-E173-8721-0BB7-2A97BAB6EC35}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {4478C37E-E173-8721-0BB7-2A97BAB6EC35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4478C37E-E173-8721-0BB7-2A97BAB6EC35}.Debug|Any CPU.Build.0 = Debug|Any CPU {4478C37E-E173-8721-0BB7-2A97BAB6EC35}.Release|Any CPU.ActiveCfg = Release|Any CPU {4478C37E-E173-8721-0BB7-2A97BAB6EC35}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0BC0D786-F44D-4044-B8DF-051712874244} EndGlobalSection EndGlobal -------------------------------------------------------------------------------- FILE: AvaloniaApplication1.csproj -------------------------------------------------------------------------------- WinExe net8.0 enable app.manifest AvaloniaApplication1 -------------------------------------------------------------------------------- FILE: app.manifest -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- FILE: Program.cs -------------------------------------------------------------------------------- using System; using Avalonia; namespace AvaloniaApplication1; internal static class Program { [STAThread] public static void Main(string[] args) => BuildAvaloniaApp() .StartWithClassicDesktopLifetime(args); public static AppBuilder BuildAvaloniaApp() => AppBuilder.Configure() .UsePlatformDetect() .LogToTrace(); } -------------------------------------------------------------------------------- FILE: App.axaml -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- FILE: App.axaml.cs -------------------------------------------------------------------------------- using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; using AvaloniaApplication1.Views; namespace AvaloniaApplication1; public partial class App : Application { public override void Initialize() { AvaloniaXamlLoader.Load(this); } public override void OnFrameworkInitializationCompleted() { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) desktop.MainWindow = new LoginWindow(); base.OnFrameworkInitializationCompleted(); } } -------------------------------------------------------------------------------- FILE: Models/User.cs -------------------------------------------------------------------------------- namespace AvaloniaApplication1.Models; public sealed class User { public int Id { get; set; } public string Login { get; set; } = ""; public string Password { get; set; } = ""; public string Role { get; set; } = ""; public string FullName { get; set; } = ""; } -------------------------------------------------------------------------------- FILE: Models/Product.cs -------------------------------------------------------------------------------- namespace AvaloniaApplication1.Models; public sealed class Product { public int ProductId { get; set; } public string Article { get; set; } = ""; public int CategoryId { get; set; } public int SupplierId { get; set; } public int TypeProductId { get; set; } public decimal Price { get; set; } public string Discount { get; set; } = "0"; public string Description { get; set; } = ""; public string Photo { get; set; } = ""; public decimal FinalPrice { get { if (!decimal.TryParse(Discount.Replace("%", ""), out var discountValue)) { discountValue = 0; } return Price * (100m - discountValue) / 100m; } } } -------------------------------------------------------------------------------- FILE: Models/Order.cs -------------------------------------------------------------------------------- namespace AvaloniaApplication1.Models; public sealed class Order { public int OrderId { get; set; } public string OrderArticle { get; set; } = ""; public string DateOrder { get; set; } = ""; public string DateDelivery { get; set; } = ""; public int PickUpPointId { get; set; } public string Code { get; set; } = ""; public string StatusOrder { get; set; } = "Новый"; public int UserId { get; set; } public decimal TotalSum { get; set; } } -------------------------------------------------------------------------------- FILE: services/DbService.cs -------------------------------------------------------------------------------- using System; using System.Collections.Generic; using AvaloniaApplication1.Models; using Npgsql; namespace AvaloniaApplication1.Services; public sealed class DbService { private readonly string _connectionString = "Host=localhost;Port=5432;Username=postgres;Password=postgres;Database=exam_db"; public User? Login(string login, string password) { using var conn = new NpgsqlConnection(_connectionString); conn.Open(); using var cmd = new NpgsqlCommand( """ SELECT u.user_id, u.login, u.password, COALESCE(r.name_role, 'client') AS role_name, TRIM(COALESCE(u.name, '') || ' ' || COALESCE(u.second_name, '') || ' ' || COALESCE(u.patronymic, '')) AS full_name FROM users u LEFT JOIN roles r ON r.role_id = u.role_id WHERE u.login = @l AND u.password = @p """, conn); cmd.Parameters.AddWithValue("l", login); cmd.Parameters.AddWithValue("p", password); using var reader = cmd.ExecuteReader(); if (reader.Read()) { return new User { Id = reader.GetInt32(0), Login = reader.GetString(1), Password = reader.GetString(2), Role = NormalizeRole(reader.GetString(3)), FullName = reader.GetString(4) }; } return null; } public List GetProducts() { var list = new List(); using var conn = new NpgsqlConnection(_connectionString); conn.Open(); using var cmd = new NpgsqlCommand( """ SELECT product_id, article, category_id, supplier_id, type_products_id, price, discount, description, photo FROM products ORDER BY product_id """, conn); using var reader = cmd.ExecuteReader(); while (reader.Read()) { list.Add(new Product { ProductId = reader.GetInt32(0), Article = reader.GetString(1), CategoryId = reader.IsDBNull(2) ? 0 : reader.GetInt32(2), SupplierId = reader.IsDBNull(3) ? 0 : reader.GetInt32(3), TypeProductId = reader.IsDBNull(4) ? 0 : reader.GetInt32(4), Price = reader.GetDecimal(5), Discount = reader.IsDBNull(6) ? "0" : reader.GetString(6), Description = reader.IsDBNull(7) ? "" : reader.GetString(7), Photo = reader.IsDBNull(8) ? "" : reader.GetString(8) }); } return list; } public void AddProduct(Product product) { using var conn = new NpgsqlConnection(_connectionString); conn.Open(); using var cmd = new NpgsqlCommand( """ INSERT INTO products (article, category_id, supplier_id, type_products_id, price, discount, description, photo) VALUES (@article, @categoryId, @supplierId, @typeId, @price, @discount, @description, @photo) """, conn); FillProductParameters(cmd, product); cmd.ExecuteNonQuery(); } public void UpdateProduct(Product product) { using var conn = new NpgsqlConnection(_connectionString); conn.Open(); using var cmd = new NpgsqlCommand( """ UPDATE products SET article = @article, category_id = @categoryId, supplier_id = @supplierId, type_products_id = @typeId, price = @price, discount = @discount, description = @description, photo = @photo WHERE product_id = @id """, conn); FillProductParameters(cmd, product); cmd.Parameters.AddWithValue("id", product.ProductId); cmd.ExecuteNonQuery(); } public void DeleteProduct(int productId) { using var conn = new NpgsqlConnection(_connectionString); conn.Open(); using var cmd = new NpgsqlCommand("DELETE FROM products WHERE product_id = @id", conn); cmd.Parameters.AddWithValue("id", productId); cmd.ExecuteNonQuery(); } public List GetOrders() { var list = new List(); using var conn = new NpgsqlConnection(_connectionString); conn.Open(); using var cmd = new NpgsqlCommand( """ SELECT order_id, order_article, date_order, date_delivery, pick_up_point_id, code, status_order, user_id, total_sum FROM orders ORDER BY order_id """, conn); using var reader = cmd.ExecuteReader(); while (reader.Read()) { list.Add(new Order { OrderId = reader.GetInt32(0), OrderArticle = reader.IsDBNull(1) ? "" : reader.GetString(1), DateOrder = reader.IsDBNull(2) ? "" : reader.GetDateTime(2).ToString("yyyy-MM-dd"), DateDelivery = reader.IsDBNull(3) ? "" : reader.GetDateTime(3).ToString("yyyy-MM-dd"), PickUpPointId = reader.IsDBNull(4) ? 0 : reader.GetInt32(4), Code = reader.IsDBNull(5) ? "" : reader.GetString(5), StatusOrder = reader.IsDBNull(6) ? "Новый" : reader.GetString(6), UserId = reader.IsDBNull(7) ? 0 : reader.GetInt32(7), TotalSum = reader.IsDBNull(8) ? 0m : reader.GetDecimal(8) }); } return list; } public void AddOrder(Order order) { using var conn = new NpgsqlConnection(_connectionString); conn.Open(); using var cmd = new NpgsqlCommand( """ INSERT INTO orders (order_article, date_order, date_delivery, pick_up_point_id, code, status_order, user_id, total_sum) VALUES (@article, @dateOrder, @dateDelivery, @pickUpPointId, @code, @status, @userId, @totalSum) """, conn); FillOrderParameters(cmd, order); cmd.ExecuteNonQuery(); } public void UpdateOrder(Order order) { using var conn = new NpgsqlConnection(_connectionString); conn.Open(); using var cmd = new NpgsqlCommand( """ UPDATE orders SET order_article = @article, date_order = @dateOrder, date_delivery = @dateDelivery, pick_up_point_id = @pickUpPointId, code = @code, status_order = @status, user_id = @userId, total_sum = @totalSum WHERE order_id = @id """, conn); FillOrderParameters(cmd, order); cmd.Parameters.AddWithValue("id", order.OrderId); cmd.ExecuteNonQuery(); } public void DeleteOrder(int orderId) { using var conn = new NpgsqlConnection(_connectionString); conn.Open(); using var cmd = new NpgsqlCommand("DELETE FROM orders WHERE order_id = @id", conn); cmd.Parameters.AddWithValue("id", orderId); cmd.ExecuteNonQuery(); } private static void FillProductParameters(NpgsqlCommand cmd, Product product) { cmd.Parameters.AddWithValue("article", product.Article); cmd.Parameters.AddWithValue("categoryId", product.CategoryId == 0 ? DBNull.Value : product.CategoryId); cmd.Parameters.AddWithValue("supplierId", product.SupplierId == 0 ? DBNull.Value : product.SupplierId); cmd.Parameters.AddWithValue("typeId", product.TypeProductId == 0 ? DBNull.Value : product.TypeProductId); cmd.Parameters.AddWithValue("price", product.Price); cmd.Parameters.AddWithValue("discount", product.Discount); cmd.Parameters.AddWithValue("description", string.IsNullOrWhiteSpace(product.Description) ? DBNull.Value : product.Description); cmd.Parameters.AddWithValue("photo", string.IsNullOrWhiteSpace(product.Photo) ? DBNull.Value : product.Photo); } private static void FillOrderParameters(NpgsqlCommand cmd, Order order) { cmd.Parameters.AddWithValue("article", string.IsNullOrWhiteSpace(order.OrderArticle) ? DBNull.Value : order.OrderArticle); cmd.Parameters.AddWithValue("dateOrder", ParseDateOrDbNull(order.DateOrder)); cmd.Parameters.AddWithValue("dateDelivery", ParseDateOrDbNull(order.DateDelivery)); cmd.Parameters.AddWithValue("pickUpPointId", order.PickUpPointId == 0 ? DBNull.Value : order.PickUpPointId); cmd.Parameters.AddWithValue("code", string.IsNullOrWhiteSpace(order.Code) ? DBNull.Value : order.Code); cmd.Parameters.AddWithValue("status", string.IsNullOrWhiteSpace(order.StatusOrder) ? "Новый" : order.StatusOrder); cmd.Parameters.AddWithValue("userId", order.UserId == 0 ? DBNull.Value : order.UserId); cmd.Parameters.AddWithValue("totalSum", order.TotalSum); } private static object ParseDateOrDbNull(string date) { return DateTime.TryParse(date, out var value) ? value : DBNull.Value; } private static string NormalizeRole(string role) { var value = role.Trim().ToLowerInvariant(); return value switch { "админ" => "admin", "администратор" => "admin", "manager" => "manager", "менеджер" => "manager", "client" => "client", "клиент" => "client", _ => value }; } } -------------------------------------------------------------------------------- FILE: services/bdService.cs -------------------------------------------------------------------------------- using System.Collections.Generic; using AvaloniaApplication1.Models; using Npgsql; namespace AvaloniaApplication.service { } -------------------------------------------------------------------------------- FILE: Views/LoginWindow.axaml --------------------------------------------------------------------------------