- Mark social_account_repo GORM refactor as closed (2026-05-29) - Add closure entries for TOTP atomic consumption, AuthProvider state, ApiResponse nullability - Update REAL_PROJECT_STATUS with latest fix verification Refs: review-fix-closure-2026-05-28 documentation sync
111 lines
3.6 KiB
Markdown
111 lines
3.6 KiB
Markdown
# 未修复问题记录
|
||
|
||
本文档记录 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
|
||
|
||
**状态**: 已于 2026-05-29 关闭
|
||
**关闭方式**: `internal/repository/social_account_repo.go` 已重构为统一使用 `*gorm.DB`;Create / Update / Delete / 查询 / 分页均改为 GORM 实现,并通过仓库定向测试 + 全仓 `go test ./... -count=1` + `go vet ./...` + `go build ./cmd/server` 验证。
|
||
|
||
---
|
||
|
||
## 3. React 双重状态管理
|
||
|
||
**严重程度**: 中危
|
||
**文件**: `frontend/admin/src/app/providers/AuthProvider.tsx`
|
||
**问题描述**: AuthProvider 同时使用 React useState 和模块级别的存储(getCurrentUser、setCurrentUser 等)来管理用户状态。这种双重管理增加了复杂性。
|
||
|
||
**当前设计**:
|
||
```typescript
|
||
// React 状态
|
||
const [user, setUser] = useState<SessionUser | null>(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 重构 | 已关闭 | 2026-05-29 完成并验证 |
|
||
| React 双重状态管理 | 低 | 评估后决定 |
|
||
| ProfileSecurityPage 重构 | 低 | 如需维护该页面则修复 |
|
||
|
||
---
|
||
|
||
*文档创建日期: 2026-03-29*
|
||
*来源: PROJECT_REVIEW_REPORT.md 审查报告*
|