save code

This commit is contained in:
Your Name
2026-01-26 12:29:56 +08:00
parent 4408f41d81
commit 40d2f3f6ac
13 changed files with 4891 additions and 124 deletions
BIN
View File
Binary file not shown.
+74
View File
@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<project>
<基本信息>
<项目编号>PRJ2025001</项目编号>
<项目名称>企业数字化转型系统</项目名称>
<项目状态>进行中</项目状态>
<创建日期>2025-01-15</创建日期>
<负责人>张三</负责人>
<联系电话>13800138000</联系电话>
<邮箱>zhangsan@example.com</邮箱>
</基本信息>
<项目描述>
<项目背景>为了提升企业运营效率,实现业务流程数字化管理</项目背景>
<项目目标>完成企业内部管理系统的全面数字化改造</项目目标>
<项目范围>包括人力资源、财务管理、供应链管理等模块</项目范围>
</项目描述>
<项目团队>
<成员>
<姓名>张三</姓名>
<角色>项目经理</角色>
<部门>市场部</部门>
</成员>
<成员>
<姓名>李四</姓名>
<角色>技术负责人</角色>
<部门>技术部</部门>
</成员>
<成员>
<姓名>王五</姓名>
<角色>设计师</角色>
<部门>设计部</部门>
</成员>
</项目团队>
<项目时间>
<开始日期>2025-01-15</开始日期>
<预计结束日期>2025-06-30</预计结束日期>
<实际结束日期></实际结束日期>
</项目时间>
<项目预算>
<总预算>500000</总预算>
<已使用>120000</已使用>
<剩余>380000</剩余>
</项目预算>
<项目里程碑>
<里程碑>
<名称>需求分析完成</名称>
<计划日期>2025-02-15</计划日期>
<实际日期>2025-02-10</实际日期>
<状态>已完成</状态>
</里程碑>
<里程碑>
<名称>系统设计完成</名称>
<计划日期>2025-03-15</计划日期>
<实际日期></实际日期>
<状态>进行中</状态>
</里程碑>
<里程碑>
<名称>开发完成</名称>
<计划日期>2025-05-30</计划日期>
<实际日期></实际日期>
<状态>未开始</状态>
</里程碑>
</项目里程碑>
<项目风险>
<风险>
<描述>技术难度较高,可能影响进度</描述>
<等级></等级>
<应对措施>增加技术团队人员投入</应对措施>
</风险>
</项目风险>
<项目备注>
项目需要与现有系统进行数据对接,需要提前做好接口设计
</项目备注>
</project>
+482
View File
@@ -0,0 +1,482 @@
# 项目管理系统产品需求文档
## 文档信息
- **文档版本**: V1.0
- **创建日期**: 2026-01-26
- **文档类型**: 产品需求文档 (PRD)
---
## 1. 产品概述
### 1.1 产品简介
项目管理系统是一个基于BS架构的企业级项目管理平台,旨在帮助企业实现项目全生命周期的数字化管理,包括项目创建、编辑、跟踪、统计等功能。
### 1.2 产品目标
- 规范项目管理流程,提高项目执行效率
- 实现项目信息的集中管理和共享
- 提供完善的项目修改历史记录,便于追溯
- 支持多维度项目筛选和统计分析
### 1.3 目标用户
- 管理员:系统最高权限用户,负责用户管理和系统维护
- 市场部人员:负责项目创建和项目信息维护
- 其他部门人员:负责项目内容的修改和更新
---
## 2. 用户角色与权限
### 2.1 角色定义
#### 2.1.1 管理员
**权限范围:**
- 用户管理:创建、编辑、删除用户
- 权限管理:分配用户角色和权限
- 密码管理:重置用户密码
- 项目管理:查看、编辑所有项目
- 统计分析:查看所有项目统计报表
- 系统配置:管理系统基础配置
#### 2.1.2 市场部人员
**权限范围:**
- 项目创建:创建新项目
- 项目编辑:编辑项目信息
- 项目查看:查看所有项目
- 历史记录:查看项目修改历史
#### 2.1.3 其他部门人员
**权限范围:**
- 项目编辑:编辑项目内容
- 项目查看:查看所有项目
- 历史记录:查看项目修改历史
### 2.2 权限矩阵
| 功能模块 | 管理员 | 市场部 | 其他部门 |
|---------|--------|--------|----------|
| 用户管理 | ✓ | ✗ | ✗ |
| 权限管理 | ✓ | ✗ | ✗ |
| 密码管理 | ✓ | ✗ | ✗ |
| 项目创建 | ✓ | ✓ | ✗ |
| 项目编辑 | ✓ | ✓ | ✓ |
| 项目查看 | ✓ | ✓ | ✓ |
| 历史记录查看 | ✓ | ✓ | ✓ |
| 项目统计 | ✓ | ✗ | ✗ |
| 系统配置 | ✓ | ✗ | ✗ |
---
## 3. 功能需求
### 3.1 用户管理模块
#### 3.1.1 用户创建
**功能描述:** 管理员可以创建新用户账号
**输入信息:**
- 用户名(必填,唯一)
- 密码(必填,需满足安全策略)
- 真实姓名(必填)
- 部门(必填,可选:市场部、技术部、设计部、财务部等)
- 联系电话(选填)
- 邮箱(选填,需格式验证)
- 角色(必填:管理员、市场部、其他部门)
**业务规则:**
- 用户名必须唯一,不能重复
- 密码长度不少于8位,包含字母和数字
- 邮箱格式必须正确
- 创建成功后自动分配初始权限
#### 3.1.2 用户编辑
**功能描述:** 管理员可以编辑用户基本信息
**可编辑字段:**
- 真实姓名
- 部门
- 联系电话
- 邮箱
- 角色
**业务规则:**
- 用户名不可修改
- 修改角色会自动更新权限
- 修改部门会影响项目创建权限
#### 3.1.3 密码管理
**功能描述:** 管理员可以重置用户密码
**操作方式:**
- 选择用户
- 生成新随机密码或手动设置密码
- 通知用户新密码
**业务规则:**
- 新密码需满足安全策略
- 密码重置后建议用户首次登录修改密码
#### 3.1.4 用户列表
**功能描述:** 展示所有用户信息
**显示字段:**
- 用户名
- 真实姓名
- 部门
- 角色
- 创建时间
- 最后登录时间
- 状态(正常/禁用)
**支持操作:**
- 编辑用户
- 重置密码
- 禁用/启用用户
- 删除用户
### 3.2 项目管理模块
#### 3.2.1 项目创建
**功能描述:** 市场部人员可以创建新项目
**创建条件:**
- 用户角色为市场部或管理员
**项目信息结构:**
**基本信息**
- 项目编号(自动生成)
- 项目名称
- 项目状态(未开始、进行中、已完成、已暂停、已取消)
- 创建日期(自动生成)
- 负责人
- 联系电话
- 邮箱
**项目描述**
- 项目背景
- 项目目标
- 项目范围
**项目团队**
- 成员列表(姓名、角色、部门)
**项目时间**
- 开始日期
- 预计结束日期
- 实际结束日期
**项目预算**
- 总预算
- 已使用
- 剩余
**项目里程碑**
- 里程碑列表(名称、计划日期、实际日期、状态)
**项目风险**
- 风险列表(描述、等级、应对措施)
**项目备注**
- 备注内容
**业务规则:**
- 项目编号自动生成,格式:PRJ + 年份 + 序号(如:PRJ2025001
- 项目状态默认为"未开始"
- 创建者自动记录为创建人
- 创建时间自动记录
#### 3.2.2 项目编辑
**功能描述:** 所有用户可以编辑项目信息
**编辑权限:**
- 管理员:可编辑所有项目
- 市场部:可编辑所有项目
- 其他部门:可编辑所有项目
**编辑内容:**
- 可编辑项目的所有字段
- 编辑后自动记录修改历史
**业务规则:**
- 项目编号不可修改
- 创建日期不可修改
- 创建人不可修改
- 每次修改都记录修改历史
#### 3.2.3 项目查看
**功能描述:** 所有用户可以查看项目详情
**查看内容:**
- 项目完整信息
- 项目修改历史记录
**业务规则:**
- 所有用户都可以查看所有项目
- 项目修改历史按时间倒序显示
#### 3.2.4 项目列表
**功能描述:** 展示所有项目列表
**显示字段:**
- 项目编号
- 项目名称
- 项目状态
- 负责人
- 创建日期
- 最后修改时间
**支持操作:**
- 查看项目详情
- 编辑项目
- 查看修改历史
### 3.3 项目历史记录模块
#### 3.3.1 历史记录记录
**功能描述:** 自动记录项目修改历史
**记录内容:**
- 修改时间
- 修改人
- 修改字段
- 修改前值
- 修改后值
- 修改类型(创建、更新、删除)
**记录时机:**
- 项目创建时
- 项目信息修改时
- 项目状态变更时
**业务规则:**
- 历史记录不可删除
- 历史记录不可修改
- 历史记录永久保存
#### 3.3.2 历史记录查看
**功能描述:** 查看项目修改历史
**显示内容:**
- 修改时间
- 修改人
- 修改详情
- 修改前后的值对比
**显示方式:**
- 按时间倒序排列
- 支持按修改人筛选
- 支持按时间范围筛选
### 3.4 项目统计模块
#### 3.4.1 项目筛选
**功能描述:** 管理员可以通过多种条件筛选项目
**筛选条件:**
- 项目编号
- 项目名称(模糊查询)
- 项目状态
- 负责人
- 创建日期范围
- 修改日期范围
- 部门
- 项目状态
**业务规则:**
- 支持多条件组合筛选
- 筛选结果可导出
- 筛选条件可保存
#### 3.4.2 项目统计
**功能描述:** 管理员可以查看项目统计数据
**统计维度:**
- 按项目状态统计
- 按部门统计
- 按负责人统计
- 按创建时间统计
- 按项目预算统计
**统计指标:**
- 项目总数
- 各状态项目数量
- 项目完成率
- 项目平均周期
- 预算使用率
**展示方式:**
- 数据表格
- 柱状图
- 饼图
- 折线图
**业务规则:**
- 统计数据实时更新
- 支持时间范围选择
- 支持统计结果导出
---
## 4. 项目数据结构
### 4.1 用户数据结构
```json
{
"userId": "用户ID",
"username": "用户名",
"password": "密码(加密)",
"realName": "真实姓名",
"department": "部门",
"phone": "联系电话",
"email": "邮箱",
"role": "角色",
"status": "状态",
"createTime": "创建时间",
"lastLoginTime": "最后登录时间"
}
```
### 4.2 项目数据结构
```json
{
"projectId": "项目ID",
"projectNo": "项目编号",
"projectName": "项目名称",
"status": "项目状态",
"createTime": "创建时间",
"creator": "创建人",
"basicInfo": {
"leader": "负责人",
"phone": "联系电话",
"email": "邮箱"
},
"description": {
"background": "项目背景",
"goal": "项目目标",
"scope": "项目范围"
},
"team": [
{
"name": "姓名",
"role": "角色",
"department": "部门"
}
],
"timeInfo": {
"startDate": "开始日期",
"plannedEndDate": "预计结束日期",
"actualEndDate": "实际结束日期"
},
"budget": {
"total": "总预算",
"used": "已使用",
"remaining": "剩余"
},
"milestones": [
{
"name": "名称",
"plannedDate": "计划日期",
"actualDate": "实际日期",
"status": "状态"
}
],
"risks": [
{
"description": "描述",
"level": "等级",
"measure": "应对措施"
}
],
"remarks": "备注",
"updateTime": "最后修改时间",
"lastModifier": "最后修改人"
}
```
### 4.3 项目历史记录数据结构
```json
{
"historyId": "历史记录ID",
"projectId": "项目ID",
"projectNo": "项目编号",
"operationType": "操作类型",
"operator": "操作人",
"operationTime": "操作时间",
"changes": [
{
"field": "字段名",
"oldValue": "修改前值",
"newValue": "修改后值"
}
]
}
```
---
## 5. 系统架构
### 5.1 技术架构
- **架构模式**: BS架构(Browser/Server
- **前端技术**: 待定
- **后端技术**: 待定
- **数据库**: 待定
### 5.2 部署架构
- **前端**: Web浏览器访问
- **后端**: 应用服务器部署
- **数据库**: 数据库服务器部署
### 5.3 安全架构
- 用户认证:用户名密码登录
- 权限控制:基于角色的访问控制(RBAC)
- 数据加密:敏感数据加密存储
- 操作审计:记录用户操作日志
---
## 6. 非功能性需求
### 6.1 性能要求
- 系统响应时间:页面加载时间 < 3秒
- 并发用户数:支持至少100个并发用户
- 数据查询:复杂查询响应时间 < 5秒
### 6.2 可用性要求
- 系统可用性:99.5%
- 系统恢复时间:故障恢复时间 < 1小时
### 6.3 安全性要求
- 密码加密:使用安全的加密算法
- 会话管理:会话超时时间30分钟
- 数据备份:每日自动备份数据
- 权限控制:严格的权限验证机制
### 6.4 可扩展性要求
- 支持模块化扩展
- 支持新增用户角色
- 支持自定义项目字段
### 6.5 易用性要求
- 界面简洁直观
- 操作流程清晰
- 提供操作提示
- 支持快捷键操作
---
## 7. 附录
### 7.1 术语表
- **BS架构**: Browser/Server架构,浏览器/服务器架构
- **RBAC**: Role-Based Access Control,基于角色的访问控制
- **PRD**: Product Requirements Document,产品需求文档
### 7.2 参考资料
- 项目示例文件:docs/example.xsl
### 7.3 变更记录
| 版本 | 日期 | 修改人 | 修改内容 |
|------|------|--------|----------|
| V1.0 | 2026-01-26 | - | 初始版本创建 |
+533
View File
@@ -0,0 +1,533 @@
# 项目管理系统功能规格说明书
## 文档信息
- **文档版本**: V1.0
- **创建日期**: 2026-01-26
- **文档类型**: 功能规格说明书 (FSD)
---
## 1. 引言
### 1.1 文档目的
本文档详细描述项目管理系统的各项功能规格,为系统设计和开发提供详细的功能说明。
### 1.2 适用范围
本文档适用于项目管理系统开发团队,包括前端开发、后端开发、测试人员等。
### 1.3 参考文档
- 《项目管理系统产品需求文档》
---
## 2. 用户管理功能规格
### 2.1 用户登录功能
#### 2.1.1 功能描述
用户通过用户名和密码登录系统。
#### 2.1.2 输入参数
- 用户名:字符串,长度3-20字符
- 密码:字符串,长度8-20字符
#### 2.1.3 处理逻辑
1. 验证用户名和密码是否为空
2. 验证用户名是否存在
3. 验证密码是否正确
4. 验证用户状态是否正常
5. 登录成功后创建会话
6. 记录登录日志
#### 2.1.4 输出结果
- 登录成功:跳转到系统首页
- 登录失败:显示错误提示信息
#### 2.1.5 异常处理
- 用户名不存在:提示"用户名或密码错误"
- 密码错误:提示"用户名或密码错误"
- 用户被禁用:提示"账号已被禁用,请联系管理员"
- 系统异常:提示"系统异常,请稍后重试"
### 2.2 用户创建功能
#### 2.2.1 功能描述
管理员创建新用户账号。
#### 2.2.2 输入参数
- 用户名:字符串,长度3-20字符,必填
- 密码:字符串,长度8-20字符,必填
- 确认密码:字符串,必填
- 真实姓名:字符串,长度2-20字符,必填
- 部门:枚举值,必填
- 联系电话:字符串,选填
- 邮箱:字符串,选填
- 角色:枚举值,必填
#### 2.2.3 处理逻辑
1. 验证输入参数的完整性和格式
2. 验证用户名是否已存在
3. 验证密码和确认密码是否一致
4. 验证邮箱格式是否正确
5. 对密码进行加密处理
6. 生成用户ID
7. 保存用户信息到数据库
8. 记录操作日志
#### 2.2.4 输出结果
- 创建成功:提示"用户创建成功",清空表单
- 创建失败:显示错误提示信息
#### 2.2.5 异常处理
- 用户名已存在:提示"用户名已存在"
- 密码不一致:提示"两次输入的密码不一致"
- 邮箱格式错误:提示"邮箱格式不正确"
- 数据库异常:提示"系统异常,请稍后重试"
### 2.3 用户编辑功能
#### 2.3.1 功能描述
管理员编辑用户基本信息。
#### 2.3.2 输入参数
- 用户ID:字符串,必填
- 真实姓名:字符串,必填
- 部门:枚举值,必填
- 联系电话:字符串,选填
- 邮箱:字符串,选填
- 角色:枚举值,必填
#### 2.3.3 处理逻辑
1. 验证输入参数的完整性和格式
2. 验证用户ID是否存在
3. 验证邮箱格式是否正确
4. 更新用户信息到数据库
5. 如果角色发生变化,更新用户权限
6. 记录操作日志
#### 2.3.4 输出结果
- 编辑成功:提示"用户信息更新成功"
- 编辑失败:显示错误提示信息
#### 2.3.5 异常处理
- 用户不存在:提示"用户不存在"
- 邮箱格式错误:提示"邮箱格式不正确"
- 数据库异常:提示"系统异常,请稍后重试"
### 2.4 密码重置功能
#### 2.4.1 功能描述
管理员重置用户密码。
#### 2.4.2 输入参数
- 用户ID:字符串,必填
- 新密码:字符串,长度8-20字符,必填
- 确认密码:字符串,必填
#### 2.4.3 处理逻辑
1. 验证输入参数的完整性
2. 验证用户ID是否存在
3. 验证新密码和确认密码是否一致
4. 对新密码进行加密处理
5. 更新用户密码到数据库
6. 记录操作日志
#### 2.4.4 输出结果
- 重置成功:提示"密码重置成功"
- 重置失败:显示错误提示信息
#### 2.4.5 异常处理
- 用户不存在:提示"用户不存在"
- 密码不一致:提示"两次输入的密码不一致"
- 数据库异常:提示"系统异常,请稍后重试"
### 2.5 用户列表功能
#### 2.5.1 功能描述
展示所有用户列表。
#### 2.5.2 输入参数
- 页码:整数,默认1
- 每页数量:整数,默认10
- 搜索关键词:字符串,选填
#### 2.5.3 处理逻辑
1. 验证分页参数
2. 根据搜索关键词查询用户列表
3. 计算总记录数和总页数
4. 返回用户列表数据
#### 2.5.4 输出结果
- 用户列表数据
- 分页信息
#### 2.5.5 异常处理
- 参数错误:提示"参数错误"
- 数据库异常:提示"系统异常,请稍后重试"
---
## 3. 项目管理功能规格
### 3.1 项目创建功能
#### 3.1.1 功能描述
市场部人员创建新项目。
#### 3.1.2 输入参数
**基本信息**
- 项目名称:字符串,长度2-100字符,必填
- 项目状态:枚举值,默认"未开始"
- 负责人:字符串,必填
- 联系电话:字符串,选填
- 邮箱:字符串,选填
**项目描述**
- 项目背景:字符串,选填
- 项目目标:字符串,选填
- 项目范围:字符串,选填
**项目团队**
- 成员列表:数组,每个成员包含姓名、角色、部门
**项目时间**
- 开始日期:日期,必填
- 预计结束日期:日期,必填
- 实际结束日期:日期,选填
**项目预算**
- 总预算:数字,必填
- 已使用:数字,默认0
- 剩余:数字,自动计算
**项目里程碑**
- 里程碑列表:数组,每个里程碑包含名称、计划日期、实际日期、状态
**项目风险**
- 风险列表:数组,每个风险包含描述、等级、应对措施
**项目备注**
- 备注:字符串,选填
#### 3.1.3 处理逻辑
1. 验证用户是否有创建项目权限
2. 验证必填参数是否完整
3. 验证日期格式是否正确
4. 验证预算数据是否合法
5. 生成项目编号
6. 生成项目ID
7. 计算剩余预算
8. 保存项目信息到数据库
9. 创建项目创建历史记录
10. 记录操作日志
#### 3.1.4 输出结果
- 创建成功:提示"项目创建成功",跳转到项目列表
- 创建失败:显示错误提示信息
#### 3.1.5 异常处理
- 无权限:提示"您没有创建项目的权限"
- 参数错误:提示"请填写必填项"
- 日期错误:提示"日期格式不正确"
- 数据库异常:提示"系统异常,请稍后重试"
### 3.2 项目编辑功能
#### 3.2.1 功能描述
用户编辑项目信息。
#### 3.2.2 输入参数
- 项目ID:字符串,必填
- 项目信息:项目完整信息(同创建参数)
#### 3.2.3 处理逻辑
1. 验证用户是否有编辑项目权限
2. 验证项目ID是否存在
3. 获取项目当前信息
4. 对比修改前后的数据
5. 验证必填参数是否完整
6. 验证日期格式是否正确
7. 验证预算数据是否合法
8. 更新项目信息到数据库
9. 记录修改历史(只记录有变化的字段)
10. 更新最后修改时间和修改人
11. 记录操作日志
#### 3.2.4 输出结果
- 编辑成功:提示"项目信息更新成功"
- 编辑失败:显示错误提示信息
#### 3.2.5 异常处理
- 项目不存在:提示"项目不存在"
- 参数错误:提示"请填写必填项"
- 日期错误:提示"日期格式不正确"
- 数据库异常:提示"系统异常,请稍后重试"
### 3.3 项目查看功能
#### 3.3.1 功能描述
用户查看项目详情。
#### 3.3.2 输入参数
- 项目ID:字符串,必填
#### 3.3.3 处理逻辑
1. 验证项目ID是否存在
2. 查询项目详细信息
3. 查询项目修改历史记录
4. 返回项目详情和历史记录
#### 3.3.4 输出结果
- 项目详细信息
- 项目修改历史记录
#### 3.3.5 异常处理
- 项目不存在:提示"项目不存在"
- 数据库异常:提示"系统异常,请稍后重试"
### 3.4 项目列表功能
#### 3.4.1 功能描述
展示所有项目列表。
#### 3.4.2 输入参数
- 页码:整数,默认1
- 每页数量:整数,默认10
- 搜索关键词:字符串,选填
- 项目状态:枚举值,选填
- 负责人:字符串,选填
#### 3.4.3 处理逻辑
1. 验证分页参数
2. 根据筛选条件查询项目列表
3. 计算总记录数和总页数
4. 返回项目列表数据
#### 3.4.4 输出结果
- 项目列表数据
- 分页信息
#### 3.4.5 异常处理
- 参数错误:提示"参数错误"
- 数据库异常:提示"系统异常,请稍后重试"
---
## 4. 项目历史记录功能规格
### 4.1 历史记录记录功能
#### 4.1.1 功能描述
自动记录项目修改历史。
#### 4.1.2 输入参数
- 项目ID:字符串,必填
- 操作类型:枚举值,必填
- 操作人:字符串,必填
- 修改数据:对象,必填
#### 4.1.3 处理逻辑
1. 生成历史记录ID
2. 记录操作时间
3. 对比修改前后的数据
4. 提取变化的字段
5. 保存历史记录到数据库
#### 4.1.4 输出结果
- 记录成功:无返回
- 记录失败:记录错误日志
#### 4.1.5 异常处理
- 数据库异常:记录错误日志,不影响主流程
### 4.2 历史记录查看功能
#### 4.2.1 功能描述
查看项目修改历史。
#### 4.2.2 输入参数
- 项目ID:字符串,必填
- 页码:整数,默认1
- 每页数量:整数,默认10
- 修改人:字符串,选填
- 开始时间:日期,选填
- 结束时间:日期,选填
#### 4.2.3 处理逻辑
1. 验证项目ID是否存在
2. 根据筛选条件查询历史记录
3. 按时间倒序排列
4. 计算总记录数和总页数
5. 返回历史记录数据
#### 4.2.4 输出结果
- 历史记录列表
- 分页信息
#### 4.2.5 异常处理
- 项目不存在:提示"项目不存在"
- 参数错误:提示"参数错误"
- 数据库异常:提示"系统异常,请稍后重试"
---
## 5. 项目统计功能规格
### 5.1 项目筛选功能
#### 5.1.1 功能描述
管理员通过多种条件筛选项目。
#### 5.1.2 输入参数
- 项目编号:字符串,选填
- 项目名称:字符串,选填
- 项目状态:枚举值,选填
- 负责人:字符串,选填
- 创建开始日期:日期,选填
- 创建结束日期:日期,选填
- 修改开始日期:日期,选填
- 修改结束日期:日期,选填
- 部门:字符串,选填
#### 5.1.3 处理逻辑
1. 验证用户是否有筛选权限
2. 验证日期格式是否正确
3. 构建查询条件
4. 执行查询
5. 返回筛选结果
#### 5.1.4 输出结果
- 筛选后的项目列表
#### 5.1.5 异常处理
- 无权限:提示"您没有筛选项目的权限"
- 参数错误:提示"参数错误"
- 数据库异常:提示"系统异常,请稍后重试"
### 5.2 项目统计功能
#### 5.2.1 功能描述
管理员查看项目统计数据。
#### 5.2.2 输入参数
- 统计维度:枚举值,必填
- 时间范围:开始日期、结束日期,选填
#### 5.2.3 处理逻辑
1. 验证用户是否有统计权限
2. 根据统计维度查询数据
3. 根据时间范围过滤数据
4. 计算统计指标
5. 返回统计结果
#### 5.2.4 输出结果
- 统计数据
- 统计图表数据
#### 5.2.5 异常处理
- 无权限:提示"您没有查看统计的权限"
- 参数错误:提示"参数错误"
- 数据库异常:提示"系统异常,请稍后重试"
---
## 6. 数据验证规则
### 6.1 用户数据验证
- 用户名:3-20字符,只能包含字母、数字、下划线
- 密码:8-20字符,必须包含字母和数字
- 真实姓名:2-20字符
- 邮箱:标准邮箱格式
- 联系电话:11位数字
### 6.2 项目数据验证
- 项目名称:2-100字符
- 项目编号:自动生成,格式PRJ+年份+序号
- 项目状态:枚举值(未开始、进行中、已完成、已暂停、已取消)
- 预算:非负数
- 日期:YYYY-MM-DD格式
---
## 7. 业务流程图
### 7.1 用户创建流程
1. 管理员登录系统
2. 进入用户管理页面
3. 点击"创建用户"按钮
4. 填写用户信息
5. 提交表单
6. 系统验证数据
7. 保存用户信息
8. 提示创建成功
### 7.2 项目创建流程
1. 市场部人员登录系统
2. 进入项目管理页面
3. 点击"创建项目"按钮
4. 填写项目信息
5. 提交表单
6. 系统验证数据
7. 生成项目编号
8. 保存项目信息
9. 记录创建历史
10. 提示创建成功
### 7.3 项目编辑流程
1. 用户登录系统
2. 进入项目列表页面
3. 选择要编辑的项目
4. 点击"编辑"按钮
5. 修改项目信息
6. 提交表单
7. 系统验证数据
8. 对比修改前后的数据
9. 更新项目信息
10. 记录修改历史
11. 提示更新成功
---
## 8. 附录
### 8.1 枚举值定义
#### 用户角色
- ADMIN:管理员
- MARKETING:市场部
- OTHER:其他部门
#### 项目状态
- NOT_STARTED:未开始
- IN_PROGRESS:进行中
- COMPLETED:已完成
- PAUSED:已暂停
- CANCELLED:已取消
#### 操作类型
- CREATE:创建
- UPDATE:更新
- DELETE:删除
#### 部门
- MARKETING:市场部
- TECHNOLOGY:技术部
- DESIGN:设计部
- FINANCE:财务部
- HR:人力资源部
### 8.2 错误码定义
- 1001:用户名或密码错误
- 1002:用户不存在
- 1003:用户名已存在
- 1004:密码不一致
- 2001:项目不存在
- 2002:无权限操作
- 3001:参数错误
- 9999:系统异常
### 8.3 变更记录
| 版本 | 日期 | 修改人 | 修改内容 |
|------|------|--------|----------|
| V1.0 | 2026-01-26 | - | 初始版本创建 |
+634
View File
@@ -0,0 +1,634 @@
# 项目管理系统技术架构文档
## 文档信息
- **文档版本**: V2.0
- **创建日期**: 2026-01-26
- **文档类型**: 技术架构文档
---
## 1. 技术架构概述
### 1.1 架构风格
本项目采用BSBrowser/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 |
+529
View File
@@ -0,0 +1,529 @@
# 项目管理系统数据库设计文档
## 文档信息
- **文档版本**: V1.0
- **创建日期**: 2026-01-26
- **文档类型**: 数据库设计文档 (DDD)
---
## 1. 数据库概述
### 1.1 数据库选型
- **数据库类型**: 关系型数据库
- **推荐数据库**: MySQL / PostgreSQL
### 1.2 数据库设计原则
- 遵循第三范式(3NF
- 合理使用索引提高查询性能
- 考虑数据完整性和一致性
- 支持事务处理
- 便于扩展和维护
---
## 2. 数据库表设计
### 2.1 用户表 (sys_user)
#### 2.1.1 表说明
存储系统用户的基本信息和认证信息。
#### 2.1.2 表结构
| 字段名 | 数据类型 | 长度 | 是否必填 | 默认值 | 说明 |
|--------|----------|------|----------|--------|------|
| user_id | VARCHAR | 32 | 是 | - | 用户ID,主键 |
| username | VARCHAR | 50 | 是 | - | 用户名,唯一 |
| password | VARCHAR | 128 | 是 | - | 密码,加密存储 |
| real_name | VARCHAR | 50 | 是 | - | 真实姓名 |
| department | VARCHAR | 50 | 是 | - | 部门 |
| phone | VARCHAR | 20 | 否 | NULL | 联系电话 |
| email | VARCHAR | 100 | 否 | NULL | 邮箱 |
| role | VARCHAR | 20 | 是 | - | 角色 |
| status | TINYINT | 1 | 是 | 1 | 状态:1-正常,0-禁用 |
| create_time | DATETIME | - | 是 | CURRENT_TIMESTAMP | 创建时间 |
| update_time | DATETIME | - | 是 | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
| last_login_time | DATETIME | - | 否 | NULL | 最后登录时间 |
#### 2.1.3 索引设计
- PRIMARY KEY: user_id
- UNIQUE KEY: uk_username (username)
- INDEX: idx_department (department)
- INDEX: idx_role (role)
- INDEX: idx_status (status)
#### 2.1.4 外键约束
---
### 2.2 项目表 (project)
#### 2.2.1 表说明
存储项目的基本信息和详细内容。
#### 2.2.2 表结构
| 字段名 | 数据类型 | 长度 | 是否必填 | 默认值 | 说明 |
|--------|----------|------|----------|--------|------|
| project_id | VARCHAR | 32 | 是 | - | 项目ID,主键 |
| project_no | VARCHAR | 20 | 是 | - | 项目编号,唯一 |
| project_name | VARCHAR | 200 | 是 | - | 项目名称 |
| status | VARCHAR | 20 | 是 | 'NOT_STARTED' | 项目状态 |
| create_time | DATETIME | - | 是 | CURRENT_TIMESTAMP | 创建时间 |
| creator | VARCHAR | 50 | 是 | - | 创建人 |
| update_time | DATETIME | - | 是 | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 最后修改时间 |
| last_modifier | VARCHAR | 50 | 否 | NULL | 最后修改人 |
| leader | VARCHAR | 50 | 是 | - | 负责人 |
| phone | VARCHAR | 20 | 否 | NULL | 联系电话 |
| email | VARCHAR | 100 | 否 | NULL | 邮箱 |
| background | TEXT | - | 否 | NULL | 项目背景 |
| goal | TEXT | - | 否 | NULL | 项目目标 |
| scope | TEXT | - | 否 | NULL | 项目范围 |
| start_date | DATE | - | 是 | - | 开始日期 |
| planned_end_date | DATE | - | 是 | - | 预计结束日期 |
| actual_end_date | DATE | - | 否 | NULL | 实际结束日期 |
| total_budget | DECIMAL | 15,2 | 是 | 0.00 | 总预算 |
| used_budget | DECIMAL | 15,2 | 是 | 0.00 | 已使用预算 |
| remaining_budget | DECIMAL | 15,2 | 是 | 0.00 | 剩余预算 |
| remarks | TEXT | - | 否 | NULL | 备注 |
#### 2.2.3 索引设计
- PRIMARY KEY: project_id
- UNIQUE KEY: uk_project_no (project_no)
- INDEX: idx_status (status)
- INDEX: idx_creator (creator)
- INDEX: idx_leader (leader)
- INDEX: idx_create_time (create_time)
- INDEX: idx_update_time (update_time)
#### 2.2.4 外键约束
---
### 2.3 项目成员表 (project_member)
#### 2.3.1 表说明
存储项目成员信息。
#### 2.3.2 表结构
| 字段名 | 数据类型 | 长度 | 是否必填 | 默认值 | 说明 |
|--------|----------|------|----------|--------|------|
| member_id | VARCHAR | 32 | 是 | - | 成员ID,主键 |
| project_id | VARCHAR | 32 | 是 | - | 项目ID,外键 |
| name | VARCHAR | 50 | 是 | - | 姓名 |
| role | VARCHAR | 50 | 是 | - | 角色 |
| department | VARCHAR | 50 | 是 | - | 部门 |
| create_time | DATETIME | - | 是 | CURRENT_TIMESTAMP | 创建时间 |
#### 2.3.3 索引设计
- PRIMARY KEY: member_id
- INDEX: idx_project_id (project_id)
#### 2.3.4 外键约束
- FOREIGN KEY: project_id -> project(project_id) ON DELETE CASCADE
---
### 2.4 项目里程碑表 (project_milestone)
#### 2.4.1 表说明
存储项目里程碑信息。
#### 2.4.2 表结构
| 字段名 | 数据类型 | 长度 | 是否必填 | 默认值 | 说明 |
|--------|----------|------|----------|--------|------|
| milestone_id | VARCHAR | 32 | 是 | - | 里程碑ID,主键 |
| project_id | VARCHAR | 32 | 是 | - | 项目ID,外键 |
| name | VARCHAR | 200 | 是 | - | 名称 |
| planned_date | DATE | - | 是 | - | 计划日期 |
| actual_date | DATE | - | 否 | NULL | 实际日期 |
| status | VARCHAR | 20 | 是 | 'NOT_STARTED' | 状态 |
| create_time | DATETIME | - | 是 | CURRENT_TIMESTAMP | 创建时间 |
| update_time | DATETIME | - | 是 | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
#### 2.4.3 索引设计
- PRIMARY KEY: milestone_id
- INDEX: idx_project_id (project_id)
- INDEX: idx_status (status)
#### 2.4.4 外键约束
- FOREIGN KEY: project_id -> project(project_id) ON DELETE CASCADE
---
### 2.5 项目风险表 (project_risk)
#### 2.5.1 表说明
存储项目风险信息。
#### 2.5.2 表结构
| 字段名 | 数据类型 | 长度 | 是否必填 | 默认值 | 说明 |
|--------|----------|------|----------|--------|------|
| risk_id | VARCHAR | 32 | 是 | - | 风险ID,主键 |
| project_id | VARCHAR | 32 | 是 | - | 项目ID,外键 |
| description | TEXT | - | 是 | - | 描述 |
| level | VARCHAR | 20 | 是 | - | 等级 |
| measure | TEXT | - | 是 | - | 应对措施 |
| create_time | DATETIME | - | 是 | CURRENT_TIMESTAMP | 创建时间 |
#### 2.5.3 索引设计
- PRIMARY KEY: risk_id
- INDEX: idx_project_id (project_id)
- INDEX: idx_level (level)
#### 2.5.4 外键约束
- FOREIGN KEY: project_id -> project(project_id) ON DELETE CASCADE
---
### 2.6 项目历史记录表 (project_history)
#### 2.6.1 表说明
存储项目修改历史记录。
#### 2.6.2 表结构
| 字段名 | 数据类型 | 长度 | 是否必填 | 默认值 | 说明 |
|--------|----------|------|----------|--------|------|
| history_id | VARCHAR | 32 | 是 | - | 历史记录ID,主键 |
| project_id | VARCHAR | 32 | 是 | - | 项目ID,外键 |
| project_no | VARCHAR | 20 | 是 | - | 项目编号 |
| operation_type | VARCHAR | 20 | 是 | - | 操作类型 |
| operator | VARCHAR | 50 | 是 | - | 操作人 |
| operation_time | DATETIME | - | 是 | CURRENT_TIMESTAMP | 操作时间 |
| field_name | VARCHAR | 100 | 是 | - | 字段名 |
| old_value | TEXT | - | 否 | NULL | 修改前值 |
| new_value | TEXT | - | 否 | NULL | 修改后值 |
#### 2.6.3 索引设计
- PRIMARY KEY: history_id
- INDEX: idx_project_id (project_id)
- INDEX: idx_project_no (project_no)
- INDEX: idx_operation_time (operation_time)
- INDEX: idx_operator (operator)
#### 2.6.4 外键约束
- FOREIGN KEY: project_id -> project(project_id) ON DELETE CASCADE
---
### 2.7 操作日志表 (operation_log)
#### 2.7.1 表说明
存储用户操作日志。
#### 2.7.2 表结构
| 字段名 | 数据类型 | 长度 | 是否必填 | 默认值 | 说明 |
|--------|----------|------|----------|--------|------|
| log_id | VARCHAR | 32 | 是 | - | 日志ID,主键 |
| user_id | VARCHAR | 32 | 是 | - | 用户ID,外键 |
| username | VARCHAR | 50 | 是 | - | 用户名 |
| operation | VARCHAR | 100 | 是 | - | 操作内容 |
| ip_address | VARCHAR | 50 | 否 | NULL | IP地址 |
| user_agent | VARCHAR | 500 | 否 | NULL | 用户代理 |
| operation_time | DATETIME | - | 是 | CURRENT_TIMESTAMP | 操作时间 |
#### 2.7.3 索引设计
- PRIMARY KEY: log_id
- INDEX: idx_user_id (user_id)
- INDEX: idx_operation_time (operation_time)
#### 2.7.4 外键约束
- FOREIGN KEY: user_id -> sys_user(user_id) ON DELETE CASCADE
---
## 3. 数据库关系图
### 3.1 ER图描述
```
sys_user (用户表)
|
| 1
|
| N
|
operation_log (操作日志表)
project (项目表)
|
| 1
|
| N
|
+-- project_member (项目成员表)
|
| 1
|
| N
|
+-- project_milestone (项目里程碑表)
|
| 1
|
| N
|
+-- project_risk (项目风险表)
|
| 1
|
| N
|
+-- project_history (项目历史记录表)
```
---
## 4. 数据字典
### 4.1 用户角色枚举值
| 值 | 说明 |
|----|------|
| ADMIN | 管理员 |
| MARKETING | 市场部 |
| OTHER | 其他部门 |
### 4.2 项目状态枚举值
| 值 | 说明 |
|----|------|
| NOT_STARTED | 未开始 |
| IN_PROGRESS | 进行中 |
| COMPLETED | 已完成 |
| PAUSED | 已暂停 |
| CANCELLED | 已取消 |
### 4.3 里程碑状态枚举值
| 值 | 说明 |
|----|------|
| NOT_STARTED | 未开始 |
| IN_PROGRESS | 进行中 |
| COMPLETED | 已完成 |
### 4.4 风险等级枚举值
| 值 | 说明 |
|----|------|
| HIGH | 高 |
| MEDIUM | 中 |
| LOW | 低 |
### 4.5 操作类型枚举值
| 值 | 说明 |
|----|------|
| CREATE | 创建 |
| UPDATE | 更新 |
| DELETE | 删除 |
### 4.6 部门枚举值
| 值 | 说明 |
|----|------|
| MARKETING | 市场部 |
| TECHNOLOGY | 技术部 |
| DESIGN | 设计部 |
| FINANCE | 财务部 |
| HR | 人力资源部 |
---
## 5. 数据库初始化脚本
### 5.1 建表脚本
```sql
-- 创建用户表
CREATE TABLE sys_user (
user_id VARCHAR(32) PRIMARY KEY COMMENT '用户ID',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
password VARCHAR(128) NOT NULL COMMENT '密码',
real_name VARCHAR(50) NOT NULL COMMENT '真实姓名',
department VARCHAR(50) NOT NULL COMMENT '部门',
phone VARCHAR(20) COMMENT '联系电话',
email VARCHAR(100) COMMENT '邮箱',
role VARCHAR(20) NOT NULL COMMENT '角色',
status TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态:1-正常,0-禁用',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
last_login_time DATETIME COMMENT '最后登录时间',
INDEX idx_department (department),
INDEX idx_role (role),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- 创建项目表
CREATE TABLE project (
project_id VARCHAR(32) PRIMARY KEY COMMENT '项目ID',
project_no VARCHAR(20) NOT NULL UNIQUE COMMENT '项目编号',
project_name VARCHAR(200) NOT NULL COMMENT '项目名称',
status VARCHAR(20) NOT NULL DEFAULT 'NOT_STARTED' COMMENT '项目状态',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
creator VARCHAR(50) NOT NULL COMMENT '创建人',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
last_modifier VARCHAR(50) COMMENT '最后修改人',
leader VARCHAR(50) NOT NULL COMMENT '负责人',
phone VARCHAR(20) COMMENT '联系电话',
email VARCHAR(100) COMMENT '邮箱',
background TEXT COMMENT '项目背景',
goal TEXT COMMENT '项目目标',
scope TEXT COMMENT '项目范围',
start_date DATE NOT NULL COMMENT '开始日期',
planned_end_date DATE NOT NULL COMMENT '预计结束日期',
actual_end_date DATE COMMENT '实际结束日期',
total_budget DECIMAL(15,2) NOT NULL DEFAULT 0.00 COMMENT '总预算',
used_budget DECIMAL(15,2) NOT NULL DEFAULT 0.00 COMMENT '已使用预算',
remaining_budget DECIMAL(15,2) NOT NULL DEFAULT 0.00 COMMENT '剩余预算',
remarks TEXT COMMENT '备注',
INDEX idx_status (status),
INDEX idx_creator (creator),
INDEX idx_leader (leader),
INDEX idx_create_time (create_time),
INDEX idx_update_time (update_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目表';
-- 创建项目成员表
CREATE TABLE project_member (
member_id VARCHAR(32) PRIMARY KEY COMMENT '成员ID',
project_id VARCHAR(32) NOT NULL COMMENT '项目ID',
name VARCHAR(50) NOT NULL COMMENT '姓名',
role VARCHAR(50) NOT NULL COMMENT '角色',
department VARCHAR(50) NOT NULL COMMENT '部门',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
FOREIGN KEY (project_id) REFERENCES project(project_id) ON DELETE CASCADE,
INDEX idx_project_id (project_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目成员表';
-- 创建项目里程碑表
CREATE TABLE project_milestone (
milestone_id VARCHAR(32) PRIMARY KEY COMMENT '里程碑ID',
project_id VARCHAR(32) NOT NULL COMMENT '项目ID',
name VARCHAR(200) NOT NULL COMMENT '名称',
planned_date DATE NOT NULL COMMENT '计划日期',
actual_date DATE COMMENT '实际日期',
status VARCHAR(20) NOT NULL DEFAULT 'NOT_STARTED' COMMENT '状态',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (project_id) REFERENCES project(project_id) ON DELETE CASCADE,
INDEX idx_project_id (project_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目里程碑表';
-- 创建项目风险表
CREATE TABLE project_risk (
risk_id VARCHAR(32) PRIMARY KEY COMMENT '风险ID',
project_id VARCHAR(32) NOT NULL COMMENT '项目ID',
description TEXT NOT NULL COMMENT '描述',
level VARCHAR(20) NOT NULL COMMENT '等级',
measure TEXT NOT NULL COMMENT '应对措施',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
FOREIGN KEY (project_id) REFERENCES project(project_id) ON DELETE CASCADE,
INDEX idx_project_id (project_id),
INDEX idx_level (level)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目风险表';
-- 创建项目历史记录表
CREATE TABLE project_history (
history_id VARCHAR(32) PRIMARY KEY COMMENT '历史记录ID',
project_id VARCHAR(32) NOT NULL COMMENT '项目ID',
project_no VARCHAR(20) NOT NULL COMMENT '项目编号',
operation_type VARCHAR(20) NOT NULL COMMENT '操作类型',
operator VARCHAR(50) NOT NULL COMMENT '操作人',
operation_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
field_name VARCHAR(100) NOT NULL COMMENT '字段名',
old_value TEXT COMMENT '修改前值',
new_value TEXT COMMENT '修改后值',
FOREIGN KEY (project_id) REFERENCES project(project_id) ON DELETE CASCADE,
INDEX idx_project_id (project_id),
INDEX idx_project_no (project_no),
INDEX idx_operation_time (operation_time),
INDEX idx_operator (operator)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目历史记录表';
-- 创建操作日志表
CREATE TABLE operation_log (
log_id VARCHAR(32) PRIMARY KEY COMMENT '日志ID',
user_id VARCHAR(32) NOT NULL COMMENT '用户ID',
username VARCHAR(50) NOT NULL COMMENT '用户名',
operation VARCHAR(100) NOT NULL COMMENT '操作内容',
ip_address VARCHAR(50) COMMENT 'IP地址',
user_agent VARCHAR(500) COMMENT '用户代理',
operation_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
FOREIGN KEY (user_id) REFERENCES sys_user(user_id) ON DELETE CASCADE,
INDEX idx_user_id (user_id),
INDEX idx_operation_time (operation_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表';
```
### 5.2 初始化数据脚本
```sql
-- 插入管理员用户
INSERT INTO sys_user (user_id, username, password, real_name, department, role, status)
VALUES ('admin001', 'admin', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EH', '系统管理员', 'ADMIN', 'ADMIN', 1);
-- 插入市场部用户
INSERT INTO sys_user (user_id, username, password, real_name, department, role, status)
VALUES ('marketing001', 'marketing', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EH', '市场部经理', 'MARKETING', 'MARKETING', 1);
-- 插入其他部门用户
INSERT INTO sys_user (user_id, username, password, real_name, department, role, status)
VALUES ('other001', 'other', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EH', '技术部经理', 'TECHNOLOGY', 'OTHER', 1);
```
---
## 6. 数据库性能优化建议
### 6.1 索引优化
- 为常用查询字段创建索引
- 避免在索引列上进行函数操作
- 定期分析和优化索引
### 6.2 查询优化
- 避免使用SELECT *
- 合理使用JOIN
- 使用分页查询减少数据传输量
- 对大表进行分区处理
### 6.3 存储优化
- 定期清理历史数据
- 对大文本字段考虑单独存储
- 使用合适的数据类型减少存储空间
### 6.4 备份策略
- 每日全量备份
- 每小时增量备份
- 定期测试备份恢复
---
## 7. 数据库安全建议
### 7.1 访问控制
- 使用最小权限原则
- 定期修改数据库密码
- 限制数据库访问IP
### 7.2 数据加密
- 敏感字段加密存储
- 使用SSL连接数据库
- 定期更新加密算法
### 7.3 审计日志
- 记录所有数据库操作
- 定期审计日志
- 异常操作及时报警
---
## 8. 附录
### 8.1 变更记录
| 版本 | 日期 | 修改人 | 修改内容 |
|------|------|--------|----------|
| V1.0 | 2026-01-26 | - | 初始版本创建 |