首页 > 其他分享 >ATM无参装饰器

ATM无参装饰器

时间:2023-12-15 09:22:55浏览次数:26  
标签:无参 username ATM pwd user balance data 装饰 bank

ATM无参装饰器版

注册 : 存储到文件中 用户名 - 登录密码-权限

登录 : 直接将用户信息从文件中取出,然后进行比对 用户名 - 密码

取款 : 验证你的取款密码,更改余额 余额(1000) ,记录你的提款信息 -- 文件里 - 加时间

转账 : 验证你的取款密码,更改余额 目标银行卡号去转 记录你的提款信息 -- 文件里

查看流水:查看存入文件的流水

查看银行信息:(查看自己的卡号、余额、流水等信息)

初始化银行信息:初始化银行卡密码和卡号,默认余额1000

退出:退出程序


# author : heart
# blog_url : https://www.cnblogs.com/ssrheart/
# time : 2023/12/14
import time

login_user_dict = {'username': '',
                   'role': '',
                   "bank_id": '',
                   "bank_pay_pwd": "",
                   "balance": ""
                   }


def create_data(tag, **kwargs):
    if tag == 'pwd':
        data = ('|').join(kwargs.values())
        return data
    if tag == 'bank':
        data = ('|').join(kwargs.values())
        return data


def save_data(path, data):
    with open(path, 'a', encoding='utf-8') as f:
        f.write(data + "\n")


def read_data(path,tag=None):
    user_pwd_dict = {}  # 存放用户信息的字典
    bank_pwd_dict = {}  # 存放银行卡信息的字典
    user_flow_list = []  # 存放流水信息的字典
    with open(path, 'r', encoding='utf-8') as f:
        data = f.read()
    data_list = data.split('\n')
    data_list.pop()
    if tag == 'pwd':
        for data in data_list:
            username, password, role = data.split("|")
            user_pwd_dict[username] = {'password': password, 'role': role}
        return user_pwd_dict
    elif tag == 'bank':
        for data in data_list:
            username, pay_pwd, bank_id, balance = data.split('|')
            bank_pwd_dict[username] = {'bank_id': bank_id, 'pay_pwd': pay_pwd, 'balance': balance}
        return bank_pwd_dict
    elif tag == 'flow':
        for data in data_list:
            user_flow_list.append(data)
        return user_flow_list


# 获取用户名和密码
def get_user_pass():
    username = input('请输入用户名:>>>').strip()
    password = input('请输入密码:>>>').strip()
    return username, password


def register():
    username, password = get_user_pass()
    if username == 'heart' and password == '123':
        role = 'admin'
    else:
        role = 'normal'
    pwd_info = create_data(tag='pwd', username=username, password=password, role=role)
    save_data(path='user_pwd_info.txt', data=pwd_info)
    save_data('user_log.txt', f'{username}注册成功!|时间为 {time.strftime("%x %X")}')
    return True, f'{username}注册成功!'


# register()

def login():
    username, password = get_user_pass()
    user_pwd_dict = read_data(tag='pwd',path='user_pwd_info.txt')
    user_data = user_pwd_dict.get(username)
    if username not in user_pwd_dict:
        return False, f'请先注册!'
    if password != user_data.get('password'):
        return False, f'密码错误!'
    login_user_dict['username'] = username
    login_user_dict['role'] = user_data.get('role')
    save_data('user_log.txt', f'{username}登录成功!|时间为 {time.strftime("%x %X")}')
    return True, f'{username}登陆成功!'


# login()

def login_auth(func):
    def inner(*args, **kwargs):
        if not login_user_dict['username']:
            return False, f'必须先登录'
        if not login_user_dict['bank_id'] and func.__name__ != 'init_bank_info':
            return False, f'必须先初始化信息!'
        return func(*args, **kwargs)

    return inner


# 在装饰器内部完成 --- 格式校验。位数校验。数字余额校验
# 【输入银行卡号】 +++ 符合六位数
# 【输入支付密码】 +++ 符合指定的位数
# balance = input("请输入金额 :>>>> ").strip() # 余额是数字类型并且余额大于0小于你的余额
# bank_id = input("请输入银行卡号 :>>>> ").strip() # 确认是数字并且是六位
# bank_pwd = input("请输入银行卡号 :>>>> ").strip()# 确认是数字并且是三位
def outer(func):
    def inner(*args, **kwargs):
        pay_pwd = input('请输入取款密码:>>>').strip()
        if not pay_pwd.isdigit():
            return False,f'必须是数字!'
        if len(pay_pwd) != 3:
            return False,f'必须是3位数!'
        card_id = input('请输入银行卡号:>>>').strip()
        if not card_id.isdigit():
            return False,f'必须是数字!'
        if len(card_id) != 6:
            return False,f'必须是6位数!'
        balance = input('请输入取款金额:>>>').strip()
        if not balance.isdigit():
            return False,f'必须是数字!'
        if int(balance) > int(login_user_dict['balance']):
            return False,f'余额不足! 剩余余额:{login_user_dict["balance"]}'
        return func(pay_pwd=pay_pwd,card_id=card_id,balance=balance,*args,**kwargs)
    return inner


