Python案例分析|基于模块的库存管理系统

news2024/11/24 6:39:23

 本案例是通过一个多模块的库存管理系统案例,帮助大家深入了解基于模块的Python应用程序的开发流程。

01、库存管理系统API设计

本文实现一个简单的基于模块的库存管理系统。系统采用JSON文件来保存数据。产品信息设计为字典,键为sku_id(产品ID),值为sku_name(产品名称),使用products.json实现其持续化。货架位置信息也设计为字典,键为loc_id(货架ID),值为loc_name(货架名称),使用location.json实现其持续化。商品库存信息设计为列表[sku_id, loc_id]的列表,使用items.json实现其持续化。

库存管理系统设计为三个模块文件,即data.py、ui.py和main.py。

库存管理系统data.py负责数据的管理,其API设计如表1所示。

表1

 库存管理系统ui.py负责用户界面交互,其API设计如表2所示。

表2

02、库存管理系统的功能设计

库存信息管理系统主要包括如下功能。

(1)增加产品信息

调用ui.prompt_for_new_sku_id(),提示用户输入新的产品ID,调用ui.prompt_for_sku_name(),提示用户输入产品名称。调用data.add_product(sku_id, sku_name)增加新的产品。如果用户输入为空,则返回None,即什么也不做。

(2)产品信息报表

调用ui.report_products(),显示产品信息列表。

(3)增加货架位置

调用ui.prompt_for_new_loc_id(),提示用户输入新的货架位置ID,调用ui.prompt_for_loc_name(),提示用户输入货架名称。调用data.add_location(sku_id, sku_name)增加新的货架。如果用户输入为空,则返回None,即什么也不做。

(4)货架位置报表

调用ui.report_location(),显示货架位置信息列表。

(5)商品入库管理

调用ui.prompt_for_old_sku_id(),提示用户输入产品ID,调用ui.prompt_for_old_loc_id(),提示用户输入货架ID。调用data.add_item(sku_id, loc_id),实现商品入库。如果用户输入为空,则返回None,即什么也不做。

(6)商品出库管理

调用ui.prompt_for_old_sku_id(),提示用户输入产品ID,调用ui.prompt_for_old_loc_id(),提示用户输入货架ID。调用data.remove_item(sku_id, loc_id),实现商品出库。如果库存不存在,则报错。如果用户输入为空,则返回None,即什么也不做。

(7)商品库存信息报表

调用ui.report_items(),显示库存信息列表。

03、主模块main.py的实现

主模块导入data和ui模块。

在main.py中,定义main()函数,首先调用data.init(),从磁盘JSON格式文件中读取数据。然后在无限循环中,调用ui.prompt_for_action()显示功能菜单,接受用户输入,并根据用户的功能选择,实现各模块相应功能。

【例1】库存管理系统主模块main.py。

"""库存管理系统:基于JSON"""
import data
import ui
def main():
    data.init()
    while True:
        action = ui.prompt_for_action()
        if action == 'QUIT':
            break
        elif action == 'ADD_PRODUCT':
            sku_id = ui.prompt_for_new_sku_id()
            if sku_id != None:
                sku_name = ui.prompt_for_sku_name()
                if sku_name != None:
                    data.add_product(sku_id, sku_name)
        elif action == 'REPORT_PRODUCTS':
            ui.report_products()
        elif action == 'ADD_LOCATION':
            loc_id = ui.prompt_for_new_loc_id()
            if loc_id != None:
                loc_name = ui.prompt_for_loc_name()
                if loc_name != None:
                    data.add_location(loc_id, loc_name)
        elif action == 'REPORT_LOCATIONS':
            ui.report_locations()
        elif action == 'ADD_ITEM':
            sku_id = ui.prompt_for_old_sku_id()
            if sku_id != None:
                loc_id = ui.prompt_for_old_loc_id()
                if loc_id != None:
                    data.add_item(sku_id, loc_id)
        elif action == 'REMOVE_ITEM':
            sku_id = ui.prompt_for_old_sku_id()
            if sku_id != None:
                loc_id = ui.prompt_for_old_loc_id()
                if loc_id != None:
                    if not data.remove_item(sku_id, loc_id):
                        print('该库存不存在')
        elif action == 'REPORT_ITEMS':
            ui.report_items()
#######################################################################
if __name__ == "__main__":
    main()

 

04、用户界面交互模块ui.py的实现

用户界面交互模块导入data模块。实现表2所示的API。

【例2】库存管理系统用户界面交互模块ui.py。

