day26 作业(ATM第二版)

start.py

import os,sys
from core import src
sys.path.append(
    os.path.dirname(__file__)
)

if __name__ == '__main__':
    src.run()

conf.settings.py

import os

BASE_PATH = os.path.dirname(os.path.dirname(__file__))


DB_PATH = os.path.join(BASE_PATH,'db')

USER_FILE_PATH = os.path.join(DB_PATH,'user_file')

READ_TXT_PATH = os.path.join(DB_PATH,'read_txt')

STORY_CLASS_TXT_PATH = os.path.join(DB_PATH,'story_class.txt')

LOPGFILE_DIR_PATH = os.path.join(BASE_PATH,'log','all2.log')

LOGFILE_LOG_PATH = os.path.join(LOPGFILE_DIR_PATH,'atm_log.log')

core.src.py

from interface import user_interface
from interface import bank_interface
from interface import shop_interface
from lib import common
now_user = None
# 注册
def register():
    username = input("请输入你要注册的账号:")
    password = input("请输入你要注册的密码:")
    password_agin = input("请再次输入你要注册的密码:")
    if password == password_agin:
        flag,msg = user_interface.register_interface(username,password)
        if flag:
            print(msg)
        else:
            print(msg)
        #执行注册功能
    else:
        print("WTF?让你输两次同样的密码你都能老子输错,吃屎去把!")

# 登录
def login():
    while True:
        username = input("请输入你要登录的账号:")
        password = input("请输入你要登录的密码:")
        flag,msg = user_interface.login_interface(username,password)
        if flag:
            print(msg)
            global now_user
            now_user = username
            break
        else:
            print(msg)

# 查余额
@common.login_warpper
def check_balance():
    balance = bank_interface.check_balance_interface(now_user)
    print(f'{now_user}的余额为{balance}')

# 提现
@common.login_warpper
def withdraw():
    money = input("请输入你要提现的金额:")
    if money.isdigit():
        flag,msg = bank_interface.withdraw_interface(now_user,money)
        if flag:
            print(msg)
        else:
            print(msg)
    else:
        print("让你输几个数字这么困难吗??")

# 还款
@common.login_warpper
def repay():
    money = input("请输入你要还款的金额:")
    if money.isdigit():
        msg = bank_interface.repay_interface(now_user,money)
        print(msg)
    else:
        print("请输入正确的金额!")

# 转账
@common.login_warpper
def transfer():
    outher_name = input("请输入收账人账号:")
    money = input("请输入转账金额:")
    if money.isdigit():
        msg = bank_interface.transfer_interface(now_user,outher_name,money)
        print(msg)
    else:
        print("请输入正确的金额!")
# 查看流水
@common.login_warpper
def check_flow():
    flow_list = bank_interface.check_flow_interface(now_user)
    if flow_list:
        print(flow_list)
    else:
        print('该账号没有流水!')

book_dict = {
            "0": "玄幻武侠",
            "1": "无限流派",
            "2": "科幻悬疑"}
# 购物
@common.login_warpper
def shopping():
    while True:
        story_dic = common.get_story_class()
        print('''=============书吧=============''')
        for num in book_dict:
            print(f'   序号:{num}     种类:{book_dict[num]}')
        print('''=============end=============''')
        chose_type = input("请输入你要选择种类的序号:")
        if not chose_type.isdigit():
            print("请输入数字!")
            continue
        else:
            shop_car_dic = {}
            while True:
                story_chose_type = story_dic[chose_type]
                for num in story_chose_type:
                    book_name = story_chose_type[num][0].strip(".txt")
                    price = story_chose_type[num][1]
                    print(f'序号:{num}  书名:{book_name}   单价:{price}')
                chose_num = input("请输入你要选择书的序号(q为退出):")
                if chose_num == 'q':
                    return
                elif not chose_num.isdigit():
                    print("请输入数字!")
                    continue
                book_count = input("请输入你要购买该书的数量:")
                if not book_count.isdigit():
                    print("请输入数字!")
                    continue
                chose_buy = input("是否购买该商品(b)或加入购物车(g):")
                cost = int(book_count) * story_chose_type[chose_num][1]
                if chose_buy == "b":
                    #调用接口结算该商品
                    msg = shop_interface.shopping_buy_interface(now_user,cost)
                    print(msg)
                elif chose_buy == "g":
                    book_name = story_chose_type[chose_num][0]
                    price = story_chose_type[chose_num][1]
                    shop_car_dic[book_name] = {
                        '单价':price,
                        '数量':int(book_count),
                        '总价':cost,
                    }
                    msg = shop_interface.shopping_tocar_interface(now_user,shop_car_dic)
                    print(msg)
                    #调用接口添加购物车
                else:
                    print("请输入正确的指令!")


