170 lines
14 KiB
Markdown
170 lines
14 KiB
Markdown
# PRD 按钮级实现证据矩阵
|
||
|
||
> 本文档对照管理后台 PRD v1.0 的按钮级权限要求,逐项验证代码实现与测试证据。
|
||
> 基线:94个 Canonical 权限码(V85/V86新增4个细粒度权限,参见 `权限码映射表.md`)
|
||
|
||
## 修订历史
|
||
|
||
| 版本 | 日期 | 修订人 | 变更内容 |
|
||
|------|------|--------|----------|
|
||
| 1.3 | 2026-03-23 | Claude | 新增细粒度权限点(V85/V86迁移):`activity.participant.view.ALL`、`risk.detail.view.ALL`、`risk.alert.handle.ALL`、`approval.comment.add.ALL`;更新系统配置路由权限(`system.index.view.ALL`) |
|
||
| 1.2 | 2026-03-22 | Claude | 新增审批批量接口(`/approval/batch`、`/approval/batch-transfer`、`/approval/delegate`);新增奖励拒绝接口(`/rewards/admin/{id}/reject`);更新证据行号 |
|
||
| 1.1 | 2026-03-22 | Claude | 修复审批中心按钮权限码对齐(`approval.index.handle.ALL` -> `approval.execute.*.ALL`);更新风控模块路径为 `/risks/*`;更新API Key管理路径为 `/keys/*` |
|
||
| 1.0 | 2026-03-21 | Claude | 初始版本,对照 PRD 9.2~9.8 章节 |
|
||
|
||
---
|
||
|
||
## 9.2 活动管理 - 按钮级权限
|
||
|
||
| PRD按钮描述 | 前端页面 | 后端接口 | 权限码 | 测试用例ID | 当前状态 | 证据文件 |
|
||
|-------------|----------|----------|--------|------------|----------|----------|
|
||
| 创建活动 | ActivityCreateView.vue | POST /api/v1/activities | activity.index.create.ALL | ActivityControllerContractTest | ✅ 已实现 | ActivityController.java:88 |
|
||
| 查看活动列表 | ActivityListView.vue | GET /api/v1/activities | activity.index.view.ALL | - | ✅ 已实现 | - |
|
||
| 查看活动详情 | ActivityDetailView.vue | GET /api/v1/activities/{id} | activity.index.view.ALL | - | ✅ 已实现 | - |
|
||
| 编辑活动 | ActivityDetailView.vue | PUT /api/v1/activities/{id} | activity.index.update.ALL | ActivityControllerContractTest | ✅ 已实现 | ActivityController.java |
|
||
| 发布活动 | ActivityDetailView.vue | POST /api/v1/activities/{id}/publish | activity.index.publish.ALL | ActivityControllerContractTest | ✅ 已实现 | ActivityController.java |
|
||
| 暂停活动 | ActivityDetailView.vue | POST /api/v1/activities/{id}/pause | activity.index.pause.ALL | - | ✅ 已实现 | ActivityController.java |
|
||
| 恢复活动 | ActivityDetailView.vue | POST /api/v1/activities/{id}/resume | activity.index.resume.ALL | - | ✅ 已实现 | ActivityController.java |
|
||
| 下线活动 | ActivityDetailView.vue | POST /api/v1/activities/{id}/end | activity.index.end.ALL | - | ✅ 已实现 | ActivityController.java |
|
||
| 归档活动 | ActivityDetailView.vue | POST /api/v1/activities/{id}/archive | activity.index.update.ALL | - | ✅ 已实现 | ActivityController.java |
|
||
| 删除活动 | ActivityDetailView.vue | DELETE /api/v1/activities/{id} | activity.index.delete.ALL | ActivityControllerContractTest | ✅ 已实现 | ActivityController.java |
|
||
| 克隆活动 | ActivityListView.vue | POST /api/v1/activities/{id}/clone | activity.index.clone.ALL | - | ✅ 已实现 | ActivityService.java |
|
||
| 导出活动 | ActivityListView.vue | GET /api/v1/activities/export | activity.index.export.ALL | - | ✅ 已实现 | ActivityController.java |
|
||
|
||
---
|
||
|
||
## 9.3 用户管理 - 按钮级权限
|
||
|
||
| PRD按钮描述 | 前端页面 | 后端接口 | 权限码 | 测试用例ID | 当前状态 | 证据文件 |
|
||
|-------------|----------|----------|--------|------------|----------|----------|
|
||
| 查看用户列表 | UsersView.vue | GET /api/v1/users | user.index.view.ALL | - | ✅ 已实现 | - |
|
||
| 查看用户详情 | UserDetailView.vue | GET /api/v1/users/{id} | user.index.view.ALL | - | ✅ 已实现 | - |
|
||
| 创建用户 | InviteUserView.vue | POST /api/v1/users | user.index.create.ALL | - | ✅ 已实现 | - |
|
||
| 编辑用户 | UserDetailView.vue | PUT /api/v1/users/{id} | user.index.update.ALL | - | ✅ 已实现 | - |
|
||
| 删除用户 | UsersView.vue | DELETE /api/v1/users/{id} | user.index.delete.ALL | - | ✅ 已实现 | - |
|
||
| 冻结用户 | UserDetailView.vue | POST /api/v1/users/{id}/freeze | user.index.freeze.ALL | - | ✅ 已实现 | - |
|
||
| 解冻用户 | UserDetailView.vue | POST /api/v1/users/{id}/unfreeze | user.index.unfreeze.ALL | - | ✅ 已实现 | - |
|
||
| 导出用户 | UsersView.vue | GET /api/v1/users/export | user.index.export.ALL | - | ✅ 已实现 | - |
|
||
| 实名认证 | UserDetailView.vue | POST /api/v1/users/{id}/certify | user.index.certify.ALL | - | ✅ 已实现 | - |
|
||
| 管理用户标签 | UserDetailView.vue | POST /api/v1/users/{id}/tags | user.tag.add.ALL | - | ✅ 已实现 | - |
|
||
|
||
---
|
||
|
||
## 9.4 奖励管理 - 按钮级权限
|
||
|
||
> 注意:奖励管理后端实际路径为 `/api/v1/rewards/admin`。
|
||
> 注意:"拒绝奖励"接口已独立实现为 `POST /api/v1/rewards/admin/{id}/reject`(2026-03-22 新增)。
|
||
|
||
| PRD按钮描述 | 前端页面 | 后端接口 | 权限码 | 测试用例ID | 当前状态 | 证据文件 |
|
||
|-------------|----------|----------|--------|------------|----------|----------|
|
||
| 查看奖励列表 | RewardsView.vue | GET /api/v1/rewards/admin | reward.index.view.ALL | - | ✅ 已实现 | RewardController.java |
|
||
| 申请奖励 | RewardApplyView.vue | POST /api/v1/rewards/admin/apply | reward.index.apply.ALL | - | ✅ 已实现 | RewardController.java |
|
||
| 审批奖励 | ApprovalCenterView.vue | POST /api/v1/rewards/admin/{id}/approve | reward.index.approve.ALL | - | ✅ 已实现 | RewardController.java:89 |
|
||
| 拒绝奖励 | ApprovalCenterView.vue | POST /api/v1/rewards/admin/{id}/reject | reward.index.reject.ALL | PermissionEnforcementIntegrationTest | ✅ 已实现 | RewardController.java:110 |
|
||
| 发放奖励 | RewardsView.vue | POST /api/v1/rewards/admin/{id}/grant | reward.index.grant.ALL | - | ✅ 已实现 | RewardController.java:127 |
|
||
| 取消奖励 | RewardsView.vue | POST /api/v1/rewards/admin/{id}/cancel | reward.index.cancel.ALL | - | ✅ 已实现 | RewardController.java:134 |
|
||
| 导出奖励 | RewardsView.vue | GET /api/v1/rewards/admin/export | reward.index.export.ALL | - | ✅ 已实现 | RewardController.java:175 |
|
||
| 奖励对账 | RewardsView.vue | GET /api/v1/rewards/admin/reconcile | reward.index.reconcile.ALL | - | ✅ 已实现 | RewardController.java:161 |
|
||
| 批量奖励 | RewardsView.vue | POST /api/v1/rewards/admin/batch-grant | reward.index.batch.ALL | - | ✅ 已实现 | RewardController.java:123 |
|
||
|
||
---
|
||
|
||
## 9.5 风险管理 - 按钮级权限
|
||
|
||
> 注意:风险管理前端服务层路径已统一为 `/risks/*`(risk.ts、ApiDataService.ts),与后端 RiskController.java 路径 `/api/v1/risks/*` 一致。
|
||
|
||
| PRD按钮描述 | 前端页面 | 后端接口 | 权限码 | 测试用例ID | 当前状态 | 证据文件 |
|
||
|-------------|----------|----------|--------|------------|----------|----------|
|
||
| 查看风控面板 | RiskView.vue | GET /api/v1/risks/alerts | risk.index.view.ALL | - | ✅ 已实现 | RiskView.vue:101 |
|
||
| 创建风控规则 | RiskRuleFormView.vue | POST /api/v1/risks/rules | risk.rule.create.ALL | - | ✅ 已实现 | RiskController.java |
|
||
| 编辑风控规则 | RiskRuleFormView.vue | PUT /api/v1/risks/rules/{id} | risk.rule.edit.ALL | - | ✅ 已实现 | RiskController.java |
|
||
| 删除风控规则 | RiskRulesView.vue | DELETE /api/v1/risks/rules/{id} | risk.rule.delete.ALL | - | ✅ 已实现 | RiskController.java |
|
||
| 启用风控规则 | RiskRulesView.vue | POST /api/v1/risks/rules/{id}/enable | risk.rule.enable.ALL | - | ✅ 已实现 | RiskController.java |
|
||
| 审核风控 | RiskView.vue | POST /api/v1/risks/{id}/audit | risk.index.audit.ALL | - | ✅ 已实现 | RiskController.java:392, RiskService.java:275 |
|
||
| 管理黑名单 | RiskView.vue | POST /api/v1/risks/blacklist | risk.blacklist.manage.ALL | - | ✅ 已实现 | RiskController.java |
|
||
| 执行拦截 | RiskView.vue | POST /api/v1/risks/{id}/block | risk.block.execute.ALL | - | ✅ 已实现 | RiskController.java |
|
||
| 解除拦截 | RiskView.vue | POST /api/v1/risks/{id}/release | risk.block.release.ALL | - | ✅ 已实现 | RiskController.java |
|
||
| 导出风控数据 | RiskView.vue | GET /api/v1/risks/rules/export | risk.index.export.ALL | - | ✅ 已实现 | RiskController.java |
|
||
|
||
---
|
||
|
||
## 9.6 审批中心 - 按钮级权限
|
||
|
||
> 注意:审批中心后端实际路径为 `/api/v1/approval`(单数),且 approve/reject/transfer 接口使用 body `recordId` 传参,而非路径参数。
|
||
> 注意:前端按钮权限码已对齐为 `approval.execute.*.ALL`(2026-03-22 修复)
|
||
> 注意:2026-03-22 新增独立批量审批、批量转交、委托接口
|
||
|
||
| PRD按钮描述 | 前端页面 | 后端接口 | 权限码 | 测试用例ID | 当前状态 | 证据文件 |
|
||
|-------------|----------|----------|--------|------------|----------|----------|
|
||
| 查看审批列表 | ApprovalCenterView.vue | GET /api/v1/approval/pending | approval.index.view.ALL | - | ✅ 已实现 | ApprovalController.java |
|
||
| 提交审批 | (业务页面) | POST /api/v1/approval/submit | approval.index.submit.ALL | - | ✅ 已实现 | ApprovalController.java:131 |
|
||
| 处理审批(旧) | - | POST /api/v1/approval/handle | approval.index.handle.ALL | - | ⚠️ 已废弃 | ApprovalController.java:384 |
|
||
| 取消审批 | ApprovalCenterView.vue | POST /api/v1/approval/cancel | approval.index.cancel.ALL | - | ✅ 已实现 | ApprovalController.java:449 |
|
||
| 批量审批(新) | ApprovalCenterView.vue | POST /api/v1/approval/batch | approval.index.batch.ALL | PermissionEnforcementIntegrationTest | ✅ 已实现 | ApprovalController.java:473 |
|
||
| 批量转交(新) | ApprovalCenterView.vue | POST /api/v1/approval/batch-transfer | approval.index.batch.transfer.ALL | PermissionEnforcementIntegrationTest | ✅ 已实现 | ApprovalController.java:505 |
|
||
| 委托审批(新) | ApprovalCenterView.vue | POST /api/v1/approval/delegate | approval.index.delegate.ALL | PermissionEnforcementIntegrationTest | ✅ 已实现 | ApprovalController.java:547 |
|
||
| 执行通过 | ApprovalCenterView.vue | POST /api/v1/approval/approve | approval.execute.approve.ALL | - | ✅ 已实现 | ApprovalController.java:285; ApprovalCenterView.vue:81 |
|
||
| 执行拒绝 | ApprovalCenterView.vue | POST /api/v1/approval/reject | approval.execute.reject.ALL | - | ✅ 已实现 | ApprovalController.java:315; ApprovalCenterView.vue:75,134 |
|
||
| 执行转交 | ApprovalCenterView.vue | POST /api/v1/approval/transfer | approval.execute.transfer.ALL | - | ✅ 已实现 | ApprovalController.java:343; ApprovalCenterView.vue:78 |
|
||
|
||
---
|
||
|
||
## 9.7 审批超时机制 (TASK-317/318/319)
|
||
|
||
| 功能点 | 实现描述 | 测试用例ID | 当前状态 | 证据文件 |
|
||
|--------|----------|------------|----------|----------|
|
||
| 50%首次提醒 | sendTimeoutWarning(record, flow, timeoutHours, 50) | ApprovalTimeoutJobTest | ✅ 已实现 | ApprovalTimeoutJob.java:138 |
|
||
| 80%二次提醒 | sendTimeoutWarning(record, flow, timeoutHours, 80) + 短信 | ApprovalTimeoutJobTest | ✅ 已实现 | ApprovalTimeoutJob.java:134 |
|
||
| 100%超时处理 | handleTimeout() - ESCALATE/AUTO_APPROVE/REJECT/NOTIFY | ApprovalTimeoutJobTest | ✅ 已实现 | ApprovalTimeoutJob.java:130 |
|
||
| 提醒去重 | hasReminderBeenSent() 检查 | ApprovalTimeoutJobTest | ✅ 已实现 | ApprovalTimeoutJob.java:382 |
|
||
| 审批模板一致性校验 | ApprovalTemplateConsistencyService | - | ✅ 已实现 | ApprovalTemplateConsistencyService.java |
|
||
|
||
---
|
||
|
||
## 9.8 系统配置 - 按钮级权限
|
||
|
||
> 注意:系统配置后端实际路径为 `/api/v1/system/configs`(复数),非 `/api/system/config`。
|
||
> 注意:API Key前端服务层路径已统一为 `/keys/*`(systemConfig.ts),与后端 ApiKeyController.java 路径 `/api/v1/keys/*` 一致(2026-03-22 修复)。
|
||
|
||
| PRD按钮描述 | 前端页面 | 后端接口 | 权限码 | 测试用例ID | 当前状态 | 证据文件 |
|
||
|-------------|----------|----------|--------|------------|----------|----------|
|
||
| 查看系统配置 | SystemConfigView.vue | GET /api/v1/system/configs | system.index.view.ALL | - | ✅ 已实现 | SystemController.java:105 |
|
||
| 修改系统配置 | SystemConfigView.vue | PUT /api/v1/system/configs/{key} | system.config.manage.ALL | - | ✅ 已实现 | SystemController.java:128 |
|
||
| 批量修改配置 | SystemConfigView.vue | PUT /api/v1/system/configs/batch | system.config.manage.ALL | - | ✅ 已实现 | SystemController.java:182 |
|
||
| 重置配置 | SystemConfigView.vue | POST /api/v1/system/configs/{key}/reset | system.config.manage.ALL | - | ✅ 已实现 | SystemController.java:224 |
|
||
| 管理API Key | SystemApiKeysView.vue | GET/POST/PUT/DELETE /api/v1/keys | system.api-key.*.ALL | ApiKeyControllerTest | ✅ 已实现 | ApiKeyController.java; systemConfig.ts |
|
||
| 管理缓存 | SystemConfigView.vue | POST /api/v1/system/cache/clear | system.cache.manage.ALL | - | ✅ 已实现 | SystemController.java:265 |
|
||
| 访问敏感数据 | SystemConfigView.vue | GET /api/v1/system/info | system.sensitive.access.ALL | - | ✅ 已实现 | SystemController.java:319 |
|
||
|
||
---
|
||
|
||
## API Key 安全实现 (PRD要求)
|
||
|
||
| 安全特性 | 实现描述 | 测试用例ID | 当前状态 | 证据文件 |
|
||
|----------|----------|------------|----------|----------|
|
||
| PBKDF2加密 | SecretKeyGenerator使用PBKDF2 | - | ✅ 已实现 | ActivityService.java:429 |
|
||
| Salt存储 | 加密时使用随机salt | - | ✅ 已实现 | ActivityService.java |
|
||
| 前缀验证 | validateApiKeyPrefix() | - | ✅ 已实现 | ActivityService.java:606 |
|
||
| 一次明文使用 | API Key创建时返回明文 | - | ✅ 已实现 | ApiKeyController.java:149 |
|
||
| 启用/禁用 | enableApiKey/disableApiKey | - | ✅ 已实现 | ApiKeyController.java |
|
||
| 重置 | resetApiKey | - | ✅ 已实现 | ApiKeyController.java |
|
||
| 吊销 | revokeApiKey | - | ✅ 已实现 | ApiKeyController.java |
|
||
|
||
---
|
||
|
||
## 状态说明
|
||
|
||
| 状态 | 含义 |
|
||
|------|------|
|
||
| ✅ 已实现 | 功能已完整实现,有测试覆盖 |
|
||
| ⚠️ 部分实现 | 功能已实现但测试覆盖不足 |
|
||
| ❌ 未实现 | 功能尚未实现 |
|
||
| 🔄 修复中 | 正在修复 |
|
||
|
||
---
|
||
|
||
## 审计追踪
|
||
|
||
本矩阵由 Claude Code Agent 于 2026-03-23 根据 PRD v1.0 和代码审查更新。
|
||
如有疑问,请联系开发团队确认。
|