python第二十四课---项目开发,分析,框架搭建,功能搭建,导模块建议
昨日内容回顾
pycharm Ctrl+Z 返回上一步操作 Ctrl+Y 返回下一步操作
-
hashlib模块
1.基本使用 import hashlib md5 = hashlib.md5() md5.update(''.encode('utf8')) md5.hexdigest() 2.算法的种类及结果长度 3.算法不变只要传入的内容相同无论分多少次传得到的结果都是一样的 4.加盐处理、动态加盐 5.算法实际应用 密码加密 文件安全性校验 文件一致性校验 大文件校验策略 -
subprocess模块
主要用于模拟操作系统的cmd窗口执行系统命令 ps:windows系统底层默认的编码是GBK(特定区域) -
logging模块
1.日志级别 五个 2.基本使用 格式问题 输出问题 3.四个组成部分 logger对象:产生日志 filter对象:过滤日志 hanlder对象:输出日志 format对象:日志格式 4.日志配置字典 代码拷贝使用即可 -
日志模块实战应用
配置字典信息应该放在项目配置文件内 记录日志的功能应该放在项目公共文件
今日内容概要
- 项目开发流程
- 项目分析
- 架构设计(重要)
- 框架搭建
- 功能搭建
- 注册功能面条版编写
- 注册功能代码拆分
- 代码优化及封装
- 登录功能编写
- 校验用户是否登录
今日内容详细
项目开发流程
1.项目需求分析
产品经理(客户) 架构师 开发经理
1.架构师 开发经理提前构思大致方案
2.引导客户提出合理要求(避免不合理的请求)
3.记录会议内容
2.项目架构设计
架构师
1.项目编程语言
2.项目整体框架
框架、数据库服务
3.项目报价
3.项目分组开发
架构师 开发经理 程序员
1.任务拆分开发
4.项目提交测试
1.程序员自己要提前测试一下
2.测试部门专门测试(扣绩效)
5.项目交付上线
1.运维人员负责即可
"""
小公司:成长速度特别快 但是压力非常大
大公司:履历好看 福利待遇好 较为安逸
"""
项目需求分析
该项目的核心不仅在于引领初学者快速入门python项目开发,更是站在项目架构的角度教你如何在程序开发之初合理且优雅地设计程序的架构,从而极大地提升程序的开发效率与可扩展性
"""
- 额度15000或自定义
- 支持多账户登录
- 可以查看账户余额
- 可以提现(可自定义手续费比例)
- 提供还款接口
- 支持账户间转账
- 记录每月日常消费流水
- 实现购物商城,买东西加入购物车,调用信用卡接口结账
- 提供管理接口,包括添加账户、用户额度,冻结账户等
- ATM记录操作日志
- 用户认证功能
"""
1.注册功能
2.登录功能
3.查看余额
4.提现功能
5.充值功能
6.转账功能
7.查看流水
8.添加购物车
9.结算购物车
10.管理员功能
10.1.冻结账户
10.2.删除账户

.

