237 lines
10 KiB
Markdown
237 lines
10 KiB
Markdown
|
|
# 专家全面验证报告 - 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**,离“可诚实宣称全面收口”只差最后几个硬点。
|