Files
user-system/.workbuddy/memory/MEMORY.md

12 KiB
Raw Blame History

项目长期记忆

项目概况

  • 项目类型用户管理系统UMS
  • 后端Go + internal/ 目录,已通过 go build/vet/test
  • 前端frontend/admin/React 18 + TypeScript + Vite + Ant Design 5

前端技术栈(唯一执行方案)

  • 框架React 18 + TypeScript严格模式
  • 路由React Router 6createBrowserRouter
  • UIAnt 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.tsrefresh_token 持久化到 localStorage
  • 401 处理:单次刷新机制 + 并发刷新锁refreshPromise
  • 路由守卫RequireAuthsrc/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),剩余风险主要在后端协议/真实联调,不再属于“前端缺页面”
  • 用户创建:前端已实现(UsersPageCreateUserModal),不再属于延期项
  • 批量操作:前端仍未实现
  • 系统设置页:前端仍未实现
  • 全局设备管理页:前端仍未实现;当前只有 ProfileSecurityPage 中的“我的设备”
  • 管理员管理页:前端仍未实现(虽然后端 API 已有)
  • 登录日志导出:前端仍未实现
  • 设备信任链路:前端已半接线;密码登录会提交设备字段,但 device_id 为随机值且邮箱/短信验证码登录不带设备信息,当前体验不可靠

代码审查

  • 代码审查标准:docs/code-review/CODE_REVIEW_STANDARD.mdv1.12026-04-01 更新)
  • PRD 差异验证报告:docs/code-review/PRD_GAP_VERIFICATION_REPORT.md2026-03-29 新增)
  • PRD 差异补充报告:docs/code-review/PRD_GAP_SUPPLEMENTAL_REPORT.md2026-03-29 新增)
  • 代码审查报告 03-30docs/code-review/CODE_REVIEW_REPORT_2026-03-30.md2026-03-30 新增)
  • 代码审查报告 03-31docs/code-review/CODE_REVIEW_REPORT_2026-03-31.md2026-03-31 新增,最终报告)
  • 最新审查报告:docs/code-review/CODE_REVIEW_REPORT_2026-04-01-V2.md2026-04-01第六次审查
  • PRD 缺口精确分析:docs/code-review/PRD_GAP_DESIGN_PLAN.md2026-04-01最新版
  • 最新综合验证报告:docs/code-review/VALIDATION_REPORT_2026-04-01.md2026-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-02SMS 密码重置): 已完整实现(此条可关闭)
  • GAP-03设备信任⚠️ 部分实现CRUD API 与部分登录接线已在,但设备标识不稳定且未覆盖所有登录方式
  • GAP-04CAS/SAML SSO PRD 标注"可选",推迟 v2.0
  • GAP-05/06异地/设备检测):⚠️ 部分实现AnomalyDetector 已注入 main.go但完整真实验收证据仍不足
  • GAP-07SDK 推迟 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 始终返回 trueoauth.go:445 已修复
  • SEC-02: 敏感操作验证绕过auth.go:1101 已修复
  • SEC-03: 恢复码明文存储auth.go:1119 已修复
  • SEC-04: TOTP 使用 SHA1totp.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.Backgroundwebhook.go:255 未修复
  • NEW-SEC-03: 邮件发送 goroutine context 问题auth_email.go:86 未修复

第三次审查结果2026-03-30

  • 检查问题修复状态
  • 修复率35%34 个问题中 12 个已修复)
  • 高危问题修复率75%8 个高危问题中 6 个已修复)
  • 剩余未修复:22 个2 个高危 + 5 个中危 + 15 个低危)

创建的文档

  1. docs/code-review/CODE_REVIEW_STANDARD.md - 代码审查标准与流程规范
  2. docs/code-review/PRD_GAP_VERIFICATION_REPORT.md - PRD 差异验证报告(第一次)
  3. docs/code-review/PRD_GAP_SUPPLEMENTAL_REPORT.md - PRD 差异补充报告(第二次)
  4. docs/code-review/CODE_REVIEW_REPORT_2026-03-30.md - 代码审查报告(第三次,含修复状态)

执行计划文档

docs/plans/ADMIN_FRONTEND_EXECUTION_PLAN.md — 唯一有效执行方案,任何实现以此为准

2026-03-22 系统性修复完成全部10个问题已修复

后端修复

  1. 登录日志auth.go 注入 loginLogRepoLogin()/LoginByCode()/LoginByEmailCode() 均写入 login_logs成功+失败)
  2. 权限数据db.go initDefaultData() 增加 createDefaultPermissions()新装自动初始化17个权限旧库通过 ensurePermissions() 升级补种
  3. CSRF 端点GET /api/v1/auth/csrf-token 已实现返回随机32位hex token
  4. 管理员增删:新增 GET/POST /api/v1/admin/adminsDELETE /api/v1/admin/admins/:id;防止删除自身和最后一个管理员
  5. bootstrap 健壮化admin.nickname 设为"系统管理员",角色权限绑定完整

前端修复

  1. RequireAdmin 守卫:加入 isLoading 检查,会话恢复中返回 null 防止误跳转
  2. 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: adminpassword: Admin@123456config.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) 优化:

  1. SanitizeSQL/SanitizeXSS - 改用正则表达式替代简单字符串替换,增强安全防护
  2. IP 验证 - 使用 net.ParseIP 支持所有 IPv6 格式(包括压缩格式 ::1, fe80::1 等)
  3. OAuth 用户名生成 - 添加唯一性检查和冲突处理最多100次重试
  4. LIKE 搜索 - 添加 escapeLikePattern 转义 % 和 _ 特殊字符
  5. 权限检查 N+1 查询 - 添加批量查询方法替代循环查询
  6. JWT JTI - 改用 crypto/rand 生成密码学安全的随机数

前端 (React) 优化:

  1. HTTP 请求超时 - 添加 30 秒超时控制,使用 AbortController
  2. App.tsx - 删除未使用的 Vite 模板文件
  3. CSRF 保护 - 添加 CSRF Token 管理模块和保护机制

新增文件:

  • frontend/admin/src/lib/http/csrf.ts - CSRF Token 管理模块

新增 Repository 批量查询方法:

  • role.GetByIDs() - 批量获取角色
  • permission.GetByIDs() - 批量获取权限
  • rolePermission.GetPermissionIDsByRoleIDs() - 批量获取权限ID

2026-03-22 前端问题修复与团队技术提升

修复的前端问题

  1. CSS语法错误: tokens.css::root 应为 :root
  2. CSS伪元素错误: global.css:::-webkit-scrollbar 应为 ::-webkit-scrollbar
  3. 循环依赖: csrf.tsclient.ts 相互导入
  4. 字段名不匹配: CSRF Token 字段 token vs csrf_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不统一筛选区域、表格样式、空状态等不一致
  • 解决方案:
    1. 创建统一布局组件:PageLayout, FilterCard, TableCard, TreeCard, ContentCard
    2. 改造所有管理页面使用统一布局组件
    3. 统一空状态组件使用 PageEmpty
  • 改造页面: UsersPage, RolesPage, PermissionsPage, DashboardPage, LoginLogsPage, OperationLogsPage, WebhooksPage, ImportExportPage, ProfilePage, ProfileSecurityPage
  • 验证: 构建通过5/5单元测试通过