• ATM+购物车


    ATM+购物车

    conf 存放配置文件的文件夹

    __ init __.py

    settings.py

    import os
    BASE_PATH = os.path.dirname(os.path.dirname(__file__))
    DB_PATH = os.path.join(BASE_PATH, 'db')
    
    
    '''
    日志配置
    '''
    
    # 定义三种日志输出格式 开始
    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'
    
    id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
    
    # 定义日志输出格式 结束
    logfile_dir = os.path.join(BASE_PATH, 'log')  # log文件的目录
    
    logfile_name = 'atm_shop_log.log'  # log文件名
    
    # 如果不存在定义的日志目录就创建一个
    if not os.path.isdir(logfile_dir):
        os.mkdir(logfile_dir)
    
    # log文件的全路径
    logfile_path = os.path.join(logfile_dir, logfile_name)
    
    # 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', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                'level': 'DEBUG',
                'propagate': True,  # 向上(更高level的logger)传递
            },
        },
    }
    
    
    
    core 存放核心代码的文件夹

    __ init __ .py

    src.py

    from db import db_handler
    from lib import common
    import re
    from interface import user_interface
    from interface import bank_interface
    from interface import shop_interface
    
    user_info = {
        'user': None
    }
    
    
    # 注册功能
    def register():
        while True:
            username = input('请输入用户名:').strip()
            if username == 'q':
                break
            if not re.search(u'^[_a-zA-Z0-9u4e00-u9fa5]+$', username):
                print('用户名中只能包含汉字,字母,数字,下划线!')
                continue
            if db_handler.check_data(username):
                print('该用户已经存在!')
                continue
            password = input('请输入密码:').strip()
            if password == 'q' or password == '':
                break
            re_password = input('请再次输入密码:').strip()
            if re_password == 'q' or re_password == '':
                break
            if password == re_password:
                msg = user_interface.register_interface(username, password)
                print(msg)
                break
            else:
                print('两次密码输入不一致')
    
    
    # 登录功能
    def login():
        while True:
            if user_info['user']:
                print('您已经登录,请先注销!')
                break
            username = input('请输入用户名:').strip()
    
            if username == 'q':
                break
            if db_handler.check_data(username):
                password = input('请输入密码:').strip()
                if password == 'q':
                    break
                flag, msg = user_interface.login_interface(username, common.get_md5(password))
                if flag:
                    print(msg)
                    user_info['user'] = username
                    break
                else:
                    print(msg)
                    continue
            else:
                print('该用户不存在!')
                continue
    
    
    # 查看余额功能
    @common.wrapper
    def check_bal():
        msg = user_interface.check_bal_interface(user_info['user'])
        print(f'当前余额为{msg}!')
    
    
    # 转账功能
    @common.wrapper
    def transfer():
        while True:
            to_user = input('请输入要转账的对象:').strip()
            if to_user == 'q':
                break
            if not db_handler.check_data(to_user):
                print('该用户不存在!')
                continue
            if to_user == user_info['user']:
                print('还想转给自己!')
                continue
            money = input('请输入要转账的金额:').strip()
            if money == 'q':
                break
            if not money.isdigit():
                print('请输入整数金额!')
                continue
            flag, msg = bank_interface.transfer_interface(user_info['user'], to_user, money)
            if flag:
                print(msg)
                break
            else:
                print(msg)
                break
    
    
    # 提现功能
    @common.wrapper
    def withdraw():
        while True:
            money = input('请输入要提现的金额:').strip()
            if money == 'q':
                break
            if not money.isdigit():
                print('输入整数金额!')
                continue
            flag, msg = bank_interface.withdraw_interface(user_info['user'], money)
            if flag:
                print(msg)
                break
            else:
                print(msg)
                break
    
    
    # 还款功能
    @common.wrapper
    def repay():
        while True:
            money = input('请输入要还款的金额:').strip()
            if money == 'q':
                break
            if not money.isdigit():
                print('请输入整数金额!')
                continue
            msg = bank_interface.repay_interface(user_info['user'], money)
            print(msg)
            break
    
    
    # 查看购物车
    @common.wrapper
    def check_shop_cart():
        flag, msg = shop_interface.check_shop_cart(user_info['user'])
        if flag:
            print(msg)
        else:
            print(msg)
    
    
    # 购物功能
    @common.wrapper
    def shopping():
        cost = 0
        shop_cart = {}
        while True:
            shop_info = [
                ['tank牌香水', 1200],
                ['tank写真集', 1],
                ['怡宝', 4],
                ['百岁山', 6],
                ['劳斯莱斯', 2400000],
            ]
            for shop_num, name_and_price in enumerate(shop_info):
                print(
                    f'商品编号:{shop_num}',
                    f'商品名称:{name_and_price[0]}',
                    f'商品价格: {name_and_price[1]}',
                )
            choice = input('请选择商品编号:').strip()
            if choice == 'q':
                break
            if choice.isdigit() and int(choice) < len(shop_info):
                current_bal = user_interface.check_bal_interface(user_info['user'])
                shop_name, shop_price = shop_info[int(choice)]
                if current_bal >= shop_price:
                    if shop_name in shop_cart:
                        shop_cart[shop_name] += 1
                    else:
                        shop_cart[shop_name] = 1
                    cost += shop_price
                    choice1 = input('q退出,任意键继续购物').strip()
                    if choice1 == 'q':
                        commit = input('是否结账:"Y"or"N":').strip()
                        if commit == 'Y':
                            flag, msg = shop_interface.pay_interface(user_info['user'], cost)
                            if flag:
                                print(msg)
                                break
                            else:
                                print(msg)
                                msg1 = shop_interface.add_shop_cart(user_info['user'], shop_cart)
                                print(msg1)
                                break
                        elif commit == "N":
                            msg = shop_interface.add_shop_cart(user_info['user'], shop_cart)
                            print(msg)
                            break
                        else:
                            print('请输入合法的指令!')
                            continue
                else:
                    print('您的余额太少还是去充值吧!')
                    break
            else:
                print('请输入合法额指令!')
                continue
    
    
    # 查看流水
    @common.wrapper
    def check_flow():
        flag, msg = user_interface.check_flow_interface(user_info['user'])
        if flag:
            for line in msg:
                print(line)
        else:
            print(msg)
    
    
    # 注销
    @common.wrapper
    def cancel():
        msg = user_interface.cancel_interface()
        print(msg)
    
    
    # 功能函数字典
    func_dict = {
        '1': register,
        '2': login,
        '3': check_bal,
        '4': transfer,
        '5': withdraw,
        '6': repay,
        '7': check_shop_cart,
        '8': shopping,
        '9': check_flow,
        '10': cancel,
    
    }
    
    
    # 执行程序
    def run():
        while True:
            print('''
            *******功能主界面*****
            1.注册
            2.登录
            3.查看余额
            4.转账
            5.提现
            6.还款
            7.查看购物车
            8.购物功能
            9.查看流水
            10.注销
            ps:任意输入界面输入'q'返回至主界面
            主界面位置输入'Q'退出程序
            ''')
            choice = input('请输入要选择的功能对应的编号:').strip()
            if choice == 'Q':
                break
            if choice.isdigit() and 0 < int(choice) < len(func_dict) + 1:
                choice = str(choice)
                func_dict[choice]()
            else:
                print('请输入有效的指令!')
    
    
    db 存放数据的文件夹,相当于数据库

    __ init __.py

    db_handler.py

    from conf import settings
    import os
    import json
    
    
    # 查看数据
    def check_data(user):
        user_path = os.path.join(settings.DB_PATH, f'{user}.json')
        if os.path.exists(user_path):
            with open(user_path, 'r', encoding='utf-8') as f:
                user_dict = json.load(f)
                f.flush()
                return user_dict
        else:
            return False
    
    
    # 保存数据
    def save_data(user_dict):
        user_path = os.path.join(settings.DB_PATH, f'{user_dict["user"]}.json')
        with open(user_path, 'w', encoding='utf-8')as f:
            json.dump(user_dict, f, ensure_ascii=False)
            f.flush()
    
    
    interface 存放接口的文件夹

    __ init __.py

    bank_interface.py

    from db import db_handler
    from lib import common
    
    bank_logger = common.get_logger('bank')
    
    
    # 转账接口
    def transfer_interface(my_user, to_user, money):
        my_user_dict = db_handler.check_data(my_user)
        to_user_dict = db_handler.check_data(to_user)
        if my_user_dict['balance'] >= int(money):
            my_user_dict['balance'] -= int(money)
            to_user_dict['balance'] += int(money)
            flow_str1 = f'{my_user}给{to_user}转了{money}元!'
            flow_str2 = f'{to_user}接收了{my_user}{money}元!'
            my_user_dict['flow'].append(flow_str1)
            to_user_dict['flow'].append(flow_str2)
            db_handler.save_data(my_user_dict)
            db_handler.save_data(to_user_dict)
            bank_logger.info(f'{my_user}进行了转账操作!')
            return True, '转账成功!'
    
        else:
            return False, '余额不足无法转账!'
    
    
    # 提现接口
    def withdraw_interface(user, money):
        user_dict = db_handler.check_data(user)
        if user_dict['balance'] >= int(money):
            user_dict['balance'] -= int(money) * 1.05
            flow_str = f'{user}提现{money}元,手续费{int(money) * 0.05}'
            user_dict['flow'].append(flow_str)
            db_handler.save_data(user_dict)
            bank_logger.info(f'{user}进行了提现操作!')
            return True, f'{user}提现{money}元成功!,手续费{int(money) * 0.05}'
        else:
            return False, '余额不足,提现失败'
    
    
    # 还款接口
    def repay_interface(user, money):
        user_dict = db_handler.check_data(user)
        user_dict['balance'] += int(money)
        flow_str = f'{user}还款{money}元成功!'
        user_dict['flow'].append(flow_str)
        db_handler.save_data(user_dict)
        bank_logger.info(f'{user}进行了还款操作!')
        return f'{user}还款{money}元成功!'
    
    

    shop_interface.py

    from db import db_handler
    from lib import common
    
    shop_logger = common.get_logger('shop')
    
    
    # 支付接口
    def pay_interface(user, cost):
        user_dict = db_handler.check_data(user)
        if user_dict['balance'] >= int(cost):
            user_dict['balance'] -= int(cost)
            flow_str = f'{user}购买商品成功!花费{cost}元!'
            user_dict['flow'].append(flow_str)
            db_handler.save_data(user_dict)
            shop_logger.info(f'{user}购买了商品!')
            return True, '购买成功!'
        else:
            return False, '余额不足,购买失败!'
    
    
    # 查看购物车接口
    def check_shop_cart(user):
        user_dict = db_handler.check_data(user)
        if user_dict['shop_cart']:
            return True, user_dict['shop_cart']
        else:
            return False, '目前购物车为空!'
    
    
    # 添加购物车接口
    def add_shop_cart(user, shop_cart):
        user_dict = db_handler.check_data(user)
        user_dict['shop_cart'].update(shop_cart)
        db_handler.save_data(user_dict)
        return '已自动帮您添加到购物车,方便你下次选购!'
    
    

    user_interfcae.py

    from db import db_handler
    from lib import common
    
    user_logger = common.get_logger('user')
    
    
    # 注册接口
    def register_interface(user, pwd):
        user_dict = {
            'user': user,
            'pwd': common.get_md5(pwd),
            'balance': 20000,
            'flow': [],
            'shop_cart': {},
            'lock': False,
        }
        db_handler.save_data(user_dict)
        user_logger.info(f'{user}注册成功!')
        return f'{user}注册成功!'
    
    
    # 登录接口
    def login_interface(user, pwd):
        user_dict = db_handler.check_data(user)
        if user_dict['pwd'] == pwd:
            user_logger.info(f'{user}登录成功!')
            return True, f'{user}登录成功!'
    
        else:
            return False, f'密码不正确!'
    
    
    # 查看余额接口
    def check_bal_interface(user):
        user_dict = db_handler.check_data(user)
        return user_dict['balance']
    
    
    # 查看流水接口
    def check_flow_interface(user):
        user_dict = db_handler.check_data(user)
        if user_dict['flow']:
            return True, user_dict['flow']
        else:
            return False, '还没有流水'
    
    
    # 注销接口
    def cancel_interface():
        from core import src
        src.user_info['user'] = None
        user_logger.info(f'注销成功!')
        return '注销成功!'
    
    
    lib 存放公共方法的文件夹

    __ init __

    common.py

    import hashlib
    import logging.config
    from conf import settings
    
    
    # 密码加密
    def get_md5(pwd):
        obj_md5 = hashlib.md5()
        obj_md5.update(pwd.encode('utf-8'))
        sal = '超喜欢你!'
        obj_md5.update(sal.encode('utf-8'))
        res = obj_md5.hexdigest()
        return res
    
    
    # 登录认证的装饰器
    def wrapper(func):
        from core import src
        def inner(*args, **kwargs):
            if src.user_info['user']:
                res = func(*args, **kwargs)
                return res
            else:
                print('请先进行登录操作!')
                src.login()
        return inner
    
    
    # 日志功能
    def get_logger(user_type):
        logging.config.dictConfig(settings.LOGGING_DIC)
        logger = logging.getLogger(user_type)
        return logger
    
    
    log 存放日志的文件夹

    readme.txt 项目说明书

       1.注册
            2.登录
            3.查看余额
            4.提现
            5.还款
            6.转账
            7.查看购物车
            8.购物功能
            9.查看流水
            10.注销
    
    

    start.py 启动文件

    import os
    import sys
    from core import src
    
    # 配置环境变量
    sys.path.append(
        os.path.dirname(__file__)
    )
    
    if __name__ == '__main__':
        src.run()
    
    
  • 相关阅读:
    Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理
    Spring Boot2 系列教程(十二)@ControllerAdvice 的三种使用场景
    Spring Boot2 系列教程(十一)Spring Boot 中的静态资源配置
    Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker
    Python pass 语句
    Python continue 语句
    Python break 语句
    Python 循环嵌套
    Python for 循环语句
    小程序开发中的六大问题难点
  • 原文地址:https://www.cnblogs.com/godlover/p/11923921.html
Copyright © 2020-2023  润新知