Python项目之ATM1.0多模块函数

发布时间 2023-12-14 18:44:58作者: Lea4ning

ATM1.0多模块

【作业】
# ATM : 提款姬
# ===================用户功能菜单=====================
#                   1.注册
#                   2.登陆
#                   3.取款
#                   4.转账
#                   5.充值余额
#                   6.查看流水
#                   7.查看银行信息(查看自己的卡号、余额、流水等信息)
# ======================欢迎使用=======================

# def save_data(file_path,)

# user_pwd_dict ={}
# 文本 : dream-521
# dream,521
# user_info.txt : 每一个人的信息就是一行
# dream_flow.txt :

# print(time.localtime())

# 注册 : 存储到文件中 用户名 - 登录密码 - 年龄 - 银行卡号(1314) - 取款密码 - 余额(1000)
# 登录 : 直接将用户信息从文件中取出,然后进行比对 用户名 - 密码
# 取款 :  验证你的取款密码,更改余额   余额(1000) ,记录你的提款信息 -- 文件里 - 加时间
# 转账 : 验证你的取款密码,更改余额 目标银行卡号去转 记录你的提款信息 -- 文件里

image-20231214183252075

# main_system
# 主系统菜单 负责开始 结束 功能选择
from func import bank_info
from func import check_flow
from func import recharge
from func import transfer_money
from func import withdraw_money
from func import login
from func import register

'''func文件夹下__init__下的内容'''


# from bank_main import bank_info  # 卡号,余额,流水
# from bank_main import check_flow  # 查看余额
# from bank_main import recharge  # 充值
# from bank_main import transfer_money  # 转账
# from bank_main import withdraw_money  # 取款
# from login_register import login  # 登录
# from login_register import register  # 注册

def quit_system():
    return False, 'break'


func_menu = '''
===================用户功能菜单=====================
                  1.注册
                  2.登陆
                  3.取款
                  4.转账
                  5.充值余额
                  6.查看余额
                  7.查看银行信息(查看自己的卡号、余额、流水信息)
                  8.退出系统
======================欢迎使用=======================
'''
func_dict = {
    1: register,
    2: login,
    3: withdraw_money,
    4: transfer_money,
    5: recharge,
    6: check_flow,
    7: bank_info,
    8: quit_system
}


def main_system():
    # 【1】打印功能菜单
    while True:
        print(func_menu)
        func_id = input("请输入功能ID :>>>> ").strip()
        if not func_id.isdigit():
            print(f'{func_id} :>>>> 非法字符')
            continue
        func_id = int(func_id)
        if func_id not in func_dict.keys():
            print(f"{func_id} :>>>> 不存在该功能!")
            continue
        func = func_dict.get(func_id)
        flag, msg = func()
        if flag:
            print(msg)
        elif not flag and msg == 'break':
            print(f"欢迎下次使用!再见!")
            break
        else:
            print(msg)
            continue


main_system()
# __init__
# 列表菜单
from func.bank_main import bank_info, check_flow, recharge, transfer_money, withdraw_money
from func.login_register import login, register
# 卡号,余额,流水 查看余额 充值# 转账# 取款# 登录 # 注册
# bank_main
# 银行主要业务 查看信息 取款 转账 充值
from datetime import datetime
from func.wrapper import auth_login, func_choice
from func.check_info import login_user_dict, check_login, save_flow
from func.data_handle import save_data, read_data


def bank_info():  # 卡号,余额,流水
    flow = save_flow('read', login_user_dict['username'], '')
    msg = f'''
    当前登录用户{login_user_dict['username']}信息如下
    卡号:{login_user_dict['bank_id']}
    余额:{login_user_dict['balance']}
    流水如下:\n
{flow}'''
    return True, msg


def check_flow():  # 查看余额
    check_login()
    data_dict = read_data('info', 'all_info.txt')
    balance = data_dict[login_user_dict['username']]['balance']
    return True, f"当前登录用户{login_user_dict['username']},还剩余额{balance}"


@auth_login
@func_choice('recharge')
def recharge(*args, **kwargs):  # 充值
    check_login()
    data = read_data('info', 'all_info.txt')
    balance = kwargs.get('balance')
    user_new_balance = login_user_dict['balance'] + balance
    user_data = data[login_user_dict['username']]
    user_data['balance'] = user_new_balance
    flag, msg = save_data('info', username=login_user_dict['username'], **user_data)
    if flag:
        txt = f"充值{balance}元成功"
        save_flow('save', user=login_user_dict['username'],
                  txt=f"{txt}>>>时间为>>>{datetime.now().strftime('%Y年%m月%d日 %H时%M分%S秒')}")
        return flag, txt
    else:
        return flag, msg


