ATM项目分析
ATM项目分析
项目源代码下载
其实本项目的需求分析乍一看比较复杂,但是细细拆分出来实际实现还是比较容易的。基本用上前面所学的所有知识点。
1.额度 15000或自定义
2.实现购物商场,买东西加入购物车,调用信用卡接口转账
3.可以提现,手续费5%
4.支持多账户登录
5.支持账户间转账
6.记录每日消费流水
7.提供还款接口
8.ATM记录操作日志
9.提供管理接口,包括添加账户,用户额度,冻结账户等...
10.用户认证使用装饰器
关于本项目源代码已上传到Github,感兴趣的朋友可点击此处 点我啊帅哥! 进行下载。
如果下载过程中出现异常,如下图,点我,我是解决办法 , 如果解决办法目录中没有hosts文件,那么请将lmhosts.sam中的内容另存为hosts文件即可:

项目架构设计图
下载完之后请打开:README.md查看说明文档,其中罗列了一些比较重要的知识点。


项目目录功能一览
这里列举一下该项目目录功能:

知识回顾与亮点解析
登录-注册 一体化
在db_handler.py中,有一段代码我认为比较不错。

这段代码在注册以及登录时都会用到,那么我当时在写注册功能时是有些不太能理解的。为什么要判断一个存储用户数据的json文件是否存在后还要打开它并返回其中的用户字典呢?直接判断文件是否存在不就好了吗?觉得有些不能理解,但是我后来发现基本上需求中的每一个实现函数都是调用了该方法并且直接在user_dic中拿到了数据,此时我才恍然大悟。
装饰器中的import
这段代码是在common.py中:

其实我对模块这一章印象还是比较深刻的,但是确实没有意识到循环导入的问题,以致于这里我也是看了好一会才看明白,首先 src.py 中导入过一次 common.py,如果将 common.py 中的 from core import src 放在函数体外就会产生循环导入的问题,这一点应该是我在这个项目中学习到最重要的一点了。
src.py中的import

common.py中的import

枚举的使用
这个点在src.py中购物商场函数中:

说来惭愧,枚举之前有学过,但是这玩意儿确实不太常用,基本上一次没用过,所以已经忘得差不多了。所以这边记录一下,其实在Python的for循环中只要数据结构特殊,是可以容纳两个迭代变量的。如:
item = [(1,"第一个"),(2,"第二个"),(3,"第三个")] # 这种结构可以直接被dict()所消化
item_dic = dict(item)
print(item_dic) # {1: '第一个', 2: '第二个', 3: '第三个'}
print(list(item_dic.items())) # [(1, '第一个'), (2, '第二个'), (3, '第三个')]
for k,v in item:
print(k,v)
"""
1 第一个
2 第二个
3 第三个
"""
li = [i for i in item_dic.values()]
li_enu = list(enumerate(li))
print(li_enu) # [(0, '第一个'), (1, '第二个'), (2, '第三个')] 第一个是索引,第二个是元素本身
for index,ele in li_enu:
print(index,ele)
"""
0 第一个
1 第二个
2 第三个
"""
json字符串数据类型
这一点的疑惑完全怪自己json没学明白,可以看到下图在注册时直接存入的是int类型。然后json后保存到了本地文件中。

在其他需要用到金额的功能时我产生了疑惑,因为我认为json存储的拿出来是字符串需要进行一次 int() 转换,所以这里看见并没有做int转换而是直接进行加减。当时我就蒙了...