## 取款 :  验证你的取款密码,更改余额   余额(1000) ,记录你的提款信息 -- 文件里 - 加时间
@login_auth
@outer
def get_balance(*args,**kwargs):
    balance=kwargs.get('balance')
    pay_pwd=kwargs.get('pay_pwd')
    card_id=kwargs.get('card_id')
    res = int(login_user_dict['balance']) - int(balance)
    login_user_dict['balance'] = str(res)
    username = login_user_dict['username']
    get_data = create_data(tag='bank',username=username,pay_pwd=pay_pwd,card_id=card_id,balance=str(res))
    save_data('user_bank_info.txt',get_data)
    save_data('user_flow.txt',f'当前用户{username}提取金额:{balance}!|时间为 {time.strftime("%x %X")}')
    return True,f'当前用户{username} 取款 {balance},当前余额{res}'
# get_balance()
@login_auth
def init_bank_info():
    username = login_user_dict['username']
    pay_pwd = input('请输入银行卡密码:>>>').strip()
    card_id = input('请输入银行卡号:>>>').strip()
    balance = 1000
    bank_init_info = create_data(tag='bank', username=username, pay_pwd=pay_pwd, card_id=card_id, balance=str(balance))
    # print(bank_init_info) # heart|1234|123|1000
    save_data('user_bank_info.txt', bank_init_info)
    login_user_dict['bank_pay_pwd'] = pay_pwd
    login_user_dict['bank_id'] = card_id
    login_user_dict['balance'] = str(balance)
    print(login_user_dict)
    save_data('user_log.txt', f'{username}初始化成功!|时间为 {time.strftime("%x %X")}')
    return True, f'{username} 信息初始化成功!'

def outter(func):
    def inner(*args,**kwargs):
        pay_pwd = input('请输入存款密码:>>>').strip()
        if not pay_pwd.isdigit():
            return False, f'必须是数字!'
        if len(pay_pwd) != 3:
            return False, f'必须是3位数!'
        card_id = input('请输入银行卡号:>>>').strip()
        if not card_id.isdigit():
            return False, f'必须是数字!'
        if len(card_id) != 6:
            return False, f'必须是6位数!'
        balance = input('请输入存款金额:>>>').strip()
        if not balance.isdigit():
            return False, f'必须是数字!'

        return func(pay_pwd=pay_pwd, card_id=card_id, balance=balance, *args, **kwargs)
    return inner
@login_auth
@outter
def add_balance(*args,**kwargs):
    balance=kwargs.get('balance')
    pay_pwd=kwargs.get('pay_pwd')
    card_id=kwargs.get('card_id')
    res = int(login_user_dict['balance']) + int(balance)
    login_user_dict['balance'] = str(res)
    username = login_user_dict['username']
    get_data = create_data(tag='bank',username=username,pay_pwd=pay_pwd,card_id=card_id,balance=str(res))
    save_data('user_bank_info.txt',get_data)
    save_data('user_flow.txt',f'当前用户{username}存入金额:{balance}!|时间为 {time.strftime("%x %X")}')
    return True,f'当前用户{username} 存款 {balance},当前余额{res}'
# init_bank_info()

@login_auth
def check_flow():
    user_info = read_data(tag='flow',path='user_flow.txt')
    print(user_info)
    count=0
    print(f"************* 流水打印开始 *************")
    for flow in user_info:
        count +=1
        print(f'当前第{count}条流水 :>>> {flow}')
        print(f"************* 流水打印结束 *************")
    return True,f' ----- 流水打印完成! ----- '


@login_auth
def check_bank_info():
    user_bank_dict = read_data(tag='bank', path='user_bank_info.txt')
    username = login_user_dict['username']
    user_bank_data = user_bank_dict[username]
    print(f'''
    ------ 当前用户 {username} 信息如下 ------ 
        用   户 :>>>> {username}
        支付密码 :>>>> {user_bank_data['pay_pwd']}
        银行卡号 :>>>> {user_bank_data['bank_id']}
        银行余额 :>>>> {user_bank_data['balance']}
    ''')
    return True, f'当前用户 {username} :>>>> 银行信息查看完成 !'


