前一段时间学习python的目录结构,尝试写了下atm的作业,但是写得并不是太好,还是记录一下
目录结构:
一、bin
程序的入口在bin包下的start文件
from core import main if __name__ == '__main__': main.run()
二、conf
包含所有的配置文件信息,方便之后修改
setting.py
import os import sys BASIC_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#BASIC_DIR是atm文件的路径 sys.path.append(BASIC_DIR) print(sys.path) auth_path = BASIC_DIR+'\db\accounts'+'\'#此处用于transction文件中,修改存于db下的用户信息数据时所需要用到的account路径 LOG_LEVEL = 'DEBUG'#记录日志的级别 logging_type = { '登陆':'acess_log', '款项操作':'zhuanzhang_log' }#记录的事件,在登陆以及款项操作模块都有用到 loggin_type = False#False为未登陆,True为已登陆,在登录模块
三、core
1、main.py
这是整个程序的逻辑思路,主要调用了各个模块
from core import denglu from core import transction menu_dic = { '1':transction.cunqian, '2':transction.qukuan } menu = ''' 您有以下选择: 1:取钱 2:存钱 3:查询 4: exit ''' def run(): m = input("请输入你的账户:") n = str(input("请输入你的密码:")) auth = denglu.acc_auth(m,n) if auth is not False: while 1: print(menu) k = int(input("请选择操作对象:")) if k==1: transction.qukuan(auth) elif k==2: transction.cunqian(auth) elif k==3: print('您的现有金额是:',auth['creadit']) elif k==4: exit() else: print("输入选项不正确") else: print('密码错误或账户不存在')
2、denglu.py
对用户进行验证登陆,并以字典的方式返回用户的信息
from core import logger from conf import setting import os import json def acc_auth(account,password): Auth_path = setting.auth_path+account if os.access(Auth_path,os.F_OK): f = open(Auth_path,'r') de_json = json.load(f) if str(de_json['id']) == account and str(de_json['password']) == password: if setting.loggin_type: print('已经登陆了') return de_json else: print("登陆成功") setting.loggin_type = True logger.logger(setting.logging_type['登陆'],account).info(de_json['id']) print(de_json) return de_json else: print("登陆失败") return False
3、transction.py
执行账户的存入与取出
from conf import setting from core import logger import os import json def qukuan(auth): auth_path = setting.auth_path+str(auth['id']) jine = int(input('您要取出金额为:')) if auth['creadit'] >= jine: #对db内的用户信息进行修改 f=open(auth_path,'w') m = auth['creadit']-jine auth['creadit'] = m json.dump(auth,f) f.close() #日志记录 logger.logger(setting.logging_type['款项操作'],auth['id']).info('取款%s元',jine) else: print("卡内金额不足") def cunqian(auth): auth_path1 = os.path.join(setting.auth_path,auth['id']) jine = int(input('您要存入金额为:')) f=open(auth_path1,'w') m = auth['creadit']+jine auth['creadit'] = m json.dump(auth,f) f.close() logger.logger(setting.logging_type['款项操作'],auth['id']).info('存钱%s元',jine)
4、logger.py
日志记录模块,提供logger
import logging from conf import setting import io import sys sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8') def logger(logging_type,auth_id): logger = logging.getLogger(logging_type)#得到一个logger对象 logger.setLevel(setting.LOG_LEVEL)#设置logger的级别 ch = logging.StreamHandler()#创建一个handler的控制台输出对象 log_file = setting.BASIC_DIR+'\log\'+auth_id fh = logging.FileHandler(log_file)#创建一个handler的文本输出对象 formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s') ch.setFormatter(formatter) fh.setFormatter(formatter) logger.addHandler(ch) logger.addHandler(fh) return logger
四、db
1、accounts.py
将用户信息生成为一个一个的单独文本文件
import json import os acc_id = { 'id':'1234', 'password':'123', 'creadit':15000, 'balance':15000, } acc_id1 = { 'id':'4321', 'password':'123', 'creadit':15000, 'balance':15000, } def add_user(s): ID = str(s['id']) user_id_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),'accounts',ID) f = open(user_id_path,'w') json.dump(s,f) f.close() add_user(acc_id) add_user(acc_id1)
2、生成的用户信息
1234
4321
五、log
这里保存的都是日志信息
运行结果
请输入你的账户:1234 请输入你的密码:123 2018-11-05 20:29:33,946-acess_log-INFO-1234 登陆成功 您有以下选择: 1:取钱 2:存钱 3:查询 4: exit 请选择操作对象:3 您的现有金额是: 14800 您有以下选择: 1:取钱 2:存钱 3:查询 4: exit 请选择操作对象:1 您要取出金额为:100 2018-11-05 20:29:43,114-zhuanzhang_log-INFO-取款100元 您有以下选择: 1:取钱 2:存钱 3:查询 4: exit 请选择操作对象:3 您的现有金额是: 14700 您有以下选择: 1:取钱 2:存钱 3:查询 4: exit 请选择操作对象:4 Process finished with exit code 0