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#批量更新sql实例

    C#批量更新SQL实例 在C#中,我们可以使用 SQLCommand 对象来执行SQL语句操作数据库。为了提高效率,在需要批量更新数据库时,我们可以使用 SQLCommand 对象的批处理功能。 批处理功能 使用 SQLCommand 对象的 ExecuteNonQuery 方法执行SQL语句时,我们可以使用批处理方法 ExecuteNonQueryAsyn…

    C# 2023年6月2日
    00
  • C#移除字符串中的不可见Unicode字符 案例代码

    C#移除字符串中的不可见Unicode字符的完整攻略如下: 问题背景 在开发中,有时候字符串中可能会包含非常规的字符,例如不可见的Unicode字符。这些字符虽然不会影响字符串的显示,但会影响字符串的处理和运算。因此,需要移除字符串中的这些非常规字符,以便更好地进行后续的操作。 解决方案 我们可以通过正则表达式来匹配和替换字符串中的非常规字符。具体实现步骤如…

    C# 2023年5月31日
    00
  • Unity Shader实现水波纹效果

    下面是详细讲解“Unity Shader实现水波纹效果”的完整攻略,共分四个步骤: 1. 编写顶点着色器 在顶点着色器中,我们需要定义一个变量来储存水波的振幅,并将其应用到顶点坐标上。以下是实现水波纹效果的基本顶点着色器代码: Shader "Custom/Water" { Properties { _Amplitude ("A…

    C# 2023年6月3日
    00
  • C#调用微信接口的相关代码

    关于C#调用微信接口的代码,我们可以通过微信官方提供的开发者文档来进行了解和学习。具体流程可以按照以下步骤操作: 1.注册微信开放平台账号并创建应用 在微信公众平台官网上注册开放平台账号,并创建一个应用。在创建应用时,需要提供应用名称、应用类型和应用描述。同时,需要获取到应用的AppID和AppSecret,这是后续调用微信接口时所必须要使用到的。 2.使用…

    C# 2023年5月31日
    00
  • C#传值方式实现不同程序窗体间通信实例

    C#传值方式实现不同程序窗体间通信实例 背景 在开发C#程序时,我们经常会遇到不同程序窗体间需要传值通信的情况。例如,在一个程序中打开了一个新的窗体,需要将数据传递给新窗体进行处理。本文将介绍不同程序窗体间传值的几种方式,并附带示例说明。 1. 使用属性传值 使用属性传值的前提是新窗体的实例对象已经创建,在父窗体中通过该对象的属性进行值传递。 在父窗体: /…

    C# 2023年6月6日
    00
  • C# 服务器发送邮件失败实例分析

    让我来详细讲解一下“C#服务器发送邮件失败实例分析”的完整攻略。 问题描述 首先,我们需要明确问题的描述,即C#服务器发送邮件失败的具体表现。通常会出现以下几种情况: 邮件无法发送,没有任何错误提示。 邮件发送失败,返回错误提示信息。 邮件发送成功,但是收件人没有收到邮件。 常见问题排查步骤 接下来,我们需要分析问题并排查原因。常见的问题排查步骤包括: 检查…

    C# 2023年5月14日
    00
  • 如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    我来为您详细讲解如何使用C#将Tensorflow训练的.pb文件用在生产环境。 背景介绍 Tensorflow是目前深度学习领域广泛使用的一个强大的开源库,它提供了许多的高级API和工具来帮助我们训练和使用深度学习模型。在Tensorflow中,模型可以被保存成一个.pb文件,该文件包含了模型的结构和参数信息,可以在需要的时候被载入到内存中进行推断。 在实…

    C# 2023年5月15日
    00
  • C#单例模式与多线程用法介绍

    C#单例模式与多线程用法介绍 单例模式是C#编程中最常用的面向对象设计模式之一,在多线程环境下实现单例模式要注意线程安全问题。本文将从以下几个方面进行介绍: 单例模式的概念及说明 单例模式的实现方式 多线程环境下的单例模式实现 示例代码介绍 单例模式概述 单例模式是指一个类只能被实例化一次,通过提供全局唯一的访问点,来确保该类的对象只有一个。单例模式在多线程…

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