ATM+购物车

ATM+购物车

软件开发目录规范

            目录规范并无固定的要求 只要符合清晰可读即可

            bin文件夹
                存放一系列启动文件(当启动文件很少或者只有一个的时候也可以直接写在外面)
                    start.py
            conf文件夹
                存放一系列配置文件
                    settings.py(一般情况下该文件内的变量名都是大写)
            lib文件夹
                存放公共的功能
                    common.py
            db文件夹
                存放数据相关文件
                    userinfo.txt
            log文件夹
                存放日志记录文件
                    log.txt
            core文件夹
                存放项目核心代码文件
                    src.py
            readme文件
                存放说明相关信息(类似于说明书 广告 章程)
            requirements.txt
                存放项目所需的第三方模块及版本号

bin文件夹下的start.py文件:

            import os
            import sys

            BASE_DIR = os.path.dirname(os.path.dirname(__file__))
            sys.path.append(BASE_DIR)

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

conf文件夹下的settings.py文件:

            import os

            BASE_DIR = os.path.dirname(os.path.dirname(__file__))




            standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                              '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字

            simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

            LOG_DIR = os.path.join(BASE_DIR, 'log')

            if not os.path.isdir(LOG_DIR):
                os.mkdir(LOG_DIR)

            logfile_path = os.path.join(LOG_DIR, 'log.log')


            # log配置字典
            LOGGING_DIC = {
                'version': 1,
                'disable_existing_loggers': False,
                'formatters': {
                    'standard': {
                        'format': standard_format
                    },
                    'simple': {
                        'format': simple_format
                    },
                },
                'filters': {},  # 过滤日志
                'handlers': {
                    #打印到终端的日志
                    'console': {
                        'level': 'DEBUG',
                        'class': 'logging.StreamHandler',  # 打印到屏幕
                        'formatter': 'simple'
                    },
                    # 打印到文件的日志,收集info及以上的日志
                    'default': {
                        'level': 'DEBUG',
                        'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
                        'formatter': 'standard',
                        'filename': logfile_path,  # 日志文件
                        'maxBytes': 1024*1024*5,  # 日志大小 5M
                        'backupCount': 5,
                        'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
                    },
                },
                'loggers': {
                    #logging.getLogger(__name__)拿到的logger配置  空字符串作为键 能够兼容所有的日志
                    '': {
                        'handlers': ['default'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                        'level': 'DEBUG',
                        'propagate': True,  # 向上(更高level的logger)传递
                    },  # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
                },
            }

core文件夹下的src.py文件:

            import os
            import json
            from conf import settings
            from lib import common
            import time
            import hashlib



            current_time = time.strftime('%Y-%m-%d %X')
            user_data = {
                'username': '',
                'is_login': False
            }

            # 注册功能
            def register():
                if user_data['is_login']:
                    print('您已注册...')
                    return
                while True:
                    print('欢迎来到注册功能'.center(46, '*'))
                    username = input('请输入您的用户名(按q退出)>>>:').strip()
                    if username == 'q':
                        break
                    path = settings.BASE_DIR
                    path_file = os.path.join(path, 'db', '%s.json' %username)
                    if os.path.exists(path_file):
                        print('用户名已存在,请再次输入')
                    else:
                        res = input('请输入您的密码>>>:').strip()
                        md5 = hashlib.md5()
                        md5.update(res.encode('utf8'))
                        password = md5.hexdigest()
                        # print(password)
                        user_dict = {'username': username,
                                     'pwd': password,
                                     'account': 10000,
                                     'locked': False,
                                     'flow': [],
                                     'shopping_cart': {}
                                     }
                        with open(path_file, 'w', encoding='utf8') as f:
                            json.dump(user_dict, f, ensure_ascii=False)
                            time.sleep(1)
                        from lib import common
                        logger1 = common.get_logger('用户注册')
                        logger1.debug('%s注册成功' % username)
                        print('恭喜您注册成功')
                        break



            # 登录功能
            def login():
                count = 3
                if user_data['is_login']:
                    print('您已登录...')
                    return
                print('欢迎来到登录功能'.center(46, '*'))
                while True:
                    username = input('请输入用户名(按q退出)>>>:').strip()
                    if username == 'q':
                        return
                    path = settings.BASE_DIR
                    path_file = os.path.join(path, 'db', '%s.json' % username)
                    if not os.path.exists(path_file):
                        print('用户不存在')

                    else:

                        res = input('请输入您的密码>>>:').strip()
                        md5 = hashlib.md5()
                        md5.update(res.encode('utf8'))
                        # password = md5.hexdigest()
                        print(password)
                        with open(path_file, 'r', encoding='utf8') as f:
                            data = json.load(f)
                            if data['locked'] is True:
                                print('您的账号已被锁定')
                                return
                            elif password == data.get('pwd'):
                                time.sleep(1)

                                print('登录成功')
                                logger1 = common.get_logger('用户登录')
                                logger1.debug('%s登录成功' % username)
                                user_data['username'] = username
                                user_data['is_login'] = True
                                return
                            else:
                                count -= 1
                                print('用户名或密码错误,还有%s次机会, 次数用完将锁定账号,无法登录' % count)
                                if count == 0:
                                    data['locked'] = True
                                    with open(path_file, 'w', encoding='utf8') as f1:
                                        json.dump(data, f1, ensure_ascii=False)
                                        logger1 = common.get_logger('用户登录锁定')
                                        logger1.debug('%s登录锁定' % username)
                                        print('账号已锁定')
                                        return



            # 转账功能
            @common.login_auth
            def transfer():
                print('欢迎来到转账功能'.center(46, '*'))
                while True:
                    to_user = input('您要转入的账户>>>:').strip()
                    if not to_user:
                        print('输入为空')
                        continue
                    path = settings.BASE_DIR
                    to_path_file = os.path.join(path, 'db', '%s.json' % to_user)
                    if not os.path.exists(to_path_file):
                        print('账户不存在')
                        continue
                    transfer_money = input('请输入您要转账的金额>>>:').strip()
                    if not transfer_money:
                        print('输入为空')
                        continue
                    if not transfer_money.isdigit():
                        print('输入不合法')
                        continue
                    transfer_money = int(transfer_money)
                    if transfer_money <= 0:
                        print('输入不合法')
                        continue
                    from_path_file = os.path.join(path, 'db', '%s.json' % user_data['username'])
                    with open(from_path_file, 'r', encoding='utf8') as f:
                        from_user_dict = json.load(f)

                    if from_user_dict['account'] >= transfer_money:
                        with open(to_path_file, 'r', encoding='utf8') as f1:
                            to_user_dict = json.load(f1)
                            to_user_dict['account'] += transfer_money
                            to_user_dict['flow'].append('在%s收到%s转账的%s元' % (current_time, from_user_dict['username'], transfer_money))
                        with open(to_path_file, 'w', encoding='utf8') as f2:
                            json.dump(to_user_dict, f2, ensure_ascii=False)
                            logger1 = common.get_logger('收到转账')
                            logger1.debug('%s收到%s转账的%s元' %(to_user, from_user_dict['username'], transfer_money))

                        from_user_dict['account'] -= transfer_money
                        from_user_dict['flow'].append('在%s向%s转账了%s元' % (current_time, to_user_dict['username'], transfer_money))
                        with open(from_path_file, 'w', encoding='utf8') as f3:
                            json.dump(from_user_dict, f3, ensure_ascii=False)

                            logger1 = common.get_logger('向用户转账')
                            logger1.debug('%s向%s转账了%s元' % (from_user_dict['username'], to_user, transfer_money))
                        print('转账成功')
                        break
                    else:
                        print('您的金库不足')



            # 提现功能
            @common.login_auth
            def withdraw():
                print('欢迎来到提现功能'.center(46, '*'))
                while True:
                    money = input('请输入提现金额>>>:').strip()
                    if not money:
                        print('输入为空')
                        continue
                    if not money.isdigit():
                        print('输入不合法')
                        continue
                    money = int(money)
                    if money <= 0:
                        print('输入不合法')
                    path = settings.BASE_DIR
                    path_file = os.path.join(path, 'db', '%s.json' %user_data['username'])
                    with open(path_file, 'r', encoding='utf8') as f:
                        data = json.load(f)
                    if data['account'] >= money * 1.05:
                        data['account'] -= money * 1.05
                        data['flow'].append('%s在%s提现了%s元' % (user_data['username'], current_time, money))
                        with open(path_file, 'w', encoding='utf8') as f1:
                            json.dump(data, f1, ensure_ascii=False)
                            logger1 = common.get_logger('提现成功')
                            logger1.debug('%s提现成功%s元' % (user_data['username'], money))

                            time.sleep(2)
                        print('提现成功')
                        break
                    else:
                        print('余额不足,努力吧骚年!')

            # 充值功能
            @common.login_auth
            def pay():
                print('欢迎来到充值功能'.center(46, '*'))
                while True:
                    momey = input('请输入充值金额>>>:').strip()
                    if not momey:
                        print('输入为空')
                        continue
                    elif not momey.isdigit():
                        print('输入金额不合法')
                        continue
                    momey = int(momey)
                    if momey <= 0:
                        print('输入金额不合法')
                        continue
                    path = settings.BASE_DIR
                    path_file = os.path.join(path, 'db', '%s.json' % user_data['username'])
                    with open(path_file, 'r', encoding='utf8') as f:
                        data = json.load(f)
                    data['account'] += momey
                    data['flow'].append('%s在%s充值了%s元' % (user_data['username'], current_time, momey))
                    with open(path_file, 'w', encoding='utf8') as f1:
                        json.dump(data, f1, ensure_ascii=False)
                        logger1 = common.get_logger('用户充值')
                        logger1.debug('%s充值成功%s元' % (user_data['username'], momey))

                    print('充值成功')
                    break


            # 查看余额
            @common.login_auth
            def check_balance():
                print('查看余额'.center(46, '*'))
                path = settings.BASE_DIR
                path_file = os.path.join(path, 'db', '%s.json' % user_data['username'])
                with open(path_file, 'r', encoding='utf8') as f:
                    res = json.load(f)
                    print('您的余额为%s' % (res['account']))
                    logger1 = common.get_logger('查看余额')
                    logger1.debug('%s查看余额' % user_data['username'])


            # 查看流水
            @common.login_auth
            def check_flow():
                print('查看流水'.center(46, '*'))
                path = settings.BASE_DIR
                path_file = os.path.join(path, 'db', '%s.json' % user_data['username'])
                with open(path_file, 'r', encoding='utf8') as f:
                    res = json.load(f)
                    print(res['flow'])
                    logger1 = common.get_logger('查看流水')
                    logger1.debug('%s查看流水' % user_data['username'])


            # 加入购物车
            @common.login_auth
            def add_cart():
                print('欢迎来到商品界面'.center(46, '*'))
                shopping_cart = {}
                while True:
                    goods_list = [
                        ['奔驰', 2000],
                        ['宝马', 1000],
                        ['奥迪', 1500],
                        ['兰博基尼', 99999]
                    ]
                    for k, v in enumerate(goods_list):
                        print(k + 1, v[0], v[1])
                    num = input('选择你要加入购物车的商品编号(按q退出)>>>:').strip()
                    if not num:
                        print('输入为空')
                        continue
                    if num.isdigit():
                        num = int(num)
                        if num >= (len(goods_list) + 1) or num == 0:
                            print('商品不存在')
                            continue

                        goods_name = goods_list[num - 1][0]
                        good_price = goods_list[num - 1][1]
                        path = settings.BASE_DIR
                        path_file = os.path.join(path, 'db', '%s.json' % user_data['username'])
                        with open(path_file, 'r', encoding='utf8') as f:
                            user_dict = json.load(f)

                        if goods_name not in shopping_cart:
                            shopping_cart[goods_name] = {'price': good_price, 'count': 1}
                        else:
                            shopping_cart[goods_name]['count'] += 1
                        print('%s加入购物车成功' % goods_name)
                        continue
                    elif num == 'q':
                        if shopping_cart:
                            user_dict['shopping_cart'] = shopping_cart
                            path = settings.BASE_DIR
                            path_file = os.path.join(path, 'db', '%s.json' % user_data['username'])
                            with open(path_file, 'w', encoding='utf8') as f1:
                                json.dump(user_dict, f1, ensure_ascii=False)
                                logger1 = common.get_logger('加入购物车')
                                logger1.debug('%s往购物车加入了%s' % (user_data['username'], shopping_cart))

                            print('退出成功')
                            break
                    else:
                        print('输入内容不合法')



            # 查看购物车
            @common.login_auth
            def check_shopping():
                print('查看购物车'.center(46, '*'))
                path = settings.BASE_DIR
                path_file = os.path.join(path, 'db', '%s.json' % user_data['username'])
                with open(path_file, 'r', encoding='utf8') as f:
                    res = json.load(f)
                    print(res['shopping_cart'])
                    logger1 = common.get_logger('查看购物车')
                    logger1.debug('%s查看了购物车' % (user_data['username']))



            new_dict = {
                '1': register,
                '2': login,
                '3': transfer,
                '4': withdraw,
                '5': pay,
                '6': check_balance,
                '7': check_flow,
                '8': add_cart,
                '9': check_shopping
            }

            def run():
                while True:
                    print('欢迎来到买了么商城'.center(46, '='))
                    print('''
                        1.注册功能>>>
                        2.登录功能>>>
                        3.转账功能>>>
                        4.提现功能>>>
                        5.充值功能>>>
                        6.查看余额>>>
                        7.查看流水>>>
                        8.加入购物车>>>
                        9.查看购物车>>>
                        10.退出系统>>>
                    ''')
                    print('天天开心哦'.center(47, '='))
                    choice = input('请输入您想执行功能的编号>>>:').strip()
                    if choice in new_dict:
                        func_name = new_dict.get(choice)
                        func_name()
                    elif choice == '10':
                        cmd = input('确定要退出吗,按q确认>>>:').strip()
                        if cmd == 'q':
                            time.sleep(2)
                            print('退出成功,欢迎下次光临!!!')
                            break
                    else:
                        print('输入内容不合法')

lib文件夹下的common.py文件:


            from core import src
            import logging.config
            from conf import settings





            def login_auth(func):
                def inner(*args, **kwargs):
                    if src.user_data['is_login']:
                        return func(*args, **kwargs)
                    else:
                        src.login()
                return inner




            # 使用配置字典
            def get_logger(name):
                logging.config.dictConfig(settings.LOGGING_DIC)  # 自动加载字典中的配置
                logger1 = logging.getLogger(name)
                return logger1
posted @ 2021-12-04 10:12  风花雪月*  阅读(28)  评论(0编辑  收藏  举报