ATM1.0面条版test

发布时间 2023-12-18 21:41:55作者: ssrheart

【一】功能概要

【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()