# Sprint 13 实施计划

**Sprint 周期**: 2026-04-09 至 2026-04-15  
**Sprint 目标**: 集中处理 P2 设计断链问题和功能完善  
**状态**: 📋 规划中

---

## 一、Sprint 目标

基于 Sprint 12 完成的基础建设，Sprint 13 将集中处理 P2 设计断链问题和功能完善，包括：

1. **系统设置页开发**（前后端）
2. **管理员管理页开发**（前端）
3. **全局设备管理页完善**（前端）
4. **设备信任功能完善**（前后端）
5. **前端 Vitest 3 个失败点修复**
6. **批量操作功能开发**（前端）

---

## 二、任务分解

### 2.1 P0 严重断链问题（优先级最高）

#### TASK-1: 系统设置 API 开发
**优先级**: P0 🔴  
**问题编号**: GAP-BE-001  
**工作量**: M（4天）  
**负责人**: 后端开发

**现状**:
- ❌ 系统设置 API 完全缺失

**需求**（基于 PRD 和专家评审）:
- 系统配置项：系统名称、Logo、Favicon、联系方式、版权信息
- 安全配置：密码策略（最小长度、复杂度）、会话超时时间、登录失败限制
- 通知配置：邮件服务器配置、短信服务配置
- 功能开关：注册开关、2FA 强制开关、设备信任开关

**实现步骤**:
1. **Day 1-2: 数据模型和 Repository**
   - 创建 `SystemSetting` domain 模型
   - 创建 `SystemSettingRepository`
   - 数据库迁移脚本

2. **Day 3-4: Service 和 Handler**
   - 创建 `SystemSettingService`
   - 创建 `SystemSettingHandler`
   - API 路由注册

**验收标准**:
- [ ] 所有配置项可 CRUD
- [ ] 配置变更立即生效（或需要重启）
- [ ] 敏感配置（邮件密码等）加密存储
- [ ] `go test ./...` 通过
- [ ] API 文档完整

**API 设计**:
```go
// 系统设置
GET    /api/v1/system/settings          // 获取所有设置
GET    /api/v1/system/settings/:key      // 获取单个设置
PUT    /api/v1/system/settings/:key      // 更新单个设置
POST   /api/v1/system/settings/batch     // 批量更新设置
GET    /api/v1/system/settings/categories // 按分类获取
```

---

#### TASK-2: 系统设置页开发
**优先级**: P0 🔴  
**问题编号**: GAP-FE-002  
**工作量**: M（3天）  
**负责人**: 前端开发

**现状**:
- ❌ 系统设置页完全缺失

**需求**:
- 分组显示：基本设置、安全设置、通知配置、功能开关
- 表单验证：必填项、格式验证
- 实时预览：系统名称、Logo 更改后立即预览
- 安全提示：修改敏感配置需要二次确认

**实现步骤**:
1. **Day 1: 页面结构**
   - 创建 `SystemSettingsPage.tsx`
   - 使用 `PageLayout` 组件
   - 创建表单布局

2. **Day 2: 表单逻辑**
   - 表单状态管理
   - 表单验证
   - API 调用

3. **Day 3: 功能完善**
   - 实时预览
   - 二次确认
   - 错误处理

**验收标准**:
- [ ] 所有设置项可编辑
- [ ] 表单验证正确
- [ ] 实时预览工作
- [ ] `npm run lint` 通过
- [ ] `npm test` 通过

**UI 参考**:
```
┌─────────────────────────────────────────┐
│ 系统设置                                │
├─────────────────────────────────────────┤
│ [基本设置] [安全设置] [通知配置] [开关]  │
├─────────────────────────────────────────┤
│ 基本设置                                │
│ ┌─────────────────────────────────┐   │
│ │ 系统名称: [_______________]     │   │
│ │ Logo:     [选择文件]            │   │
│ │ 联系方式: [_______________]     │   │
│ │ 版权信息: [_______________]     │   │
│ │          [保存] [重置]          │   │
│ └─────────────────────────────────┘   │
└─────────────────────────────────────────┘
```

---

### 2.2 P0 严重断链问题（优先级高）

#### TASK-3: 管理员管理页开发
**优先级**: P0 🔴  
**问题编号**: GAP-FE-001  
**工作量**: M（3天）  
**负责人**: 前端开发

**现状**:
- ❌ 管理员管理页完全缺失
- ✅ 后端 API 已存在

**需求**:
- 管理员列表（分页、筛选）
- 创建管理员
- 编辑管理员
- 删除管理员
- 权限分配

**实现步骤**:
1. **Day 1: 页面结构**
   - 创建 `AdminsPage.tsx`
   - 使用 `PageLayout` + `TableCard` + `FilterCard`
   - 表格列设计

2. **Day 2: CRUD 操作**
   - 创建 `CreateAdminModal.tsx`
   - 创建 `EditAdminModal.tsx`
   - 删除确认