import data
def prompt_for_action():
    """ 提示功能菜单。返回用户输入选择 """
    while True:
        print('---------------库存信息管理系统-------------')
        print('| 1: 增加产品信息 |')
        print('| 2: 产品信息报表 |')
        print('| 3: 增加货架位置 |')
        print('| 4: 货架位置报表 |')
        print('| 5: 商品入库管理 |')
        print('| 6: 商品出库管理 |')
        print('| 7: 商品库存信息报表 |')
        print('| 0: 退出 |')
        print('-------------------------------------------')
        
        choice = input('请选择功能菜单(0-7):')
        if choice == '0': return 'QUIT'
        elif choice == '1': return 'ADD_PRODUCT'
        elif choice == '2': return 'REPORT_PRODUCTS'
        elif choice == '3': return 'ADD_LOCATION'
        elif choice == '4': return 'REPORT_LOCATIONS'
        elif choice == '5': return 'ADD_ITEM'
        elif choice == '6': return 'REMOVE_ITEM'
        elif choice == '7': return 'REPORT_ITEMS'
def prompt_for_old_sku_id():
    """ 提示用户输入有效的产品sku_id并返回有效产品ID,或者返回None """
    while True:
        sku_id = input("请输入产品ID:")
        if sku_id == "":
            return None
        elif sku_id not in data.get_products():
            print("该产品不存在, 请重新输入")
        else:
            return sku_id
def prompt_for_new_sku_id():
    """ 提示用户输入新的产品sku_id并返回新产品ID,或者返回None """
    while True:
        sku_id = input("请输入新的产品ID:")
        if sku_id == "": return None
        elif sku_id in data.get_products():
            print("该产品已经存在,请重新输入")
        else:
            return sku_id
def prompt_for_old_loc_id():
    """ 提示用户输入有效的货架位置loc_id并返回有效货架位置ID,或者返回None """
    while True:
        loc_id = input("请输入货架位置ID:")
        if loc_id == "":
            return None
        elif loc_id not in data.get_locations():
            print("该货架位置不存在,请重新输入")
        else:
            return loc_id
def prompt_for_new_loc_id():
    """ 提示用户输入新的货架位置loc_id并返回,或者返回None """
    while True:
        loc_id = input("请输新的货架位置ID:")
        if loc_id == "": return None
        elif loc_id in data.get_locations():
            print('该货架位置已经存在,请重新输入')
        else:
            return loc_id
def prompt_for_sku_name():
    """ 提示用户输入产品名称sku_name并返回产品名称,或者返回None """
    while True:
        sku_name = input("请输入产品名称:")
        if sku_name == "": return None
        else: return sku_name
def prompt_for_loc_name():
    """ 提示用户输入货架位置名称loc_name并返回货架位置名称,或者返回None """
    while True:
        loc_name = input("请输入货架位置名称:")
        if loc_name == "": return None
        else: return loc_name
def report_products():
    """ 产品信息报表 """
    for (k, v) in data.get_products().items():
        print('{0:8} {1}'.format(k, v))
def report_locations():
    """ 货架位置报表 """
    for (k, v) in data.get_locations().items():
        print('{0:8} {1}'.format(k, v))
def report_items():
    """ 库存信息报表 """
    for (k, v) in data.get_items():
        sku_name = data.get_products()[k]
        loc_name = data.get_locations()[v]
        print('{0:8} {1}: {2:8}{3}'.format(k,sku_name,v,loc_name))

 

05、数据处理模块data.py的实现

数据处理模块实现表1所示的API。通过Python标准库模块json中的loads()函数和dumps()函数,可以实现从JSON文件读取数据和转储数据到JSON文件的功能。

【例3】库存管理系统数据处理模块data.py。

import os
import json
#全局变量
_products = {} #保存产品信息的字典:sku_id:sku_name
_locations = {} #保存货架位置的字典:loc_id:loc_name
_items = [] #保存商品库存的列表,元素为元组(sku_id,loc_id)
def init():
    """从磁盘JSON格式文件中读取数据"""
    global _products, _locations, _items
    if os.path.exists("products.json"):
        f = open("products.json", "r", encoding='utf-8')
        _products = json.loads(f.read())
        f.close()
    if os.path.exists("locations.json"):
        f = open("locations.json", "r", encoding='utf-8')
        _locations = json.loads(f.read())
        f.close()
    if os.path.exists("items.json"):
        f = open("items.json", "r", encoding='utf-8')
        _items = json.loads(f.read())
        f.close()
        
