Files
xsl_node/backend/docs/后端技术架构文档.md
T
2026-01-26 12:29:56 +08:00

480 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 后端技术架构文档
## 文档信息
- **文档版本**: 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 数据流
1. **请求处理流程**
- 客户端发送请求到API路由
- 路由层验证请求参数和用户权限
- 调用服务层处理业务逻辑
- 服务层调用数据访问层操作数据库
- 数据访问层返回数据给服务层
- 服务层处理数据并返回给路由层
- 路由层返回响应给客户端
2. **项目创建流程**
- 验证用户权限(必须是市场部或管理员)
- 生成项目编号
- 创建项目记录
- 创建项目成员记录
- 创建项目里程碑记录
- 创建项目风险记录
- 创建项目历史记录
3. **项目编辑流程**
- 验证用户权限
- 获取项目当前信息
- 对比修改前后的数据
- 更新项目记录
- 更新相关表数据
- 创建项目历史记录
---
## 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 开发环境部署
1. 克隆代码库: `git clone <repository-url>`
2. 安装依赖: `poetry install``pip install -r requirements.txt`
3. 配置环境变量: 复制 `.env.example``.env` 并修改配置
4. 初始化数据库: `alembic upgrade head`
5. 启动应用: `uvicorn app.main:app --reload`
6. 访问: `http://localhost:8000`
7. API文档: `http://localhost:8000/docs`
### 8.2 生产环境部署
1. 克隆代码库: `git clone <repository-url>`
2. 安装依赖: `poetry install --no-dev``pip install -r requirements.txt`
3. 配置环境变量: 复制 `.env.example``.env` 并修改配置
4. 初始化数据库: `alembic upgrade head`
5. 构建应用: 无需构建,直接运行
6. 启动应用: `gunicorn app.main:app -w 4 -k uvicorn.workers.UvicornWorker`
7. 配置 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 | - | 初始版本创建 |