• 老男孩Day5作业:电子银行购物商城


    1、作业需求:
    模拟实现一个ATM + 购物商城程序
    额度 15000或自定义
    实现购物商城,买东西加入 购物车,调用信用卡接口结账
    可以提现,手续费5%
    支持多账户登录
    支持账户间转账
    记录每月日常消费流水
    提供还款接口
    ATM记录操作日志 
    提供管理接口,包括添加账户、用户额度,冻结账户等。。。 
    用户认证用装饰器

    2、流程图

    3、目录结构

    |——员工信息查询系统
    |——bin目录
    |    |—— _init.py
    |    |__    Stary.py(开始程序)
    |
    |——core目录
    |    |——    __init__.py
    |    |——    main.py(主模块程序)
    |    |——    auth.py(登录认证程序)
    |
    |——db目录
    |    |——    shop_car(购物车文件目录)
    |        |——XXX.txt(购物车文件)
    |    |__    user_info(用户数据)
    |        |——XXX.json(用户信息数据)
    |——log目录
    |    |——    card_log(信用卡日志目录)
    |        |——XXX.log(信用卡日志文件)
    |    |__    shop_log(购物日志目录)
    |        |——XXX.log(购物日志文件)
    |——modules目录
    |    |——    __init__.py
    |    |——    admincenter.py(管理中心程序)
    |    |——    creditcard.py(信用卡程序)
    |    |——    shopping.py(购物商城程序)
    |__  __init.py__

    4、core目录

    auth.py(登录认证模块)

    #-*- Coding:utf-8 -*-
    # Author: D.Gray
    
    import os,sys
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)
    
    def accse_login(user_data):
        '''
        定义一个用户登录装饰器
        :param user_data:
        :return:
        '''
        def out_wrapper(func):      #func接收 admin_info,shop_info,admin_info函数的返回值
            def wrapper(*args,**kwargs):
                count = 0
                if not user_data['is_authenticated'] and count < 3:
                    print("33[32;0m用户登录认证33[0m".center(40, "-"))
                    while count < 3:
                        user = input('33[32;1m请输入用户名>>>:33[0m')
                        db_path = BASE_DIR + r'dbuser_info'
                        db_path_user = db_path + '\%s.json' % user
                        if os.path.isfile(db_path_user):    #判断用户文件是否存在
                            with open(db_path_user, 'r', encoding='utf-8') as fh:
                                user_datas = eval(fh.read())    #将用户文件中内容转换为字典形式
                            pwd = input('33[32;1m请输入用户密码>>>:33[0m')
                            if pwd == user_datas['password']:
                                user_data['account_id'] = user_datas["cardid"]
                                user_data['is_authenticated'] = True
                                user_data['account_data'] = user_datas
                                break
                            else:
                                print('33[31;1m密码错误请重新输入33[0m')
                        else:
                            count += 1
                            print('33[31;1m该用户不存在,请重新输入还剩 %s 次机会33[0m'% (3-count))
                    func(*args,**kwargs)
                return func
            return wrapper
        return out_wrapper

    mian.py(主模块程序)

    #-*- Coding:utf-8 -*-
    # Author: D.Gray
    import sys,os
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)
    from core import auth
    from modules import creditcard
    from modules import shopping
    from modules import admincenter
    
    
    #用户数据信息
    user_data = {
        'account_id':None,          #帐号ID
        'is_authenticated':False,  #是否认证
        'account_data':None        #帐号数据
     }
    
    def run():
        '''
        定义一个主界面函数
        :return:
        '''
        while True:
            print('''33[35;1m                        ************欢迎来到ATM电子商务淫行************
                                            1.信用卡中心
                                            2.购物中心
                                            3.管理中心
                                            4.退出33[0m''')
            inputs = input('33[35;1m请选择操作方式>>>:33[0m').strip()
            dict = {
                '1':card_info,
                '2':shop_info,
                '3':admin_info
            }
            if inputs in dict.keys():
                dict[inputs]()
            elif inputs == '4':
                exit('程序退出 欢迎下次使用')
            else:
                print('33[31;1m请输入有效操作方式33[0m')
    
    def admin_info():
        '''
        定义一个管理员权限用户主函数
        :return:
        '''
        auth_user()            #调用用户认证接口
        if user_data['account_data']['type'] == 1:
            while True:
                print('''33[35;1m                        ---------------欢迎 %s 来到信用卡管理中心---------------
                                               1.  发行信用卡
                                               2.  冻结信用卡
                                               3.  解冻信用卡
                                               4.  提升信用卡额度
                                               5.  返回主菜单
                                               6.  退出33[0m'''%user_data['account_data']["username"])
                inputs = input('33[35;1m请选择操作方式1>>>:33[0m').strip()
                menu_dic = {
                    "1": admincenter.banks,
                    "2": admincenter.freezing,
                    "3": admincenter.defrosting,
                    "4": admincenter.limit,
                }
                if inputs in menu_dic.keys():
                    menu_dic[inputs](user_data['account_data'])
                elif inputs == '5':
                    break
                elif inputs == '6':
                    exit('程序退出 欢迎下次使用')
                else:
                    print('33[31;1m请输入有效操作方式33[0m')
        else:
            exit('对不起您的账号权限不足无法登录该模块')
    
    def shop_info():
        '''
        定义一个用户购物的主函数
        :return:
        '''
        auth_user()         #调用用户认证接口
        while True:
            print('''33[35;1m                        ---------------欢迎来到购物中心---------------
                                               1.购物商城
                                               2.查看购物车
                                               3.查看购物记录
                                               4.返回主菜单
                                               5.退出33[0m''')
            menu_dic = {
                '1':shopping.shopping,
                '2':shopping.shop_car,
                '3':shopping.center
            }
            inputs = input('33[35;1m请选择操作方式>>>:33[0m').strip()
            if inputs in menu_dic.keys():
                menu_dic[inputs](user_data['account_data'])
            elif inputs == '4':
                break
            elif inputs == '5':
                exit('程序退出 欢迎下次使用')
            else:
                print('33[31;1m请输入有效操作方式33[0m')
    
    
    def card_info():
        '''
        定义一个信用卡管理中心的主函数
        :return:
        '''
        auth_user()             #调用用户认证接口
        while True:
            print('''33[35;1m                        ---------------欢迎 %s 来到信用卡中心---------------
                                                1.  账户信息
                                                2.  存款
                                                3.  提现
                                                4.  转账
                                                5.  账单
                                                6.  返回主菜单
                                                7.  退出
            33[0m'''%user_data['account_data']["username"])
            user_account = user_data['account_data']
            inputs =  input('33[35;1m请选择操作方式1>>>:33[0m').strip()
            menu_dic = {
                "1": creditcard.account_info,
                "2": creditcard.repay,
                "3": creditcard.withdraw,
                "4": creditcard.transfer,
                "5": creditcard.paycheck,
                }
            if inputs in menu_dic.keys():
                menu_dic[inputs](user_account)
            elif inputs == '6':
                break
            elif inputs == '7':
                exit('程序退出 欢迎下次使用')
            else:
                print('33[31;1m请输入有效操作方式33[0m')
    
    @auth.accse_login(user_data)   #装饰器认证
    def auth_user():
        '''
        调用 auth模块中的accse_login装饰器对用户进行登录认证
        :return:
        '''
        print('33[32;1m用户 %s 登录认证成功33[0m' % user_data['account_data']["username"])

    5、db(数据库)

    {
      "status":1,
      "expire_date": "2021-01-01",
      "credit":5500,
      "pay_day":22,
      "balance":9028,
      "enroll_date": "2016-01-02",
      "cardid":1112,
      "password": "123456",
      "username": "admin",
      "type":1,
      "cardname":"招商银行-星耀"
    }
    IPhone    1299
    IWatch    2999
    MacBo    1999
    IPad    2199
    Bicyc    999
    X-box    1199
    Letv    819
    Book    599

    6、log(日志目录)

    #-*- Coding:utf-8 -*-
    # Author: D.Gray
    
    import logging,sys,os
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)
    
    def card_log(username,log):
        '''
        定义一个信用卡日志函数
        :return:
        '''
        log_path = BASE_DIR+r'logcard_log\%s_card.log'%username
    
        logger = logging.getLogger('Test_LOG')
        logger.setLevel(logging.INFO)
    
        fh = logging.FileHandler(log_path,encoding='utf-8') #将日志打印到log目录下的日志文件中
        fh.setLevel(logging.INFO)
    
        fh_format = logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %H:%M:%S')
        fh.setFormatter(fh_format)
    
        logger.addHandler(fh)
        logger.info(log)
    
        logger.removeHandler(fh)  #避免打印重复日志
    
    def shop_log(username,log):
        '''
        定义一个购物日志函数
        :param username:
        :param log:
        :return:
        '''
        log_path = BASE_DIR + r'logshop_log\%s_shop.log' % username
    
        logger = logging.getLogger('Test_LOG')
        logger.setLevel(logging.INFO)
    
        fh = logging.FileHandler(log_path,encoding='utf-8')
        fh.setLevel(logging.INFO)
    
        fh_format = logging.Formatter('%(asctime)s %(message)s', datefmt='%m/%d/%Y %H:%M:%S')
        fh.setFormatter(fh_format)
    
        logger.addHandler(fh)
        logger.info(log)
    
        logger.removeHandler(fh)

    7、modules(模块程序)

    admincenter.py

    #-*- Coding:utf-8 -*-
    # Author: D.Gray
    import os,sys,logging
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)
    db_path = BASE_DIR + r'dbuser_info'
    
    def banks(account):
        '''
        定义一个查询发行信用卡函数
        :param account:
        :return:
        '''
        print('33[33;1m尊敬的用户您的发行信用卡是 【%s】'
            '
    卡号为:%s  开户日期为:%s  信用卡有效期至:%s' 
              '
    我们将会真挚的为您服务!!!'
              %(account['cardname'],account["cardid"],account["enroll_date"],account["expire_date"]))
    
    
    def freezing(account):
        '''
        定义一个冻结信用卡函数
        :return:
        '''
        db_path_user = db_path+'\%s.json'%account['username']
        with open(db_path_user,'r',encoding='utf-8') as fh:
            fr = fh.read()
            fd = eval(fr)
            if fd['status'] == 0:
                print('33[31;1m当前信用卡 【已冻结】33[0m')
            if fd['status'] == 1:
                free = input('33[33;1m当前信用卡 【未冻结】 按任意键选择冻结 按b返回>>>33[0m')
                if free != 'b':
                    with open(db_path_user,'w',encoding='utf-8') as fw:
                        res = fr.replace(str(fd["status"]),'0',1)
                        fw.write(res)
                        print('33[31;1m当前信用卡 【已冻结】33[0m')
    
    def defrosting(account):
        '''
        定义一个解冻函数
        :return:
        '''
        db_path_user = db_path + '\%s.json' % account['username']
        with open(db_path_user, 'r', encoding='utf-8') as fh:
            fr = fh.read()
            fd = eval(fr)
            if fd['status'] == 1:
                print('33[31;1m当前信用卡 【未冻结】33[0m')
            if fd['status'] == 0:
                free = input('33[33;1m当前信用卡 【已冻结】 按任意键选择解冻 按b返回>>>33[0m')
                if free != 'b':
                    with open(db_path_user, 'w', encoding='utf-8') as fw:
                        res = fr.replace(str(fd["status"]), '1', 1)
                        fw.write(res)
                        print('33[31;1m当前信用卡 【已解冻】33[0m')
    
    def limit(account):
        '''
        定义一个提升信用额度函数
        :return:
        '''
        db_path_user = db_path + '\%s.json' % account['username']
        with open(db_path_user, 'r', encoding='utf-8') as fh:
            fr = fh.read()
            fd = eval(fr)
            print('33[33;1m尊敬的用户您当前信用额度是 【%s元】'%account["credit"])
            limit = input('33[34;1m是否选择提升信用额度  按任意键确认提示  按Q取消提升>>>')
            if limit.capitalize() != 'Q':
                while True:
                    lines = input('33[35;1m请输入提升信用额度>>>33[0m')
                    if lines.isdigit():
                        lines = int(lines)
                        if lines <= 2000:
                            limits = fd['credit'] + lines
                            with open(db_path_user, 'w', encoding='utf-8') as fw:
                                res = fr.replace(str(fd["credit"]), str(limits))
                                fw.write(res)
                                print('33[31;1m当前信用额度提升为: 【%s元】33[0m'%limits)
                                break
                        else:
                            print('33[31;1m提升额度超出提升范围33[0m')
                    else:
                        print('33[31;1m请输入有效提升额度33[0m')

    creditcard.py

    #-*- Coding:utf-8 -*-
    # Author: D.Gray
    import os,sys,logging
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)
    db_path = BASE_DIR + r'dbuser_info'
    log_path = BASE_DIR+r'logcard_log\%s_card.log'
    
    from log import loggers
    
    def account_info(user_account):
        '''
        定义一个查看用户信息的函数
        :param user_account: user_account = user_data['account_data']  接收用户字典信息
        :return:
        '''
        db_path_user = db_path + '\%s.json' % user_account["username"]
        with open(db_path_user, 'r',encoding='utf-8') as fh:
            fd = eval(fh.read())
        print("33[33;1m我的账户信息:
    持卡人:	【%s】
    卡号:	【%s】
    存款:	【¥%s】
    可提现额度:	【¥%s】33[0m"
              %(user_account["username"],user_account["cardid"],fd["balance"],fd["credit"]))
        inputs = input('33[33;1m按任意键返回上一级菜单>>>:33[0m')
    
    def repay(user_account):
        '''
        定义一个用户存款函数
        :param user_account:
        :return:
        '''
        db_path_user = db_path + '\%s.json' % user_account["username"]
        with open(db_path_user, 'r',encoding='utf-8') as fh:
            fr = fh.read()
            fd = eval(fr)
        print("33[33;1m您的当前存款为:【¥%s】"% fd["balance"])
        while True:
            repays = input('33[33;1m请输入存款金额并确认存款,按Q取消存款>>>33[0m')
            if repays.capitalize() == 'Q':
                break
            else:
                if repays.isdigit():
                    repays = int(repays)
                    user_balance = fd["balance"] + repays       #当前存款=原存款+存款金额
                    with open(db_path_user,'w',encoding='utf-8') as fh:
                        res = fr.replace(str(fd["balance"]),str(user_balance))      #修改用户文件操作
                        fh.write(res)
                        print('33[33;1m尊敬的用户已为您成功存入 %s 元,您当前存款金额为 %s 元!33[0m'
                              %(repays,user_balance))
                    break
                else:
                    print('33[31;1m请输入有效存款金额33[0m')
        log = ('33[31;1m尊敬的用户已为您成功存入: %s元,您当前存款金额: %s元!33[0m'
               % (repays, user_balance))
        loggers.card_log(user_account["username"], log)
    
    def withdraw(user_account):
        '''
        定义一个用户提现函数
        :param user_account:
        :return:
        '''
        db_path_user = db_path + '\%s.json' % user_account["username"]
        with open(db_path_user, 'r',encoding='utf-8') as fh:
            fr = fh.read()
            fd = eval(fr)
        print("33[33;1m您的当前存款为:【¥%s】" % fd["balance"])
        print("33[33;1m您可提现额度为:【¥%s】" % fd["credit"])
        while True:
            repays = input('33[33;1m请输入提现金额,按Q取消提现>>>33[0m')
            if repays.capitalize() == 'Q':      #判断用户输入
                break
            else:
                if repays.isdigit():
                    repays = int(repays)
                    if repays > fd["credit"]:  #判断用户输入的提现金额是否大于现有存款
                        print('33[31;1m提现金额不得大于可提现额度33[0m')
                    else:
                        print('33[31;1m提现金额:【¥%s】     手续费:【¥%s】33[0m'%(repays,repays*0.05))
                        user_balance = fd["balance"] - (repays + repays * 0.05)  #提现后的用户余额
                        inputs = input('33[33;1m请确认提现金额,按任意键提现>>>33[0m')
                        if user_balance <= 0:       #判断结算后存款是否为负数,如结算后存款为负给出提示不让提现
                            print('33[31;1m当前存款不足以提现33[0m')
                        else:
                            user_credit = user_account["credit"] - repays  #提现后的可提现额度
                            print('33[31;1m尊敬的用户您已成功提现 %s 元!33[0m'% repays)
                            print("33[33;1m您的当前存款为:【¥%s】" % user_balance)
                            print("33[33;1m您可提现额度为:【¥%s】" % user_credit)
                            with open(db_path_user, 'w',encoding='utf-8') as fh:
                                res1 = fr.replace(str(fd["balance"]), str(user_balance)) #先扣除用户的余额
                                res2 = res1.replace(str(fd["credit"]), str(user_credit)) #然后扣除用户的可提现额度
                                fh.write(res2)   #将变更后的余额和提现额度重新写入json文本中
                            break
                else:
                    print('33[31;1m请输入有效提现金额33[0m')
        log = ("33[31;1m尊敬的用户您已成功提现: %s元 所剩存款: %s元 可提现金额为: %s元!33[0m"
               % (repays, user_balance, user_credit))           #打印日志内容
        loggers.card_log(user_account["username"], log)         #传递参数给card_log日志主函数
    
    
    def transfer(user_account):
        '''
        定义一个用户转账的函数
        :param user_account:
        :return:
        '''
        count = 0
        while count < 3:
            transfer = input('33[33;1m请输入需转账人用户名>>>33[0m')
            db_path_user1 = db_path + '\%s.json' % transfer   #需被转账用户
            db_path_user2 = db_path + '\%s.json' % user_account["username"] #当前用户
            if transfer == user_account["username"]:
                print('33[31;1m转账人不能是自己33[0m')
            else:
                if os.path.isfile(db_path_user1):  # 判断用户文件是否存在
                    with open(db_path_user1, 'r',encoding='utf-8') as fh:
                        frh = fh.read()
                        fd = eval(frh)       #需被转账用户
                    with open(db_path_user2,'r',encoding='utf-8') as fw:
                        frw = fw.read()
                        fc = eval(frw)      #当前用户
                        print('33[33;1m转账用户信用卡号为:33[0m 33[32;1m %s 33[0m'%fd["cardid"])
                        while True:
                            money = input('33[33;1m请输入需转账金额:33[0m')
                            if money.isdigit():
                                money = int(money)
                                if money > fc["balance"]:       #判断转账金额是否大于存款
                                    print('33[31;1m对不起您的存款不足,无法转账33[0m')
                                else:
                                    print('33[31;1m转账用户卡号:【%s】     转账金额:【¥%s】33[0m'
                                          % (fd["cardid"],money))
                                    inputs = input('33[33;1m请再次确认转账信息数据:按Q取消>>>33[0m')
                                    if inputs.capitalize() == 'Q':
                                        break
                                    else:
                                        user_balance1 = fc["balance"] - money   #当前用户转账后余额
                                        with open(db_path_user2,'w',encoding='utf-8') as fw:
                                            res1 = frw.replace(str(fc["balance"]),str(user_balance1))
                                            fw.write(res1)
                                            print('33[33;1m您转账后存款为:【¥%s】'%user_balance1)
                                        user_balance2 = fd["balance"] + money   #需被转账用户转账后余额
                                        with open(db_path_user1,'w',encoding='utf-8') as fh:
                                            res2 = frh.replace(str(fd["balance"]), str(user_balance2))
                                            fh.write(res2)
                                        log = ('33[31;1m您为卡号:%s 用户转账: %s元 您当前存款金额: %s元!33[0m'
                                               % (fd["cardid"], money, user_balance1))
                                        loggers.card_log(user_account["username"], log)
                                break
                            else:
                                print('33[31;1m请输入有效转账金额33[0m')
                else:
                    count += 1
                    print('33[31;1m该用户不存在,请重新输入还剩 %s 次机会33[0m' % (3 - count))
    
            break
    
    def paycheck(user_account):
        if not os.path.isfile(log_path % user_account["username"]):
            print('33[31;1m当前用户无流水记录33[0m')
        else:
            with open(log_path % user_account["username"], 'r', encoding='utf-8') as fh:
                for line in fh:
                    print(line)

    shopping.py

    #-*- Coding:utf-8 -*-
    # Author: D.Gray
    import os,sys,logging
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)
    shop_path = BASE_DIR+r'dbproduct_list'
    shop_car_path = BASE_DIR+r'dbshop_car'
    db_path = BASE_DIR + r'dbuser_info'
    log_path = BASE_DIR+r'logshop_log\%s_shop.log'
    from core import main
    from log import loggers
    
    def shopping(user_account):
        '''
        定义一个购物商城函数
        :param user_account:
        :return:
        '''
        shopcar_list,pro_list = [],[]     #shopcar_list:购物车列表   pro_list:商品清单列表
        with open(shop_path,'r',encoding='utf-8') as fh:
            for item in fh:
                pro_list.append(item.strip('
    ').split())
        def shop_info():
            print("	编号			商品			价格")
            for index,item in enumerate(pro_list):
                print('	 %s			%s		%s'%(index,item[0],item[1]))
        while True:
            print(("33[32;0m目前商城在售的商品信息33[0m").center(40, "-"))
            shop_info()
            choice_id = input("
    33[34;0m选择要购买的商品编号 【购买 ID】/【返回 b】33[0m:")
            if choice_id.isdigit():
                choice_id = int(choice_id)
                if choice_id < len(pro_list) and choice_id >= 0:    #判断用户选择商品编号是否大于商品清单列表最大值
                    pro_item = pro_list[choice_id]      #定义一个 pro_item 变量存储 用户选择的商品 信息和价格
                    num = input('33[34;1m选择商品数量>>>33[0m')
                    if num.isdigit():
                        num = int(num)
                        if num > 0:
                            print("33[31;0m商品 %s 加入购物车 价格%s 数量%s33[0m" % (pro_item[0], pro_item[1],num))
                            shopcar_list.append(pro_item)
                            shop_car_paths = shop_car_path+'\%s_shopcar.txt'%user_account['username']
                            with open(shop_car_paths,'a',encoding='utf-8') as fc:
                                fc.write(str('%s	%s	%s')%(pro_item[0],pro_item[1],num) +'
    ')
                        else:
                            print('33[31;1m购买数量不得为033[0m')
                    else:
                        print('33[31;1m请输入有效购买数量33[0m')
                else:
                    print("33[31;0m错误:没有相应的编号 请重新输入:33[0m
    ")
            elif choice_id == "b":
                main.shop_info()
            else:
                print("33[31;0m错误:没有相应的编号 请重新输入:33[0m
    ")
    #shopping()
    
    def shop_car(user_account):
        '''
        定义一个购物车函数
        :param user_account:
        :return:
        '''
        money_list,product_list= [],[]
        product_info = ''
        shop_car_paths = shop_car_path + '\%s_shopcar.txt' % user_account['username']
        if not os.path.isfile(shop_car_paths):
            print('33[31;1m您还未有购物记录,请先进入商城购物33[0m')
            shopping(user_account)
        else:
            with open(shop_car_paths,'r',encoding='utf-8')as fc:
                print(('33[32;1m购物车清单33[0m').center(32, '-'))
                print("编号		商品		价格		数量")
                lock_list = fc.readlines()
                for index ,lock_info in enumerate(lock_list):
                    lock = lock_info.split()
                    product_name = lock[0]
                    money = lock[1]
                    num = lock[2]
                    print('%s		%s	%s		%s'%(index,product_name,money,num))
                    moneys = int(money)*int(num)            #定义moneys变量来计算 单个商品总金额 = 商品金额*数量
                    product_info = '%s商品%s件'%(product_name,num)  #定义打印商品名称及数量 字符串
                    money_list.append(moneys)                   #将单个商品总金额 添加至 金额列表中
                    product_list.append(product_info)           #将product_info添加至 购物信息列表中
    
            if sum(money_list) == 0 :           #  sum(money_list) = 购物车所有商品总金额
                print('33[31;1m购物车空空如也33[0m')
            else:
                db_path_user = db_path + '\%s.json' % user_account["username"]
                with open(db_path_user, 'r',encoding='utf-8') as fh:
                    fr = fh.read()
                    fd = eval(fr)
                print('
    33[33;0m您当前余额为 %s 元  当前商品金额为 %s 元'%(fd['balance'],sum(money_list)))
                go_shop = input("
    33[34;0m是否选择购买 "
                                "【任意键:购买】/【返回 b】33[0m:")  #使用sum方法求出购物车商品总支付金额
                if go_shop == 'b':
                    main.shop_info()
                else:
    
                    if sum(money_list) < fd["balance"]:  #判断用户余额买得起购物商品
                        balance = fd["balance"] - sum(money_list)  # 当前余额 = 原余额-商品总额
                        log = ('33[31;1m尊敬的用户您已成功购物 %s ,购物总额为 %s 元,您购物后余额: %s元!33[0m'
                               %(str(product_list),sum(money_list),balance))
                        loggers.shop_log(user_account['username'],log)  # 调用购物日志打印函数
                        print("33[33;1m购物成功!!!您购物后余额为:【¥%s】33[0m" % balance)
                        with open(db_path_user,'w',encoding='utf-8') as fh:
                            res = fr.replace(str(fd["balance"]), str(balance))  # 修改用户文件操作
                            fh.write(res)
                        with open(shop_car_paths,'w',encoding='utf-8') as fc:
                            fc.truncate()   #购物支付完成后 购物车文件清空
                    else:
                        print("33[31;0m对不起您的余额不足无法购买:33[0m
    ")
        main.shop_info()
    
    def center(user_account):
        '''
        定义一个查看购物记录的函数
        :param user_account:
        :return:
        '''
        if not os.path.isfile(log_path % user_account["username"]):
            print('33[31;1m当前用户无流水记录33[0m')
        else:
            with open(log_path % user_account["username"], 'r', encoding='utf-8') as fh:
                for line in fh:
                    print(line)
        main.shop_info()

    Github

    https://github.com/KongChan1988/51CTO-Treasure/tree/master/Python_Study/%E7%AC%AC%E4%BA%8C%E6%A8%A1%E5%9D%97%E5%AD%A6%E4%B9%A0/Day02/HomeWork/%E4%BF%A1%E7%94%A8%E5%8D%A1%E5%95%86%E5%9F%8E

  • 相关阅读:
    eclipse
    Java SE Runtime Environment
    开源免费的LittleV GUI
    【转】 ARM Cortex-M 系列 MCU 错误追踪库 CmBacktrace
    【转】博客美化(7)推荐几个优秀的自定义博客
    【转】博客美化(6)为你的博文自动添加目录
    【转】博客美化(5)为博客或系统添加一个强大的评论系统
    【转】博客美化(4)为博客添加一个智能的文章推荐插件
    linux管理进程的链表
    连连看游戏(dfs)【华为上机题目】
  • 原文地址:https://www.cnblogs.com/catepython/p/7876709.html
Copyright © 2020-2023  润新知