学习目标:
- 熟悉项目开发的全部流程,掌握项目开发框架
学习内容:
-
项目开发流程
-
需求分析
在公司里这就是一个项目的开始,会由项目经理与架构师去与需求公司谈项目功能。这之前可能会去提前设想好流程需求,然后在和客户交流细节。
-
架构设计
架构师会根据具体的业务需求选择:- 开发的编程语言
- 项目的后端框架、
- 项目所需的数据库(主库、从库)
- 项目组织结构(软件开发目录规范、自定义结构)
项目功能划分(将一个大项目拆分成多个小项目) - 项目的报价
-
分组开发
将项目拆分之后的多个小项目交给不同开发部门下的多个编程人员编写每个人可能只会写很小的一部分(降低复杂度 提升开发效率 缩短开发周期)
-
项目测试
交给测试部门全面测试,语法和逻辑方面的bug测试,比如黑白盒测试等
-
交付上线
将项目打包给运维人员运行维护即可,就是负责产品的发布,与服务器上的日常运行。
-
-
项目需求分析
这一步就是按照客户提的需求,去提取重要的要求,然后按照一条条需求,去大致利用真实的技术去设计功能实现
-
项目架构设计
到了这一步就是,对上一步的零零散散的功能进行整合。进行整个项目的功能分区处理,这样也有利于进行分组开发。主要也是模块化处理项目。
普遍情况下是将项目框架分为三个部分:前端(用户交互页面,也叫可视化界面)、后端(就是功能模块,使用编写的功能去沟通前端用户输入的数据与数据库储存的数据的功能模块集合)、数据库(用来储存一些用户数据,软件内部数据的地方)这样去处理项目的话,就是要去实现项目的
高内聚,低耦合
。好去让我们以及以后别的维护人员可以更加方便的去更新功能与解决项目的bug,不用动不动就要去动整个项目的代码,那个功能有问题就去修改某个功能去。 -
项目架构搭建
1、bin文件夹:bin文件夹下存放一系列的启动文件(当启动文件很少或者只有一个时,可以放在根目录下)eg:start.py
2、conf文件夹:conf文件夹存放一系列的配置文件(配置文件里的变量一般都大写)eg:settings.py
3、lib文件夹:lib文件夹存放一系列公共功能的文件eg:common.py
4、db文件夹:db文件夹存放一系列的数据文件eg:login_msg.txt
5、log文件夹:log文件夹存放一系列的日志文件eg:log1.txt
6、core文件夹:core文件夹存放项目核心代码文件eg:src.py
7、readme文件夹:readme文件夹存放项目的说明文件,类似说明书
8、requirements.txt:存放项目所需要的第三方模块及版本号
5.编写具体功能
项目实例
(ATM+购物车功能)
本项目采用“MVC”架构,
三层架构:
- 一 用户视图层
只展示功能选项 基本逻辑 - 二 逻辑接口层
所有业务逻辑 - 三 数据处理层
给逻辑层提供数据存取
项目需求:
- 额度15000或自定义
注册功能。用户只有注册了以后才有额度,用户注册了以后,用户设定默认的额度15000. - 实现购物车功能,买东西加入 购物车,结账
购物功能: 用户进入购物功能, 首先要打印购物的列表,清单,有什么东西可以购物,还有物品的价格, 以及物品的个数。用户需要买东西。用户选择完东西。对比用户的余额,用户可以可不可以买? 余额够不够?用户购买成功以后放入购物车并保存到用户的个人信息中。
支付功能: 用户购完物需要付钱,付款的钱要从用户的余额里面去扣。 - 可以提现
提现功能: 用户可以提现,但是会收取手续费这里涉及到了计算用户提现手续费. - 支持多账户登录
登录功能: 支持多账户,由注册功能体现,因为注册所以会有多个用户的账户信息。当用户登录以后,我们保存用户当前的状态。就是说用户暂时登陆以后不需要再输入验证。 - 支持账户间转账
转账功能: 用户提供转账, 首先看用户有没有这个人, 如果没有那不能转,如果有那么得看用户的余额,用户的余额够不够用用户的余额不够。那么他转就不能转。用户转账成功, 接着我们要跑到收钱的那个用户,我们要定位到收钱的用户,然后对收钱的用户进行加钱。对转钱的当前自己进行减钱。 - 记录每月日常消费流水
记录消费流水功能: 记录用户的消费流水,统计用户购物支付的钱, 购物的清单, 个数, 统计用户提现, 转账的钱. - 提供还款
还款功能: 对当前用户的余额, 进行增加操作。 - ATM记录操作日志
日志功能: 对用户登录以后的所有的操作进行记录。 - 提供管理接口,包括添加账户、用户额度,冻结账户等
管理员功能: 管理员可以添加账户。管理员可以设置用户的信用额度。管理员可以可以冻结用户账户。 - 用户认证用装饰器
登录认证装置器: 控制对于用户没有登录之前,操作功能都不能执行。
提炼项目功能(ATM+购物车):
-
注册功能
# src01.py # 1.注册功能 def register(): while True: # 让用户输入用户名和密码进行校验 username = input("请输入用户名:").strip() password = input("请输入密码:").strip() re_password = input("请再次输入密码:").strip() # 很小的逻辑处理,比较两次密码是否一致 if password == re_password: flag, msg = user_interface.register_interface(username, password) # 根据flag判断用户注册是否成功, if flag: print(msg) break else: print(msg)
# user_interface.py # 注册接口 def register_interface(username, password, balance=15000): # 查看用户是否存在 # 调用数据处理层中的select函数,会返回用户字典或者None user_dic = db_handler.select(username) # 若用户存在则return ,告诉用户重新输入 if user_dic: return False, '用户名已存在!' # 若用户不存在,则保存用户数据 # 做密码加密 password = common.get_pwd_md5(password) # 组织用户的数据的字典信息 user_dict = { 'username': username, 'password': password, 'balance': balance, # 用于记录用户流水的列表 'flow': [], # 用于记录用户购物车 'shop_car': {}, 'locked': False } # 保存数据 db_handler.save(user_dict) return True, f'{username}注册成功!'
-
登录功能
# src01.py # 2.登录功能 def login(): while True: # 让用户输入用户名与密码 username = input("请输入用户名:").strip() password = input("请输入密码:").strip() # 将数据传给登录 flag, msg = user_interface.login_interface(username, password) if flag: print(msg) global login_user login_user = username break else: print(msg)
# user_interface.py # 登录接口 def login_interface(username, password): # 先查看当前用户数据是否存在 user_dict = db_handler.select(username) # 判断用户是否存在 if user_dict: # 给用户输入的密码做一次加密 password = common.get_pwd_md5(password) # 校验密码是否一致 if password == user_dict.get('password'): # 若有冻结用户 则需要判断是否被锁定 if user_dict.get("locked"): return True, "当前用户已被锁定" return True, f'用户:{username}登录成功!' else: return False, '密码错误' return False, '用户不存在,请重新输入'
-
查看余额
# src01.py # 3.查看余额 @login_auth def check_balance(): # 获取用户余额 balance = user_interface.check_bal_interface(login_user) print(f'用户{login_user}账户余额为:{balance}')
# user_interface.py # 查看余额 def check_bal_interface(username): user_dic = db_handler.select(username) return user_dic['balance']
(以下功能优化中…)
4. 提现功能
5. 还款功能
6. 转账功能
7. 查看流水
8. 购物功能
9. 查看购物车
10. 结算购物车
11. 管理员功能
实现功能事项:
-
视图层:
与用户进行交互,接收用户处理输入的数据,交给逻辑层进行处理,逻辑层最终会将一个结果
返回给用户视图层展示给用户 -
逻辑层:
相当于视图层与数据层的桥梁专门复测接收视图层传过来的数据,并进行“核心的逻辑”校验,校验过程中,会去访问"数据层“进行数据的增删改查,通过或不通过会返回一个结果给视图层进行展示(日志的添加、流水的添加都是在这层)
-
数据层:
职责:接收到接口层传递过来的参数,进行数据的处理
1.增加数据
2.查看数据
3.删除数据
4.更新数据
搭建项目的目录规范:
ATM项目根目录
readme.md 项目说明书
start.py 项目启动文件
# start.py
import os
import sys
from core.src01 import run
# 执行文件目录添加到解析器的环境变量
sys.path.append(os.path.dirname(__file__))
if __name__ == '__main__':
run()
conf 配置文件夹
- settings.py
# settings.py
import os
# 获取项目根目录路径
BASE_PATH = os.path.dirname(os.path.dirname(__file__))
# 获取user_data文件夹的目录路径
USER_DATA_PATH = os.path.join(BASE_PATH, 'db', 'user_data')
lib 公共方法文件
-
common.py
# common.py import hashlib # md5加密 def get_pwd_md5(password): md5_obj = hashlib.md5() md5_obj.update(password.encode('utf-8')) # 加盐操作 salt = '123456' md5_obj.update(salt.encode('utf-8')) return md5_obj.hexdigest() # 登录认证装饰器 def login_auth(func): from core import src01 # 避免重复导入 def inner(*args, **kwargs): if src01.login_user: res = func(*args, **kwargs) return res else: print("用户未登录,请先登录!") src01.login() return inner
core [视图层]存放用户视图层代码文件
- src01.py
interface [逻辑层] 存放核心业务逻辑代码
- user_interface.py 用户相关的功能接口
- admin_interface.py 管理员相关的功能接口
- bank_interface.py ATM相关的功能接口
- shop_interface.py 购物相关的功能接口
db [数据层] 存放数据与数据处理代码
-
db_handler.py 数据处理层代码
# db_handler.py import json import os from conf import settings # 查看数据 def select(username): user_path = os.path.join(settings.USER_DATA_PATH, f'{username}.json') # 校验用户json文件是否存在 if os.path.exists(user_path): # 打开数据 with open(user_path, 'r', encoding='utf-8') as f: use_dict = json.load(f) return use_dict # 保存数据 def save(user_dict): # 拼接用户的数据字典 username = user_dict.get('username') user_path = os.path.join(settings.USER_DATA_PATH, f'{username}.json') # 保存用户数据 with open(user_path, 'w', encoding='utf-8') as f: json.dump(user_dict, f, ensure_ascii=False)
-
user_data 用户数据
log 存放日志文件
学习时间:
- 周一至周五晚上 7 点—晚上9点
- 周六上午 9 点-上午 11 点
- 周日下午 3 点-下午 6 点
学习产出:
- 技术笔记 2 遍
- CSDN 技术博客 3 篇
- 习的 vlog 视频 1 个