ATM1.2多模板二版
Gitee仓库

功能介绍
| func_menu = |
| ''' |
| ========================ATM========================= |
| 1.注册 2.登录 3.激活银行卡 |
| 4.取款 5.转账 6.充值 |
| 7.个人日志 8.个人流水 9.个人信息 |
| 10.退出系统 |
| ======================欢迎使用======================= |
| ''' |
代码展示
bin
| |
| |
| from conf import config |
| from core.system_src import main_system |
| |
| if __name__ == '__main__': |
| main_system() |
conf
| |
| |
| |
| |
| import os |
| import time |
| import json |
| |
| |
| BASE_DIR = os.path.dirname(os.path.dirname(__file__)) |
| |
| |
| DB_DIR = os.path.join(BASE_DIR, 'database') |
| LOG_DIR = os.path.join(BASE_DIR, 'log') |
| |
| |
| |
| USER_DATA_DIR = os.path.join(DB_DIR, 'all_user_data') |
| |
| BANK_DATA_DIR = os.path.join(DB_DIR, 'bank_data') |
| |
| LOG_LOG_DIR = os.path.join(LOG_DIR, 'user_log') |
| |
| LOG_FLOW_DIR = os.path.join(LOG_DIR, 'user_flow') |
| |
| |
| path_list = [] |
| path_list.append(BASE_DIR) |
| path_list.append(DB_DIR) |
| path_list.append(LOG_DIR) |
| path_list.append(USER_DATA_DIR) |
| path_list.append(BANK_DATA_DIR) |
| path_list.append(LOG_LOG_DIR) |
| path_list.append(LOG_FLOW_DIR) |
| |
| |
| check_file_path = os.path.join(USER_DATA_DIR, 'user_pwd.json') |
| |
| |
| def creat_folder(*args): |
| try: |
| for path in args: |
| if not os.path.exists(path): |
| os.mkdir(path) |
| print(f"所需文件夹 {os.path.basename(path)} 创建成功 >>>>>> 可在{path}查看!") |
| if not os.path.exists(check_file_path): |
| |
| with open(file=check_file_path, mode='w', encoding='utf8') as fp: |
| init_json = {'Init': {'username': '', 'password': ''}} |
| json.dump(init_json, fp, ensure_ascii=False) |
| fp.flush() |
| print(f"所需文件 {os.path.basename(check_file_path)} 创建成功 >>>>>> 可在{check_file_path}查看!") |
| print("所需文件全部创建成功,马上进入系统!") |
| time.sleep(1) |
| except Exception as e: |
| print(f"意料之外的错误!错误信息{e}") |
| |
| |
| config = creat_folder(*path_list) |
| |
core
| |
| |
| |
| |
| |
| |
| |
| |
| |
| import datetime |
| from database import read_data, save_data, creat_path |
| from core.user_src import login_user_dict, check_login, creat_flow, creat_log |
| |
| |
| |
| def verify_format(tag): |
| def wrapper(func): |
| def inner(*args, **kwargs): |
| while True: |
| print("按Q退出输入".center(50, '-')) |
| |
| bank_id = input("请输入银行卡号:").strip() |
| if bank_id == 'Q': |
| return False, "已退出输入!" |
| if not bank_id.isidentifier() and len(bank_id) != 6: |
| print("银行卡号输入格式有误!请输入6位纯数字!") |
| continue |
| |
| elif tag != 'active' and bank_id != login_user_dict['bank_id']: |
| print("银行卡号输入有误!") |
| continue |
| count = 0 |
| if tag != 'recharge': |
| while count < 3: |
| pay_pwd = input("请输入交易密码:").strip() |
| if tag == 'active': |
| reconfirm = input("请重新确认交易密码:").strip() |
| if reconfirm == pay_pwd: |
| break |
| else: |
| print("输入有误,请重新输入!") |
| continue |
| if pay_pwd != login_user_dict['pay_pwd']: |
| print("交易密码输入错误,请重新输入!") |
| count += 1 |
| continue |
| else: |
| break |
| if tag == 'active': |
| return func(bank_id=bank_id, pay_pwd=pay_pwd) |
| balance = input("请输入交易金额:").strip() |
| if not balance.isdigit(): |
| print("金额输入格式有误,请重新输入!") |
| continue |
| balance = int(balance) |
| if tag == 'withdraw' or 'transfer': |
| if balance > login_user_dict['balance']: |
| print("余额不足!") |
| continue |
| break |
| return func(bank_id=bank_id, balance=balance) |
| |
| return inner |
| |
| return wrapper |
| |
| |
| def check_bank(tag): |
| def check_active(func): |
| def inner(*args, **kwargs): |
| flag, data = read_data(path=creat_path('bank', path=f"{login_user_dict['username']}_bank_info.json")) |
| if data[login_user_dict['username']]['bank_id'] != '' and tag == 'active': |
| return False, '请不要重复激活!' |
| elif data[login_user_dict['username']]['bank_id'] == '' and tag != 'active': |
| return False, '尚未激活银行卡,请先激活银行卡!' |
| else: |
| return func(*args, **kwargs) |
| |
| return inner |
| |
| return check_active |
| |
| |
| |
| @check_login |
| @check_bank('active') |
| @verify_format('active') |
| def activate_bank_id(**kwargs): |
| username = login_user_dict['username'] |
| flag, data = read_data(path=creat_path('bank', path=f"{username}_bank_info.json")) |
| bank_id = kwargs.get('bank_id') |
| pay_pwd = kwargs.get('pay_pwd') |
| |
| data[username] = {'bank_id': bank_id, 'pay_pwd': pay_pwd, 'balance': 1000} |
| |
| save_data(data, path=creat_path('bank', f"{username}_bank_info.json")) |
| |
| txt = f"{username}|激活银行卡|余额:0 - 1000 |时间为{datetime.datetime.now().strftime('%x %X')}" |
| creat_flow(txt=txt, username=username) |
| creat_log(txt=f"{username}|激活银行卡成功|时间为{datetime.datetime.now().strftime('%x %X')}", username=username) |
| return True, "激活银行卡成功!" |
| |
| |
| |
| @check_login |
| @check_bank('bank') |
| @verify_format('withdraw') |
| def withdraw_money(**kwargs): |
| login_flag, login_info = read_data(path=creat_path('bank', path=f"{login_user_dict['username']}_bank_info.json")) |
| balance = kwargs.get('balance') |
| login_info[login_user_dict['username']]['balance'] = login_user_dict['balance'] - balance |
| msg = save_data(login_info, path=creat_path('bank', path=f"{login_user_dict['username']}_bank_info.json")) |
| print(msg) |
| txt_login = f"{login_user_dict['username']}|取款{balance}元|余额:{login_user_dict['balance']}-{login_user_dict['balance'] - balance}|时间为{datetime.datetime.now().strftime('%x %X')}" |
| creat_flow(txt=txt_login, username=login_user_dict['username']) |
| return True, '' |
| |
| |
| |
| @check_login |
| @check_bank('bank') |
| @verify_format('transfer') |
| def transfer_money(**kwargs): |
| |
| balance = kwargs.get('balance') |
| reconfirm_balance = input(f"请重新确认转账金额{balance}(y/n):").strip() |
| if reconfirm_balance.upper() != 'Y': |
| return False, '' |
| payee = input("请输入收款方用户名:").strip() |
| flag, data_pwd = read_data(path=creat_path('pwd', path=f"user_pwd.json")) |
| if payee not in data_pwd.keys(): |
| return False, '对方尚未注册,请提示对方先注册!' |
| flag_info, data_info = read_data(path=creat_path('bank', path=f"{payee}_bank_info.json")) |
| login_flag, login_info = read_data(path=creat_path('bank', path=f"{login_user_dict['username']}_bank_info.json")) |
| |
| for i in range(2): |
| payee_bank_id = input("请输入收款方银行卡号:").strip() |
| if payee_bank_id != data_info[payee]['bank_id']: |
| print("收款方银行卡号输入有误,请重新输入!") |
| continue |
| else: |
| break |
| else: |
| return False, "转账失败!" |
| |
| |
| |
| login_info[login_user_dict['username']]['balance'] = login_user_dict['balance'] - balance |
| |
| data_info[payee]['balance'] = data_info[payee]['balance'] + balance |
| msg = save_data(login_info, path=creat_path('bank', path=f"{login_user_dict['username']}_bank_info.json")) |
| print(msg) |
| msg = save_data(data_info, path=creat_path('bank', path=f"{payee}_bank_info.json")) |
| print(msg) |
| |
| txt_login = f"{login_user_dict['username']}|转账给{payee} {balance}元|余额:{login_user_dict['balance']}-{login_user_dict['balance'] - balance}|时间为{datetime.datetime.now().strftime('%x %X')}" |
| creat_flow(txt=txt_login, username=login_user_dict['username']) |
| txt_payee = f"{payee}|收到{login_user_dict['username']}转账{balance}元|余额:{data_info[payee]['balance']}-{data_info[payee]['balance'] + balance}|时间为{datetime.datetime.now().strftime('%x %X')}" |
| creat_flow(txt=txt_payee, username=payee) |
| return True, '' |
| |
| |
| |
| @check_login |
| @check_bank('bank') |
| @verify_format('recharge') |
| def recharge(**kwargs): |
| login_flag, login_info = read_data(path=creat_path('bank', path=f"{login_user_dict['username']}_bank_info.json")) |
| balance = kwargs.get('balance') |
| login_info[login_user_dict['username']]['balance'] = login_user_dict['balance'] + balance |
| txt_login = f"{login_user_dict['username']}|充值{balance}元|余额:{login_user_dict['balance']}-{login_user_dict['balance'] + balance}|时间为{datetime.datetime.now().strftime('%x %X')}" |
| creat_flow(txt=txt_login, username=login_user_dict['username']) |
| return True, txt_login |
| |
| |
| @check_login |
| |
| def bank_info(): |
| login_flag, login_info = read_data(path=creat_path('bank', path=f"{login_user_dict['username']}_bank_info.json")) |
| print(f""" |
| 当前登录用户{login_user_dict['username']}的信息如下: |
| 银行卡号:{login_info[login_user_dict['username']]['bank_id']} |
| 当前余额:{login_info[login_user_dict['username']]['balance']} |
| """) |
| return True, '' |
| |
| |
| |
| from lib import encrypt_data, random_code |
| from database import read_data, save_data, creat_path, creat_data |
| from conf import LOG_LOG_DIR, LOG_FLOW_DIR |
| from functools import wraps |
| import datetime |
| import os |
| |
| login_user_dict = { |
| 'username': '', |
| 'bank_id': '', |
| 'pay_pwd': '', |
| 'balance': 0 |
| } |
| |
| |
| |
| def init_login_dict(username): |
| path_bank = creat_path(tag='bank', path=f'{username}_bank_info.json') |
| flag, data = read_data(path_bank) |
| login_user_dict['username'] = username |
| login_user_dict['bank_id'] = data[username]['bank_id'] |
| login_user_dict['pay_pwd'] = data[username]['pay_pwd'] |
| login_user_dict['balance'] = data[username]['balance'] |
| |
| |
| |
| def get_username_pwd(): |
| username = input("请输入用户名:").strip() |
| if not username.isidentifier(): |
| return False, '用户名不可以输入非法字符!' |
| password = input("请输入登录密码:").strip() |
| if len(password) < 4: |
| return False, '密码不可以少于4位!' |
| return username, password |
| |
| |
| |
| def login(): |
| |
| for i in range(2): |
| username, password = get_username_pwd() |
| |
| path = creat_path(tag='pwd', path='user_pwd.json') |
| flag, data = read_data(path=path) |
| if not flag: |
| return False, data |
| |
| if username not in data.keys(): |
| return False, "用户不存在" |
| user_dict = data.get(username) |
| |
| true_password = user_dict.get('password')[:-4] |
| |
| is_password = encrypt_data(password) |
| if true_password == is_password: |
| init_login_dict(username=username) |
| txt = f"{username}|登录成功|时间为{datetime.datetime.now().strftime('%x %X')}" |
| creat_log(txt=txt, username=username) |
| return True, txt |
| else: |
| print("密码错误!") |
| continue |
| return False, "登录失败!" |
| |
| |
| |
| def register(): |
| |
| path = creat_path(tag='pwd', path='user_pwd.json') |
| flag, data = read_data(path=path) |
| username, password = get_username_pwd() |
| if not username: |
| return False, password |
| if username in data.keys(): |
| return False, '用户名已存在!' |
| |
| code = random_code(4) |
| |
| code_input = input(f"请输入验证码:{code}\n验证码输入:>>>").strip() |
| if code.upper() != code_input.upper(): |
| return "验证码输入错误!" |
| |
| password = encrypt_data(password) |
| |
| salt = random_code(4) |
| password += salt |
| |
| data[username] = {'username': username, 'password': password} |
| |
| path_bank = creat_path(tag='bank', path=f'{username}_bank_info.json') |
| user_dict = creat_data(tag='new', username=username) |
| save_data(user_dict, mode='w', path=path_bank) |
| |
| msg = save_data(data=data, mode='w', path=path) |
| if msg == 'True': |
| txt = f"{username}|注册成功|时间为{datetime.datetime.now().strftime('%x %X')}" |
| creat_log(txt=txt, username=username) |
| return True, txt |
| else: |
| return False, msg |
| |
| |
| |
| |
| def creat_log(txt, username): |
| path = os.path.join(LOG_LOG_DIR, f'{username}_log.txt') |
| with open(path, 'a', encoding='utf8') as fp: |
| fp.write(txt + '\n') |
| fp.flush() |
| |
| |
| |
| def creat_flow(txt, username): |
| path = os.path.join(LOG_FLOW_DIR, f'{username}_flow.txt') |
| with open(path, 'a', encoding='utf8') as fp: |
| fp.write(txt + '\n') |
| fp.flush() |
| |
| |
| def check_login(func): |
| @wraps(func) |
| def inner(*args, **kwargs): |
| if login_user_dict['username'] != '': |
| flag, msg = func(*args, **kwargs) |
| return flag, msg |
| else: |
| return False, "请先登录!" |
| |
| return inner |
| |
| |
| @check_login |
| def check_log(): |
| path = os.path.join(LOG_LOG_DIR, f'{login_user_dict["username"]}_log.txt') |
| with open(path, 'r', encoding='utf8') as fp: |
| read_log = fp.read() |
| output = (f"当前登录用户{login_user_dict['username']}的日志如下:\n" |
| f"{read_log}") |
| return True, output |
| |
| |
| @check_login |
| def check_flow(): |
| path = os.path.join(LOG_FLOW_DIR, f'{login_user_dict["username"]}_flow.txt') |
| with open(path, 'r', encoding='utf8') as fp: |
| read_flow = fp.read() |
| output = (f"当前登录用户{login_user_dict['username']}的流水如下:\n" |
| f"{read_flow}") |
| return True, output |
| |
| |
| |
| |
| |
| from core.user_src import register, login |
| from core.user_src import check_log, check_flow |
| from core.bank_src import activate_bank_id, withdraw_money, transfer_money, recharge, bank_info |
| |
| import time |
| |
| |
| def quit_system(): |
| return True, 'break' |
| |
| |
| func_menu = ''' |
| ========================ATM========================= |
| 1.注册 2.登录 3.激活银行卡 |
| 4.取款 5.转账 6.充值 |
| 7.个人日志 8.个人流水 9.个人信息 |
| 10.退出系统 |
| ======================欢迎使用======================= |
| ''' |
| func_dict = { |
| 1: register, |
| 2: login, |
| 3: activate_bank_id, |
| 4: withdraw_money, |
| 5: transfer_money, |
| 6: recharge, |
| 7: check_log, |
| 8: check_flow, |
| 9: bank_info, |
| 10: quit_system |
| } |
| |
| |
| def main_system(): |
| |
| start_time = time.time() |
| while True: |
| |
| print(func_menu) |
| func_choice = input("请输入功能ID:>>>>").strip() |
| if not func_choice.isdigit(): |
| print(f"{func_choice}不是功能ID,请输入数字!") |
| continue |
| func_choice = int(func_choice) |
| if func_choice not in func_dict.keys(): |
| print(f"{func_choice}功能不存在,请重新选择!") |
| continue |
| func = func_dict[func_choice] |
| flag, msg = func() |
| if flag: |
| if msg == 'break': |
| print("系统已退出,欢迎下次使用!") |
| end_time = time.time() |
| use_time = end_time - start_time |
| print(f"本次系统共使用了{use_time}秒~") |
| break |
| print(msg) |
| else: |
| print(msg) |
| |
| |
| if __name__ == '__main__': |
| main_system() |
| |
database
| |
| |
| |
| |
| |
| |
| |
| import json |
| import os.path |
| from conf import USER_DATA_DIR |
| from conf import BANK_DATA_DIR |
| |
| |
| def creat_path(tag, path): |
| if tag == 'pwd': |
| path = os.path.join(USER_DATA_DIR, path) |
| elif tag == 'bank': |
| path = os.path.join(BANK_DATA_DIR, path) |
| return path |
| |
| |
| def read_data(path): |
| try: |
| with open(path, 'r', encoding='utf8') as fp: |
| data_dict = json.load(fp) |
| return True, data_dict |
| except FileNotFoundError: |
| return False, f"数据读取有误,请检查文件完整性!错误路径:{path}" |
| |
| |
| def creat_data(tag, **kwargs): |
| user_dict = {} |
| if tag == 'new': |
| user_dict = {kwargs.get('username'): {'bank_id': '', 'pay_pwd': '', 'balance': 0}} |
| |
| |
| return user_dict |
| |
| |
| def save_data(data, mode='w', path=None): |
| try: |
| with open(path, mode, encoding='utf8') as fp: |
| |
| json.dump(data, fp, ensure_ascii=False) |
| fp.flush() |
| return '数据更新成功!' |
| except Exception as e: |
| return f"意料之外的错误:{e}" |
| |
lib
| |
| |
| |
| import hashlib |
| import random |
| |
| |
| |
| def random_code(x): |
| code = '' |
| for i in range(x): |
| random_list = [str(random.randint(0, 9)), chr(random.randint(97, 122)), chr(random.randint(65, 90)), |
| random.randint(0, 9)] |
| code1 = str(random.choice(random_list)) |
| code += code1 |
| return code |
| |
| |
| |
| def encrypt_data(data): |
| md5 = hashlib.md5() |
| |
| data = data.encode('utf8') |
| |
| md5.update(data) |
| |
| encrypted_data = md5.hexdigest() |
| |
| return encrypted_data |
| |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库