zoukankan      html  css  js  c++  java
  • day26 作业(ATM第二版)

    start.py

    import os,sys
    from core import src
    sys.path.append(
        os.path.dirname(__file__)
    )
    
    if __name__ == '__main__':
        src.run()
    

    conf.settings.py

    import os
    
    BASE_PATH = os.path.dirname(os.path.dirname(__file__))
    
    
    DB_PATH = os.path.join(BASE_PATH,'db')
    
    USER_FILE_PATH = os.path.join(DB_PATH,'user_file')
    
    READ_TXT_PATH = os.path.join(DB_PATH,'read_txt')
    
    STORY_CLASS_TXT_PATH = os.path.join(DB_PATH,'story_class.txt')
    
    LOPGFILE_DIR_PATH = os.path.join(BASE_PATH,'log','all2.log')
    
    LOGFILE_LOG_PATH = os.path.join(LOPGFILE_DIR_PATH,'atm_log.log')
    

    core.src.py

    from interface import user_interface
    from interface import bank_interface
    from interface import shop_interface
    from lib import common
    now_user = None
    # 注册
    def register():
        username = input("请输入你要注册的账号:")
        password = input("请输入你要注册的密码:")
        password_agin = input("请再次输入你要注册的密码:")
        if password == password_agin:
            flag,msg = user_interface.register_interface(username,password)
            if flag:
                print(msg)
            else:
                print(msg)
            #执行注册功能
        else:
            print("WTF?让你输两次同样的密码你都能老子输错,吃屎去把!")
    
    # 登录
    def login():
        while True:
            username = input("请输入你要登录的账号:")
            password = input("请输入你要登录的密码:")
            flag,msg = user_interface.login_interface(username,password)
            if flag:
                print(msg)
                global now_user
                now_user = username
                break
            else:
                print(msg)
    
    # 查余额
    @common.login_warpper
    def check_balance():
        balance = bank_interface.check_balance_interface(now_user)
        print(f'{now_user}的余额为{balance}')
    
    # 提现
    @common.login_warpper
    def withdraw():
        money = input("请输入你要提现的金额:")
        if money.isdigit():
            flag,msg = bank_interface.withdraw_interface(now_user,money)
            if flag:
                print(msg)
            else:
                print(msg)
        else:
            print("让你输几个数字这么困难吗??")
    
    # 还款
    @common.login_warpper
    def repay():
        money = input("请输入你要还款的金额:")
        if money.isdigit():
            msg = bank_interface.repay_interface(now_user,money)
            print(msg)
        else:
            print("请输入正确的金额!")
    
    # 转账
    @common.login_warpper
    def transfer():
        outher_name = input("请输入收账人账号:")
        money = input("请输入转账金额:")
        if money.isdigit():
            msg = bank_interface.transfer_interface(now_user,outher_name,money)
            print(msg)
        else:
            print("请输入正确的金额!")
    # 查看流水
    @common.login_warpper
    def check_flow():
        flow_list = bank_interface.check_flow_interface(now_user)
        if flow_list:
            print(flow_list)
        else:
            print('该账号没有流水!')
    
    book_dict = {
                "0": "玄幻武侠",
                "1": "无限流派",
                "2": "科幻悬疑"}
    # 购物
    @common.login_warpper
    def shopping():
        while True:
            story_dic = common.get_story_class()
            print('''=============书吧=============''')
            for num in book_dict:
                print(f'   序号:{num}     种类:{book_dict[num]}')
            print('''=============end=============''')
            chose_type = input("请输入你要选择种类的序号:")
            if not chose_type.isdigit():
                print("请输入数字!")
                continue
            else:
                shop_car_dic = {}
                while True:
                    story_chose_type = story_dic[chose_type]
                    for num in story_chose_type:
                        book_name = story_chose_type[num][0].strip(".txt")
                        price = story_chose_type[num][1]
                        print(f'序号:{num}  书名:{book_name}   单价:{price}')
                    chose_num = input("请输入你要选择书的序号(q为退出):")
                    if chose_num == 'q':
                        return
                    elif not chose_num.isdigit():
                        print("请输入数字!")
                        continue
                    book_count = input("请输入你要购买该书的数量:")
                    if not book_count.isdigit():
                        print("请输入数字!")
                        continue
                    chose_buy = input("是否购买该商品(b)或加入购物车(g):")
                    cost = int(book_count) * story_chose_type[chose_num][1]
                    if chose_buy == "b":
                        #调用接口结算该商品
                        msg = shop_interface.shopping_buy_interface(now_user,cost)
                        print(msg)
                    elif chose_buy == "g":
                        book_name = story_chose_type[chose_num][0]
                        price = story_chose_type[chose_num][1]
                        shop_car_dic[book_name] = {
                            '单价':price,
                            '数量':int(book_count),
                            '总价':cost,
                        }
                        msg = shop_interface.shopping_tocar_interface(now_user,shop_car_dic)
                        print(msg)
                        #调用接口添加购物车
                    else:
                        print("请输入正确的指令!")
    
    
    # 购物车
    @common.login_warpper
    def check_shop_car():
        flag,msg = shop_interface.check_shop_car_inerface(now_user)
        if flag:
            book_map = {}
            count = 1
            for name in msg:
                print(f"序号:{count} 书名:{name} 单价:{msg[name]['单价']} 数量:{msg[name]['数量']} 总价格:{msg[name]['总价']}")
                book_map[count] = name
                count+=1
            chose = input("请选择你要支付的序号(q=退出,a=全部支付):")
            if chose == "q":
                return
            elif chose == "a":
                msg = shop_interface.shopping_allbuy_interface(now_user)
                print(msg)
            elif int(chose) in book_map:
                msg = shop_interface.shopping_buy_interface(now_user,msg[book_map[int(chose)]]['总价'])
                print(msg)
            else:
                print("请输入正确指令!")
        else:
            print(msg)
    
    # 管理员
    def admin():
        pass
    
    
    
    func_dic = {
        '1': register,
        '2': login,
        '3': check_balance,
        '4': withdraw,
        '5': repay,
        '6': transfer,
        '7': check_flow,
        '8': shopping,
        '9': check_shop_car,
        '10': admin,
    }
    
    #执行
    def run():
        while True:
            print('''
    ========= ATM第二版 =========== 
            1、注册功能
            2、登录功能
            3、查看余额
            4、提现功能
            5、还款功能
            6、转账功能
            7、查看流水
            8、购物功能
            9、查看购物车
            10、管理员功能(暂无)
    ============ end =============
            ''')
            cmd = input("请输入你要选择的功能:")
            if cmd in func_dic:
                func_dic[cmd]()
            else:
                print("有脑子没,1到10都不会输吗?你小学数学体育老师教的?")
    

    db.db_handler.py

    import os
    import json
    from conf import  settings
    #查询用户是否存在
    def select(username):
        user_path = os.path.join(settings.USER_FILE_PATH,f'{username}.json')
        if os.path.exists(user_path):
            with open(user_path,"r",encoding="utf-8")as f :
               user_dic = json.load(f)
            return user_dic
    
    
    #保存用户信息
    def save(use_dic):
        user_path = os.path.join(settings.USER_FILE_PATH, f"{use_dic['username']}.json")
        with open(user_path,"w",encoding="utf-8") as f:
            json.dump(use_dic,f,ensure_ascii=False)
    

    interface.bank_interface.py

    from db import db_handler
    from lib import common
    bank_logger = common.get_logger(log_type='bank')
    # 查询余额
    def check_balance_interface(username):
        user_dic = db_handler.select(username)
        return user_dic['balance']
    
    # 提现
    def withdraw_interface(username,money):
        user_dic = db_handler.select(username)
        money = int(money)
        if money*1.05 <= user_dic['balance']:
            user_dic['balance'] -= money*1.05
            flow = f'{username}提现{money}成功!'
            user_dic['flow'].append(flow)
            db_handler.save(user_dic)
            bank_logger.info(flow)
            return True,flow
        else:
            return False,f'{username}余额不足!'
    
    # 还款
    def repay_interface(username,money):
        use_dic = db_handler.select(username)
        money = int(money)
        use_dic['balance'] += money
        flow = f'{username}还款{money}成功!'
        use_dic['flow'].append(flow)
        db_handler.save(use_dic)
        bank_logger.info(flow)
        return flow
    
    # 转账
    def transfer_interface(my_name,outher_name,money):
        outher_dic = db_handler.select(outher_name)
        if outher_dic:
            my_dic = db_handler.select(my_name)
            money = int(money)
            if  my_dic['balance'] >= money:
                my_dic['balance'] -= money
                outher_dic['balance'] += money
                my_flow =f'{my_name}向{outher_name}转账{money}成功!'
                my_dic['flow'].append(my_flow)
                ot_flow = f'{outher_name}接收{my_name}的转账{money}成功!'
                my_dic['flow'].append(ot_flow)
                db_handler.save(my_dic)
                db_handler.save(outher_dic)
                bank_logger.info(my_flow)
                bank_logger.info(ot_flow)
                return my_flow
            else:
                return f'{my_name}没那么多钱,转账失败!'
        else:
            return f'不存在{outher_name}账户!'
    
    # 查看流水
    def check_flow_interface(username):
        use_dic = db_handler.select(username)
        return use_dic['flow']
    

    interface.shop_interface.py

    from db import db_handler
    from conf import settings
    from lib import common
    shop_logger = common.get_logger(log_type='shop')
    
    # 购买接口
    def shopping_buy_interface(username,price):
        user_dic = db_handler.select(username)
        if user_dic['balance'] >= price:
            user_dic['balance'] -= price
            flow = f'{username}购买支出{price}成功!'
            user_dic['flow'].append(flow)
            db_handler.save(user_dic)
            shop_logger.info(flow)
            return flow
        else:
            return '购买失败余额不足!'
    
    
    # 添加购物车接口
    def shopping_tocar_interface(username,book_dic):
        user_dic = db_handler.select(username)
        bookname = book_dic.__iter__().__next__()
        if bookname in user_dic['shop_car'] :
            user_dic['shop_car'][bookname]['数量'] += book_dic[bookname]['数量']
            user_dic['shop_car'][bookname]['总价'] += book_dic[bookname]['总价']
            db_handler.save(user_dic)
        else:
            user_dic['shop_car'][bookname] = book_dic[bookname]
            db_handler.save(user_dic)
        return '添加购物车成功,请选择购物车功能查看商品信息'
    
    # 查看购物车
    def check_shop_car_inerface(username):
        user_dic = db_handler.select(username)
        if user_dic['shop_car']:
            return True,user_dic['shop_car']
        else:
            return False,f'{username}购物车为空!'
    
    
    # 清空购物车
    def shopping_allbuy_interface(username):
        user_dic = db_handler.select(username)
        cost = 0
        for name in user_dic['shop_car']:
            cost +=user_dic['shop_car'][name]['总价']
        if cost>user_dic['balance']:
            return f"{username}余额不足!"
        else:
            user_dic['balance'] -= cost
            user_dic['shop_car'] = {}
            db_handler.save(user_dic)
            shop_logger.info(f'{username}支付{cost}成功!购物车已清空!')
            return f'{username}支付{cost}成功!购物车已清空!'
    

    interface.user_interface

    from db import db_handler
    from lib import common
    user_logger = common.get_logger(log_type='user')
    
    
    #注册接口
    def register_interface(username,pwd):
        use_dic = db_handler.select(username)
        if not use_dic:
            pwd_md5 = common.pwd_md5(pwd)
            use_dic = {
                'username':username,
                'password':pwd_md5,
                'balance':15000,
                'flow':[],
                'shop_car':{},
                'locked':{}
            }
            db_handler.save(use_dic)
            user_logger.info(f'用户{username}注册成功!')
            return True,f'用户{username}注册成功!'
        else:
            return False,f'我服了,都已经注册过了你还用这个账号,脑子进水了么?'
    
    
    #登录接口
    def login_interface(username,pwd):
        use_dic = db_handler.select(username)
        if use_dic:
            pwd_md5 = common.pwd_md5(pwd)
            if pwd_md5 == use_dic['password']:
                user_logger.info(f"{username}登录成功!")
                return True,f"{username}登录成功!"
            else:
                return False,'你密码就三位你都记不住?大帅比'
        else:
            return False,'呆瓜,没有这个用户,你先去注册把~'
    

    lib.common.py

    import hashlib
    import logging.config
    from conf import settings
    from log import atm_log
    # 加密密码
    def pwd_md5(pwd):
        m = hashlib.md5()
        m.update(pwd.encode('utf-8'))
        salt = '黄钊是个大帅逼!'
        m.update(salt.encode('utf-8'))
        p_md = m.hexdigest()
        return p_md
    
    # 登录装饰器
    def login_warpper(func):
        def inner():
            from core import  src
            if src.now_user:
                func()
            else:
                print("没登录执行nm的功能啊??赶紧给我登录去!")
                src.login()
        return inner
    
    
    # 获取商品信息
    def get_story_class():
        class_path = settings.STORY_CLASS_TXT_PATH
        with open(class_path,"r",encoding="utf-8")as f :
            story_dic = eval(f.read())
        return story_dic
    
    # 日志
    def get_logger(log_type):
        logging.config.dictConfig(
            atm_log.LOGGING_DIC
        )
        logger = logging.getLogger(log_type)
    
        return logger
    

    log.atm_log.py

    import os
    import logging.config
    from conf import settings
    # 定义三种日志输出格式 开始
    
    standard_format = '[%(asctime)s][用户:%(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 = settings.LOPGFILE_DIR_PATH
    # log文件的目录
    
    logfile_name = 'all2.log'  # log文件名
    
    # 如果不存在定义的日志目录就创建一个
    if not os.path.isdir(logfile_dir):
        os.mkdir(logfile_dir)
    
    # log文件的全路径
    logfile_path = settings.LOGFILE_LOG_PATH
    
    # 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,
                # 日志大小 5M
                'maxBytes': 1024 * 1024 * 5,
                # 日志轮转:最大日志文件数量5
                'backupCount': 5,
                # 日志文件的编码,再也不用担心中文log乱码了
                'encoding': 'utf-8',
            },
        },
        # 日志制造者
        'loggers': {
            # logging.getLogger(__name__)拿到的logger配置
    
            # 如果没有名字的话,名字在其他文件调用时自动传入
            '': {
                # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                'handlers': ['default'],
                # 第一层level,筛选后再去handlers里筛选,通常一样
                'level': 'DEBUG',
                # 向上(更高level的logger)传递,通常为false
                'propagate': True,
            },
        },
    }
    
  • 相关阅读:
    XSS之防御与绕过
    说说XXE漏洞那些事
    常见web中间件漏洞(五)weblogic漏洞
    DLL劫持漏洞
    常见web中间件漏洞(四)Tomcat漏洞
    常见web中间件漏洞(三)Nginx漏洞
    CNVD-2021-14536 锐捷 RG-UAC 统一上网行为管理审计系统信息泄露漏洞
    Jupyter安装并设置反向搭理
    读书-刑罚的历史
    读书-反常识
  • 原文地址:https://www.cnblogs.com/hz2lxt/p/12630746.html
Copyright © 2011-2022 走看看