conf.setting.py

'''
配置信息
'''
import os BASE_PAHT = os.path.dirname(os.path.dirname(__file__)) DB_PATH = os.path.join(BASE_PAHT,'db') USER_DATA_PATH = os.path.join(DB_PATH,'user_data') COMMODITY_PAHT = os.path.join(DB_PATH,'commodity.txt') LOPGFILE_DIR_PATH = os.path.join(BASE_PAHT,'log','log_data') LOGFILE_LOG_PATH = os.path.join(LOPGFILE_DIR_PATH, 'log.log')

core.src.py

'''
用户视图层
''' from interface import user_interface
from interface import bank_interface
from interface import shop_interface
from interface import admin_interface
from lib import common
login_user = None #注册
@common.log_write('注册')
def register():
while True:
username = input("请输入账号:").strip()
password = input("请输入密码:").strip()
re_password = input("请再次输入密码:").strip()
#小的逻辑处理,比较两次密码是否一致
if password == re_password:
# 调用接口层的注册借口,把用户名和密码传给接口层来处理
#flag = True 注册成功,flag= False 注册失败
flag,msg = user_interface.register_interface(username,password)
if flag:
print(msg)
break
else:
print(msg) #登录
@common.log_write('登录')
def login():
while True:
username = input("请输入你的用户名:").strip()
password = input("请输入你的密码:").strip()
flag,msg = user_interface.login_interface(username,password)
if flag:
print(msg)
global login_user
login_user = username
return
else:
print(msg) #查看余额
@common.login_auth
@common.log_write('查看余额')
def check_balance():
balance = user_interface.check_balance_interface(login_user)
print(f'{login_user}余额为:{balance}') #提现
@common.login_auth
@common.log_write('提现')
def withdraw():
money_inp = input("请输入提现的金额:").strip()
if not money_inp.isdigit():
print("请重新输入!")
# money_inp = int(money_inp)
flag,msg = bank_interface.withdraw_interface(login_user,money_inp)
if flag:
print(msg)
else:
print(msg) #还款
@common.login_auth
@common.log_write('还款')
def repay():
money = input("请输入你要充值的金额:")
if money.isdigit():
msg = bank_interface.repay_interface(login_user,money)
print(msg)
else:
print("请输入正确金额!") #转账
@common.login_auth
@common.log_write('转账')
def transfer():
other_user = input("请输入收账人用户名:").strip()
money = input("请输入转账金额:").strip()
flag,msg = bank_interface.transfer_interface(login_user,other_user,money)
if flag:
print(msg)
else:
print(msg) #查看流水
@common.login_auth
@common.log_write('查看流水')
def check_flow():
msg = bank_interface.check_flow_interface(login_user)
print(msg) #购物
@common.login_auth
@common.log_write('购物')
def shopping():
while True:
shop_list = common.shop_msg()
for num in shop_list:
print(f'序号:{num} 名称:{shop_list[num][0]} 价格:{shop_list[num][1]}')
num_buy = input("请输入你要购买商品的序号(q退出):")
if num_buy in shop_list:
count_buy = input("请输入你要购买的商品的数量(q退出):")
flag,msg = shop_interface.shopping_interface(login_user,shop_list[num_buy],count_buy)
if flag:
print(msg)
else:
print(msg)
elif num_buy == 'q':
break
else:
print("请输入正确指令!") #查看购物车
@common.login_auth
@common.log_write('查看购物车')
def check_shop_car():
while True:
shop_car_dic = common.shop_car_msg()
count = 0
shop_num_dic= {}
for name in shop_car_dic:
count+=1
print(f"商品序号:{count} 商品名称:{name} 单价:{shop_car_dic[name]['单价']} 数量:{shop_car_dic[name]['数量']} 总价格:{shop_car_dic[name]['总价格']}")
shop_num_dic[count] = name
if count == 0:
print(f'{login_user}的购物车是空的!')
return
num_buy = input("请输入你要支付的商品序号(q退出):").strip()
if 0<int(num_buy)<=count :
falg,msg = shop_interface.check_shop_car_interface(login_user,shop_num_dic[int(num_buy)],shop_car_dic[shop_num_dic[int(num_buy)]]['总价格'])
if falg:
print(msg)
else:
print(msg)
elif num_buy == 'q':
return
else:
print('请输入正确指令!') #管理员功能
@common.log_write('管理员登录')
def admin():
admin_dic = {
"1":register,
"2":admin_update_bal,
"3":admin_lock
}
admin_name = input("请输入管理员用户名:")
admin_pwd = input("请输入管理员密码:")
flag,msg = admin_interface.admin_login_interface(admin_name,admin_pwd)
if flag:
print(msg)
while True:
print('''
*******管理员界面*******
1 添加用户
2 修改用户余额
3 冻结用户
''')
cmd = input("请输入你要执行的功能(q退出):")
if cmd in admin_dic:
admin_dic[cmd]()
elif cmd == 'q':
print(f'{admin_name}已退出!')
return
else:
print("请输入正确指令!")
else:
print(msg) #登录管理员账号,只存账号密码
#userinter里添加管理员功能
#1 添加账号 == 注册
#2 冻结用户 输入用户名,修改该用户名的locked=True 或者解冻
#3 修改用户余额 输入用户名,输入新的账号金额信息,保存用户 #管理员修改用户余额
@common.log_write('修改余额')
def admin_update_bal():
username = input("请输入你要修改的用户名:")
balance = input("请输入该用户新的余额:")
msg = admin_interface.admin_update_bal_interface(username,balance)
print(msg) #管理员冻结用户
@common.log_write('冻结用户')
def admin_lock():
username = input("请输入你要冻结或者解冻的账号:")
flag,msg = admin_interface.admin_lock_interface(username)
if flag:
print(msg)
else:
print(msg) 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 =========
''')
choice = input("请输入编号:")
if choice not in func_dic:
print("请输入正确的功能编号!")
continue
else:
func_dic[choice]()

db.db_handler.py

'''

