ATM项目详解

内容概要:

  • ATM项目
  • 代码实操流程

ATM项目

# 需求:
"""
- 额度15000或自定义
- 支持多账户登录
- 可以查看账户余额
- 可以提现(可自定义手续费比例)
- 提供还款接口
- 支持账户间转账
- 记录每月日常消费流水
- 实现购物商城,买东西加入购物车,调用信用卡接口结账
- 提供管理接口,包括添加账户、用户额度,冻结账户等
- ATM记录操作日志
- 用户认证功能
"""
# 首先我们要先分析需求,得出它大概具有以下这些功能,我们对每个功能在进行具体分析
.注册
.登陆
.查看余额
.提现
.还款
.转账
.查看流水
.添加购物车功能
.查看购物车功能
.结算购物车功能
.管理员功能


我们在编写代码时应该遵循软件开发目录规范
bin
	start.py  # 启动文件处
core
	src.py  # 展示界面
conf 
	settings.py  # 设置文件
interface
	xx_interface.py  # 接口文件,不同种类的接口有不同的功能
lib
	common.py  # 通用功能
log
	xx.log  # 日志记录
db
	xx.json  # 用户数据记录
readme.md  # 说明书
requirements.txt  # 所需配置

'''我们在编写代码的时候也要最好根据分层的架构设计进行代码的编写'''
第一层:展示层
	展示层只负责给用户展示,所以用户在此层只能获得结果与输入内容
第二层:核心逻辑层
	核心逻辑层主要负责展示层传递来的数据进行判断运行,并返回结果给展示层
第三层:数据处理层
	在核心逻辑层可能需要数据处理层的配合,需要通过数据处理层传递给核心逻辑层进行逻辑判断
    
1.我们分好目录后首先应该在 src把我们的空函数以及所需的功能字典创建出来
2.可以先通过面条版代码把注册功能在src文件中写好
3.在根据具体的功能把这些代码分别分装到不同的文件中(这样我们以后在使用代码的时候只需要通过到模块的方式取出我们所需的功能即可)

代码实操

1.创建相应目录及相应py文件

如图所示:
完整的一个ATM相应应包含以下目录
并在文件下创建相应的文件
注意 db 目录 与 log 目录 我们可以通过代码的方式进行实现
其他目录我们可以通过os模块的 os.mkdir() 方法快速创建目录

image

2.在开始文件处编写 sys.path.append

我们应在bin目录下或者是根目录下 创建start.py文件
启动文件只做启动项目的功能
所以我们需要使用 sys模块
将启动文件的路径添加到文件系统环境变量中
通过os.path.dirname(__file__)方法获取绝对路径
并通过sys.path.append() 方法加入绝对路径

image

3.进入core目录下的src.py文件编写我们的展示层

如图所示:
我们已经定义了src文件为展示层,所以我们在这里只做信息的获取及展示功能
相关核心逻辑以及返回的消息统统在核心逻辑层与数据处理层做

image

4.注册功能编写

image

我们可以先通过面条版把基础的注册功能编写出来:
里面主要是在 用户文件路径获取的 与 文件的保存  这两个功能我们在编写后面的代码的时候会用到很多
所以 我们可以将保存文件的方法封装成函数 存储在lib目录下的 common.py文件中
这样以后我们用到保存的功能时候只需要调用common模块中的保存功能就可以了
同理,我们在获取用户路径的时候其实这些代码大部分为重复性代码,并且它们的主体部分都不会改变
所以我们可以将它们放入conf目录下的settings文件中,并把他们修改成大写,表示常量状态
这样一做我们的代码就会精简很多了

image

但是我们需要注意的是,现在我们是在src文件中,它是展示层并不是核心逻辑层,我们应该通过接口的方式去做逻辑判断,展示层我们只做信息的获取与结果的反馈
所以 如图:

image

image

至此我们注册功能就完成了

5.登录功能编写

注册功能我们编写完成后,登录功能也很简单,只需要根据注册功能的架构分层,模仿即可
谨记展示层 核心逻辑层 数据处理层 三者之间的关系即可

image

image

