项目源代码下载
其实本项目的需求分析乍一看比较复杂,但是细细拆分出来实际实现还是比较容易的。基本用上前面所学的所有知识点。
1.额度 15000或自定义
2.实现购物商场,买东西加入购物车,调用信用卡接口转账
3.可以提现,手续费5%
4.支持多账户登录
5.支持账户间转账
6.记录每日消费流水
7.提供还款接口
8.ATM记录操作日志
9.提供管理接口,包括添加账户,用户额度,冻结账户等...
10.用户认证使用装饰器
关于本项目源代码已上传到Github
,感兴趣的朋友可点击此处 点我啊帅哥! 进行下载。
如果下载过程中出现异常,如下图,
项目架构设计图
下载完之后请打开: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)) #print(type(json.loads(json_data))) # # 可以看到json拿出来的直接就是int类型,不必再做转换
写在最后
这一个项目我之前确实没有手写过完整的,不管是抄也好自己写也好都没有。所以最近拿出来抄了抄发现还是有一些能让自己提升的空间的,比如枚举!!!真的是八百年难用一次啊。所以告诫各位同学,永远不要自大,很多细小的点真的很容易被人忽略,轻则难看(就算我用int()
转换一次json
格式实际上也没什么影响,但是我确实是强迫症,不容忍自己犯这种错误),重则异常。