3. **Day 3: 权限分配**
   - 创建 `PermissionTreeSelector` 组件
   - 权限树显示和选择

**验收标准**:
- [ ] 所有 CRUD 操作正常
- [ ] 权限分配正确
- [ ] 防止删除自己和最后一个管理员
- [ ] `npm run lint` 通过

**API 对接**:
```typescript
// 后端 API 已存在
GET    /api/v1/admin/admins
POST   /api/v1/admin/admins
PUT    /api/v1/admin/admins/:id
DELETE /api/v1/admin/admins/:id
```

---

#### TASK-4: 全局设备管理页开发
**优先级**: P0 🔴  
**问题编号**: GAP-FE-003  
**工作量**: M（3天）  
**负责人**: 前端开发

**现状**:
- ⚠️ 个人设备管理已实现（`ProfileSecurityPage`）
- ❌ 全局设备管理页缺失

**需求**:
- 所有用户设备列表（分页、筛选）
- 设备详情
- 删除设备
- 取消信任设备
- 设备统计（总设备数、受信任设备数、活跃设备数）

**实现步骤**:
1. **Day 1: 页面结构**
   - 创建 `DevicesPage.tsx`
   - 使用 `PageLayout` + `TableCard` + `StatsCard`
   - 表格列设计

2. **Day 2: 设备操作**
   - 设备详情查看
   - 删除设备
   - 取消信任

3. **Day 3: 统计和筛选**
   - 设备统计卡片
   - 高级筛选（用户、设备类型、信任状态）

**验收标准**:
- [ ] 所有操作正常
- [ ] 统计数据准确
- [ ] `npm run lint` 通过

**API 设计**（需后端补充）:
```go
// 需要后端新增
GET    /api/v1/admin/devices               // 获取所有设备（管理员）
GET    /api/v1/admin/devices/:id           // 获取设备详情
DELETE /api/v1/admin/devices/:id           // 删除设备
PUT    /api/v1/admin/devices/:id/trust     // 信任/取消信任
GET    /api/v1/admin/devices/stats         // 设备统计
```

---

#### TASK-5: 登录日志导出功能
**优先级**: P0 🔴  
**问题编号**: GAP-FE-004  
**工作量**: S（1天）  
**负责人**: 前端开发

**现状**:
- ✅ 登录日志页已实现（`LoginLogsPage`）
- ❌ 导出功能缺失

**需求**:
- 导出 CSV
- 导出 Excel
- 支持筛选结果导出

**实现步骤**:
1. 使用 `xlsx` 库（前端已有）
2. 实现 Excel 导出函数
3. 添加导出按钮到 `LoginLogsPage`

**验收标准**:
- [ ] Excel 导出成功
- [ ] CSV 导出成功
- [ ] 导出内容正确

---

### 2.3 P1 中等断链问题

#### TASK-6: 设备信任功能完善
**优先级**: P1 🟡  
**问题编号**: GAP-INT-001  
**工作量**: M（4天）  
**负责人**: 后端 + 前端

**现状**:
- ✅ 设备 CRUD API 已实现
- ✅ 设备信任 API 已实现
- ❌ 登录流程未检查设备信任
- ❌ 前端未采集设备指纹

**后端实现**（2天）:
1. **Day 1: 登录接收设备标识**
   - 修改 `LoginRequest` 添加设备字段
   - 登录时自动记录设备

2. **Day 2: 2FA 检查设备信任**
   - TOTP 验证时检查设备是否已信任
   - 信任设备免 2FA

**前端实现**（2天）:
1. **Day 1: 登录时采集设备指纹**
   - 生成设备指纹（User-Agent + Screen + Timezone）
   - 登录请求携带设备信息

2. **Day 2: "记住此设备"功能**
   - 2FA 验证页面添加"记住此设备"复选框
   - 调用信任设备 API

**验收标准**:
- [ ] 登录时设备自动记录
- [ ] 信任设备免 2FA
- [ ] 信任过期后重新要求 2FA

---

#### TASK-7: 批量操作功能
**优先级**: P1 🟡  
**问题编号**: GAP-FE-005  
**工作量**: M（3天）  
**负责人**: 前端 + 后端

**现状**:
- ❌ 批量操作完全缺失

**需求**:
- 用户批量删除
- 角色批量删除
- 批量分配角色

**后端实现**（1天）:
- 批量删除 API
- 批量更新 API

**前端实现**（2天）:
1. **Day 1: 批量选择 UI**
   - 表格行选择
   - 全选/取消全选
   - 批量操作按钮

2. **Day 2: 批量操作逻辑**
   - 批量删除
   - 批量分配角色

**验收标准**:
- [ ] 批量选择正常
- [ ] 批量删除成功
- [ ] 批量分配角色成功

---

### 2.4 测试修复

