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#生成比较短的Token字符串

    当我们开发Web应用程序的时候,经常需要使用Token字符串来保证数据安全性,如身份验证、跨域访问等。但是由于Token字符串的长度比较长,可能会占用过多的空间和带宽资源,因此我们需要生成比较短的Token字符串。下面我给出一些实现方法和示例。 方法一:使用C#中的Base64编码 Base64编码是一种常用的编码方式,可以将任意二进制数据编码成只包含64个…

    C# 2023年6月7日
    00
  • ASP.NET连接SQL数据库的简单实例代码

    下面是ASP.NET连接SQL数据库的简单实例代码的攻略。 简介 在ASP.NET中,连接SQL数据库是一项很常见的任务。通过连接数据库,我们可以将数据存储在数据库中,并在需要的时候从数据库中检索这些数据。本攻略将引导您完成ASP.NET连接SQL数据库的简单实例代码。 步骤 步骤1:创建一个ASP.NET项目 首先,我们需要创建一个ASP.NET项目。可以…

    C# 2023年5月31日
    00
  • C# 中如何利用lambda实现委托事件的挂接

    在C#中,使用Lambda表达式可以非常方便地实现委托事件的挂接。下面是详细的攻略: 理解Lambda表达式和委托事件的概念 Lambda表达式是C# 3.0引入的特性,它可以使得代码更加简洁和易读。在委托事件中,委托是一种类类型,它可以存储一系列的方法,并且可以被调用。事件是委托的一个特例,它只能被订阅,不能被直接调用。 声明委托和事件 C#中的委托和事件…

    C# 2023年6月6日
    00
  • C# TextWriter.Write – 写入一个字符

    TextWriter.Write 方法是C#中用于将文本写入流的方法之一。其主要作用是向流中写入指定的文本内容。下面是关于 TextWriter.Write 方法的使用方法的详细攻略: 方法定义 public virtual void Write(string value); 此方法为虚方法,因此可以在子类中进行重写。 参数说明 value(必填参数):要写…

    C# 2023年4月19日
    00
  • ASP.NET Core 集成 React SPA应用的步骤

    ASP.NET Core 集成 React SPA应用的步骤 在ASP.NET Core应用程序中集成React SPA应用程序可以提供更好的用户体验和更高的性能。本攻略将介绍如何在ASP.NET Core应用程序中集成React SPA应用程序。 步骤 以下是在ASP.NET Core应用程序中集成React SPA应用程序的步骤: 创建React应用程序…

    C# 2023年5月17日
    00
  • ASP.NET Core Kestrel 中使用 HTTPS (SSL)

    在 ASP.NET Core 中,可以使用 Kestrel 服务器来启用 HTTPS(SSL)协议。以下是 ASP.NET Core Kestrel 中使用 HTTPS 的完整攻略: 步骤一:创建证书 在使用 HTTPS 之前,需要创建一个证书。可以使用 OpenSSL 工具或者 Windows PowerShell 命令来创建证书。以下是使用 OpenSS…

    C# 2023年5月17日
    00
  • 详解ASP.NET Core实现强类型Configuration读取配置数据

    在 ASP.NET Core 中,可以使用强类型 Configuration 来读取配置数据。强类型 Configuration 可以将配置数据映射到 C# 类型中,方便使用和管理。以下是详解 ASP.NET Core 实现强类型 Configuration 读取配置数据的完整攻略: 步骤一:定义配置类 在 ASP.NET Core 项目中,需要定义一个 C…

    C# 2023年5月17日
    00
  • C# 执行CMD命令并接收返回结果的操作方式

    下面我会详细讲解如何在C#中执行CMD命令并接收返回结果的操作方式,步骤如下: 第一步:引入命名空间和创建Process对象 using System.Diagnostics; 通过引入System.Diagnostics命名空间,我们可以使用Process类来执行CMD命令并接收返回结果。我们需要先创建一个Process对象来执行CMD命令,以便可以设置P…

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