• python面向过程编程小程序- 模拟超市收银系统


    6.16自我总结

    功能介绍

    程序功能介绍:
        商品信息再读取修改买卖均已xlsx格式
        且生成购物记录也按/用户名/购买时间.xlsx格式生成
        账号密码输入错误三次按照时间进行冻结
        用户信息已json格式保存
     程序写的过程
    先生成功能模块和运行模块
    再写功能模块中用到的固定的文件目录全放在setting.py文件中
    与商品交互全放在shop.py中
    与用户交互全放在user.py中
    一些返回界面延迟动画全放在辅助模块中
    

    1.程序设计目录


    思路

    • 生成xlsx文档就要导入pands模块
    • 用户信息用josn保存导入json模块
    • 把路径什么通用不变的丢入setting中
    • 把所有文件存取丢入接口层中api中
    • 其他增减根据功能来
    • 一些通用的方法可以全部放入common中

    2.run.py

    from core.src import run
    if __name__ == '__main__':
        run()
    

    3.src.py

    from conf.setting import *
    from lib.common import *
    from api.user import *
    from api.shop import *
    import re
    
    import numpy as np
    
    goods_count = [1]
    #注册
    def register():
        print('33[47;;m		欢迎使用注册功能		33[0m')
        count = 0
        while count == 0:
            register_name = input('请输入名字按Q退出程序
    '
                                  '33[31;;m账号由汉字,字母,数字,下划线组成33[0m'
                                  '
    请输入:')
            if register_name == 'Q':
                go_to_run()
                return False
            if decide_user_name(register_name):
                print('33[31;;m账号存在33[0m')
                continue
            register_name_1 = re.findall('w+',register_name)
            if len(register_name) == 0:
                print('33[31;;m请好好输入33[0m')
                continue
            elif register_name_1[0] != register_name:
                print('33[31;;m账号由汉字,字母,数字,下划线组成33[0m')
                continue
            else:
                count =1
                while True:
                    register_pwd = input('请输入密码按Q退出程序
    '
                                         '33[31;;m密码由汉字,字母,数字,下划线组成33[0m
    '
                                         '请输入')
                    if register_pwd == 'Q':
                        go_to_run()
                        return False
                    register_pwd_1 = re.findall('w+', register_pwd)
                    if len(register_pwd) == 0:
                        print('33[31;;m请好好输入33[0m')
                        continue
                    elif register_pwd_1[0] != register_pwd:
                        print('33[31;;m密码由汉字,字母,数字,下划线组成33[0m')
                        continue
                    else:
                        save_info(register_name, register_pwd)
                        print('33[32;;m注册成功33[0m')
                        go_to_run()
                        return True
    
    #登入
    def login():
        print('33[47;;m		欢迎使用登入功能		33[0m')
        if not LOGIN_NAME[0]:
            pwd_count =0
            login_count = 0
            while login_count==0:
                login_name = input('请输入名字按Q退出程序
    请输入:')
                if login_name == 'Q':
                    go_to_run()
                    return False
                if not decide_user_name(login_name):
                    print('33[31;;m账号不存在33[0m')
                    continue
                if not load_freeze_user(login_name):
                    go_to_run()
                    return False
                else:
                    login_count = 1
                    while pwd_count<3:
                        login_pwd = input('33[41;;m请输入密码输错三次会被冻结五分钟33[0m
    请输入:')
                        if not load_info(login_name,login_pwd):
                            pwd_count +=1
                            print(f'33[31;;m还有{3-pwd_count}次机会33[0m')
                            continue
                        else:
                            print('33[32;;m登入成功33[0m')
                            LOGIN_NAME[0] = login_name
                            go_to_run()
                            return True
                    if pwd_count == 3:
                        freeze_user(login_name)
                        print(f'33[31;;m账号{login_name}由于密码输入太多次暂时被冻结33[0m')
                        go_to_run()
                        return False
        else:
            print(f'33[32;;m账号{LOGIN_NAME[0]}以及登入')
            login_chiose = input('输入0为退出当前程序
    '
                                 '输入1为退出当前账号重新登入
    '
                                 '输入2为退出当前账号并退出程序
    '
                                 '请选择:')
            if login_chiose not in ['0','1','2']:
                print('33[31;;m请好好输入33[0m')
            elif login_chiose == '0':
                go_to_run()
                return False
            elif login_chiose == '1':
                df = load_goods_pach()
                dump_goods(df)
                LOGIN_NAME[0] = None
                login()
            elif login_chiose == '2':
                df = load_goods_pach()
                dump_goods(df)
                LOGIN_NAME[0] = None
                print('33[41;;m账号以退出33[0m')
                go_to_run()
                return False
    
    #充值
    @login_deco
    def top_up():
        print('33[47;;m		欢迎使用充值功能		33[0m')
        while True:
            chiose = input('请输入充值金额
    输入Q退出功能
    请输入')
            if chiose  == 'Q':
                go_to_run()
                return False
            elif not chiose.isdigit():
                print('33[31;;m请输入阿拉伯数字33[0m')
                continue
            else:
                info = load_login_info(LOGIN_NAME[0])
                info["balance"] += int(chiose)
                dump_login_info(LOGIN_NAME[0],info)
                print(f'33[42;;m账号{LOGIN_NAME[0]}充值成功
    当前余额{info["balance"]}元33[0m')
                go_to_run()
                return True
    
    #余额查询
    @login_deco
    def balance():
        print('33[47;;m		欢迎使用余额查询功能		33[0m')
        info = load_login_info(LOGIN_NAME[0])
        print(f'33[42;;m账号{LOGIN_NAME[0]}
    当前余额{info["balance"]}33[0m')
        go_to_run()
        return True
    
    #提现
    @login_deco
    def withdraw():
        print('33[47;;m		欢迎使用提现功能		33[0m')
        while True:
            chiose = input('33[32;;m请输入提现金额
    输入Q退出功能
    请输入')
            if chiose  == 'Q':
                go_to_run()
                return False
            elif not chiose.isdigit():
                print('33[31;;m请输入阿拉伯数字33[0m')
                continue
            else:
                info = load_login_info(LOGIN_NAME[0])
                if info["balance"] < int(chiose):
                    print('33[31;;m余额不足33[0m')
                    continue
                info["balance"] -= int(chiose)
                dump_login_info(LOGIN_NAME[0],info)
                print(f'33[41;;m账号{LOGIN_NAME[0]}提现成功
    当前余额{info["balance"]}元33[0m')
                go_to_run()
                return True
    
    #转账
    @login_deco
    def transfer():
        print('33[47;;m		欢迎使用转账功能		33[0m')
        count = 0
        while count ==0:
            chiose = input('33[32;;m请输入转账金额
    输入Q退出功能
    请输入')
            if chiose  == 'Q':
                go_to_run()
                return False
            elif not chiose.isdigit():
                print('33[31;;m[请输入阿拉伯数字33[0m')
                continue
            else:
                info = load_login_info(LOGIN_NAME[0])
                if info["balance"] < int(chiose):
                    print('33[31;;m余额不足33[0m')
                    continue
                info["balance"] -= int(chiose)
    
                while True:
                    count =1
                    transfer_name = input('33[32;;m转账的名字
    输入Q退出')
                    if transfer_name == 'Q':
                        go_to_run()
                        return False
                    if not decide_user_name(transfer_name):
                        print('33[31;;m转账账号不存在33[0m')
                        continue
                    if LOGIN_NAME[0] == transfer_name:
                        print('33[31;;m不能转给自己33[0m')
                        continue
                    transfer_name_info = load_login_info(transfer_name)
                    transfer_name_info["balance"] += int(chiose)
                    dump_login_info(transfer_name, transfer_name_info)
                    dump_login_info(LOGIN_NAME[0], info)
                    print(f'33[42;;m账号{LOGIN_NAME[0]}转账成功
    当前余额{info["balance"]}元33[0m')
                    go_to_run()
                    return True
    
    #流水
    @login_deco
    def user_history():
        print('33[47;;m		欢迎使用流水功能		33[0m')
        if not history(LOGIN_NAME[0]):
            print('33[31;;m没有购买记录33[0m')
            go_to_run()
            return False
        while True:
            date_lis = show_history(LOGIN_NAME[0])
            chiose = input('33[32;;m请输入你要查看的日期
    '
                           '输入Q退出')
            if chiose not in date_lis:
                print('33[31;;m没有日期33[0m')
                continue
            print(f'{chiose}')
            print(load_goods_history(LOGIN_NAME[0],chiose))
            history_count = 0
            while history_count == 0:
                next_chiose = input('33[32;;m请输入Y继续查看的日期
    '
                                    '输入Q退出
    '
                                    '请输入')
                if next_chiose not in ('Y','Q'):
                    print('33[31;;m请好好输入33[0m')
                elif next_chiose == 'Y':
                    history_count =1
                elif next_chiose =='Q':
                    go_to_run()
                    return False
    #购物
    @login_deco
    def shopping():
        count = 0
        chiose_count =0
        print('33[47;;m		欢迎使用购物功能		33[0m')
        global goods_count
        while count == 0:
            if not goods_count[0]:
                df = load_goods()
                print('			商品目录')
                print(f'33[35;36;m{df}33[0m')
            else:
                df = load_goods_pach()
                print('			商品目录')
                print(f'33[35;36;m{df}33[0m')
    
            goods = input('33[32;;m请选择你的商品
    '
                          '输入Q退出
    '
                          '请选择')
            goods_list = df.columns
            if goods == 'Q':
                go_to_run()
                return False
            elif goods not in goods_list:
                print('33[31;;m无此商品33[0m')
                continue
            else:
                chiose_count =0
                while chiose_count == 0:
                    num = input('33[32;;m请选择你的商品数量
    '
                                  '输入Q退出
    '
                                '请选择')
                    goods_num = df[goods]['数量']
                    if goods == 'Q':
                        go_to_run()
                        return False
                    elif not num.isdigit():
                        print('33[31;;m请输入数字33[0m')
                        continue
                    elif int(goods_num)<int(num):
                        print('33[31;;m库存不足33[0m')
                    else:
                        df[goods]['数量'] -= int(num)
                        goods_num = int(num)
                        dump_goods_pach(df)
                        print(f'33[42;;m你把{goods}{num}个加入购物车33[0m')
                        while chiose_count == 0:
                            chiose =input('33[32;;m是否继续购物
    '
                                          'Y是继续,N是退出
    '
                                          '请选择')
                            if chiose not in ['Y','N']:
                                print('33[31;;m请好好输入33[0m')
                                continue
                            if chiose == 'N':
    
                                goods_count[0] = 1
                                go_to_run()
                                return True
                            if chiose == 'Y':
                                chiose_count = 1
                                goods_count[0] = 1
                                pass
    
    
    
    
    #购物车
    @login_deco
    def shopping_car():
        print('33[47;;m		欢迎使用购物车功能		33[0m')
        global goods_count
        if not goods_count[0]:
            print('33[31;;m购物车无商品33[0m')
        else:
            df_1 = load_goods()
            df_2 = load_goods_pach()
            df = df_1 - df_2
            print('-'*50)
            print('			购物车目录')
            print(f'33[35;36;m{df}33[0m')
            df_mun = df.values[1,:]
            df_pice = df_1.values[0,:]
            df_add = df_mun*df_pice
            money = sum(df_add)
            print(f'合计{money}元')
            print('-' * 50)
            while True:
                chiose = input('33[32;;m输入Q退出程序
    '
                               '输入0清空购物车并退出程序
    '
                               '输入1结算
    '
                               '请选择')
                if chiose not in ['Q','0','1']:
                    print('33[31;;m请好好输入33[0m')
                    continue
                elif chiose == 'Q':
                    go_to_run()
                    return False
                elif chiose == '0':
                    goods_count[0] = None
                    df_new = load_goods()
                    dump_goods_pach(df_new)
                    go_to_run()
                    return False
                elif chiose == '1':
                    info = load_login_info(LOGIN_NAME[0])
                    if int(money) > info['balance']:
                        print('33[31;;m余额不足33[0m')
                        continue
                    else:
                        print('33[41;;m支付成功33[0m')
                        info['balance'] -= int(money)
                        dump_login_info(LOGIN_NAME[0],info)
                        df_new = load_goods_pach()
                        dump_goods(df_new)
                        df_mun = df[1:2]
                        df_pice = df_1[0:1]
                        df = df.columns
                        new_df = df_pice.append(df_mun)
                        print(new_df)
                        time =time_strftime()
                        dump_goods_history(LOGIN_NAME[0],time,new_df)
                        go_to_run()
                        return True
    
    
    
    
    
    
    
    
    
    
    
    #运行模块
    def run():
        action_dict={
            '0':register,
            '1':login,
            '2':top_up,
            '3':balance,
            '4':withdraw,
            '5':transfer,
            '6':user_history,
            '7':shopping,
            '8':shopping_car,
        }
    
        while True:
            if LOGIN_NAME[0]:
                print(f'你好{LOGIN_NAME[0]}')
            for action_num,action in ACTION_INFO.items():
                print(f'33[35;;m		输入{action_num}功能为{action}33[0m')
            action_chiose = input('33[32;;m请输入你要选择的功能:')
            if action_chiose == 'Q':
                print('退出程序')
                return
            if action_chiose not in action_dict:
                print('33[31;;m输入错误33[0m')
                continue
            action_dict[action_chiose]()
    
    if __name__ == '__main__':
        run()
    

    3.common.py

    from conf.setting import *
    import time
    
    def login_deco(func):
        def wrapper(*args,**kwargs):
            if not LOGIN_NAME[0]:
                print('请先登入')
                go_to_run()
                return False
            func()
            return True
        return wrapper
    
    def go_to_run():
        for a in range(20):
            time.sleep(0.1)
            txt = '		返回主界面中'
            txt += '.'*int(a%4)
            print('
    ',f'33[32;;m{txt}33[0m',end='')
        print('')
    
    def time_now():
        return time.time()
    
    def time_strftime():
        return str(time.strftime('%Y-%m-%d-%H-%M-%S'))
    

    4.setting.py

    import os
    import time
    ACTION_INFO={
            '0':'注册',
            '1':'登入',
            '2':'充值',
            '3':'余额查询',
            '4':'提现',
            '5':'转账',
            '6':'购物历史记录',
            '7':'购物',
            '8':'购物车',
            'Q' :'退出'
        }
    
    LOGIN_NAME = [None]
    
    
    ATM_PATH = os.path.dirname(os.path.dirname(__file__))
    USER_PATH = os.path.join(ATM_PATH,'db')
    GOODS_PATH = os.path.join(ATM_PATH,'db','goods_info.xlsx')
    GOODS_PATCH = os.path.join(ATM_PATH,'db','goods_info_patch.xlsx')
    

    5.shop.py

    (商品信息存储文件与功能模块的交互)

    import pandas as pd
    from conf.setting import GOODS_PATH,GOODS_PATCH
    import os
    
    def dump_goods(df):
        df.to_excel(GOODS_PATH)
    
    def dump_goods_pach(df):
        df.to_excel(GOODS_PATCH)
    
    def load_goods():
        df = pd.read_excel(GOODS_PATH,index_col=0,header=0)
        return df
    def load_goods_pach():
        df = pd.read_excel(GOODS_PATCH,index_col=0,header=0)
        return df
    
    def dump_goods_history(name,time,df):
        path_1 = os.path.join(r'E:ATMdb', name)
        path = os.path.join(r'E:ATMdb',name,f'{time}.xlsx')
        if not os.path.exists(path_1):
            os.mkdir(path_1)
        df.to_excel(path)
    
    def load_goods_history(name,time):
        path = os.path.join(r'E:ATMdb', name, f'{time}.xlsx')
        df = pd.read_excel(path,index_col=0,header=0)
        return df
    
    def show_history(name):
        new_list =[]
        path_1 = os.path.join(r'E:ATMdb', name)
        lis = os.listdir(path_1)
        print('33[46;;m提示:年-月-日-时-分-秒33[0m')
        for info in lis:
            info = info[0:-5]
            print(info)
            new_list.append(info)
        return new_list
    
    def history(name):
        path_1 = os.path.join(r'E:ATMdb', name)
        if os.path.exists(path_1):
            return True
        return False
    if __name__ == '__main__':
        df = load_goods_pach()
        print(df)
    

    6.user.py

    (用户信息存储文件与功能模块的交互)

    from conf.setting import *
    import json
    import hashlib
    from lib.common import time_now
    
    def save_info(user_name,pwd):
        m = hashlib.md5()
        m.update(pwd.encode('utf8'))
        pwd =m.hexdigest()
        user_path = os.path.join(USER_PATH, f'{user_name}.json')
        with open(user_path,'w',encoding='utf8') as fw:
            info_dict = {'name':user_name,'pwd':pwd,'freeze':time_now(),'balance':0,'freeze_count':0}
            json.dump(info_dict,fw)
    
    def load_info(user_name,pwd):
        user_path = os.path.join(USER_PATH, f'{user_name}.json')
        if not LOGIN_NAME[0]:
            if not os.path.exists(user_path):
                print('33[31;;m用户不存在33[0m')
                return False
            m = hashlib.md5()
            m.update(pwd.encode('utf8'))
            pwd =m.hexdigest()
            with open(user_path, 'r', encoding='utf8') as fr:
                info_dict = json.load(fr)
            if info_dict.get('pwd') != pwd:
                print('33[31;;m密码错误33[0m')
                return False
        with open(user_path, 'r', encoding='utf8') as fr:
            info_dict = json.load(fr)
        info_dict['freeze_count'] = 0
        with open(user_path, 'w', encoding='utf8') as fw:
            json.dump(info_dict,fw)
        return info_dict
    
    def decide_user_name(user_name):
        user_path = os.path.join(USER_PATH, f'{user_name}.json')
        if  os.path.exists(user_path):
            return True
        return False
    
    def freeze_user(user_name):
        user_path = os.path.join(USER_PATH, f'{user_name}.json')
        with open(user_path, 'r', encoding='utf8') as fr:
            info_dict = json.load(fr)
        info_dict['freeze_count'] += 1
        info_dict['freeze'] = time_now() + 300*info_dict['freeze_count']
        with open(user_path,'w',encoding='utf8') as fw:
            json.dump(info_dict,fw)
    
    def load_freeze_user(user_name):
        user_path = os.path.join(USER_PATH, f'{user_name}.json')
        with open(user_path, 'r', encoding='utf8') as fr:
            dict = json.load(fr)
        if time_now() >= dict['freeze'] :
            print('33[32;;m账号登入成功33[0m')
            return True
        else:
            min = int(divmod(-time_now() + dict['freeze'], 60)[0])
            s = int(divmod(-time_now() + dict['freeze'], 60)[1])
            print(f'33[31;;m账号{user_name}已被冻结,还需要{min}分{s}秒33[0m')
            return False
    
    def load_login_info(name):
        login_user_path = os.path.join(USER_PATH, f'{name}.json')
        with open(login_user_path, 'r', encoding='utf8') as fr:
            info_dict = json.load(fr)
        return info_dict
    
    def dump_login_info(name,dict):
        login_user_path = os.path.join(USER_PATH, f'{name}.json')
        with open(login_user_path, 'w', encoding='utf8') as fw:
            json.dump(dict,fw)
            return True
    
    if __name__ == '__main__':
        save_info('杨文益','12312')
        dict = load_info('杨文益','12312')
        print(dict['name'])
    

    7.goods_info.xlsx/goods_info_patch.xlsx

    苹果 香蕉 西瓜 荔枝
    价格 2 3 10 5 5
    数量 200 215 34 32 523
  • 相关阅读:
    http://wpftoolkit.codeplex.com/t的使用方法
    WPF自定义控件Textbox 带水印 以及错误信息显示_02
    WPF自定义控件Textbox 带水印 以及错误信息显示
    WPF嵌入WORD文档
    WPF ObservableCollection 使用方法
    react 开发 next.js rn
    获取百度地图sdk
    使用rn如何在安卓App开发中去增删改查对数据进行本地操作和保存,利用插件【react-native-file-selector】UI体现上传文件,和react-native-fs,可以对本地文件进行操作
    python常见命令
    py 文件设置编码
  • 原文地址:https://www.cnblogs.com/pythonywy/p/11031541.html
Copyright © 2020-2023  润新知