12 KiB
12 KiB
项目长期记忆
项目概况
- 项目类型:用户管理系统(UMS)
- 后端:Go +
internal/目录,已通过go build/vet/test - 前端:
frontend/admin/,React 18 + TypeScript + Vite + Ant Design 5
前端技术栈(唯一执行方案)
- 框架:React 18 + TypeScript(严格模式)
- 路由:React Router 6(createBrowserRouter)
- UI:Ant Design 5
- 请求:浏览器原生 fetch,自建
lib/http/client.ts - 状态:React Context(仅会话),不引入 Redux/Zustand
- 构建:Vite(配置文件为 vite.config.js,非 .ts)
关键架构决策
- AuthProvider 必须在 RootLayout.tsx 中包裹(在 Router 内部),否则 useNavigate/useLocation 报错
- access_token 保存在内存(auth-session.ts),refresh_token 持久化到 localStorage
- 401 处理:单次刷新机制 + 并发刷新锁(refreshPromise)
- 路由守卫:RequireAuth(src/components/guards/)+ RequireAdmin
前后端联调评审机制(2026-04-01 新增)
- 评审流程:
docs/processes/FRONTEND_BACKEND_REVIEW.md - 检查清单:
docs/checklists/FRONTEND_BACKEND_CHECKLIST.md - 覆盖范围: API 接口、认证授权、业务逻辑、性能、安全、错误处理、兼容性、测试、文档、部署、上线前检查
- 问题分级: P0(立即修复 4h)、P1(当天修复)、P2(本周修复)、P3(下 Sprint 处理)
- 通过标准: 所有 P0/P1 问题已解决,测试通过率 ≥ 95%,性能达标,安全测试通过
前端完成状态(2026-03-21 核查)
✅ 全部 13 个页面已实现,构建通过,5/5 单元测试通过
前端缺口与延期项(2026-04-01 前端核查后修正)
- 社交登录/绑定:前端 UI 已实现(
LoginPage+OAuthCallbackPage+ProfileSecurityPage),剩余风险主要在后端协议/真实联调,不再属于“前端缺页面” - 用户创建:前端已实现(
UsersPage内CreateUserModal),不再属于延期项 - 批量操作:前端仍未实现
- 系统设置页:前端仍未实现
- 全局设备管理页:前端仍未实现;当前只有
ProfileSecurityPage中的“我的设备” - 管理员管理页:前端仍未实现(虽然后端 API 已有)
- 登录日志导出:前端仍未实现
- 设备信任链路:前端已半接线;密码登录会提交设备字段,但
device_id为随机值且邮箱/短信验证码登录不带设备信息,当前体验不可靠
代码审查
- 代码审查标准:
docs/code-review/CODE_REVIEW_STANDARD.md(v1.1,2026-04-01 更新) - PRD 差异验证报告:
docs/code-review/PRD_GAP_VERIFICATION_REPORT.md(2026-03-29 新增) - PRD 差异补充报告:
docs/code-review/PRD_GAP_SUPPLEMENTAL_REPORT.md(2026-03-29 新增) - 代码审查报告 03-30:
docs/code-review/CODE_REVIEW_REPORT_2026-03-30.md(2026-03-30 新增) - 代码审查报告 03-31:
docs/code-review/CODE_REVIEW_REPORT_2026-03-31.md(2026-03-31 新增,最终报告) - 最新审查报告:
docs/code-review/CODE_REVIEW_REPORT_2026-04-01-V2.md(2026-04-01,第六次审查) - PRD 缺口精确分析:
docs/code-review/PRD_GAP_DESIGN_PLAN.md(2026-04-01,最新版) - 最新综合验证报告:
docs/code-review/VALIDATION_REPORT_2026-04-01.md(2026-04-01,测试专家 + 用户专家双视角) - 代码审查评分:9.0/10(聚焦代码质量与存量问题)
- 最新综合验证评分:8.4/10(受前端测试失败与 E2E 主链路复跑失败影响)
- 🔴 阻塞级问题(0个):上轮 2 个阻塞已全部修复
- 🟡 建议级问题(2个):R6-01 recordDelivery context.Background、R6-02 SlidingWindowLimiter 清理死代码
- 💭 挑剔级问题(1个):stats N+5 查询
- 历史问题修复率:82%(↑8.5%)
- 最新验证状态:后端 go vet/build/test 通过;前端 lint/build 通过;Vitest 仍有 3 个失败点;
e2e:full:win本轮卡在后端健康检查未就绪
PRD 缺口精确状态(2026-04-01 逐行核查后更新)
- GAP-01(角色继承):⚠️ 部分实现;角色层级、继承权限汇总、UpdateRole 循环检测已在代码中,仍需补足按 PRD 口径的边界验证与真实验收证据
- GAP-02(SMS 密码重置):✅ 已完整实现(此条可关闭)
- GAP-03(设备信任):⚠️ 部分实现;CRUD API 与部分登录接线已在,但设备标识不稳定且未覆盖所有登录方式
- GAP-04(CAS/SAML SSO):❌ PRD 标注"可选",推迟 v2.0
- GAP-05/06(异地/设备检测):⚠️ 部分实现;AnomalyDetector 已注入 main.go,但完整真实验收证据仍不足
- GAP-07(SDK):❌ 推迟 v2.0
- 密码历史记录:✅ 已接线(repository、service、main 注入链路均已到位)
2026-03-29 PRD 差异验证与代码审查标准制定
第一次审查结果
- 验证了 PRD_IMPLEMENTATION_GAP_ANALYSIS.md 文档中的 34 个问题
- 确认准确率:82%(28 个完全确认,4 个部分确认,2 个已修复)
第二次深度审查结果
- 再次验证 PRD 文档中的 34 个问题
- 确认准确率:97%(33 个完全确认,1 个位置描述有误)
- 新发现问题:8 个(2 个高危、1 个中危、5 个低危)
新增安全问题确认(修复状态)
- SEC-01: OAuth ValidateToken 始终返回 true(oauth.go:445)✅ 已修复
- SEC-02: 敏感操作验证绕过(auth.go:1101)✅ 已修复
- SEC-03: 恢复码明文存储(auth.go:1119)✅ 已修复
- SEC-04: TOTP 使用 SHA1(totp.go:25)❌ 未修复
- SEC-05: X-Forwarded-For IP 伪造风险(ip_filter.go:50)✅ 已修复
- SEC-06: JTI 包含可预测时间戳(jwt.go:65)❌ 未修复
- SEC-07: OAuth State TOCTOU 竞态(oauth_utils.go:43-62)✅ 已修复
- SEC-08: refresh 接口无限流(router.go:108)❌ 未修复
- NEW-SEC-01: Webhook SSRF 风险(webhook.go:181)✅ 已修复
- NEW-SEC-02: Webhook 使用 context.Background(webhook.go:255)❌ 未修复
- NEW-SEC-03: 邮件发送 goroutine context 问题(auth_email.go:86)❌ 未修复
第三次审查结果(2026-03-30)
- 检查问题修复状态
- 修复率:35%(34 个问题中 12 个已修复)
- 高危问题修复率:75%(8 个高危问题中 6 个已修复)
- 剩余未修复:22 个(2 个高危 + 5 个中危 + 15 个低危)
创建的文档
docs/code-review/CODE_REVIEW_STANDARD.md- 代码审查标准与流程规范docs/code-review/PRD_GAP_VERIFICATION_REPORT.md- PRD 差异验证报告(第一次)docs/code-review/PRD_GAP_SUPPLEMENTAL_REPORT.md- PRD 差异补充报告(第二次)docs/code-review/CODE_REVIEW_REPORT_2026-03-30.md- 代码审查报告(第三次,含修复状态)
执行计划文档
docs/plans/ADMIN_FRONTEND_EXECUTION_PLAN.md — 唯一有效执行方案,任何实现以此为准
2026-03-22 系统性修复完成(全部10个问题已修复)
后端修复
- 登录日志:
auth.go注入loginLogRepo,Login()/LoginByCode()/LoginByEmailCode()均写入 login_logs(成功+失败) - 权限数据:
db.go initDefaultData()增加createDefaultPermissions(),新装自动初始化17个权限;旧库通过ensurePermissions()升级补种 - CSRF 端点:
GET /api/v1/auth/csrf-token已实现,返回随机32位hex token - 管理员增删:新增
GET/POST /api/v1/admin/admins和DELETE /api/v1/admin/admins/:id;防止删除自身和最后一个管理员 - bootstrap 健壮化:admin.nickname 设为"系统管理员",角色权限绑定完整
前端修复
- RequireAdmin 守卫:加入
isLoading检查,会话恢复中返回 null 防止误跳转 - download/upload Token 刷新:完整实现 Token 过期自动刷新 + 401 重试流程
数据库状态(2026-03-22 修复后)
- login_logs: 11条(成功5条 + 失败6条,测试期间产生)
- permissions: 17条,role_permissions: 20条(admin:17 + user:3)
- users: 2条,roles: 2条(均正常)
默认管理员
- username:
admin,password:Admin@123456(config.yaml 中配置) - 注意:数据库密码哈希需要通过
go run reset_admin_pwd.go重置后才能匹配
2026-03-22 功能测试完成
API 测试结果(17项测试)
| # | 测试项 | 结果 |
|---|---|---|
| 1 | 管理员登录 | ✅ 通过 |
| 2 | CSRF Token 获取 | ✅ 通过 |
| 3 | 当前用户信息 | ✅ 通过 |
| 4 | 管理员列表 | ✅ 通过 |
| 5 | 权限列表(17项) | ✅ 通过 |
| 6 | 用户列表 | ✅ 通过 |
| 7 | 角色列表 | ✅ 通过 |
| 8 | 登录日志 | ✅ 通过 |
| 9 | 无效密码拒绝 | ✅ 通过 |
| 10 | 未认证访问拒绝 | ✅ 通过 |
| 11 | 创建新管理员 | ✅ 通过 |
| 12 | 新管理员登录 | ⚠️ 需要用户名匹配 |
| 13 | 权限受限测试 | ⚠️ 依赖上一项 |
| 14 | 删除新管理员 | ✅ 通过 |
| 15 | 防止删除自己 | ✅ 通过 |
| 16 | 密码修改 | ✅ 通过 |
| 17 | 权限树 | ✅ 通过 |
关键API路由
- 登录:
POST /api/v1/auth/login(参数: account, password) - CSRF:
GET /api/v1/auth/csrf-token - 用户信息:
GET /api/v1/auth/userinfo - 管理员管理:
/api/v1/admin/admins - 用户管理:
/api/v1/users - 角色管理:
/api/v1/roles - 权限管理:
/api/v1/permissions - 登录日志:
/api/v1/logs/login
2026-03-21 安全与质量优化
后端 (Go) 优化:
- SanitizeSQL/SanitizeXSS - 改用正则表达式替代简单字符串替换,增强安全防护
- IP 验证 - 使用 net.ParseIP 支持所有 IPv6 格式(包括压缩格式 ::1, fe80::1 等)
- OAuth 用户名生成 - 添加唯一性检查和冲突处理(最多100次重试)
- LIKE 搜索 - 添加 escapeLikePattern 转义 % 和 _ 特殊字符
- 权限检查 N+1 查询 - 添加批量查询方法替代循环查询
- JWT JTI - 改用 crypto/rand 生成密码学安全的随机数
前端 (React) 优化:
- HTTP 请求超时 - 添加 30 秒超时控制,使用 AbortController
- App.tsx - 删除未使用的 Vite 模板文件
- CSRF 保护 - 添加 CSRF Token 管理模块和保护机制
新增文件:
frontend/admin/src/lib/http/csrf.ts- CSRF Token 管理模块
新增 Repository 批量查询方法:
role.GetByIDs()- 批量获取角色permission.GetByIDs()- 批量获取权限rolePermission.GetPermissionIDsByRoleIDs()- 批量获取权限ID
2026-03-22 前端问题修复与团队技术提升
修复的前端问题
- CSS语法错误:
tokens.css中::root应为:root - CSS伪元素错误:
global.css中:::-webkit-scrollbar应为::-webkit-scrollbar - 循环依赖:
csrf.ts与client.ts相互导入 - 字段名不匹配: CSRF Token 字段
tokenvscsrf_token
创建的文档
docs/team/QUALITY_STANDARD.md- 团队代码质量标准docs/team/PRODUCTION_CHECKLIST.md- 生产环境全面验证清单docs/team/TECHNICAL_GUIDE.md- 技术能力提升指南docs/team/FIX_REPORT_2026-03-22.md- 本次修复报告
验证结果
- ✅ 构建通过
- ✅ ESLint通过
- ✅ 5/5单元测试通过
- ✅ TypeScript检查通过
2026-03-22 第三次修复
- 再次修复CSS语法错误(文件被恢复)
- 合并AdminLayout.module.css中重复的CSS规则
- 添加pointer-events确保菜单可点击
2026-03-22 菜单点击问题最终解决
- 根本原因: Ant Design Menu组件的openKeys(受控模式)与CSS样式冲突
- 解决方案: 改为defaultOpenKeys(非受控模式)+ 内联pointer-events样式
- 额外修复:
- React Router警告:添加v7_startTransition配置
- Ant Design警告:destroyOnClose改为destroyOnHidden
- 验证: 菜单点击正常,控制台警告消除
2026-03-22 router.tsx文件重复问题
- 问题: 刷新后出现500错误,router.tsx文件内容重复
- 原因: replace_in_file操作不当导致内容重复插入
- 解决: 重写router.tsx文件,删除重复内容
- 教训: 使用replace_in_file时要确保不会插入重复内容
2026-03-22 UI一致性系统性修复
- 问题: 前端页面UI不统一,筛选区域、表格样式、空状态等不一致
- 解决方案:
- 创建统一布局组件:
PageLayout,FilterCard,TableCard,TreeCard,ContentCard - 改造所有管理页面使用统一布局组件
- 统一空状态组件使用
PageEmpty
- 创建统一布局组件:
- 改造页面: UsersPage, RolesPage, PermissionsPage, DashboardPage, LoginLogsPage, OperationLogsPage, WebhooksPage, ImportExportPage, ProfilePage, ProfileSecurityPage
- 验证: 构建通过,5/5单元测试通过