python-------模拟atm机
前一段时间学习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
三、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