def back():
    return True,f'欢迎再次使用!'


func_menu = '''
===================用户功能菜单=====================
                  1.注册
                  2.登陆
                  3.取款
                  4.存款
                  5.查看流水
                  6.查看银行信息(查看自己的卡号、余额、流水等信息)
                  7.初始化银行信息
                  8.退出
                  
======================欢迎使用=======================
'''

func_dict = {
    '1': register,
    '2': login,
    '3': get_balance,
    '4': add_balance,
    '5': check_flow,
    '6': check_bank_info,
    '7': init_bank_info,
    '8': back
}


def main():
    while True:
        print(func_menu)
        func_id = input('请输入功能id:>>>').strip()
        if func_id not in func_dict.keys():
            print('不存在!')
            continue
        func = func_dict[func_id]
        flag, msg = func()
        if flag:
            print(msg)
            if msg == '欢迎再次使用!':
                break
        else:
            print(msg)
            continue


if __name__ == '__main__':
    main()

标签:无参,username,ATM,pwd,user,balance,data,装饰,bank
From: https://www.cnblogs.com/ssrheart/p/17902645.html

相关文章

  • 装饰器
    装饰器1.装饰器再不修改被装饰对象的源代码和调用方式的的前提下为装饰对象添加额外的功能1.1装饰器分类分为无参装饰器和有参装饰器无参装饰器#无参装饰器模版defouter(func):definner():'''这里写调用func函数之前的逻辑'''res=func()......
  • Python项目之ATM1.0多模块函数
    ATM1.0多模块【作业】#ATM:提款姬#===================用户功能菜单=====================#1.注册#2.登陆#3.取款#4.转账#5.充值余额#6.查看流......
  • Python项目之ATM1.0单模块函数版
    ATM1.0【作业】#ATM:提款姬#===================用户功能菜单=====================#1.注册#2.登陆#3.取款#4.转账#5.充值余额#6.查看流水#......
  • 九、@Watch装饰器:状态变量更改通知
    @Watch应用对状态变量的监听。如果开发者需要关注某个状态变量的值是否改变,可以使用@Watch为状态变量这种回调函数。@Watch用于监听状态变量的变化,当状态变量变化时,@Watch的回调方法将被调用。@Watch在ArkUI框架内部判断数值有无更新使用的是严格相等(===),遵循严格相等规范。当在严......
  • 装饰器
    装饰器一、什么是装饰器通俗的讲就是用来装饰对象的工具,这里被装饰的对象和用来装饰的装饰器都可以可以是任意的课调用的对象概括的来讲,装饰器就是在不修改被装饰对象的源代码和调用方式的基础下为被装饰对象添加额外的功能二、装饰器的用途装饰器在装饰时,应避免修改被装......
  • 装饰器
    装饰器(一)什么是装饰器装饰:代指为被装饰对象添加新的功能。器:代指器具/工具。装饰器与被装饰对象均可以是任意可调用对象。装饰器定义:在不修改被装饰对象源代码和调用方式的前提下为呗装饰对象添加额外的功能。装饰器经常用于有切莫需求的场景插入日志、性能测试、事......
  • 装饰器
    【一】装饰器装饰器(Decorator)是一种用于修改函数或类行为的特殊函数。它可以在不修改原始函数或类定义的情况下,通过添加额外的功能或行为来扩展其功能。装饰器的主要作用是增强函数或类的功能,常见的应用场景包括:函数装饰器:函数装饰器可以在不修改原函数代码的情况下,对函数进行......
  • Python高级之装饰器
    装饰器【一】装饰器介绍装饰器的由来软件的设计应该遵循开放封闭原则,即对扩展是开放的,而对修改是封闭的。对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改封闭,意味着对象一旦设计完成,就可以独立完成其工作,而不要对其进行修改。软件包......
  • 装饰器模式
    装饰器,顾名思义,一个是待装饰者,一个是装饰者,就像我们早餐吃的煎饼,煎饼是待装饰者,其他的火腿、里脊、土豆丝、生菜等都是装饰者,但最终都没有改变这还是一个煎饼。这里代码上有两个重要的点,一个是装饰者会也会继承或者实现被装饰者,第二是装饰者的构造函数会有一个类型为待装饰者的参......
  • day21 atm项目 shopping_car
    shopping_car()fromatm.lib_common.file_handleimport*fromatm.core.shoppingimportgoods_showfromatm.lib_common.money_enquiryimport*defcompute_money_total(username):"""计算购物车总价返回购物车总价和购物车字典"""......