Files
2026-08-01 23:09:49 +08:00

505 lines
20 KiB
Markdown
Raw Permalink 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.
# 2-task-RSMS-001:全国记者站管理系统开发任务文档
> 文档版本:v1.0
> 状态:待确认
> 编制日期:2026-08-01
> 项目缩写:RSMS
> 适用范围:V0.1 MVP 收尾 + V0.2 阶段
---
## 阶段 0:规范文档(前置,必须先完成)
- [x] TASK-DOC-001:创建 `pmdocs/` 目录结构(changes/、adr/
- **目标**:建立 PM 文档存放规范
- **验收**:目录存在,CHANGELOG.md 已初始化
- **状态**:已完成
- [x] TASK-DOC-002:生成 `pmdocs/0-req-RSMS.md`(需求文档)
- **目标**:固化需求范围、角色定义、状态机、NFR、验收标准
- **映射**REQ-AUTH~REQ-SYS, NFR-*, AC-*
- **验收**:文档已创建,内容覆盖全部 REQ 编号
- **状态**:已完成
- [x] TASK-DOC-003:生成 `pmdocs/1-prd-RSMS.md`(产品需求文档)
- **目标**:固化功能清单、UI/UX 规范、公共组件规划、版本规划
- **映射**PRD-FUNC-001~018SCENE-001~004
- **验收**:文档已创建,公共组件规划表已填充
- **状态**:已完成
- [x] TASK-DOC-004:生成本文档 `pmdocs/2-task-RSMS.md`
- **目标**:任务拆分、编号、依赖、验收标准
- **映射**:所有 REQ、PRD-FUNC
- **验收**:本文档已创建,所有任务有验收标准
- **状态**:已完成
- [x] TASK-DOC-005:创建 `run.md`(运行手册)
- **目标**:固化安装、启动、构建、迁移命令
- **依赖**TASK-DOC-004
- **验收**`run.md` 存在且所有命令可执行
- **状态**:已完成
---
## 阶段 1:前端模块化重构
### 1.1 架构重构
- [x] TASK-FE-001:创建前端目录结构
- **目标**:将单文件 `App.tsx` 拆分为模块化目录
- **依赖**TASK-DOC-005run.md 中的构建命令验证)
- **验收**:目录结构创建完成,import 路径调整后应用能正常启动
- **状态**:已完成
- [x] TASK-FE-002:抽取 Layout 组件
- **目标**`PageLayout``Sidebar``TopBar` 独立
- **验收**`App.tsx` 中 Layout 部分替换为 `<PageLayout>`,功能行为不变
- **状态**:已完成
- [x] TASK-FE-003:抽取 UI 基础组件
- **目标**`StatusBadge``EmptyState``LoadingBar` 独立为文件
- **验收**:各组件独立导出,App.tsx 中的内联版本替换为 import
- **状态**:已完成
- [x] TASK-FE-004:抽取 PageHeading / PanelHeader / MetricCard
- **目标**:复用组件独立文件
- **验收**:复用点替换为 import,Props 接口独立导出
- **状态**:已完成
- [x] TASK-FE-005:抽取数据展示组件
- **目标**`RecordTable`(含 `review` / `compact` 模式)独立
- **验收**:工作记录页、审核中心、档案页均使用同一组件
- **状态**:已完成
- [x] TASK-FE-006:抽取领域组件
- **目标**`CreateRecordModal``RecordDrawer` 独立为 `modals/` 文件
- **验收**:新建和详情交互行为与重构前一致
- **状态**:已完成
- [x] TASK-FE-007:抽取页面组件
- **目标**:每个页面(Dashboard / WorkList / ReviewCenter / People / Stations / Archive / Notices)独立文件
- **验收**`App.tsx` 变为路由级条件渲染,所有页面功能可用
- **状态**:已完成
- [x] TASK-FE-009:创建 Context(角色与 Toast
- **目标**`RoleContext` 管理当前角色,`ToastContext` 管理全局提示
- **验收**:全局 Toast 正常工作,角色切换后所有页面响应正确
- **状态**:已完成
- [x] TASK-FE-010:抽取 FilterBar 组件
- **目标**`FilterBar`(搜索 + 筛选下拉 + 重置)抽象为可复用组合组件
- **验收**:工作记录页和人员管理页使用同一 FilterBar
- **状态**:已完成
- [x] TASK-FE-011:抽取 Pagination 组件
- **目标**:分页组件(当前 MVP 暂不使用,但预留)
- **验收**:组件存在,数据量大时分页可用
- **状态**:已完成
- [x] TASK-FE-012:样式模块化
- **目标**:将 `styles.css` 按组件/页面拆分,引入 CSS 变量文件
- **验收**:构建后样式与重构前一致,无布局错位
- **状态**:已完成
- [x] TASK-FE-013:构建验证
- **目标**`npm run build` 通过,`npm run lint` 无错误
- **依赖**TASK-FE-001 ~ TASK-FE-012 全部完成
- **验收**:构建产物正常,dist/ 输出正确
- **状态**:已完成(2026-08-01
### 1.2 功能增强
- [x] TASK-FE-014:人员管理增删改
- **目标**:总部可新增/编辑/停用人员;分站可编辑本站人员
- **映射**REQ-USER-001, REQ-USER-002
- **依赖**TASK-BE-006
- **验收**
- 总部管理员可新增人员,填写姓名/站点/职务/入站时间后保存成功
- 编辑后数据持久化,再次查询反映最新值
- 停用后该人员不可登录(后端权限拦截)
- **优先级**P0
- **状态**:已完成(2026-08-01
- [x] TASK-FE-015:记者站管理增删改
- **目标**:总部可新增/编辑/停用记者站
- **映射**REQ-ORG-001, REQ-ORG-002
- **依赖**TASK-BE-007
- **验收**
- 总部管理员可新增站点,填写名称/编码/地区/负责人后保存成功
- 站点列表反映最新数据
- **优先级**P1
- **状态**:已完成(2026-08-01
- [x] TASK-FE-016:通知公告发布
- **目标**:总部可发布带附件的通知;用户可查看已读状态
- **映射**REQ-NOTICE-003, REQ-NOTICE-004
- **依赖**TASK-BE-008
- **验收**
- 总部可创建通知,选择接收范围(全部/站点/角色)
- 通知列表显示已读/未读统计
- 重要通知需确认回执
- **优先级**P1
- **状态**:已完成(2026-08-01
- [x] TASK-FE-017:个人中心
- **目标**:用户查看/编辑个人资料、修改密码(模拟)
- **映射**REQ-HOME-004
- **验收**:个人资料页正常展示和编辑
- **优先级**P2
- **状态**:已完成(2026-08-01
---
## 阶段 2:后端扩展
### 2.1 API 扩展
- [x] TASK-BE-001:人员 CRUD API
- **目标**:新增 `GET/POST /api/people``PATCH /api/people/:id``DELETE /api/people/:id`
- **映射**REQ-USER-001~003
- **依赖**TASK-BE-005(数据库迁移)
- **接口契约**
- `GET /api/people?station=&status=` → 按站点和状态筛选
- `POST /api/people` → body: `{ name, station, title, phone, joinedAt }`
- `PATCH /api/people/:id` → body: `{ title?, status?, phone? }`
- **验收**:curl 测试全部接口返回正确状态码和数据
- **状态**:已完成(2026-08-01
- [x] TASK-BE-002:记者站 CRUD API
- **目标**:新增 `GET/POST /api/stations``PATCH /api/stations/:id`
- **映射**REQ-ORG-001, REQ-ORG-002
- **依赖**TASK-BE-005
- **验收**:同上
- **状态**:已完成(2026-08-01
- [x] TASK-BE-003:通知公告 API
- **目标**:新增 `GET/POST /api/notices``PATCH /api/notices/:id``GET /api/notices/:id/receipts`
- **映射**REQ-NOTICE-001~004
- **验收**
- 总部发布通知后,其他角色可见
- 已读回执记录正确
- **状态**:已完成(2026-08-01
- [x] TASK-BE-004:数据统计 API
- **目标**:新增 `GET /api/stats/overview``GET /api/stats/records``GET /api/stats/scores`
- **映射**REQ-STAT-001~003
- **验收**
- 总部返回全国维度统计
- 分站返回本站维度统计
- 记者返回本人维度统计
- **状态**:已完成(2026-08-01
- [x] TASK-BE-005:数据库迁移脚本
- **目标**:将 inline schema 改为独立 migration 文件 + runner
- **依赖**:无
- **验收**
- `npm run db:migrate` 执行成功
- `npm run db:seed` 可重新初始化数据
- `npm run db:reset` 清空后重新迁移
- **优先级**P0
- **状态**:已完成(2026-08-01
### 2.2 数据库迁移
- [x] TASK-BE-006`people` 表迁移
- **文件**`migrations/003_create_people.sql`
- **状态**:已完成(2026-08-01
- [x] TASK-BE-007`stations` 表迁移
- **文件**`migrations/004_create_stations.sql`
- **状态**:已完成(2026-08-01
- [x] TASK-BE-008`notices``notice_receipts` 表迁移
- **文件**`migrations/005_create_notices.sql`
- **状态**:已完成(2026-08-01
- [x] TASK-BE-009`audit_logs` 表索引优化
- **文件**`migrations/006_optimize_indexes.sql`
- **状态**:已完成(2026-08-01
### 2.3 后端测试
- [x] TASK-BE-010API 接口集成测试
- **目标**:使用 Node.js + Jest/Supertest 对核心接口写集成测试
- **覆盖**
- 角色隔离(headquarters / station / reporter 查询结果不同)
- 审核状态流转(draft→station_review→headquarters_review→archived
- 退回重提交
- **验收**:测试全部通过,CI 环境可运行
- **优先级**:P1(不影响 MVP 上线)
- **状态**:已完成(2026-08-01)—— 34 项测试全部通过
---
## 阶段 3:考核规则配置(V0.2)
- [x] TASK-RULE-001:考核规则数据模型
- **目标**:新增 `rules``rule_items``scores`
- **字段**:规则 ID、版本、指标、计分公式、上限/下限、生效时间
- **验收**:规则可 CRUD,变更历史可查
- **状态**:已完成(2026-08-01)—— 迁移 007/008 已执行
- [x] TASK-RULE-002:规则可视化配置界面
- **目标**:总部可在后台配置考核规则
- **验收**:配置发布后,新提交记录使用新规则计分
- **状态**:已完成(2026-08-01)—— RulesPage、CreateRuleModal 已完成
- [x] TASK-RULE-003:规则试算
- **目标**:规则变更前用历史数据试算,输出预估得分变化
- **验收**:试算结果可展示,不影响实际数据
- **状态**:已完成(2026-08-01)—— scores/compute API 已实现试算逻辑
- [x] TASK-RULE-004:后端 rules/scores API
- **目标**rules CRUD、activatescores 查询、计算触发
- **验收**:54 项集成测试全部通过
- **状态**:已完成(2026-08-01
- [x] TASK-RULE-005:前端考核配置页面
- **目标**RulesPage(列表+创建+编辑+激活);ScoresPage(评分结果+明细弹窗)
- **验收**tsc + vite build 通过,V0.2 新增 API 已接入
- **状态**:已完成(2026-08-01
- [x] TASK-RULE-008:集成测试(rules/scores API
- **验收**54 项测试全部通过
- **状态**:已完成(2026-08-01
- [x] TASK-RULE-010:前端构建验证
- **验收**`npm run build` 通过(tsc + vite build
- **状态**:已完成(2026-08-01
- [x] TASK-RULE-011:考核配置前端优化
- **目标**:规则预览 Drawer、指标试算交互、评分排行页面
- **验收**RulesPage 含规则预览 Drawer + 试算评分;LeaderboardPage 完整
- **状态**:已完成(2026-08-01
- [x] TASK-RULE-006:个人中心接入考核数据
- **目标**:当前登录记者/站点查看个人考核得分与排名
- **验收**:个人中心展示考核卡片,接入 stats/scores API
- **状态**:已完成(2026-08-01
- [x] TASK-RULE-007:积分排行榜
- **目标**:全站记者/站点考核得分排名
- **验收**LeaderboardPage 按记者/站点分组排行,切换周期
- **状态**:已完成(2026-08-01
---
## 阶段 4ADR 架构决策
- [x] TASK-ADR-001:生成 ADR-001(技术栈选型)
- **目标**:记录 React+Vite+Express+SQLite 选型理由
- **内容**:备选方案、最终决策、权衡分析
- **状态**:已完成(2026-08-01
- [x] TASK-ADR-002:生成 ADR-002(认证方案)
- **目标**:记录角色模拟方案及升级路径
- **内容**:当前方案(header 传参)、二期目标(JWT+真实认证)
- **风险**:header 可被伪造,仅适合内部演示
- **状态**:已完成(2026-08-01
---
## 阶段 5`run.md` 创建
- [x] TASK-DOC-005:创建 `run.md`
- **目标**:固化所有运行、构建、迁移、测试命令
- **依赖**TASK-BE-005(数据库迁移脚本完成)
- **内容**
- 技术栈清单(Node.js >=18, npm, SQLite
- 安装命令:`npm install`
- 开发命令:`npm run dev`(全栈)、`npm run web`(仅前端)、`npm run server`(仅后端)
- 构建命令:`npm run build`
- Lint`npm run lint`
- 数据库:`npm run db:migrate` / `db:seed` / `db:reset`
- 环境变量:`API_PORT`(默认 8787
- 端口清单:Vite:5173, API:8787
- 常见问题:
- 端口占用处理
- SQLite WAL 文件说明
- 前端热重载说明
- **验收**`run.md` 存在,新人按文档可启动完整项目
- **状态**:已完成(2026-08-01
---
## 任务依赖关系图
```
TASK-DOC-004 ──▶ TASK-DOC-005
TASK-BE-005 ──┬──▶ TASK-FE-001 ──▶ TASK-FE-002 ──▶ TASK-FE-003 ──▶ TASK-FE-004
│ │
│ ▼
│ TASK-FE-005 ──▶ TASK-FE-006 ──▶ TASK-FE-007
│ │
│ ▼
│ TASK-FE-008 ──▶ TASK-FE-009 ──▶ TASK-FE-010
│ │ │
│ ▼ ▼
│ TASK-FE-011 ──▶ TASK-FE-012 ──▶ TASK-FE-013
├──▶ TASK-BE-001 ──▶ TASK-FE-014
├──▶ TASK-BE-002 ──▶ TASK-FE-015
├──▶ TASK-BE-003 ──▶ TASK-FE-016
├──▶ TASK-BE-004
├──▶ TASK-BE-006
├──▶ TASK-BE-007
├──▶ TASK-BE-008
└──▶ TASK-BE-009
TASK-BE-010 ──(并行,不阻塞主要流程)
TASK-ADR-001, TASK-ADR-002 ──(随时可做)
```
---
## 优先级排序(建议执行顺序)
### 第一梯队(P0,必须完成)
1. `TASK-DOC-004` — 确认任务文档(本任务)
2. `TASK-DOC-005` — 创建 `run.md`
3. `TASK-FE-001` — 前端目录结构
4. `TASK-FE-002` — Layout 组件
5. `TASK-FE-005` — RecordTable 抽取
6. `TASK-FE-006` — CreateRecordModal / RecordDrawer 抽取
7. `TASK-FE-007` — 页面组件拆分
8. `TASK-FE-013` — 构建验证
### 第二梯队(P1,MVP 完善)
9. `TASK-FE-014` — 人员管理增删改
10. `TASK-BE-005` — 数据库迁移脚本
11. `TASK-BE-006` — people 表迁移
12. `TASK-BE-001` — 人员 CRUD API
13. `TASK-BE-007` — stations 表迁移
14. `TASK-BE-002` — 记者站 CRUD API
15. `TASK-FE-015` — 记者站管理页面
16. `TASK-BE-008` — notices 表迁移
17. `TASK-BE-003` — 通知公告 API
18. `TASK-FE-016` — 通知发布页面
19. `TASK-BE-009` — 索引优化
### 第三梯队(P1/P2,增强功能)
20. `TASK-BE-004` — 数据统计 API
21. `TASK-FE-010` — FilterBar 抽取
22. `TASK-FE-011` — Pagination 抽取
23. `TASK-FE-017` — 个人中心
24. `TASK-BE-010` — 后端集成测试
25. `TASK-ADR-001` — ADR-001 补录
26. `TASK-ADR-002` — ADR-002 创建
### 第四梯队(V0.2 考核规则)
> 关联变更文档:`pmdocs/changes/2026-08-01-001-V0.2考核规则配置.md`
> 依赖:V0.1 MVP 全部完成(TASK-BE-010 集成测试通过)
**阶段 A:数据模型与迁移**
27. `TASK-RULE-001` — 创建 rules / rule_items 表(migration 007
- 目标:新增 `rules`(考核规则)和 `rule_items`(指标项)两张表
- 需求:CHG-20260801-001 四维度指标数据模型
- 验收标准:migration 可执行,rollback 可逆,字段符合设计文档
- 依赖:TASK-BE-005(迁移框架)
- 阶段:A
28. `TASK-RULE-002` — 创建 scores 表(migration 008
- 目标:新增 `scores`(评分结果)表,关联 rules / work_records
- 需求:CHG-20260801-001 评分结果存储
- 验收标准:migration 可执行,rollback 可逆,索引正确
- 依赖:TASK-RULE-001
- 阶段:A
29. `TASK-RULE-003` — 插入默认考核指标模板(migration 009 / seed
- 目标:seed 默认考核指标模板(6 个指标覆盖数量/质量/时效/合规四维度)
- 需求:CHG-20260801-001 默认指标映射
- 验收标准:seed 数据可查询,`rules` 表有 1 条草稿状态记录
- 依赖:TASK-RULE-001
- 阶段:A
**阶段 B:后端 API**
30. `TASK-RULE-004` — 规则 CRUD API
- 目标:实现 `/api/rules`(列表)、`/api/rules/:id`(详情)、`POST`(创建)、`PATCH`(更新)、`POST /api/rules/:id/activate`(激活)
- 需求:CHG-20260801-001 API 接口规划
- 验收标准:headquarters 角色可操作,激活后旧版本自动归档
- 依赖:TASK-RULE-001
- 阶段:B
31. `TASK-RULE-005` — 评分 API + 自动计算引擎
- 目标:实现 `/api/scores`(列表/详情)、`POST /api/scores/compute`(触发计算)
- 需求:CHG-20260801-001 评分计算流程(指标聚合 → 加权求和 → 结果记录)
- 验收标准:手动触发可对指定记者/站点/周期计算总分及维度分
- 依赖:TASK-RULE-002, TASK-RULE-003
- 阶段:B
**阶段 C:前端**
32. `TASK-RULE-006` — 考核规则管理页面
- 目标:总部角色可查看规则列表、创建规则(含指标项编辑)、激活规则
- 需求:CHG-20260801-001 前端配置界面
- 验收标准:规则列表/编辑器/激活流程完整,加载+空态+错误状态覆盖
- 依赖:TASK-RULE-004
- 阶段:C
33. `TASK-RULE-007` — 评分结果查看页面
- 目标:总部可按记者/站点/周期查看评分结果,含各维度得分明细
- 需求:CHG-20260801-001 评分结果展示
- 验收标准:表格+筛选+分页完整,评分明细可展开
- 依赖:TASK-RULE-005
- 阶段:C
**阶段 D:集成与文档**
34. `TASK-RULE-008` — 考核规则 API 集成测试
- 目标:Jest + Supertest 覆盖 rules/scores 全部 API 端点
- 验收标准:覆盖率 > 90%,角色权限隔离验证
- 依赖:TASK-RULE-004, TASK-RULE-005
- 阶段:D
35. `TASK-RULE-009``run.md` 更新(V0.2 数据库结构 + API)
- 目标:补充 V0.2 新增表结构、API 接口到 `run.md`
- 依赖:TASK-RULE-001, TASK-RULE-002, TASK-RULE-004, TASK-RULE-005
- 阶段:D
36. `TASK-RULE-010` — 前端构建验证
- 目标:`npm run build` 通过,无新增 lint 错误
- 依赖:TASK-RULE-006, TASK-RULE-007
- 阶段:D
---
## 测试策略
| 任务 | 测试类型 | 工具 | 覆盖目标 |
|---|---|---|---|
| TASK-FE-013 | 构建验证 | `npm run build` | 编译通过,类型正确 |
| TASK-FE-001~012 | 回归测试 | 手工 | 重构后所有交互行为不变 |
| TASK-BE-001~004 | 集成测试 | Jest + Supertest | 接口状态码、权限隔离、数据正确性 |
| TASK-BE-005~009 | 数据库测试 | 手工 + SQL | migration 可执行、seed 正确 |
| TASK-RULE-008 | 集成测试 | Jest + Supertest | rules/scores API,覆盖率 > 90% |
| TASK-RULE-010 | 构建验证 | `npm run build` | V0.2 前端编译通过 |
---
## 进度记录
| 日期 | 完成任务 | 备注 |
|---|---|---|
| 2026-08-01 | TASK-DOC-001~003 | 规范文档目录和 CHANGELOG 已创建 |
| 2026-08-01 | TASK-DOC-002 | `pmdocs/0-req-RSMS.md` 已创建 |
| 2026-08-01 | TASK-DOC-003 | `pmdocs/1-prd-RSMS.md` 已创建 |
| 2026-08-01 | TASK-DOC-004 | `pmdocs/2-task-RSMS.md` 已创建 |
| 2026-08-01 | TASK-FE-001~007, TASK-FE-009~012 | 前端模块化重构完成,构建验证通过(2026-08-01 |
| 2026-08-01 | TASK-DOC-005 | `run.md` 已创建 |
| 2026-08-01 | TASK-BE-005~009 | 数据库迁移框架 + 6 个迁移文件 + `db:seed` 命令已验证通过 |
| 2026-08-01 | TASK-BE-001~004 | 人员 CRUD、记者站 CRUD、通知公告、数据统计 API 已完成 |
| 2026-08-01 | TASK-FE-014~017 | 人员管理、记者站管理、通知公告、个人中心页面 API 接入完成 |
| 2026-08-01 | TASK-ADR-001~002 | 技术栈选型 ADR、认证方案 ADR 已补录完成 |
| 2026-08-01 | TASK-BE-010 | 后端集成测试 34 项全部通过(Jest + Supertest,覆盖角色隔离、审核流转、CRUD) |
| 2026-08-01 | TASK-RULE-001~010 | V0.2 考核规则任务文档已细化,关联 CHG-20260801-001 |
| 2026-08-01 | TASK-RULE-001~003, RULE-004~005 | V0.2 考核规则后端 API + 前端页面已完成,集成测试 54 项全部通过,构建验证通过 |
| 2026-08-01 | TASK-RULE-009 | `run.md` 已更新(测试命令、迁移管理、V0.2 表结构与 API 文档) |
| 2026-08-01 | TASK-RULE-006/011 | 个人中心接入考核数据 + 考核配置前端优化(含规则预览 Drawer + 试算评分 + LeaderboardPage |