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