内容概要:

  • 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. Linux宝塔如何开启指定的目录浏览功能

    哈喽,各位运维晚上好, 今天突发奇想,想给我的个人博客加一个功能,就是如何去打开一个网站文件夹的目录浏览功能,这个还是挺有趣的. 为了以后我还能想起怎么用,我决定记录下来,以便能用,也能给大家一个参考 ...

  2. 防火墙:iptable和firewalld常用操作

    iptables //安装iptables-service yum install iptables-services //编辑config文件 vi /etc/sysconfig/iptables ...

  3. jenkins修改默认的workspace工作目录

    1.首先,找到Jenkins安装根目录,寻找config.xml文件,在config.xml文件内,查找 workspaceDir 关键字,将你的自定义 工作空间根目录 地址替换默认的地址 # cd ...

  4. 第六章:Django 综合篇 - 5:自定义django-admin命令

    我们可以通过manage.py编写和注册自定义的命令. 自定义的管理命令对于独立脚本非常有用,特别是那些使用Linux的crontab服务,或者Windows的调度任务执行的脚本.比如,你有个需求,需 ...

  5. 第六章:Django 综合篇 - 7:网站地图sitemap

    网站地图是根据网站的结构.框架.内容,生成的导航网页,是一个网站所有链接的容器.很多网站的连接层次比较深,蜘蛛很难抓取到,网站地图可以方便搜索引擎或者网络蜘蛛抓取网站页面,了解网站的架构,为网络蜘蛛指 ...

  6. Kubernetes Node的隔离与恢复

    在硬件升级.硬件维护等情况下,我们需要将某些Node进行隔离,脱离Kubernetes集群的调度范围.Kubernetes提供了一种机制,即可以将Node纳入调度范围,也可以将Node脱离调度范围. ...

  7. CentOS7下yum安装GitLab-CE

    前提准备 建立git用户 useradd git 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 安装依赖库 yum instal ...

  8. typora基础和计算机五大组成部分

    typora typora软件 ​ 是一款适合于IT行业文本编辑器,笔记,当下来说,非常火爆,可以使用多种语言,python java... ​ 安装的时候路径选择可以设置一些简单便于后续查找的文件路 ...

  9. SECS半导体设备通讯-4 GEM通信标准

    一 概述 GEM标准定义了通信链路上的半导体设备的行为. SECS-II标准定义了在主机和设备之间交换的消息和相关数据项.GEM标准则定义了在哪种情况下应该使用哪些SECS-II消息以及由此产生的结果 ...

  10. POJ2763 Housewife Wind (树链剖分)

    差不多是模板题,不过要注意将边权转化为点权,将边的权值赋给它所连的深度较大的点. 这样操作过后,注意查询ask()的代码有所改变(见代码注释) 1 #include<cstdio> 2 # ...