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,
},
},
}

day26 作业(ATM第二版)的更多相关文章

  1. CSAPP深入理解计算机系统(第二版)第三章家庭作业答案

    <深入理解计算机系统(第二版)>CSAPP 第三章 家庭作业 这一章介绍了AT&T的汇编指令 比较重要 本人完成了<深入理解计算机系统(第二版)>(以下简称CSAPP) ...

  2. C语言实现词频统计——第二版

    原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 2.支持命 ...

  3. 团队作业八——第二次团队冲刺(Beta版本)第4天

    团队作业八--第二次团队冲刺(Beta版本)第4天 一.每个人的工作 (1) 昨天已完成的工作 做一下用户注册的功能和登录功能. (2) 今天计划完成的工作 完成界面跳转 (3) 工作中遇到的困难 界 ...

  4. 【UML】NO.54.EBook.6.UML.2.002-【Thinking In UML 大象 第二版】- UML 核心元素

    1.0.0 Summary Tittle:[UML]NO.54.EBook.6.UML.2.002-[Thinking In UML 大象 第二版]- UML 核心元素 Style:DesignPat ...

  5. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  6. 《selenium2 Java 自动化测试实战(第二版)》 更新2016.5.3

    java 版来了!! 本文档在<selenium2 Python 自动化测试实战>的基础上,将代码与实例替换为java ,当然,部分章节有变更.这主要更语言本身的特点有关.集合和java下 ...

  7. 《Java程序设计与数据结构教程(第二版)》学习指导

    <Java程序设计与数据结构教程(第二版)>学习指导 欢迎关注"rocedu"微信公众号(手机上长按二维码) 做中教,做中学,实践中共同进步! 原文地址:http:// ...

  8. (转载)持续集成(第二版)[来自:Martin Fowler]

    转载自:iTech的博客 持续集成(第二版) 作者:Martin Fowler 译者:雷镇 持续集成 是一种软件开发实践.在持续集成中,团队成员频繁集成他们的工作成果,一般每人每天至少集成一次,也可以 ...

  9. Learning ROS for Robotics Programming - Second Edition(《学习ROS机器人编程-第二版》)

    Learning ROS for Robotics Programming - Second Edition <学习ROS机器人编程-第二版> ----Your one-stop guid ...

随机推荐

  1. js原型链、继承、this指向等老生常谈却依然不熟的知识点——记录解析

    开始记录学习过程—— 很详细的解析过程——https://juejin.im/post/5c72a1766fb9a049ea3993e6 借鉴阅读——https://github.com/KieSun ...

  2. nacos基础--客户端下载

    对于nacos的作用,我在这里不在过多介绍,不知道的同学可以自行先了解,对于nacos,有官网进行介绍,对于一个初学者来说是一件非常方便的事情. 官网地址:https://nacos.io 但是在下载 ...

  3. 不适合使用Mycat的场景

    1.非分片字段查询 Mycat中的路由结果是通过分片字段和分片方法来确定的.例如下图中的一个Mycat分库方案: 根据 tt_waybill 表的 id 字段来进行分片 分片方法为 id 值取 3 的 ...

  4. 使用 Spark SQL 高效地读写 HBase

    Apache Spark 和 Apache HBase 是两个使用比较广泛的大数据组件.很多场景需要使用 Spark 分析/查询 HBase 中的数据,而目前 Spark 内置是支持很多数据源的,其中 ...

  5. FFT快速傅里叶变换的python实现

    FFT是DFT的高效算法,能够将时域信号转化到频域上,下面记录下一段用python实现的FFT代码. # encoding=utf-8 import numpy as np import pylab ...

  6. Android学习笔记Intent二

    上篇随笔大概写了了Intent学习的大纲,这篇通过代码理解下Intent的ComponentName属性的使用 ComponentName,中文意思是组件名称,通过Intent的setsetCompo ...

  7. MAC App破解之路十 Particle Design

    这个软件破解非常简单: 修改: [PaddleStatic Yz6nrtNwF4].直接返回1 效果:

  8. cb30a_c++_STL_算法_查找算法_(3)search_find_end

    cb30a_c++_STL_算法_查找算法_(3)search_find_endsearch()pos = search(ideq.begin(), ideq.end(), ilist.begin() ...

  9. WeChair——团队展示

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 团队名称 WeChair 这个作业要求在哪里 团队作业第一次 这个作业的目标 团队合作,项目开发 作业正文 如下 其他参考文献 ...

  10. redis高级命令4 持久化机制 、事务

    redis的事务是支持很简单,基本没有啥用我们来看下面的列子 我们开启一个事务,在事务中执行了age 加1,set a4 ,还有对一个字符串进行加一,对字符串加1导致了事务失败,按道理incr age ...