readme.md(项目说明书):
额度15000 或 自定义 ---> 注册功能
实现购物商城,买东西加入 购物车,调用信用卡接口 结账 ---> 购物功能,支付功能
可以提现,手续费5% ---> 提现功能
支持多账户登录 ---> 登录功能
支持账户间转账 ---> 转账功能
记录消费流水 ---> 记录流水功能
提供还款接口 ---> 还款功能
ATM记录操作日志 ---> 记录日志功能
提供管理接口,包括添加账户,修改用户额度,冻结账户等... --->管理员功能(添加账户,修改用户额度,冻结账户)
用户认证用装饰器 ---> 登录认证装饰器
1.注册功能
2.登录功能
3.查看余额
4.提现功能
5.还款功能
6.转账功能
7.查看流水
8.购物功能
9.查看购物车功能
10.管理员功能
- 添加账户,修改用户额度,冻结账户
- 三层架构(*****)
- 视图层:专门用于与用户交互;
- 展示功能给用户看,接收用户输入的数据,将功能返回的结果展示给用户看的;
- 接口层:专门做业务逻辑的处理:
- 接收到用户输入的数据,进行逻辑判断,然后返回判断后的结果给视图层;
- 数据层: 专门做数据的处理
- 增加数据
-删除数据
-更新数据
-查看数据
- 项目经理:(项目的负责人)
- UI (1-2人): 界面设计(app端的界面/web界面)
-前端(1-2人): 拿到UI的设计图纸,开发页面
-后端(2-3人): 开发业务逻辑
-运维(1人): 拿到开发好的代码,部署在'服务器'中,上线运行
start.py(启动文件):
import os
import sys
base_path = os.path.dirname(__file__)
sys.path.append(base_path)
from core import src
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')
'''
日志配置信息
'''
"""
logging配置
"""
import os
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]'
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
LOG_DRI_PATH = os.path.join(BASE_PATH, 'log')
LOG_FILE_NAME = 'access.log'
if not os.path.isdir(LOG_DRI_PATH):
os.mkdir(LOG_DRI_PATH)
LOG_FILE_PATH = os.path.join(LOG_DRI_PATH, LOG_FILE_NAME)
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'
},
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'standard',
'filename': LOG_FILE_PATH,
'maxBytes': 1024*1024*5,
'backupCount': 5,
'encoding': 'utf-8',
},
},
'loggers': {
'': {
'handlers': ['default', 'console'],
'level': 'DEBUG',
'propagate': True,
},
},
}
lib(公共方法文件夹)
common.py(公共方法文件):
import os
from conf import settings
def login_auth(func):
from core import src
def inner(*args, **kwargs):
if src.user_info.get('user'):
res = func(*args, **kwargs)
return res
else:
src.login()
return inner
def get_user_dic():
user_file_list = os.listdir(settings.DB_PATH)
user_name_dic = {}
number = 1
for user_file_name in user_file_list:
if user_file_name.endswith('.json'):
user_name = user_file_name.split('.')[0]
user_name_dic[str(number)] = user_name
number += 1
return user_name_dic
import logging.config
def get_logger(user_type):
logging.config.dictConfig(settings.LOGGING_DIC)
logger = logging.getLogger(user_type)
return logger
db(数据文件)
db_handler.py(数据处理功能文件):
import json
from conf import settings
import os
def select(username):
user_path = os.path.join(settings.DB_PATH, '%s.json' % username)
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):
user_path = os.path.join(settings.DB_PATH, '%s.json' % user_dic['name'])
with open(user_path, 'w', encoding='utf-8') as f:
json.dump(user_dic, f, ensure_ascii=False)
f.flush()
core(视图层)
src.py
from interface import user_interface
from interface import bank_interface
from interface import shop_interface
from lib import common
user_info = {
'user': None
}
def register():
while True:
username = input('请输入用户名: ').strip()
password = input('请输入密码: ').strip()
re_password = input('请输入密码: ').strip()
if password == re_password:
flag, msg = user_interface.register_interface(username, password)
if flag:
print(msg)
break
else:
print(msg)
else:
print('两次密码不一致,请重新输入!')
def login():
while True:
username = input('请输入用户名: ').strip()
password = input('请输入密码: ').strip()
flag, msg = user_interface.login_interface(username, password)
if flag:
print(msg)
user_info['user'] = username
break
else:
print(msg)
@common.login_auth
def check_bal():
bal = user_interface.check_bal_interface(user_info.get('user'))
print(f'当前用户的余额为:[{bal}]')
@common.login_auth
def withdraw():
while True:
balance = input('请输入需要提现的金额:').strip()
if not balance.isdigit():
print('请输入数字类型!')
continue
balance = int(balance)
flag, msg = bank_interface.withdraw_interface(user_info.get('user'), balance)
if flag:
print(msg)
break
else:
print(msg)
@common.login_auth
def repay():
while True:
money = input('请输入需要还款的金额: ').strip()
if not money.isdigit():
print('请输入数字类型!')
continue
money = int(money)
msg = bank_interface.repay_interface(user_info.get('user'), money)
print(msg)
break
@common.login_auth
def transfer():
while True:
target_user = input('请输入转账目标用户: ').strip()
money = input('请输入转账金额: ').strip()
if not money.isdigit():
print('请输入数字类型!')
continue
money = int(money)
flag, msg = bank_interface.transfer_interface(
target_user, user_info.get('user'), money)
if flag:
print(msg)
break
else:
print(msg)
@common.login_auth
def check_flow():
flow_list = bank_interface.check_flow_interface(user_info.get('user'))
if flow_list:
for line in flow_list:
print(line)
@common.login_auth
def shopping():
shop_car = {}
cost = 0
while True:
good_list = [
['广东凤爪', 50],
['矮根派', 2],
['oldboy牌坦克', 100000],
['macbook', 20000],
['公仔', 150]
]
print('========== 欢迎来到有趣商店 =========')
for index, good_l in enumerate(good_list):
good_name, good_price = good_l
print(f'商品编号: {index} 商品名称: {good_name} 商品单价: {good_price}')
print('========== 欢迎客官下次再来 =========')
choice = input('请输入商品编号: ').strip()
if not choice.isdigit():
print('请输入数字')
continue
choice = int(choice)
if choice not in range(len(good_list)):
print('编号有误,请重新输入')
continue
good_n, good_p = good_list[choice]
if good_n in shop_car:
shop_car[good_n][0] += 1
else:
shop_car[good_n] = [1, good_p]
cost += good_p
choice2 = input('请输入y确认购买,或输入n退出并加入购物车, 输入 其他键 则继续选择商品: ').strip()
if choice2 == 'y':
msg = bank_interface.pay_interface(
user_info.get('user'), cost
)
print(msg)
shop_car = {}
break
elif choice2 == 'n':
msg = shop_interface.add_shop_car_interface(
user_info.get('user'), shop_car)
print(msg)
shop_car = {}
break
print('当前购物车:', shop_car)
@common.login_auth
def check_shop_car():
shop_car = shop_interface.check_shop_car_interface(user_info.get('user'))
print(shop_car)
@common.login_auth
def admin():
from core import admin
admin_func_dic = {
'1': admin.add_user,
'2': admin.change_bal,
'3': admin.lock_user,
'4': admin.unlock_user,
}
while True:
print('''
1.添加账户
2.修改用户额度
3.冻结账户
4.解冻结账户
''')
choice = input('请输入功能编号: ').strip()
if choice not in admin_func_dic:
print('编号有误,请重新输入!')
continue
admin_func_dic.get(choice)()
func_dic = {
'1': register,
'2': login,
'3': check_bal,
'4': withdraw,
'5': repay,
'6': transfer,
'7': check_flow,
'8': shopping,
'9': check_shop_car,
'10': admin,
}
def run():
while True:
print('''
1.注册功能
2.登录功能
3.查看余额
4.提现功能
5.还款功能
6.转账功能
7.查看流水
8.购物功能
9.查看购物车功能
10.管理员功能
''')
choice = input('请输入功能编号: ').strip()
if choice not in func_dic:
print('编号有误,请重新输入!')
continue
func_dic.get(choice)()
interface(接口层)
user_interface(用户接口层):
from db import db_handler
from lib import common
user_logger = common.get_logger('user')
def register_interface(username, password):
user_dic = db_handler.select(username)
if user_dic:
return False, '用户已存在,请重新输入'
user_dic = {
'name': username,
'pwd': password,
'balance': 15000,
'flow': [],
'shop_car': {},
'locked': False
}
db_handler.save(user_dic)
user_logger.info(f'用户[{username}]注册成功')
return True, f'用户[{username}]注册成功'
def login_interface(username, password):
user_dic = db_handler.select(username)
if user_dic:
if password == user_dic.get('pwd'):
return True, f'用户[{username}]登录成功!'
else:
return False, '密码错误,请重新输入'
else:
return False, '用户不存在,请重新输入'
def check_bal_interface(username):
user_dic = db_handler.select(username)
return user_dic.get('balance')
bank_interface(银行接口层):
from db import db_handler
import time
from lib import common
bank_logger = common.get_logger('bank')
def withdraw_interface(username, money):
user_dic = db_handler.select(username)
money2 = money * 1.05
if user_dic.get('balance') >= money2:
user_dic['balance'] -= money2
flow_str = f'{time.strftime("%Y-%m-%d %X")} 提现[{money}]成功! 手续费为:[{money2 - money}]'
bank_logger.info(flow_str)
user_dic['flow'].append(flow_str)
db_handler.save(user_dic)
return True, flow_str
else:
return False, '余额不足,快去充钱!'
def repay_interface(username, money):
user_dic = db_handler.select(username)
user_dic['balance'] += money
flow_str = f'{time.strftime("%Y-%m-%d %X")} 还款[{money}]成功!'
bank_logger.info(flow_str)
user_dic['flow'].append(flow_str)
db_handler.save(user_dic)
return f'还款[{money}]成功!'
def transfer_interface(target_name, login_name, money):
'''
:param target_name: 目标用户
:param login_name: 当前用户
:param money: 转账金额
:return: bool, str
'''
target_user_dic = db_handler.select(target_name)
if not target_user_dic:
return False, '目标用户不存在!'
login_user_dic = db_handler.select(login_name)
if login_user_dic.get('balance') >= money:
target_user_dic['balance'] += money
login_user_dic['balance'] -= money
flow_str1 = f'{time.strftime("%Y-%m-%d %X")} 用户:[{login_name}] 给 用户:[{target_name}] 转账 [{money}]元!'
bank_logger.info(flow_str1)
flow_str2 = f'{time.strftime("%Y-%m-%d %X")} 用户:[{target_name}] 接收到 用户:[{login_name}] 转账 [{money}]元!'
login_user_dic['flow'].append(flow_str1)
target_user_dic['flow'].append(flow_str2)
db_handler.save(target_user_dic)
db_handler.save(login_user_dic)
return True, '转账成功'
else:
return False, '穷*,账户金额不足。'
def check_flow_interface(username):
user_dic = db_handler.select(username)
if user_dic.get('flow'):
return user_dic.get('flow')
def pay_interface(username, cost):
user_dic = db_handler.select(username)
if user_dic.get('balance') >= cost:
user_dic['balance'] -= cost
flow_str = f'{time.strftime("%Y-%m-%d %X")} 用户:[{username}] 购物支付金额为: [{cost}]'
user_dic['flow'].append(flow_str)
db_handler.save(user_dic)
return '支付成功'
else:
return '余额不足,退出程序!'
shop_interface(商店接口层):
from db import db_handler
def add_shop_car_interface(username, shop_car):
user_dic = db_handler.select(username)
for good_name in shop_car:
if good_name in user_dic.get('shop_car'):
user_dic['shop_car'][good_name][0] += shop_car[good_name][0]
else:
user_dic['shop_car'].update(
{good_name: shop_car[good_name]})
db_handler.save(user_dic)
return '添加购物车成功!'
def check_shop_car_interface(username):
user_dic = db_handler.select(username)
return user_dic.get('shop_car')