首页 > 技术文章 > python----atm机练习

yujin123456 2018-11-05 21:16 原文

前一段时间学习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

 

推荐阅读