python完成ATM(分目录)
发布时间:2020-12-20 12:44:59 所属栏目:Python 来源:网络整理
导读:模块跳转: 常用模块 项目需求: 用**规范化项目目录**的格式模拟一个ATM系统。 项目功能: 1. 登录(可支持多个账户(非同时)登录)。 2. 注册。 3. 查看余额。 4. 存钱。 5. 转账(给其他用户转钱)。 6. 查看账户流水。 7. 退出 提供的思路:ATM直译就是取
模块跳转:常用模块 项目需求:用**规范化项目目录**的格式模拟一个ATM系统。 目录结构:? 具体代码:start.pyimport sys import os BASE_PATH = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_PATH) from core import src if __name__ == ‘__main__‘: src.run() settings.pyimport os import logging.config BASE_PATH = os.path.dirname(os.path.dirname(__file__)) user_path = os.path.join(BASE_PATH,‘db‘) LOGGING_PATH = os.path.join(BASE_PATH,‘log‘,‘admin.log‘) SIMPLE_FORMAT = ‘[%(asctime)s] %(message)s‘ LOGGING_DIC = { ‘version‘: 1,‘disable_existing_loggers‘: False,‘formatters‘: { ‘simple‘: { ‘format‘: SIMPLE_FORMAT,},‘filters‘: {},‘handlers‘: { # 打印到终端的日志 ‘stream‘: { ‘level‘: ‘DEBUG‘,‘class‘: ‘logging.StreamHandler‘,# 打印到屏幕 ‘formatter‘: ‘simple‘ },# 打印到文件的日志,收集info及以上的日志 ‘file‘: { ‘level‘: ‘DEBUG‘,‘class‘: ‘logging.handlers.RotatingFileHandler‘,# 保存到文件 ‘formatter‘: ‘simple‘,‘filename‘: LOGGING_PATH,# 日志文件 ‘maxBytes‘: 1024 * 1024 * 5,# 日志大小 5M ‘backupCount‘: 5,‘encoding‘: ‘utf-8‘,# 日志文件的编码,再也不用担心中文log乱码了 },‘loggers‘: { # logging.getLogger(__name__)拿到的logger配置 ‘‘: { ‘handlers‘: [‘stream‘,‘file‘],‘level‘: ‘DEBUG‘,‘propagate‘: True,} src.pyimport os import hashlib import json from conf import settings from lib import common # 登录状态 status_dic = { ‘username‘: None,‘status‘: False } flag = True li = os.listdir(settings.user_path) # 登录函数 def login(): count = 0 while count < 3: username = input("请输入姓名: ").strip() password = input("请输入密码: ").strip() ret = hashlib.md5() ret.update(password.encode("utf-8")) pwd = ret.hexdigest() with open(settings.user_path+‘‘+username +".json",encoding="utf-8") as f: s = json.loads(f.readline()) if username+‘.json‘ in li and s[username] == pwd: status_dic["username"] = username status_dic[‘status‘] = True # 状态改为True print("登陆成功") return True else: print("账号或密码错误,请重新登录") count += 1 # 注册函数 def register(): count = 0 while count < 3: username = input("请输入新账号: ").strip() password = input("请输新入密码: ").strip() if username in li: # 判断用户是否在文件中存在 print("用户名已存在,请重新输入") continue elif not username.isalnum(): # 判断用户是否是字母或数字组成 print("账号含有非法字符,请重新输入") continue elif 5 < len(password) < 15: # 限制密码在6-14位之间 dic = {} md5 = hashlib.md5() md5.update(password.encode("utf-8")) pwd = md5.hexdigest() with open(settings.user_path+‘‘+username +".json",encoding="utf-8",mode="w") as f1: dic[username] = pwd dic.setdefault("money",0) s = json.dumps(dic) f1.write(s+"n") print("恭喜!注册成功") return True else: print("密码不合规范,请重新输入") count += 1 @common.auth def look_money(): print("您已进入查看余额功能") with open(settings.user_path + ‘‘ + status_dic["username"] + ‘.json‘,mode="r") as f: ret = json.loads(f.read()) print(f‘余额为:{ret["money"]}‘) @common.auth def money(): print("您已进入存钱功能") c_money = input("请输入要存储的金额:").strip() cq_money = int(c_money) with open(settings.user_path+‘‘+status_dic["username"] +‘.json‘,mode="r") as f3,open(settings.user_path+‘‘+status_dic["username"] +‘.bak‘,mode="w") as f4: ret = json.loads(f3.readline()) ret["money"] += cq_money s = json.dumps(ret) f4.write(s) os.remove(settings.user_path+‘‘+status_dic["username"] +‘.json‘) os.rename(settings.user_path+‘‘+status_dic["username"] +‘.bak‘,settings.user_path+‘‘+status_dic["username"] +‘.json‘) print(f"恭喜存钱成功") @common.auth def zq_money(): print("您已进入转账功能") zz_user = input("请输入对方账户: ").strip() zz_money = int(input("请输入要转的金额: ").strip()) zz_user1 = zz_user + ".json" if zz_user1 not in li: # 判断用户是否在文件中存在 print("用户名不存在") else: with open(settings.user_path + ‘‘ + status_dic["username"] + ‘.json‘,mode="r") as f1,open(settings.user_path + ‘‘ + status_dic["username"] + ‘.bak‘,mode="w") as f2: ret = json.loads(f1.readline()) ret["money"] -= zz_money s = json.dumps(ret) f2.write(s) os.remove(settings.user_path + ‘‘ + status_dic["username"] + ‘.json‘) os.rename(settings.user_path + ‘‘ + status_dic["username"] + ‘.bak‘,settings.user_path + ‘‘ + status_dic["username"] + ‘.json‘) with open(settings.user_path + ‘‘ + zz_user1,mode="r") as f2,open(settings.user_path + ‘‘ + zz_user1+".bak",mode="w") as f3: ret = json.loads(f2.readline()) ret["money"] += zz_money s = json.dumps(ret) f3.write(s) os.remove(settings.user_path + ‘‘ + zz_user1) os.rename(settings.user_path + ‘‘ + zz_user1+".bak",settings.user_path + ‘‘ + zz_user1) print("转账交易成功") @common.auth def ch_user(): print("您已进入查看账户流水功能") logger = common.record_logger() logger.info(f‘status_dic["username"]进行了流水操作‘) # 退出程序 def exit_program(): global flag flag = False return flag def run(): choice_dict = { 1: login,2: register,3: look_money,4: money,5: zq_money,6: ch_user,7: exit_program,} while flag: print(‘‘‘ 欢迎来到ATM系统 1:请登录 2:请注册 3:查看余额 4:存钱 5:转账 6:查看账户流水 7:退出程序‘‘‘) choice = input(‘请输入您选择的序号:‘).strip() if choice.isdigit(): choice = int(choice) if 0 < choice <= len(choice_dict): choice_dict[choice]() else: print("您输入的超出范围") else: print("输入不合规范,重新输入") ddu.json{"ddu": "e10adc3949ba59abbe56e057f20f883e","money": 500} common.pyfrom core import src from conf.settings import LOGGING_DIC import logging.config def auth(f): def inner(*args,**kwargs): if src.status_dic["status"]: ret = f(*args,**kwargs) return ret else: print("-------登录页面-------") src.login() ret = f(*args,**kwargs) return ret return inner def record_logger(): """记录日志""" logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置 logger = logging.getLogger() # 生成一个log实例 return logger (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |