• 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#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
  • 相关阅读:
    服务器IIS禁止通过IP访问
    如何自定义Kubernetes资源
    敏捷 | 无处不在的敏捷思想应用
    敏捷 | 如何做好服务型Scrum Master?
    敏捷 | 如何填好推进的坑?
    敏捷 | 如何正确推进敏捷?
    敏捷 | 如何正确理解敏捷?
    管理 |《技术管理案例课》学习总结(下)
    管理 |《技术管理案例课》学习总结(上)
    《ArcGIS 从基础到实战》书正式出版
  • 原文地址:https://www.cnblogs.com/yujin123456/p/9911610.html
Copyright © 2020-2023  润新知