Files
user-system/docs/code-review/VALIDATION_REPORT_2026-04-01.md

237 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 专家全面验证报告 - 2026-04-01
**验证日期**2026-04-01
**验证对象**UMS 用户管理系统(后端 Go + 前端 React/TypeScript
**验证视角**:测试专家 / 用户专家
**验证依据**`AGENTS.md``docs/code-review/CODE_REVIEW_STANDARD.md``docs/code-review/PRD_GAP_DESIGN_PLAN.md`、实际命令执行结果、关键代码复核
---
## 一、执行摘要
本轮按“测试专家 + 用户专家”双视角对项目做了全面复核,结论如下:
-**后端基础质量稳定**`go vet ./...``go build ./cmd/server``go test ./... -count=1` 本轮均通过
-**前端静态质量稳定**`npm run lint``npm run build` 本轮通过
- ⚠️ **前端单元测试仍不完全稳定**Vitest 全量执行仍有 3 个失败点,属于当前真实阻塞项之一
-**真实浏览器主验收链路本轮未重跑通过**`cd frontend/admin && npm.cmd run e2e:full:win` 在后端就绪阶段失败,当前不能把“本轮浏览器级真实 E2E 已重新验证闭环”作为结论输出
-**历史 PRD 缺口判断被进一步纠偏**:此前若干“未实现”项经逐文件核查后被修正为“已实现”或“部分实现”
- ⚠️ **用户侧仍有可见缺口**:管理员管理页、系统设置页、全局设备管理页、登录日志导出仍未交付
- ⚠️ **安全与工程尾项仍存在**`webhook.go``recordDelivery` 仍使用 `context.Background()`;邮件发送 goroutine 的上下文治理仍不理想
### 综合评分
**8.4 / 10**
这不是“不能用”,而是“核心链路大体可用,但还不能把当前仓库状态包装成完全收口”。
---
## 二、测试专家验证结果
### 2.1 命令级验证结果
| 分类 | 命令 | 结果 | 说明 |
|------|------|------|------|
| 后端静态检查 | `go vet ./...` | ✅ 通过 | 未见新的 vet 阻塞 |
| 后端构建 | `go build ./cmd/server` | ✅ 通过 | 服务端可成功编译 |
| 后端测试 | `go test ./... -count=1` | ✅ 通过 | 41 个包通过 |
| 前端 lint | `cd frontend/admin && npm.cmd run lint` | ✅ 通过 | 无 lint 阻塞 |
| 前端构建 | `cd frontend/admin && npm.cmd run build` | ✅ 通过 | 构建成功 |
| 前端单测 | `cd frontend/admin && npm.cmd test -- --run` | ⚠️ 失败 | 仍有 3 个失败点 |
| 前端覆盖率 | `cd frontend/admin && npm.cmd run test:coverage` | ⚠️ 失败 | 被同一批失败测试阻断 |
| 真实浏览器 E2E | `cd frontend/admin && npm.cmd run e2e:full:win` | ❌ 失败 | 后端未在 `/health` 就绪 |
### 2.2 当前不能夸大的边界
根据 `AGENTS.md`,项目当前唯一受支持的真实浏览器主验收路径是:
```bash
cd frontend/admin && npm.cmd run e2e:full:win
```
本轮该命令**没有跑通**,因此本报告只能诚实地说:
- 仓库具备较高完成度
- 后端构建 / 测试可信
- 前端 lint / build 可信
- 但**本轮不能把真实浏览器主链路闭环当作复核完成项重复宣称**
### 2.3 前端测试失败现状
本轮识别到的前端测试问题主要包括:
1. `UserDetailDrawer.test.tsx`:对 `console.error` 的预期与实际错误呈现路径不一致
2. `UsersPage.test.tsx`:存在 `act()` 警告与超时问题
3. `ContactBindingsSection.test.tsx`Ant Design `addonAfter` 弃用警告相关噪音
结论:这些问题更像**测试稳定性 / 测试实现质量问题**,而不是已经确认的线上功能崩坏,但它们确实阻断了“当前前端测试全绿”的结论。
### 2.4 安全问题复核
| 问题 | 本轮状态 | 结论 |
|------|----------|------|
| SEC-04 TOTP 使用 SHA1 | ✅ 已修复 | 已切到 SHA256 |
| SEC-06 JTI 含时间戳 | ✅ 已修复 | 已改为 `crypto/rand` 纯随机 |
| SEC-08 refresh 无限流 | ✅ 已修复 | refresh 路由已挂限流中间件 |
| NEW-SEC-01 Webhook SSRF | ✅ 已修复 | 安全 URL 校验已在链路中 |
| NEW-SEC-02 Webhook `context.Background()` | ❌ 未修复 | `recordDelivery` 仍直接用 `context.Background()` |
| NEW-SEC-03 邮件 goroutine ctx | ⚠️ 部分风险 | 仍需明确 goroutine 生命周期与上下文策略 |
### 2.5 PRD / 架构差距复核结论(测试专家视角)
本轮对历史“缺口”做了逐文件核查,得到更精确的代码级结论:
| Gap | 本轮结论 | 说明 |
|-----|----------|------|
| GAP-01 角色继承 | ⚠️ 部分实现 | 角色层级与循环检测已实现;权限链路已接入继承,但整体仍需从 PRD 口径继续补齐边界验证 |
| GAP-02 SMS 密码重置 | ✅ 已实现 | Service / Handler / 路由均存在,且接口未回传明文验证码 |
| GAP-03 设备信任 | ⚠️ 部分实现 | CRUD 与部分登录接线已在,但跨登录方式一致性不足,前端设备标识不稳定 |
| GAP-04 CAS/SAML | ❌ 未实现 | PRD 标注可选,建议放 v2.0 |
| GAP-05 异地登录检测 | ⚠️ 部分实现 | `AnomalyDetector` 已注入,但真实验收证据不足 |
| GAP-06 异常设备检测 | ⚠️ 部分实现 | 检测逻辑存在,但设备指纹稳定性与全链路证据不足 |
| GAP-07 SDK | ❌ 未实现 | 可延期,不影响当前管理后台主链路 |
| 密码历史记录 | ✅ 已接线 | repository、service、main 注入链路已到位 |
### 2.6 E2E 失败的当前判断
本轮 E2E 在后端健康检查阶段失败,现象为后端进程未在预期时间内变为 ready。
当前只能给出**审慎判断**
- 问题更接近测试环境启动 / 配置覆盖链路,而不是直接证明业务主流程已损坏
- 初步怀疑点包括配置项环境变量映射、测试数据库或依赖启动时的参数覆盖
- 在没有把 `e2e:full:win` 重新跑绿之前,不能把“真实浏览器验收闭环”继续作为当前轮次的完成结论
---
## 三、用户专家验证结果
### 3.1 页面 / 路由完整度
本轮复核确认:前端并不是“只有半成品骨架”,实际已经具备较完整的后台管理界面。
#### 已存在的主要页面
- DashboardPage
- UsersPage
- RolesPage
- PermissionsPage
- LoginLogsPage
- OperationLogsPage
- WebhooksPage
- ImportExportPage
- ProfilePage
- ProfileSecurityPage
- LoginPage
- RegisterPage
- BootstrapAdminPage
- ActivateAccountPage
- OAuthCallbackPage
- ForgotPasswordPage
- ResetPasswordPage
#### 仍缺失的用户可见页面 / 能力
1. **管理员管理页**
2. **系统设置页**
3. **全局设备管理页**(目前只有“我的设备”局部能力)
4. **登录日志导出**
5. **批量操作**(用户管理的效率功能)
### 3.2 用户主流程体验判断
| 流程 | 结论 | 说明 |
|------|------|------|
| 管理员登录 | ✅ 基本可用 | 认证、路由守卫、会话恢复链路齐备 |
| 后台主导航 | ✅ 基本可用 | 路由与菜单主体已建成 |
| 用户创建 | ✅ 已有入口 | `UsersPage` 内已有 `CreateUserModal` |
| 社交登录 / 绑定 UI | ✅ 已有 | 登录页、回调页、安全页均有相关界面 |
| 个人安全中心 | ✅ 功能较完整 | 含 TOTP、设备、绑定信息等 |
| 设备信任体验 | ⚠️ 体验不稳定 | 仅密码登录上传设备字段,`device_id` 仍是随机值 |
| Webhooks 查询体验 | ⚠️ 语义不准 | 当前页前端过滤 + 服务端分页的混合模式不严谨 |
### 3.3 PRD 对齐修正(用户专家视角)
本轮纠正了几个容易误判的点:
- **社交登录 / 绑定不是前端缺页**UI 已存在
- **用户创建不是前端缺页**,只是批量操作仍缺
- **设备指纹并非完全没有**,但目前实现不稳定,且未覆盖所有登录方式
- **前端当前的主要问题不是“页面都没做”,而是“少数关键管理能力仍缺 + 若干链路没做到完整闭环”**
### 3.4 禁止性 API 核查
本轮用户专家复核未发现项目将以下 API 作为正常业务交互路径保留:
- `window.alert`
- `window.confirm`
- `window.prompt`
- `window.open`
这点符合 `AGENTS.md` 对前端交互防线的要求。
---
## 四、综合结论
### 4.1 当前项目真实状态
这个项目当前更接近下面这个判断:
> **后端能力比较完整前端主后台已经成型代码质量总体在可控范围内但“自动化验证闭环”和“PRD 最后一公里”还没有完全收口。**
如果只看代码实现度,项目已经不低;如果按“可审计、可重复、可对外诚实宣称”的标准看,当前还差最后几步:
- 前端全量测试恢复稳定
- `e2e:full:win` 主链路重新跑通
- 补齐 4 个高可见度后台缺口
- 清掉 2 个剩余安全 / 工程尾项
### 4.2 本轮最重要的 6 个结论
1. **后端 go vet / build / test 全绿,可信度较高**
2. **前端 lint / build 全绿,但单测与覆盖率未全绿**
3. **真实浏览器主验收命令本轮失败,不能重复宣称浏览器级复核闭环**
4. **历史多个“未实现”结论已被纠偏,项目真实完成度高于旧报告印象**
5. **用户侧最大的真实缺口是后台页面与完整管理能力,而不是基础框架缺失**
6. **剩余问题数量已经不多,但都卡在“能不能诚实收口”的关键位置上**
---
## 五、优先级建议
### P0必须优先收口
1. 修复 `e2e:full:win` 启动失败,恢复真实浏览器主验收
2. 修复当前 3 个前端失败测试,恢复前端测试链路可信性
### P1应在当前迭代解决
3. 修复 `internal/service/webhook.go``recordDelivery``context.Background()` 问题
4. 明确 `auth_email.go` goroutine 的上下文与生命周期治理
5. 补齐管理员管理页 / 系统设置页 / 全局设备管理页 / 登录日志导出
### P2下一轮持续优化
6. 收口设备信任链路,统一所有登录方式的设备标识采集
7. 修正 `WebhooksPage` 查询语义
8. 清理统计查询 N+1 与恢复码恒定时间比较等尾项
---
## 六、建议对外表述
当前最稳妥、最诚实的对外表达应为:
- **可以说**:后端构建测试稳定,前端后台主体已成型,仓库已形成较完整的一轮治理证据
- **不建议说**:当前版本已经“全部闭环”“完全收口”“真实浏览器验证已再次全面通过”
---
## 七、最终结论
**测试专家结论**:项目具备较高工程完成度,但当前轮次还不能把“前端测试全绿 + 真实浏览器主验收闭环”当成事实。
**用户专家结论**:后台主流程基本成型,核心页面多数已具备,但还有少数高感知管理能力未补齐。
**总评****8.4 / 10**,离“可诚实宣称全面收口”只差最后几个硬点。