@auth_login
@func_choice('withdraw')
def withdraw_money(**kwargs):  # 取款
    data = read_data('info', 'all_info.txt')
    balance = kwargs.get('balance')
    user_new_balance = login_user_dict['balance'] - balance
    user_data = data[login_user_dict['username']]
    user_data['balance'] = user_new_balance
    flag, msg = save_data('info', username=login_user_dict['username'], **user_data)
    if flag:
        txt = f"{login_user_dict['username']}取款{balance}元成功"
        save_flow('save', user=login_user_dict['username'],
                  txt=f"{txt}>>>时间为>>>{datetime.now().strftime('%Y年%m月%d日 %H时%M分%S秒')}")
        return flag, txt
    else:
        return flag, msg


@auth_login
@func_choice('transfer')
def transfer_money(**kwargs):  # 转账
    data = read_data('info', 'all_info.txt')
    balance = kwargs.get('balance')  # 转账金额
    for_bank_id = kwargs.get('bank_id')  # 收集到转账银行卡号
    user_new_balance = login_user_dict['balance'] - balance  # 所剩余额
    pay_dict = {'id': login_user_dict['bank_id'], 'pay_pwd': login_user_dict['bank_pay_pwd'],
                'balance': user_new_balance}
    save_data('info', username=login_user_dict['username'], **pay_dict)
    payee_dict = {}  # 收款人信息
    username = ''  # 收款人姓名
    for key, value in data.items():
        if for_bank_id == value['id']:
            username = key
            payee_dict[key] = value
    payee_dict[username]['balance'] += balance
    save_info = payee_dict[username]
    flag, msg = save_data('info', username=username, **save_info)
    if flag:
        txt = f"{login_user_dict['username']}成功转账给{username}>>>{balance}元"
        save_flow('save', user=login_user_dict['username'],
                  txt=f"{txt},时间为>>>{datetime.now().strftime('%Y年%m月%d日 %H时%M分%S秒')}")
        save_flow('save', user=username, txt=f"{txt},时间为>>>{datetime.now().strftime('%Y年%m月%d日 %H时%M分%S秒')}")
        return flag, txt
    else:
        return flag, msg
# check_info
# 校验 登录信息 注册信息
from datetime import datetime
from func.data_handle import read_data, save_flow, save_data

login_user_dict = {'username': '',
                   "bank_id": '',
                   "bank_pay_pwd": "",
                   "balance": 0
                   }  # 登录情况收集


def init_login_dict(user):
    data_dict = read_data('info', 'all_info.txt')
    login_dict = data_dict[user]
    login_user_dict['username'] = user
    login_user_dict['bank_id'] = login_dict['id']
    login_user_dict['bank_pay_pwd'] = login_dict['pay_pwd']
    login_user_dict['balance'] = int(login_dict['balance'])


# 登录验证
def check_login(**kwargs):
    username, password = kwargs.get('username'), kwargs.get('password')
    data_dict = read_data(tag='pwd', path='all_pwd.txt')
    # {'dream': {'pwd': '521'}, 'user': {'pwd': '001'}}
    if username not in data_dict:
        return False, f"用户名尚未注册!"
    if password != data_dict[username]['pwd']:
        return False, f"密码错误!"
    else:
        txt = f"{username}登录成功"
        save_flow('save', user=username,
                  txt=f"{txt}>>>时间为>>>{datetime.now().strftime('%Y年%m月%d日 %H时%M分%S秒')}")
        return True, txt


def check_info(**kwargs):
    username = kwargs.get('username')
    bank_id_pwd = ''
    balance = ''
    while True:
        print("信息录入".center(10, '>'))
        bank_id = input("请输入银行卡号(4位数字):").strip()
        if not bank_id.isdigit():
            print("银行卡号不可以出现非法字符!")
            continue
        elif len(bank_id) != 4:
            print("银行卡号必须4个字符!")
            continue
        bank_id_pwd = input("请输入取款密码(4位密码):").strip()
        if len(bank_id_pwd) > 4:
            print("请不要输入超过4个字符!")
            continue
        balance = 1000  # 默认注册时为1000
        break
    save_data('info', username=username, bank_id=bank_id, pay_pwd=bank_id_pwd, balance=balance)
# data_handle   # 其实应该用OS模块写的,但是还没有学透
# 信息处理 读数据 拼接字符串数据 写入文件

ABSOLUTE_PATH = r'D:\Files\Python\ATM\user_info\\'


