save code
This commit is contained in:
+634
@@ -0,0 +1,634 @@
|
||||
# 项目管理系统技术架构文档
|
||||
|
||||
## 文档信息
|
||||
- **文档版本**: V2.0
|
||||
- **创建日期**: 2026-01-26
|
||||
- **文档类型**: 技术架构文档
|
||||
|
||||
---
|
||||
|
||||
## 1. 技术架构概述
|
||||
|
||||
### 1.1 架构风格
|
||||
本项目采用BS(Browser/Server)架构,即浏览器/服务器架构。前端通过浏览器访问系统,后端通过服务器提供服务,数据存储在数据库中。由于系统并发量较小,采用直接操作数据库的方式,无需引入缓存层。
|
||||
|
||||
### 1.2 技术选型
|
||||
|
||||
| 分类 | 技术 | 版本 | 选型理由 |
|
||||
|------|------|------|----------|
|
||||
| 前端框架 | Vue 3 | 3.3.0+ | 轻量级、响应式、组件化开发,适合构建现代化Web应用 |
|
||||
| 状态管理 | Pinia | 2.1.0+ | Vue 3官方推荐的状态管理库,比Vuex更轻量、更易用 |
|
||||
| UI组件库 | Element Plus | 2.4.0+ | 基于Vue 3的企业级UI组件库,组件丰富,文档完善 |
|
||||
| 前端路由 | Vue Router | 4.2.0+ | Vue官方路由库,支持嵌套路由、动态路由等 |
|
||||
| 网络请求 | Axios | 1.6.0+ | 轻量级HTTP客户端,支持拦截器、取消请求等特性 |
|
||||
| 后端框架 | 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依赖管理和打包工具 |
|
||||
| 版本控制 | Git | 2.40.0+ | 分布式版本控制系统,便于团队协作开发 |
|
||||
|
||||
---
|
||||
|
||||
## 2. 系统架构设计
|
||||
|
||||
### 2.1 架构分层
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 前端层 │
|
||||
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
||||
│ │ 视图层 │ │ 业务逻辑层 │ │ 数据层 │ │
|
||||
│ │ (Vue组件) │ │ (Pinia Store) │ │ (Axios) │ │
|
||||
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ API网关 │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ 后端层 │
|
||||
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
||||
│ │ 路由层 │ │ 服务层 │ │ 数据访问层 │ │
|
||||
│ │ (Router) │ │ (Service) │ │ (Model) │ │
|
||||
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ 数据层 │
|
||||
│ ┌─────────────────┐ ┌─────────────────┐ │
|
||||
│ │ MySQL数据库 │ │ 文件存储 │ │
|
||||
│ └─────────────────┘ └─────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 2.2 核心流程图
|
||||
|
||||
#### 2.2.1 用户登录流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 前端 as 浏览器
|
||||
participant 后端 as FastAPI服务
|
||||
participant 数据库 as MySQL
|
||||
|
||||
前端->>后端: POST /api/auth/login (username, password)
|
||||
后端->>数据库: 查询用户信息
|
||||
alt 用户存在且密码正确
|
||||
数据库-->>后端: 返回用户信息
|
||||
后端->>后端: 生成JWT Token
|
||||
后端-->>前端: 200 OK { "token": "...", "userInfo": {...} }
|
||||
else 用户不存在或密码错误
|
||||
数据库-->>后端: 返回空
|
||||
后端-->>前端: 401 Unauthorized { "message": "用户名或密码错误" }
|
||||
end
|
||||
```
|
||||
|
||||
#### 2.2.2 项目创建流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 前端 as 浏览器
|
||||
participant 后端 as FastAPI服务
|
||||
participant 数据库 as MySQL
|
||||
|
||||
前端->>后端: POST /api/project (项目信息)
|
||||
后端->>后端: 验证用户权限
|
||||
alt 有权限
|
||||
后端->>后端: 生成项目编号
|
||||
后端->>数据库: 创建项目记录
|
||||
后端->>数据库: 创建项目成员记录
|
||||
后端->>数据库: 创建项目里程碑记录
|
||||
后端->>数据库: 创建项目风险记录
|
||||
后端->>数据库: 创建项目历史记录
|
||||
后端-->>前端: 200 OK { "message": "项目创建成功", "projectId": "..." }
|
||||
else 无权限
|
||||
后端-->>前端: 403 Forbidden { "message": "您没有创建项目的权限" }
|
||||
end
|
||||
```
|
||||
|
||||
#### 2.2.3 项目编辑流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 前端 as 浏览器
|
||||
participant 后端 as FastAPI服务
|
||||
participant 数据库 as MySQL
|
||||
|
||||
前端->>后端: PUT /api/project/{id} (修改后的项目信息)
|
||||
后端->>后端: 验证用户权限
|
||||
alt 有权限
|
||||
后端->>数据库: 查询项目信息
|
||||
数据库-->>后端: 返回项目信息
|
||||
后端->>后端: 对比修改前后的数据
|
||||
后端->>数据库: 更新项目信息
|
||||
后端->>数据库: 更新相关表数据
|
||||
后端->>数据库: 创建项目历史记录
|
||||
后端-->>前端: 200 OK { "message": "项目更新成功" }
|
||||
else 无权限
|
||||
后端-->>前端: 403 Forbidden { "message": "您没有编辑项目的权限" }
|
||||
end
|
||||
```
|
||||
|
||||
### 2.3 模块划分
|
||||
|
||||
#### 2.3.1 前端模块
|
||||
|
||||
| 模块名称 | 主要功能 | 对应文件路径 |
|
||||
|---------|---------|------------|
|
||||
| 登录模块 | 用户登录、退出登录 | src/views/login/ |
|
||||
| 首页模块 | 系统首页、项目概览 | src/views/home/ |
|
||||
| 用户管理模块 | 用户列表、创建用户、编辑用户 | src/views/user/ |
|
||||
| 项目管理模块 | 项目列表、创建项目、编辑项目 | src/views/project/ |
|
||||
| 项目详情模块 | 项目详细信息、修改历史 | src/views/project/detail/ |
|
||||
| 项目统计模块 | 项目筛选、统计分析 | src/views/project/statistics/ |
|
||||
| 系统设置模块 | 系统配置、个人设置 | src/views/settings/ |
|
||||
|
||||
#### 2.3.2 后端模块
|
||||
|
||||
| 模块名称 | 主要功能 | 对应包路径 |
|
||||
|---------|---------|-----------|
|
||||
| 认证模块 | 用户认证、授权 | app.api.auth |
|
||||
| 用户模块 | 用户管理、权限管理 | app.api.user |
|
||||
| 项目模块 | 项目管理、项目编辑 | app.api.project |
|
||||
| 历史记录模块 | 项目修改历史 | app.api.history |
|
||||
| 统计模块 | 项目统计、数据分析 | app.api.statistics |
|
||||
| 系统模块 | 系统配置、操作日志 | app.api.system |
|
||||
| 数据模型 | 数据库模型定义 | app.models |
|
||||
| 数据库会话 | 数据库连接管理 | app.database |
|
||||
| 公共模块 | 工具类、常量定义 | app.common |
|
||||
|
||||
---
|
||||
|
||||
## 3. 目录结构
|
||||
|
||||
### 3.1 前端目录结构
|
||||
|
||||
```
|
||||
├── public/ # 静态资源
|
||||
│ ├── favicon.ico # 网站图标
|
||||
│ └── index.html # HTML模板
|
||||
├── src/ # 源代码
|
||||
│ ├── assets/ # 资源文件
|
||||
│ │ ├── css/ # 样式文件
|
||||
│ │ ├── images/ # 图片文件
|
||||
│ │ └── icons/ # 图标文件
|
||||
│ ├── components/ # 公共组件
|
||||
│ ├── views/ # 页面组件
|
||||
│ │ ├── login/ # 登录页面
|
||||
│ │ ├── home/ # 首页
|
||||
│ │ ├── user/ # 用户管理
|
||||
│ │ ├── project/ # 项目管理
|
||||
│ │ └── settings/ # 系统设置
|
||||
│ ├── router/ # 路由配置
|
||||
│ ├── store/ # 状态管理
|
||||
│ ├── api/ # API请求
|
||||
│ ├── utils/ # 工具函数
|
||||
│ ├── constants/ # 常量定义
|
||||
│ ├── hooks/ # 自定义Hooks
|
||||
│ ├── App.vue # 根组件
|
||||
│ └── main.js # 入口文件
|
||||
├── .env # 环境变量
|
||||
├── .env.development # 开发环境变量
|
||||
├── .env.production # 生产环境变量
|
||||
├── vite.config.js # Vite配置
|
||||
├── package.json # 项目依赖
|
||||
└── README.md # 项目说明
|
||||
```
|
||||
|
||||
### 3.2 后端目录结构
|
||||
|
||||
```
|
||||
├── app/ # 应用代码
|
||||
│ ├── api/ # API路由
|
||||
│ │ ├── auth.py # 认证API
|
||||
│ │ ├── user.py # 用户API
|
||||
│ │ ├── project.py # 项目API
|
||||
│ │ ├── history.py # 历史记录API
|
||||
│ │ ├── statistics.py # 统计API
|
||||
│ │ └── system.py # 系统API
|
||||
│ ├── models/ # 数据模型
|
||||
│ │ ├── user.py # 用户模型
|
||||
│ │ ├── project.py # 项目模型
|
||||
│ │ ├── member.py # 成员模型
|
||||
│ │ ├── milestone.py # 里程碑模型
|
||||
│ │ ├── risk.py # 风险模型
|
||||
│ │ ├── history.py # 历史记录模型
|
||||
│ │ └── log.py # 日志模型
|
||||
│ ├── schemas/ # Pydantic模式
|
||||
│ │ ├── auth.py # 认证模式
|
||||
│ │ ├── user.py # 用户模式
|
||||
│ │ ├── project.py # 项目模式
|
||||
│ │ └── common.py # 通用模式
|
||||
│ ├── services/ # 业务逻辑
|
||||
│ │ ├── auth_service.py # 认证服务
|
||||
│ │ ├── user_service.py # 用户服务
|
||||
│ │ ├── project_service.py # 项目服务
|
||||
│ │ ├── history_service.py # 历史记录服务
|
||||
│ │ └── statistics_service.py # 统计服务
|
||||
│ ├── database/ # 数据库配置
|
||||
│ │ ├── config.py # 数据库配置
|
||||
│ │ └── session.py # 数据库会话
|
||||
│ ├── common/ # 公共模块
|
||||
│ │ ├── constants.py # 常量定义
|
||||
│ │ ├── utils.py # 工具函数
|
||||
│ │ ├── dependencies.py # 依赖注入
|
||||
│ │ └── exceptions.py # 异常处理
|
||||
│ ├── config.py # 应用配置
|
||||
│ └── main.py # 应用入口
|
||||
├── tests/ # 测试代码
|
||||
│ ├── test_auth.py # 认证测试
|
||||
│ ├── test_user.py # 用户测试
|
||||
│ └── test_project.py # 项目测试
|
||||
├── alembic/ # 数据库迁移
|
||||
│ ├── versions/ # 迁移版本
|
||||
│ └── env.py # 迁移环境
|
||||
├── pyproject.toml # Poetry配置
|
||||
├── poetry.lock # Poetry锁文件
|
||||
├── requirements.txt # 依赖列表
|
||||
└── README.md # 项目说明
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 关键类与函数设计
|
||||
|
||||
### 4.1 前端关键类与函数
|
||||
|
||||
#### 4.1.1 认证相关
|
||||
|
||||
| 类/函数名 | 说明 | 参数(类型/含义) | 成功返回结构/类型 | 失败返回结构/类型 | 所属文件/模块 |
|
||||
|-----------|------|-----------------|-----------------|-----------------|--------------|
|
||||
| `login()` | 用户登录 | username: String 用户名<br>password: String 密码 | `{ token: String, userInfo: Object }` | `{ code: Number, message: String }` | src/api/auth.js |
|
||||
| `logout()` | 用户退出 | 无 | `{ code: 200, message: String }` | `{ code: Number, message: String }` | src/api/auth.js |
|
||||
| `getUserInfo()` | 获取用户信息 | 无 | `{ userInfo: Object }` | `{ code: Number, message: String }` | src/api/auth.js |
|
||||
|
||||
#### 4.1.2 项目相关
|
||||
|
||||
| 类/函数名 | 说明 | 参数(类型/含义) | 成功返回结构/类型 | 失败返回结构/类型 | 所属文件/模块 |
|
||||
|-----------|------|-----------------|-----------------|-----------------|--------------|
|
||||
| `createProject()` | 创建项目 | project: Object 项目信息 | `{ code: 200, message: String, projectId: String }` | `{ code: Number, message: String }` | src/api/project.js |
|
||||
| `updateProject()` | 更新项目 | id: String 项目ID<br>project: Object 项目信息 | `{ code: 200, message: String }` | `{ code: Number, message: String }` | src/api/project.js |
|
||||
| `getProjectList()` | 获取项目列表 | params: Object 查询参数 | `{ code: 200, data: Array, total: Number }` | `{ code: Number, message: String }` | src/api/project.js |
|
||||
| `getProjectDetail()` | 获取项目详情 | id: String 项目ID | `{ code: 200, data: Object }` | `{ code: Number, message: String }` | src/api/project.js |
|
||||
| `getProjectHistory()` | 获取项目历史 | id: String 项目ID<br>params: Object 查询参数 | `{ code: 200, data: Array, total: Number }` | `{ code: Number, message: String }` | src/api/project.js |
|
||||
|
||||
#### 4.1.3 用户相关
|
||||
|
||||
| 类/函数名 | 说明 | 参数(类型/含义) | 成功返回结构/类型 | 失败返回结构/类型 | 所属文件/模块 |
|
||||
|-----------|------|-----------------|-----------------|-----------------|--------------|
|
||||
| `createUser()` | 创建用户 | user: Object 用户信息 | `{ code: 200, message: String }` | `{ code: Number, message: String }` | src/api/user.js |
|
||||
| `updateUser()` | 更新用户 | id: String 用户ID<br>user: Object 用户信息 | `{ code: 200, message: String }` | `{ code: Number, message: String }` | src/api/user.js |
|
||||
| `getUserList()` | 获取用户列表 | params: Object 查询参数 | `{ code: 200, data: Array, total: Number }` | `{ code: Number, message: String }` | src/api/user.js |
|
||||
| `resetPassword()` | 重置密码 | id: String 用户ID<br>password: String 新密码 | `{ code: 200, message: String }` | `{ code: Number, message: String }` | src/api/user.js |
|
||||
|
||||
### 4.2 后端关键类与函数
|
||||
|
||||
#### 4.2.1 认证相关
|
||||
|
||||
| 类/函数名 | 说明 | 参数(类型/含义) | 成功返回结构/类型 | 失败返回结构/类型 | 所属文件/模块 |
|
||||
|-----------|------|-----------------|-----------------|-----------------|--------------|
|
||||
| `AuthRouter.login()` | 用户登录 | LoginRequest 登录请求 | `AuthResponse` | `HTTPException` | app.api.auth |
|
||||
| `AuthRouter.logout()` | 用户退出 | 无 | `BaseResponse` | `HTTPException` | app.api.auth |
|
||||
| `AuthService.authenticate()` | 认证用户 | str username, str password | `AuthResponse` | `AuthenticationException` | app.services.auth_service |
|
||||
| `AuthService.create_token()` | 创建Token | str user_id | `str` Token | `Exception` | app.services.auth_service |
|
||||
|
||||
#### 4.2.2 项目相关
|
||||
|
||||
| 类/函数名 | 说明 | 参数(类型/含义) | 成功返回结构/类型 | 失败返回结构/类型 | 所属文件/模块 |
|
||||
|-----------|------|-----------------|-----------------|-----------------|--------------|
|
||||
| `ProjectRouter.create()` | 创建项目 | ProjectRequest 项目请求 | `BaseResponse` | `HTTPException` | app.api.project |
|
||||
| `ProjectRouter.update()` | 更新项目 | str id, ProjectRequest 项目请求 | `BaseResponse` | `HTTPException` | app.api.project |
|
||||
| `ProjectRouter.list()` | 获取项目列表 | ProjectQuery 查询参数 | `PageResponse[Project]` | `HTTPException` | app.api.project |
|
||||
| `ProjectRouter.detail()` | 获取项目详情 | str id | `BaseResponse[ProjectDetail]` | `HTTPException` | app.api.project |
|
||||
| `ProjectService.create_project()` | 创建项目 | ProjectRequest 项目请求, str username | `str` 项目ID | `ServiceException` | app.services.project_service |
|
||||
| `ProjectService.update_project()` | 更新项目 | str id, ProjectRequest 项目请求, str username | `None` | `ServiceException` | app.services.project_service |
|
||||
|
||||
#### 4.2.3 历史记录相关
|
||||
|
||||
| 类/函数名 | 说明 | 参数(类型/含义) | 成功返回结构/类型 | 失败返回结构/类型 | 所属文件/模块 |
|
||||
|-----------|------|-----------------|-----------------|-----------------|--------------|
|
||||
| `HistoryRouter.list()` | 获取项目历史 | str project_id, HistoryQuery 查询参数 | `PageResponse[ProjectHistory]` | `HTTPException` | app.api.history |
|
||||
| `HistoryService.record_history()` | 记录历史 | str project_id, str operation_type, str operator, dict changes | `None` | `ServiceException` | app.services.history_service |
|
||||
|
||||
#### 4.2.4 统计相关
|
||||
|
||||
| 类/函数名 | 说明 | 参数(类型/含义) | 成功返回结构/类型 | 失败返回结构/类型 | 所属文件/模块 |
|
||||
|-----------|------|-----------------|-----------------|-----------------|--------------|
|
||||
| `StatisticsRouter.filter()` | 筛选项目 | ProjectFilter 筛选条件 | `PageResponse[Project]` | `HTTPException` | app.api.statistics |
|
||||
| `StatisticsRouter.statistics()` | 统计项目 | StatisticsRequest 统计请求 | `BaseResponse[StatisticsResult]` | `HTTPException` | app.api.statistics |
|
||||
| `StatisticsService.get_project_statistics()` | 获取项目统计 | StatisticsRequest 统计请求 | `StatisticsResult` | `ServiceException` | app.services.statistics_service |
|
||||
|
||||
---
|
||||
|
||||
## 5. 数据库与数据结构设计
|
||||
|
||||
### 5.1 数据库表结构
|
||||
|
||||
详细的数据库表结构见《数据库设计文档》。
|
||||
|
||||
### 5.2 数据传输对象 (DTOs)
|
||||
|
||||
#### 5.2.1 前端DTOs
|
||||
|
||||
##### 登录请求
|
||||
```javascript
|
||||
{
|
||||
username: String, // 用户名
|
||||
password: String // 密码
|
||||
}
|
||||
```
|
||||
|
||||
##### 项目请求
|
||||
```javascript
|
||||
{
|
||||
projectName: String, // 项目名称
|
||||
status: String, // 项目状态
|
||||
leader: String, // 负责人
|
||||
phone: String, // 联系电话
|
||||
email: String, // 邮箱
|
||||
background: String, // 项目背景
|
||||
goal: String, // 项目目标
|
||||
scope: String, // 项目范围
|
||||
startDate: String, // 开始日期
|
||||
plannedEndDate: String, // 预计结束日期
|
||||
actualEndDate: String, // 实际结束日期
|
||||
totalBudget: Number, // 总预算
|
||||
usedBudget: Number, // 已使用预算
|
||||
members: [ // 项目成员
|
||||
{
|
||||
name: String, // 姓名
|
||||
role: String, // 角色
|
||||
department: String // 部门
|
||||
}
|
||||
],
|
||||
milestones: [ // 项目里程碑
|
||||
{
|
||||
name: String, // 名称
|
||||
plannedDate: String, // 计划日期
|
||||
actualDate: String, // 实际日期
|
||||
status: String // 状态
|
||||
}
|
||||
],
|
||||
risks: [ // 项目风险
|
||||
{
|
||||
description: String, // 描述
|
||||
level: String, // 等级
|
||||
measure: String // 应对措施
|
||||
}
|
||||
],
|
||||
remarks: String // 备注
|
||||
}
|
||||
```
|
||||
|
||||
#### 5.2.2 后端DTOs (Pydantic Models)
|
||||
|
||||
##### 登录请求
|
||||
```python
|
||||
from pydantic import BaseModel
|
||||
|
||||
class LoginRequest(BaseModel):
|
||||
username: str # 用户名
|
||||
password: str # 密码
|
||||
```
|
||||
|
||||
##### 项目请求
|
||||
```python
|
||||
from pydantic import BaseModel
|
||||
from typing import List, Optional
|
||||
from datetime import date
|
||||
from decimal import Decimal
|
||||
|
||||
class MemberRequest(BaseModel):
|
||||
name: str # 姓名
|
||||
role: str # 角色
|
||||
department: str # 部门
|
||||
|
||||
class MilestoneRequest(BaseModel):
|
||||
name: str # 名称
|
||||
planned_date: date # 计划日期
|
||||
actual_date: Optional[date] = None # 实际日期
|
||||
status: str # 状态
|
||||
|
||||
class RiskRequest(BaseModel):
|
||||
description: str # 描述
|
||||
level: str # 等级
|
||||
measure: str # 应对措施
|
||||
|
||||
class ProjectRequest(BaseModel):
|
||||
project_name: str # 项目名称
|
||||
status: str # 项目状态
|
||||
leader: str # 负责人
|
||||
phone: Optional[str] = None # 联系电话
|
||||
email: Optional[str] = None # 邮箱
|
||||
background: Optional[str] = None # 项目背景
|
||||
goal: Optional[str] = None # 项目目标
|
||||
scope: Optional[str] = None # 项目范围
|
||||
start_date: date # 开始日期
|
||||
planned_end_date: date # 预计结束日期
|
||||
actual_end_date: Optional[date] = None # 实际结束日期
|
||||
total_budget: Decimal # 总预算
|
||||
used_budget: Decimal = Decimal('0.00') # 已使用预算
|
||||
members: List[MemberRequest] = [] # 项目成员
|
||||
milestones: List[MilestoneRequest] = [] # 项目里程碑
|
||||
risks: List[RiskRequest] = [] # 项目风险
|
||||
remarks: Optional[str] = None # 备注
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 接口设计
|
||||
|
||||
### 6.1 认证接口
|
||||
|
||||
| API路径 | 方法 | 模块/文件 | 类型 | 功能描述 | 请求体 (JSON) | 成功响应 (200 OK) |
|
||||
|---------|------|-----------|------|----------|--------------|------------------|
|
||||
| `/api/auth/login` | `POST` | `app.api.auth` | `Router` | 用户登录 | `{"username": "admin", "password": "123456"}` | `{"code": 200, "data": {"token": "...", "userInfo": {...}}, "message": "登录成功"}` |
|
||||
| `/api/auth/logout` | `POST` | `app.api.auth` | `Router` | 用户退出 | N/A | `{"code": 200, "message": "退出成功"}` |
|
||||
| `/api/auth/userInfo` | `GET` | `app.api.auth` | `Router` | 获取用户信息 | N/A | `{"code": 200, "data": {"userId": "...", "username": "...", "realName": "...", "department": "...", "role": "..."}}` |
|
||||
|
||||
### 6.2 用户接口
|
||||
|
||||
| API路径 | 方法 | 模块/文件 | 类型 | 功能描述 | 请求体 (JSON) | 成功响应 (200 OK) |
|
||||
|---------|------|-----------|------|----------|--------------|------------------|
|
||||
| `/api/user` | `GET` | `app.api.user` | `Router` | 获取用户列表 | N/A (Query参数: page, size, username, department, role) | `{"code": 200, "data": [{...}], "total": 10, "message": "查询成功"}` |
|
||||
| `/api/user` | `POST` | `app.api.user` | `Router` | 创建用户 | `{"username": "test", "password": "123456", "realName": "测试用户", "department": "技术部", "role": "OTHER"}` | `{"code": 200, "message": "创建成功"}` |
|
||||
| `/api/user/{id}` | `PUT` | `app.api.user` | `Router` | 更新用户 | `{"realName": "测试用户1", "department": "市场部", "role": "MARKETING"}` | `{"code": 200, "message": "更新成功"}` |
|
||||
| `/api/user/{id}` | `DELETE` | `app.api.user` | `Router` | 删除用户 | N/A | `{"code": 200, "message": "删除成功"}` |
|
||||
| `/api/user/resetPassword/{id}` | `PUT` | `app.api.user` | `Router` | 重置密码 | `{"password": "123456"}` | `{"code": 200, "message": "密码重置成功"}` |
|
||||
|
||||
### 6.3 项目接口
|
||||
|
||||
| API路径 | 方法 | 模块/文件 | 类型 | 功能描述 | 请求体 (JSON) | 成功响应 (200 OK) |
|
||||
|---------|------|-----------|------|----------|--------------|------------------|
|
||||
| `/api/project` | `GET` | `app.api.project` | `Router` | 获取项目列表 | N/A (Query参数: page, size, projectName, status, leader) | `{"code": 200, "data": [{...}], "total": 10, "message": "查询成功"}` |
|
||||
| `/api/project` | `POST` | `app.api.project` | `Router` | 创建项目 | `{"projectName": "测试项目", "status": "NOT_STARTED", "leader": "张三", ...}` | `{"code": 200, "data": {"projectId": "..."}, "message": "创建成功"}` |
|
||||
| `/api/project/{id}` | `GET` | `app.api.project` | `Router` | 获取项目详情 | N/A | `{"code": 200, "data": {...}, "message": "查询成功"}` |
|
||||
| `/api/project/{id}` | `PUT` | `app.api.project` | `Router` | 更新项目 | `{"projectName": "测试项目1", "status": "IN_PROGRESS", ...}` | `{"code": 200, "message": "更新成功"}` |
|
||||
| `/api/project/{id}` | `DELETE` | `app.api.project` | `Router` | 删除项目 | N/A | `{"code": 200, "message": "删除成功"}` |
|
||||
|
||||
### 6.4 历史记录接口
|
||||
|
||||
| API路径 | 方法 | 模块/文件 | 类型 | 功能描述 | 请求体 (JSON) | 成功响应 (200 OK) |
|
||||
|---------|------|-----------|------|----------|--------------|------------------|
|
||||
| `/api/history/{projectId}` | `GET` | `app.api.history` | `Router` | 获取项目历史 | N/A (Query参数: page, size, operator, startDate, endDate) | `{"code": 200, "data": [{...}], "total": 10, "message": "查询成功"}` |
|
||||
|
||||
### 6.5 统计接口
|
||||
|
||||
| API路径 | 方法 | 模块/文件 | 类型 | 功能描述 | 请求体 (JSON) | 成功响应 (200 OK) |
|
||||
|---------|------|-----------|------|----------|--------------|------------------|
|
||||
| `/api/statistics/filter` | `POST` | `app.api.statistics` | `Router` | 筛选项目 | `{"projectNo": "PRJ2025001", "projectName": "测试", "status": "IN_PROGRESS", ...}` | `{"code": 200, "data": [{...}], "total": 10, "message": "查询成功"}` |
|
||||
| `/api/statistics/statistics` | `POST` | `app.api.statistics` | `Router` | 统计项目 | `{"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 开发环境部署
|
||||
|
||||
#### 8.1.1 前端部署
|
||||
1. 克隆代码库: `git clone <repository-url>`
|
||||
2. 安装依赖: `npm install`
|
||||
3. 启动开发服务器: `npm run dev`
|
||||
4. 访问: `http://localhost:5173`
|
||||
|
||||
#### 8.1.2 后端部署
|
||||
1. 克隆代码库: `git clone <repository-url>`
|
||||
2. 安装依赖: `poetry install` 或 `pip install -r requirements.txt`
|
||||
3. 配置数据库连接 (config.py)
|
||||
4. 初始化数据库: `alembic upgrade head`
|
||||
5. 启动应用: `uvicorn app.main:app --reload`
|
||||
6. 访问: `http://localhost:8000`
|
||||
7. API文档: `http://localhost:8000/docs`
|
||||
|
||||
### 8.2 生产环境部署
|
||||
|
||||
#### 8.2.1 前端部署
|
||||
1. 构建生产版本: `npm run build`
|
||||
2. 将构建产物复制到 Nginx 静态目录
|
||||
3. 配置 Nginx 反向代理
|
||||
|
||||
#### 8.2.2 后端部署
|
||||
1. 安装依赖: `poetry install --no-dev` 或 `pip install -r requirements.txt`
|
||||
2. 配置环境变量和数据库连接
|
||||
3. 使用 Gunicorn 启动应用: `gunicorn app.main:app -w 4 -k uvicorn.workers.UvicornWorker`
|
||||
4. 配置 Nginx 反向代理
|
||||
|
||||
### 8.3 集成方案
|
||||
|
||||
- **前端与后端集成**: 通过 RESTful API 进行数据交互
|
||||
- **数据库集成**: 使用 SQLAlchemy ORM 操作数据库
|
||||
- **日志集成**: 使用 Python logging 模块记录系统日志
|
||||
- **监控集成**: 可集成 Prometheus + Grafana 监控系统性能
|
||||
|
||||
---
|
||||
|
||||
## 9. 性能优化策略
|
||||
|
||||
### 9.1 前端优化
|
||||
|
||||
- **代码分割**: 使用 Vue 的路由懒加载,减少初始加载时间
|
||||
- **组件缓存**: 使用 keep-alive 缓存频繁访问的组件
|
||||
- **图片优化**: 使用适当尺寸的图片,压缩图片大小
|
||||
- **网络请求优化**: 使用 Axios 拦截器,统一处理请求和响应
|
||||
- **减少 DOM 操作**: 使用虚拟列表处理大数据渲染
|
||||
|
||||
### 9.2 后端优化
|
||||
|
||||
- **数据库索引**: 为常用查询字段创建索引,提高查询性能
|
||||
- **连接池**: 使用 SQLAlchemy 的连接池,提高数据库连接效率
|
||||
- **异步处理**: FastAPI 支持异步处理,提高系统响应速度
|
||||
- **批量操作**: 对批量数据操作使用批量处理,减少数据库交互次数
|
||||
- **查询优化**: 使用 SQLAlchemy 的 lazy loading 和 eager loading 优化查询
|
||||
|
||||
### 9.3 数据库优化
|
||||
|
||||
- **表结构优化**: 合理设计表结构,避免冗余字段
|
||||
- **SQL优化**: 优化 SQL 查询语句,避免全表扫描
|
||||
- **定期清理**: 定期清理历史数据,避免数据量过大
|
||||
- **数据库配置**: 优化 MySQL 配置参数,提高数据库性能
|
||||
|
||||
---
|
||||
|
||||
## 10. 监控与维护
|
||||
|
||||
### 10.1 系统监控
|
||||
|
||||
- **应用监控**: 监控应用的运行状态、CPU、内存使用情况
|
||||
- **数据库监控**: 监控数据库的连接数、查询性能、存储空间
|
||||
- **API监控**: 监控 API 的响应时间、调用次数、错误率
|
||||
- **日志监控**: 监控系统日志,及时发现异常情况
|
||||
|
||||
### 10.2 故障处理
|
||||
|
||||
- **故障定位**: 通过日志和监控工具定位故障原因
|
||||
- **故障恢复**: 制定故障恢复方案,确保系统快速恢复
|
||||
- **故障预防**: 定期进行系统检查,预防故障发生
|
||||
|
||||
### 10.3 系统维护
|
||||
|
||||
- **定期更新**: 定期更新依赖库和框架版本,修复安全漏洞
|
||||
- **数据备份**: 定期备份数据库,防止数据丢失
|
||||
- **性能调优**: 定期分析系统性能,进行性能调优
|
||||
- **文档更新**: 及时更新系统文档,保持文档与系统同步
|
||||
|
||||
---
|
||||
|
||||
## 11. 附录
|
||||
|
||||
### 11.1 技术选型对比
|
||||
|
||||
| 技术 | 对比方案 | 最终选择理由 |
|
||||
|------|----------|--------------|
|
||||
| 前端框架 | Vue 3 vs React | Vue 3 学习曲线平缓,文档完善,适合快速开发 |
|
||||
| 后端框架 | FastAPI vs Flask vs Django | FastAPI 高性能,自动生成API文档,支持异步 |
|
||||
| 数据库 | MySQL vs PostgreSQL | MySQL 社区活跃,生态成熟,适合企业级应用 |
|
||||
| ORM框架 | SQLAlchemy vs Django ORM | SQLAlchemy 灵活强大,支持多种数据库 |
|
||||
|
||||
### 11.2 开发规范
|
||||
|
||||
#### 前端开发规范
|
||||
- 组件命名: 大驼峰命名法 (PascalCase)
|
||||
- 变量命名: 小驼峰命名法 (camelCase)
|
||||
- 常量命名: 全大写下划线分隔 (SNAKE_CASE)
|
||||
- 代码风格: 遵循 ESLint 规范
|
||||
|
||||
#### 后端开发规范
|
||||
- 类命名: 大驼峰命名法 (PascalCase)
|
||||
- 函数命名: 小驼峰命名法 (camelCase)
|
||||
- 变量命名: 小写下划线分隔 (snake_case)
|
||||
- 常量命名: 全大写下划线分隔 (SNAKE_CASE)
|
||||
- 代码风格: 遵循 PEP 8 规范
|
||||
|
||||
### 11.3 变更记录
|
||||
|
||||
| 版本 | 日期 | 修改人 | 修改内容 |
|
||||
|------|------|--------|----------|
|
||||
| V1.0 | 2026-01-26 | - | 初始版本创建 |
|
||||
| V2.0 | 2026-01-26 | - | 后端改为Python FastAPI,去掉Redis |
|
||||
Reference in New Issue
Block a user