C#实现简单超市收银系统

C#实现简单超市收银系统攻略

本攻略将会让您学习如何使用C#编写一个简单的超市收银系统。这个系统可以进行基本的商品库存管理和结算功能,包含了商品添加、修改、查询和删除功能。此外,当用户选购完商品后,系统会对商品进行结算并输出购物清单和价格信息。

1. 搭建环境

在开始编写代码之前,我们需要先搭建好我们的编程环境,需要准备以下工具:

  • Visual Studio 2019(版本大于16.7)或者更高的版本
  • .NET Core SDK (版本大于3.1)

安装好这些工具之后,您就可以开始编写代码了。

2. 创建项目

在Visual Studio中创建一个C#控制台应用程序项目。我们将使用这个项目来编写我们的收银系统。

3. 设计数据库

我们可以使用本地文件或数据库,这里我们使用本地文件来存储商品数据。我们需要创建一个示例数据库(.mdf)文件,其中包含三个表:产品、订单和订单项。

表一:产品

该表包含产品ID、产品名称、产品价格和库存量等字段。

表二:订单

该表包含订单ID、日期、客户名称、总价格等字段。

表三:订单项

该表包含订单项ID、订单ID、产品ID、数量和单价等字段。

4. 创建数据访问层

在实现我们的收银系统之前,我们首先需要创建一个数据库访问层(DAL)来处理与数据库的交互。这个DAL负责从数据库获取数据和将数据存储回数据库。

我们可以使用Entity Framework Core来创建这个DAL。首先,我们使用Visual Studio中的NuGet Package Manager安装Entity Framework Core包。

接下来,我们创建一个DbContext派生类,并在这个类中包括我们的产品、订单和订单项实体集合。我们还包括了与这些实体集合交互的方法:

public class SupermarketContext : DbContext
{
    public SupermarketContext(DbContextOptions<SupermarketContext> options) : base(options) { }

    public DbSet<Product> Products { get; set; }
    public DbSet<Order> Orders { get; set; }
    public DbSet<OrderItem> OrderItems { get; set; }

    public List<Product> GetAllProducts()
    {
        return Products.ToList();
    }

    public Product GetProductById(int id)
    {
        return Products.FirstOrDefault(p => p.ProductId == id);
    }

    public void AddProduct(Product product)
    {
        Products.Add(product);
        SaveChanges();
    }

    public void UpdateProduct(Product product)
    {
        Products.Update(product);
        SaveChanges();
    }

    public void DeleteProduct(Product product)
    {
        Products.Remove(product);
        SaveChanges();
    }

    public void AddOrder(Order order)
    {
        Orders.Add(order);
        SaveChanges();
    }
}

我们在这个DAL中实现了用于商品的添加、修改和删除方法,并且也包括了对订单的添加方法。

5. 创建数据模型

在DAL中定义了实体集合之后,我们需要创建实体类来映射到这些集合。我们需要创建Product、Order和OrderItem三个类。它们分别表示产品、订单和订单项。

示例代码:

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public int Stock { get; set; }

    public List<OrderItem> OrderItems { get; set; }
}

public class Order
{
    public int OrderId { get; set; }
    public DateTime Date { get; set; }
    public string CustomerName { get; set; }
    public decimal TotalPrice { get; set; }

    public List<OrderItem> OrderItems { get; set; }
}

public class OrderItem
{
    public int OrderItemId { get; set; }
    public int OrderId { get; set; }
    public int ProductId { get; set; }
    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }

    public Order Order { get; set; }
    public Product Product { get; set; }
}

6. 创建业务逻辑层

现在我们可以开始创建业务逻辑层(BLL),定义商品的添加、修改、查询和删除方法,并且定义订单生成和结算的方法。BLL是直接和控制台程序交互的一层,负责计算以及将调用数据访问层的方法。

我们可以创建一个Supermarket类来实现这一层,示例代码:

public class Supermarket
{
    private SupermarketContext _context;

    public Supermarket()
    {
        _context = new SupermarketContext(new DbContextOptions<SupermarketContext>());
    }