def _save_products():
    """ 把产品信息数据_products以JSON格式保存到磁盘文件"""
    global _products
    f = open("products.json", "w", encoding='utf-8')
    f.write(json.dumps(_products, ensure_ascii=False))
    f.close()
def _save_locations():
    """ 把货架位置数据_locations以JSON格式保存到磁盘文件"""
    global _locations
    f = open("locations.json", "w", encoding='utf-8')
    f.write(json.dumps(_locations))
    f.close()
def _save_items():
    """ 把商品库存数据_items以JSON格式保存到磁盘文件"""
    global _items
    f = open("items.json", "w", encoding='utf-8')
    f.write(json.dumps(_items))
    f.close()
    
def get_products():
    """ 返回产品信息 """
    global _products
    return _products
def get_locations():
    """ 返回货架位置信息 """
    global _locations
    return _locations
def get_items():
    """ 返回商品库存信息 """
    global _items
    return _items
def add_product(sku_id, sku_name):
    """ 增加一个产品sku_id、sku_name """
    global _products
    _products[sku_id] = sku_name
    _save_products()
def add_location(loc_id, loc_name):
    """ 增加一个货架位置loc_id、loc_name """
    global _locations
    _locations[loc_id] = loc_name
    _save_locations()
def add_item(sku_id, loc_id):
    """ 入库一件商品:商品sku_id、货架sku_id """
    global _items
    _items.append((sku_id, loc_id))
    _save_items()
def remove_item(sku_id, loc_id):
    """出库一件商品:商品sku_id、货架sku_id,返回True;如果不存在,返回False"""
    global _items
    for i in range(len(_items)):
        if sku_id == _items[i][0] and loc_id == _items[i][1]:
            del _items[i]
            _save_items()
            return True
    return False

 

06、系统测试运行

在命令行窗口中输入如下命令:

python main.py

运行结果如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件工程——第13章软件项目管理知识点整理(完结)

本专栏是博主个人笔记,主要目的是利用碎片化的时间来记忆软工知识点,特此声明! 文章目录 1.管理的定义? 2.软件项目管理地位?(重要性) 3.软件项目管理过程从一组项目计划活动开始&#xff0c…

怎么制作查询成绩的网页?这个不用代码的方法你用过没?

作为一名老师,与家长沟通交流是日常工作中重要的一部分。特别是每次考完试后,家长都急切地想了解孩子的成绩,以便能及时了解孩子的学习情况并给予适当的支持和指导。然而,为了保护学生的隐私,大部分学校不公开张榜学生…

字符设备驱动led灯实验

应用程序代码 #include<stdio.h> #include<string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h>int main (int argc, const char *argv[]) {char buf[128] &quo…

马上就要到2023年秋招的黄金时期了,计算机专业面试究竟需要注意些什么?

说说自己&#xff0c;不算很突出。本人 17 年就读于一所普通的本科学校&#xff0c;20 年 6 月在三年经验的时候顺利通过校招实习面试进入大厂&#xff0c;现就职于某大厂安全实验室。 所以我还是比较有话语权的吧。 话不多说直接进入主题。 1.理论知识准备&#xff1a;复习计算…

驱动 day9 作业

要求&#xff1a; 现象 按下key1 led1灯的状态取反&#xff0c;number的值取反&#xff0c;然后应用程序打印从内核读到的number的值 应用程序test.c #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #incl…

Bash 有效电话号码

193 有效电话号码 给定一个包含电话号码列表&#xff08;一行一个电话号码&#xff09;的文本文件 file.txt&#xff0c;写一个单行 bash 脚本输出所有有效的电话号码。 你可以假设一个有效的电话号码必须满足以下两种格式&#xff1a; (xxx) xxx-xxxx 或 xxx-xxx-xxxx。&…

三维重建以及神经渲染中的学习(三)

三维重建以及神经渲染中的学习 公众号AI知识物语 本文内容为参加过去一次暑期课程学习时的笔记&#xff0c;浅浅记录下。 三维图形可控生成&#xff1a; 1&#xff1a;学习一个图形生成模型 2&#xff1a;具有可控三维变量&#xff1a;1物体形状&#xff1b;2物体位置&…

ScannerException: while scanning for the next token found character ‘@‘ 问题解决

问题描述 后端项目启动的时候报ScannerException: while scanning for the next token found character ‘‘ 异常&#xff0c;自己有些疑问&#xff0c;项目前一会都还可以&#xff0c;到报错的过程中&#xff0c;项目都没有动过。 解决办法 重新刷新项目就解决了。

RxSwift 使用方式

