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

最新文章

  1. Android Drawable
  2. ICPC-CAMP day1 D.Around the world
  3. easyui 文本框 显示提示信息data-options=&quot;prompt:&#39;格式:水箱支架-京东汽配店铺-图集(大图/图集6)&#39;&quot;
  4. HDU 3488--Tour(KM or 费用流)
  5. C#绘制圆形时钟
  6. java多线程入门
  7. (知识点)JS中获取元素的样式
  8. PHP实现类似于MySQ L的group by 效果
  9. 不再迷惑,无值和NULL值的转换
  10. 201521123045 《JAVA程序设计》 第14周学习总结
  11. 【专章】dp基础
  12. Netty——高级发送和接收数据handler处理器
  13. c#的unity
  14. Linux下用户和组管理
  15. 使用了旧版nuget的.net项目在git中的问题
  16. CSS基础:替换元素和非替换元素
  17. gitlab-ci-runner安装
  18. 并发之ThreadLocal
  19. Object Relational Mapping(ORM)
  20. Struts2学习:Action获取properties文件的值

热门文章

  1. 02.vue-router的进阶使用
  2. 【Jmeter】日常骚操作最简洁上传和下载
  3. Mbatis使用
  4. Windows 程序设计(3) 关于字符串
  5. Ios App破解之路二 JJ斗地主
  6. C语言实现类
  7. Linux 集群安装zookeeper
  8. Ubuntu18.04 IP配置问题
  9. ajax前后端交互原理(5)
  10. 如何去除List集合中重复的元素