def read_data(tag, path):
    try:
        with open(f"{ABSOLUTE_PATH}{path}", 'r', encoding='utf8') as fp:
            data = fp.read().split('\n')
            data_dict = {}
            for i in data:
                if i == '':
                    continue
                if tag == 'info':
                    username, bank_id, pay_pwd, balance = i.split('|')
                    data_dict[username] = {'id': bank_id, 'pay_pwd': pay_pwd, 'balance': int(balance)}
                elif tag == 'pwd':
                    username, password = i.split('|')
                    data_dict[username] = {'pwd': password}
            return data_dict
    except Exception as e:
        return f"文件读取失败,错误信息是{e}"


# 将数据转成字符串
def save_data(*args, **kwargs):
    save_dict = '|'.join([str(value) for value in kwargs.values()])
    if args[0] == 'info':
        flag, msg = save_file(path='all_info.txt', data=save_dict)
        return flag, msg
    elif args[0] == 'pwd':
        flag, msg = save_file(path='all_pwd.txt', data=save_dict)
        return flag, msg


# 将字符串写入文件中
def save_file(path, data):
    try:
        with open(f"{ABSOLUTE_PATH}{path}", 'a') as fp:
            fp.write(data + '\n')
            fp.flush()
            return True, "文件写入成功!"
    except Exception as e:
        return False, f"文件写入失败,错误信息:{e}"


# 将字符串写入流水中
def save_flow(state, user, txt):
    try:
        if state == 'save':
            with open(f'{ABSOLUTE_PATH}{user}_flow.txt', 'a', encoding='utf8') as fp:
                fp.write(txt + '\n')
        elif state == 'read':
            with open(f'{ABSOLUTE_PATH}{user}_flow.txt', 'r', encoding='utf8') as fp:
                return fp.read()
    except Exception as e:
        return f"文件写入/读取失败,错误信息为{e}"
# login_register
# 登录 注册
from datetime import datetime
from func.check_info import check_login, init_login_dict, check_info
from func.data_handle import save_data, save_flow


def get_name_pwd():
    username = input("用户名:").strip()
    password = input("密码:").strip()
    return username, password


def login():
    username, password = get_name_pwd()
    flag, msg = check_login(username=username, password=password)
    if flag:
        init_login_dict(user=username)
    return flag, msg


def register():
    print("注册系统".center(50, '-'))
    username, password = get_name_pwd()
    check_info(username=username, password=password)
    flag, msg = save_data('pwd', username=username, password=password)
    if flag:
        txt = f"{username}注册成功"
        print(txt)
        save_flow('login', user=username, txt=f"{txt}>>>时间为{datetime.now().strftime('%Y年%m月%d日 %H时%M分%S秒')}")
    return flag, msg
# wrapper
# 装饰器
from func.data_handle import read_data
from func.check_info import login_user_dict


def auth_login(func):
    def inner(*args, **kwargs):
        if not login_user_dict['username']:
            return False, '请先登录!'
        else:
            return func(*args, **kwargs)

    return inner


def func_choice(tag):
    def wrapper(func):
        def inner(*args, **kwargs):
            data = read_data('info', 'all_info.txt')
            user_dict = data[login_user_dict['username']]
            while True:
                balance = input("请输入金额:").strip()  # 判断金额是否符合格式
                if not balance.isdigit():
                    print(f"请不要输入非法字符,非法输入:{balance}")
                    continue
                balance = int(balance)
                if balance < 0:
                    print("不可以输入负数!")
                elif tag != 'recharge' and balance > user_dict['balance']:
                    print("余额不足!")
                    continue
                bank_id = input("请输入银行卡号:").strip()  # 判断银行卡号是否为登录用户的
                if bank_id != login_user_dict['bank_id'] and tag != 'transfer':
                    return False, "银行卡号与当前登录用户卡号不相符,请选择转账功能!"
                elif tag == 'transfer' and bank_id not in [value['id'] for key, value in data.items()]:
                    return False, "对方尚未注册该银行卡号!请提示对方进行注册!"
                elif tag == 'withdraw' and bank_id != login_user_dict['bank_id']:
                    return False, f"卡号{bank_id},输入有误,请检查"
                if tag != 'recharge':
                    count = 1
                    while True:
                        for_pay_pwd = input("请输入取款密码:")
                        if for_pay_pwd == login_user_dict['bank_pay_pwd']:
                            break
                        elif count == 4:
                            print("密码错误次数已达上限,请重新选择!")
                            break
                        else:
                            print(f"密码错误({count}/3次机会)")
                            count += 1
                            continue
                return func(balance=balance, bank_id=bank_id)

        return inner

    return wrapper