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项目来讲解,最近我本人利用闲暇时间,以博客作为参考学习一些新的技术并尝试之前没有尝试过的思路来玩玩. 技术看似枯燥,但是带有一个目的来学,你会发现还是蛮有趣的. 主要实践的就是前后端分离 ...
随机推荐
- React Native 入门 调试项目
不管时用哪种语言,哪种框架,调试永远都是一个避不开的话题 为我们提供了远程调试的功能,而这个功能需要Chrome浏览器的配合. 1. 首先浏览器一定要安装好React Developer Tool 插 ...
- 痞子衡嵌入式:理解i.MXRT中FlexSPI外设lookupTable里配置访问行列混合寻址Memory的参数值
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT中FlexSPI外设lookupTable里配置访问行列混合寻址Memory的参数值. 关于 FlexSPI 外设的 loo ...
- 微信小程序-云函数、云存储
云函数是运行在服务器端的 创建一个目录cloud project.config.json配置云函数目录 cloud目录有个云朵.代表云函数 初始化成功了 新建一个云函数 cloud目录右击 新建一个N ...
- Logstash:Grok filter 入门
转载自: https://blog.csdn.net/UbuntuTouch/article/details/105922198 Logstash模式:https://www.elastic.co/g ...
- 使用 Loki 微服务模式部署生产集群
转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247500523&idx=1&sn=0994af2b50 ...
- 使用docker-compose部署Django项目
先从最基本的功能开始 在一切工作开始前,需要先编辑好三个必要的文件. 第一步,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 Dockerfile 文件来指定 ...
- 【前端必会】单页应用-你的新朋友wepack
背景 我们开发的功能可能是简单的,但是实现功能的代码行数却可能成千上万 出于易于维护.安全.服用,我们会根据我们的经验设计我们的代码,拆解成多个独立的功能模块(代码片段.更多的文件) JS的模块规范有 ...
- Makfile总结
Makfile总结 在前面的三篇文章彻底掌握Makefile(一).彻底掌握Makefile(二)和彻底掌握Makeifle(三)当中我们仔细介绍了Makefile各种使用方法,在本篇文章当中主要是对 ...
- [题解] Atcoder Beginner Contest ABC 270 G Ex 题解
点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...
- 工作7年收集到的git命令
概念 git 中的术语解释: 仓库也叫版本库(repository) stage:暂存区,add 后会存到暂存区,commit 后提交到版本库 git 安装 linux 下安装 git 第一种方法:y ...