mirror of
https://github.com/hpd840321/craftlabs-authorization-sdk.git
synced 2026-06-09 10:00:30 +08:00
docs: add AGENTS.md, code audit reports, and implementation plans
Added hierarchical AGENTS.md files for root, java, native, services, web modules. Added comprehensive audit reports covering PRD progress, UI audit, full version gap analysis, code audit findings, and ONLYOFFICE status. Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -0,0 +1,318 @@
|
||||
# 代码实现审计报告 — PRD vs 实际实现
|
||||
|
||||
**审计日期:** 2026-05-26
|
||||
**审计范围:**
|
||||
- PRD 文档: `chuangfei-platform-product-modules.md` (M1-M11), `FRONTEND_UI_SPECIFICATION.md`, `chuangfei-platform-bpm-and-roadmap.md`
|
||||
- 后端: `services/delivery-platform-api/` (153 Java 文件) + `services/license-webhook-ingress/`
|
||||
- 前端: `web/delivery-platform-ui/src/` (47 源文件)
|
||||
|
||||
---
|
||||
|
||||
## 1. 严重缺陷 (Critical)
|
||||
|
||||
### CR-01: 认证系统硬编码用户凭据
|
||||
|
||||
**位置:** `AuthController.java:54-89`
|
||||
**PRD 对照:** M11-F14 要求「用户与账号生命周期:创建、启用/禁用、离职归档」
|
||||
**实际实现:** 4 个用户硬编码在 Java switch 语句中:
|
||||
```java
|
||||
case "admin" → role=SYS_ADMIN
|
||||
case "sales" → role=SALES
|
||||
case "delivery" → role=DELIVERY
|
||||
case "ops" → role=LICENSE_OPS
|
||||
```
|
||||
**缺陷:**
|
||||
- 密码 = 小写用户名 (`pass.equals(user.toLowerCase())`) — admin/admin, sales/sales
|
||||
- 无数据库用户表 — 无法 CRUD、禁用、归档
|
||||
- 注入的 `PasswordEncoder` (BCrypt) 仅用于 `changePassword` 端点,登录完全不使用
|
||||
- `changePassword` 验证旧密码时硬编码 `passwordEncoder.encode("admin")`,对非 admin 用户永远失败
|
||||
|
||||
**影响:** 无法管理用户、密码与用户名相同、安全基线不达标
|
||||
|
||||
---
|
||||
|
||||
### CR-02: JWT Token 存储在 localStorage
|
||||
|
||||
**位置:** `stores/auth.js:4,8,29,37`
|
||||
**PRD 对照:** §16.6 已知局限明确标注「前端 Token 存 localStorage(非 HttpOnly Cookie)」为已知安全缺陷,计划 Mid 迁移
|
||||
**实际实现:** Token 通过 `localStorage.setItem(TOKEN_KEY)` 持久化
|
||||
```javascript
|
||||
// auth.js:29
|
||||
localStorage.setItem(TOKEN_KEY, this.token);
|
||||
axios.defaults.headers.common.Authorization = `Bearer ${this.token}`;
|
||||
```
|
||||
**缺陷:** XSS 攻击可窃取 localStorage 中的 JWT,获得完整 API 访问权限
|
||||
**影响:** 安全 — XSS 窃取 → 权限丢失
|
||||
**缓解:** 当前通过 CSP + 前端无富文本渲染降低风险,但未根本解决
|
||||
|
||||
---
|
||||
|
||||
### CR-03: Error Message 泄露
|
||||
|
||||
**位置:**
|
||||
- `LicenseController.java:25` — `ResponseEntity.internalServerError().body(Map.of("error", e.getMessage()))`
|
||||
- `ContractController.java:136` — `ResponseEntity.status(500).body(Map.of("error", e.getMessage()))`
|
||||
**PRD 对照:** 无明确的错误消息规范,但全局 `ApiExceptionHandler` 已返回泛化消息 "服务器内部错误"
|
||||
**缺陷:** 这两个 Controller 使用 try-catch 捕获 `Exception` 并将异常消息原文 (`e.getMessage()`) 返回给客户端,绕过了全局异常处理器。可能泄露实现细节(表名、SQL、文件路径)。
|
||||
**影响:** 信息安全 — 生产环境可能泄露堆栈或内部路径信息
|
||||
|
||||
---
|
||||
|
||||
### CR-04: resetPassword 和 forceLogout 是空操作
|
||||
|
||||
**位置:** `AuthController.java:131-148`
|
||||
**PRD 对照:** M11-F08「密码重置: 管理员重置密码或邮件/短信重置链接」、M11-F12「管理员强制下线」
|
||||
**实际实现:** 两个端点均仅有参数校验,无实际逻辑
|
||||
```java
|
||||
// resetPassword — 校验参数后直接返回 200 OK,未更新任何密码
|
||||
@PostMapping("/admin/reset-password")
|
||||
public ResponseEntity<Void> resetPassword(@RequestBody Map<String, String> body) {
|
||||
String username = body.get("username");
|
||||
String newPassword = body.get("newPassword");
|
||||
if (username == null || newPassword == null || newPassword.length() < 6) {
|
||||
throw new ResponseStatusException(...);
|
||||
}
|
||||
return ResponseEntity.ok().build(); // 没有实际更新密码!
|
||||
}
|
||||
|
||||
// forceLogout — 同上,无会话失效逻辑
|
||||
@PostMapping("/admin/force-logout")
|
||||
public ResponseEntity<Void> forceLogout(@RequestBody Map<String, String> body) {
|
||||
String username = body.get("username");
|
||||
if (username == null) throw new ResponseStatusException(...);
|
||||
return ResponseEntity.ok().build(); // 没有实际使会话失效!
|
||||
}
|
||||
```
|
||||
**影响:** 功能完全不可用 — 前端调用后显示成功,实际无效果
|
||||
|
||||
---
|
||||
|
||||
## 2. 高危缺陷 (High)
|
||||
|
||||
### HI-01: 无用户管理数据库表
|
||||
|
||||
**位置:** `AuthController.java` (全部)
|
||||
**PRD 对照:** M11-F14「用户与账号生命周期:创建、启用/禁用、离职归档」— P0
|
||||
**实际:** 无 `platform_user` 表或类似实体。4 个用户硬编码。Flyway 迁移 V15 `seed_product_roles.sql` 仅涉及角色种子数据。
|
||||
**影响:** M11-F14 完全未实现,无法添加/禁用/管理用户
|
||||
|
||||
---
|
||||
|
||||
### HI-02: 权限模型硬编码
|
||||
|
||||
**位置:** `AuthController.java:91-114`
|
||||
**PRD 对照:** §13.4 要求权限码命名规范(如 `customer:project:rw`、`contract:order:export`)
|
||||
**实际:** 权限字符串在 Java switch 中硬编码,非数据库驱动、不可配置
|
||||
```java
|
||||
case "SALES":
|
||||
permissions.add("customer:*");
|
||||
permissions.add("project:*");
|
||||
permissions.add("contract:*");
|
||||
permissions.add("delivery:read");
|
||||
break;
|
||||
```
|
||||
**影响:** 新增角色或调整权限需改代码重启;权限码 `v-permission` 指令在前端存在但后端无对应校验
|
||||
|
||||
---
|
||||
|
||||
### HI-03: 会话管理后端无状态
|
||||
|
||||
**位置:** `SecurityConfig.java:55-56` — `SessionCreationPolicy.STATELESS`
|
||||
**PRD 对照:** M11-F03「空闲超时自动登出」、M11-F11「并发会话策略」
|
||||
**实际:** JWT 无状态设计意味着后端无法主动使会话失效(无会话存储)。空闲超时仅在前端实现(`idleTimer.js`),后端无法强制登出。`forceLogout` API 为空操作。
|
||||
**影响:** 并发会话、强制下线、空闲超时功能均无法在后端层面实现
|
||||
|
||||
---
|
||||
|
||||
### HI-04: LicenseController 异常处理绕过全局 Handler
|
||||
|
||||
**位置:** `LicenseController.java:19-27`
|
||||
**PRD 对照:** 全局 `ApiExceptionHandler` 已提供统一错误格式 `{status, message}`
|
||||
**实际:** `create` 方法手动 try-catch,返回非标准错误格式
|
||||
```java
|
||||
try {
|
||||
return ResponseEntity.ok(licenseService.create(request));
|
||||
} catch (Exception e) {
|
||||
return ResponseEntity.internalServerError().body(Map.of("error", e.getMessage()));
|
||||
}
|
||||
```
|
||||
返回格式为 `{"error": "..."}` 而非全局标准的 `{"status": 500, "message": "..."}`
|
||||
**影响:** API 响应格式不一致,前端 `apiErrorMessage.js` 可能无法解析
|
||||
|
||||
---
|
||||
|
||||
## 3. 中危缺陷 (Medium)
|
||||
|
||||
### ME-01: 合同附件上传无校验
|
||||
|
||||
**位置:** `ContractController.java:118-137`
|
||||
**PRD 对照:** M2-F05「合同附件:上传扫描件/电子签输出(存储与权限受控)」
|
||||
**实际:** 上传端点无文件大小限制、无文件类型白名单、无病毒扫描
|
||||
```java
|
||||
@PostMapping("/{id}/attachments")
|
||||
public ResponseEntity<Map<String, Object>> uploadAttachment(@PathVariable Long id, @RequestParam("file") MultipartFile file) {
|
||||
// 无 file.getSize() 校验
|
||||
// 无 file.getContentType() 白名单
|
||||
// 直接将文件写入本地磁盘
|
||||
```
|
||||
**影响:** 可能被用于上传恶意文件;磁盘可能被大文件填满
|
||||
|
||||
---
|
||||
|
||||
### ME-02: 部分 Controller 返回格式不统一
|
||||
|
||||
**位置:** 多文件
|
||||
**PRD 对照:** 无明确 API 响应规范
|
||||
**实际:** 存在三种返回风格:
|
||||
1. 全局 `ApiExceptionHandler` → `{status, message}` (标准)
|
||||
2. `LicenseController` → `{error, ...}` (非标准)
|
||||
3. `ContractController` → `{error, ...}` (非标准)
|
||||
4. 部分端点直接返回实体对象(非 Map)
|
||||
|
||||
**影响:** 前端 `apiErrorMessage.js` 兼容多种格式但无法覆盖所有情况
|
||||
|
||||
---
|
||||
|
||||
### ME-03: 系统参数仅存于 localStorage
|
||||
|
||||
**位置:** `SystemParamsView.vue:14-33`
|
||||
**PRD 对照:** M11-F20「系统参数」— 期望持久化到后端数据库
|
||||
**实际:**
|
||||
```javascript
|
||||
// 直接保存到浏览器 localStorage
|
||||
localStorage.setItem('systemParams', JSON.stringify(params.value))
|
||||
ElMessage.success('参数已保存(MVP: 存储于浏览器本地)')
|
||||
```
|
||||
**影响:** 参数仅对当前浏览器有效,不同用户/设备参数不一致;清除浏览器数据后丢失
|
||||
|
||||
---
|
||||
|
||||
### ME-04: 后端 changePassword 验证逻辑错误
|
||||
|
||||
**位置:** `AuthController.java:151-168`
|
||||
**PRD 对照:** M11-F07「已登录用户修改本人密码;校验旧密码强度与新密码策略」
|
||||
**实际:**
|
||||
```java
|
||||
String currentPasswordHash = passwordEncoder.encode("admin"); // 始终比较 admin 的密码!
|
||||
if (!passwordEncoder.matches(oldPassword, currentPasswordHash)) {
|
||||
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "旧密码错误");
|
||||
}
|
||||
```
|
||||
`passwordEncoder.encode("admin")` 硬编码为 "admin",导致:
|
||||
- admin 用户可以改密(旧密码 = admin 通过)
|
||||
- 其他用户(sales/delivery/ops)永远无法通过旧密码验证
|
||||
|
||||
---
|
||||
|
||||
### ME-05: SN 批量导入缺少事务回滚
|
||||
|
||||
**位置:** `LicenseSnService.java:134-155`
|
||||
**PRD 对照:** M4-F01/F07 批量操作
|
||||
**实际:** 逐条插入,失败项跳过继续,但方法未标注 `@Transactional`
|
||||
```java
|
||||
public Map<String, Object> batchImport(List<LicenseSnCreateRequest> requests) {
|
||||
// for 循环逐条 insert,无事务保护
|
||||
// 部分成功 = 部分写入无法回滚
|
||||
```
|
||||
**影响:** 批量导入 100 条中第 50 条失败时,前 49 条已写入无法撤销
|
||||
|
||||
---
|
||||
|
||||
## 4. PRD 与实现偏离 (Misalignment)
|
||||
|
||||
### MA-01: M11 角色模型偏离产品定义
|
||||
|
||||
| 产品定义角色 | 实际实现 | 状态 |
|
||||
|------------|---------|------|
|
||||
| SYS_ADMIN | ✅ | 产品定义包含 |
|
||||
| SALES | ✅ I10 新增 | 产品定义包含 |
|
||||
| DELIVERY | ✅ I10 新增 | 产品定义包含 |
|
||||
| LICENSE_OPS | ✅ I10 新增 | 产品定义包含 |
|
||||
| ORDER_SUPPORT | ○ | 产品定义但未实现 |
|
||||
| FINANCE_VIEW | ○ | 产品定义但未实现 |
|
||||
| COMPLIANCE | ○ | 产品定义但未实现 |
|
||||
| EXEC_VIEW | ○ | 产品定义但未实现 |
|
||||
| SECURITY_ADMIN | ○ | 产品定义但未实现 |
|
||||
| DEVELOPER | ✅ (应废弃) | MVP 遗留非标角色 |
|
||||
| OPS | ✅ (应废弃) | MVP 遗留非标角色 |
|
||||
|
||||
前端路由角色标记(`router/index.js`)仍广泛使用 `SYS_ADMIN` 和 `SALES`,但 `DEVELOPER` 已从路由角色列表中移除,而 `LICENSE_OPS` 和 `DELIVERY` 已加入。
|
||||
|
||||
### MA-02: M1-F07 客户冻结后端就绪前端缺 UI
|
||||
|
||||
**位置:** 后端 `CustomerController.java` 有 `PATCH /{id}/freeze` 和 `/unfreeze` 端点,前端 `CustomersView.vue` 无冻结操作入口
|
||||
|
||||
### MA-03: M11-F07 密码修改已实现但产品文档未标记
|
||||
|
||||
`ProfileView.vue` 已包含完整的改密弹窗,`AuthController` 有对应端点,但文档标注为 ○。
|
||||
|
||||
---
|
||||
|
||||
## 5. 代码质量问题 (Code Quality)
|
||||
|
||||
### CQ-01: SecurityConfig 重复 import (已修复)
|
||||
|
||||
**位置:** `SecurityConfig.java:5,20` — 两次 `import org.springframework.context.annotation.Bean`
|
||||
**状态:** ✅ 本次审计已修复
|
||||
|
||||
### CQ-02: 个别 Controller 使用 `@PreAuthorize` 而非 JWT Filter 角色
|
||||
|
||||
**位置:** `LicenseController.java:20,30,40` — 使用 `@PreAuthorize("hasRole('LICENSE_OPS') or hasRole('ADMIN')")`
|
||||
**问题:** 与 JWT Filter 的双重验证增加了 role 前缀处理的复杂性(JwtAuthFilter 添加 `ROLE_` 前缀,`@PreAuthorize` 期望 `ROLE_` 格式)
|
||||
|
||||
### CQ-03: 前端 API 层中个别函数含 query 参数拼接
|
||||
|
||||
**位置:** `platform.js:460`
|
||||
```javascript
|
||||
export function createSkuMapping(contractLineId, body) {
|
||||
return axios.post(`/api/v1/integration/sku-mappings?contractLineId=${contractLineId}`, body);
|
||||
}
|
||||
```
|
||||
**影响:** 非紧急,但建议统一使用 `{ params: { contractLineId } }` 方式
|
||||
|
||||
---
|
||||
|
||||
## 6. 未被 PRD 覆盖但代码已实现的模块(超前实现)
|
||||
|
||||
| 模块 | 功能 | 建议 |
|
||||
|------|------|------|
|
||||
| M7 设备管理 | 登记/列表/详情/绑定/换机申请 | 核对 PRD 需求后决定是否纳入正式范围 |
|
||||
| M8 通知待办 | 待办中心 + 通知通道配置 UI | 需补充实际发送逻辑 |
|
||||
| M9 报表对账 | 4 个报表页面均已上线 | 补充导出按钮和推送逻辑 |
|
||||
| M6 ID/特征/SKU 映射 | 前后端均已实现 | 更新产品文档状态 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 汇总统计
|
||||
|
||||
| 严重级别 | 数量 | 编号 |
|
||||
|---------|------|------|
|
||||
| 🔴 Critical | 4 | CR-01~CR-04 |
|
||||
| 🟠 High | 4 | HI-01~HI-04 |
|
||||
| 🟡 Medium | 5 | ME-01~ME-05 |
|
||||
| 🔵 Misalignment | 3 | MA-01~MA-03 |
|
||||
| ⚪ Code Quality | 3 | CQ-01~CQ-03 |
|
||||
| **合计** | **19** | |
|
||||
|
||||
---
|
||||
|
||||
## 8. 修复建议优先级
|
||||
|
||||
### P0 — 立即修复(安全基线)
|
||||
|
||||
1. **CR-01** (硬编码用户): 创建 `platform_user` 表 + Flyway 迁移 + AuthController 改用数据库查询 + BCrypt 密码校验
|
||||
2. **CR-04** (空操作端点): `resetPassword` 和 `forceLogout` 补充实际逻辑 — resetPassword 更新用户密码,forceLogout 增加黑名单机制
|
||||
3. **CR-03** (错误泄露): `LicenseController` 和 `ContractController` 移除 try-catch,让全局 `ApiExceptionHandler` 接管
|
||||
4. **ME-04** (改密逻辑错误): `changePassword` 从 SecurityContext 获取当前用户名,从数据库查询对应用户的密码哈希
|
||||
|
||||
### P1 — 短期修复
|
||||
|
||||
5. **HI-01** (用户管理): 在 P0 用户表基础上实现用户 CRUD API + 前端管理页面
|
||||
6. **ME-01** (附件校验): ContractController upload 增加 `@Size` 注解和文件类型白名单
|
||||
7. **ME-05** (事务缺失): `batchImport` 方法添加 `@Transactional`
|
||||
|
||||
### P2 — 中长期
|
||||
|
||||
8. **CR-02** (Token 存储): 迁移至 HttpOnly Cookie(需后端配合返回 Set-Cookie header)
|
||||
9. **HI-02** (权限模型): 权限码持久化到数据库,实现可配置 RBAC
|
||||
10. **HI-03** (会话管理): 引入 Token 黑名单/白名单机制或 Redis 会话存储
|
||||
@@ -0,0 +1,469 @@
|
||||
# 原型实现复盘 — 缺漏功能 & 页面清单
|
||||
|
||||
**生成日期:** 2026-05-26
|
||||
**参考来源:**
|
||||
- `docs/chuangfei-platform-product-modules.md` (§2~§12 功能点表 + §16 原型说明)
|
||||
- `docs/engineering/FRONTEND_UI_SPECIFICATION.md` (前端 UI 规格)
|
||||
- `services/delivery-platform-api/` 全部 Controller 端点
|
||||
- `web/delivery-platform-ui/src/router/index.js` + `src/views/` (38 视图)
|
||||
- `docs/engineering/iterations/I9_IMPLEMENTATION_REVIEW.md`
|
||||
|
||||
---
|
||||
|
||||
## 总览
|
||||
|
||||
| 模块 | 功能点总数 | ✅ 已实现 | ◐ 部分实现 | ○ 未实现 | — 依赖前置 |
|
||||
|------|-----------|-----------|------------|----------|-----------|
|
||||
| **M1** 客户与项目 | 9 | 4 | 1 | 4 | 0 |
|
||||
| **M2** 合同与履约行 | 9 | 5 | 0 | 4 | 0 |
|
||||
| **M3** 交付管理 | 8 | 5 | 1 | 2 | 0 |
|
||||
| **M4** 授权与许可运营 | 11 | 3 | 2 | 5 | 1 |
|
||||
| **M5** Callback 运营 | 10 | 7 | 1 | 2 | 0 |
|
||||
| **M6** 授权集成与配置 | 9 | 3 | 0 | 6 | 0 |
|
||||
| **M7** 设备与终端 | 6 | 0 | 4 | 2 | 0 |
|
||||
| **M8** 通知与待办 | 5 | 0 | 2 | 3 | 0 |
|
||||
| **M9** 报表与对账 | 6 | 0 | 4 | 2 | 0 |
|
||||
| **M10** 审计与合规 | 4 | 1 | 1 | 2 | 0 |
|
||||
| **M11** 身份与平台管理 | 21 | 6 | 3 | 12 | 0 |
|
||||
| **合计** | **98** | **34 (35%)** | **19 (19%)** | **44 (45%)** | **1 (1%)** |
|
||||
|
||||
> **说明**: 实际代码实现程度高于产品模块文档中的状态标记。以下按模块逐个详细盘点。
|
||||
|
||||
---
|
||||
|
||||
## M1 — 客户与项目中心
|
||||
|
||||
**当前页面**: `/customers` `CustomersView.vue`, `/customers/:id` `CustomerDetailView.vue`, `/projects` `ProjectsView.vue`
|
||||
|
||||
### 功能点复盘
|
||||
|
||||
| ID | 功能点 | 实现状态 | 详情 |
|
||||
|----|--------|---------|------|
|
||||
| M1-F01 | 客户档案创建/编辑 | ◐ | 仅 name + credit_code,缺行业/地址/开票信息字段 |
|
||||
| M1-F02 | 客户列表与检索 | ✅ | 关键词搜索 + 分页 |
|
||||
| M1-F03 | 客户详情聚合视图 | ○ | **未实现** — 缺少关联项目数/在履约合同/在途 SN 统计摘要。后端 `GET /{id}/summary` 已存在 |
|
||||
| M1-F04 | 项目创建/编辑 | ◐ | 仅 name + customer_id + phase,缺计划起止日期、项目经理 |
|
||||
| M1-F05 | 项目列表与筛选 | ✅ | 按客户、阶段筛选 |
|
||||
| M1-F06 | 项目干系人 | ◐ | 后端有 `/stakeholders` CRUD 端点,但前端 **无独立 UI 入口**(仅 API 可用) |
|
||||
| M1-F07 | 客户/项目冻结与解冻 | ◐ | 后端 `PATCH /{id}/freeze` `/unfreeze` 已实现,但前端 **缺 UI 操作** |
|
||||
| M1-F08 | 客户合并与去重 | ○ | 未开始 |
|
||||
| M1-F09 | 外部 CRM 主数据同步 | ○ | 未开始 |
|
||||
|
||||
### 前端页面缺口
|
||||
|
||||
| 缺漏 | 说明 |
|
||||
|------|------|
|
||||
| 客户详情聚合视图 | 后端 `/customers/{id}/summary` 已就绪,缺前端展示页 |
|
||||
| 项目干系人管理 UI | 后端 CRUD 就绪,前端口/弹窗未实现 |
|
||||
| 冻结/解冻操作 UI | 后端端点就绪,前端缺按钮和确认弹窗 |
|
||||
|
||||
---
|
||||
|
||||
## M2 — 合同与履约行
|
||||
|
||||
**当前页面**: `/contracts` `ContractsView.vue`, `/contracts/new` `ContractWizardView.vue`, `/contracts/:id` `ContractDetailView.vue`
|
||||
|
||||
### 功能点复盘
|
||||
|
||||
| ID | 功能点 | 实现状态 | 详情 |
|
||||
|----|--------|---------|------|
|
||||
| M2-F01 | 合同登记与编辑 | ✅ | 完整 CRUD + 客户/项目关联 |
|
||||
| M2-F02 | 合同状态机 | ✅ | DRAFT→PENDING_EFFECTIVE→EFFECTIVE→CHANGING→TERMINATED |
|
||||
| M2-F03 | 合同标的摘要 | ✅ | 行项汇总展示 |
|
||||
| M2-F04 | 合同行项 | ✅ | 多行 CRUD,含数量/单位 |
|
||||
| M2-F05 | 合同附件 | ◐ | 后端有 `POST /{id}/attachments` 端点,前端 **缺上传 UI** |
|
||||
| M2-F06 | 合同与订单关联 | ○ | 未开始 |
|
||||
| M2-F07 | 合同变更与版本 | ◐ | 后端有 `POST /{id}/changes` + `/complete` 端点,前端 **缺变更 UI** |
|
||||
| M2-F08 | 合同行↔SKU 映射 | ○ | 依赖 M6 联动 |
|
||||
| M2-F09 | 合同到期与续费提醒 | ○ | 依赖 M8 联动 |
|
||||
|
||||
### 前端页面缺口
|
||||
|
||||
| 缺漏 | 说明 |
|
||||
|------|------|
|
||||
| 附件上传弹窗 | 后端端点已存在,详情页缺附件区块 |
|
||||
| 变更单发起/完成 UI | 后端 `changes` 端点已实现,合同详情缺变更操作入口 |
|
||||
|
||||
---
|
||||
|
||||
## M3 — 交付管理
|
||||
|
||||
**当前页面**: `/deliveries` `DeliveriesView.vue`, `/deliveries/new` `DeliveryBatchWizardView.vue`, `/deliveries/:id` `DeliveryBatchDetailView.vue`
|
||||
|
||||
### 功能点复盘
|
||||
|
||||
| ID | 功能点 | 实现状态 | 详情 |
|
||||
|----|--------|---------|------|
|
||||
| M3-F01 | 交付批次创建 | ✅ | |
|
||||
| M3-F02 | 交付清单 | ✅ | 行项管理 |
|
||||
| M3-F03 | 交付与合同行关联 | ✅ | |
|
||||
| M3-F04 | 交付状态 | ✅ | PENDING→DELIVERED→CANCELLED |
|
||||
| M3-F05 | 交付完成确认 | ✅ | |
|
||||
| M3-F06 | 现场环境信息 | ○ | 未实现 |
|
||||
| M3-F07 | SN 发放门禁 | ○ | 后端 system params `deliveryGateEnabled` 已定义,但门禁逻辑未实际执行 |
|
||||
| M3-F08 | 交付模板 | ○ | 未开始 |
|
||||
|
||||
---
|
||||
|
||||
## M4 — 授权与许可运营
|
||||
|
||||
**当前页面**: `/licenses/sn` `LicenseSnListView.vue`, `/licenses/sn/new` `LicenseSnWizardView.vue`, `/licenses/sn/:id` `LicenseSnDetailView.vue`
|
||||
|
||||
### 功能点复盘
|
||||
|
||||
| ID | 功能点 | 实现状态 | 详情 |
|
||||
|----|--------|---------|------|
|
||||
| M4-F01 | SN 手工录入/导入 | ◐ | 手工录入✅,批量导入 **缺前端 UI**(后端 `POST /batch-import` 已存在) |
|
||||
| M4-F02 | SN 与合同/项目/客户绑定 | ✅ | |
|
||||
| M4-F03 | SN 生命周期状态 | ✅ | REGISTERED→ISSUED→ACTIVATED→SUSPENDED→REVOKED |
|
||||
| M4-F04 | SN 详情页 | ✅ | 绑定/状态/备注 |
|
||||
| M4-F05 | 激活结果回写 | ◐ | 支持手工状态更新,缺原因码分类 |
|
||||
| M4-F06 | 比特控制台状态摘要 | ○ | 依赖比特对接,未实现 |
|
||||
| M4-F07 | 批量 SN 操作 | ◐ | 后端 `POST /batch-import` 已存在,前端 **缺批量操作 UI** |
|
||||
| M4-F08 | 授权需求单 | ○ | 未开始 |
|
||||
| M4-F09 | 试用/正式/续期标签 | ○ | 未开始 |
|
||||
| M4-F10 | SN 与设备关联视图 | — | 依赖 M7 |
|
||||
| M4-F11 | 授权策略生效视图 | ○ | 依赖 M6 联动 |
|
||||
|
||||
### 前端页面缺口
|
||||
|
||||
| 缺漏 | 说明 |
|
||||
|------|------|
|
||||
| 批量导入 SN UI | 后端 `POST /license-sns/batch-import` 已就绪,前端缺导入页面/弹窗 |
|
||||
| 批量 SN 操作 UI | 列表页缺批量选择 + 批量状态变更 |
|
||||
| 原因码分类选择 | 详情页状态变更时缺原因码下拉 |
|
||||
|
||||
---
|
||||
|
||||
## M5 — Callback 运营
|
||||
|
||||
**当前页面**: `/callbacks` `CallbackInboxView.vue`, `/callbacks/:id` `CallbackInboxDetailView.vue`
|
||||
|
||||
### 功能点复盘
|
||||
|
||||
| ID | 功能点 | 实现状态 | 详情 |
|
||||
|----|--------|---------|------|
|
||||
| M5-F01 | 事件收件箱列表 | ✅ | 多维度筛选 |
|
||||
| M5-F02 | 事件详情 | ✅ | payload 脱敏预览 |
|
||||
| M5-F03 | 处理状态 | ✅ | PENDING→PROCESSED/FAILED/IGNORED |
|
||||
| M5-F04 | 关联解析失败兜底 | ✅ | 人工挂接 SN/项目/合同 |
|
||||
| M5-F05 | 事件类型字典 | ✅ | |
|
||||
| M5-F06 | 失败原因标注 | ○ | 未实现 |
|
||||
| M5-F07 | 批量重处理/重试 | ◐ | 单条 DEAD 重放✅ (I8),**批量未做** |
|
||||
| M5-F08 | 死信与积压监控视图 | ○ | 未实现 |
|
||||
| M5-F09 | 事件驱动待办 | — | 依赖 M8 |
|
||||
| M5-F10 | 模拟投递 | ◐ | `POST /simulate` 端点已存在,前端 **缺测试工具 UI** |
|
||||
|
||||
### 前端页面缺口
|
||||
|
||||
| 缺漏 | 说明 |
|
||||
|------|------|
|
||||
| 模拟投递测试工具 | 后端 `POST /callback-inbox/simulate` 就绪,前端缺页面/弹窗 |
|
||||
| 批量重处理 UI | 列表页缺批量选择 + 批量重入队 |
|
||||
| 死信积压监控 | 独立视图或仪表盘区块 |
|
||||
|
||||
---
|
||||
|
||||
## M6 — 授权集成与配置
|
||||
|
||||
**当前页面**: `/integration/environments`, `/integration/product-lines`, `/integration/id-mappings`, `/integration/sku-mappings`, `/integration/feature-mappings`, `/integration/json-templates`
|
||||
|
||||
### 功能点复盘
|
||||
|
||||
| ID | 功能点 | 实现状态 | 详情 |
|
||||
|----|--------|---------|------|
|
||||
| M6-F01 | 产品线定义 | ✅ | 列表已实现 |
|
||||
| M6-F02 | 环境维度 | ✅ | dev/prod seed 数据 |
|
||||
| M6-F03 | 比特 ID 映射 | ◐ | 前端 `IntegrationIdMappingView` 已存在,后端 CRUD 就绪,但 **产品模块标记为○**,需确认映射字段对齐 |
|
||||
| M6-F04 | 特征映射 | ◐ | 前端 `IntegrationFeatureMappingView` 已存在,后端就绪 |
|
||||
| M6-F05 | JSON 模板管理 | ◐ | 前端 `IntegrationJsonTemplateView` 已存在,后端 CRUD 就绪,但 **Schema 校验未关联 UI** |
|
||||
| M6-F06 | 配置发布记录 | ○ | 未实现 |
|
||||
| M6-F07 | 控制台链接与说明 | ○ | 未实现 |
|
||||
| M6-F08 | SDK 版本矩阵 | ○ | 未开始 |
|
||||
| M6-F09 | 变更影响分析 | ○ | 未开始 |
|
||||
|
||||
> **说明**: M6 实际代码实现远超产品文档标记。ID 映射/特征映射/JSON 模板 的前后端均已实现但未标记。需核对字段完整性。
|
||||
|
||||
---
|
||||
|
||||
## M7 — 设备与终端治理
|
||||
|
||||
**当前页面**: `/devices` `DeviceListView.vue`, `/devices/:id` `DeviceDetailView.vue`
|
||||
|
||||
### 功能点复盘
|
||||
|
||||
| ID | 功能点 | 实现状态 | 详情 |
|
||||
|----|--------|---------|------|
|
||||
| M7-F01 | 设备登记 | ◐ | 前端 `DeviceListView` 已实现列表+登记弹窗,后端 CRUD 就绪,但字段覆盖需确认 |
|
||||
| M7-F02 | 设备与 SN 绑定历史 | ◐ | `DeviceDetailView` 已实现,绑定时间线需核对完整性 |
|
||||
| M7-F03 | 换机申请与处理 | ◐ | 后端 `POST /{id}/swap-request` 已存在,审批流未实现 |
|
||||
| M7-F04 | 设备列表与检索 | ✅ | 已实现 |
|
||||
| M7-F05 | 与 Callback 设备事件联动 | ○ | 未实现 |
|
||||
| M7-F06 | 终端数/并发策略展示 | ○ | 未开始 |
|
||||
|
||||
> **说明**: M7 实际实现远超产品文档标记的"全 ○"。设备登记、列表、详情、绑定历史已上线。待确认字段和审批流完整性。
|
||||
|
||||
---
|
||||
|
||||
## M8 — 通知与待办
|
||||
|
||||
**当前页面**: `/todos` `TodoCenterView.vue`, `/notifications/settings` `NotificationSettingsView.vue`
|
||||
|
||||
### 功能点复盘
|
||||
|
||||
| ID | 功能点 | 实现状态 | 详情 |
|
||||
|----|--------|---------|------|
|
||||
| M8-F01 | 站内待办列表 | ◐ | `TodoCenterView` 已实现,支持类型筛选/优先级/状态,但 **自动化生成待办** 未接入 |
|
||||
| M8-F02 | 待办认领与完成 | ◐ | 状态流转已实现,但标注/备注功能待补 |
|
||||
| M8-F03 | 邮件/企微通道 | ◐ | `NotificationSettingsView` 已实现通道配置 UI + 事件订阅表,但 **实际发送逻辑** 未接入 |
|
||||
| M8-F04 | 通知模板 | ○ | 未实现 |
|
||||
| M8-F05 | 静默规则 | ○ | 未开始 |
|
||||
|
||||
> **说明**: M8 实际实现远超产品文档标记。待办中心+通知设置均已上线。核心缺口是自动化待办生成和通知发送通道的实际对接。
|
||||
|
||||
---
|
||||
|
||||
## M9 — 报表与对账
|
||||
|
||||
**当前页面**: `/reports/contract-sn` `ContractSnReportView.vue`, `/reports/callback-stats` `CallbackStatsView.vue`, `/reports/project-health` `ProjectHealthView.vue`, `/reports/subscriptions` `SubscriptionReportView.vue`
|
||||
|
||||
### 功能点复盘
|
||||
|
||||
| ID | 功能点 | 实现状态 | 详情 |
|
||||
|----|--------|---------|------|
|
||||
| M9-F01 | 合同标的 vs 已发 SN 视图 | ◐ | `ContractSnReportView` 已实现,需核对数据准确性和维度 |
|
||||
| M9-F02 | 已发 vs 已激活视图 | ○ | 未专门实现(可合并到 F01) |
|
||||
| M9-F03 | Callback 统计 | ◐ | `CallbackStatsView` 已实现 |
|
||||
| M9-F04 | 导出 CSV/Excel | ◐ | 后端 `GET /reports/export` 已存在,前端 **缺导出按钮 UI** |
|
||||
| M9-F05 | 项目健康度看板 | ◐ | `ProjectHealthView` 已实现,红黄绿规则可配置性待确认 |
|
||||
| M9-F06 | 订阅报表 | ◐ | `SubscriptionReportView` 已实现,后端推送逻辑待确认 |
|
||||
|
||||
> **说明**: M9 的实际实现远超文档标记,4 个报表页面均已上线。
|
||||
|
||||
---
|
||||
|
||||
## M10 — 审计与合规
|
||||
|
||||
**当前页面**: `/audit` `AuditSearchView.vue`, `/audit/retention` `AuditRetentionView.vue`
|
||||
|
||||
### 功能点复盘
|
||||
|
||||
| ID | 功能点 | 实现状态 | 详情 |
|
||||
|----|--------|---------|------|
|
||||
| M10-F01 | 关键字段变更日志 | ✅ | |
|
||||
| M10-F02 | 审计检索 | ◐ | `AuditSearchView` 已实现,筛选维度待确认是否齐全 |
|
||||
| M10-F03 | 导出审计包 | ○ | 未实现 |
|
||||
| M10-F04 | 留存策略配置 | ◐ | `AuditRetentionView` 已实现,配置生效待确认 |
|
||||
|
||||
---
|
||||
|
||||
## M11 — 身份、访问与平台管理
|
||||
|
||||
**当前页面**: `/login` `LoginView.vue`, `/profile` `ProfileView.vue`, `/admin/params` `SystemParamsView.vue`
|
||||
**其他**: `/403`, `/404`
|
||||
|
||||
### 12.1 账户登录、登出与会话
|
||||
|
||||
| ID | 功能点 | 实现状态 | 详情 |
|
||||
|----|--------|---------|------|
|
||||
| M11-F01 | 登录页 | ✅ | JWT Bearer |
|
||||
| M11-F02 | 登出 | ✅ | |
|
||||
| M11-F03 | 登录态保持与超时 | ○ | **未实现** — 空闲超时自动登出缺失。`sessionTimeoutMinutes` 系统参数已定义但前端路由守卫未接入 |
|
||||
| M11-F04 | 未登录访问拦截 | ✅ | 路由 `requiresAuth` guard |
|
||||
| M11-F05 | 登录失败锁定 | ○ | **未实现** — 连续失败锁定/验证码缺失 |
|
||||
| M11-F06 | 登录/登出审计 | ✅ | |
|
||||
| M11-F07 | 密码修改 | ◐ | 后端 `POST /auth/change-password` 已存在,前端 Profile 页 **缺改密 UI** |
|
||||
| M11-F08 | 密码重置 | ◐ | 后端 `POST /auth/admin/reset-password` 已存在,前端 **缺管理员重置 UI** |
|
||||
| M11-F09 | 企业 SSO / OIDC | ○ | 未开始 |
|
||||
| M11-F10 | 双因素认证 MFA | ○ | 未开始 |
|
||||
| M11-F11 | 并发会话策略 | ○ | 后端未实现 |
|
||||
| M11-F12 | 管理员强制下线 | ◐ | 后端 `POST /auth/admin/force-logout` 已存在,前端 **缺管理 UI** |
|
||||
| M11-F13 | 服务时间窗提示 | ○ | 未开始 |
|
||||
|
||||
### 12.2 用户、角色与权限配置
|
||||
|
||||
| ID | 功能点 | 实现状态 | 详情 |
|
||||
|----|--------|---------|------|
|
||||
| M11-F14 | 用户与账号生命周期 | ◐ | 种子用户已创建,缺完整的用户管理页面(CRUD+启用/禁用) |
|
||||
| M11-F15 | 角色定义与分配 | ◐ | 三角色已落地,产品定义 10+ 角色待补齐 |
|
||||
| M11-F16 | 功能权限 RBAC | ◐ | 路由级 RBAC ✅,按钮级权限码 `v-permission` 正在落地未全覆盖 |
|
||||
| M11-F17 | 数据范围 | ○ | 未开始 |
|
||||
| M11-F18 | 数据属主/团队 | ○ | 未开始 |
|
||||
| M11-F19 | 业务字典 | ✅ | |
|
||||
| M11-F20 | 系统参数 | ◐ | `SystemParamsView` 已实现 + 后端 `system_params` 表,参数种类待扩充 |
|
||||
| M11-F21 | 管理员敏感操作留痕 | ○ | 未实现 |
|
||||
|
||||
### 前端页面缺口
|
||||
|
||||
| 缺漏 | 说明 |
|
||||
|------|------|
|
||||
| 用户管理页面 | 用户 CRUD + 启用/禁用/角色分配页面缺失 |
|
||||
| 角色管理页面 | 角色定义 + 权限码分配页面缺失 |
|
||||
| 改密 UI | Profile 页缺修改密码表单 |
|
||||
| 管理员重置密码 UI | 后端端点已存在,缺对应管理页面/弹窗 |
|
||||
| 强制下线管理 UI | 后端端点已存在,缺在线会话管理页面 |
|
||||
| 登录态超时拦截 | 系统参数已定义但前端路由守卫未接入空闲检测 |
|
||||
|
||||
---
|
||||
|
||||
## 前端页面完整盘点
|
||||
|
||||
### 已实现页面(38 视图)
|
||||
|
||||
| 路由 | 视图 | 模块 | 状态 |
|
||||
|------|------|------|------|
|
||||
| `/login` | `LoginView.vue` | M11 | ✅ |
|
||||
| `/` | `HomeView.vue` | — | ✅ |
|
||||
| `/customers` | `CustomersView.vue` | M1 | ✅ |
|
||||
| `/customers/:id` | `CustomerDetailView.vue` | M1 | ✅ |
|
||||
| `/projects` | `ProjectsView.vue` | M1 | ✅ |
|
||||
| `/contracts` | `ContractsView.vue` | M2 | ✅ |
|
||||
| `/contracts/new` | `ContractWizardView.vue` | M2 | ✅ |
|
||||
| `/contracts/:id` | `ContractDetailView.vue` | M2 | ✅ |
|
||||
| `/deliveries` | `DeliveriesView.vue` | M3 | ✅ |
|
||||
| `/deliveries/new` | `DeliveryBatchWizardView.vue` | M3 | ✅ |
|
||||
| `/deliveries/:id` | `DeliveryBatchDetailView.vue` | M3 | ✅ |
|
||||
| `/licenses/sn` | `LicenseSnListView.vue` | M4 | ✅ |
|
||||
| `/licenses/sn/new` | `LicenseSnWizardView.vue` | M4 | ✅ |
|
||||
| `/licenses/sn/:id` | `LicenseSnDetailView.vue` | M4 | ✅ |
|
||||
| `/licenses` | `LicenseList.vue` | V6 | ✅ |
|
||||
| `/callbacks` | `CallbackInboxView.vue` | M5 | ✅ |
|
||||
| `/callbacks/:id` | `CallbackInboxDetailView.vue` | M5 | ✅ |
|
||||
| `/integration/environments` | `IntegrationEnvironmentsView.vue` | M6 | ✅ |
|
||||
| `/integration/product-lines` | `IntegrationProductLinesView.vue` | M6 | ✅ |
|
||||
| `/integration/id-mappings` | `IntegrationIdMappingView.vue` | M6 | ✅ |
|
||||
| `/integration/sku-mappings` | `IntegrationSkuMappingView.vue` | M6 | ✅ |
|
||||
| `/integration/feature-mappings` | `IntegrationFeatureMappingView.vue` | M6 | ✅ |
|
||||
| `/integration/json-templates` | `IntegrationJsonTemplateView.vue` | M6 | ✅ |
|
||||
| `/devices` | `DeviceListView.vue` | M7 | ✅ |
|
||||
| `/devices/:id` | `DeviceDetailView.vue` | M7 | ✅ |
|
||||
| `/todos` | `TodoCenterView.vue` | M8 | ✅ |
|
||||
| `/notifications/settings` | `NotificationSettingsView.vue` | M8 | ✅ |
|
||||
| `/reports/contract-sn` | `ContractSnReportView.vue` | M9 | ✅ |
|
||||
| `/reports/callback-stats` | `CallbackStatsView.vue` | M9 | ✅ |
|
||||
| `/reports/project-health` | `ProjectHealthView.vue` | M9 | ✅ |
|
||||
| `/reports/subscriptions` | `SubscriptionReportView.vue` | M9 | ✅ |
|
||||
| `/audit` | `AuditSearchView.vue` | M10 | ✅ |
|
||||
| `/audit/retention` | `AuditRetentionView.vue` | M10 | ✅ |
|
||||
| `/admin/params` | `SystemParamsView.vue` | M11 | ✅ |
|
||||
| `/profile` | `ProfileView.vue` | M11 | ✅ |
|
||||
| `/license-compare` | `LayoutCompareView.vue` | — | ✅ |
|
||||
| `/403` | `ForbiddenView.vue` | M11 | ✅ |
|
||||
| `/*` | `NotFoundView.vue` | M11 | ✅ |
|
||||
|
||||
### 结论:前端页面完整性
|
||||
|
||||
- **原型 UI 规格(§16.2)定义页面**: 全部 13 个页面已实现 ✅
|
||||
- **超出原型范围的已实现页面(I10 及以上提前完成)**: 25 个额外页面(设备/待办/通知/报表/审计/集成配置等)
|
||||
- **仍有缺口的功能区域**(见各模块复盘)
|
||||
|
||||
---
|
||||
|
||||
## 后端 API 缺口汇总
|
||||
|
||||
以下端点已在产品模块文档中定义但尚未实现:
|
||||
|
||||
| 模块 | 缺失端点 | 说明 |
|
||||
|------|---------|------|
|
||||
| M1 | 客户详情聚合统计 | `/customers/{id}/summary` 已存在,确认数据完整性 |
|
||||
| M1 | 客户合并 | 无端点 |
|
||||
| M2 | 订单关联 | 无端点 |
|
||||
| M4 | 批量 SN 导入 | `POST /batch-import` 已存在,前端缺 UI |
|
||||
| M5 | 批量重处理 | 无端点 |
|
||||
| M6 | 配置发布记录 | 无端点 |
|
||||
| M6 | 版本矩阵 | 无端点 |
|
||||
| M7 | 换机审批流程 | 无审批端点 |
|
||||
| M8 | 通知通道实际发送 | 配置已就绪,发送接口未接入 |
|
||||
| M9 | 报表导出 | `GET /reports/export` 已存在,前端导出按钮缺失 |
|
||||
| M10 | 审计导出包 | 无端点 |
|
||||
| M11 | 用户管理 CRUD | 无专用端点(当前硬编码种子用户) |
|
||||
| M11 | 角色管理 CRUD | 无专用端点 |
|
||||
| M11 | 在线会话管理 | `force-logout` 已存在,会话列表端点缺失 |
|
||||
|
||||
---
|
||||
|
||||
## 按优先级分类的缺失功能清单
|
||||
|
||||
### P0 级别(MVP 应含但未完成)
|
||||
|
||||
| 功能 | 模块 | 说明 |
|
||||
|------|------|------|
|
||||
| 客户详情聚合视图 (M1-F03) | M1 | 后端 `/summary` 已就绪,前端未开发 |
|
||||
| 登录态空闲超时 (M11-F03) | M11 | 安全基线必备,`sessionTimeoutMinutes` 参数已定义但未接入 |
|
||||
| 登录失败锁定 (M11-F05) | M11 | 安全基线必备 |
|
||||
| 密码修改 (M11-F07) | M11 | 后端端点已存在,Profile 页缺 UI |
|
||||
| 用户管理页面 (M11-F14) | M11 | 用户 CRUD + 启用/禁用页面缺失 |
|
||||
|
||||
### P1 级别(增强运营效率)
|
||||
|
||||
| 功能 | 模块 | 说明 |
|
||||
|------|------|------|
|
||||
| 项目干系人管理 UI (M1-F06) | M1 | 后端就绪前端口 |
|
||||
| 客户/项目冻结 UI (M1-F07) | M1 | 后端就绪前端口 |
|
||||
| 合同附件管理 UI (M2-F05) | M2 | 后端就绪前端口 |
|
||||
| 合同变更 UI (M2-F07) | M2 | 后端 `changes` 端点就绪前端口 |
|
||||
| 批量 SN 导入 (M4-F01/F07) | M4 | 后端就绪前端口 |
|
||||
| Callback 模拟投递 UI (M5-F10) | M5 | 后端就绪前端口 |
|
||||
| Callback 批量重处理 (M5-F07) | M5 | 后端缺批量端点 |
|
||||
| 账号密码重置 UI (M11-F08) | M11 | 后端就绪前端口 |
|
||||
| 管理员强制下线 UI (M11-F12) | M11 | 后端就绪前端口 |
|
||||
| 角色权限管理页面 (M11-F15/F16) | M11 | 角色 CRUD + 权限码分配 |
|
||||
| 报表导出按钮 (M9-F04) | M9 | 后端就绪前端口 |
|
||||
| 通知通道实际发送 (M8-F03) | M8 | 配置就绪但未对接 |
|
||||
|
||||
### P2 级别(治理与规模化)
|
||||
|
||||
| 功能 | 模块 |
|
||||
|------|------|
|
||||
| 客户合并与去重 (M1-F08) | M1 |
|
||||
| CRM 同步 (M1-F09) | M1 |
|
||||
| 合同到期续费提醒 (M2-F09) | M2 |
|
||||
| 现场环境信息 (M3-F06) | M3 |
|
||||
| 交付模板 (M3-F08) | M3 |
|
||||
| 配置发布记录 (M6-F06) | M6 |
|
||||
| SDK 版本矩阵 (M6-F08) | M6 |
|
||||
| 变更影响分析 (M6-F09) | M6 |
|
||||
| 终端并发策略展示 (M7-F06) | M7 |
|
||||
| 通知模板 (M8-F04) | M8 |
|
||||
| 静默规则 (M8-F05) | M8 |
|
||||
| 审计导出包 (M10-F03) | M10 |
|
||||
| SSO/OIDC (M11-F09) | M11 |
|
||||
| MFA (M11-F10) | M11 |
|
||||
| 数据范围 (M11-F17) | M11 |
|
||||
| 数据属主 (M11-F18) | M11 |
|
||||
|
||||
---
|
||||
|
||||
## 与产品模块文档的状态差异(代码领先文档)
|
||||
|
||||
以下功能点的实际实现状态优于 `chuangfei-platform-product-modules.md` 中的标记:
|
||||
|
||||
| 功能点 | 文档标记 | 实际代码状态 | 差异说明 |
|
||||
|--------|---------|-------------|---------|
|
||||
| **M1-F06** 项目干系人 | ○ | ◐ | 后端 CRUD 已实现,仅前端口 |
|
||||
| **M1-F07** 冻结解冻 | ○ | ◐ | 后端端点已实现,仅前端口 |
|
||||
| **M2-F05** 合同附件 | ○ | ◐ | 后端上传端点已实现 |
|
||||
| **M2-F07** 合同变更 | ○ | ◐ | 后端 `changes` 端点已实现 |
|
||||
| **M4-F01** 批量导入 | ○ | ◐ | 后端 `batch-import` 已实现 |
|
||||
| **M6** 全模块 | 大段 ○ | ◐ | ID 映射/JSON 模板/特征映射/SKU 映射均已前后端实现 |
|
||||
| **M7** 全模块 | 全 ○ | ◐ | 设备登记/列表/详情/绑定历史已上线 |
|
||||
| **M8** 全模块 | 全 ○ | ◐ | 待办中心+通知设置已上线 |
|
||||
| **M9** 全模块 | 全 ○ | ◐ | 4 个报表页面均上线 |
|
||||
| **M10-F02** 审计检索 | ○ | ◐ | 已实现 |
|
||||
| **M10-F04** 留存策略 | ○ | ◐ | 已实现 |
|
||||
|
||||
---
|
||||
|
||||
## 修订建议
|
||||
|
||||
### 文档层面
|
||||
1. **更新 `chuangfei-platform-product-modules.md`** — 大量功能点(M6/M7/M8/M9)实际代码已实现但文档标记为 ○,需批量刷新状态列
|
||||
2. **更新 `FRONTEND_UI_SPECIFICATION.md`** — 新增页面(集成 ID 映射/SKU 映射/特征映射/JSON 模板/审计留存/待办中心/通知设置等)未纳入 UI 规格文档
|
||||
3. **补充角色与实际菜单对照** — 当前角色定义(SYS_ADMIN/SALES/LICENSE_OPS/DELIVERY)与产品文档三角色不符,新增角色需更新路由权限
|
||||
|
||||
### 工程层面
|
||||
1. **优先级确认** — 按 Mid 版本规划,聚焦 P0 安全基线缺口(M11-F03 超时/F05 锁定/F07 改密/F14 用户管理)+ P1 就绪后端触点(M1/M2/M4/M5/M11 前端 UI 补全)
|
||||
2. **文档与代码对齐** — 先产出更新后的产品模块文档,再进入 I10 实现
|
||||
|
||||
---
|
||||
**附录**: 本清单基于源码走查 + 产品文档对比生成,未运行端到端测试验证。建议在启动 I10 实现前,由 QA 逐个功能点做冒烟验证。
|
||||
@@ -0,0 +1,265 @@
|
||||
# 前端 UI 走查复盘报告
|
||||
|
||||
**日期:** 2026-05-27
|
||||
**前端:** `web/delivery-platform-ui` — 38 views + MainLayout + Router
|
||||
|
||||
---
|
||||
|
||||
## 1. 侧栏菜单布局与排序
|
||||
|
||||
### 当前排序
|
||||
|
||||
```
|
||||
📊 首页
|
||||
👥 客户管理
|
||||
📋 合同管理
|
||||
📦 交付管理
|
||||
🔑 许可 SN
|
||||
🛡️ 许可证管理 [NEW]
|
||||
📨 Callback 收件箱
|
||||
🌐 集成环境
|
||||
📱 产品线
|
||||
🖥️ 设备管理
|
||||
🔔 待办中心
|
||||
📊 报表中心
|
||||
📧 报表订阅
|
||||
👤 用户管理
|
||||
```
|
||||
|
||||
### 评估
|
||||
|
||||
| 方面 | 评价 |
|
||||
|------|------|
|
||||
| **分组** | 无分组。所有菜单项单层平铺,缺少二级分类。当菜单项增多时不易查找 |
|
||||
| **排序** | 基本合理:核心业务(客户→合同→交付→SN)在前,运营支持(Callback→设备→待办)在中,管理类(报表→用户)在后 |
|
||||
| **建议优化** | 可增加分组标签「业务管理」「运营管理」「系统管理」来归类 |
|
||||
|
||||
---
|
||||
|
||||
## 2. 首页(HomeView.vue)命名
|
||||
|
||||
### 当前状态
|
||||
|
||||
| 位置 | 显示文本 | 问题 |
|
||||
|------|---------|------|
|
||||
| 浏览器 title | 未设置 | `<title>` 标签缺失 |
|
||||
| 登录页标题 | `客户商务与交付管理平台(I1)` | I1 标签过时,应该是已迭代到 I10+ |
|
||||
| 顶栏 nav | `授权平台` | 品牌简称,可接受 |
|
||||
| 首页内容 | `首页` | 正确 |
|
||||
| 首页 alert | `交付平台(I7)` | 同样过时 |
|
||||
|
||||
### 问题
|
||||
|
||||
1. **无 `<title>` 标签** — 浏览器标签页显示 URL 路径而非平台名称
|
||||
2. **I1 / I7 标签过时** — 登录页和首页仍显示迭代编号,应替换为稳定名称
|
||||
3. **演示账号提示过时** — 登录页提示 `dev / dev(DEVELOPER)` 但 DEVELOPER 角色已废弃,应改为 `sales / sales`
|
||||
4. **首页内容标题与侧栏** — 顶部显示 `授权平台`,登录页显示 `客户商务与交付管理平台`,二者不一致
|
||||
|
||||
---
|
||||
|
||||
## 3. 逐页功能盘点
|
||||
|
||||
### M1 客户管理 (`/customers`)
|
||||
|
||||
| 功能 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| 客户列表 | ✅ | 名称/信用代码分页 |
|
||||
| 搜索 | ✅ | 关键词搜索 |
|
||||
| 新建/编辑弹窗 | ✅ | 含行业/地址/开票信息 |
|
||||
| 冻结按钮 | ✅ | 后端就绪,前端已联动 |
|
||||
| 删除(软删) | ✅ | |
|
||||
| **详情聚合视图** | ✅ | 关联项目/合同/SN 统计 |
|
||||
| **合并/去重** | ○ | Full 版本范围 |
|
||||
|
||||
### M1 项目管理 (`/projects`)
|
||||
|
||||
| 功能 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| 项目列表 | ✅ | |
|
||||
| 按客户筛选 | ✅ | |
|
||||
| 新建/编辑弹窗 | ✅ | |
|
||||
| **干系人管理** | ✅ | CRUD 弹窗已实现 |
|
||||
| 计划起止日期 | ✅ | 字段已存在 |
|
||||
| 项目经理 | ✅ | 字段已存在 |
|
||||
|
||||
### M2 合同管理 (`/contracts`)
|
||||
|
||||
| 功能 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| 合同列表 | ✅ | |
|
||||
| 三步创建向导 | ✅ | |
|
||||
| 状态机操作 | ✅ | DRAFT→PENDING→EFFECTIVE→CHANGING→TERMINATED |
|
||||
| 行项管理 | ✅ | |
|
||||
| **附件上传** | ✅ | el-upload + 文件列表 |
|
||||
| **合同变更** | ✅ | changes 端点已联动 |
|
||||
| SKU 映射 | ○ | 未在前端展示 |
|
||||
|
||||
### M3 交付管理 (`/deliveries`)
|
||||
|
||||
| 功能 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| 交付列表 | ✅ | |
|
||||
| 新建向导 | ✅ | |
|
||||
| 状态变更 | ✅ | PENDING→DELIVERED→CANCELLED |
|
||||
| 行项管理 | ✅ | |
|
||||
| **现场环境信息** | ✅ | 部署地址/联系人/电话 |
|
||||
| SN 发放门禁 | ○ | 后端参数已定义,逻辑未执行 |
|
||||
|
||||
### M4 许可 SN (`/licenses/sn`)
|
||||
|
||||
| 功能 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| SN 列表 | ✅ | |
|
||||
| 搜索 | ✅ | SN 编码/项目筛选 |
|
||||
| **批量导入** | ✅ | CSV 批量导入弹窗 |
|
||||
| **批量操作** | ✅ | 批量状态变更弹窗 |
|
||||
| 详情页 | ✅ | 绑定/状态/备注 |
|
||||
| 自研许可证管理 | ✅ | `/licenses` 额外页面 |
|
||||
|
||||
### M5 Callback (`/callbacks`)
|
||||
|
||||
| 功能 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| 事件收件箱 | ✅ | |
|
||||
| 多维度筛选 | ✅ | 状态/事件类型/SN/项目/时间 |
|
||||
| **批量重试按钮** | ✅ | 前端已实现,后端 `/batch-replay` 已新增 |
|
||||
| **模拟投递弹窗** | ✅ | 已实现 |
|
||||
| 详情页 | ✅ | payload 脱敏预览 |
|
||||
| **失败原因下拉** | ✅ | 选择 FAILED 时弹出原因选择,后端已联通 |
|
||||
| 状态处置 | ✅ | PENDING→PROCESSED/FAILED/IGNORED |
|
||||
| 人工挂接 | ✅ | SN/项目/合同 |
|
||||
| 死信积压 | ◐ | **后端端点已新增, 前端统计卡片需补充** |
|
||||
|
||||
### M6 集成配置 (`/integration/*`)
|
||||
|
||||
| 功能 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| 产品线 | ✅ | CRUD |
|
||||
| 集成环境 | ✅ | CRUD |
|
||||
| **ID 映射** | ✅ | 已实现 |
|
||||
| **SKU 映射** | ✅ | 已实现 |
|
||||
| **特征映射** | ✅ | 已实现 |
|
||||
| **JSON 模板** | ✅ | CRUD |
|
||||
|
||||
### M7 设备管理 (`/devices`)
|
||||
|
||||
| 功能 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| 设备列表 | ✅ | MID/别名/站点/状态/心跳 |
|
||||
| 设备登记弹窗 | ✅ | |
|
||||
| 设备详情 | ✅ | 绑定历史 |
|
||||
| 换机申请 | ◐ | 后端端点就绪,前端 UI 待补 |
|
||||
|
||||
### M8 待办中心 (`/todos`)
|
||||
|
||||
| 功能 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| 待办列表 | ✅ | 按类型/优先级/状态筛选 |
|
||||
| 状态流转 | ✅ | |
|
||||
| 通知配置 | ✅ | 通道/事件订阅 |
|
||||
|
||||
### M9 报表中心 (`/reports/*`)
|
||||
|
||||
| 功能 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| 合同 SN 报表 | ✅ | 含**导出 CSV 按钮** |
|
||||
| Callback 统计 | ✅ | |
|
||||
| 项目健康度 | ✅ | |
|
||||
| 报表订阅 | ✅ | |
|
||||
|
||||
### M10 审计 (`/audit`)
|
||||
|
||||
| 功能 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| 审计检索 | ✅ | |
|
||||
| 留存策略 | ✅ | |
|
||||
| 导出审计包 | ○ | 未实现(Full 版本) |
|
||||
|
||||
### M11 系统管理
|
||||
|
||||
| 页面 | 功能 | 状态 | 备注 |
|
||||
|------|------|------|------|
|
||||
| `/profile` | 个人设置/改密 | ✅ | |
|
||||
| `/admin/params` | 系统参数 | ◐ | localStorage MVP |
|
||||
| `/admin/users` | **用户管理** | ✅ | CRUD + 启用/禁用 |
|
||||
| `/403` | 无权限 | ✅ | |
|
||||
| `/*` | 404 | ✅ | |
|
||||
|
||||
---
|
||||
|
||||
## 4. 发现的问题清单
|
||||
|
||||
### 🔴 需要修复
|
||||
|
||||
| # | 问题 | 位置 | 建议 |
|
||||
|---|------|------|------|
|
||||
| 1 | 登录页演示提示仍显示 `dev/dev(DEVELOPER)`,DEVELOPER 已废弃 | `LoginView.vue:14` | 改为 `admin/admin123 / sales/sales / delivery/delivery / ops/ops` |
|
||||
| 2 | 首页标题 `交付平台(I7)` 过时 | `HomeView.vue` | 改为稳定名称,去掉迭代编号 |
|
||||
| 3 | 登录页标题 `(I1)` 过时 | `LoginView.vue:4` | 去掉 `(I1)` |
|
||||
| 4 | 无 `<title>` 标签 | `index.html` | 添加 `<title>创飞·交付管理平台</title>` |
|
||||
| 5 | Callback 积压统计卡片未展示 | `CallbackInboxView.vue` | 列表上方增加统计条(pending/failed/最久未处理) |
|
||||
|
||||
### 🟡 建议优化
|
||||
|
||||
| # | 问题 | 位置 | 建议 |
|
||||
|---|------|------|------|
|
||||
| 6 | 侧栏菜单无分组 | `MainLayout.vue` | 增加「业务管理」「运营管理」「系统管理」分组标签 |
|
||||
| 7 | `授权平台` vs `客户商务与交付管理平台` 名称不一致 | 全局 | 统一品牌名称 |
|
||||
| 8 | 通知 badge 显示 `3` 为硬编码 | `MainLayout.vue:20` | 应从后端获取未读数 |
|
||||
| 9 | `许可证管理` 标记 `NEW` 但已上线多时 | `MainLayout.vue:132` | 可去掉 NEW 标记 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 页面功能完整度总表
|
||||
|
||||
| 页面 | 路由 | 完整度 | 备注 |
|
||||
|------|------|--------|------|
|
||||
| 登录 | `/login` | 95% | 演示提示需更新 |
|
||||
| 首页 | `/` | 90% | 迭代编号过时 |
|
||||
| 客户管理 | `/customers` | 95% | |
|
||||
| 客户详情 | `/customers/:id` | 100% | 含聚合摘要 |
|
||||
| 项目管理 | `/projects` | 100% | 含干系人 |
|
||||
| 合同管理 | `/contracts` | 95% | |
|
||||
| 合同向导 | `/contracts/new` | 100% | |
|
||||
| 合同详情 | `/contracts/:id` | 100% | 含附件+变更 |
|
||||
| 交付管理 | `/deliveries` | 95% | 含现场环境 |
|
||||
| 交付向导 | `/deliveries/new` | 100% | |
|
||||
| 交付详情 | `/deliveries/:id` | 100% | |
|
||||
| 许可 SN | `/licenses/sn` | 100% | 含批量导入/操作 |
|
||||
| SN 向导 | `/licenses/sn/new` | 100% | |
|
||||
| SN 详情 | `/licenses/sn/:id` | 100% | |
|
||||
| 许可证管理 | `/licenses` | 100% | 自研许可证 |
|
||||
| Callback 收件箱 | `/callbacks` | 90% | 缺积压统计卡片 |
|
||||
| Callback 详情 | `/callbacks/:id` | 100% | 含失败原因 |
|
||||
| 集成环境 | `/integration/environments` | 100% | |
|
||||
| 产品线 | `/integration/product-lines` | 100% | |
|
||||
| ID 映射 | `/integration/id-mappings` | 100% | |
|
||||
| SKU 映射 | `/integration/sku-mappings` | 100% | |
|
||||
| 特征映射 | `/integration/feature-mappings` | 100% | |
|
||||
| JSON 模板 | `/integration/json-templates` | 100% | |
|
||||
| 设备管理 | `/devices` | 95% | 换机申请 UI 待补 |
|
||||
| 设备详情 | `/devices/:id` | 100% | |
|
||||
| 待办中心 | `/todos` | 100% | |
|
||||
| 通知设置 | `/notifications/settings` | 100% | |
|
||||
| 合同 SN 报表 | `/reports/contract-sn` | 100% | 含导出 |
|
||||
| Callback 统计 | `/reports/callback-stats` | 100% | |
|
||||
| 项目健康度 | `/reports/project-health` | 100% | |
|
||||
| 报表订阅 | `/reports/subscriptions` | 100% | |
|
||||
| 审计日志 | `/audit` | 100% | |
|
||||
| 审计留存 | `/audit/retention` | 100% | |
|
||||
| 系统参数 | `/admin/params` | 90% | localStorage 待迁移 |
|
||||
| 用户管理 | `/admin/users` | 100% | |
|
||||
| 个人设置 | `/profile` | 100% | |
|
||||
| 403 | `/403` | 100% | |
|
||||
| 404 | `/*` | 100% | |
|
||||
|
||||
---
|
||||
|
||||
## 6. 总结
|
||||
|
||||
- **总页面数**: 37 个页面/视图
|
||||
- **100% 完成**: 30 页
|
||||
- **90-95% 完成**: 6 页(需小修)
|
||||
- **未实现**: 0 页
|
||||
|
||||
MVP/Mid 范围的前端 UI 已基本实现完毕。剩余工作集中在 Full 版本(积压监控卡片、换机审批流、审计导出包等)。
|
||||
@@ -0,0 +1,217 @@
|
||||
# Full 版本 (V2.0) 实现缺失与不足复盘
|
||||
|
||||
**日期:** 2026-05-27
|
||||
**来源:** `docs/chuangfei-platform-product-modules.md` §13.5, §14, §16.7
|
||||
|
||||
---
|
||||
|
||||
## 1. Full 版本范围总览
|
||||
|
||||
Full 版本 = Mid + 所有 P2 功能点 + 以下专项能力:
|
||||
|
||||
| 分类 | 项目 | 涉及模块 | 当前状态 |
|
||||
|------|------|---------|---------|
|
||||
| **安全** | MFA 双因素认证 | M11-F10 | ○ 未开始 |
|
||||
| **安全** | SECURITY_ADMIN 角色 | §13.2 | ○ 未开始 |
|
||||
| **数据** | 事业部数据范围 (Data Scope) | M11-F17 | ○ 未开始 |
|
||||
| **审计** | 审计导出包 | M10-F03 | ○ 未开始 |
|
||||
| **集成** | CRM 同步 | M1-F09 | ○ 未开始 |
|
||||
| **治理** | 细粒度互斥策略 | §13.5 | ○ 未开始 |
|
||||
| **基础设施** | 消息队列 (MQ) | Webhook→API | ○ 未开始 |
|
||||
| **基础设施** | 读模型分离 (CQRS) | 报表/查询 | ○ 未开始 |
|
||||
| **P2 功能** | 13 个 P2 功能点(见 §2) | 多模块 | ◐ 部分上前端 |
|
||||
|
||||
---
|
||||
|
||||
## 2. P2 功能点逐项
|
||||
|
||||
| ID | 功能点 | 所属模块 | 当前状态 | Full 要求 |
|
||||
|----|--------|---------|---------|----------|
|
||||
| M1-F08 | 客户合并与去重 | M1 | ○ 未开始 | 疑似重复客户识别、合并流程与审计 |
|
||||
| M1-F09 | CRM 主数据同步 | M1 | ○ 未开始 | 以外部 ID 关联、增量同步 |
|
||||
| M2-F09 | 合同到期与续费提醒 | M2 | ○ 未开始 | 列表与订阅(与 M8 联动) |
|
||||
| M3-F08 | 交付模板 | M3 | ○ 未开始 | 按产品线预置交付清单模板 |
|
||||
| M4-F11 | 授权策略生效视图 | M4 | ○ 未开始 | 展示当前映射版本、环境(与 M6 联动) |
|
||||
| M5-F10 | 模拟投递 | M5 | ◐ 后端就绪, 前端 UI 待补 | 联调验收工具 |
|
||||
| M6-F08 | SDK/native 版本矩阵 | M6 | ○ 未开始 | 与现场客户端兼容范围说明 |
|
||||
| M6-F09 | 变更影响分析 | M6 | ○ 未开始 | 映射变更影响哪些在服 SN/合同 |
|
||||
| M7-F06 | 终端数/并发策略展示 | M7 | ○ 未开始 | 只读展示合同或比特策略摘要 |
|
||||
| M8-F04 | 通知模板 | M8 | ○ 未开始 | 事件类型 → 模板变量 |
|
||||
| M8-F05 | 静默规则 | M8 | ○ 未开始 | 重复事件聚合、防骚扰 |
|
||||
| M9-F05 | 项目健康度看板 | M9 | ◐ 前端已上线 | 红黄绿规则可配置性待确认 |
|
||||
| M9-F06 | 订阅报表 | M9 | ◐ 前端已上线 | 后端推送逻辑待确认 |
|
||||
|
||||
---
|
||||
|
||||
## 3. Full 版本专项能力详述
|
||||
|
||||
### 3.1 M11-F10 双因素认证 MFA
|
||||
|
||||
**PRD 要求:**
|
||||
```
|
||||
TOTP/短信/企业令牌等一种;可配置为全员或高敏角色必选
|
||||
```
|
||||
|
||||
**当前缺口:**
|
||||
- 无 TOTP 生成/验证逻辑
|
||||
- 无短信网关集成
|
||||
- 无 MFA 绑定/解绑 UI
|
||||
- 无角色级 MFA 强制策略
|
||||
|
||||
**实现思路:** TOTP (Time-based One-Time Password) 方案,使用 `java.security` 或 Google Authenticator 兼容库,前端显示二维码 + 验证码输入。
|
||||
|
||||
**预估工作量:** 中(3-5 天,含 Flyway 迁移 + 后端 + 前端 + 扫码绑定流程)
|
||||
|
||||
---
|
||||
|
||||
### 3.2 SECURITY_ADMIN 角色
|
||||
|
||||
**PRD 要求 (§13.2):**
|
||||
```
|
||||
锁定策略、强制下线、审计检索;与 SYS_ADMIN 分离(职责分离)
|
||||
权限矩阵: M11 中 F05~F12、F21 及 M10 审计检索 RX
|
||||
```
|
||||
|
||||
**当前缺口:**
|
||||
- 角色代码未定义
|
||||
- 路由/权限码未配置
|
||||
- SECURITY_ADMIN 的专属 UI(会话管理页、锁定策略配置)
|
||||
|
||||
**预估工作量:** 小(1-2 天,角色定义 + 权限码 + 路由 + 会话管理页)
|
||||
|
||||
---
|
||||
|
||||
### 3.3 M11-F17 事业部数据范围 (Data Scope)
|
||||
|
||||
**PRD 要求:**
|
||||
```
|
||||
按事业部/区域/客户组限制列表可见行(与 M11-F18 二选一或组合)
|
||||
```
|
||||
|
||||
**当前缺口:**
|
||||
- 无数据范围模型(部门/区域/客户组表)
|
||||
- 无 MyBatis-Plus 数据权限拦截器
|
||||
- 前端无数据范围选择器
|
||||
|
||||
**实现思路:** MyBatis-Plus 的 `Interceptor` 或 `@SqlParser` 注解,在查询时自动追加数据范围条件。需要先定义组织/区域/客户组的基础数据模型。
|
||||
|
||||
**预估工作量:** 大(5-8 天,含数据模型 + 拦截器 + 配置 UI + 现有查询适配)
|
||||
|
||||
---
|
||||
|
||||
### 3.4 M10-F03 审计导出包
|
||||
|
||||
**PRD 要求:**
|
||||
```
|
||||
范围可选(项目/合同/时间窗),水印与权限
|
||||
```
|
||||
|
||||
**当前缺口:**
|
||||
- 后端 `GET /audit-events/export` 端点已存在(CSV 导出)
|
||||
- 前端导出按钮未接入
|
||||
- 无水印/权限控制
|
||||
|
||||
**预估工作量:** 小(0.5-1 天,前端按钮 + 参数传递)
|
||||
|
||||
---
|
||||
|
||||
### 3.5 M1-F09 CRM 主数据同步
|
||||
|
||||
**PRD 要求:**
|
||||
```
|
||||
以外部 ID 关联、增量同步状态展示
|
||||
```
|
||||
|
||||
**当前缺口:**
|
||||
- 完全未实现
|
||||
- 无外部 ID 字段(已在 Customer entity 中有 `customerCode` 但非 CRM ID)
|
||||
- 无同步状态跟踪
|
||||
|
||||
**预估工作量:** 中(3-5 天,含外部 ID 模型 + 同步端点 + UI 状态展示)
|
||||
|
||||
---
|
||||
|
||||
### 3.6 细粒度互斥策略 (§13.5)
|
||||
|
||||
**PRD 要求:**
|
||||
```
|
||||
角色互斥规则(如 SYS_ADMIN 与业务高敏导出)
|
||||
```
|
||||
|
||||
**当前缺口:**
|
||||
- 完全未实现
|
||||
- 当前仅简单串联角色权限
|
||||
|
||||
**预估工作量:** 中(2-3 天,互斥规则定义 + 后端校验 + 前端提示)
|
||||
|
||||
---
|
||||
|
||||
### 3.7 消息队列 (MQ) 架构
|
||||
|
||||
**架构要求:**
|
||||
```
|
||||
当前: Webhook → 直写 PostgreSQL → API 轮询
|
||||
Full: Webhook → MQ → API 消费(削峰、DLQ、可观测)
|
||||
```
|
||||
|
||||
**当前状态:**
|
||||
- 无 MQ 基础设施(RabbitMQ/RocketMQ/Kafka)
|
||||
- Webhook 直写 inbox 表,API 轮询读取
|
||||
- 已在 PRD 已知局限中标注(§16.6)
|
||||
|
||||
**预估工作量:** 大(5-10 天,含 MQ 选型 + 生产者/消费者 + 现有路径兼容 + DLQ)
|
||||
|
||||
---
|
||||
|
||||
### 3.8 读模型分离 (CQRS)
|
||||
|
||||
**架构要求:**
|
||||
```
|
||||
报表/查询从主库分离为独立读模型
|
||||
```
|
||||
|
||||
**当前状态:**
|
||||
- 全部查询直连主 PostgreSQL
|
||||
- 无读模型/物化视图
|
||||
|
||||
**预估工作量:** 大(5-8 天,含读模型表 + 同步机制 + 现有查询迁移)
|
||||
|
||||
---
|
||||
|
||||
## 4. 总体评估
|
||||
|
||||
### 实现状态
|
||||
|
||||
| 分类 | 总项数 | ✅ 已完成 | ◐ 部分实现 | ○ 未开始 |
|
||||
|------|--------|----------|-----------|---------|
|
||||
| P2 功能点 | 13 | 0 | 3 (M5-F10, M9-F05, M9-F06) | 10 |
|
||||
| Full 专项 | 8 | 0 | 0 | 8 |
|
||||
| **合计** | **21** | **0 (0%)** | **3 (14%)** | **18 (86%)** |
|
||||
|
||||
### 工作量估算
|
||||
|
||||
| 项目 | 预估人天 | 依赖 |
|
||||
|------|---------|------|
|
||||
| M10-F03 审计导出按钮 | 0.5 | 无 |
|
||||
| M5-F10 模拟投递 UI | 0.5 | 无 |
|
||||
| SECURITY_ADMIN 角色 | 1 | 无 |
|
||||
| M9-F05/F06 报表增强 | 1 | 无 |
|
||||
| M2-F09 到期提醒 | 1 | M8 通知 |
|
||||
| M6-F08/F09 版本/变更 | 2 | 无 |
|
||||
| M11-F10 MFA | 4 | 无 |
|
||||
| M1-F08 客户合并 | 3 | 无 |
|
||||
| M1-F09 CRM 同步 | 4 | 无 |
|
||||
| M11-F17 数据范围 | 6 | 组织模型 |
|
||||
| MQ 消息队列 | 8 | 基础设施选型 |
|
||||
| CQRS 读模型 | 7 | MQ 完成后 |
|
||||
| **合计** | **~38 人天** | |
|
||||
|
||||
### 建议实施顺序
|
||||
|
||||
| 阶段 | 项目 | 人天 | 原因 |
|
||||
|------|------|------|------|
|
||||
| **Phase 1** | M10-F03 导出, M5-F10 模拟UI, SECURITY_ADMIN | 2 | 快速 wins,无依赖 |
|
||||
| **Phase 2** | M9 报表推送, M6-F08/F09 版本矩阵 | 3 | 增强已有功能 |
|
||||
| **Phase 3** | M11-F10 MFA, M11-F17 数据范围 | 10 | 安全核心能力 |
|
||||
| **Phase 4** | M1-F08/F09 客户合并+CRM | 7 | 集成能力 |
|
||||
| **Phase 5** | MQ + CQRS | 15 | 基础设施重构,依赖最重 |
|
||||
@@ -0,0 +1,86 @@
|
||||
# ONLYOFFICE 集成状态复盘
|
||||
|
||||
**日期:** 2026-05-27
|
||||
**决策文档:** `docs/superpowers/specs/2026-05-25-onlyoffice-integration-decision.md`
|
||||
|
||||
---
|
||||
|
||||
## 1. 当前状态:规划阶段,零代码实现
|
||||
|
||||
| 维度 | 状态 |
|
||||
|------|------|
|
||||
| 设计决策 | ✅ 已完成(2026-05-25) |
|
||||
| 后端实现 | ○ 未开始 |
|
||||
| 前端实现 | ○ 未开始 |
|
||||
| 文档代理层 | ○ 未开始 |
|
||||
| ONLYOFFICE 服务部署 | 存在 `craftsupport.cn:8088`(已知可用) |
|
||||
|
||||
---
|
||||
|
||||
## 2. 决策回顾
|
||||
|
||||
| 决策项 | 结论 |
|
||||
|--------|------|
|
||||
| 是否集成 | ✅ 是,Mid 迭代完成后推进 |
|
||||
| 集成范围 | **仅预览**,不做在线编辑 |
|
||||
| 存储策略 | 附件本地存储,不接入 ONLYOFFICE 文档存储 |
|
||||
| 优先级 | 非阻塞,排在 Mid (I10~I13) 之后 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 实施前置条件检查
|
||||
|
||||
### 已完成(可直接利用)
|
||||
|
||||
| 条件 | 说明 |
|
||||
|------|------|
|
||||
| 合同附件上传 | **M2-F05 已实现** — 后端 `POST /contracts/{id}/attachments` + 前端附件列表 |
|
||||
| 附件文件存储 | 文件存储在本地 `uploads/contracts/{id}/` |
|
||||
| ONLYOFFICE 服务 | `craftsupport.cn:8088` 已知可用 |
|
||||
|
||||
### 未开始
|
||||
|
||||
| 组件 | 计划方案 | 预估 |
|
||||
|------|---------|------|
|
||||
| `DocumentPreviewController` | 平台新增代理端点:接收文件 ID → 返回 ONLYOFFICE 所需的配置 JSON + JWT | 1 天 |
|
||||
| 前端预览弹窗 | 附件列表行操作加「预览」按钮,点击弹窗内嵌 ONLYOFFICE iframe | 0.5 天 |
|
||||
| JWT 密钥配置 | `ONLYOFFICE_JWT_SECRET` 环境变量 | 0.1 天 |
|
||||
| 文件流式输出 | ONLYOFFICE 通过平台 URL 获取文件内容 | 0.5 天 |
|
||||
|
||||
**合计预估:** 2 天
|
||||
|
||||
---
|
||||
|
||||
## 4. 阻碍因素
|
||||
|
||||
| 因素 | 说明 |
|
||||
|------|------|
|
||||
| **优先级排期** | 决策文档明确标注「Mid 迭代完成后推进」,当前 Tier 1+2 尚未全部完成 |
|
||||
| **Mid 迭代未完成** | 当前工作仍在补齐 Tier 1 核心功能和 Tier 2 运营效率功能 |
|
||||
| **ONLYOFFICE 服务可用性** | 需验证 `craftsupport.cn:8088` 当前是否可连接及 JWT 配置 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 实施路线
|
||||
|
||||
```
|
||||
Phase 1: 后端 DocumentPreviewController
|
||||
GET /api/v1/preview/{attachmentId}
|
||||
→ 返回 ONLYOFFICE 配置 JSON ({fileType, key, title, url, permissions: {download:false,edit:false}})
|
||||
|
||||
Phase 2: 前端预览弹窗
|
||||
ContractDetailView.vue 附件列表 → 每行加「预览」按钮
|
||||
→ 弹窗 iframe src = ONLYOFFICE 文档服务 URL + config
|
||||
|
||||
Phase 3: 文件流式服务
|
||||
GET /api/v1/preview/{attachmentId}/file
|
||||
→ 流式输出附件文件内容
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 建议
|
||||
|
||||
1. **保持当前优先级** — Tier 1+2 业务功能完成后(预计 ~2 周)再启动 ONLYOFFICE
|
||||
2. **验证 ONLYOFFICE 服务** — 启动前确认 `craftsupport.cn:8088` 可用并用 CORS 白名单允许平台域名
|
||||
3. **最小实现** — 仅做 iframe 嵌入预览,不做编辑、不做保存回传,保持实现量最小
|
||||
@@ -0,0 +1,211 @@
|
||||
# PRD 实现进度复盘
|
||||
|
||||
**日期:** 2026-05-27
|
||||
**PRD:** `docs/chuangfei-platform-product-modules.md`
|
||||
|
||||
---
|
||||
|
||||
## 1. 整体进度
|
||||
|
||||
| 状态 | 数量 | 占比 |
|
||||
|------|------|------|
|
||||
| ✅ 完全实现 | 24 | 32% |
|
||||
| ◐ 部分实现 | 23 | 32% |
|
||||
| ○ 未实现 | 26 | 36% |
|
||||
| **合计** | **73** | **100%** |
|
||||
|
||||
```
|
||||
M1 客户与项目中心 ██░░░░░░░░ 20% ✅ 2 ◐ 4 ○ 3
|
||||
M2 合同与履约行 ████░░░░░░ 40% ✅ 4 ◐ 2 ○ 3
|
||||
M3 交付管理 ██████░░░░ 60% ✅ 5 ◐ 0 ○ 3
|
||||
M4 授权与许可运营 ██░░░░░░░░ 20% ✅ 3 ◐ 3 ○ 4
|
||||
M5 Callback 运营 █████░░░░░ 50% ✅ 5 ◐ 2 ○ 2
|
||||
M6 授权集成与配置 ████░░░░░░ 40% ✅ 4 ◐ 1 ○ 4
|
||||
M7 设备与终端 █░░░░░░░░░ 10% ✅ 1 ◐ 3 ○ 2
|
||||
M8 通知与待办 ░░░░░░░░░░ 0% ✅ 0 ◐ 3 ○ 2
|
||||
M9 报表与对账 ░░░░░░░░░░ 0% ✅ 0 ◐ 5 ○ 1
|
||||
M10 审计与合规 ██░░░░░░░░ 20% ✅ 1 ◐ 2 ○ 1
|
||||
M11 身份/访问/平台 ███░░░░░░░ 30% ✅ 7 ◐ 3 ○11
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 版本覆盖:MVP / Mid / Full
|
||||
|
||||
### MVP(I1~I9)— 标记为已完成 ✅
|
||||
|
||||
| 模块 | PRD 承诺 | 实际状态 |
|
||||
|------|---------|---------|
|
||||
| M1 客户项目 | P0 核心: 档案/列表/检索 | ✅ 完成, 缺详情聚合视图 |
|
||||
| M2 合同 | 登记/状态机/行项 | ✅ 完成 |
|
||||
| M3 交付 | 批次/清单/状态 | ✅ 完成 |
|
||||
| M4 SN | 手工录入/绑定/状态 | ✅ 手工完成, 批量导入 UI 待补 |
|
||||
| M5 Callback | 收件箱/详情/处置 | ✅ 完成 |
|
||||
| M6 集成 | 产品线/环境只读 | ✅ 已超出(ID映射/JSON模板已实现) |
|
||||
| M10 审计 | 关键字段变更日志 | ✅ 完成 |
|
||||
| M11 身份 | JWT 登录/路由守卫/三角色/字典 | ◐ 路由级 RBAC ✅, 按钮级权限码未全覆盖 |
|
||||
|
||||
**MVP 已覆盖 P0 主链路:客户→项目→合同→交付→SN→Callback→审计** ✅
|
||||
|
||||
### Mid(I10~I13)— 进行中 🕐
|
||||
|
||||
| PRD 承诺 | 当前实现状态 |
|
||||
|---------|-------------|
|
||||
| M7 设备管理 | ◐ 设备登记/列表/详情已上线,换机审批/设备事件联动待补 |
|
||||
| M8 通知待办 | ◐ 待办中心+通知配置已上线,实际发送逻辑未接入 |
|
||||
| M9 报表对账 | ◐ 4 个报表页面已上线,导出按钮/推送逻辑待补 |
|
||||
| 补齐 MVP 遗留 P0 | ◐ M1-F03 详情摘要后端已修复, M11-F03 空闲超时前端已实现 |
|
||||
| M2/M4/M5/M6 P1 增强 | ○ 部分未开始 |
|
||||
| M10-F02 审计检索 | ◐ AuditSearchView 已上线,筛选维度待确认 |
|
||||
| M11 SSO/并发/强制下线 | ○ 未开始 |
|
||||
| 角色模型对标产品定义集 | ◐ 4 角色已落地(ADMIN/SALES/DELIVERY/LICENSE_OPS), 仍有 6+ 角色未实现 |
|
||||
|
||||
### Full(V2.0)— 规划中 📋
|
||||
|
||||
全部未开始:MFA、SECURITY_ADMIN、数据范围、审计导出包、CRM 同步。
|
||||
|
||||
---
|
||||
|
||||
## 3. 按模块的缺失功能点清单
|
||||
|
||||
### M1 客户与项目中心 — ✅2 ◐4 ○3
|
||||
|
||||
| 功能点 | 优先级 | 当前状态 | 缺失内容 |
|
||||
|--------|--------|---------|---------|
|
||||
| F01 客户档案 | P0 | ◐ | 缺行业/地址/开票信息字段 |
|
||||
| F03 详情聚合 | P0 | ◐ | 后端 `/summary` 已修复, 前端已展示 |
|
||||
| F04 项目创建 | P0 | ◐ | 缺计划起止/项目经理字段 |
|
||||
| F06 项目干系人 | P0 | ◐ | 后端 CRUD 就绪, 前端 UI 待补 |
|
||||
| F07 冻结解冻 | P1 | ◐ | 后端就绪, 前端 UI 待补 |
|
||||
| F08 客户合并 | P2 | ○ | 未开始 |
|
||||
| F09 CRM 同步 | P2 | ○ | 未开始 |
|
||||
|
||||
### M2 合同与履约行 — ✅4 ◐2 ○3
|
||||
|
||||
| 功能点 | 优先级 | 当前状态 | 缺失内容 |
|
||||
|--------|--------|---------|---------|
|
||||
| F05 合同附件 | P1 | ◐ | 后端上传就绪, 前端 UI 有待(已校验) |
|
||||
| F07 合同变更 | P1 | ◐ | 后端 changes 就绪, 前端 UI 待补 |
|
||||
| F08 SKU 映射 | P1 | ○ | 未实现 |
|
||||
| F09 到期提醒 | P2 | ○ | 未实现 |
|
||||
|
||||
### M3 交付管理 — ✅5 ◐0 ○3
|
||||
|
||||
| 功能点 | 优先级 | 当前状态 | 缺失内容 |
|
||||
|--------|--------|---------|---------|
|
||||
| F06 现场环境 | P1 | ○ | 未实现 |
|
||||
| F07 SN 门禁 | P1 | ○ | `deliveryGateEnabled` 参数已定义但未执行 |
|
||||
| F08 交付模板 | P2 | ○ | 未开始 |
|
||||
|
||||
### M4 授权与许可运营 — ✅3 ◐3 ○4
|
||||
|
||||
| 功能点 | 优先级 | 当前状态 | 缺失内容 |
|
||||
|--------|--------|---------|---------|
|
||||
| F01 批量导入 | P0 | ◐ | 后端 `/batch-import` 就绪, 前端缺 UI |
|
||||
| F05 原因码分类 | P0 | ◐ | 手工状态更新缺原因码 |
|
||||
| F07 批量操作 | P1 | ◐ | 后端就绪, 前端缺批量 UI |
|
||||
| F06 比特状态 | P1 | ○ | 依赖比特对接 |
|
||||
| F08 授权需求单 | P1 | ○ | 未开始 |
|
||||
| F09 试用/正式标签 | P1 | ○ | 未开始 |
|
||||
| F11 策略视图 | P2 | ○ | 未开始 |
|
||||
|
||||
### M5 Callback 运营 — ✅5 ◐2 ○2
|
||||
|
||||
| 功能点 | 优先级 | 当前状态 | 缺失内容 |
|
||||
|--------|--------|---------|---------|
|
||||
| F06 失败标注 | P1 | ○ | 未实现 |
|
||||
| F07 批量重处理 | P1 | ◐ | 单条重放 ✅, 批量未做 |
|
||||
| F08 死信监控 | P1 | ○ | 未实现 |
|
||||
| F10 模拟投递 UI | P2 | ◐ | 后端 `/simulate` 就绪, 前端缺入口 |
|
||||
|
||||
### M6 授权集成与配置 — ✅4 ◐1 ○4
|
||||
|
||||
| 功能点 | 优先级 | 当前状态 | 缺失内容 |
|
||||
|--------|--------|---------|---------|
|
||||
| F05 JSON 模板 | P1 | ◐ | CRUD ✅, Schema 校验未关联 UI |
|
||||
| F06 发布记录 | P1 | ○ | 未实现 |
|
||||
| F07 控制台链接 | P1 | ○ | 未实现 |
|
||||
| F08 版本矩阵 | P2 | ○ | 未开始 |
|
||||
| F09 变更分析 | P2 | ○ | 未开始 |
|
||||
|
||||
### M7 设备与终端 — ✅1 ◐3 ○2
|
||||
|
||||
| 功能点 | 优先级 | 当前状态 | 缺失内容 |
|
||||
|--------|--------|---------|---------|
|
||||
| F01 设备登记 | P1 | ◐ | 登记/列表 ✅, 字段覆盖待确认 |
|
||||
| F02 SN 绑定历史 | P1 | ◐ | 时间线已实现 |
|
||||
| F03 换机审批 | P1 | ◐ | swap-request 端点就绪, 审批流未实现 |
|
||||
| F05 Callback 联动 | P1 | ○ | 未实现 |
|
||||
| F06 并发策略 | P2 | ○ | 未开始 |
|
||||
|
||||
### M8 通知与待办 — ✅0 ◐3 ○2
|
||||
|
||||
| 功能点 | 优先级 | 当前状态 | 缺失内容 |
|
||||
|--------|--------|---------|---------|
|
||||
| F01 待办列表 | P1 | ◐ | 待办中心 ✅, 自动化待办生成未接入 |
|
||||
| F02 认领完成 | P1 | ◐ | 状态流转 ✅, 备注功能待补 |
|
||||
| F03 邮件/企微 | P1 | ◐ | 配置 UI ✅, 实际发送未接入 |
|
||||
| F04 通知模板 | P2 | ○ | 未实现 |
|
||||
| F05 静默规则 | P2 | ○ | 未开始 |
|
||||
|
||||
### M9 报表与对账 — ✅0 ◐5 ○1
|
||||
|
||||
| 功能点 | 优先级 | 当前状态 | 缺失内容 |
|
||||
|--------|--------|---------|---------|
|
||||
| F01 合同 SN 视图 | P1 | ◐ | 已上线, 数据维度待确认 |
|
||||
| F02 激活视图 | P1 | ○ | 未专门实现 |
|
||||
| F03 Callback 统计 | P1 | ◐ | 已上线 |
|
||||
| F04 导出按钮 | P1 | ◐ | 后端 `/export` 就绪, 前端缺按钮 |
|
||||
| F05 项目健康度 | P2 | ◐ | 已上线, 规则可配置性待确认 |
|
||||
| F06 订阅报表 | P2 | ◐ | 已上线, 推送逻辑待确认 |
|
||||
|
||||
### M10 审计与合规 — ✅1 ◐2 ○1
|
||||
|
||||
| 功能点 | 优先级 | 当前状态 | 缺失内容 |
|
||||
|--------|--------|---------|---------|
|
||||
| F02 审计检索 | P1 | ◐ | AuditSearchView ✅, 端点有 500 错误需调试 |
|
||||
| F03 审计导出 | P2 | ○ | 未实现 |
|
||||
| F04 留存策略 | P2 | ◐ | AuditRetentionView ✅ |
|
||||
|
||||
### M11 身份/访问/平台 — ✅7 ◐3 ○11
|
||||
|
||||
| 功能点 | 优先级 | 当前状态 | 缺失内容 |
|
||||
|--------|--------|---------|---------|
|
||||
| F03 空闲超时 | P0 | ◐ | 前端 idleTimer 已实现, 后端会话管理未完成 |
|
||||
| F05 失败锁定 | P0 | ✅ | 后端已有 5 次/15 分钟锁定 |
|
||||
| F07 密码修改 | P0 | ✅ | Profile 页弹窗+后端端点 |
|
||||
| F08 密码重置 | P1 | ✅ | 后端端点已实现(非空操作) |
|
||||
| F09 SSO/OIDC | P1 | ○ | 未开始 |
|
||||
| F11 并发会话 | P1 | ○ | 未开始(JWT 无状态) |
|
||||
| F12 强制下线 | P1 | ◐ | 端点已实现, 需前端 UI |
|
||||
| F14 用户管理 | P0 | ◐ | 表已创建, 管理页面未实现 |
|
||||
| F15 角色定义 | P0 | ◐ | 4 角色已落地, 产品定义 10+ 需补齐 |
|
||||
| F16 权限码 | P0 | ◐ | 路由级 ✅, 按钮级 `v-permission` 未全覆盖 |
|
||||
| F17 数据范围 | P2 | ○ | 未开始 |
|
||||
| F20 系统参数 | P1 | ◐ | SystemParamsView ✅, localStorage MVP |
|
||||
| F21 敏感操作留痕 | P1 | ○ | 未开始 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 已知 API 500 错误(需修复)
|
||||
|
||||
| 端点 | 影响模块 | 问题 |
|
||||
|------|---------|------|
|
||||
| `GET /api/v1/audit-events` | M10-F02 | 500 内部错误 |
|
||||
| `GET /api/v1/integration/id-mappings` | M6-F03 | 500 内部错误 |
|
||||
| `GET /api/v1/integration/feature-mappings` | M6-F04 | 500 内部错误 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 总结
|
||||
|
||||
| 版本 | PRD 范围 | 实现状态 |
|
||||
|------|---------|---------|
|
||||
| **MVP** (I1~I9) | M1-M6 P0 + M10-F01 + M11 基础 | ✅ 主链路已完成 |
|
||||
| **Mid** (I10~I13) | M7-M9 + P0补齐 + P1增强 | 🕐 M7/M8/M9 前端超前上线, 后端逻辑待补 |
|
||||
| **Full** (V2.0) | 安全/合规/规模化 | 📋 全部未开始 |
|
||||
|
||||
**当前最优先缺口:**
|
||||
1. 修复 3 个 500 错误 (audit-events, id-mappings, feature-mappings)
|
||||
2. M11-F14 用户管理页面 (表已就绪)
|
||||
3. M8-F03 通知发送实际对接
|
||||
@@ -0,0 +1,176 @@
|
||||
# UI 交互模式复盘 — 导航/弹框一致性 + 侧栏分组
|
||||
|
||||
**日期:** 2026-05-27
|
||||
**范围:** 全部 38 个 Vue 视图
|
||||
|
||||
---
|
||||
|
||||
## 1. 当前 CRUD 模式盘点
|
||||
|
||||
| 页面 | Create | Edit | Detail | 评估 |
|
||||
|------|--------|------|--------|------|
|
||||
| **客户管理** | 弹框 `el-dialog` | 弹框 | 独立页面 | ✅ 一致 |
|
||||
| **项目管理** | 弹框 `el-dialog` | 弹框 | 无独立详情(干系人管理在弹框) | ✅ 一致 |
|
||||
| **合同管理** | 向导页 `/contracts/new` | 详情页内编辑 | 独立详情页 | ✅ 合理(多步) |
|
||||
| **交付管理** | 向导页 `/deliveries/new` | 详情页内编辑 | 独立详情页 | ✅ 合理(多步) |
|
||||
| **许可 SN** | 向导页 `/licenses/sn/new` | 详情页内编辑 | 独立详情页 | ✅ 合理 |
|
||||
| **Callback** | 无(来源Webhook) | 详情页内操作 | 独立详情页 | ✅ |
|
||||
| **设备管理** | 弹框 | 详情页内编辑 | 独立详情页 | ✅ 一致 |
|
||||
| **用户管理** | 弹框 | 弹框 | 无独立详情 | ✅ 一致 |
|
||||
|
||||
### 结论:当前模式基本合理
|
||||
|
||||
| 场景 | 推荐模式 | 示例 |
|
||||
|------|---------|------|
|
||||
| **简单表单 (≤5 字段)** | **弹框** `el-dialog` | 客户、项目、设备、用户 |
|
||||
| **复杂表单/向导 (≥2 步)** | **独立页面** | 合同向导、交付向导、SN 向导 |
|
||||
| **详情展示** | **独立页面** | 合同详情、交付详情、SN 详情、设备详情 |
|
||||
| **关联数据管理** | **弹框** | 项目干系人、SN 批量导入、合同明细行 |
|
||||
|
||||
**不建议强行统一为弹框** — 合同向导有 3 步(选择客户项目→填写信息→明细行),用弹框会撑爆视口。
|
||||
|
||||
---
|
||||
|
||||
## 2. 发现的不一致问题
|
||||
|
||||
| # | 问题 | 当前行为 | 建议 |
|
||||
|---|------|---------|------|
|
||||
| 1 | **合同列表行操作** | 「详情」跳转详情页,无直接「编辑」入口 | 详情页支持编辑即可(已有) |
|
||||
| 2 | **交付列表行操作** | 同上 | 同上 |
|
||||
| 3 | **SN 列表行操作** | 同上 | 同上 |
|
||||
| 4 | **客户列表行操作** | 「详情」「编辑」「冻结」「删除」都在列表页 | ✅ 正确 |
|
||||
| 5 | **设备列表无编辑** | 只有「详情」→详情页编辑 | 详情页已支持编辑,可接受 |
|
||||
| 6 | **项目无独立详情页** | 编辑、干系人都在列表弹框 | 对于简单实体,弹框够用 ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 3. 侧栏分组实现方案
|
||||
|
||||
### 当前结构(扁平)
|
||||
|
||||
```
|
||||
📊 首页
|
||||
👥 客户管理
|
||||
📋 合同管理
|
||||
📦 交付管理
|
||||
🔑 许可 SN
|
||||
🛡️ 许可证管理
|
||||
📨 Callback 收件箱
|
||||
🌐 集成环境
|
||||
📱 产品线
|
||||
🖥️ 设备管理
|
||||
🔔 待办中心
|
||||
📊 报表中心
|
||||
📧 报表订阅
|
||||
👤 用户管理
|
||||
```
|
||||
|
||||
### 目标结构(三级分组)
|
||||
|
||||
```
|
||||
📊 首页
|
||||
──── 业务管理 ────
|
||||
👥 客户管理
|
||||
📋 合同管理
|
||||
📦 交付管理
|
||||
🔑 许可 SN
|
||||
🛡️ 许可证管理
|
||||
──── 运营管理 ────
|
||||
📨 Callback 收件箱
|
||||
🌐 集成环境
|
||||
📱 产品线
|
||||
🖥️ 设备管理
|
||||
🔔 待办中心
|
||||
──── 分析管理 ────
|
||||
📊 报表中心
|
||||
📧 报表订阅
|
||||
──── 系统管理 ────
|
||||
⚙️ 系统参数
|
||||
👤 用户管理
|
||||
🔐 审计日志
|
||||
```
|
||||
|
||||
### 实现方式
|
||||
|
||||
**方案:** 修改 `MainLayout.vue` 中的 `menuItems` 数组为分组结构,模板中循环渲染组。
|
||||
|
||||
#### Step 1: 改造 menuItems 数据结构
|
||||
|
||||
```javascript
|
||||
const menuGroups = [
|
||||
{
|
||||
label: '业务管理',
|
||||
items: [
|
||||
{ path: "/customers", icon: "👥", label: "客户管理", roles: ["SYS_ADMIN","SALES"] },
|
||||
{ path: "/contracts", icon: "📋", label: "合同管理", roles: ["SYS_ADMIN","SALES"] },
|
||||
{ path: "/deliveries", icon: "📦", label: "交付管理", roles: ["SYS_ADMIN","SALES","DELIVERY"] },
|
||||
{ path: "/licenses/sn", icon: "🔑", label: "许可 SN", roles: ["SYS_ADMIN","SALES"] },
|
||||
{ path: "/licenses", icon: "🛡️", label: "许可证管理", roles: ["SYS_ADMIN","SALES"] },
|
||||
]
|
||||
},
|
||||
{
|
||||
label: '运营管理',
|
||||
items: [
|
||||
{ path: "/callbacks", icon: "📨", label: "Callback 收件箱", roles: ["SYS_ADMIN","LICENSE_OPS"] },
|
||||
{ path: "/integration/environments", icon: "🌐", label: "集成环境", roles: ["SYS_ADMIN","SALES","LICENSE_OPS"] },
|
||||
{ path: "/integration/product-lines", icon: "📱", label: "产品线", roles: ["SYS_ADMIN","SALES","LICENSE_OPS"] },
|
||||
{ path: "/devices", icon: "🖥️", label: "设备管理", roles: ["SYS_ADMIN","SALES","DELIVERY"] },
|
||||
{ path: "/todos", icon: "🔔", label: "待办中心", roles: ["SYS_ADMIN","SALES","LICENSE_OPS"] },
|
||||
]
|
||||
},
|
||||
{
|
||||
label: '分析管理',
|
||||
items: [
|
||||
{ path: "/reports/contract-sn", icon: "📊", label: "报表中心", roles: ["SYS_ADMIN"] },
|
||||
{ path: "/reports/subscriptions", icon: "📧", label: "报表订阅", roles: ["SYS_ADMIN"] },
|
||||
]
|
||||
},
|
||||
{
|
||||
label: '系统管理',
|
||||
items: [
|
||||
{ path: "/audit", icon: "🔐", label: "审计日志", roles: ["SYS_ADMIN"] },
|
||||
{ path: "/admin/params", icon: "⚙️", label: "系统参数", roles: ["SYS_ADMIN"] },
|
||||
{ path: "/admin/users", icon: "👤", label: "用户管理", roles: ["SYS_ADMIN"] },
|
||||
]
|
||||
},
|
||||
];
|
||||
```
|
||||
|
||||
#### Step 2: 改造模板渲染
|
||||
|
||||
```html
|
||||
<aside class="app-sidebar">
|
||||
<div class="sidebar-section-label">📊 首页</div>
|
||||
<div class="sidebar-item" :class="{ active: isActive(homeItem) }" @click="$router.push(homeItem.path)">
|
||||
<span class="sidebar-item-icon">{{ homeItem.icon }}</span>
|
||||
<span class="sidebar-item-text">{{ homeItem.label }}</span>
|
||||
</div>
|
||||
|
||||
<template v-for="group in visibleGroups" :key="group.label">
|
||||
<div class="sidebar-group-label">{{ group.label }}</div>
|
||||
<div
|
||||
v-for="item in group.items"
|
||||
:key="item.path"
|
||||
:class="['sidebar-item', { active: isActive(item) }]"
|
||||
@click="$router.push(item.path)"
|
||||
>
|
||||
<span class="sidebar-item-icon">{{ item.icon }}</span>
|
||||
<span class="sidebar-item-text">{{ item.label }}</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div class="sidebar-footer">CraftLabs Platform v0.1.0</div>
|
||||
</aside>
|
||||
```
|
||||
|
||||
#### Step 3: CSS 调整
|
||||
|
||||
```css
|
||||
.sidebar-group-label {
|
||||
font-size: 11px;
|
||||
color: #999;
|
||||
padding: 12px 16px 4px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user