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技术站