# 购物车
@common.login_warpper
def check_shop_car():
    flag,msg = shop_interface.check_shop_car_inerface(now_user)
    if flag:
        book_map = {}
        count = 1
        for name in msg:
            print(f"序号:{count} 书名:{name} 单价:{msg[name]['单价']} 数量:{msg[name]['数量']} 总价格:{msg[name]['总价']}")
            book_map[count] = name
            count+=1
        chose = input("请选择你要支付的序号(q=退出,a=全部支付):")
        if chose == "q":
            return
        elif chose == "a":
            msg = shop_interface.shopping_allbuy_interface(now_user)
            print(msg)
        elif int(chose) in book_map:
            msg = shop_interface.shopping_buy_interface(now_user,msg[book_map[int(chose)]]['总价'])
            print(msg)
        else:
            print("请输入正确指令!")
    else:
        print(msg)

# 管理员
def admin():
    pass



func_dic = {
    '1': register,
    '2': login,
    '3': check_balance,
    '4': withdraw,
    '5': repay,
    '6': transfer,
    '7': check_flow,
    '8': shopping,
    '9': check_shop_car,
    '10': admin,
}

#执行
def run():
    while True:
        print('''
========= ATM第二版 =========== 
        1、注册功能
        2、登录功能
        3、查看余额
        4、提现功能
        5、还款功能
        6、转账功能
        7、查看流水
        8、购物功能
        9、查看购物车
        10、管理员功能(暂无)
============ end =============
        ''')
        cmd = input("请输入你要选择的功能:")
        if cmd in func_dic:
            func_dic[cmd]()
        else:
            print("有脑子没,1到10都不会输吗?你小学数学体育老师教的?")

db.db_handler.py

import os
import json
from conf import  settings
#查询用户是否存在
def select(username):
    user_path = os.path.join(settings.USER_FILE_PATH,f'{username}.json')
    if os.path.exists(user_path):
        with open(user_path,"r",encoding="utf-8")as f :
           user_dic = json.load(f)
        return user_dic


#保存用户信息
def save(use_dic):
    user_path = os.path.join(settings.USER_FILE_PATH, f"{use_dic['username']}.json")
    with open(user_path,"w",encoding="utf-8") as f:
        json.dump(use_dic,f,ensure_ascii=False)

interface.bank_interface.py

from db import db_handler
from lib import common
bank_logger = common.get_logger(log_type='bank')
# 查询余额
def check_balance_interface(username):
    user_dic = db_handler.select(username)
    return user_dic['balance']

# 提现
def withdraw_interface(username,money):
    user_dic = db_handler.select(username)
    money = int(money)
    if money*1.05 <= user_dic['balance']:
        user_dic['balance'] -= money*1.05
        flow = f'{username}提现{money}成功!'
        user_dic['flow'].append(flow)
        db_handler.save(user_dic)
        bank_logger.info(flow)
        return True,flow
    else:
        return False,f'{username}余额不足!'

# 还款
def repay_interface(username,money):
    use_dic = db_handler.select(username)
    money = int(money)
    use_dic['balance'] += money
    flow = f'{username}还款{money}成功!'
    use_dic['flow'].append(flow)
    db_handler.save(use_dic)
    bank_logger.info(flow)
    return flow

# 转账
def transfer_interface(my_name,outher_name,money):
    outher_dic = db_handler.select(outher_name)
    if outher_dic:
        my_dic = db_handler.select(my_name)
        money = int(money)
        if  my_dic['balance'] >= money:
            my_dic['balance'] -= money
            outher_dic['balance'] += money
            my_flow =f'{my_name}向{outher_name}转账{money}成功!'
            my_dic['flow'].append(my_flow)
            ot_flow = f'{outher_name}接收{my_name}的转账{money}成功!'
            my_dic['flow'].append(ot_flow)
            db_handler.save(my_dic)
            db_handler.save(outher_dic)
            bank_logger.info(my_flow)
            bank_logger.info(ot_flow)
            return my_flow
        else:
            return f'{my_name}没那么多钱,转账失败!'
    else:
        return f'不存在{outher_name}账户!'

# 查看流水
def check_flow_interface(username):
    use_dic = db_handler.select(username)
    return use_dic['flow']

interface.shop_interface.py

from db import db_handler
from conf import settings
from lib import common
shop_logger = common.get_logger(log_type='shop')

# 购买接口
def shopping_buy_interface(username,price):
    user_dic = db_handler.select(username)
    if user_dic['balance'] >= price:
        user_dic['balance'] -= price
        flow = f'{username}购买支出{price}成功!'
        user_dic['flow'].append(flow)
        db_handler.save(user_dic)
        shop_logger.info(flow)
        return flow
    else:
        return '购买失败余额不足!'


# 添加购物车接口
def shopping_tocar_interface(username,book_dic):
    user_dic = db_handler.select(username)
    bookname = book_dic.__iter__().__next__()
    if bookname in user_dic['shop_car'] :
        user_dic['shop_car'][bookname]['数量'] += book_dic[bookname]['数量']
        user_dic['shop_car'][bookname]['总价'] += book_dic[bookname]['总价']
        db_handler.save(user_dic)
    else:
        user_dic['shop_car'][bookname] = book_dic[bookname]
        db_handler.save(user_dic)
    return '添加购物车成功,请选择购物车功能查看商品信息'

