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#实现将汉字转化为2位大写的16进制Unicode的方法

    下面是“C#实现将汉字转化为2位大写的16进制Unicode的方法”的详细攻略: 标准的Unicode编码格式 Unicode编码格式表示了计算机中所有可能用到的字符,包括英文字母、数字、标点符号和各种语言的文字。其中,汉字的Unicode编码范围是0x4E00到0x9FFF。 在C#中,可以使用\u关键字来表示Unicode编码,如\u4E00表示汉字“一…

    C# 2023年5月31日
    00
  • C#跨PC远程调用程序并显示UI界面

    下面是详细的攻略。 概述 跨PC远程调用程序并显示UI界面需要使用C#语言,具体实现主要依赖于.NET Remoting和WCF两种技术。 .NET Remoting技术在.NET Framework 4.0之后已经被标记为过时,官方推荐使用WCF进行远程调用和通信。因此,在本文中,我们将主要使用WCF技术进行跨PC远程调用。 步骤 下面是跨PC远程调用程序…

    C# 2023年6月6日
    00
  • C#如何遍历Dictionary

    C#提供了许多方法,可以对Dictionary进行遍历操作。下面是三个常见的遍历方式: 1. 使用foreach循环遍历Dictionary Dictionary<string, int> dict = new Dictionary<string, int>(); // 添加元素 dict.Add("a", 1);…

    C# 2023年6月1日
    00
  • http调用webservice操作httprequest、httpresponse示例

    http调用webservice操作httprequest、httpresponse示例 在使用HTTP调用Web服务时,我们可以使用HttpRequest和HttpResponse对象来操作HTTP请求和响应。本文将提供详细的“http调用webservice操作httprequest、httpresponse示例”的完整攻略,包括如何使用HttpRequ…

    C# 2023年5月15日
    00
  • asp.net webservice返回json的方法

    当我们使用ASP.NET Web Service时,返回JSON格式数据是常见的需求。下面是ASP.NET Web Service返回JSON格式数据的完整攻略: 步骤1:创建Web服务 首先,需要在ASP.NET项目中创建Web服务。可以在Visual Studio中选择“新建项目”->“ASP.NET Web应用程序”,然后选择“Web服务”模板进…

    C# 2023年5月31日
    00
  • asp.net SqlHelper数据访问层的使用

    作为网站的作者,关于asp.net SqlHelper数据访问层的使用,建议按照以下步骤进行: 步骤一:安装SqlHelper NuGet包 作为Sql Server数据访问层的封装,SqlHelper NuGet包能够帮助我们在asp.net应用程序中快速构建数据访问层。所以在开始本攻略前,最好先确认你已经安装了SqlHelper NuGet包。如果没有安…

    C# 2023年6月3日
    00
  • c#字符长度查询代码

    下面是关于C#字符长度查询代码的完整攻略: 1. 字符串长度及字符长度的定义 首先,需要明确字符串长度和字符长度的定义: 字符串长度:指的是一个字符串所包含的字符个数。 字符长度:指的是不同编码对应的字符所占用的字节数。 举个例子,假设有以下字符串: "abc你好" 这个字符串的长度是6,因为它包含了6个字符;但是它的字符长度则取决于所使…

    C# 2023年6月1日
    00
  • C#获取指定目录最后写入时间的方法

    关于C#获取指定目录最后写入时间的方法,可以使用FileInfo类中的LastWriteTime属性来实现。具体步骤如下: 步骤1. 引入命名空间 首先我们需要在代码文件中引入System.IO命名空间,因为FileInfo类是位于该命名空间下的。代码如下: using System.IO; 步骤2. 定义目录路径 接着,我们需要定义一个目录路径的字符串变量…

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