python商品管理系统_基于Python的超市账户&商品管理系统
--------------------------------声明:完全原创,转载请注明出处!------------------
超市账户&商品管理系统
主要功能:
用户管理系统
用户分为超级管理员和管理员和用户三种:
系统最高管理者(类似于系统的终极负责人,在某家超市采用该管理系统时,则能特意针对该客户生成相应的管理权限):
a. 账号只有一个并且是固定的
b. 用户名:admin 默认密码:admin
c. 用户名不可以更改,密码登录后可改
d. 超级管理员创建、删除和查看管理员信息
(2)管理员(相当于某家超市的老板,可以给超市的相关工作人员创建账号)
a. 可以修改自己的密码
b. 创建、删除和查看用户信息
c. 用户将被赋予相应的权限(其中包含:查询商品信息、删除商品记录、更新商品详情、新增商品条目)
d. 对该超市的所有的商品拥有所有的权限
( 3 ) 用户(对应于某家超市的所有员工,并每位员工将根据其职位获得相应的售卖权限)
商品管理系统
(1)超市进货入库功能
(2)超市售货功能
(3)点货功能
注意:a. 通过一个管理员注册的用户, 负责同一个超市内的商品库存, 请确保该用户的商品数据与该超市的数据必须实现同步
b. 所有数据都需要做数据持久化
c. 在实现功能的过程中需注意人性化细节问题;例如:手机号需进行合法性验证。
基于面向对象编程的思想, 结合文件操作技术, 实现对各类账户及商品信息的数据持久化存储( pickle模块用于存储这些对象数据 ,从而能够方便地调用相关功能)。具体而言, 各类账户的数据存储在一个统一文件中, 每位管理人员都拥有独立于团队之外的一份专门用于管理商品的小型数据存储空间, 团队成员的所有操作均基于这个统一的数据存储空间进行。部分功能界面图示如下, 所有相关功能测试均已提供

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
代码
import pickle # 导入pickle模块,方便数据持久化
all_users = [] # 该列表用于临时存储(即存放在内存中)的所有账户信息
其中超级管理员账号的权限等级设置为0分;普通管理员账号的权限等级设置为1分;普通员工账号的权限等级设置为2分
admin_goods = [] # 本列表临时存放管理员(该超市)对应的货物信息,登录不同的账号只会打开该超市对应的货物文件
class Goods: # 货物类
def init(self, id: int, name: str, price: float, amount: int):
self.id = id # 商品货号
self.name = name # 品名
self.price = price # 价格
self.amount = amount # 数量
def str(self): # 重写方法,方便打印
return '货号:{}, 品名:{}, 价格:{}元, 数量:{}'.format(self.id, self.name, self.price, self.amount)
class ShopManager: # 店员类
def init(self, user_name: str, password: str, permission: int, authorization: int, assigned_to: str): # 账户管理人属性指定
if user_name == 'admin':
print('不可使用超管账户名!')
else:
self.user_name = user_name # 用户名
self.pass_wd = pass_wd # 密码
self.permission = permission # 账号等级 0:超管 1:普管 2:店员
商品权限数字:查看0001 删除0010 修改0100 增加1000 通过按位与运算来验证权限
self.authorization = authorization
self.belong = belong # 该店员属于哪个管理员(哪家超市)
def str(self): # 重写方法,方便打印
返回'店员账户: {}, 密码: {}, 等级: {}, 权限编号: {}'.format(self.user_name, self.pass_wd, self.permission, selfauthorization)
def view_goods(self): # 查看商品(点货)
验证权限
if self.authorization & 0b0001 == 0b0001:
for item in admin_goods:
print(item)
else:
print('很抱歉,你没有商品查看权限!')
def del_goods(self): # 删除商品
验证权限
if self.authorization & 0b0010 == 0b0010:
id = int(input('请输入要删除的商品编号(纯数字):'))
for item in admin_goods:
if item.id == id:
admin_goods.remove(item)
with open(self.belong+'_goods.txt', 'wb+') as file:
pickle.dump(admin_goods, file)
print('商品{}删除成功'.format(id))
break
else:
print('商品{}不存在'.format(id))
else:
print('很抱歉,你没有商品删除权限!')
def mod_goods(self): # (进货,修改)
验证权限
if self.authorization & 0b0100 == 0b0100:
id = int(input('请输入要修改的商品编号(纯数字):'))
for item in admin_goods:
if item.id == id:
name = input('请输入新的商品名称:')
price = round(float(input('请输入新的商品价格(正数):')),2)
amount = int(input('请输入新的商品数量(正整数):'))
admin_goods.remove(item)
item = Goods(id, name, price, amount)
admin_goods.append(item)
with open(self.belong+'_goods.txt', 'wb+') as file:
pickle.dump(admin_goods, file)
print('商品{}修改成功'.format(id))
break
else:
print('商品{}不存在'.format(id))
else:
print('很抱歉,你没有商品修改权限!')
def add_goods(self): # 进货
验证权限
if self.authorization & 0b1000 == 0b1000:
id = int(input("请输入要添加商品编号(纯数字):"))
for item in admin_goods:
if item.id == id:
print("商品编号{}已存在,请重新选择!".format(item.id))
break
else:
name = input("请输入添加商品名称:")
price = round(float(input("请输入添加商品价格(正数):")),2)
amount = int(input("请输入添加商品数量(正整数):"))
item = Goods(int(id), name, price, amount)
admin_goods.append(item)
with open(self.belong+'_goods.txt', 'wb+') as file:
pickle.dump(admin_goods, file)
print('商品编号{}添加成功!'.format(id))
else:
print('很抱歉,你没有商品添加权限!')
def sale_goods(self): # 售货,本超市所有人员均有权售货,无需验证权限
id = int(input("请输入售卖的商品编号(纯数字):"))
for info in admin_goods:
if info.id == id:
amount = int(input('请输入商品的售卖的数量(正整数):'))
info.amount -= amount
with open(self.belong+'_goods.txt', 'wb+') as file:
pickle.dump(admin_goods, file)
输出{}商品销量为{}件, 交易总额为${}元.
break
else:
print('你输入的商品信息有误!')
def shopmanager(soma): # 店员程序
global admin_goods
user = soma.dict['user_name']
file_name = soma.belong + '_goods.txt' # 拼接《本超市》的商品文件名
try:
with open(file_name, 'rb+') as file:
admin_goods = pickle.load(file) # 用于读取并存入临时列表该超市的商品信息
except Exception as x: # 如果文件为空会报错,此处为异常处理
test_item = Goods(0, 'test', 0.0, 0) # 创建测试商品,避免出错
admin_goods.append(test_item) # 列表保存测试商品
with open(file_name, 'wb+') as file:
pickle.dump(admin_goods, file) # 货物对象的列表发生变动后, 文件必须重写并刷新一次
while True:
print(
'''
店员账户{}登录成功!
╔═══════════════欢迎进入店员程序═════════════════╗
╠═══════════════1.查看商品══════════════════════╣
╠═══════════════2.删除商品══════════════════════╣
╠═══════════════3.修改商品══════════════════════╣
╠═══════════════4.增加商品══════════════════════╣
╠═══════════════5.售卖商品══════════════════════╣
╚═══════════════6.退出店员程序══════════════════╝
'''.format(user))
num = input('请输入操作指令:')
if num == '1': # 查看本超市所有货物
soma.view_goods()
elif num == '2': # 删除货物
soma.del_goods()
elif num == '3': # 修改货物信息
soma.mod_goods()
elif num == '4': # 添加新的货物
soma.add_goods()
elif num == '5': # 销售货物
soma.sale_goods()
elif num == '6': # 退出回到主程序
break
else:
print('你输入的指令有误,请重新输入!')
def admin_shop(admin): # 管理员专属的商品操作程序
global admin_goods
user = admin.dict['user_name']
try:
with open(user + '_goods.txt', 'rb+') as file:
admin_goods = pickle.load(file) # 尝试从文件中导入《本超市》的所有商品至临时货物列表
except Exception as x: # 如果文件为空会报错,此为异常处理
test_item = Goods(0, 'test', 0.0, 0) # 创建测试商品,避免出错
admin_goods.append(test_item) # 列表保存测试商品
with open(user + '_goods.txt', 'wb+') as file:
pickle.dump(admin_goods, file) # 保存货物的列表改动一次,文件就刷新一次
while True:
print(
'''
{},欢迎进入您的商品管理程序!
╔═══════════════欢迎进入商品管理程序══════════════╗
╠═══════════════1.查看商品══════════════════════╣
╠═══════════════2.删除商品══════════════════════╣
╠═══════════════3.修改商品══════════════════════╣
╠═══════════════4.增加商品══════════════════════╣
╠═══════════════5.售卖商品══════════════════════╣
╚═══════════════6.退出到管理员程序═══════════════╝
'''.format(admin.dict['user_name']))
num = input('请输入操作指令:')
if num == '1': # 查看所有货物,以管理员身份
admin.view_goods()
elif num == '2': # 删除货物
admin.del_goods()
elif num == '3': # 修改货物信息
admin.mod_goods()
elif num == '4': # 添加新的货物
admin.add_goods()
elif num == '5': # 销售货物
admin.sale_goods()
elif num == '6': # 退出到上一层,回到管理员后台程序
break
else:
print('你输入的指令有误,请重新输入!')
class Super_admin: # 超级管理员类
def init(self, user_name:str, pass_wd:str): # 创建超管账户
for info in all_users:
if info.user_name == 'admin':
print('已存在唯一的超管账户!')
else:
self.user_name = 'admin'
self.pass_wd = 'admin'
self.permission = 0
self.belong = ' '
print('帐号文件为空,创建超管账户admin成功!')
def change_own_pd(self): # 改变自己的密码
all_users.remove(self)
new_pd = input('请输入超管的新密码:')
self.pass_wd = new_pd
all_users.append(self)
with open('all_users.txt', 'rb+') as file:
pickle.dump(all_users, file)
print('超管账户admin密码修改成功,请牢记新密码!')
def create_admin(self): # 创建管理员账户
user_name = input('请输入你要创建的管理员账户名:')
for info in all_users:
if info.user_name == user_name:
print('{}账户已存在!'.format(user_name))
break
else:
pass_wd = input('请设置密码:')
user_info = Admin(user_name, pass_wd)
all_users.append(user_info)
with open('all_users.txt', 'rb+') as file:
pickle.dump(all_users, file)
print('管理员账户{}添加成功'.format(user_name))
def del_admin(self): # 删除管理员账户
user_name = input('请输入要删除的管理员账户名:')
for info in all_users:
if info.user_name == user_name and info.permission == 1:
all_users.remove(info)
with open('all_users.txt', 'rb+') as file:
pickle.dump(all_users, file)
print('管理员账户{}删除成功'.format(user_name))
break
else:
print('管理员账户{}不存在'.format(user_name))
def view_admin(self): # 查看所有管理员
for info in all_users:
if info.permission == 1:
print(info)
def super_admin(admin): # 超管程序
while True:
print('''
超级管理员账户admin登录成功!
╔═══════════════欢迎进入超管程序══════════════════╗
╠═══════════════1.修改超管密码════════════════════╣
╠═══════════════2.创建管理员账户══════════════════╣
╠═══════════════3.删除管理员账户══════════════════╣
╠═══════════════4.查看所有管理员══════════════════╣
╚═══════════════5.退出超管程序════════════════════╝
''')
num = input('请输入操作指令:')
if num == '1': # 修改超管密码
admin.change_own_pd()
elif num == '2': # 创建管理员账户
admin.create_admin()
elif num == '3': # 删除管理员账户
admin.del_admin()
elif num == '4': # 查看本系统所有管理员
admin.view_admin()
elif num == '5': # 退出回到主程序
break
else:
print('你输入的指令有误,请重新输入!')
class Admin(ShopManager): # 普通管理员类,获得店员的方法
def init(self, user_name:str, pass_wd:str):
if user_name == 'admin':
print('不可使用超管账户名!')
else:
self.user_name = user_name
self.pass_wd = pass_wd
self.permission = 1
self.authorization = 15 # 管理员对所有商品拥有满的权限
self.belong = user_name # 管理员自己属于自己
def str(self):
return一个包含以下信息的字符串:"系统用户{}的账号信息如下:用户名为'{}'、密码为'{}';其权限等级为'{}';授权编码为'{}'"。然后调用self.format方法传递相关参数
def change_own_pd(self): # 改变管理员自己的密码
all_users.remove(self)
new_pd = input('请输入管理员的新密码:')
self.pass_wd = new_pd
all_users.append(self)
with open('all_users.txt', 'rb+') as file:
pickle.dump(all_users, file)
print('管理员{}账户密码修改成功,请牢记新密码!'.format(self.user_name))
def crete_shopmanager(self): # 创建店员账户
user_name = input('请输入你要创建的店员账户名:')
for info in all_users:
if user_name == info.user_name:
print('{}账户已存在!'.format(user_name))
break
else:
pass_wd = input('请设置密码:')
permission = 2
authorization = int(input('请输入商品权限组合数字(0~15,0001查看,0010删除,0100修改,1000增加):'))
belong = self.user_name
在用户数据表中获取详细信息字段,并将其赋值给user_info变量: shop_user_info = ShopManager(username, password, perm, authorization, membership)
all_users.append(user_info)
with open('all_users.txt', 'rb+') as file:
pickle.dump(all_users, file)
print('店员账户{}添加成功!'.format(user_name))
def del_shopmanager(self): # 删除店员账户
user_name = input('请输入要删除的店员账户名:')
for info in all_users:
if user_name == info.user_name:
if info.belong == self.user_name:
all_users.remove(info)
with open('all_users.txt', 'rb+') as file:
pickle.dump(all_users, file)
print('店员账户{}删除成功'.format(user_name))
break
else:
print('你输入的帐号不属于本超市!')
else:
print('店员账户{}不存在'.format(user_name))
def view_shopmanager(self): # 查看所有店员账户
for info in all_users:
if info.belong == self.user_name: # 是自己店铺的员工才显示
print(info)
def accredit_shopmanager(self): # 给店员重新授权
user_name = input('请输入要重新授权的店员账户:')
for info in all_users:
if info.user_name == user_name and info.permission == 2:
a = input('请输入商品权限数字(0~15,0001查看,0010删除,0100修改,1000增加):')
info.authorization = int(a)
with open('all_users.txt', 'rb+') as file:
pickle.dump(all_users, file)
print('店员{}重新授权成功!'.format(info.user_name))
break
else:
print('店员账户{}不存在'.format(user_name))
def admin(admin): # 普管程序
while True:
print(
'''
管理员账户{}登录成功!
╔═══════════════欢迎进入管理员程序══════════════════╗
╠═══════════════1.修改管理员密码═══════════════════╣
╠═══════════════2.创建店员账户═════════════════════╣
╠═══════════════3.删除店员账户═════════════════════╣
╠═══════════════4.查看所有店员账户═════════════════╣
╠═══════════════5.给店员重新授权═══════════════════╣
╠═══════════════6.进入店员商品管理程序══════════════╣
╚═══════════════7.退出管理员程序═══════════════════╝
'''.format(admin.dict['user_name']))
num = input('请输入操作指令:')
if num == '1': # 改变管理员自己的密码
admin.change_own_pd()
elif num == '2': # 创建店员账户
admin.crete_shopmanager()
elif num == '3': # 删除店员账户
admin.del_shopmanager()
elif num == '4': # 查看本超市的所有店员账户
admin.view_shopmanager()
elif num == '5': # 给店员重新授权
admin.accredit_shopmanager()
elif num == '6': # 进入到本超市专属的商品管理程序
admin_shop(admin)
elif num == '7': # 退出回到主程序
break
else:
print('你输入的指令有误,请重新输入!')
def login():# 输入不同的账号会引导至相应的后台系统(包括超级管理员后台系统、普通管理员后台系统和店员后台系统)
print("═══════════════现已进入登录程序═══════════════")
user_name = input('请输入帐号:')
pass_wd = input('请输入密码:')
not_in = True
for info in all_users: # 遍历内存中存储所有账号的列表
if info.user_name == user_name and info.pass_wd == pass_wd:
if info.permission == 0: # 判断为超管账户,进入超管程序
super_admin(info) # 超管对象作为参数传进去
not_in = False
elif info.permission == 1: # 判断为管理员账户,进入管理员自己的后台程序
admin(info) # 管理员对象作为参数传进去
not_in = False
elif info.permission == 2: # 识别为店员权限,并调用该店员所属的超市商品管理系统
shopmanager(info) # 店员对象作为参数传进去
not_in = False
if not_in:
print('系统中无此帐号或密码错误,请重新输入!')
def main():
while True:
print("═══════════════现已进入主程序═══════════════")
login()
is_exit=input('你当前处于主程序,本次是否完全退出(y/n):')
if is_exit.upper()=='Y':
exit()
if name == 'main':
try: # 尝试从文件载入所有账户信息到列表
with open('all_users.txt', 'rb+') as file:
all_users = pickle.load(file) # 所有用户信息读取到临时列表
except Exception as x: # 如果文件为空会报错,处理异常程序
admin0 = Super_admin('admin', 'admin') # 创建超管账户
all_users.append(admin0) # 列表添加这个超管对象
with open('all_users.txt', 'wb+') as file:
pickle.dump(all_users, file) # 临时列表每次改动,都要重新写入文件
main()
