4.2
ATM + 购物车工程
准备
readme.md:项目的说明书
-
项目需求
额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还款接口 ATM记录操作日志 提供管理接口,包括添加账户、用户额度,冻结账户等。。。 用户认证用装饰器xxxxxxxxxx
一个项目如何从无到有
需求分析
-
拿到项目会先在客户那里一起讨论需求,商量项目的功能能否实现,周期与价格,得到一个需求文档
-
公司内部开一个会,最终得到一个开发文档,交给不同岗位的程序员开发
不同的岗位:
- UI:设计软件的布局,会将软件的外观切成一张张图片
- 前端:根据拿到的图片去搭建网页界面,设计一些页面中,哪些位置需要接收数据,需要进行数据交互
- 后端:直接核心的业务逻辑,调度数据库进行数据的增删改查
- 测试:给代码进行全面测试,比如压力测试,界面测试
- 运维:搭建项
程序的架构设计
程序设计的好处
- 思路清晰
- 不会出现写一半代码时推翻重写
- 方便自己或以后的同事维护
分层
-
用户视图层
用于与用户进行交互,接收用户输入的数据,交给接口层进行处理,接口层最终会将一个结果返回给视图层,展示给用户看
- 登陆功能:显示提示信息,接收输入
-
逻辑接口层
相当于用户视图层与数据处理层的桥梁,专门负责接收用户视图层传过来的数据,并进行核心的逻辑校验,通过或不通过后会返回一个结果给用户视图层进行展示
- 登陆功能:调用数据处理层看用户名是否存在,若存在,则继续校验密码,若不存在,则返回结果给视图层,重新输入
-
数据处理层
接收接口层传递来的参数,可以增加,查看,删除,更新数据等操作
- 登陆功能:根据用户名查询数据,若有则返回数据给接口层,若没有,则默认返回None
-
在接口层之上再添加日志,流水的纪录功能
-
接口层,数据处理层,视图层都可以调用公共方法
分层的好处
- 在更换运行环境的时候,比如从网页端换到app端,只需更换视图层,不需要动别的层
- 要更换数据取得的方式时,接口层和视图层也不用更换,只要写新的数据处理层即可
- 可以在接口层,准确地纪录日志
需求分析
1. 注册功能
2. 购物功能
3. 支付功能(提现功能)
4. 登陆功能
5. 转账功能
6. 纪录流水功能
7. 还款(充值功能)
8. 纪录日志功能
9. 管理员功能(添加账户,设置额度,冻结账户)
10. 用户认证装饰器
用户使用的功能
1. 注册功能
2. 购物功能
3. 查看购物车
4. 转账
5. 提现
6. 登陆
7. 查看流水
8. 还款
9. 管理员功能
10. 查看余额
开始创建目录
lib
--common
core
--src 用户视图层
interface
--user_interface 用户相关接口
--bank_interface ATM相关接口
--shop_interface 购物车相关接口
db
--user_data
--deimos.json
--aaa.json
--db_handler 数据处理层,专门用于处理数据
log
--access.log
start.py
开始写程序
思路要点
注册
-
注册功能中的user_dic 放在逻辑接口层,调用接口层的注册接口,将用户名与密码传给接口层处理
from interface import user_interface ... register_interface(ipt_uername,ipt_pwd) ... def register_interface(ipt_uername,ipt_pwd,balance=15000)
-
db文件夹下创建user_data文件夹,里面放user.json,每一个用户的数据单独存放在一个json文件里
-
注册的时候判断用户名是否存在,只需要看是否存在 用户名.json 文件
-
json.dump(user_dic,f,ensure_ascii=False),可以显示json中文件的功能
-
输入账户名,密码放在视图层:scr.py
-
逻辑层中使用common.py 中的方法得到md5的密码
-
查看用户名.json 文件是否存在,放在数据层:db_handler.py,封装成函数getUserInfo,username作为函数的参数传入
getUserInfo
-
拼接json文件路径
-
os.path.exists(user_path)
-
若存在文件,打开文件返回数据
-
若不存在文件,返回None
-
-
验证用户名未注册后,数据处理层接收逻辑层的user_dic,通过字典拿到用户名,保存到 json文件中
-
逻辑层返回 flag , msg 给视图层,src.py通过flag判断注册结果,再打印msg。判断:成功则结束,不成功继续循环
登陆
- 用户视图层显示提示信息,让用户输入用户名与密码
- 调用接口层
login_interface
传入输入用户名与密码 - 逻辑层中使用common.py 中的方法得到md5的密码
- 调用数据层方法 db_handler
- login_interface ,使用getUserInfo 先查看用户是否存在
- 如果存在,则返回user_dic
- user_dic.get(‘password’) 校验 md5 密码是否一致
- 一致,返回登陆成功信息
- 不一致,返回密码错误
- user_dic.get(‘password’) 校验 md5 密码是否一致
- 返回用户不存在信息
- 视图层判断登陆结果,全局变量记录用户是否已经登陆
登陆认证
-
写成装饰器,放在逻辑层代码函数的上面
@common.login_auth
-
就不写两层菜单了,直接显示所有的功能,用认证功能来登陆
查看余额
- 使用登陆认证装饰器中的login_user,传到逻辑层
- 使用user_interface_check_bal,调用数据处理层的getUserIfo,得到user_dic,取出user_dic 中的balance返回到视图层
- 打印返回得到的金额
提现功能
- 视图层,提示输入金额,接收输入,判断isdighi
- 金额,login_user 传给接口层处理,使用bank_interface
- 定义
withdraw(login_user,amount)
- 获取用户字典
- db_handler.getUserIfo(login_user)
- 判断用户的钱是否足够
- 足够
- amount * 手续费
- if balance > amount
- 修改字典中的金额
- user_dic[’balance’] -= amount
- 保存修改后的数据到文件
- db_handler.save
- return True , 提现成功消息
- 余额不足
- return False,提现不成功消息
- 获取用户字典