当前位置: 首页 > news >正文

Python3 中级练习:简易库存管理系统

使用Python实现一个简易库存管理系统。这个项目涵盖了文件操作、数据持久化、类设计、异常处理等

import json
import os
from datetime import datetimeclass InventoryItem:def __init__(self, name, category, price, quantity, sku=None):self.name = nameself.category = categoryself.price = float(price)self.quantity = int(quantity)self.sku = sku or self._generate_sku()self.last_updated = datetime.now().strftime("%Y-%m-%d %H:%M:%S")def _generate_sku(self):"""生成简单的SKU"""initials = ''.join([word[0].upper() for word in self.name.split()])timestamp = datetime.now().strftime("%m%d%H%M")return f"{initials}-{timestamp}"def to_dict(self):"""将对象转换为字典"""return {'name': self.name,'category': self.category,'price': self.price,'quantity': self.quantity,'sku': self.sku,'last_updated': self.last_updated}class InventorySystem:def __init__(self, filename='inventory.json'):self.filename = filenameself.inventory = self._load_inventory()def _load_inventory(self):"""从文件加载库存数据"""if os.path.exists(self.filename):try:with open(self.filename, 'r') as f:return json.load(f)except Exception as e:print(f"加载库存失败: {e}")return []return []def _save_inventory(self):"""保存库存数据到文件"""try:with open(self.filename, 'w') as f:json.dump(self.inventory, f, indent=2)return Trueexcept Exception as e:print(f"保存库存失败: {e}")return Falsedef add_item(self, item):"""添加新商品到库存"""# 检查是否已存在相同SKU的商品if any(i['sku'] == item.sku for i in self.inventory):print(f"SKU {item.sku} 已存在,无法添加重复商品")return Falseself.inventory.append(item.to_dict())if self._save_inventory():print(f"成功添加商品: {item.name} (SKU: {item.sku})")return Truereturn Falsedef update_item(self, sku, quantity_change=None, new_price=None):"""更新商品库存或价格"""for item in self.inventory:if item['sku'] == sku:if quantity_change is not None:item['quantity'] += quantity_changeprint(f"更新库存: {item['name']} 数量变更: {quantity_change}")if new_price is not None:item['price'] = new_priceprint(f"更新价格: {item['name']} 新价格: ¥{new_price:.2f}")item['last_updated'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")self._save_inventory()return Trueprint(f"未找到 SKU: {sku} 的商品")return Falsedef remove_item(self, sku):"""从库存中移除商品"""for i, item in enumerate(self.inventory):if item['sku'] == sku:removed = self.inventory.pop(i)self._save_inventory()print(f"已移除商品: {removed['name']} (SKU: {removed['sku']})")return Trueprint(f"未找到 SKU: {sku} 的商品")return Falsedef search_items(self, query):"""搜索商品(按名称或SKU)"""results = []query = query.lower()for item in self.inventory:if query in item['name'].lower() or query == item['sku'].lower():results.append(item)return resultsdef get_low_stock_items(self, threshold=5):"""获取库存低于阈值的商品"""return [item for item in self.inventory if item['quantity'] < threshold]def get_inventory_value(self):"""计算库存总价值"""return sum(item['price'] * item['quantity'] for item in self.inventory)def display_inventory(self, items=None):"""显示库存列表"""inventory = items or self.inventoryif not inventory:print("库存为空")returnprint("\n{:<10} {:<15} {:<10} {:<8} {:<10} {:<15}".format("SKU", "商品名称", "分类", "价格", "数量", "最后更新"))print("-" * 70)for item in inventory:print("{:<10} {:<15} {:<10} ¥{:<7.2f} {:<10} {:<15}".format(item['sku'], item['name'], item['category'], item['price'], item['quantity'], item['last_updated']))print(f"\n总计: {len(inventory)} 种商品")def main():inventory = InventorySystem()while True:print("\n===== 库存管理系统 =====")print("1. 添加新商品")print("2. 更新库存")print("3. 移除商品")print("4. 查看所有商品")print("5. 搜索商品")print("6. 查看低库存商品")print("7. 计算库存总值")print("0. 退出系统")try:choice = input("请选择操作: ")if choice == '0':print("感谢使用库存管理系统,再见!")breakelif choice == '1':  # 添加商品print("\n添加新商品")name = input("商品名称: ")category = input("商品分类: ")price = float(input("单价: "))quantity = int(input("数量: "))new_item = InventoryItem(name, category, price, quantity)inventory.add_item(new_item)elif choice == '2':  # 更新库存sku = input("请输入要更新的商品SKU: ")print("\n1. 更新库存数量")print("2. 更新商品价格")sub_choice = input("请选择更新类型: ")if sub_choice == '1':change = int(input("输入库存变化量(+增加/-减少): "))inventory.update_item(sku, quantity_change=change)elif sub_choice == '2':new_price = float(input("输入新价格: "))inventory.update_item(sku, new_price=new_price)else:print("无效选择")elif choice == '3':  # 移除商品sku = input("请输入要移除的商品SKU: ")inventory.remove_item(sku)elif choice == '4':  # 查看所有商品inventory.display_inventory()elif choice == '5':  # 搜索商品query = input("请输入商品名称或SKU进行搜索: ")results = inventory.search_items(query)inventory.display_inventory(results)elif choice == '6':  # 查看低库存商品threshold = input("输入库存阈值(默认5): ")try:threshold = int(threshold) if threshold else 5except ValueError:threshold = 5low_stock = inventory.get_low_stock_items(threshold)if low_stock:print(f"\n库存低于 {threshold} 的商品:")inventory.display_inventory(low_stock)else:print(f"没有库存低于 {threshold} 的商品")elif choice == '7':  # 计算库存总值total_value = inventory.get_inventory_value()print(f"\n库存总价值: ¥{total_value:.2f}")else:print("无效选择,请重新输入")except ValueError:print("输入格式错误,请确保输入正确的数字或价格")except Exception as e:print(f"发生错误: {e}")if __name__ == "__main__":main()

