初始提交:全国记者站管理系统

This commit is contained in:
selfrelease
2026-08-01 23:09:49 +08:00
commit 45fbba0308
96 changed files with 21514 additions and 0 deletions
+505
View File
@@ -0,0 +1,505 @@
# 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 |