所以,我进行了一个小测试,这点估计很多人都知道或者会忽略,但是!我不知道!!所以写下来钉在耻辱柱上,请尽情嘲讽吧!!!:
import json
data = 1
json_data = json.dumps(data)
print(type(json_data)) # <class 'str'>
print(type(json.loads(json_data))) # <class 'int'>
# 可以看到json拿出来的直接就是int类型,不必再做转换
写在最后
这一个项目我之前确实没有手写过完整的,不管是抄也好自己写也好都没有。所以最近拿出来抄了抄发现还是有一些能让自己提升的空间的,比如枚举!!!真的是八百年难用一次啊。所以告诫各位同学,永远不要自大,很多细小的点真的很容易被人忽略,轻则难看(就算我用int()转换一次json格式实际上也没什么影响,但是我确实是强迫症,不容忍自己犯这种错误),重则异常。
ATM项目分析的更多相关文章
- 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)
说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...
- iOS项目分析及优化
iOS项目分析及优化 来源:吴白的简书 从代码看一个程序员的笔力 从代码的整洁度上就可以看出一个程序员的实力,规范其实就是让你养成一种良好习惯的标杆,在此面前我们应该顺从.本篇我们以OC为例,统 ...
- ATM
package duzhaonan;import java.util.Scanner;import javax.swing.JOptionPane;class Account{//创建的账户类 Str ...
- ATM+购物车
本次代码的实现用到了模块间的互相调用,这对于初学者而言有些难度,不过这也是我们必须要掌握的,在以后的大程序中,多个模块会让我们的代码看起来简洁明了,易排错 (本次代码只是简单的实现的基本的功能,其代码 ...
- 简单的ATM取款过程
一个简单的ATM的取款过程是这样的:首先提示用户输入密码(pwd),最多只能输3次,超过三次则提示用户“密码已输入三次错误,请取卡.“结束交易.如果用户密码正确,在提示用户输入金额(money),AT ...
- 大话JS面向对象之开篇万物皆对象------(ATM取款机引发的深思)
一,总体概要 OO(面向对象)概念的提出是软件开发工程发展的一次革命,多年来我们借助它使得很多大型应用程序得以顺利实现.如果您还没有掌握并使用OO进行程序设计和开发,那么您无疑还停留在软件开发的石器时 ...
- ATM模拟器(附代码及运行结果)
源代码: import java.util.Scanner; class Account{ String identify; String name; String date; String key; ...
- bzoj 1179[Apio2009]Atm (tarjan+spfa)
题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...
- ATM跨行取款的清算方式
ATM跨行取款和POS机是类似的,因为没有商户参与,所以不需要收单清算,过程更为简单. 回到文章最开头的例子:你拿着一张工行卡去建行的ATM取了100元,这个跨行业务在CNAPS体系中的过程如下: 你 ...
随机推荐
- HEARTBLEED 漏洞复现
漏洞分析的两篇文章 https://blog.csdn.net/javajiawei/article/details/82429886 https://xz.aliyun.com/t/1771 set ...
- 看板 | 漫话之减少WIP(在制品)
传统的流水线生产模式中,生产流程按生产程序进行划分,而各部分因动作的难度或复杂程度的差异导致用时不同. 例如:一个产品进行组装用时2分钟,完成装箱工作只需10秒.在这种情况下,组装动作用时长.产出慢, ...
- Java实现 LeetCode 827 最大人工岛(DFS+暴力模拟)
827. 最大人工岛 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方向相连的 1 可形成岛屿 ...
- Java实现 洛谷 P1010 幂次方
输入输出样例 输入 #1 1315 输出 #1 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) import java.util.Scanner; pu ...
- Java实现第九届蓝桥杯螺旋折线
螺旋折线 题目描述 如图p1.pgn所示的螺旋折线经过平面上所有整点恰好一次. 对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度. 例如dis(0 ...
- oracle使用+简写左关联出现的结果集不一致问题
这是使用(+)的sql语句(已简写) select a.id,b.num from a,b where a.id=b.id(+) and b.num>10 这是使用left join的sql语句 ...
- 移动UI系列 - 简单地使用半衰期算法来预测手势的滑动方向与速度
前言 有一个问题, 给定一个物体的运动轨迹, 包含时间和坐标的数组, 如何使用这个数据来预测物体未来的运动走势?? 本文提供了一个很简单的方式去实现这个算法. 效果够用, 又简单, 有一定的准确程度. ...
- Jmeter(八) - 从入门到精通 - JMeter配置元件(详解教程)
1.简介 JMeter配置元件可以用来初始化默认值和变量,读取文件数据,设置公共请求参数,赋予变量值等,以便后续采样器使用.将在其作用域的初始化阶段处理.配置元件(Config Element)提供对 ...
- throws,throw,try,catch,finally 分别代表什么 意义?
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口. 在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例.当一个方法出现异常后便 抛出一个异 ...
- 关于"touchstart与click同时触发"问题
点击事件可以分解成多个事件: 在移动端,手指点击一个元素,会经过:touchstart --> touchmove -> touchend --> click 由于移动设备能够同时 ...