ATM+购物车
软件开发目录规范
目录规范并无固定的要求 只要符合清晰可读即可
bin文件夹
存放一系列启动文件(当启动文件很少或者只有一个的时候也可以直接写在外面)
start.py
conf文件夹
存放一系列配置文件
settings.py(一般情况下该文件内的变量名都是大写)
lib文件夹
存放公共的功能
common.py
db文件夹
存放数据相关文件
userinfo.txt
log文件夹
存放日志记录文件
log.txt
core文件夹
存放项目核心代码文件
src.py
readme文件
存放说明相关信息(类似于说明书 广告 章程)
requirements.txt
存放项目所需的第三方模块及版本号
bin文件夹下的start.py文件:
import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_DIR)
from core import src
if __name__ == '__main__':
src.run()
conf文件夹下的settings.py文件:
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
LOG_DIR = os.path.join(BASE_DIR, 'log')
if not os.path.isdir(LOG_DIR):
os.mkdir(LOG_DIR)
logfile_path = os.path.join(LOG_DIR, 'log.log')
# 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, # 日志文件
'maxBytes': 1024*1024*5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
#logging.getLogger(__name__)拿到的logger配置 空字符串作为键 能够兼容所有的日志
'': {
'handlers': ['default'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
}, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
},
}
core文件夹下的src.py文件:
import os
import json
from conf import settings
from lib import common
import time
import hashlib
current_time = time.strftime('%Y-%m-%d %X')
user_data = {
'username': '',
'is_login': False
}
# 注册功能
def register():
if user_data['is_login']:
print('您已注册...')
return
while True:
print('欢迎来到注册功能'.center(46, '*'))
username = input('请输入您的用户名(按q退出)>>>:').strip()
if username == 'q':
break
path = settings.BASE_DIR
path_file = os.path.join(path, 'db', '%s.json' %username)
if os.path.exists(path_file):
print('用户名已存在,请再次输入')
else:
res = input('请输入您的密码>>>:').strip()
md5 = hashlib.md5()
md5.update(res.encode('utf8'))
password = md5.hexdigest()
# print(password)
user_dict = {'username': username,
'pwd': password,
'account': 10000,
'locked': False,
'flow': [],
'shopping_cart': {}
}
with open(path_file, 'w', encoding='utf8') as f:
json.dump(user_dict, f, ensure_ascii=False)
time.sleep(1)
from lib import common
logger1 = common.get_logger('用户注册')
logger1.debug('%s注册成功' % username)
print('恭喜您注册成功')
break
# 登录功能
def login():
count = 3
if user_data['is_login']:
print('您已登录...')
return
print('欢迎来到登录功能'.center(46, '*'))
while True:
username = input('请输入用户名(按q退出)>>>:').strip()
if username == 'q':
return
path = settings.BASE_DIR
path_file = os.path.join(path, 'db', '%s.json' % username)
if not os.path.exists(path_file):
print('用户不存在')
else:
res = input('请输入您的密码>>>:').strip()
md5 = hashlib.md5()
md5.update(res.encode('utf8'))
# password = md5.hexdigest()
print(password)
with open(path_file, 'r', encoding='utf8') as f:
data = json.load(f)
if data['locked'] is True:
print('您的账号已被锁定')
return
elif password == data.get('pwd'):
time.sleep(1)
print('登录成功')
logger1 = common.get_logger('用户登录')
logger1.debug('%s登录成功' % username)
user_data['username'] = username
user_data['is_login'] = True
return
else:
count -= 1
print('用户名或密码错误,还有%s次机会, 次数用完将锁定账号,无法登录' % count)
if count == 0:
data['locked'] = True
with open(path_file, 'w', encoding='utf8') as f1:
json.dump(data, f1, ensure_ascii=False)
logger1 = common.get_logger('用户登录锁定')
logger1.debug('%s登录锁定' % username)
print('账号已锁定')
return
# 转账功能
@common.login_auth
def transfer():
print('欢迎来到转账功能'.center(46, '*'))
while True:
to_user = input('您要转入的账户>>>:').strip()
if not to_user:
print('输入为空')
continue
path = settings.BASE_DIR
to_path_file = os.path.join(path, 'db', '%s.json' % to_user)
if not os.path.exists(to_path_file):
print('账户不存在')
continue
transfer_money = input('请输入您要转账的金额>>>:').strip()
if not transfer_money:
print('输入为空')
continue
if not transfer_money.isdigit():
print('输入不合法')
continue
transfer_money = int(transfer_money)
if transfer_money <= 0:
print('输入不合法')
continue
from_path_file = os.path.join(path, 'db', '%s.json' % user_data['username'])
with open(from_path_file, 'r', encoding='utf8') as f:
from_user_dict = json.load(f)
if from_user_dict['account'] >= transfer_money:
with open(to_path_file, 'r', encoding='utf8') as f1:
to_user_dict = json.load(f1)
to_user_dict['account'] += transfer_money
to_user_dict['flow'].append('在%s收到%s转账的%s元' % (current_time, from_user_dict['username'], transfer_money))
with open(to_path_file, 'w', encoding='utf8') as f2:
json.dump(to_user_dict, f2, ensure_ascii=False)
logger1 = common.get_logger('收到转账')
logger1.debug('%s收到%s转账的%s元' %(to_user, from_user_dict['username'], transfer_money))
from_user_dict['account'] -= transfer_money
from_user_dict['flow'].append('在%s向%s转账了%s元' % (current_time, to_user_dict['username'], transfer_money))
with open(from_path_file, 'w', encoding='utf8') as f3:
json.dump(from_user_dict, f3, ensure_ascii=False)
logger1 = common.get_logger('向用户转账')
logger1.debug('%s向%s转账了%s元' % (from_user_dict['username'], to_user, transfer_money))
print('转账成功')
break
else:
print('您的金库不足')
# 提现功能
@common.login_auth
def withdraw():
print('欢迎来到提现功能'.center(46, '*'))
while True:
money = input('请输入提现金额>>>:').strip()
if not money:
print('输入为空')
continue
if not money.isdigit():
print('输入不合法')
continue
money = int(money)
if money <= 0:
print('输入不合法')
path = settings.BASE_DIR
path_file = os.path.join(path, 'db', '%s.json' %user_data['username'])
with open(path_file, 'r', encoding='utf8') as f:
data = json.load(f)
if data['account'] >= money * 1.05:
data['account'] -= money * 1.05
data['flow'].append('%s在%s提现了%s元' % (user_data['username'], current_time, money))
with open(path_file, 'w', encoding='utf8') as f1:
json.dump(data, f1, ensure_ascii=False)
logger1 = common.get_logger('提现成功')
logger1.debug('%s提现成功%s元' % (user_data['username'], money))
time.sleep(2)
print('提现成功')
break
else:
print('余额不足,努力吧骚年!')
# 充值功能
@common.login_auth
def pay():
print('欢迎来到充值功能'.center(46, '*'))
while True:
momey = input('请输入充值金额>>>:').strip()
if not momey:
print('输入为空')
continue
elif not momey.isdigit():
print('输入金额不合法')
continue
momey = int(momey)
if momey <= 0:
print('输入金额不合法')
continue
path = settings.BASE_DIR
path_file = os.path.join(path, 'db', '%s.json' % user_data['username'])
with open(path_file, 'r', encoding='utf8') as f:
data = json.load(f)
data['account'] += momey
data['flow'].append('%s在%s充值了%s元' % (user_data['username'], current_time, momey))
with open(path_file, 'w', encoding='utf8') as f1:
json.dump(data, f1, ensure_ascii=False)
logger1 = common.get_logger('用户充值')
logger1.debug('%s充值成功%s元' % (user_data['username'], momey))
print('充值成功')
break
# 查看余额
@common.login_auth
def check_balance():
print('查看余额'.center(46, '*'))
path = settings.BASE_DIR
path_file = os.path.join(path, 'db', '%s.json' % user_data['username'])
with open(path_file, 'r', encoding='utf8') as f:
res = json.load(f)
print('您的余额为%s' % (res['account']))
logger1 = common.get_logger('查看余额')
logger1.debug('%s查看余额' % user_data['username'])
# 查看流水
@common.login_auth
def check_flow():
print('查看流水'.center(46, '*'))
path = settings.BASE_DIR
path_file = os.path.join(path, 'db', '%s.json' % user_data['username'])
with open(path_file, 'r', encoding='utf8') as f:
res = json.load(f)
print(res['flow'])
logger1 = common.get_logger('查看流水')
logger1.debug('%s查看流水' % user_data['username'])
# 加入购物车
@common.login_auth
def add_cart():
print('欢迎来到商品界面'.center(46, '*'))
shopping_cart = {}
while True:
goods_list = [
['奔驰', 2000],
['宝马', 1000],
['奥迪', 1500],
['兰博基尼', 99999]
]
for k, v in enumerate(goods_list):
print(k + 1, v[0], v[1])
num = input('选择你要加入购物车的商品编号(按q退出)>>>:').strip()
if not num:
print('输入为空')
continue
if num.isdigit():
num = int(num)
if num >= (len(goods_list) + 1) or num == 0:
print('商品不存在')
continue
goods_name = goods_list[num - 1][0]
good_price = goods_list[num - 1][1]
path = settings.BASE_DIR
path_file = os.path.join(path, 'db', '%s.json' % user_data['username'])
with open(path_file, 'r', encoding='utf8') as f:
user_dict = json.load(f)
if goods_name not in shopping_cart:
shopping_cart[goods_name] = {'price': good_price, 'count': 1}
else:
shopping_cart[goods_name]['count'] += 1
print('%s加入购物车成功' % goods_name)
continue
elif num == 'q':
if shopping_cart:
user_dict['shopping_cart'] = shopping_cart
path = settings.BASE_DIR
path_file = os.path.join(path, 'db', '%s.json' % user_data['username'])
with open(path_file, 'w', encoding='utf8') as f1:
json.dump(user_dict, f1, ensure_ascii=False)
logger1 = common.get_logger('加入购物车')
logger1.debug('%s往购物车加入了%s' % (user_data['username'], shopping_cart))
print('退出成功')
break
else:
print('输入内容不合法')
# 查看购物车
@common.login_auth
def check_shopping():
print('查看购物车'.center(46, '*'))
path = settings.BASE_DIR
path_file = os.path.join(path, 'db', '%s.json' % user_data['username'])
with open(path_file, 'r', encoding='utf8') as f:
res = json.load(f)
print(res['shopping_cart'])
logger1 = common.get_logger('查看购物车')
logger1.debug('%s查看了购物车' % (user_data['username']))
new_dict = {
'1': register,
'2': login,
'3': transfer,
'4': withdraw,
'5': pay,
'6': check_balance,
'7': check_flow,
'8': add_cart,
'9': check_shopping
}
def run():
while True:
print('欢迎来到买了么商城'.center(46, '='))
print('''
1.注册功能>>>
2.登录功能>>>
3.转账功能>>>
4.提现功能>>>
5.充值功能>>>
6.查看余额>>>
7.查看流水>>>
8.加入购物车>>>
9.查看购物车>>>
10.退出系统>>>
''')
print('天天开心哦'.center(47, '='))
choice = input('请输入您想执行功能的编号>>>:').strip()
if choice in new_dict:
func_name = new_dict.get(choice)
func_name()
elif choice == '10':
cmd = input('确定要退出吗,按q确认>>>:').strip()
if cmd == 'q':
time.sleep(2)
print('退出成功,欢迎下次光临!!!')
break
else:
print('输入内容不合法')
lib文件夹下的common.py文件:
from core import src
import logging.config
from conf import settings
def login_auth(func):
def inner(*args, **kwargs):
if src.user_data['is_login']:
return func(*args, **kwargs)
else:
src.login()
return inner
# 使用配置字典
def get_logger(name):
logging.config.dictConfig(settings.LOGGING_DIC) # 自动加载字典中的配置
logger1 = logging.getLogger(name)
return logger1