基于Python的超市账户&商品管理系统

--------------------------------声明:完全原创,转载请注明出处!------------------

超市账户&商品管理系统

主要功能:

  1. 用户管理系统

    用户分为超级管理员管理员用户三种:

    (1)超级管理员(相当于系统的最大BOSS,如果某个超市买了这个管理系统,超级管理员就可以专门为这个买家创建一个管理员账号):

    ​ a. 账号只有一个并且是固定的

    ​ b. 用户名:admin 默认密码:admin

    ​ c. 用户名不可以更改,密码登录后可改

    ​ d. 超级管理员创建、删除和查看管理员信息

    (2)管理员(相当于某家超市的老板,可以给超市的相关工作人员创建账号)

    ​ a. 可以修改自己的密码

    ​ b. 创建、删除和查看用户信息

    ​ c. 对用户进行授权(权限主要包括:商品的查看权限、删除权限、修改权限、增加权限)

    ​ d. 对该超市的所有的商品拥有所有的权限

    ( 3 ) 用户(相当于某家超市的所有员工,不同员工会被分配不同的权限,但都有售卖权限)

  2. 商品管理系统

    (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, pass_wd:str,permission:int,authorization:int, belong:str):  # belong 属于哪个管理员
        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): # 重写方法,方便打印
        return '店员账户:{},密码:{},等级:{},权限数字:{}'.format(self.user_name, self.pass_wd, self.permission,self.authorization)

    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)
                print('{}商品成功售出{}件,交易金额{}元.'.format(info.name, amount,amount*info.price))
                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 '管理员账户名:{},密码:{},等级:{},权限数字:{}'.format(self.user_name, self.pass_wd, self.permission, self.authorization)

    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 = ShopManager(user_name, pass_wd, permission, authorization, belong)
            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()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容