#### TASK-8: 前端 Vitest 3 个失败点修复
**优先级**: P1 🟡  
**工作量**: S（2天）  
**负责人**: 前端开发

**现状**:
- ⚠️ Vitest 有 3 个失败点

**行动**:
1. 运行 `npm test` 查看失败详情
2. 逐个修复失败用例
3. 确保所有测试通过

**验收标准**:
- [ ] 所有 Vitest 测试通过
- [ ] 测试覆盖率 ≥ 70%

---

## 三、依赖关系

```
TASK-1 (系统设置 API) ────── TASK-2 (系统设置页)
     │
TASK-3 (管理员管理页) ────── 独立
     │
TASK-4 (设备管理页) ──────── TASK-6 (设备信任)
     │                           │
TASK-5 (登录日志导出) ──────────┘
     │
TASK-7 (批量操作) ─────────── 独立
     │
TASK-8 (Vitest 修复) ──────── 独立
```

**关键路径**:
1. TASK-1 必须先于 TASK-2
2. TASK-6 依赖 TASK-4 的设备管理 API

---

## 四、风险管理

### 4.1 技术风险

| 风险 | 影响 | 概率 | 缓解措施 |
|------|------|------|---------|
| 系统设置 API 设计复杂 | 高 | 中 | 参考 Spring Boot Configuration 做法 |
| 设备指纹算法不稳定 | 高 | 中 | 使用成熟的指纹库（如 FingerprintJS） |
| 批量操作性能问题 | 中 | 中 | 使用异步处理和进度反馈 |

### 4.2 进度风险

| 风险 | 影响 | 概率 | 缓解措施 |
|------|------|------|---------|
| 后端 API 开发延期 | 高 | 中 | 优先完成核心 API，细节后续迭代 |
| 前端 UI 开发延期 | 中 | 低 | 使用 Ant Design 组件加速 |

---

## 五、资源分配

### 5.1 人员分配

| 任务 | 后端 | 前端 | 测试 |
|------|------|------|------|
| TASK-1: 系统设置 API | 1人 | - | - |
| TASK-2: 系统设置页 | - | 1人 | - |
| TASK-3: 管理员管理页 | - | 1人 | - |
| TASK-4: 设备管理页 | 0.5人 | 1人 | - |
| TASK-5: 登录日志导出 | - | 0.5人 | - |
| TASK-6: 设备信任完善 | 1人 | 1人 | - |
| TASK-7: 批量操作 | 0.5人 | 1人 | - |
| TASK-8: Vitest 修复 | - | 0.5人 | - |

### 5.2 工作量汇总

- **后端**: 4 人天
- **前端**: 7 人天
- **总计**: 11 人天

---

## 六、验收标准

### 6.1 功能验收

**系统设置**:
- [ ] 所有配置项可 CRUD
- [ ] 配置变更生效
- [ ] 敏感配置加密

**管理员管理**:
- [ ] CRUD 操作正常
- [ ] 权限分配正确
- [ ] 防止删除自己

**设备管理**:
- [ ] 设备列表正常
- [ ] 设备操作正常
- [ ] 统计数据准确

**设备信任**:
- [ ] 设备自动记录
- [ ] 信任设备免 2FA

**批量操作**:
- [ ] 批量选择正常
- [ ] 批量操作成功

### 6.2 质量验收

- [ ] `go test ./...` 通过
- [ ] `go vet ./...` 通过
- [ ] `go build ./cmd/server` 成功
- [ ] `npm run lint` 通过
- [ ] `npm test` 全部通过
- [ ] `npm run build` 成功
- [ ] `npm run e2e:full:win` 通过

### 6.3 文档验收

- [ ] API 文档更新
- [ ] README 更新
- [ ] 部署文档更新

---

## 七、Sprint 检查点

### Sprint 开启（Day 1）
- [ ] Sprint 计划评审
- [ ] 任务分配
- [ ] 开发环境准备

### Sprint 中期（Day 5）
- [ ] 进度检查
- [ ] 问题识别
- [ ] 风险评估

### Sprint 结束（Day 7）
- [ ] 功能验收
- [ ] 质量验收
- [ ] Sprint 回顾
- [ ] 下一 Sprint 准备

---

## 八、Sprint 13 交付物

1. **系统设置功能**
   - 后端 API
   - 前端页面
   - API 文档

2. **管理员管理页**
   - 前端页面
   - 功能文档

3. **设备管理页**
   - 后端 API
   - 前端页面
   - API 文档

4. **设备信任完善**
   - 后端实现
   - 前端实现
   - 测试用例

5. **批量操作功能**
   - 后端 API
   - 前端功能

6. **测试修复**
   - Vitest 全部通过
   - 测试报告

---

**计划制定时间**: 2026-04-02  
**计划制定人**: 高级项目经理  
**审核状态**: 待审核