我们通过数据处理层的select函数 就可以得到用户的数据
注意:user_interface接口中 登录接口的编写我其实是把后面的一些功能添加进去了,大家只需要看登录的逻辑即可。
主要是判断用户名是否存在
判断用户密码是否与数据存储的数据一致

6.判断用户是否登录功能编写

我们在需求中能知道
当我们使用登录功能登录了以后,所有的功能我们都可以使用
如果没有登录是不能直接使用除注册登录意外的功能的
但是正常编写的话我们需要每次使用功能都校验一下身份,非常繁琐!
那么我们就需要一个装饰器来增强我们的功能
并且我们也需要一个全局变量来记录用户的登录状态

image

如果字典有值那么说明登录成功了,后续的功能也无需校验即可使用了

如果没有值,那么说明没有登录,我们可以直接通过src调用登录方法帮助它一下

image

我们也要注意,因为装饰器我们几乎每个功能上面都要加,那么它就应该是一个公共的功能
所以我们为了分类管理把他放在lib目录下的common文件中
这样我们在用户登录成功的同时将全局变量中的用户登录信息改为用户输入的username 
方便我们在写其他功能的时候方便得知具体用户的信息

7.查看账户余额

由于这个功能比较简单,因为我们已经在db_handler里面添加了两个方法 
一个负责保存 save(用户字典) 
一个负责查询数据select(用户名)
所以我们直接在interface里面创建bank_interface.py文件
并且在展示层调用接口即可!

image

8.提现功能

提现功能逻辑:
1.展示层获取用户输入 并将输入内容与用户名传递到核心逻辑层
2.核心逻辑层调用数据处理层获取用户信息 通过异常捕获判断用户输入是否合法
3.用户数据内金额与用户输入金额比较
4.返回结果
'''在处理数据的时候添加了手续费这一个操作,所以只需要在比较 修改 保存 数据值时注意有手续费即可'''

image

image

9.充值

展示层:
获取用户名与充值金额
调用bank_interface接口传递数据
用变量名来接收接口的返回值
核心逻辑层:
根据传递进来的用户名,获取用户信息
做还款金额与现有金额大小判断
并得出结果返回

image

10.转账

展示层:
获取 待转账用户名、转账金额、用户名
调用bank_interface接口传递数据
用变量名来接收接口的返回值
核心逻辑层:
根据传递进来的用户名,获取用户信息
用转账金额与用户名下金额比较
减去自身金钱并保存
转账用户金额自增转账金额数量

image

11.增添购物车

展示层:
获取 用户名
调用shop_interface接口传递数据
核心逻辑层:
获取用户输入商品编号及数量
判断数据是否正确
判断选择商品是否已经存在临时购物车
有则自增数量、无则新增
若输入相对应指令
根据传递进来的用户名,获取用户信息
判断临时购物车中商品是否存在用户信息数据中
如有则自增数量,无则新增
保存修改后的数据

image

12.结算购物车

展示层:
调用bank_interface结构传递用户名
核心逻辑层:
根据传递进来的用户名,获取用户信息
判断购物车是否为空
不为空循环购物车获取数量与单价相乘得出总价
判断现有金额与总价大小
如果现有金额大则修改对应金额数据并保存

image

13.管理员功能

冻结账户
1.用户必须登录而且必须是管理员
	给每个用户字典再添加一个用于标识是否是管理员身份的键值对
		is_admin:false
2.如何判断用户是否登录并且是否是管理员
	判断用户是否登录已经在之前的功能中编写了一个装饰器
 	用户登录成功之后获取用户的身份并在第一层字典中记录
    	is_login = {
            'username':'',
            'is_admin':None
        }
	校验是否是管理员有很多种方式
    	直接在函数体代码中加if判断
    	将装饰器变成有参的版本(normal admin)
        	通过额外参数的不同在装饰器中校验完用户登录之后是否继续校验用户是否是管理员
3.冻结账户
	1.获取系统中除管理员意外的用户名单
 	2.管理员选择想要冻结的账户
 	3.获取该账户字典数据 修改用于标识是否冻结的键值对 is_lock
	4.需要在项目登录功能处 添加用户是否已被冻结的校验 

image

image

image

posted @ 2022-10-31 21:02  dd随风  阅读(153)  评论(0)    收藏  举报