    public void AddProduct(Product product)
    {
        _context.AddProduct(product);
    }

    public void UpdateProduct(Product product)
    {
        _context.UpdateProduct(product);
    }

    public void DeleteProduct(Product product)
    {
        _context.DeleteProduct(product);
    }

    public List<Product> GetAllProducts()
    {
        return _context.GetAllProducts();
    }

    public Product GetProductById(int id)
    {
        return _context.GetProductById(id);
    }

    public Order CreateOrder(string customerName, List<int> productIds, List<int> quantities)
    {
        var order = new Order
        {
            CustomerName = customerName,
            Date = DateTime.Now
        };

        for (var i = 0; i < productIds.Count; i++)
        {
            var product = _context.GetProductById(productIds[i]);
            var orderItem = new OrderItem
            {
                Order = order,
                Product = product,
                Quantity = quantities[i],
                UnitPrice = product.Price
            };
            order.OrderItems.Add(orderItem);

            product.Stock -= quantities[i];
            _context.UpdateProduct(product);
        }

        order.TotalPrice = order.OrderItems.Sum(oi => oi.Quantity * oi.UnitPrice);

        _context.AddOrder(order);

        return order;
    }
}

在这个BLL中,我们定义了所有操作商品和订单的方法。"CreateOrder"方法用于创建订单和购买商品,减少库存,更新商品价格,并将数据保存到数据库。

7. 创建控制台程序

到目前为止,我们已经准备好所有的基本组件,可以开始创建我们的控制台程序了。控制台程序是用户与程序交互的主入口点。

示例代码:

class Program
{
    static readonly Supermarket Supermarket = new Supermarket();

