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() 方法快速创建目录
2.在开始文件处编写 sys.path.append
我们应在bin目录下或者是根目录下 创建start.py文件
启动文件只做启动项目的功能
所以我们需要使用 sys模块
将启动文件的路径添加到文件系统环境变量中
通过os.path.dirname(__file__)方法获取绝对路径
并通过sys.path.append() 方法加入绝对路径
3.进入core目录下的src.py文件编写我们的展示层
如图所示:
我们已经定义了src文件为展示层,所以我们在这里只做信息的获取及展示功能
相关核心逻辑以及返回的消息统统在核心逻辑层与数据处理层做
4.注册功能编写
我们可以先通过面条版把基础的注册功能编写出来:
里面主要是在 用户文件路径获取的 与 文件的保存 这两个功能我们在编写后面的代码的时候会用到很多
所以 我们可以将保存文件的方法封装成函数 存储在lib目录下的 common.py文件中
这样以后我们用到保存的功能时候只需要调用common模块中的保存功能就可以了
同理,我们在获取用户路径的时候其实这些代码大部分为重复性代码,并且它们的主体部分都不会改变
所以我们可以将它们放入conf目录下的settings文件中,并把他们修改成大写,表示常量状态
这样一做我们的代码就会精简很多了
但是我们需要注意的是,现在我们是在src文件中,它是展示层并不是核心逻辑层,我们应该通过接口的方式去做逻辑判断,展示层我们只做信息的获取与结果的反馈
所以 如图:
至此我们注册功能就完成了
5.登录功能编写
注册功能我们编写完成后,登录功能也很简单,只需要根据注册功能的架构分层,模仿即可
谨记展示层 核心逻辑层 数据处理层 三者之间的关系即可
我们通过数据处理层的select函数 就可以得到用户的数据
注意:user_interface接口中 登录接口的编写我其实是把后面的一些功能添加进去了,大家只需要看登录的逻辑即可。
主要是判断用户名是否存在
判断用户密码是否与数据存储的数据一致
6.判断用户是否登录功能编写
我们在需求中能知道
当我们使用登录功能登录了以后,所有的功能我们都可以使用
如果没有登录是不能直接使用除注册登录意外的功能的
但是正常编写的话我们需要每次使用功能都校验一下身份,非常繁琐!
那么我们就需要一个装饰器来增强我们的功能
并且我们也需要一个全局变量来记录用户的登录状态
如果字典有值那么说明登录成功了,后续的功能也无需校验即可使用了
如果没有值,那么说明没有登录,我们可以直接通过src调用登录方法帮助它一下
我们也要注意,因为装饰器我们几乎每个功能上面都要加,那么它就应该是一个公共的功能
所以我们为了分类管理把他放在lib目录下的common文件中
这样我们在用户登录成功的同时将全局变量中的用户登录信息改为用户输入的username
方便我们在写其他功能的时候方便得知具体用户的信息
7.查看账户余额
由于这个功能比较简单,因为我们已经在db_handler里面添加了两个方法
一个负责保存 save(用户字典)
一个负责查询数据select(用户名)
所以我们直接在interface里面创建bank_interface.py文件
并且在展示层调用接口即可!
8.提现功能
提现功能逻辑:
1.展示层获取用户输入 并将输入内容与用户名传递到核心逻辑层
2.核心逻辑层调用数据处理层获取用户信息 通过异常捕获判断用户输入是否合法
3.用户数据内金额与用户输入金额比较
4.返回结果
'''在处理数据的时候添加了手续费这一个操作,所以只需要在比较 修改 保存 数据值时注意有手续费即可'''
9.充值
展示层:
获取用户名与充值金额
调用bank_interface接口传递数据
用变量名来接收接口的返回值
核心逻辑层:
根据传递进来的用户名,获取用户信息
做还款金额与现有金额大小判断
并得出结果返回
10.转账
展示层:
获取 待转账用户名、转账金额、用户名
调用bank_interface接口传递数据
用变量名来接收接口的返回值
核心逻辑层:
根据传递进来的用户名,获取用户信息
用转账金额与用户名下金额比较
减去自身金钱并保存
转账用户金额自增转账金额数量
11.增添购物车
展示层:
获取 用户名
调用shop_interface接口传递数据
核心逻辑层:
获取用户输入商品编号及数量
判断数据是否正确
判断选择商品是否已经存在临时购物车
有则自增数量、无则新增
若输入相对应指令
根据传递进来的用户名,获取用户信息
判断临时购物车中商品是否存在用户信息数据中
如有则自增数量,无则新增
保存修改后的数据
12.结算购物车
展示层:
调用bank_interface结构传递用户名
核心逻辑层:
根据传递进来的用户名,获取用户信息
判断购物车是否为空
不为空循环购物车获取数量与单价相乘得出总价
判断现有金额与总价大小
如果现有金额大则修改对应金额数据并保存
13.管理员功能
冻结账户
1.用户必须登录而且必须是管理员
给每个用户字典再添加一个用于标识是否是管理员身份的键值对
is_admin:false
2.如何判断用户是否登录并且是否是管理员
判断用户是否登录已经在之前的功能中编写了一个装饰器
用户登录成功之后获取用户的身份并在第一层字典中记录
is_login = {
'username':'',
'is_admin':None
}
校验是否是管理员有很多种方式
直接在函数体代码中加if判断
将装饰器变成有参的版本(normal admin)
通过额外参数的不同在装饰器中校验完用户登录之后是否继续校验用户是否是管理员
3.冻结账户
1.获取系统中除管理员意外的用户名单
2.管理员选择想要冻结的账户
3.获取该账户字典数据 修改用于标识是否冻结的键值对 is_lock
4.需要在项目登录功能处 添加用户是否已被冻结的校验
ATM项目详解的更多相关文章
- eclipse里面构建maven项目详解(转载)
本文来源于:http://my.oschina.net/u/1540325/blog/548530 eclipse里面构建maven项目详解 1 环境安装及分配 Maven是基于项目对象模 ...
- Redis 配置文件 redis.conf 项目详解
Redis.conf 配置文件详解 # [Redis](http://yijiebuyi.com/category/redis.html) 配置文件 # 当配置中需要配置内存大小时,可以使用 1k, ...
- Mac下Intellij IDea发布Web项目详解一
Mac下Intellij IDea发布Web项目详解一 Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二 Mac下Intellij IDea发布J ...
- Mac下Intellij IDea发布Java Web项目详解五 开始测试
测试前准备工作目录 Mac下Intellij IDea发布Web项目详解一 Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二 Mac下Intell ...
- JAVA Eclipse使用Maven构建web项目详解(SSM框架)
tips: 启动项目后,welcome-file的链接即为测试用例 部署maven web项目 Eclipse使用Maven构建web项目详解 pom.xml添加webapp依赖: <depen ...
- 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+SpringMVC项目详解
http://blog.csdn.net/noaman_wgs/article/details/53893948 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+Spri ...
- [转帖](整理)GNU Hurd项目详解
(整理)GNU Hurd项目详解 http://www.ha97.com/3188.html 发表于: 开源世界 | 作者: 博客教主 标签: GNU,Hurd,详解,项目 Hurd原本是要成为GNU ...
- tomcat通过tomcat 安装根目录下的conf-Catalina-localhost目录发布项目详解
tomcat通过conf-Catalina-localhost目录发布项目详解 Tomcat发布项目的方式大致有三种,但小菜认为通过在tomcat的conf/Catalina/localhost目 ...
- Usage、Usage Minimum和Usage Maximum项目详解
(1)一个产生多个数据域(Report Count>1)的主项目之前有一个以上的[用途]时,每个[用途]与一个数据域依次对应,如果数据域个数(Report Count)超过[用途]的个数,则剩余 ...
- Vue.js项目详解
还是以Blog项目来讲解,最近我本人利用闲暇时间,以博客作为参考学习一些新的技术并尝试之前没有尝试过的思路来玩玩. 技术看似枯燥,但是带有一个目的来学,你会发现还是蛮有趣的. 主要实践的就是前后端分离 ...
随机推荐
- PLSQL 与 PLPGSQL
KingbaseES 为了更好地适应用户的oracle 应用,实现了对 plsql 的支持,用户可以根据需要使用 plsql 或 plpgsql. 以下简要介绍下二者的差异 一.格式差异 1.plpg ...
- Docker(一):初识
1.什么是Docker Docker 是一个基于Go 语言并遵从Apache2.0协议开源的.轻量级的容器引擎,主要运行于 Linux 和 Windows,用于创建.管理和编排容器.可以让开发者打 ...
- 使用读写分离模式扩展 Grafana Loki
转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247500127&idx=1&sn=995987d558 ...
- 9个常用的Shell脚本
1.Dos 攻击防范(自动屏蔽攻击 IP) #!/bin/bash DATE=$(date +%d/%b/%Y:%H:%M) LOG_FILE=/usr/local/nginx/logs/demo2. ...
- Kibana:在Kibana中对数据进行深入分析
- 修改 Docker容器 自动启动/不自动启动,挂载路径,存储位置
有时候创建容器时忘了添加参数 --restart=always,当 Docker 重启时,容器未能自动启动, 现在要添加该参数怎么办呢,方法有二: 1.Docker 命令修改 docker conta ...
- DevOps图示
- C#/VB.NET 读取条码类型及条码在图片中的坐标位置
我们在创建条形码时,如果以图片的方式将创建好的条码保存到指定文件夹路径,可以在程序中直接加载图片使用:已生成的条码图片,需要通过读取图片中的条码信息,如条码类型.条码绘制区域在图片中的四个顶点坐标位置 ...
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架
转载来源:https://www.cnblogs.com/coderzh/archive/2009/04/12/1434155.html 一.前言 上一篇我们分析了gtest的一些内部实现,总的来说整 ...
- P2216 [HAOI2007]理想的正方形 方法记录
[HAOI2007]理想的正方形 题目描述 有一个 \(a \times b\) 的整数组成的矩阵,现请你从中找出一个 \(n \times n\) 的正方形区域,使得该区域所有数中的最大值和最小值的 ...