# 未修复问题记录 本文档记录 20260329 审查中发现的需要架构重构才能修复的问题。 --- ## 1. TOTP 恢复码删除非原子 **严重程度**: 中危 **文件**: `internal/service/auth_service.go` **问题描述**: 删除恢复码时使用循环逐个删除,存在并发安全问题。如果在删除过程中发生错误,已删除的恢复码无法恢复。 **当前代码**: ```go // 遍历删除每个恢复码 for _, code := range codes { if err := s.totpRepo.DeleteRecoveryCode(ctx, userID, code); err != nil { return err } } ``` **修复方案**: 需要使用数据库事务支持,将所有恢复码删除操作放在一个事务中完成。 **是否可快速修复**: 否,需要: - 确认 TotpRepository 接口是否支持事务 - 可能需要重构 repository 层以支持事务 - 需要全面的回归测试 --- ## 2. social_account_repo.go 使用原生 SQL 而非 GORM **严重程度**: 中危 **文件**: `internal/repository/social_account_repo.go` **问题描述**: 该仓库实现使用原生 SQL 而非 GORM ORM,与其他仓库实现不一致。 **影响**: - 代码风格不统一 - 无法利用 GORM 的高级特性(如自动迁移、软删除、钩子等) - 增加 SQL 注入风险(虽然当前代码使用了参数化查询,风险较低) **修复方案**: 重写为使用 GORM 的方式: ```go func (r *SocialAccountRepositoryImpl) Create(ctx context.Context, account *domain.SocialAccount) error { return r.db.WithContext(ctx).Create(account).Error } ``` **是否可快速修复**: 否,需要: - 大规模重构仓库实现 - 确保所有查询逻辑与现有 SQL 语义一致 - 更新相关测试 - 回归测试验证 --- ## 3. React 双重状态管理 **严重程度**: 中危 **文件**: `frontend/admin/src/app/providers/AuthProvider.tsx` **问题描述**: AuthProvider 同时使用 React useState 和模块级别的存储(getCurrentUser、setCurrentUser 等)来管理用户状态。这种双重管理增加了复杂性。 **当前设计**: ```typescript // React 状态 const [user, setUser] = useState(getCurrentUser()) // 模块级别存储(用于页面刷新后恢复状态) const effectiveUser = user ?? getCurrentUser() ``` **修复方案**: 两种选择 1. **移除模块存储**: 仅使用 React Context,完全依赖会话恢复 API 2. **移除 React 状态**: 完全依赖模块存储,移除 setUser 调用 **是否可快速修复**: 否,需要: - 评估对用户体验的影响(页面刷新后的状态恢复) - 确保所有状态更新路径正确 - 全面回归测试 --- ## 4. ProfileSecurityPage 状态管理 **严重程度**: 中危 **文件**: `frontend/admin/src/pages/admin/ProfileSecurityPage/ProfileSecurityPage.tsx` **问题描述**: 该页面管理约 20+ 个状态变量,导致代码复杂度和维护成本增加。 **当前状态变量**: - passwordLoading, avatarLoading, totpLoading - setupVisible, disableVisible, bindVisible, unbindVisible - totpCode, disableCode, totpEnabled, totpSetup - devicesLoading, devices, loginLogs, operationLogs, logsLoading - socialLoading, socialAccounts, oauthProviders - emailBindingEnabled, phoneBindingEnabled - socialSubmitting, activeProvider - 以及表单实例等 **修复方案**: 使用复合组件模式拆分: - `PasswordSection` - `AvatarSection` - `TOTPSection` - `ContactBindingsSection`(已存在) - `SocialAccountsSection` - `DevicesSection` - `LoginLogsSection` - `OperationLogsSection` **是否可快速修复**: 否,需要: - 重构页面组件结构 - 提取子组件 - 状态提升或使用状态管理库 - 全面回归测试 --- ## 修复优先级建议 | 问题 | 优先级 | 建议 | |------|--------|------| | TOTP 恢复码非原子 | 高 | 后续 sprint 修复 | | social_account_repo GORM 重构 | 中 | 技术债务,跟踪 | | React 双重状态管理 | 低 | 评估后决定 | | ProfileSecurityPage 重构 | 低 | 如需维护该页面则修复 | --- *文档创建日期: 2026-03-29* *来源: PROJECT_REVIEW_REPORT.md 审查报告*