    static void Main(string[] args)
    {
        Console.WriteLine("欢迎使用超市收银系统");

        while (true)
        {
            Console.WriteLine("");
            Console.WriteLine("请选择您要执行的操作:");
            Console.WriteLine("1. 查询所有商品");
            Console.WriteLine("2. 根据ID查询商品");
            Console.WriteLine("3. 添加商品");
            Console.WriteLine("4. 修改商品");
            Console.WriteLine("5. 删除商品");
            Console.WriteLine("6. 下单购买");
            Console.WriteLine("0. 退出");

            var option = Console.ReadLine();

            switch (option)
            {
                case "1":
                    var products = Supermarket.GetAllProducts();
                    Console.WriteLine("");
                    Console.WriteLine("所有商品列表如下:");
                    Console.WriteLine("{0}\t{1}\t{2}\t{3}", "ID", "产品名称", "产品价格", "库存");
                    foreach (var product in products)
                    {
                        Console.WriteLine("{0}\t{1}\t{2:C}\t{3}", product.ProductId, product.Name, product.Price, product.Stock);
                    }
                    break;

                case "2":
                    Console.WriteLine("");
                    Console.WriteLine("请输入商品ID:");
                    var id = Console.ReadLine();
                    var product = Supermarket.GetProductById(Convert.ToInt32(id));
                    Console.WriteLine(product == null ? "找不到商品" : FormatProduct(product));
                    break;

                case "3":
                    Console.WriteLine("");
                    Console.WriteLine("请输入商品名称:");
                    var name = Console.ReadLine();
                    Console.WriteLine("请输入商品价格:");
                    var price = Console.ReadLine();
                    Console.WriteLine("请输入商品库存:");
                    var stock = Console.ReadLine();
                    var newProduct = new Product
                    {
                        Name = name,
                        Price = Convert.ToDecimal(price),
                        Stock = Convert.ToInt32(stock)
                    };
                    Supermarket.AddProduct(newProduct);
                    Console.WriteLine("添加商品成功");
                    break;

                case "4":
                    Console.WriteLine("");
                    Console.WriteLine("请输入要修改商品的ID:");
                    var updateId = Console.ReadLine();
                    var updateProduct = Supermarket.GetProductById(Convert.ToInt32(updateId));
                    if (updateProduct == null)
                    {
                        Console.WriteLine("找不到商品");
                    }
                    else
                    {
                        Console.WriteLine("请输入商品名称(当前值为“{0}”):", updateProduct.Name);
                        updateProduct.Name = Console.ReadLine();
                        Console.WriteLine("请输入商品价格(当前值为“{0}”):", updateProduct.Price);
                        updateProduct.Price = Convert.ToDecimal(Console.ReadLine());
                        Console.WriteLine("请输入商品库存(当前值为“{0}”):", updateProduct.Stock);
                        updateProduct.Stock = Convert.ToInt32(Console.ReadLine());
                        Supermarket.UpdateProduct(updateProduct);
                        Console.WriteLine("修改商品成功");
                    }
                    break;

                case "5":
                    Console.WriteLine("");
                    Console.WriteLine("请输入要删除商品的ID:");
                    var deleteId = Console.ReadLine();
                    var deleteProduct = Supermarket.GetProductById(Convert.ToInt32(deleteId));
                    if (deleteProduct == null)
                    {
                        Console.WriteLine("找不到商品");
                    }
                    else
                    {
                        Supermarket.DeleteProduct(deleteProduct);
                        Console.WriteLine("删除商品成功");
                    }
                    break;

                case "6":
                    Console.WriteLine("");
                    Console.WriteLine("请输入客户姓名:");
                    var customerName = Console.ReadLine();

                    var productIds = new List<int>();
                    var quantities = new List<int>();
                    while (true)
                    {
                        Console.WriteLine("");
                        Console.WriteLine("请输入商品ID(输入0表示完成选择):");
                        var productId = Console.ReadLine();
                        if (productId == "0")
                        {
                            break;
                        }
                        Console.WriteLine("请输入购买数量:");
                        var quantity = Console.ReadLine();
                        productIds.Add(Convert.ToInt32(productId));
                        quantities.Add(Convert.ToInt32(quantity));
                    }
                    var order = Supermarket.CreateOrder(customerName, productIds, quantities);
                    Console.WriteLine("");
                    Console.WriteLine("订单创建成功:");
                    Console.WriteLine("订单ID:{0}", order.OrderId);
                    Console.WriteLine("订单日期:{0}", order.Date);
                    Console.WriteLine("客户姓名:{0}", order.CustomerName);
                    Console.WriteLine("总价:{0:C}", order.TotalPrice);
                    Console.WriteLine("订单详情:");
                    Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", "ID", "产品名称", "产品价格", "购买数量", "总价");
                    foreach (var orderItem in order.OrderItems)
                    {
                        Console.WriteLine("{0}\t{1}\t{2:C}\t{3}\t{4:C}", orderItem.ProductId, orderItem.Product.Name, orderItem.UnitPrice, orderItem.Quantity, orderItem.Quantity * orderItem.UnitPrice);
                    }
                    break;

                case "0":
                    return;

                default:
                    Console.WriteLine("输入的操作无效,请重新输入");
                    break;
            }
        }
    }

    private static string FormatProduct(Product product)
    {
        return "商品ID:" + product.ProductId + ",名称:" + product.Name + ",价格:" + product.Price + ",库存:" + product.Stock;
    }
}

在这个控制台程序中,我们实现了如下的功能:

  • 查询所有商品
  • 根据商品ID查询商品
  • 添加商品
  • 修改商品
  • 删除商品
  • 创建订单

示例说明

示例1,默认的商品列表

当我们打开控制台程序之后,第一次选择“查询所有商品”后,屏幕上将出现所有添加的产品。下面是默认情况下屏幕上显示的商品列表:

所有商品列表如下:
ID  产品名称    产品价格    库存
1   苹果  ¥5.30   100
2   香蕉  ¥3.41   100
3   西瓜  ¥7.65   100
4   橘子  ¥4.20   100
5   菠萝  ¥12.00  100

示例2,创建订单

在执行控制台程序之后,我们可以选择“下单购买”这一项。例如,我们向客户“李四”出售两个“苹果” 、一个“西瓜” 以及三个“菠萝”,该订单的详细信息如下:

