一、目录规范
二 、readme
# ATM + 购物车项目
# 一个项目是如何从无到有的
# 1 、需求分析(需要关注)
额度 15000 或 自定义 ---> 注册功能
实现购物商城,买东西加入 购物车 ,调用 信用卡接口 结账 ----> 购物功能、支付功能
可以提现 ,手续费5% ---> 提现功能
支持多账户登录 ---> 登录功能
支持账户间转账 ---> 转账功能
记录消费流水 ---> 记录流水功能
提供还款接口 ---> 还款功能
ATM记录操作日志 ---> 记录日志功能
提供管理接口,包括添加账户、修改用户额度,冻结账户等 。 。。 ---> 管理员功能(添加账户 、修改用户额度 ,冻结账户)
用户认证用装饰器 ---> 登录认证装饰器‘
# 用户界面允许用户能选择的功能
1.注册功能
2.登录功能
3.查看余额
4.提现功能
5.还款功能
6.转账功能
7.查看流水
8.购物功能
9.查看购物车功能
10.管理员功能
- 添加账户、修改用户额度,冻结账户
# 2、程序的架构设计(需要关注)
- 三层架构(*******)
- 视图层: 专门用于与用户交互;
- 展示功能给用户看 、接收用户输入的数据、将功能返回的结果展示给用户看的;
- 接口层: 专门做业务逻辑的处理;
- 接收到用户输入的数据,进行逻辑判断 ,然后返回判断后的结果给视图层;
- 数据层: 专门做数据的处理
- 增加数据
- 删除数据
- 更新数据
- 查看数据
# 3、分任务开发
- 项目经理:(项目的负责人)
- UI(1-2人): 界面设计(app端的界面/web界面)。
- 前端(1-2人): 拿到UI的设计图纸,开发页面 。
- 后端(2-3人): 开发业务逻辑
- 运维(1人): 拿到开发好的代码,部署再 “服务器” 中 ,上线运行
# 4 、测试软件
# 5、上线运营
三、start.py
# 启动程序入口
# 1.将当前ATM项目工程,添加解释器的环境变量
import os # 与操作系统进行交互
import sys # 与解释器进行交互
# 1) 获取ATM的目录路径
base_path = os.path.dirname(__file__)
# 2) 将项目路径添加到解释器的环境变量中
sys.path.append(base_path)
# 3) 将视图层中的执行函数,引用到当前位置执行
from core import src
if __name__ == '__main__':
# 执行src模块中的run函数
src.run()
四 、conf---->settings
# 配置文件(常量)
import os
# ATM根目录路径
# D:\python全栈15期\day18\ATM
BASE_PATH = os.path.dirname(os.path.dirname(__file__))
# DB目录路径
# D:\python全栈15期\day18\ATM\db
DB_PATH = os.path.join(BASE_PATH, 'db')
五、core--->src
# 视图层
from interface import user_interface
from interface import bank_interface
from lib import common
# 专门用于记录用户是否登录 ,登录状态
user_info = {
'user': None
}
# 拆分三层架构版本
def register():
while True:
# 1) 让用户输入用户名与密码
username = input('请输入用户名: ').strip()
password = input('请输入密码: ').strip()
re_password = input('请输入密码: ').strip()
# 2)小的逻辑判断
if password == re_password:
# 3) 再视图层中调用注册接口,将用户与密码传递给注册接口做 核心逻辑的处理
# flag, msg = (False, '用户已存在,请重新输入')
flag, msg = user_interface.register_interface(username, password)
# True, f'用户[{username}]注册成功'
if flag:
print(msg)
break
# False, '用户已存在 ,请重新输入'
else:
print(msg)
else:
print('两次密码不一致 ,请重新输入!')
# 2.登录功能
def login():
while True:
# 1) 让用户输入用户名与密码
username = input('请输入用户名: ').strip()
password = input('请输入密码: ').strip()
# 3) 再视图层中调用 登录接口 ,将用户与密码传递给登录接口做 核心逻辑的处理
flag, msg = user_interface.login_interface(username, password)
# True, f'用户[{username}]登录成功'
if flag:
print(msg)
user_info['user'] = username
break
# False, '用户已存在,请重新输入'
else:
print(msg)
# 3.查看余额
@common.login_auth
def check_bal():
# 直接调用查看余额接口层 ,获取数据
bal = user_interface.check_bal_interface(user_info.get('user'))
print(f'当前用户的余额为:[{bal}]')
# 4.提现功能
@common.login_auth
def withdraw():
while True:
# 1) 输入需要提现的金额
balance = input('请输入需要提现的金额:').strip()
# 小的逻辑判断,判断是否是数字,若是数字则转为int类型
if not balance.isdigit():
print('请输入数字类型!')
continue
# str ---> int
balance = int(balance)
# 2) 调用提现接口
# flag, msg = (True, f'提现[{money}]成功! 手续费为:[{money2 - money}]')
flag, msg = bank_interface.withdraw_interface(user_info.get('user'), balance)
# 3)打印接口返回的结果
if flag:
print(msg)
break
else:
print(msg)
# 5.还款功能
@common.login_auth
def repay():
while True:
# 1) 让用户输入还款金额
money = input('请输入需要还款的金额: ').strip()
# 2) 小的逻辑判断 ,判断是否是数字,若是数字则转为int类型
if not money.isdigit():
print('请输入数字类型!')
continue
money = int(money)
# 3) 调用还款接口
msg = bank_interface.repay_interface(user_info.get('user'), money)
print(msg)
break
# 6.转账功能
@common.login_auth
def transfer():
pass
# 7.查看流水
@common.login_auth
def check_flow():
pass
# 8.购物功能
@common.login_auth
def shopping():
pass
# 9.查看购物车功能
@common.login_auth
def check_shop_car():
pass
# 10.管理员功能
@common.login_auth
def admin():
pass
# 函数功能字典
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('1') ---> register()
func_dic.get(choice)()
# 1.注册功能
# 不分层版本
# def register():
# while True:
# username = input('请输入用户名: ').strip()
# password = input('请输入密码: ').strip()
# re_password = input('请输入密码: ').strip()
#
# if password == re_password:
#
# # 组织用户的数据 ,转成json数据 --> json_str 保存到文件中
# # 逻辑处理
# user_dic = {
# 'name': username,
# 'pwd': password,
# 'balance': 15000,
# 'flow': [],
# # 'shop_car': {'商品名称': ['商品数量', '单价']}
# 'shop_car': {},
# 'locked': False
# }
# # D:\python全栈15期\day18\ATM\db\tank.json
# # 以每个注册 “用户的名字 ” 作为json文件名
# user_path = os.path.join(settings.DB_PATH, '%s.json' % username)
#
# # 判断当前注册用户是否存在,os.path.exists(需要判断的文件路径)
# if os.path.exists(user_path):
# print('用户已存在,请重新输入!')
# continue
#
# with open(user_path, 'w', encoding='utf-8') as f:
# # dict ---> json_str ---> f.write(json_str) ----> json文件中
# json.dump(user_dic, f)
# # 文件刷新
# f.flush()
#
# print(f'用户[{username}]注册成功')
# break
# else:
# print('两次密码不一致 ,请重新输入!')
六、db---->handler
# 数据层
import json
from conf import settings
import os
# 1 、查看数据
def select(username):
# 用户json文件的路径
user_path = os.path.join(settings.DB_PATH, '%s.json' % username)
# 判断当前注册用户是否存在,os.path.exists(需要判断的文件路径)
if os.path.exists(user_path):
# 读取文件中的数据
with open(user_path, 'r', encoding='utf-8') as f:
# f.read() ---> json_str ---> python
user_dic = json.load(f)
return user_dic
# 2 、保存数据
def save(user_dic):
# 用户json文件的路径
user_path = os.path.join(settings.DB_PATH, '%s.json' % user_dic['name'])
# 将数据写入文件中
with open(user_path, 'w', encoding='utf-8') as f:
# dict ---> json_str ---> f.write(json_str) ----> json文件中
json.dump(user_dic, f)
# 文件刷新
f.flush()
七、interface
bank_interface.py
# 银行功能接口
from db import db_handler
# 提现接口
def withdraw_interface(username, money):
user_dic = db_handler.select(username)
# 可以提现,手续费5%
# 1) 判断用户账户的金额是否 ,大于等于 提现金额 + 5%手续费
# 提现金额 + 5%手续费 money + money * 0.05
money2 = money * 1.05
if user_dic.get('balance') >= money2:
# 给当前用户字典金额减钱
user_dic['balance'] -= money2
db_handler.save(user_dic)
return True, f'提现[{money}]成功! 手续费为:[{money2 - money}]'
else:
return False, '余额不足 ,快去充钱!'
# 还款接口
def repay_interface(username, money):
# 1) 先将当前用户字典取出来
user_dic = db_handler.select(username)
# 2)直接加钱
user_dic['balance'] += money
# 3)再更新数据
db_handler.save(user_dic)
return f'还款[{money}]成功!'
user_interface.py
# 用户功能接口
from db import db_handler
# 注册接口
def register_interface(username, password):
# 逻辑处理 ---> 接口层
# 1) 去数据处理层获取用户数据
# user_dic ---> 用户字典 / None
user_dic = db_handler.select(username)
# 2) 若user_dic有数据,则代表用户存在,返回用户已存在 ,请重新输入给
if user_dic:
return False, '用户已存在,请重新输入' # ---》 return (False, '用户已存在,请重新输入')
# 3) 若用户不存在 ,则可以注册
# 组织用户的数据,转成json数据 --> json_str 保存到文件中
user_dic = {
'name'
本文版权归去快排wWw.seogUrublog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系qq❉61910465