【一】功能概要
【1】注册
【2】登陆
【3】取款
【4】存款
【5】查看流水
【6】查看银行信息(查看自己的卡号、余额)
【7】初始化银行信息
【8】退出
【二】功能需求
【1】注册
(1)身份信息构成
- 身份信息包括:用户名、密码、角色
(2)参数验证
- 验证用户名是未注册过的用户名
- 验证密码为三位数并且是数字类型
(3)信息存储
- 将个人注册信息存储到指定文件 username_log.txt 文件中 日志格式为
当前用户 username 于 xx年xx月xx日 xx时xx分xx秒 注册成功
【2】登陆
(1)参数验证
- 验证用户名是已注册过的用户名
- 验证密码为三位数并且是数字类型
(2)信息存储
- 登陆成功后存储个人信息,以备后面不定期使用
- 登陆成功后存储个人银行信息,以备后面不定期使用
(3)信息存储
- 将个人登陆信息存储到指定文件 username_log.txt 文件中
- 登陆成功 : 将个人注册信息存储到指定文件 username_log.txt 文件中 日志格式为
当前用户 username 于 xx年xx月xx日 xx时xx分xx秒 登陆成功
【3】取款
(1)参数验证
- 当前为登录用户且银行卡初始化成功
- 验证支付密码必须是数字格式,并且符合三位
- 验证银行卡号必须是数字格式,并且符合六位
- 验证取款金额小于等于当前用户余额
(2)记录流水
- 需记录当前取款流水记录,流水信息包括,流水格式为
当前用户 username 于 xx年xx月xx日 xx时xx分xx秒 取出金钱 balance 余额为 res
(3)信息存储
- 将个人银行信息存储到指定文件 username_flow.txt 文件中
【4】存款
(1)参数验证
- 当前为登录用户且银行卡初始化成功
- 验证支付密码必须是数字格式,并且符合三位
- 验证银行卡号必须是数字格式,并且符合六位
(2)记录流水
- 需记录当前存款流水记录,流水信息包括,流水格式为
当前用户 username 于 xx年xx月xx日 xx时xx分xx秒 存入 balance 余额为 res
(3)信息存储
- 将个人银行信息存储到指定文件 username_bank.txt 文件中
【5】查看流水
(1)参数验证
- 当前为登录用户且银行卡初始化成功
【6】查看银行信息(查看自己的卡号、余额)
(1)参数验证
- 当前为登录用户且银行卡初始化成功
【7】初始化银行卡信息
(1)银行信息构成
- 银行信息包括:用户名、支付密码、余额、银行卡号
(2)参数验证
- 验证支付密码必须是数字格式,并且符合三位
- 验证银行卡号必须是数字格式,并且符合六位
- 给予初识余额 1000 元
(3)信息存储
- 记录日志到 username_flow.txt 中,日志格式为
username 于 xx年xx月xx日 xx时xx分xx秒 初始化成功 余额为 balance
- 将个人银行信息存储到指定文件 username_flow.txt 文件中
【8】退出
- 直接退出程序
【三】代码实现
# author : heart
# blog_url : https://www.cnblogs.com/ssrheart/
# time : 2023/12/16
import time
# 取款 : 验证你的取款密码,更改余额 余额(1000) ,记录你的提款信息 -- 文件里 - 加时间
# 转账 : 验证你的取款密码,更改余额 目标银行卡号去转 记录你的提款信息 -- 文件里
# 查看流水:查看存入文件的流水
# 查看银行信息:(查看自己的卡号、余额、流水等信息)
# 初始化银行信息:初始化银行卡密码和卡号,默认余额1000
# 退出:退出程序
login_auth_dict = {'username': '',
"is_admin": '',
'bank_id': '',
'bank_pwd': '',
'balance': ''
}
def read_data(tag, path):
user_pwd_dict = {}
user_info_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 == 'login' or tag == 'reg':
for data in data_list:
username, password, role = data.split('|')
user_pwd_dict[username] = {'password': password, 'role': role}
return user_pwd_dict
if tag == 'flow':
for data in data_list:
user_flow_list.append(data)
return user_flow_list
if tag =='info':
for data in data_list:
username,bank_id,bank_pwd,balance = data.split('|')
user_info_dict= {'username':username,'bank_id':bank_id,'bank_pwd':bank_pwd,'balance':balance}
return user_info_dict
def save_data(path, data):
with open(path, 'a', encoding='utf8') as f:
f.write(data + '\n')
def create_format(**kwargs):
data = '|'.join(kwargs.values())
return data
def get_user_pass():
username = input('请输入用户名:>>>').strip()
password = input('请输入密码:>>>').strip()
return username, password
# 注册 : 存储到文件中 用户名 - 登录密码-权限
def register():
username, password = get_user_pass()
reg_data = read_data(tag='reg',path=f'user_pwd.txt')
if username in reg_data:
return False,f'用户已存在!'
if not password.isdigit():
return False, '必须输入数字!'
if len(password) != 3:
return False, '必须是3位数!'
if username == 'heart' and password == '123':
role = 'admin'
else:
role = 'normal'
data_reg = create_format(username=username, password=password, role=role)
bank_data = create_format(username=username, bank_id='None', bank_pwd='None', balance='None')
save_data(path='user_pwd.txt', data=data_reg)
save_data(path=f'{username}_log.txt', data=f'用户{username} 于 {time.strftime("%x %X")} 注册成功! 银行卡未激活!')
save_data(path=f'{username}_bank.txt', data=bank_data)
return True, f'{username} 注册成功!'
# register()
# 登录 : 直接将用户信息从文件中取出,然后进行比对 用户名 - 密码
def login():
username, password = get_user_pass()
if not password.isdigit():
return False, '必须输入数字!'
if len(password) != 3:
return False, '必须是3位数!'
data = read_data(tag='login', path='user_pwd.txt')
data_dict = data.get(username)
if username not in data:
return False, '用户未注册!'
if password != data_dict.get('password'):
return False, '密码错误!'
login_auth_dict['username'] = username
login_auth_dict['is_admin'] = data_dict.get('role')
save_data(f'{username}_log.txt', data=f'用户{username} 于 {time.strftime("%x %X")}登陆成功!')
return True, f'{username}登陆成功!'
# login()
def login_auth(func):
def inner(*args, **kwargs):
if not login_auth_dict['username']:
return False, '必须先登录!'
if not login_auth_dict['bank_id'] and func.__name__ != 'init_bank_info':
return False, '必须先初始化银行卡!'
return func(*args, **kwargs)
return inner
@login_auth
def init_bank_info():
bank_id = input('请输入你的银行卡号:>>>').strip()
if not bank_id.isdigit():
return False, '请输入数字!'
if len(bank_id) != 6:
return False, '银行卡号必须是6位数!'
bank_pwd = input('请输入你的银行卡密码:>>>').strip()
if not bank_pwd.isdigit():
return False, '请输入数字!'
if len(bank_pwd) != 3:
return False, '密码必须是3位数!'
data = login_auth_dict["username"]
login_auth_dict['bank_id'] = bank_id
login_auth_dict['bank_pwd'] = bank_pwd
login_auth_dict['balance'] = '1000'
save_data(path=f'{data}_flow.txt', data=f'{data} 于 {time.strftime("%x %X")} 初始化银行卡成功! 当前余额{login_auth_dict["balance"]} 元')
bank_data = create_format(username=data, bank_id=bank_id, bank_pwd=bank_pwd, balance=login_auth_dict['balance'])
save_data(path=f'{data}_bank.txt', data=bank_data)
return True, f'{login_auth_dict["username"]} 初始化银行卡成功! 当前余额{login_auth_dict["balance"]} 元!'
def outer(func):
def inner(*args, **kwargs):
balance = input('请输入取款金额:>>>').strip()
if not balance.isdigit():
return False, '请输入数字!'
if int(balance) > int(login_auth_dict['balance']):
return False, '余额不足!'
bank_id = input('请输入你的银行卡号:>>>').strip()
if not bank_id.isdigit():
return False, '请输入数字!'
if len(bank_id) != 6:
return False, '银行卡号必须是6位数!'
if bank_id != login_auth_dict['bank_id']:
return False, '银行卡号不正确!'
bank_pwd = input('请输入你的银行卡密码:>>>').strip()
if not bank_pwd.isdigit():
return False, '请输入数字!'
if len(bank_pwd) != 3:
return False, '密码必须是3位数!'
if bank_pwd != login_auth_dict['bank_pwd']:
return False, '密码不正确!'
return func(balance=balance, bank_id=bank_id, bank_pwd=bank_pwd, *args, **kwargs)
return inner
# 取款 : 验证你的取款密码,更改余额 余额(1000) ,记录你的提款信息 -- 文件里 - 加时间\
@login_auth
@outer
def get_balance(*args, **kwargs):
balance = kwargs.get('balance')
bank_id = kwargs.get('bank_id')
bank_pwd = kwargs.get('bank_pwd')
username = login_auth_dict["username"]
res = int(login_auth_dict['balance']) - int(balance)
login_auth_dict['balance'] = str(res)
data1 = create_format(username=username, bank_id=bank_id, bank_pwd=bank_pwd, res=str(res))
save_data(f'{username}_bank.txt', data=data1)
save_data(f'{username}_flow.txt',
data=f'用户 {username} 于 {time.strftime("%x %X")} 取款 {balance}元! 当前余额{res}元!')
return True, f'用户{username} 取款{balance}元 剩余余额{res}元!'
def outter(func):
def inner(*args, **kwargs):
balance = input('请输入存款金额:>>>').strip()
if not balance.isdigit():
return False, '请输入数字!'
bank_id = input('请输入你的银行卡号:>>>').strip()
if bank_id != login_auth_dict['bank_id']:
return False, '银行卡号不正确!'
if not bank_id.isdigit():
return False, '请输入数字!'
if len(bank_id) != 6:
return False, '银行卡号必须是6位数!'
bank_pwd = input('请输入你的银行卡密码:>>>').strip()
if bank_pwd != login_auth_dict['bank_pwd']:
return False, '密码不正确!'
if not bank_pwd.isdigit():
return False, '请输入数字!'
if len(bank_pwd) != 3:
return False, '密码必须是3位数!'
return func(balance=balance, bank_id=bank_id, bank_pwd=bank_pwd, *args, **kwargs)
return inner
@login_auth
@outter
def add_balance(*args, **kwargs):
username = login_auth_dict["username"]
balance = kwargs.get('balance')
bank_id = kwargs.get('bank_id')
bank_pwd = kwargs.get('bank_pwd')
res = int(login_auth_dict['balance']) + int(balance)
login_auth_dict['balance'] = str(res)
data1 = create_format(username=username, bank_id=bank_id, bank_pwd=bank_pwd, res=str(res))
save_data(f'{username}_bank.txt', data=data1)
save_data(f'{username}_flow.txt',
data=f'用户 {username} 于 {time.strftime("%x %X")} 存款 {balance}元! 当前余额{res}元!')
return True, f'用户{username} 存款{balance}元 剩余余额{res}元!'
@login_auth
def check_flow():
username = login_auth_dict['username']
data_list = read_data(tag='flow', path=f'{username}_flow.txt')
count = 0
print(f"************* 流水打印开始 *************")
for data in data_list:
count += 1
print(f'当前第{count}条流水 :>>> {data}')
print(f"************* 流水打印结束 *************")
return True, f'{username}流水打印完成!'
@login_auth
def check_bank_info():
username = login_auth_dict['username']
data_info = read_data(tag='info',path=f'{username}_bank.txt')
card_id = data_info.get('bank_id')
balance = data_info.get('balance')
return True,f'用户{username} 卡号为{card_id} 当前余额{balance}'
def back():
print('欢迎再次使用!')
return True, 'back'
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:
if msg == 'back':
break
print(msg)
else:
print(msg)
continue
main()
标签:username,return,面条,ATM1.0,test,balance,data,id,bank
From: https://www.cnblogs.com/ssrheart/p/17912354.html