订单创建成功:
订单ID:1
订单日期:2022-09-27 15:10:44
客户姓名:李四
总价:¥48.95
订单详情:
ID  产品名称    产品价格    购买数量    总价
1   苹果  ¥5.30   2   ¥10.60
3   西瓜  ¥7.65   1   ¥7.65
5   菠萝  ¥12.00  3   ¥36.00

在订单生成后,相关商品的库存也会随之发生变化。在这个例子中,我们的“苹果”和“西瓜”库存量会减少2和1。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现简单超市收银系统 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • C#实现的简单验证码识别实例

    下面是针对C#实现简单验证码识别的完整攻略: 1. 获取验证码图片 首先,需要下载验证码图片并将其保存到本地。可以使用下面的代码来实现: var webClient = new WebClient(); webClient.DownloadFile("http://example.com/captcha.png", "captc…

    C# 2023年6月7日
    00
  • SQL Server 2008 安装SQLDMO.dll的方法

    首先需要明确的是,SQLDMO.dll是SQL Server的一个重要组件,许多应用程序需要它来连接和操作SQL Server数据库。在安装SQL Server 2008时,SQLDMO.dll并不是自动安装的,因此在使用一些依赖SQLDMO.dll组件的应用程序时,需要手动安装SQLDMO.dll。 下面是基本步骤: 1. 下载SQLDMO.dll文件 可…

    C# 2023年5月31日
    00
  • 在.net应用程序中运行其它EXE文件的方法

    在.NET应用程序中运行其他.exe文件可以通过 Process 类来实现。下面是实现运行其他.exe文件的步骤: 导入命名空间 System.Diagnostics using System.Diagnostics; 创建 Process 对象 Process process = new Process(); 设置 ProcessStartInfo 属性 …

    C# 2023年5月15日
    00
  • 解析Silverlight调用WCF/Rest异常的解决方法

    解析Silverlight调用WCF/Rest异常的解决方法。下面我们来一步步讲解。 问题描述 在使用Silverlight调用WCF/Rest服务时,可能会遇到各种异常错误,比如: System.ServiceModel.CommunicationException System.ServiceModel.FaultException System.Net…

    C# 2023年5月15日
    00
  • ASP.NET Core使用JWT认证授权的方法

    当使用ASP.NET Core构建Web应用程序时,使用JWT(JSON Web Token)进行身份验证和授权是一种常见的方法。JWT是一种轻量级的身份验证和授权机制,它使用JSON格式的令牌来传递用户信息和权限。 以下是使用ASP.NET Core进行JWT身份验证和授权的完整攻略: 步骤一:安装必要的NuGet包 在使用JWT进行身份验证和授权之前,需…

    C# 2023年5月17日
    00
  • C# Path.GetPathRoot(string path):获取指定路径的根目录

    Path.GetPathRoot(string path)方法是C#提供的一个静态方法,用于获取指定路径的根目录。下面是对该方法的完整攻略: 方法作用 方法名:Path.GetPathRoot(string path) 作用:获取指定路径的根目录。 使用方法 语法:Path.GetPathRoot(string path) 参数:path- 要获取根目录的路…

    C# 2023年4月19日
    00
  • c# 基于wpf,开发OFD电子文档阅读器

    首先,我们需要明确一下,OFD是一种国家标准文件格式,需要使用OFD阅读器来查看。因此,我们打算基于c#和wpf框架来开发一个OFD电子文档阅读器。下面是开发步骤: 步骤一:创建一个WPF项目 我们需要创建一个新的WPF项目,然后添加所需的引用。这些引用可能包括以下内容: OFD解析库: 我们需要使用OFD解析库来解析OFD文件,然后在WPF中显示它们。因此…

    C# 2023年6月1日
    00
  • C# 输出字符串到文本文件中的实现代码

    下面是在 C# 中输出字符串到文本文件中的实现代码攻略: 1. 创建文件并写入字符串 代码实现 using System.IO; // 定义字符串变量 string str = "hello world!"; // 创建一个文件流 FileStream fs = new FileStream("output.txt",…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部