数据处理层
-专门用来处理数据的
'''
import json
import os
from conf import settings
#查找用户是否存在
def select(username):
user_path = os.path.join(settings.USER_DATA_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(user_dic):
username = user_dic.get('username')
user_path = os.path.join(settings.USER_DATA_PATH, f"{username}.json")
with open(user_path,"w",encoding="utf-8")as f:
# ensure_ascii=False 让json文件中的中文数据变成中文
json.dump(user_dic,f,ensure_ascii=False) #修改用户数据
def update(username,old_msg,new_msg):
pass

interface.admin_interface

from db import db_handler
from lib import common #管理员登录接口
def admin_login_interface(username,password):
user_dic = db_handler.select(username)
if user_dic:
password = common.get_pwd_md5(password)
if user_dic['password'] == password:
return True,f'超级管理员{username}登录成功!'
else:
return False,f'管理员{username}密码错误!'
else:
return False,"不存在该管理员用户!" #修改用户余额接口
def admin_update_bal_interface(username,balance):
user_dic = db_handler.select(username)
user_dic['balance'] = balance
db_handler.save(user_dic)
return f'{username}余额修改成功!' #冻结用户接口
def admin_lock_interface(username):
user_dic = db_handler.select(username)
if user_dic['locked'] :
user_dic['locked'] = False
db_handler.save(user_dic)
return True,f'{username}账号解冻成功!'
else:
user_dic['locked'] = True
db_handler.save(user_dic)
return False,f'{username}账号冻结成功!'

interface.bank_interface

'''
银行相关业务的接口
'''
import time
from db import db_handler
#提现金额接口 手续费5%
def withdraw_interface(username,money):
user_dic = db_handler.select(username)
balance = int(user_dic['balance'])
money2=int(money)*1.05
if balance>=money2:
balance -= money2
user_dic['balance']=balance
now_time = time.strftime('%Y-%m-%d-%X')
user_dic['flow'].append(f'{now_time}:提现{money}')
db_handler.save(user_dic)
return True,f'{username}提现{money}元成功!'
else:
return False,'提现金额不足,提现失败!' #还款接口
def repay_interface(username,money):
user_dic = db_handler.select(username)
balance = int(user_dic['balance'])
balance += int(money)
user_dic['balance'] = balance
now_time = time.strftime('%Y-%m-%d-%X')
user_dic['flow'].append(f'{now_time}:充值{money}')
db_handler.save(user_dic)
return f'{username}充值{money}成功!' #转账接口
def transfer_interface(my_user,outher_user,money):
my_user_dic = db_handler.select(my_user)
outher_user_dic = db_handler.select(outher_user)
if outher_user_dic:
my_balance = int(my_user_dic['balance'])
money = int(money)
if my_balance>=money:
#对转账人减钱
my_balance-=money
my_user_dic['balance'] = my_balance
now_time = time.strftime('%Y-%m-%d-%X')
my_user_dic['flow'].append(f'{now_time}:转出{money}')
db_handler.save(my_user_dic)
#对收账人加钱
outher_user_balance = int(outher_user_dic['balance'])
outher_user_balance+=money
outher_user_dic['balance'] =outher_user_balance
outher_user_dic['flow'].append(f'{now_time}:收账{money}')
db_handler.save(outher_user_dic)
return True,f'转账成功,{my_user}给{outher_user}转账{money}!'
else:
return False,f'{my_user}余额不足!'
else:
return False,f'{outher_user}不存在!' #查看流水接口
def check_flow_interface(username):
user_dic = db_handler.select(username)
return user_dic['flow']

interface.shop_interface

'''
购物商场接口 '''
import time
from lib import common
from db import db_handler #购物功能接口
def shopping_interface(username,shop_list,count):
# 1 添加流水信息,扣除用户余额
user_dic = db_handler.select(username)
price = int(shop_list[1])
count = int(count)
user_dic['shop_car'][f"{shop_list[0]}"]={'单价':f'{shop_list[1]}','数量':f'{count}','总价格':f'{price*count}'}
db_handler.save(user_dic)
return True,f'已成功添加至{username}的购物车' #购物车接口
def check_shop_car_interface(username,shop_name,price):
# 接收src中支付的序号,修改用户信息
user_dic = db_handler.select(username)
balance = int(user_dic['balance'])
price = int(price)
if balance>=price:
balance -= price
user_dic['balance'] = balance
now_time = time.strftime('%Y-%m-%d-%X')
user_dic['flow'].append(f'{now_time}:购物支出{price}')
user_dic['shop_car'].pop(f'{shop_name}')
db_handler.save(user_dic)
return True,f'用户{username}支付成功!'
else:
return False,f'用户{username}余额不足!'

interface.user_interface

'''
用户
逻辑接口层
''' from lib import common from db import db_handler
# 注册接口
def register_interface(username,password,balance=15000):
# 判断用户是否存在
user_dic = db_handler.select(username)
# 如果用户存在
if user_dic:
return False,'用户名已存在' # == >(False,'')
password = common.get_pwd_md5(password)
user_dic = {
'username': username,
'password': password,
'balance': balance,
# 记录用户的流水信息
'flow': [],
# 记录购物车信息
'shop_car': {},
# 记录用户是否被冻结 False:未冻结 True:冻结
'locked': False
}
# 如果用户不存在则注册
db_handler.save(user_dic)
return True,f'用户{username}注册成功!' # 登录接口
def login_interface(username,password):
user_dic = db_handler.select(username)
if user_dic:
if not user_dic['locked']:
password = common.get_pwd_md5(password)
if user_dic['password'] == password:
return True,f'用户{username}登录成功!'
else:
return False,f'用户{username}密码错误!'
else:
return False,f'用户{username}被冻结,无法登录!'
else:
return False,f'登录失败' # 查询余额接口
def check_balance_interface(username):
user_dic = db_handler.select(username)
return user_dic['balance']

lib.common.py

'''
公共函数
''' import hashlib
from logging import config,getLogger
from log import log
from conf import settings
from db import db_handler #密码加密
def get_pwd_md5(password):
md5_obj = hashlib.md5()
md5_obj.update(password.encode('utf-8'))
salt = 'asdjasuidfhafuigawhniordfq'
md5_obj.update(salt.encode('utf-8'))
return md5_obj.hexdigest() #登录认证装饰器
def login_auth(func):
from core import src
def inner(*args,**kwargs):
if src.login_user:
res = func(*args,**kwargs)
return res
else:
print("未登录,请先登录!")
src.login() return inner #查找商品信息
def shop_msg():
with open(settings.COMMODITY_PAHT,"r",encoding="utf-8")as f :
shop_dic = {}
for line in f :
num,name,price = line.strip().split(":")
shop_dic[num] = [name,price]
return shop_dic #查看购物车信息
def shop_car_msg():
from core import src
user_dic = db_handler.select(src.login_user)
return user_dic['shop_car'] #日志装饰器
def log_write(type):
def wrapper(func):
def inner():
from core import src
config.dictConfig(log.LOGGING_DIC)
func()
if src.login_user == None:
logger1 = getLogger('游客')
logger1.info('游客产生的info信息')
else:
logger1 = getLogger(f'{src.login_user}')
logger1.info(f'{src.login_user}执行了{type}')
return inner
return wrapper

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

day25 作业(ATM第一版)的更多相关文章

  1. python作业ATM(第五周)

    作业需求: 额度 15000或自定义. 实现购物商城,买东西加入 购物车,调用信用卡接口结账. 可以提现,手续费5%. 支持多账户登录. 支持账户间转账. 记录每月日常消费流水. 提供还款接口. AT ...

  2. day25作业

    1.阻塞  2.就绪  3.阻塞  4.Runnable  5.join()  6.synchronized  7.notify()和notifyAll()   8.Object 1.A   2.D  ...

  3. ATM:模拟实现一个ATM + 购物商城程序

    额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还款接口 ATM记录操作日志 提供管理接 ...

  4. Python之路,Day5 - Python基础5

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 一.列表生成器 , 1, 2, 3, 4, 5, 6, 7, 8, 9 ...

  5. Python之路,Day4 - Python基础4 (new版)

    Python之路,Day4 - Python基础4 (new版)   本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...

  6. Day4 - Python基础4 迭代器、装饰器、软件开发规范

    Python之路,Day4 - Python基础4 (new版)   本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...

  7. Python学习笔记(十三)

    Python学习笔记(十三): 模块 包 if name == main 软件目录结构规范 作业-ATM+购物商城程序 1. 模块 1. 模块导入方法 import 语句 import module1 ...

  8. 第五章:Python基础の生成器、迭代器、序列化和虚拟环境的应用

    本课主题 生成器介紹和操作实战 迭代器介紹和操作实战 序例化和反序例化 Json 和 Pickle 操作实战 字符串格式化的应用 创建虚拟环境实战 本周作业 生成器介紹和操作实战 什么是生成器,生成器 ...

  9. Python基础-week04

    本节内容摘要:#Author:http://www.cnblogs.com/Jame-mei 装饰器 迭代器&生成器 Json & pickle 数据序列化 软件目录结构规范 作业:A ...

随机推荐

  1. jreble备注

    版本:2019.1.4 激活URL:http://jrebel.pyjuan.com/36931214-7bb6-42d4-afd7-26eb5628e004

  2. [xDebug] 服务器端的配置参数

    [Xdebug] ;load xdebug extensionzend_extension_ts = path/tp/xdebug;是否开启自动跟踪xdebug.auto_trace = On;是否开 ...

  3. dbca oracle 12 c 遇到ora27125

    网上大部分方法是把dba组放在内核的,没有效果,可以尝试 google找到一位大神的方案,成功解决 https://oracle-admin.com/2014/01/22/ora-27125-unab ...

  4. mysql字符串类型(TEXT 类型)

    TEXT 类型 TEXT 列保存非二进制字符串,如文章内容.评论等.当保存或查询 TEXT 列的值时,不删除尾部空格. TEXT 类型分为 4 种:TINYTEXT.TEXT.MEDIUMTEXT 和 ...

  5. 使用Vim写LaTeX代码(Vim+Vimtex+Skim)

    最近在写博客的时候发现对数学公式的支持并不好,于是就想寻找一个解决方案.我本身是一个爱折腾的人,有时尽管有现成的解决方案我有事也不愿意去用.于是多方查找资料,想寻求一个自定义的解决方案,最终把自己的目 ...

  6. 【JMeter_11】JMeter逻辑控制器__Switch控制器<Switch Controller>

    Switch控制器<Switch Controller> 业务逻辑: 取得switch value的值,通过对节点下所有取样器.逻辑控制器的下标.名称匹配去执行,switch value的 ...

  7. cb33a_c++_STL_算法_查找算法_(6)binary_search_includes

    cb33a_c++_STL_算法_查找算法_(6)binary_search_includes//针对已序区间的查找算法,如set,multiset关联容器-自动排序binary_search(b,e ...

  8. JVM对算术运算做了什么??

    java可以进行数字的加减乘除,但是JVM的运算步骤是什么样子呢?从一个神奇的式子入手,研究下JVM到底做了什么? 先看下图:

  9. hashcode和==

    public class Main { public static void main(String[] args) { Object o=new Object(); System.out.print ...

  10. 在maven项目中使用Junit进行单元测试(一)

    https://blog.csdn.net/ai_xue_xi/article/details/51819729 这篇文章相当的经典,最好使用的maven生成单元测试报告,不要在使用ant脚本生成单元 ...