24 KiB
24 KiB
后端技术架构文档
文档信息
- 文档版本: V1.0
- 创建日期: 2026-01-26
- 文档类型: 后端技术架构文档
1. 技术选型
| 分类 | 技术 | 版本 | 选型理由 |
|---|---|---|---|
| 后端框架 | FastAPI | 0.104.0+ | 高性能Python Web框架,自动生成API文档,支持异步 |
| ORM框架 | SQLAlchemy | 2.0.0+ | Python最流行的ORM框架,支持多种数据库 |
| 数据库驱动 | PyMySQL | 1.1.0+ | 纯Python实现的MySQL客户端 |
| 数据库 | MySQL | 8.0+ | 关系型数据库,稳定可靠,适合企业级应用 |
| 认证 | JWT | 2.8.0+ | JSON Web Token,用于用户认证和授权 |
| 密码加密 | Passlib | 1.7.4+ | 密码哈希库,支持多种加密算法 |
| 数据验证 | Pydantic | 2.5.0+ | 数据验证和设置库,与FastAPI完美集成 |
| API文档 | Swagger | - | FastAPI自动生成,提供交互式API文档 |
| 构建工具 | Poetry | 1.7.0+ | Python依赖管理和打包工具 |
| 数据库迁移 | Alembic | 1.12.0+ | SQLAlchemy的数据库迁移工具 |
| 测试框架 | Pytest | 7.4.0+ | Python最流行的测试框架 |
| 异步支持 | asyncio | - | Python内置的异步IO库 |
2. 架构设计
2.1 分层架构
┌─────────────────────────────────────────────────────────┐
│ 路由层 (API) │
│ (Router) │
├─────────────────────────────────────────────────────────┤
│ 业务逻辑层 (Service) │
│ (Service) │
├─────────────────────────────────────────────────────────┤
│ 数据访问层 (Model) │
│ (ORM Model) │
├─────────────────────────────────────────────────────────┤
│ 数据层 │
│ (MySQL) │
└─────────────────────────────────────────────────────────┘
2.2 核心模块
| 模块名称 | 主要职责 | 文件路径 | 依赖关系 |
|---|---|---|---|
| 认证模块 | 用户登录、退出、认证 | app/api/auth.py | 依赖用户模型、JWT |
| 用户模块 | 用户管理、权限管理 | app/api/user.py | 依赖用户模型、认证模块 |
| 项目模块 | 项目管理、创建、编辑 | app/api/project.py | 依赖项目模型、历史记录模块 |
| 历史记录模块 | 项目修改历史记录 | app/api/history.py | 依赖历史记录模型 |
| 统计模块 | 项目统计、数据分析 | app/api/statistics.py | 依赖项目模型 |
| 系统模块 | 系统配置、操作日志 | app/api/system.py | 依赖日志模型 |
2.3 数据流
-
请求处理流程:
- 客户端发送请求到API路由
- 路由层验证请求参数和用户权限
- 调用服务层处理业务逻辑
- 服务层调用数据访问层操作数据库
- 数据访问层返回数据给服务层
- 服务层处理数据并返回给路由层
- 路由层返回响应给客户端
-
项目创建流程:
- 验证用户权限(必须是市场部或管理员)
- 生成项目编号
- 创建项目记录
- 创建项目成员记录
- 创建项目里程碑记录
- 创建项目风险记录
- 创建项目历史记录
-
项目编辑流程:
- 验证用户权限
- 获取项目当前信息
- 对比修改前后的数据
- 更新项目记录
- 更新相关表数据
- 创建项目历史记录
3. 目录结构
├── app/ # 应用代码
│ ├── api/ # API路由
│ │ ├── auth.py # 认证API
│ │ ├── user.py # 用户API
│ │ ├── project.py # 项目API
│ │ ├── history.py # 历史记录API
│ │ ├── statistics.py # 统计API
│ │ ├── system.py # 系统API
│ │ └── __init__.py # 导出API
│ ├── models/ # 数据模型
│ │ ├── __init__.py # 导出模型
│ │ ├── user.py # 用户模型
│ │ ├── project.py # 项目模型
│ │ ├── member.py # 成员模型
│ │ ├── milestone.py # 里程碑模型
│ │ ├── risk.py # 风险模型
│ │ ├── history.py # 历史记录模型
│ │ └── log.py # 日志模型
│ ├── schemas/ # Pydantic模式
│ │ ├── __init__.py # 导出模式
│ │ ├── auth.py # 认证模式
│ │ ├── user.py # 用户模式
│ │ ├── project.py # 项目模式
│ │ ├── history.py # 历史记录模式
│ │ ├── statistics.py # 统计模式
│ │ ├── system.py # 系统模式
│ │ └── common.py # 通用模式
│ ├── services/ # 业务逻辑
│ │ ├── __init__.py # 导出服务
│ │ ├── auth_service.py # 认证服务
│ │ ├── user_service.py # 用户服务
│ │ ├── project_service.py # 项目服务
│ │ ├── history_service.py # 历史记录服务
│ │ ├── statistics_service.py # 统计服务
│ │ └── system_service.py # 系统服务
│ ├── database/ # 数据库配置
│ │ ├── __init__.py # 导出配置
│ │ ├── config.py # 数据库配置
│ │ └── session.py # 数据库会话
│ ├── common/ # 公共模块
│ │ ├── __init__.py # 导出公共模块
│ │ ├── constants.py # 常量定义
│ │ ├── utils.py # 工具函数
│ │ ├── dependencies.py # 依赖注入
│ │ └── exceptions.py # 异常处理
│ ├── config.py # 应用配置
│ └── main.py # 应用入口
├── tests/ # 测试代码
│ ├── __init__.py # 测试初始化
│ ├── test_auth.py # 认证测试
│ ├── test_user.py # 用户测试
│ ├── test_project.py # 项目测试
│ ├── test_history.py # 历史记录测试
│ ├── test_statistics.py # 统计测试
│ └── conftest.py # 测试配置
├── alembic/ # 数据库迁移
│ ├── versions/ # 迁移版本
│ ├── env.py # 迁移环境
│ └── script.py.mako # 迁移脚本模板
├── pyproject.toml # Poetry配置
├── poetry.lock # Poetry锁文件
├── requirements.txt # 依赖列表
├── README.md # 项目说明
├── .env.example # 环境变量示例
└── .gitignore # Git忽略文件
4. 核心类与函数
4.1 认证模块
| 类/函数名 | 说明 | 参数(类型/含义) | 成功返回结构/类型 | 失败返回结构/类型 | 所属文件/模块 |
|---|---|---|---|---|---|
AuthRouter.login() |
用户登录 | LoginRequest 登录请求 | AuthResponse |
HTTPException |
app/api/auth.py |
AuthRouter.logout() |
用户退出 | 无 | BaseResponse |
HTTPException |
app/api/auth.py |
AuthRouter.get_user_info() |
获取用户信息 | 无 | UserInfoResponse |
HTTPException |
app/api/auth.py |
AuthService.authenticate() |
认证用户 | str username, str password | AuthResponse |
AuthenticationException |
app/services/auth_service.py |
AuthService.create_token() |
创建Token | str user_id | str Token |
Exception |
app/services/auth_service.py |
AuthService.verify_token() |
验证Token | str token | dict Token载荷 |
JWTError |
app/services/auth_service.py |
4.2 用户模块
| 类/函数名 | 说明 | 参数(类型/含义) | 成功返回结构/类型 | 失败返回结构/类型 | 所属文件/模块 |
|---|---|---|---|---|---|
UserRouter.create() |
创建用户 | UserCreate 用户创建请求 | BaseResponse |
HTTPException |
app/api/user.py |
UserRouter.update() |
更新用户 | str id, UserUpdate 用户更新请求 | BaseResponse |
HTTPException |
app/api/user.py |
UserRouter.delete() |
删除用户 | str id | BaseResponse |
HTTPException |
app/api/user.py |
UserRouter.list() |
获取用户列表 | UserQuery 查询参数 | PageResponse[User] |
HTTPException |
app/api/user.py |
UserRouter.reset_password() |
重置密码 | str id, PasswordReset 密码重置请求 | BaseResponse |
HTTPException |
app/api/user.py |
UserService.create_user() |
创建用户 | UserCreate 用户创建请求 | User |
ServiceException |
app/services/user_service.py |
UserService.update_user() |
更新用户 | str id, UserUpdate 用户更新请求 | User |
ServiceException |
app/services/user_service.py |
UserService.delete_user() |
删除用户 | str id | bool |
ServiceException |
app/services/user_service.py |
UserService.get_user_list() |
获取用户列表 | UserQuery 查询参数 | List[User] |
ServiceException |
app/services/user_service.py |
UserService.reset_password() |
重置密码 | str id, str password | bool |
ServiceException |
app/services/user_service.py |
4.3 项目模块
| 类/函数名 | 说明 | 参数(类型/含义) | 成功返回结构/类型 | 失败返回结构/类型 | 所属文件/模块 |
|---|---|---|---|---|---|
ProjectRouter.create() |
创建项目 | ProjectCreate 项目创建请求 | BaseResponse |
HTTPException |
app/api/project.py |
ProjectRouter.update() |
更新项目 | str id, ProjectUpdate 项目更新请求 | BaseResponse |
HTTPException |
app/api/project.py |
ProjectRouter.delete() |
删除项目 | str id | BaseResponse |
HTTPException |
app/api/project.py |
ProjectRouter.list() |
获取项目列表 | ProjectQuery 查询参数 | PageResponse[Project] |
HTTPException |
app/api/project.py |
ProjectRouter.detail() |
获取项目详情 | str id | ProjectDetailResponse |
HTTPException |
app/api/project.py |
ProjectService.create_project() |
创建项目 | ProjectCreate 项目创建请求, str username | Project |
ServiceException |
app/services/project_service.py |
ProjectService.update_project() |
更新项目 | str id, ProjectUpdate 项目更新请求, str username | Project |
ServiceException |
app/services/project_service.py |
ProjectService.delete_project() |
删除项目 | str id | bool |
ServiceException |
app/services/project_service.py |
ProjectService.get_project_list() |
获取项目列表 | ProjectQuery 查询参数 | List[Project] |
ServiceException |
app/services/project_service.py |
ProjectService.get_project_detail() |
获取项目详情 | str id | ProjectDetail |
ServiceException |
app/services/project_service.py |
4.4 历史记录模块
| 类/函数名 | 说明 | 参数(类型/含义) | 成功返回结构/类型 | 失败返回结构/类型 | 所属文件/模块 |
|---|---|---|---|---|---|
HistoryRouter.list() |
获取项目历史 | str project_id, HistoryQuery 查询参数 | PageResponse[ProjectHistory] |
HTTPException |
app/api/history.py |
HistoryService.record_history() |
记录历史 | str project_id, str operation_type, str operator, dict changes | ProjectHistory |
ServiceException |
app/services/history_service.py |
HistoryService.get_project_history() |
获取项目历史 | str project_id, HistoryQuery 查询参数 | List[ProjectHistory] |
ServiceException |
app/services/history_service.py |
4.5 统计模块
| 类/函数名 | 说明 | 参数(类型/含义) | 成功返回结构/类型 | 失败返回结构/类型 | 所属文件/模块 |
|---|---|---|---|---|---|
StatisticsRouter.filter() |
筛选项目 | ProjectFilter 筛选条件 | PageResponse[Project] |
HTTPException |
app/api/statistics.py |
StatisticsRouter.statistics() |
统计项目 | StatisticsRequest 统计请求 | StatisticsResponse |
HTTPException |
app/api/statistics.py |
StatisticsService.filter_projects() |
筛选项目 | ProjectFilter 筛选条件 | List[Project] |
ServiceException |
app/services/statistics_service.py |
StatisticsService.get_project_statistics() |
获取项目统计 | StatisticsRequest 统计请求 | StatisticsResult |
ServiceException |
app/services/statistics_service.py |
5. 数据库设计
5.1 数据库表结构
详细的数据库表结构见《数据库设计文档》。
5.2 数据模型关系
User (用户)
|
| 1
|
| N
|
OperationLog (操作日志)
Project (项目)
|
| 1
|
| N
|
+-- ProjectMember (项目成员)
|
| 1
|
| N
|
+-- ProjectMilestone (项目里程碑)
|
| 1
|
| N
|
+-- ProjectRisk (项目风险)
|
| 1
|
| N
|
+-- ProjectHistory (项目历史)
5.3 数据库连接配置
- 开发环境:使用本地MySQL数据库
- 测试环境:使用测试MySQL数据库
- 生产环境:使用生产MySQL数据库
6. API设计
6.1 认证API
| API路径 | 方法 | 模块/文件 | 功能描述 | 请求体 (JSON) | 成功响应 (200 OK) |
|---|---|---|---|---|---|
/api/auth/login |
POST |
app/api/auth.py |
用户登录 | {"username": "admin", "password": "123456"} |
{"code": 200, "data": {"token": "...", "userInfo": {...}}, "message": "登录成功"} |
/api/auth/logout |
POST |
app/api/auth.py |
用户退出 | N/A | {"code": 200, "message": "退出成功"} |
/api/auth/userInfo |
GET |
app/api/auth.py |
获取用户信息 | N/A | {"code": 200, "data": {"userId": "...", "username": "...", "realName": "...", "department": "...", "role": "..."}} |
6.2 用户API
| API路径 | 方法 | 模块/文件 | 功能描述 | 请求体 (JSON) | 成功响应 (200 OK) |
|---|---|---|---|---|---|
/api/user |
GET |
app/api/user.py |
获取用户列表 | N/A (Query参数: page, size, username, department, role) | {"code": 200, "data": [{...}], "total": 10, "message": "查询成功"} |
/api/user |
POST |
app/api/user.py |
创建用户 | {"username": "test", "password": "123456", "realName": "测试用户", "department": "技术部", "role": "OTHER"} |
{"code": 200, "message": "创建成功"} |
/api/user/{id} |
PUT |
app/api/user.py |
更新用户 | {"realName": "测试用户1", "department": "市场部", "role": "MARKETING"} |
{"code": 200, "message": "更新成功"} |
/api/user/{id} |
DELETE |
app/api/user.py |
删除用户 | N/A | {"code": 200, "message": "删除成功"} |
/api/user/resetPassword/{id} |
PUT |
app/api/user.py |
重置密码 | {"password": "123456"} |
{"code": 200, "message": "密码重置成功"} |
6.3 项目API
| API路径 | 方法 | 模块/文件 | 功能描述 | 请求体 (JSON) | 成功响应 (200 OK) |
|---|---|---|---|---|---|
/api/project |
GET |
app/api/project.py |
获取项目列表 | N/A (Query参数: page, size, projectName, status, leader) | {"code": 200, "data": [{...}], "total": 10, "message": "查询成功"} |
/api/project |
POST |
app/api/project.py |
创建项目 | {"projectName": "测试项目", "status": "NOT_STARTED", "leader": "张三", ...} |
{"code": 200, "data": {"projectId": "..."}, "message": "创建成功"} |
/api/project/{id} |
GET |
app/api/project.py |
获取项目详情 | N/A | {"code": 200, "data": {...}, "message": "查询成功"} |
/api/project/{id} |
PUT |
app/api/project.py |
更新项目 | {"projectName": "测试项目1", "status": "IN_PROGRESS", ...} |
{"code": 200, "message": "更新成功"} |
/api/project/{id} |
DELETE |
app/api/project.py |
删除项目 | N/A | {"code": 200, "message": "删除成功"} |
6.4 历史记录API
| API路径 | 方法 | 模块/文件 | 功能描述 | 请求体 (JSON) | 成功响应 (200 OK) |
|---|---|---|---|---|---|
/api/history/{projectId} |
GET |
app/api/history.py |
获取项目历史 | N/A (Query参数: page, size, operator, startDate, endDate) | {"code": 200, "data": [{...}], "total": 10, "message": "查询成功"} |
6.5 统计API
| API路径 | 方法 | 模块/文件 | 功能描述 | 请求体 (JSON) | 成功响应 (200 OK) |
|---|---|---|---|---|---|
/api/statistics/filter |
POST |
app/api/statistics.py |
筛选项目 | {"projectNo": "PRJ2025001", "projectName": "测试", "status": "IN_PROGRESS", ...} |
{"code": 200, "data": [{...}], "total": 10, "message": "查询成功"} |
/api/statistics/statistics |
POST |
app/api/statistics.py |
统计项目 | {"dimension": "status", "startDate": "2025-01-01", "endDate": "2025-12-31"} |
{"code": 200, "data": {...}, "message": "统计成功"} |
7. 安全设计
7.1 认证与授权
- 认证方式: JWT (JSON Web Token) 认证
- 授权方式: 基于角色的访问控制 (RBAC)
- 密码加密: 使用 Passlib 的 bcrypt 算法加密存储密码
- 会话管理: JWT Token 存储在前端 localStorage 中,后端验证 Token 签名和有效期
7.2 接口安全
- 统一认证拦截: 所有接口(除登录接口外)都需要验证 Token
- 权限验证: 基于用户角色和权限进行接口访问控制
- 请求参数验证: 使用 Pydantic 验证请求参数的合法性
- 防止SQL注入: 使用 SQLAlchemy 的参数化查询,避免SQL注入
- 防止XSS攻击: 前端使用 v-html 时进行转义,后端对输入进行过滤
- 防止CSRF攻击: 使用 Token 验证,确保请求来自合法来源
7.3 数据安全
- 敏感数据加密: 敏感数据(如密码)加密存储
- 数据备份: 定期备份数据库,防止数据丢失
- 数据恢复: 制定数据恢复计划,确保数据可恢复
- 日志审计: 记录用户操作日志,便于追溯操作行为
8. 部署与集成
8.1 开发环境部署
- 克隆代码库:
git clone <repository-url> - 安装依赖:
poetry install或pip install -r requirements.txt - 配置环境变量: 复制
.env.example为.env并修改配置 - 初始化数据库:
alembic upgrade head - 启动应用:
uvicorn app.main:app --reload - 访问:
http://localhost:8000 - API文档:
http://localhost:8000/docs
8.2 生产环境部署
- 克隆代码库:
git clone <repository-url> - 安装依赖:
poetry install --no-dev或pip install -r requirements.txt - 配置环境变量: 复制
.env.example为.env并修改配置 - 初始化数据库:
alembic upgrade head - 构建应用: 无需构建,直接运行
- 启动应用:
gunicorn app.main:app -w 4 -k uvicorn.workers.UvicornWorker - 配置 Nginx 反向代理
8.3 集成方案
- 前端与后端集成: 通过 RESTful API 进行数据交互
- 数据库集成: 使用 SQLAlchemy ORM 操作数据库
- 日志集成: 使用 Python logging 模块记录系统日志
- 监控集成: 可集成 Prometheus + Grafana 监控系统性能
9. 性能优化
9.1 代码优化
- 异步处理: 使用 FastAPI 的异步特性,提高并发处理能力
- 批量操作: 对批量数据操作使用批量处理,减少数据库交互次数
- 缓存: 对热点数据使用内存缓存,减少数据库查询
- 分页查询: 使用分页查询,避免一次性加载大量数据
9.2 数据库优化
- 索引优化: 为常用查询字段创建索引,提高查询性能
- 连接池: 使用 SQLAlchemy 的连接池,提高数据库连接效率
- 查询优化: 使用 SQLAlchemy 的 lazy loading 和 eager loading 优化查询
- 数据库配置: 优化 MySQL 配置参数,提高数据库性能
9.3 部署优化
- 负载均衡: 对多实例部署使用负载均衡
- 水平扩展: 根据业务需求进行水平扩展
- 资源限制: 合理设置应用的资源限制(CPU、内存等)
10. 监控与维护
10.1 系统监控
- 应用监控: 监控应用的运行状态、CPU、内存使用情况
- 数据库监控: 监控数据库的连接数、查询性能、存储空间
- API监控: 监控 API 的响应时间、调用次数、错误率
- 日志监控: 监控系统日志,及时发现异常情况
10.2 故障处理
- 故障定位: 通过日志和监控工具定位故障原因
- 故障恢复: 制定故障恢复方案,确保系统快速恢复
- 故障预防: 定期进行系统检查,预防故障发生
10.3 系统维护
- 定期更新: 定期更新依赖库和框架版本,修复安全漏洞
- 数据备份: 定期备份数据库,防止数据丢失
- 性能调优: 定期分析系统性能,进行性能调优
- 文档更新: 及时更新系统文档,保持文档与系统同步
11. 开发规范
11.1 代码规范
- 代码风格: 遵循 PEP 8 规范
- 命名规范:
- 类名: 大驼峰命名法 (PascalCase)
- 函数名: 小驼峰命名法 (camelCase)
- 变量名: 小写下划线分隔 (snake_case)
- 常量名: 全大写下划线分隔 (SNAKE_CASE)
- 注释规范: 为所有公共函数和类添加文档字符串
- 导入规范: 分组导入,按标准库、第三方库、本地模块顺序
11.2 版本控制
- 分支管理: 使用 Git Flow 分支管理策略
- 提交规范: 提交信息使用英文,格式为
[类型]: 描述 - 版本号: 使用语义化版本号 (Semantic Versioning)
11.3 测试规范
- 测试覆盖率: 核心功能测试覆盖率不低于 80%
- 测试类型: 单元测试、集成测试、端到端测试
- 测试框架: 使用 Pytest 进行测试
12. 附录
12.1 技术选型对比
| 技术 | 对比方案 | 最终选择理由 |
|---|---|---|
| 后端框架 | FastAPI vs Flask vs Django | FastAPI 高性能,自动生成API文档,支持异步 |
| ORM框架 | SQLAlchemy vs Django ORM | SQLAlchemy 灵活强大,支持多种数据库 |
| 数据库 | MySQL vs PostgreSQL | MySQL 社区活跃,生态成熟,适合企业级应用 |
| 认证 | JWT vs Session | JWT 无状态,便于水平扩展 |
| 构建工具 | Poetry vs pip | Poetry 提供更好的依赖管理和版本控制 |
12.2 常用命令
- 安装依赖:
poetry install或pip install -r requirements.txt - 添加依赖:
poetry add <package>或pip install <package> - 启动开发服务器:
uvicorn app.main:app --reload - 运行测试:
pytest - 生成数据库迁移:
alembic revision --autogenerate -m "描述" - 执行数据库迁移:
alembic upgrade head
12.3 变更记录
| 版本 | 日期 | 修改人 | 修改内容 |
|---|---|---|---|
| V1.0 | 2026-01-26 | - | 初始版本创建 |