项目开发从0到1
项目开发流程
1、项目开发总体思路:
(1)需求分析(提取功能)
(2)架构设计
(3)分任务开发
(4)项目测试
(5)项目上线
2、打开pycharm解释器,创建一个项目文件,点击File-->选择New Project..-->Location里编辑项目名称和存储位置-->点击Create,项目创建成功
3、创建readme.md文件,这里存放该项目的基本信息,
一个项目是如何从无到有的
1、需求分析:
(1)拿到项目,会先在客户那里一起讨论需求。
商量项目的功能是否能实现,周期与价格----《需求文档》
(2)最后在公司内部开一次内部会议。技术总监,产品经理---《开发文档》
交给不同岗位的程序员进行开发。
python:后端,爬虫
--不同的岗位--
UI界面设计:
设计软件的布局,会根据软件的外观切成一张张图片。
前端开发:
拿到UI交给的图片,搭建网页页面
设计一些页面中,那些位置需要接收数据,需要进行数据交互
后端开发:
直接写核心的业务逻辑,调度数据库进行数据的增删改查。
测试工程师:
会给代码进行全面的测试,界面测试(CF卡箱子)、功能、性能、压力
运维工程师:
上线部署
2、程序的架构设计
程序设计的好处
(1)思路清晰。
(2)不会出现写一半代码时推翻重写。
(3)方便自己或者以后的同事更好的维护。
三层架构设计的好处
1)把每个功能都分层三部分,思路清晰。
2)如果用户更换不同的界面或不同的数据储存机制。都不会影响接口层的核心逻辑代码,扩展性强,便于维护
3)可以在接口层,准确的记录日志和流水。
下图以用户登录为例演示三层架构设计
4、我们以模拟实现一个《ATM + 购物商城》程序为例说明,需求如下:
- 额度 15000或自定义
- 实现购物商城,买东西加入 购物车,调用信用卡接口结账
- 可以提现,手续费5%
- 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
- 支持多账户登录
- 支持账户间转账
- 记录每月日常消费流水
- 提供还款接口
- ATM记录操作日志
- 提供管理接口,包括添加账户、用户额度,冻结账户等。。。
- 用户认证用装饰器
4.1)第一步、需求分析:提取项目需求
1、额度 15000或自定义 --> 注册功能
2、实现购物商城,买东西加入 购物车,调用信用卡接口结账 -->购物车功能,支付功能
3、可以提现,手续费5% --> 提现功能
暂时不用实现:每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
4、支持多账户登录 --> 登录功能
5、支持账户间转账 --> 转账功能
6、记录每月日常消费流水 --> 记录流水功能
7、提供还款接口 --> 还款功能
8、ATM记录操作日志 --> 记录日志功能
9、提供管理接口,包括添加账户、用户额度,冻结账户等。。。 --> 管理员功能
10、用户认证用装饰器 -->登录认证的装饰器
4.2)第二步、架构设计
第一层:用户视图层
用于与用户进行交互:
接受用户输入的内容
返回打印输出内容给用户
第二层:逻辑接口层
业务的核心逻辑,相当于用户视图层与数据处理层间的桥梁
接收用户视图层传递过来的参数进行逻辑处理
返回结果给视图层
第三层:数据处理层
做数据处理
增、删、改、查
架构设计的具体实现如下:
ATM根目录
readme.md --> 项目的文件说明书
conf --> 配置文件
settings.py
lib --> 存放公共方法文件
common.py
core --> 存放视图层代码文件
src.py
inter --> 存放逻辑接口层文件,存放核心业务逻辑代码
user_interfance.py: 用户相关的接口
bank_interface.py: 银行相关的接口
shop_interface.py: 购物车相关的接口
db --> 存放数据处理层代码文件
db_handler.py: 数据处理层代码
user_data.py: 用户数据
log --> 存放日志文件
bin --> 存放启动文件(可以不写,直接将启动文件存放到根目录下)
start.py 程序的启动文件
代码实现
1)第一步:start.py中添加解释器的环境变量,导入src
2)第二步:程序执行到run(),到core-->src.py
3)第三步:代码继续运行跑到func_dic处,创建空函数,创建函数字典
输入功能编号1,进入字典匹配1对应的函数,是注册功能,调用register()函数
程序运行register()函数:
第一步用户输入内容,
第二步调用接口层的注册接口,
第三步展示结果给用户
register()函数之第二步:调用接口层的注册接口(路径inter-->user_interface-->register_interface-->db_bandler.select())
register()函数之进入数据处理层调用select(username)函数,判断username.json文件是否存在,并返回结果给接口层,(1)有则返回user_dic,(2)没有则返回None。
(1) 假设username.json文件已存在,会把user_dic的结果返回给用户视图层的src-->register_interface
用户名已存在:用户视图层的src-->register_interface(分别把False-->flag, 用户已存在----->msg),如下所示:打印“用户已存在”
(2)用户名不存在则返回None,如下图所示,①if判断不执行,②加密密码,③创建一个新字典user_dic,④进入数据处理层调用save()功能保存该数据
④进入数据处理层调用save()功能保存数据:db_handler.py-->save(user_dic)-->user_dic.get("username")得到该字典名称给到username-->拼接文件路径-->打开conf文件夹下的settings.py文件,运行settings.USER_DATA_PATH
打开conf文件夹下的settings.py文件,运行settings.USER_DATA_PATH:如下图所示①USER_DATA_PATH拼接文件路径,②③找文件的根目录BASE_PATH,④找到db文件,⑤找到user_data文件。此处返回一个文件路径给到USER_DATA_PATH
上面返回一个文件路径给到USER_DATA_PATH:①:把settings返回值再次回到db_handler.py文件,②得到user_path拼接后的文件路径,③路径+文件名=该文件(用户名.json)④文件保存到指定位置。⑤获取(用户名.json)文件路径并打开。⑥把save(user_dic)参数user_dic传给(用户名.json)
说明:ensure_ascii=False作用让文件(用户名.json)中的中文数据,显示更美观,而不是以二进制形式展示,如下图所示:
ensure_ascii=True以二进制形式展示如下所示:
数据保存成功:db_handler里的save()保存功能执行完毕后回到user_interfance.py中:①db_handler.save()功能实现。②程序继续向下运行。③程序遇到return 将结果(结果是:True,用户名注册成功)返回给register_interface,register_interface拿到数据返回给src(最开始调用register_interface的地方),
register_interface拿到数据返回给src(上回书说到用户不存在的情况调用register_interface的地方),①user_interface拿到(True,用户名注册成功),分别把True-->flag, 用户名注册成功----->msg。②程序继续运行。③进入判断打印“用户名注册成功”
注册功能展示完毕