项目开发流程
需求分析
在公司里这就是一个项目的开始,会由项目经理与架构师去与需求公司谈项目功能。这之前可能会去提前设想好流程需求,然后在和客户交流细节。
架构设计
架构师会根据具体的业务需求选择:
分组开发
将项目拆分之后的多个小项目交给不同开发部门下的多个编程人员编写每个人可能只会写很小的一部分(降低复杂度 提升开发效率 缩短开发周期)
项目测试
交给测试部门全面测试,语法和逻辑方面的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”架构,
三层架构:
项目需求:
提炼项目功能(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
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 [视图层]存放用户视图层代码文件
interface [逻辑层] 存放核心业务逻辑代码
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 存放日志文件