背景 最近项目业务&#xff0c;所有模块已经支持Swift混编开发&#xff0c;正在逐步使用Swift 方式进行开发新业务&#xff0c;以及逐步替换老业务方式进行发展&#xff0c;所以使用一些较为成熟的Swift 的三方库&#xff0c;成为必要性&#xff0c;经过调研发现RxSwift 在使用…

HarmonyOS/OpenHarmony应用开发-程序包多HAP机制(上)

一、多HAP机制设计目标 方便开发者模块化的管理应用&#xff0c;好的应用一般都是模块化管理&#xff0c;模块之间属于松耦合关系。多HAP方便了开发者将业务划分成多个模块&#xff0c;每个模块放到独立的HAP中。例如支付类应用&#xff0c;有统一的主界面&#xff0c;主界面管…

命令注入(Command Injection)安全漏洞(SQL注入、LDAP注入、OS命令注入、XPath注入、JavaScript注入)

文章目录 命令注入&#xff08;Command Injection&#xff09;发生场景示例防范手段其他类型命令注入漏洞1. SQL注入&#xff08;SQL Injection&#xff09;2. LDAP注入&#xff08;LDAP Injection&#xff09;3. OS命令注入&#xff08;OS Command Injection&#xff09;4. XP…

VectorCAST对外部函数打桩和查看覆盖率

一、对外部函数打桩 在单元测试中&#xff0c;如果要调用到外部函数调用的时候&#xff0c;就要对外部函数进行打桩。 对外部函数进行打桩的目的&#xff0c;一方面是为了验证外部函数接口的正确性&#xff0c;另一方面是对外部函数打桩 之后就可以自定义外部函数返回值。 对…

Unity5.4.1打砖块游戏Breakout_Game_Starter_Kit

Unity5.4.1打砖块游戏Breakout_Game_Starter_Kit 童年的回忆 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88042779

vue 使用 npm run dev命令后 自动打开浏览器为谷歌

文章目录 需求分析 需求 vue 启动后&#xff0c;想要其自动打开指定浏览器&#xff08;谷歌&#xff09;并设置要打开的IP地址和端口号 分析 package.json 打开package.json文件加上 --open chrome index.js 打开index.js文件&#xff0c;将浏览器设置为自动打开

【力扣刷题 | 第十七天】

目录 前言&#xff1a; 55. 跳跃游戏 - 力扣&#xff08;LeetCode&#xff09; 45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a; 前言&#xff1a; 今天两道类型都是贪心算法&#xff0c;希望可以有所收获 55. 跳跃游戏 - 力扣&#xff08;LeetC…

入门车载以太网

前言 近些年来,随着为了让汽车更加安全、智能、环保等,一系列的高级辅助驾驶功能喷涌而出。未来满足这些需求,就对传统的电子电器架构带来了严峻的考验,需要越来越多的电子部件参与信息交互,导致对网络传输速率,稳定性,负载率等方面都提出了更为严格的挑战。 除此以外…

哪些职位需要CISP证书?快进来看看你需不需要

CISP是目前中国最主流的信息行业的证书&#xff0c;也是业界公认的最专业的信息安全技术和管理资格培训。无论是政府部门、金融、电力、交通能源、IT等相关行业&#xff0c;都可以看到CISP证书的持有人。现在持证的人数日趋上升&#xff0c;成为一个必备证书。CISP知识体系是国…

【JavaEE】HTTP协议和抓包工具的使用

目录 1、HTTP的概述和抓包工具的使用 1.1、HTTP是什么 1.2、了解HTTP协议的工作过程 1.3、抓包工具的使用 1.3.1、抓包工具在HTTP传输时的工作原理 1.3.2、Fiddler抓包工具的下载和使用 2、HTTP协议格式 2.1、HTTP 请求格式 2.1.1.基本格式 2.1.2、了解HTTP请求包中的…

有趣的命令——————用随机密码新建20个用户,并输出密码

vim test.sh 输入以下内容&#xff1a;for i in seq 10douseradd user$ipassecho $RANDOM | md5sum |cut -c 1-6echo "$pass" | passwd --stdin "user$i"echo -e "账户&#xff1a;user$i\n 密码&#xff1a;$pass" >> /root/passwddone例…

Layui关于如何添加连接数据库的选项卡(三)

目录 1.实现效果&#xff1a; 2.思路&#xff1a; 3.PermissionDao类&#xff08;增加属性&#xff09; 4.主页&#xff1a;jsp 5.简洁风格修改选项卡的样式&#xff1a; 6.关于style中的属性设置使用 7.关于Element 组件介绍&#xff1a; 8. Layui 中的页面进行更新和…