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

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
+308
View File
@@ -0,0 +1,308 @@
# REQ-RSMS-001:全国记者站管理系统需求与目标
> 文档版本:v1.0
> 状态:待确认
> 编制日期:2026-08-01
> 项目缩写:RSMSReporter Station Management System
## 1. 引言与目标
### 1.1 建设背景
当前记者站管理存在数据分散、统计口径不统一、沟通链路长、档案查询不便、人工考核容易出错及决策数据不足等问题。系统面向全国 37 个记者站,将分散工作整合至统一平台。
### 1.2 建设目标
1. 实现人员、工作、考核、通知和统计的统一管理。
2. 实现日常工作线上填报、分级审核、自动统计和全程留痕。
3. 为每位记者建立长期保存、可追溯的个人电子档案。
4. 统一考核标准和统计口径,提高考核公平性与透明度。
5. 为总部掌握全国运行情况、考核评价和资源配置提供数据支持。
### 1.3 项目缩写与系统代号
- 项目英文缩写:**RSMS**
- 系统代号:**全国记者站管理系统**
- 当前版本:V0.1 MVP(已实现核心流程)
---
## 2. 术语表
| 术语 | 定义 |
|---|---|
| 总部 / 总站 | 全国记者站管理工作的总部管理机构 |
| 记者站 / 分站 / 站点 | 纳入系统管理的 37 个记者站之一 |
| 总部管理员 | 负责规则、权限、复核、统计及全局监管的用户 |
| 分站负责人 | 负责本站人员管理、工作初审及考核汇总的用户 |
| 记者 | 负责工作填报、材料上传和个人信息查询的用户 |
| 工作记录 | 记者提交的一次稿件、作品、培训、临时工作等业务记录 |
| 考核 | 按规则对工作记录进行审核、计分、汇总和评价的过程 |
---
## 3. 角色定义
| 角色 | 代码 | 主要职责 | 默认数据范围 |
|---|---|---|---|
| 总部管理员 | `headquarters` | 组织和制度管理、考核规则配置、总部复核、通知发布、全局统计、权限监管 | 全国全部站点及人员 |
| 分站负责人 | `station` | 站人员维护、填报初审、本站考核汇总、通知落实 | 所属站点及本站人员 |
| 记者 | `reporter` | 工作填报、材料上传、通知查看、成绩和档案查询、个人资料维护 | 本人数据及授权公开信息 |
---
## 4. 功能性需求
### 4.1 身份认证与账号
| 编号 | 优先级 | 需求(EARS 格式) |
|---|---|---|
| REQ-AUTH-001 | P0 | 系统 SHALL 支持通过角色模拟切换用户身份,切换后页面导航、数据访问和操作权限须按角色重新渲染。 |
| REQ-AUTH-002 | P0 | 系统 SHALL 识别用户角色、所属站点、账号状态和数据权限,并通过 HTTP header `x-user-role` 传递至后端。 |
| REQ-AUTH-003 | P0 | 未绑定、停用或离职账号不得访问受保护业务数据(后端数据隔离)。 |
| REQ-AUTH-004 | P1 | 系统 SHOULD 支持一名用户拥有多个角色,并可切换当前工作身份。 |
| REQ-AUTH-005 | P2 | 系统 MAY 支持真实账号绑定、解绑、重置及异常登录处置。 |
### 4.2 组织与站点管理
| 编号 | 优先级 | 需求(EARS 格式) |
|---|---|---|
| REQ-ORG-001 | P0 | 总部管理员 SHALL 能查看全部 37 个记者站的信息,包括名称、编码、行政区域、负责人、联系方式和状态。 |
| REQ-ORG-002 | P1 | 总部管理员 SHALL 能新增、编辑和停用记者站,并保存变更历史。 |
| REQ-ORG-003 | P1 | 系统 SHOULD 展示全国地图及记者站分布。 |
### 4.3 人员管理
| 编号 | 优先级 | 需求(EARS 格式) |
|---|---|---|
| REQ-USER-001 | P0 | 总部管理员 SHALL 能新增、编辑、查询和启停人员信息。 |
| REQ-USER-002 | P0 | 分站负责人 SHALL 仅能管理所属站点的人员信息。 |
| REQ-USER-003 | P0 | 人员信息 SHALL 包含姓名、人员编号、所属站点、职务、入站时间、联系方式、在职状态和账号绑定状态。 |
| REQ-USER-004 | P1 | 系统 SHALL 支持在职、离职、调动等状态,并保留任职及站点变更历史。 |
| REQ-USER-005 | P1 | 系统 SHOULD 支持按姓名、站点、职务、状态等条件组合查询和导出。 |
### 4.4 个人电子档案
| 编号 | 优先级 | 需求(EARS 格式) |
|---|---|---|
| REQ-PROFILE-001 | P0 | 系统 SHALL 为每位记者建立唯一、长期保存的电子档案。 |
| REQ-PROFILE-002 | P0 | 档案 SHALL 聚合基本信息、文字稿件、视频作品、图片作品、培训、获奖和年度考核记录。 |
| REQ-PROFILE-003 | P0 | 复核通过的工作和考核结果 SHALL 自动归档,避免二次录入。 |
| REQ-PROFILE-004 | P1 | 档案记录 SHALL 显示来源、发生时间、审核状态、得分和证明附件。 |
### 4.5 工作填报与材料管理
| 编号 | 优先级 | 需求(EARS 格式) |
|---|---|---|
| REQ-WORK-001 | P0 | 记者 SHALL 能按业务类型新建工作记录,至少支持:文字稿件、视频供稿、图片供稿、重要报道、培训参与、临时工作。 |
| REQ-WORK-002 | P0 | 系统 SHALL 支持草稿保存、编辑、提交、查看详情。 |
| REQ-WORK-003 | P0 | 填报字段 SHALL 包括标题、发生/刊发日期、媒体/平台、工作说明及证明材料。 |
| REQ-WORK-004 | P0 | 系统 SHALL 校验必填项、数据格式、附件类型/大小。 |
| REQ-WORK-005 | P0 | 提交后普通用户不得直接修改;被退回后可依据意见修改并重新提交。 |
| REQ-WORK-006 | P1 | 系统 SHOULD 支持图片、文档等材料上传,证明材料作为审核依据。 |
### 4.6 审核与日常考核
| 编号 | 优先级 | 需求(EARS 格式) |
|---|---|---|
| REQ-ASSESS-001 | P0 | 分站负责人 SHALL 在待办中接收本站待审核记录并完成初审。 |
| REQ-ASSESS-002 | P0 | 初审 SHALL 支持通过、退回,填写审核意见,并按规则完成初评分。 |
| REQ-ASSESS-003 | P0 | 总部管理员 SHALL 对初审通过记录进行复核,支持确认、调整和退回。 |
| REQ-ASSESS-004 | P0 | 审核操作 SHALL 记录处理人、处理时间、意见、处理前后状态和分数变化。 |
| REQ-ASSESS-005 | P0 | 系统 SHALL 按生效考核规则自动计算单项得分。 |
| REQ-ASSESS-006 | P0 | 规则变更不得静默改变已归档结果;重新计算必须经授权并留痕。 |
| REQ-ASSESS-007 | P1 | 系统 SHOULD 提供超时待办提醒和审核时效统计。 |
### 4.7 通知公告
| 编号 | 优先级 | 需求(EARS 格式) |
|---|---|---|
| REQ-NOTICE-001 | P0 | 首页 SHALL 展示最新通知,用户可查看详情及附件。 |
| REQ-NOTICE-002 | P0 | 系统 SHALL 聚合待填报、待审核、被退回及其他待处理事项。 |
| REQ-NOTICE-003 | P1 | 总部管理员 SHOULD 能创建、编辑和发布通知公告。 |
| REQ-NOTICE-004 | P1 | 重要通知 SHOULD 支持已读/未读和确认回执统计。 |
### 4.8 数据统计与报表
| 编号 | 优先级 | 需求(EARS 格式) |
|---|---|---|
| REQ-STAT-001 | P0 | 总部 SHALL 能查看全国、地区、站点、人员、时间和工作类型等维度的统计。 |
| REQ-STAT-002 | P0 | 统计指标 SHALL 至少包括填报数量、审核进度、通过/退回数量、考核得分和人员排名。 |
| REQ-STAT-003 | P0 | 分站负责人 SHALL 仅能查看本站统计,记者仅能查看本人统计。 |
### 4.9 首页与个人中心
| 编号 | 优先级 | 需求(EARS 格式) |
|---|---|---|
| REQ-HOME-001 | P0 | 首页 SHALL 按角色展示常用入口,至少包括通知公告、工作填报、考核成绩、我的档案、待办事项和个人中心。 |
| REQ-HOME-002 | P0 | 首页 SHALL 显示待办数量和最新通知,点击可直达对应列表或详情。 |
### 4.10 系统管理与审计
| 编号 | 优先级 | 需求(EARS 格式) |
|---|---|---|
| REQ-SYS-001 | P0 | 系统 SHALL 记录登录、人员/组织变更、规则发布、审核、导出、删除和权限调整等关键操作。 |
| REQ-SYS-002 | P0 | 审计日志 SHALL 至少包含操作者、时间、来源、对象、动作、结果及必要的变更摘要。 |
---
## 5. 工作记录状态机
```
┌──────────────────────────────────────────────────────────────┐
│ │
▼ │
草稿(draft) ──提交──▶ 待分站审核(station_review) ──初审通过──▶ 待总部复核(hq_review) │
▲ │ │ │
│ │退回 │复核通过 │
│ ▼ ▼ │
│ 已退回(returned) ──重新提交──▶ 待分站审核 已归档(archived)
│ │
└── 修改 ────────────────────────────────────────────────────────┘
```
- 状态:`draft``station_review``headquarters_review``archived`
- 异常:`station_review` / `headquarters_review` 可退回至 `returned`
- `returned` 可修改后重新提交
---
## 6. 非功能性需求
### 6.1 性能
| 编号 | 需求 |
|---|---|
| NFR-PERF-001 | 常规列表、详情和提交操作的服务端 95 分位响应时间不超过 2 秒(文件上传和复杂报表除外)。 |
| NFR-PERF-002 | 月度/年度统计可采用异步计算;用户应能看到计算状态和数据更新时间。 |
### 6.2 安全
| 编号 | 需求 |
|---|---|
| NFR-SEC-001 | 所有受保护接口必须完成身份认证和服务端权限校验。 |
| NFR-SEC-002 | 数据按总部、站点和个人范围隔离,禁止仅依赖前端隐藏实现权限。 |
| NFR-SEC-003 | 传输过程使用 HTTPS(生产环境);密码、令牌及敏感配置不得明文存储。 |
### 6.3 可靠性
| 编号 | 需求 |
|---|---|
| NFR-REL-001 | 提交、审核和计分等关键操作须具备幂等或防重复机制。 |
| NFR-REL-002 | 核心数据应实施定期备份。 |
### 6.4 兼容性
| 编号 | 需求 |
|---|---|
| NFR-COMP-001 | 小程序应兼容项目确定的主流微信版本、iOS 和 Android 系统版本。 |
| NFR-COMP-002 | 后台管理系统应兼容 Chrome、Safari、Firefox 等现代浏览器。 |
---
## 7. 范围边界
### 7.1 首期纳入(MVP
- 账号登录模拟、人员绑定模拟及三级角色权限(前端切换 + 后端数据隔离)。
- 37 个站点和人员基础信息管理。
- 工作分类填报、附件上传(上传框 UI)和记录查询。
- 分站初审、总部复核、退回修改和流程留痕。
- 基础考核规则、自动计分。
- 个人电子档案自动归集与查询。
- 通知公告(只读)、待办事项。
- 后台工作台基础统计和报表导出。
- 系统设置入口(仅 UI)。
### 7.2 首期排除
- 微信小程序端(后台管理系统优先)。
- 真实身份认证(微信/统一身份),当前为角色模拟。
- 考核规则可视化配置(硬编码规则)。
- 历史数据迁移(37 站/486 人仅 mock 数据)。
- 全国地图与管理驾驶舱。
- 个人能力画像、智能分析。
- 与外部采编、人事、短信、电子签章系统集成。
- 申诉与复议流程。
- 自动化测试。
---
## 8. 关键约束与假设
| 编号 | 约束 / 假设 | 决策时点 |
|---|---|---|
| C-001 | 身份认证采用角色模拟(header 传 role),暂不接入微信或统一身份平台。 | 设计前确认 |
| C-002 | 总部复核方式采用分类复核,高价值记录逐条复核,普通记录按比例抽查(初始 20%)。 | 设计前确认 |
| C-003 | 视频采用外部链接方式,不在系统内存储视频文件。 | 立项前确认 |
| C-004 | 文件单文件大小限制为 20 MB。 | 设计前确认 |
| C-005 | 首期仅实现后台管理系统(Web),不实现微信小程序。 | 设计前确认 |
---
## 9. 验收标准
### 9.1 AC-01 记者完成工作填报
- 已绑定且在职的记者可以新建规定类型的工作记录。
- 必填项不符合要求时,系统明确提示且不允许提交。
- 提交成功后状态为"待分站审核",记者不可直接篡改已提交内容。
- 分站负责人待办数量同步增加。
### 9.2 AC-02 分站初审并退回
- 分站负责人只能审核本站记录。
- 退回时必须填写原因,记者能在待办和记录详情中查看。
- 记者修改并重新提交后,历史版本和原审核意见仍可追溯。
### 9.3 AC-03 总部复核并归档
- 分站通过的记录进入总部复核队列。
- 总部确认后,系统按绑定规则版本计算得分。
- 记录进入已归档状态,并自动出现在个人档案及统计中。
- 审核人、时间、意见和分数变化完整记录。
### 9.4 AC-04 数据权限隔离
- 记者无法访问他人的非公开档案和成绩。
- 分站负责人无法访问其他站点的受限数据。
- 总部管理员按授权查看全国数据。
- 通过修改前端参数或直接访问接口不能绕过上述限制。
### 9.5 AC-05 统计可核对
- 总部可按年度、站点、人员和工作类型筛选统计。
- 汇总值可下钻至构成该数值的已授权明细。
### 9.6 AC-06 历史数据可追溯
- 人员调站后,历史记录仍归属于发生时站点,同时个人档案连续保留。
- 规则升级后,既有已归档结果不被自动改写。
- 被授权的管理员可查询关键记录的版本、审核和操作轨迹。
---
## 10. 需求编号索引
| 类别 | 编号前缀 | 范围 |
|---|---|---|
| 身份认证 | REQ-AUTH | REQ-AUTH-001 ~ REQ-AUTH-005 |
| 组织站点 | REQ-ORG | REQ-ORG-001 ~ REQ-ORG-003 |
| 人员管理 | REQ-USER | REQ-USER-001 ~ REQ-USER-005 |
| 电子档案 | REQ-PROFILE | REQ-PROFILE-001 ~ REQ-PROFILE-004 |
| 工作填报 | REQ-WORK | REQ-WORK-001 ~ REQ-WORK-006 |
| 审核考核 | REQ-ASSESS | REQ-ASSESS-001 ~ REQ-ASSESS-007 |
| 通知公告 | REQ-NOTICE | REQ-NOTICE-001 ~ REQ-NOTICE-004 |
| 数据统计 | REQ-STAT | REQ-STAT-001 ~ REQ-STAT-003 |
| 首页个人 | REQ-HOME | REQ-HOME-001 ~ REQ-HOME-002 |
| 系统审计 | REQ-SYS | REQ-SYS-001 ~ REQ-SYS-002 |
| 性能 | NFR-PERF | NFR-PERF-001 ~ NFR-PERF-002 |
| 安全 | NFR-SEC | NFR-SEC-001 ~ NFR-SEC-003 |
| 可靠性 | NFR-REL | NFR-REL-001 ~ NFR-REL-002 |
| 兼容性 | NFR-COMP | NFR-COMP-001 ~ NFR-COMP-002 |
| 验收场景 | AC | AC-01 ~ AC-06 |
| 约束假设 | C | C-001 ~ C-005 |
---
> **待确认事项**:以上约束与假设(章节 8)涉及总体架构和关键业务规则,请在进入详细设计前逐条确认。
+307
View File
@@ -0,0 +1,307 @@
# PRD-RSMS-001:全国记者站管理系统产品需求文档
> 文档版本:v1.0
> 状态:待确认
> 编制日期:2026-08-01
> 项目缩写:RSMS
## 1. 产品概述与定位
全国记者站管理系统(RSMS)是一个面向全国 37 个记者站的管理平台,服务于总部管理员、分站负责人和记者三类角色。系统以工作记录填报和分级审核为业务核心,构建统一的人员、考核、档案和通知管理体系。
### 1.1 产品定位
- **目标**:替代线下/Excel 管理方式,实现业务线上化、考核标准化、数据可追溯。
- **用户**:总部约 5-10 名管理员;37 个分站各 1-2 名负责人;约 500 名记者。
- **核心价值**:减少重复填报、统一审核标准、提升考核透明度、积累可分析数据。
### 1.2 成功指标
| 指标 | 目标值 |
|---|---|
| 工作记录线上填报率 | >= 95% |
| 审核平均处理时长 | <= 24 小时 |
| 考核数据可追溯覆盖率 | 100% |
| 系统可用性 | >= 99.5% |
---
## 2. 用户画像与核心场景
### 场景 1:记者填报工作记录(SCENE-001)
**人物**:林晓,北京记者站记者,2021 年入站。
**痛点**:此前通过微信群或邮件提交,格式不统一,审核进度靠追问,档案整理靠人工。
**解法**:移动/PC 端随时填报,自动进入审核流,实时看到审核状态,归档记录自动进入个人档案。
### 场景 2:分站负责人初审(SCENE-002
**人物**:苏明远,北京记者站负责人。
**痛点**:接收材料格式混乱,退回修改反复沟通,统计靠人工汇总。
**解法**:统一格式接收,核验后一键通过或退回,退回时填写意见,作者修改后自动推送,全站数据自动汇总。
### 场景 3:总部管理员复核与监管(SCENE-003)
**人物**:林致远,总部考核管理员。
**痛点**:37 个站数据分散,统计口径不一致,复核工作量大,考核结果解释成本高。
**解法**:分类复核(高价值逐条 + 普通抽查),自动计分和排名,审核轨迹可查,报表一键导出。
### 场景 4:记者查询个人档案(SCENE-004)
**人物**:林晓,想查看自己本季度的考核得分和全年排名。
**痛点**:历史记录分散在各个群聊和文件中,不知道自己排名。
**解法**:个人档案聚合全部归档记录,支持按类型/时间筛选,显示年度汇总和趋势。
---
## 3. 功能清单与优先级
使用 MoSCoW 标注:`Must` = P0`Should` = P1`Could` = P2。
| 编号 | 功能 | 优先级 | 映射需求 |
|---|---|---|---|
| PRD-FUNC-001 | 三角色模拟登录与权限隔离 | Must | REQ-AUTH-001~003 |
| PRD-FUNC-002 | 工作记录新建(7 种类型) | Must | REQ-WORK-001~005 |
| PRD-FUNC-003 | 工作记录列表(搜索/筛选/分页) | Must | REQ-WORK-002 |
| PRD-FUNC-004 | 分站初审(通过/退回/评分) | Must | REQ-ASSESS-001~002 |
| PRD-FUNC-005 | 总部复核(确认/调整/退回) | Must | REQ-ASSESS-003~005 |
| PRD-FUNC-006 | 审核流程留痕(audit_log | Must | REQ-ASSESS-004 |
| PRD-FUNC-007 | 个人电子档案 | Must | REQ-PROFILE-001~003 |
| PRD-FUNC-008 | 工作台仪表盘(指标卡+趋势图+排名) | Must | REQ-STAT-001~003 |
| PRD-FUNC-009 | 通知公告(只读) | Must | REQ-NOTICE-001~002 |
| PRD-FUNC-010 | 审核中心(待办聚合) | Must | REQ-NOTICE-002 |
| PRD-FUNC-011 | 人员管理(增删改查) | Must | REQ-USER-001~003 |
| PRD-FUNC-012 | 记者站管理(增删改查) | Must | REQ-ORG-001 |
| PRD-FUNC-013 | 通知公告发布(富文本/附件/回执) | Should | REQ-NOTICE-003~004 |
| PRD-FUNC-014 | 考核规则可视化配置 | Should | REQ-ASSESS-006 |
| PRD-FUNC-015 | 数据统计报表(导出) | Should | REQ-STAT-001~003 |
| PRD-FUNC-016 | 申诉与复议 | Could | — |
| PRD-FUNC-017 | 全国地图分布 | Could | REQ-ORG-003 |
| PRD-FUNC-018 | 个人能力画像 | Could | — |
---
## 4. 关键流程
### 4.1 工作记录全生命周期
```
记者新建 → 保存草稿 / 直接提交
↓提交
待分站审核 ← 分站负责人处理
│通过 │退回
↓ ↓
待总部复核 已退回 → 记者修改 → 重新提交
│通过
已归档 → 自动进入个人档案 + 统计汇总
```
### 4.2 数据权限控制流
```
请求进入 → 后端读取 x-user-role header
headquarters: 返回全国全部数据
station: WHERE station = '所属站'
reporter: WHERE reporter = '本人姓名'
```
---
## 5. 角色权限矩阵
| 功能 | 总部管理员 | 分站负责人 | 记者 |
|---|---|---|---|
| 站点管理(查) | 全部 | 本站 | 本站 |
| 站点管理(增删改) | 是 | 否 | 否 |
| 人员管理(查) | 全部 | 本站 | 本人 |
| 人员管理(增删改) | 全部 | 本站 | 否 |
| 工作记录(填报) | 否 | 否(可代填) | 是 |
| 工作记录(查看) | 全部 | 本站 | 本人 |
| 分站初审 | 否 | 是(本站) | 否 |
| 总部复核 | 是 | 否 | 否 |
| 电子档案(查看) | 全部 | 本站 | 本人 |
| 通知公告(发布) | 是 | 否 | 否 |
| 通知公告(查看) | 全部 | 本站 | 本人 |
| 统计报表(全局) | 是 | 否 | 否 |
| 统计报表(本站) | 是 | 是 | 否 |
| 统计成绩(本人) | 是 | 是 | 是 |
| 系统设置 | 是 | 否 | 否 |
---
## 6. UI/UX 设计原则
### 6.1 整体风格
- **配色**:主色 #b42318(红),强调色 #4ba66a(绿/成功),背景 #f5f4f1(米白)
- **字体**Noto Sans SCSongti SC(标题)
- **图标**Lucide Icons
- **布局**:侧边栏固定 238px + 顶部栏 + 内容区
- **交互**Toast 反馈、Drawer 侧滑详情、Modal 弹窗表单
### 6.2 页面导航结构
```
工作台(dashboard
├─ 指标卡(本月记录 / 待处理 / 归档 / 得分)
├─ 趋势图(近6月工作量 AreaChart
├─ 排名(站点/类型)
└─ 待办(待审核 / 被退回 / 截止提醒)
工作记录(work
├─ 搜索 + 状态筛选 + 类型筛选
└─ 记录列表(点击打开详情抽屉)
审核中心(review)[总部/分站]
├─ 审核摘要(待办数 / 已处理 / 平均时长)
└─ 待审列表(通过 / 退回)
人员管理(people)[总部/分站]
└─ 人员列表 + 筛选 + 新增
记者站管理(stations[总部]
└─ 站点卡片网格
电子档案(archive
└─ 个人档案聚合页 + 历史归档列表
通知公告(notices
└─ 公告列表 + 详情侧边
```
### 6.3 统一交互模式
| 场景 | 组件 | 说明 |
|---|---|---|
| 列表加载中 | 顶部进度条动画 | 红色 2px 细条 |
| 列表为空 | EmptyState + 对应图标 | 居中文字提示 |
| 操作失败 | Toast 弹窗 | 2.4s 自动消失 |
| 操作成功 | Toast 弹窗 + 图标 | 绿色勾选图标 |
| 表单校验错误 | 输入框红框 + 错误提示 | 实时校验 |
| 危险操作(删除/退回) | ConfirmDialog 或二次确认 | 明确后果 |
| 分页 | 无(当前为全量加载) | 列表数据量小 |
| 搜索防抖 | 300ms debounce | 工作记录搜索 |
### 6.4 响应式断点
| 断点 | 布局变化 |
|---|---|
| > 1100px | 标准布局(指标4列、站点3列) |
| 761-1100px | 指标2列、站点2列、侧栏不变 |
| <= 760px | 侧栏变为抽屉,汉堡菜单触发,指标2列,站点1列,表单全宽 |
| <= 430px | 指标2列,保持最小可读性 |
---
## 7. 公共组件抽取规划
| 组件 | 类型 | 适用场景 | 输入状态 | 输出事件 | 使用页面 | 优先级 |
|---|---|---|---|---|---|---|
| `StatusBadge` | 基础组件 | 工作记录状态展示 | `status: WorkStatus` | — | 全局 | Must(已存在于代码) |
| `MetricCard` | 基础组件 | 指标数据展示 | `icon / label / value / delta / color` | — | 工作台 | Must(已存在) |
| `PanelHeader` | 组合组件 | 面板标题栏 | `title / subtitle / action / onAction` | `onAction` | 工作台/审核/档案 | Must(已存在) |
| `RecordTable` | 领域组件 | 工作记录列表 | `records / onSelect / compact / review` | `onSelect` | 工作/审核/档案 | Must(已存在) |
| `RecordDrawer` | 领域组件 | 记录详情+审核 | `record / role / onUpdate` | `onUpdate` | 工作/审核 | Must(已存在) |
| `CreateModal` | 领域组件 | 新建工作记录 | `onClose / onSubmit` | `onSubmit` | 工作台/工作记录 | Must(已存在) |
| `FilterBar` | 组合组件 | 列表筛选栏 | `searchPlaceholder / filters / onFilter` | `onFilter / onReset` | 工作记录/人员 | Should |
| `Pagination` | 基础组件 | 列表分页 | `page / pageSize / total` | `onChange` | 列表页面 | Could(当前 MVP 未分页) |
| `NotificationBadge` | 基础组件 | 导航待办角标 | `count` | — | 侧边栏导航 | Must(已存在) |
| `EmptyState` | 基础组件 | 空状态展示 | `icon / text` | — | 列表空时 | Must(已存在) |
| `Toast` | 基础组件 | 操作反馈 | `message`(自动消失) | — | 全局 | Must(已存在) |
| `PageHeading` | 组合组件 | 页面标题区 | `title / description / action / onAction` | `onAction` | 所有内容页 | Should(已存在但未抽取) |
| `RoleSwitcher` | 领域组件 | 角色模拟切换 | `role / onChange` | `onChange` | 顶部栏 | Must(已存在) |
---
## 8. 版本规划
### 8.1 MVP(当前版本 V0.1
已实现(代码层面):
- 角色模拟登录(header 传参)
- 工作记录 CRUD(前端 + 后端 API)
- 分站初审 / 总部复核流程
- 审核留痕(audit_log
- 7 个页面/组件
- SQLite 数据库
- Express API 服务
待补齐(文档层面):
- [ ] `pmdocs/0-req-RSMS.md`(本文档)
- [ ] `pmdocs/1-prd-RSMS.md`(本文档)
- [ ] `pmdocs/2-task-RSMS.md`
- [ ] `run.md`
- [ ] 前端模块化重构
### 8.2 二期
- 通知公告发布(富文本 + 附件 + 回执)
- 人员管理增删改(当前仅展示)
- 记者站管理增删改(当前仅展示)
- 考核规则配置界面
- 数据统计专项页面
- 个人中心功能完善
### 8.3 三期
- 申诉与复议流程
- 全国地图记者站分布
- 个人能力画像
- 外部系统集成
- 自动化测试
---
## 9. 技术架构概览
### 9.1 前端
- **框架**React 18 + TypeScript
- **构建**Vite
- **图表**RechartsAreaChart
- **图标**Lucide React
- **样式**:纯 CSS(含响应式)
- **状态**React useState / useEffect(当前),Redux Toolkit(预留)
- **路由**:条件渲染(当前),React Router(后续)
### 9.2 后端
- **运行时**Node.js
- **框架**Express.js
- **数据库**SQLiteWAL 模式)
- **进程**`node --watch` 开发热重载
### 9.3 API 概览
| 方法 | 路径 | 权限 | 说明 |
|---|---|---|---|
| GET | `/api/health` | 公开 | 健康检查 |
| GET | `/api/records` | 角色隔离 | 查询工作记录 |
| POST | `/api/records` | reporter/station | 新建记录 |
| PATCH | `/api/records/:id/review` | station/hq | 审核操作 |
| GET | `/api/records/:id/audit` | 角色隔离 | 流转记录 |
---
## 10. 风险与依赖
| 风险 | 影响 | 缓解措施 |
|---|---|---|
| SQLite 并发写入冲突 | 高 | WAL 模式已启用;高并发时考虑迁移 PostgreSQL |
| 前端单文件维护性差 | 中 | 二期重构为模块化结构 |
| 无自动化测试 | 中 | 二期引入 Vitest + Playwright |
| 角色模拟安全性不足 | 高 | 二期接入真实认证体系 |
| 考核规则硬编码 | 中 | 二期实现规则可视化配置 |
---
## 11. 关键决策记录索引
| 决策 | ADR 编号 | 状态 |
|---|---|---|
| 前端技术栈(React+Vite | ADR-001 | 已决策 |
| 后端技术栈(Express+SQLite | ADR-001 | 已决策 |
| 认证方案(角色模拟) | ADR-002 | 待确认 |
| 数据库选型(SQLite | ADR-001 | 已决策 |
+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 |
+31
View File
@@ -0,0 +1,31 @@
# Changelog
需求与 PM 文档变更索引。
## 2026-08-01 V0.2 考核规则完成
| 类型 | 编号 | 主题 | 状态 |
|---|---|---|---|
| 变更文档 | `pmdocs/changes/2026-08-01-001-V0.2考核规则配置.md` | V0.2 考核规则配置设计 | ✅ 完成 |
| 迁移 | `007_create_rules.sql` | rules + rule_items 表 | ✅ 完成 |
| 迁移 | `008_create_scores.sql` | scores 表 | ✅ 完成 |
| 迁移 | `009_seed_default_rules.sql` | 默认考核指标模板 | ✅ 完成 |
| 任务 | `TASK-RULE-001~003` | 考核规则数据模型 + 配置界面 + 试算逻辑 | ✅ 完成 |
| 任务 | `TASK-RULE-004` | 后端 rules/scores API14 个端点) | ✅ 完成 |
| 任务 | `TASK-RULE-005` | 前端考核规则管理 + 评分结果页面 | ✅ 完成 |
| 任务 | `TASK-RULE-007` | 积分排行榜(reporter/station 双视图) | ✅ 完成 |
| 任务 | `TASK-RULE-008` | 集成测试 54 项全部通过 | ✅ 完成 |
| 任务 | `TASK-RULE-010` | 前端构建验证(tsc + vite build | ✅ 完成 |
| 任务 | `TASK-RULE-009` | `run.md` 更新(测试/迁移/V0.2 API 文档) | ✅ 完成 |
| 任务 | `TASK-RULE-006` | 个人中心接入考核数据(考核卡片 + 排名信息) | ✅ 完成 |
| 任务 | `TASK-RULE-011` | 考核配置前端优化(规则预览 Drawer + 试算评分) | ✅ 完成 |
## 2026-08-01 V0.1 MVP 完成
| 类型 | 编号 | 主题 | 状态 |
|---|---|---|---|
| 任务 | `TASK-BE-010` | 后端 API 集成测试(34 项全部通过) | ✅ 完成 |
| 任务 | `TASK-BE-001~004` | 后端 API(人员 CRUD、记者站 CRUD、通知公告、数据统计) | ✅ 完成 |
| 任务 | `TASK-FE-014~017` | 前端页面(人员管理、记者站管理、通知公告、个人中心) | ✅ 完成 |
| 任务 | `TASK-ADR-001~002` | 架构决策记录(技术栈选型、认证方案) | ✅ 完成 |
| 任务 | `TASK-DOC-005` | `run.md` 运行手册 | ✅ 完成 |
@@ -0,0 +1,61 @@
# ADR-RSMS-001:技术栈选型
> ADR 编号:ADR-001
> 状态:已决策(代码已先行,补录)
> 日期:2026-07-31
> 项目:RSMS
## 背景
项目启动时需要确定前端框架、后端框架和数据库选型。项目为内部管理后台,初期规模可控,但需考虑 37 个站点、约 500 名记者的数据增长。
## 选项
### 前端
| 选项 | 优点 | 缺点 |
|---|---|---|
| A. React + Vite + TypeScript | 生态成熟、类型安全、Vite 热重载快、团队熟悉度高 | 学习曲线存在(对新手) |
| B. Vue + Vite + TypeScript | 上手快、单文件组件直观 | 团队 React 经验更丰富 |
| C. 原生 HTML + JS | 无依赖 | 不可维护 |
### 后端
| 选项 | 优点 | 缺点 |
|---|---|---|
| A. Express.js + Node.js | 轻量、路由灵活、JSON 原生、团队熟悉 | 需自行处理结构化代码 |
| B. Spring Boot (Java) | 生态完善、企业级 | 需要 JDK 环境、启动慢 |
| C. Django (Python) | 快速开发、内置 ORM | GIL 限制并发、对团队熟悉度低 |
### 数据库
| 选项 | 优点 | 缺点 |
|---|---|---|
| A. SQLite(WAL 模式) | 零配置、文件级、无服务进程、适合本地开发 | 并发写入受限(当前规模可接受) |
| B. PostgreSQL | 关系型权威、功能强大、并发好 | 需要安装运行、增加运维成本 |
| C. JSON 文件 | 零配置 | 无查询能力、无法处理关联 |
## 决策
- **前端**React + Vite + TypeScript(选项 A
- **后端**Express.js + Node.js(选项 A
- **数据库**SQLiteWAL 模式)(选项 A
## 理由
1. **React + Vite**:团队已有 React 经验;Vite 提供极快的热重载体验;TypeScript 提供编译期类型检查,减少运行时错误;Recharts 作为数据可视化方案与 React 生态无缝集成。
2. **Express.js**:轻量、路由直观;JSON 作为 API 响应格式零序列化成本;`node --watch` 支持开发热重载;无额外配置。
3. **SQLite**:零运维成本,文件即数据库;WAL 模式支持读写并发(读不阻塞写);数据文件可随 Git 管理(需注意 .gitignore);当前规模(37 站 x 500 人)完全在 SQLite 处理能力内。
## 升级路径
| 组件 | 升级触发条件 | 目标方案 |
|---|---|---|
| 数据库 | 并发写入成为瓶颈(预估 > 100 并发写入/秒) | 迁移至 PostgreSQL |
| 后端 | 业务逻辑复杂度增加 | 考虑 NestJS 或 DDD 架构重构 |
| 前端 | 页面数量 > 30 或团队 > 5 人 | 引入 React Router、状态管理(Redux Toolkit |
## 风险
- SQLite 在极高并发写入场景下可能成为瓶颈(当前评估:低风险)
- 前后端均使用 JS/TS,技术栈统一,全栈可复用类型定义(未来引入 tRPC 可进一步增强类型安全)
+56
View File
@@ -0,0 +1,56 @@
# ADR-RSMS-002:认证方案
> ADR 编号:ADR-002
> 状态:已决策(角色模拟)
> 日期:2026-08-01
> 项目:RSMS
## 背景
系统需要识别用户身份并实施数据权限隔离。在 MVP 阶段无需接入真实身份认证体系,但需设计一个可升级的认证架构。
## 选项
| 选项 | 描述 | 适用阶段 |
|---|---|---|
| A. 角色模拟(header 传参) | 前端切换角色,HTTP header `x-user-role` 传递值,后端按值查询数据 | MVP / 演示 |
| B. Session + Cookie | 后端维护 session,基于用户名密码登录 | 首版上线 |
| C. JWT Token | 无状态令牌,携带用户 ID 和角色,可扩展 | 生产环境 |
| D. 微信 OAuth2 | 微信账号登录,与人员档案绑定 | 移动端小程序 |
## 决策
**MVP(当前)**:选项 A — 角色模拟(header 传参)
**二期目标**:选项 C — JWT Token + 真实登录
**三期目标**:选项 D — 微信 OAuth2(若实现小程序端)
## 选项 A 的实施
```
前端 role-switcher<select>
x-user-role: headquarters | station | reporter
后端中间件读取 header → 注入 req.user 对象
数据访问层按 req.user.role + req.user.station + req.user.name 过滤
```
- **优点**:零门槛,无需注册账号;方便演示和开发测试
- **缺点**:安全性极低,header 可被任意伪造;仅适合内部演示环境
## 升级至 JWT 的迁移路径
1. 新增 `/api/auth/login` 接口,接收用户名密码,返回 JWT
2. 新增 JWT 中间件,验证令牌并注入 `req.user`
3. 保留 header `x-user-role` 作为兼容层(降级方案)
4. 前端将 token 存储于 `localStorage``httpOnly` Cookie
5. 移除前端 role-switcher,替换为登录页
## 风险
- **选项 A 当前风险**:任何人可以通过修改 header 访问任意角色数据
- **缓解**:当前环境为本地开发/内网,不暴露于公网;上线前必须完成 JWT 改造
- **硬编码人员**`server/index.js` 中的 `identities` 对象需改为从数据库读取真实用户表
@@ -0,0 +1,111 @@
// 考核规则数据模型设计
// 基于当前已有表结构(work_records, audit_logs, people, stations)和业务逻辑推导
## 一、设计背景
V0.1 工作记录审核流程中,每条记录由分站初审(station_review)、总部终审(headquarters_review)后归档(archived),分数由审核人手动给定。
V0.2 需要将分数评定从"手动输入"改为"规则驱动":总部配置考核规则(指标项、权重、上限下限),系统根据规则自动计算得分。
## 二、核心实体
### 2.1 考核规则(rules
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INTEGER PK | 自增 ID |
| code | TEXT UNIQUE | 规则编码,如 `RULE_2026_01` |
| name | TEXT NOT NULL | 规则名称,如"2026年第三季度考核规则" |
| description | TEXT | 规则说明 |
| period_type | TEXT NOT NULL | 考核周期类型:`monthly` / `quarterly` / `annual` |
| period_start | TEXT | 规则生效开始日期(YYYY-MM-DD |
| period_end | TEXT | 规则生效结束日期(YYYY-MM-DD |
| status | TEXT NOT NULL | 规则状态:`draft` / `active` / `archived` |
| created_by | TEXT | 创建人姓名 |
| created_at | TEXT | 创建时间 |
| updated_at | TEXT | 更新时间 |
### 2.2 考核指标项(rule_items
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INTEGER PK | 自增 ID |
| rule_id | INTEGER FK | 所属规则 ID |
| category | TEXT NOT NULL | 指标类别:`quality`(质量)/ `quantity`(数量)/ `efficiency`(时效)/ `compliance`(合规) |
| name | TEXT NOT NULL | 指标名称,如"原创报道数量" |
| metric_key | TEXT NOT NULL | 指标计算字段(映射到 work_records 的字段或聚合方式) |
| weight | REAL NOT NULL | 权重(0~1,所有 rule_item 权重之和应为 1 |
| min_score | REAL DEFAULT 0 | 最低分 |
| max_score | REAL DEFAULT 100 | 最高分 |
| formula_type | TEXT NOT NULL | 计算方式:`count`(计数)/ `rate`(比率)/ `avg_score`(均分)/ `custom`(自定义公式) |
| formula_params | TEXT | JSON,公式参数,如 `{"threshold": 10, "above_bonus": 5}` |
| display_order | INTEGER DEFAULT 0 | 显示顺序 |
| created_at | TEXT | 创建时间 |
### 2.3 评分结果(scores
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INTEGER PK | 自增 ID |
| code | TEXT UNIQUE | 评分编码,如 `SCORE_2026Q1_BJ_001` |
| rule_id | INTEGER FK | 使用的规则 ID |
| record_id | TEXT FK | 工作记录 ID |
| reporter | TEXT NOT NULL | 记者姓名 |
| station | TEXT NOT NULL | 站点名称 |
| period | TEXT NOT NULL | 考核周期标识,如 `2026-Q1` |
| total_score | REAL | 总分 |
| quality_score | REAL | 质量维度得分 |
| quantity_score | REAL | 数量维度得分 |
| efficiency_score | REAL | 时效维度得分 |
| compliance_score | REAL | 合规维度得分 |
| item_details | TEXT | JSON,每项指标的详细得分 |
| computed_at | TEXT | 计算时间 |
| created_at | TEXT | 创建时间 |
## 三、评分计算流程
1. **规则激活**:总部在后台发布规则,`rules.status = 'active'`,设置 `period_start` / `period_end`
2. **触发评分**:工作记录从 `returned` 重新提交后,或在考核周期结束时批量计算。
3. **指标聚合**:对指定记者、站点、周期内的所有 `archived` 状态记录,按 `rule_items.metric_key` 聚合。
4. **加权求和**\(\text{total} = \sum_i \text{weight}_i \times \text{score}_i\)
5. **结果记录**:写入 `scores` 表,同时更新 `work_records.score` 字段。
## 四、API 接口规划
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/rules | 查询规则列表 |
| GET | /api/rules/:id | 查询规则详情(含指标项) |
| POST | /api/rules | 创建规则(含指标项) |
| PATCH | /api/rules/:id | 更新规则 |
| POST | /api/rules/:id/activate | 激活规则 |
| GET | /api/scores | 查询评分结果(按记者/站点/周期筛选) |
| GET | /api/scores/:id | 评分详情 |
| POST | /api/scores/compute | 触发评分计算 |
## 五、Migration 规划
- `migrations/007_create_rules.sql``rules``rule_items`
- `migrations/008_create_scores.sql``scores`
- `migrations/009_seed_default_rules.sql` — 插入默认考核指标模板
## 六、前端配置界面
总部角色可访问"考核规则管理"页面:
- 规则列表:显示规则名称、周期类型、状态、发布时间
- 规则编辑器:拖拽排序指标项,设置权重滑块,预览计算结果
- 规则试算:用历史数据模拟评分,预估变化幅度
## 七、待确认事项
- [x] 考核周期如何定义:按日历季度,还是自定义起止日期?
**日历季度 + 自定义起止日期两种都支持**`period_type` 字段:`monthly` / `quarterly` / `annual` / `custom`
- [x] 指标计算字段(`metric_key`)具体映射到哪些 `work_records` 字段?
→ 见下表:
- 数量:`COUNT(*)` 按 reporter+station+period 聚合
- 质量:`AVG(score)``work_records``audit_logs` 聚合
- 时效:`occurred_date``created_at` 差值判断
- 合规:`status = 'archived'` 占比
- [x] 规则激活后,历史已评分记录是否重新计算?
**不自动重算**。已归档记录保留原分;新增记录使用激活规则;提供手动重算入口
- [x] 是否支持规则版本管理(每次修改生成新版本)?
**编辑生成新版本**。旧版本状态变为 `archived`,新版本为 `draft`;已有 `scores` 记录绑定旧规则版本,不受影响