内容概要:

  • 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项目详解的更多相关文章

  1. eclipse里面构建maven项目详解(转载)

    本文来源于:http://my.oschina.net/u/1540325/blog/548530 eclipse里面构建maven项目详解 1       环境安装及分配 Maven是基于项目对象模 ...

  2. Redis 配置文件 redis.conf 项目详解

    Redis.conf 配置文件详解 # [Redis](http://yijiebuyi.com/category/redis.html) 配置文件 # 当配置中需要配置内存大小时,可以使用 1k, ...

  3. Mac下Intellij IDea发布Web项目详解一

    Mac下Intellij IDea发布Web项目详解一 Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二 Mac下Intellij IDea发布J ...

  4. Mac下Intellij IDea发布Java Web项目详解五 开始测试

    测试前准备工作目录 Mac下Intellij IDea发布Web项目详解一 Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二 Mac下Intell ...

  5. JAVA Eclipse使用Maven构建web项目详解(SSM框架)

    tips: 启动项目后,welcome-file的链接即为测试用例 部署maven web项目 Eclipse使用Maven构建web项目详解 pom.xml添加webapp依赖: <depen ...

  6. 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+SpringMVC项目详解

    http://blog.csdn.net/noaman_wgs/article/details/53893948 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+Spri ...

  7. [转帖](整理)GNU Hurd项目详解

    (整理)GNU Hurd项目详解 http://www.ha97.com/3188.html 发表于: 开源世界 | 作者: 博客教主 标签: GNU,Hurd,详解,项目 Hurd原本是要成为GNU ...

  8. tomcat通过tomcat 安装根目录下的conf-Catalina-localhost目录发布项目详解

    tomcat通过conf-Catalina-localhost目录发布项目详解   Tomcat发布项目的方式大致有三种,但小菜认为通过在tomcat的conf/Catalina/localhost目 ...

  9. Usage、Usage Minimum和Usage Maximum项目详解

    (1)一个产生多个数据域(Report Count>1)的主项目之前有一个以上的[用途]时,每个[用途]与一个数据域依次对应,如果数据域个数(Report Count)超过[用途]的个数,则剩余 ...

  10. Vue.js项目详解

    还是以Blog项目来讲解,最近我本人利用闲暇时间,以博客作为参考学习一些新的技术并尝试之前没有尝试过的思路来玩玩. 技术看似枯燥,但是带有一个目的来学,你会发现还是蛮有趣的. 主要实践的就是前后端分离 ...

随机推荐

  1. 企业运维实践-丢弃手中的 docker build , 使用Kaniko直接在Kubernetes集群或Containerd环境中快速进行构建推送容器镜像

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 首发地址: h ...

  2. 天天写SQL,这些神奇的特性你知道吗?

    摘要:不要歪了,我这里说特性它不是 bug,而是故意设计的机制或语法,你有可能天天写语句或许还没发现原来还能这样用,没关系我们一起学下涨姿势. 本文分享自华为云社区<[云驻共创]天天写 SQL, ...

  3. 如何使用 Git 管理配置文件

    现在很多软件的配置都可以在线同步或者支持导入导出,可以很方便的在不同设备上使用.但电脑上还有很多本地配置文件没有办法同步,夸多个设备使用时很难保持一致,换电脑也很麻烦.其实可以使用 Git 来管理这些 ...

  4. Elasticsearch索引和查询性能调优的21条建议

    Elasticsearch部署建议 1. 选择合理的硬件配置:尽可能使用 SSD Elasticsearch 最大的瓶颈往往是磁盘读写性能,尤其是随机读取性能.使用SSD(PCI-E接口SSD卡/SA ...

  5. PostgreSQL 选择数据库

    数据库的命令窗口 PostgreSQL 命令窗口中,我们可以命令提示符后面输入 SQL 语句: postgres=# 使用 \l 用于查看已经存在的数据库: postgres=# \l List of ...

  6. 修改NodePort的范围

    在 Kubernetes 集群中,NodePort 默认范围是 30000-32767,某些情况下,因为您所在公司的网络策略限制,您可能需要修改 NodePort 的端口范围 修改kube-apise ...

  7. 安装 Ubuntu 教程

    1.选择中文安装 2.****到了如下界面,我们点击继续: 3.然后点击,现在安装: 4.****到了这界面,点击继续: 5.如下,输入你的位置,随便输入就好: 6.****然后选择汉语,点击继续: ...

  8. Node.js(五)学生管理CRUD

    npm init -y(初始化项目) npm install express(引入express) npx express-generator -e(自动生成模板.添加对 ejs 模板引擎的支持) n ...

  9. 使用SqlDataReader对象从数据库中检索只读的数据。

    SqlDataReader对象每次从查询结果中读取一行到内存中,对于sql数据库,如果只需要顺序读取,可以优先选择SqlDataReader,其对数据库的读取速度非常快. 调用SqlDataReade ...

  10. CentOS 7.9 安装 rabbitmq-3.10.2

    一.CentOS 7.9 安装 rabbitmq-3.10.2.tar.gz 地址 https://www.rabbitmq.com https://github.com/rabbitmq/rabbi ...