# 查看购物车
def check_shop_car_inerface(username):
    user_dic = db_handler.select(username)
    if user_dic['shop_car']:
        return True,user_dic['shop_car']
    else:
        return False,f'{username}购物车为空!'


# 清空购物车
def shopping_allbuy_interface(username):
    user_dic = db_handler.select(username)
    cost = 0
    for name in user_dic['shop_car']:
        cost +=user_dic['shop_car'][name]['总价']
    if cost>user_dic['balance']:
        return f"{username}余额不足!"
    else:
        user_dic['balance'] -= cost
        user_dic['shop_car'] = {}
        db_handler.save(user_dic)
        shop_logger.info(f'{username}支付{cost}成功!购物车已清空!')
        return f'{username}支付{cost}成功!购物车已清空!'

interface.user_interface

from db import db_handler
from lib import common
user_logger = common.get_logger(log_type='user')


#注册接口
def register_interface(username,pwd):
    use_dic = db_handler.select(username)
    if not use_dic:
        pwd_md5 = common.pwd_md5(pwd)
        use_dic = {
            'username':username,
            'password':pwd_md5,
            'balance':15000,
            'flow':[],
            'shop_car':{},
            'locked':{}
        }
        db_handler.save(use_dic)
        user_logger.info(f'用户{username}注册成功!')
        return True,f'用户{username}注册成功!'
    else:
        return False,f'我服了,都已经注册过了你还用这个账号,脑子进水了么?'


#登录接口
def login_interface(username,pwd):
    use_dic = db_handler.select(username)
    if use_dic:
        pwd_md5 = common.pwd_md5(pwd)
        if pwd_md5 == use_dic['password']:
            user_logger.info(f"{username}登录成功!")
            return True,f"{username}登录成功!"
        else:
            return False,'你密码就三位你都记不住?大帅比'
    else:
        return False,'呆瓜,没有这个用户,你先去注册把~'

lib.common.py

import hashlib
import logging.config
from conf import settings
from log import atm_log
# 加密密码
def pwd_md5(pwd):
    m = hashlib.md5()
    m.update(pwd.encode('utf-8'))
    salt = '黄钊是个大帅逼!'
    m.update(salt.encode('utf-8'))
    p_md = m.hexdigest()
    return p_md

# 登录装饰器
def login_warpper(func):
    def inner():
        from core import  src
        if src.now_user:
            func()
        else:
            print("没登录执行nm的功能啊??赶紧给我登录去!")
            src.login()
    return inner


# 获取商品信息
def get_story_class():
    class_path = settings.STORY_CLASS_TXT_PATH
    with open(class_path,"r",encoding="utf-8")as f :
        story_dic = eval(f.read())
    return story_dic

# 日志
def get_logger(log_type):
    logging.config.dictConfig(
        atm_log.LOGGING_DIC
    )
    logger = logging.getLogger(log_type)

    return logger

log.atm_log.py

import os
import logging.config
from conf import settings
# 定义三种日志输出格式 开始

standard_format = '[%(asctime)s][用户:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]'
# 其中name为getlogger指定的名字

simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'

# 定义日志输出格式 结束

logfile_dir = settings.LOPGFILE_DIR_PATH
# log文件的目录

logfile_name = 'all2.log'  # log文件名

# 如果不存在定义的日志目录就创建一个
if not os.path.isdir(logfile_dir):
    os.mkdir(logfile_dir)

# log文件的全路径
logfile_path = settings.LOGFILE_LOG_PATH

# log配置字典
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    # 打印的格式选择
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},
    # 日志接受者,负责改变日志接受到的一些信息配置
    'handlers': {
        # 打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        # 打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            # 保存到文件
            'class': 'logging.handlers.RotatingFileHandler',
            # 日志的打印/写入格式
            'formatter': 'standard',
            # 日志文件名
            'filename': logfile_path,
            # 日志大小 5M
            'maxBytes': 1024 * 1024 * 5,
            # 日志轮转:最大日志文件数量5
            'backupCount': 5,
            # 日志文件的编码,再也不用担心中文log乱码了
            'encoding': 'utf-8',
        },
    },
    # 日志制造者
    'loggers': {
        # logging.getLogger(__name__)拿到的logger配置

        # 如果没有名字的话,名字在其他文件调用时自动传入
        '': {
            # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'handlers': ['default'],
            # 第一层level,筛选后再去handlers里筛选,通常一样
            'level': 'DEBUG',
            # 向上(更高level的logger)传递,通常为false
            'propagate': True,
        },
    },
}

猜你喜欢

转载自www.cnblogs.com/hz2lxt/p/12630746.html