关键知识点解析

  1. 面向对象编程

    • InventoryItem类封装商品属性和行为
    • InventorySystem类管理整个库存系统
  2. 数据持久化

    • 使用JSON格式存储库存数据
    • _load_inventory()_save_inventory()方法处理文件读写
  3. SKU生成算法

    • 自动生成基于名称和时间戳的唯一SKU
    • 确保商品的唯一标识
  4. 库存管理功能

    • 添加/更新/删除商品
    • 搜索功能(按名称或SKU)
    • 低库存预警
    • 库存总值计算
  5. 错误处理

    • 使用try-except捕获输入错误
    • 处理文件操作异常
    • 验证输入有效性
  6. 用户界面

    • 命令行菜单系统
    • 格式化的数据展示

运行示例

===== 库存管理系统 =====
1. 添加新商品
2. 更新库存
3. 移除商品
4. 查看所有商品
5. 搜索商品
6. 查看低库存商品
7. 计算库存总值
0. 退出系统
请选择操作: 1添加新商品
商品名称: iPhone 13
商品分类: 手机
单价: 5999
数量: 20
成功添加商品: iPhone 13 (SKU: I-08222345)===== 库存管理系统 =====
请选择操作: 4SKU       商品名称        分类       价格      数量        最后更新       
----------------------------------------------------------------------
I-08222345 iPhone 13      手机       ¥5999.00  20         2023-08-22 23:45:30总计: 1 种商品

扩展练习建议

  1. 添加分类管理功能

    • 实现商品分类的增删改查
    • 按分类查看库存
  2. 实现销售功能

    • 添加购物车系统
    • 处理销售订单
    • 更新库存
  3. 添加用户权限

    • 区分管理员和普通用户
    • 实现登录系统
  4. 数据统计与分析

    • 销售统计报表
    • 库存周转率计算
    • 可视化展示
  5. 使用数据库

    • 将JSON替换为SQLite数据库
    • 实现更复杂的数据查询
http://www.dtcms.com/a/469511.html

相关文章:

  • Centos 7/8 安装 Redis
  • 高通平台蓝牙学习--揭秘 WCN Split A2DP(终章)
  • 工业设计网站哪家好包头建设工程安全监督站网站
  • 云原生-k8s
  • 大型手游可以在云手机中流畅运行吗
  • 移动端云手机的优势都有哪些?
  • clk_divide时钟分频模块
  • 手机群控软件如何优化游戏运营的运营策略
  • 目前流行的网站开发设计品牌网站建设意义
  • 使用Mybatis-Plus,以及sqlite的使用
  • 一元一次方程的解
  • 自然语言处理中字节级与令牌级 Transformer 模型的对比分析
  • Android 编译速度优化:JVM堆内存扩充
  • 网站如何减少404跳转网站建设外包工作室
  • vue的hello小案例
  • SDL+WebGpu跨平台加速学习笔记
  • 第16章 C预处理器和C库
  • Vue-31-通过flask接口提供的数据使用plotly.js绘图(三)
  • vue前端面试题——记录一次面试当中遇到的题(5)
  • 90设计网站最便宜终身中小企业的网站建设
  • 杭州高端网站设计公司如何制作淘宝客网站
  • 微服务拆分以及注册中心
  • 遗留系统微服务改造(五):监控体系建设与指标收集
  • Java微服务面试实战:从电商场景看微服务架构设计与实现
  • (微服务)Dubbo 服务调用
  • Java微服务实战:从零搭建电商用户服务系统
  • Spring Cloud微服务SaaS智慧工地项目管理平台源码
  • MySQL常用API
  • DDD企业级记账软件实战二|从0-1创建用户微服务和记账微服务基于Spring Cloud
  • 昆明建设银行纪念币预约网站网站顶一下代码