项目架构设计(重点)
以实际项目为例讲解三层架构设计
百度
以百度登录功能为例 分析执行步骤
1.在浏览器页面上获取用户名和密码
2.基于网络发送给百度服务端
3.服务端连接数据库服务
淘宝
以淘宝买商品为例 分析执行步骤
1.浏览器页面展示商品总价
2.基于网络发送给淘宝服务端再次计算总价
3.调用数据库服务完成金额操作
三层架构设计
第一层:只做数据展示和简单的数据获取!!!!!!
cmd终端、浏览器页面、手机app页面
第二层:真正的核心业务逻辑处理(代码)!!!!!!
编写代码的py文件、目录、框架
第三层:数据操作!!!!!!
文件读写操作、py文件、数据库软件
为什么要采用3层架构设计???
一 是考虑数据与代码的安全,
二 是这样让程序整体的灵活性与拓展性极强
"""
ATM架构设计
三层架构
core目录下的src.py(浏览器)
interface目录下的多个py文件(框架)
db目录下db_handler.py(数据库服务)

项目目录搭建
软件开发目录规范
推荐:
在src文件里面把项目的框架运行代码写好以后,每写好一个自定义功能函数后,就直接运行看一下,这样就能及时发现问题,否则写到最后运行代码,发现问题后,排查起来就费劲了!!!

项目功能搭建
1.注册
2.登陆
3.查看余额
4.提现
5.还款
6.转账
7.查看流水
8.添加购物车功能
9.查看购物车功能
10.结算购物车功能
11.管理员功能
1. 定义功能函数

.
2. 构建功能字典

.
3. 框架运行函数run

.
4. 编写start函数

.
5. 先写注册功能的基本逻辑

.
6. 把核心的逻辑代码从第一层的src里面剪切到interface里面对应的接口文件里面去!!封装了一个函数,函数代码里面缺什么就传什么!!


.
7. 再转到src文件调用刚刚转出去的核心的注册接口函数的函数名,注意调用函数时括号里面的实参,与定义阶段函数的形参一致!!!

.
8. 再把注册接口文件里面的,数据的写入的代码,再剪切粘贴到第三层,db文件夹下的db_handler.py文件里面,可以封装成一个save函数,专门用来保存数据

.
9. 再在注册接口文件里面调用db_handler.py文件里面,save函数

.
10. 再把代码润色一下,比如把db_handler.py文件里面save函数里的打印操作,要想办法移到移到第一层src里面去!!!第二层与第三层打印,用户层看不到了!!!
操作是:
先将打印的这一行代码,剪切粘贴到注册接口文件里面调用save函数的下面,这样原来在save函数体里面的打印操作就移到了save函数体的外面了,但是不影响,因为执行完save函数后执行打印操作,和打印操作在save里面一次性执行完没有太大区别。
然后再利用返回值,在print代码的前面加个return。
这样在src里面调用注册接口函数后,用变量接收返回值,就拿到了打印的信息了!!!

.

.

.
11. 再把注册功能文件里面的一些小功能代码写一下,判断用户是否存在是用来做数据查询用的,所以也应该放到第三层去,剪切走

.

.
12. 将剪切走的代码再继续优化,当然return '用户已存在'这行代码留着,在注册接口文件里面,通过 变量名接收slect函数的返回值,还是能拿到'用户已存在'这行信息的。然后再通过return还是能实现在第一层打印'用户已存在'这行消息的!!!
但是这里可以更加优化代码,删除return '用户已存在'这行代码,再加一个打开文件的操作如下:

.
这样也可以将要打印的信息,通过return,传给了第一层了

.
13. 这样注册的功能的封装操作就差不多写好了,三层架构就非常清晰了,第一层src只做用户数据的获取,然后仅仅是做了一个非常简单的,不影响核心逻辑的代码判断。所有的打印都可以在该层实现!!
第二层里面都是核心逻辑的代码,先校验用户是否存在(通过调用数据库的查询功能,然后根据这个功能的返回值,来判断到底有没有这个用户文件,),用户文件不存在,再通过构造用户字典,
再去调保存用户数据的功能,完成用户注册!!!!!!
.
14.接下来开始第三层,数据层的代码优化!!!先路径拼接的代码,放到配置文件settings.py里面去

.
配置里面的变量名要全大写

.

.

.

.

这样第三层,数据层的代码优化也结束了,
该数据保存的函数 兼具数据写入与数据修改的功能!!!
该数据查询的函数 除了具有查询用户文件存不存在,还具有将用户文件反序列化读出来的功能!!!
这样的话,数据层的优化就差不多搞定了,以后db_handler.py文件基本不用怎么动了
.
再开始写登录功能
登录函数只要写获取用户输入,调用查询用户数据的函数,最后打印返回值,第一层就写完了

.
第二层登录接口文件,构造逻辑,做出判断

.
第三层负责提供数据操作,不用动,还是原来的select函数

登录功能就写好了
再把登录注册的密码加密功能完善一下

.
再把登录的地方也要对密码进行加密操作

.
再把这两段同样的代码剪切到lib文件夹commmon.py里面,封装成一个get_hash函数

.
考虑到后续,其他的函数也要用到加密的函数,显然这里把固定死为只能给密码加密,不合理,所以继续优化,这样兼容性更高了

.

.

密码加密功能也写完了
校验用户是否登录的装饰器代码编写
全局变量放在用户输入账户密码的地方,也就是放第一层比较合适

但是第一层如何知道第二次层的登录接口函数里面,用户是登录成功了,还是失败了,还是用户不存在了?可以简单粗暴点直接if判断返回值是不是登录成功,是的话,改全局变量。

.
也可以高端点,让登录接口的函数里面返回两个参数,成功的带个True,两个失败的带个False

.
return在返回时会自动将返回的数据组织成元组,这样在接收返回值时,可以用解压赋值操作,用多个变量名分别接收元组里对应的数据。

.
接下来开始写装饰器

.
然后再移到common.py里面去,还是一样缺什么导什么


.
这个地方出现了循环导入的问题了!!!所以要确保名字在使用之前就已经准备完毕!!!
但是这个地方都是定义的函数,装饰器语法糖装在自定义函数上,不运行自定义函数装饰器也不运行,所以,在src里面导入common,common里面又导入src,开始运行src模块导入下面的代码,所有代码都运行完,再开始运行common里面模块导入下面的代码,加载函数名get_hash与login_auth,最后当输入功能编号时才执行第一层,src里面的函数体代码的运行,这个时候才会触发被装饰函数的装饰器,但这个时候装饰器的名字已经在common里面被加载了,所以在src里面能通过common.login_auth的方式调用到!!!
.
当然如果不放心,可以把from core import src 这行代码放到装饰器函数体的里面去,这样在运行from lib import common时,到common里面就不存在循环导入了,common里面的名字就可以正常加载了。
然后src里面的代码正常运行到被装饰函数时,通过common.login_aut的方式调用到common里面的装饰器函数了!!!

导模块时的一点建议
import 后面尽量接被导入模块名,别接被导入模块里面的函数名。
这样在运行函数里面用被导模块名点的方式拿到它里面的函数名,这样虽然烦点,但是不容易乱。
一眼就知道导入了几个模块,尤其是涉及到循环导入时,好分析代码的运行流程。
注意!!!!!!!
直接导文件里面的名字容易乱,而且导文件里面的名字容易给人误导只加载该名字对应的函数体代码,实际上导文件里面名字时,该文件里面的所有内容已经加载了一遍了!!!!!!
作业
1.整理今日内容及博客
2.反复编写ATM代码(同步梳理思路)
3.基于课上代码尝试编写余下功能
4.尝试将之前购物车功能嵌入到ATM代码中

浙公网安备 33010602011771号