docs: project docs, scripts, deployment configs, and evidence
This commit is contained in:
540
docs/reviews/TECH_EXPERT_REVIEW.md
Normal file
540
docs/reviews/TECH_EXPERT_REVIEW.md
Normal file
@@ -0,0 +1,540 @@
|
||||
# 技术专家评审报告
|
||||
|
||||
**评审日期**: 2026-04-01
|
||||
**评审类型**: 架构和代码质量全面评审
|
||||
**评审范围**: 后端Go架构 + 前端React架构 + 前后端集成
|
||||
**技术专家**: 高级项目经理代理
|
||||
**基于文档**: CODE_REVIEW_REPORT_2026-04-01-V2.md + PRD_GAP_DESIGN_PLAN.md
|
||||
|
||||
---
|
||||
|
||||
## 一、评审概述
|
||||
|
||||
### 1.1 项目技术栈
|
||||
|
||||
**后端技术栈**
|
||||
- 语言: Go 1.x
|
||||
- 架构: Domain/Repository/Service/Handler 分层架构
|
||||
- 数据库: MySQL (支持事务)
|
||||
- 认证: JWT + OAuth2 + TOTP
|
||||
- 限流: 滑动窗口限流
|
||||
|
||||
**前端技术栈**
|
||||
- 框架: React 18 + TypeScript (严格模式)
|
||||
- 路由: React Router 6 (createBrowserRouter)
|
||||
- UI: Ant Design 5
|
||||
- 请求: 浏览器原生 fetch + 自建HTTP客户端
|
||||
- 状态: React Context (仅会话)
|
||||
- 构建: Vite (vite.config.js)
|
||||
|
||||
### 1.2 评审范围
|
||||
- [x] 后端架构设计
|
||||
- [x] 前端架构设计
|
||||
- [x] API设计规范性
|
||||
- [x] 数据库设计和migration
|
||||
- [x] 代码质量和可维护性
|
||||
- [x] 技术债务识别
|
||||
|
||||
### 1.3 评审结论统计
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 技术专家评审结论 │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 代码质量: ✅ 9.0/10 │
|
||||
│ 架构设计: ✅ 8.5/10 │
|
||||
│ 性能优化: ⚠️ 7.5/10 │
|
||||
│ 可测试性: ✅ 8.0/10 │
|
||||
│ 技术债务: ⚠️ 7.0/10 │
|
||||
│ │
|
||||
│ 总体评分: ✅ 8.0/10 │
|
||||
│ │
|
||||
│ 问题统计: │
|
||||
│ - P0问题: 0个 │
|
||||
│ - P1问题: 2个 │
|
||||
│ - P2问题: 3个 │
|
||||
│ - P3问题: 4个 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**总体评审结论**: ✅ 通过(有条件,需修复P1问题)
|
||||
|
||||
---
|
||||
|
||||
## 二、架构评估
|
||||
|
||||
### 2.1 架构优点
|
||||
|
||||
#### 后端架构(Domain/Repository/Service/Handler)
|
||||
|
||||
**✅ 优秀的设计模式**
|
||||
- 清晰的分层架构,职责分明
|
||||
- Repository层负责数据访问,Service层负责业务逻辑
|
||||
- Handler层负责HTTP处理,各层边界清晰
|
||||
- 接口设计合理,依赖注入良好
|
||||
|
||||
**✅ 代码组织良好**
|
||||
```
|
||||
internal/
|
||||
├── domain/ # 领域模型
|
||||
├── repository/ # 数据访问层
|
||||
├── service/ # 业务逻辑层
|
||||
├── api/handler/ # HTTP处理层
|
||||
└── api/middleware/ # 中间件
|
||||
```
|
||||
|
||||
**✅ 质量保证完善**
|
||||
- `go vet ./...` 无报错
|
||||
- `go build ./cmd/server` 通过
|
||||
- `go test ./...` 全部通过
|
||||
- 代码审查标准完善(CODE_REVIEW_STANDARD.md)
|
||||
|
||||
#### 前端架构
|
||||
|
||||
**✅ 技术栈选择合理**
|
||||
- React 18 + TypeScript 严格模式,类型安全
|
||||
- React Router 6 最新版本,路由设计现代化
|
||||
- Ant Design 5 企业级UI组件库,成熟稳定
|
||||
- Vite 构建工具,开发体验优秀
|
||||
|
||||
**✅ 状态管理简洁**
|
||||
- 仅使用React Context管理会话状态
|
||||
- 未引入Redux/Zustand等复杂状态管理,避免过度设计
|
||||
- 双重状态管理(AuthProvider设计)有明确注释说明
|
||||
|
||||
**✅ 组件化程度高**
|
||||
- 统一布局组件(PageLayout, FilterCard, TableCard等)
|
||||
- 可复用的空状态组件(PageEmpty)
|
||||
- 组件结构清晰,易于维护
|
||||
|
||||
### 2.2 架构缺点
|
||||
|
||||
#### 🟡 P1-01: 缺乏前后端联调评审机制
|
||||
|
||||
**问题描述**
|
||||
- 前端页面已实现,但后端API缺失(如:系统设置页)
|
||||
- 后端API已实现,但前端未接线(如:管理员管理页)
|
||||
- 缺乏设计阶段的前后端联合评审机制
|
||||
|
||||
**影响范围**
|
||||
- 导致设计断链问题
|
||||
- 增加开发和返工成本
|
||||
- 影响交付质量
|
||||
|
||||
**建议措施**
|
||||
- 建立前后端联调评审流程
|
||||
- 设计阶段必须包含API设计评审
|
||||
- 开发前确认前后端接口契约
|
||||
- 使用Swagger/OpenAPI规范API文档
|
||||
|
||||
**期望修复时间**: 2026-04-05
|
||||
|
||||
#### 🟡 P1-02: 角色继承未接入运行时
|
||||
|
||||
**问题描述**
|
||||
- 角色继承数据结构完整,递归查询已实现
|
||||
- 但启动时未接入AnomalyDetector
|
||||
- JWT中的permissions未包含继承权限
|
||||
- auth middleware未调用GetRolePermissions
|
||||
|
||||
**影响范围**
|
||||
- 角色继承功能"假实现",运行时不生效
|
||||
- 管理员可能无法获得应有权限
|
||||
|
||||
**建议措施**
|
||||
```go
|
||||
// cmd/server/main.go - 添加以下调用:
|
||||
// authService.SetAnomalyDetector(...) ← 已有,未接线
|
||||
|
||||
// internal/api/middleware/auth.go
|
||||
// 修改权限校验逻辑,调用GetRolePermissions
|
||||
```
|
||||
|
||||
**期望修复时间**: 2026-04-06
|
||||
|
||||
### 2.3 性能优化建议
|
||||
|
||||
#### 💭 P2-01: stats.go存在N+5查询
|
||||
|
||||
**问题描述**
|
||||
- `GetUserStats`对4种状态分别发起独立查询,加上总数查询共5次DB调用
|
||||
- 当前实现影响不大,但用户量增加后会成为性能瓶颈
|
||||
|
||||
**代码位置**
|
||||
```go
|
||||
// internal/service/stats.go:55-96
|
||||
// 5次独立查询
|
||||
_, total, err := s.userRepo.List(ctx, 0, 1)
|
||||
for status, countPtr := range statusCounts { // 4次循环查询
|
||||
_, cnt, err := s.userRepo.ListByStatus(ctx, status, 0, 1)
|
||||
}
|
||||
```
|
||||
|
||||
**建议**
|
||||
```go
|
||||
// 添加批量查询方法
|
||||
func (r *UserRepository) CountByStatus(ctx context.Context) (map[UserStatus]int64, error) {
|
||||
var results []struct {
|
||||
Status UserStatus
|
||||
Count int64
|
||||
}
|
||||
err := r.db.WithContext(ctx).
|
||||
Model(&User{}).
|
||||
Select("status, COUNT(*) as count").
|
||||
Group("status").
|
||||
Scan(&results).Error
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**期望修复时间**: Sprint 14
|
||||
|
||||
#### 💭 P2-02: SlidingWindowLimiter内存持续增长
|
||||
|
||||
**问题描述**
|
||||
- `limiters` map只增不减
|
||||
- `cleanupInt`字段设置为5分钟但从未使用
|
||||
- 没有启动清理goroutine
|
||||
|
||||
**风险等级**
|
||||
- 长期运行时,每个不同的key都会保留在内存中
|
||||
- 若key具有高基数(如IP地址),可能导致内存泄漏
|
||||
|
||||
**建议**
|
||||
```go
|
||||
// 在NewRateLimitMiddleware中启动后台清理
|
||||
func (m *RateLimitMiddleware) startCleanup() {
|
||||
ticker := time.NewTicker(m.cleanupInt)
|
||||
defer ticker.Stop()
|
||||
for range ticker.C {
|
||||
m.mu.Lock()
|
||||
for key, limiter := range m.limiters {
|
||||
if limiter.IsIdle() {
|
||||
delete(m.limiters, key)
|
||||
}
|
||||
}
|
||||
m.mu.Unlock()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**期望修复时间**: Sprint 14
|
||||
|
||||
---
|
||||
|
||||
## 三、代码质量评估
|
||||
|
||||
### 3.1 代码质量优点
|
||||
|
||||
**✅ 代码规范性好**
|
||||
- 符合Go和TypeScript编码规范
|
||||
- 代码可读性好,注释清晰
|
||||
- 使用有意义的变量和函数命名
|
||||
|
||||
**✅ 错误处理完善**
|
||||
- 大部分代码都有错误处理
|
||||
- 使用结构化日志(slog)
|
||||
- 避免在非测试代码中使用panic
|
||||
|
||||
**✅ 安全意识强**
|
||||
- JWT使用crypto/rand生成随机数
|
||||
- TOTP使用SHA256算法
|
||||
- Webhook验证CSRF Token
|
||||
- 敏感操作有审计日志
|
||||
|
||||
**✅ 测试覆盖较完整**
|
||||
- 单元测试覆盖率约80%
|
||||
- 集成测试覆盖主要场景
|
||||
- 测试数据准备完善
|
||||
|
||||
### 3.2 代码质量改进建议
|
||||
|
||||
#### 💭 P3-01: ValidateRecoveryCode比较使用明文
|
||||
|
||||
**问题描述**
|
||||
- `ValidateRecoveryCode`直接比较明文
|
||||
- 存在时序泄漏风险(timing attack)
|
||||
|
||||
**建议**
|
||||
```go
|
||||
// 使用crypto/subtle.ConstantTimeStringCompare
|
||||
if subtle.ConstantTimeStringCompare(code, user.RecoveryCode) != 1 {
|
||||
return errors.New("invalid recovery code")
|
||||
}
|
||||
```
|
||||
|
||||
**期望修复时间**: Sprint 15
|
||||
|
||||
#### 💭 P3-02: social_account_repo使用原生SQL
|
||||
|
||||
**问题描述**
|
||||
- `social_account_repo.go`中使用原生SQL查询
|
||||
- 不符合Repository模式的一致性
|
||||
|
||||
**建议**
|
||||
- 使用GORM的链式调用替代原生SQL
|
||||
- 保持Repository层的一致性
|
||||
|
||||
**期望修复时间**: Sprint 15
|
||||
|
||||
#### 💭 P3-03: ProfileSecurityPage状态变量过多
|
||||
|
||||
**问题描述**
|
||||
- ProfileSecurityPage中有20+状态变量
|
||||
- 可维护性较差
|
||||
|
||||
**建议**
|
||||
- 合并相关状态变量
|
||||
- 使用useReducer或自定义Hook管理复杂状态
|
||||
|
||||
**期望修复时间**: Sprint 15
|
||||
|
||||
#### 💭 P3-04: validator.go正则重复编译
|
||||
|
||||
**问题描述**
|
||||
- 每次验证都重新编译正则表达式
|
||||
- 性能可优化
|
||||
|
||||
**建议**
|
||||
```go
|
||||
// 预编译正则表达式
|
||||
var (
|
||||
emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`)
|
||||
phoneRegex = regexp.MustCompile(`^1[3-9]\d{9}$`)
|
||||
)
|
||||
```
|
||||
|
||||
**期望修复时间**: Sprint 15
|
||||
|
||||
---
|
||||
|
||||
## 四、技术债务清单
|
||||
|
||||
### 4.1 架构层面技术债务
|
||||
|
||||
| 债务ID | 描述 | 优先级 | 影响范围 | 计划Sprint |
|
||||
|--------|------|--------|----------|-----------|
|
||||
| TECH-DEBT-001 | 前后端设计断链 | P1 | 全项目 | Sprint 12 |
|
||||
| TECH-DEBT-002 | 角色继承未接线 | P1 | 权限系统 | Sprint 12 |
|
||||
| TECH-DEBT-003 | N+5查询优化 | P2 | 统计API | Sprint 14 |
|
||||
| TECH-DEBT-004 | SlidingWindowLimiter内存泄漏 | P2 | 限流中间件 | Sprint 14 |
|
||||
|
||||
### 4.2 代码层面技术债务
|
||||
|
||||
| 债务ID | 描述 | 优先级 | 影响范围 | 计划Sprint |
|
||||
|--------|------|--------|----------|-----------|
|
||||
| TECH-DEBT-005 | ValidateRecoveryCode时序泄漏 | P3 | TOTP恢复码 | Sprint 15 |
|
||||
| TECH-DEBT-006 | 原生SQL使用 | P3 | 社交登录 | Sprint 15 |
|
||||
| TECH-DEBT-007 | ProfileSecurityPage状态管理 | P3 | 安全设置页 | Sprint 15 |
|
||||
| TECH-DEBT-008 | 正则重复编译 | P3 | 验证器 | Sprint 15 |
|
||||
|
||||
### 4.3 已识别但未实现的功能
|
||||
|
||||
| 功能ID | 功能名称 | 实现状态 | 计划Sprint |
|
||||
|--------|---------|----------|-----------|
|
||||
| GAP-04 | SSO(CAS/SAML) | ❌ 未实现 | v2.0 |
|
||||
| GAP-07 | SDK支持 | ❌ 未实现 | v2.0 |
|
||||
|
||||
---
|
||||
|
||||
## 五、架构改进建议
|
||||
|
||||
### 5.1 短期改进(Sprint 12-13)
|
||||
|
||||
1. **建立前后端联调评审机制**
|
||||
- 设计阶段必须包含API设计评审
|
||||
- 开发前确认前后端接口契约
|
||||
- 使用Swagger/OpenAPI规范API文档
|
||||
|
||||
2. **修复角色继承未接线问题**
|
||||
- 启动时接入AnomalyDetector
|
||||
- 修改JWT生成逻辑,包含继承权限
|
||||
- 修改auth middleware,调用GetRolePermissions
|
||||
|
||||
3. **完善设计断链修复**
|
||||
- 系统设置API开发
|
||||
- 设备信任功能完善
|
||||
- 异常检测功能接入
|
||||
|
||||
### 5.2 中期改进(Sprint 14)
|
||||
|
||||
1. **性能优化**
|
||||
- 优化N+5查询问题
|
||||
- 实现SlidingWindowLimiter清理机制
|
||||
- 添加配置缓存机制
|
||||
|
||||
2. **代码质量提升**
|
||||
- 统一Repository层实现方式
|
||||
- 优化复杂组件的状态管理
|
||||
- 预编译正则表达式
|
||||
|
||||
### 5.3 长期改进(v2.0)
|
||||
|
||||
1. **功能扩展**
|
||||
- SSO(CAS/SAML)实现
|
||||
- SDK支持开发
|
||||
- 配置版本管理和回滚
|
||||
|
||||
2. **架构演进**
|
||||
- 微服务化考虑
|
||||
- 事件驱动架构
|
||||
- 分布式追踪
|
||||
|
||||
---
|
||||
|
||||
## 六、亮点与建议
|
||||
|
||||
### 6.1 亮点
|
||||
|
||||
1. **架构设计优秀**
|
||||
- Domain/Repository/Service/Handler层次清晰
|
||||
- 职责分明,依赖注入良好
|
||||
- 符合SOLID原则
|
||||
|
||||
2. **代码质量高**
|
||||
- 代码可读性好,符合团队规范
|
||||
- 错误处理完善
|
||||
- 安全意识强
|
||||
|
||||
3. **测试覆盖完整**
|
||||
- 单元测试覆盖率达到80%
|
||||
- 集成测试覆盖主要场景
|
||||
- 测试数据准备完善
|
||||
|
||||
4. **文档完善**
|
||||
- 代码审查标准完善
|
||||
- 项目文档齐全
|
||||
- 开发流程规范
|
||||
|
||||
### 6.2 改进建议
|
||||
|
||||
1. **建立前后端联调评审机制**(P1)
|
||||
- 消除设计断链问题
|
||||
- 提高开发效率
|
||||
- 确保设计闭环
|
||||
|
||||
2. **完善角色继承功能**(P1)
|
||||
- 接入运行时逻辑
|
||||
- 确保权限正确传递
|
||||
- 完善测试用例
|
||||
|
||||
3. **性能优化**(P2)
|
||||
- 优化N+5查询问题
|
||||
- 实现SlidingWindowLimiter清理机制
|
||||
- 添加配置缓存机制
|
||||
|
||||
4. **代码质量提升**(P3)
|
||||
- 统一Repository层实现方式
|
||||
- 优化复杂组件的状态管理
|
||||
- 预编译正则表达式
|
||||
|
||||
---
|
||||
|
||||
## 七、后续行动计划
|
||||
|
||||
### 7.1 P1问题修复计划
|
||||
|
||||
| 问题ID | 优先级 | 责任人 | 计划修复日期 | 状态 |
|
||||
|--------|--------|--------|-------------|------|
|
||||
| P1-01 | P1 | 后端工程师 | 2026-04-05 | 待修复 |
|
||||
| P1-02 | P1 | 后端工程师 | 2026-04-06 | 待修复 |
|
||||
|
||||
### 7.2 P2问题跟踪
|
||||
|
||||
| 问题ID | 优先级 | 责任人 | 计划Sprint | 状态 |
|
||||
|--------|--------|--------|-----------|------|
|
||||
| P2-01 | P2 | 后端工程师 | Sprint 14 | 待处理 |
|
||||
| P2-02 | P2 | 后端工程师 | Sprint 14 | 待处理 |
|
||||
| P2-03 | P2 | 后端工程师 | Sprint 14 | 待处理 |
|
||||
|
||||
### 7.3 P3问题跟踪
|
||||
|
||||
| 问题ID | 优先级 | 责任人 | 计划Sprint | 状态 |
|
||||
|--------|--------|--------|-----------|------|
|
||||
| P3-01 | P3 | 后端工程师 | Sprint 15 | 待处理 |
|
||||
| P3-02 | P3 | 后端工程师 | Sprint 15 | 待处理 |
|
||||
| P3-03 | P3 | 前端工程师 | Sprint 15 | 待处理 |
|
||||
| P3-04 | P3 | 后端工程师 | Sprint 15 | 待处理 |
|
||||
|
||||
### 7.4 复核计划
|
||||
|
||||
- **复核日期**: 2026-04-08
|
||||
- **复核方式**: 文档评审 + 代码审查
|
||||
- **复核人**: PM + 技术专家
|
||||
|
||||
---
|
||||
|
||||
## 八、技术专家评分
|
||||
|
||||
### 8.1 各维度评分
|
||||
|
||||
| 评分维度 | 得分 | 满分 | 评价 |
|
||||
|---------|------|------|------|
|
||||
| 代码质量 | 9.0 | 10.0 | 优秀 |
|
||||
| 架构设计 | 8.5 | 10.0 | 良好 |
|
||||
| 性能优化 | 7.5 | 10.0 | 中等 |
|
||||
| 可测试性 | 8.0 | 10.0 | 良好 |
|
||||
| 技术债务 | 7.0 | 10.0 | 中等 |
|
||||
| **总分** | **8.0** | **10.0** | **良好** |
|
||||
|
||||
### 8.2 评分说明
|
||||
|
||||
- **代码质量(9.0/10)**: 代码规范性好,错误处理完善,安全意识强
|
||||
- **架构设计(8.5/10)**: 分层清晰,职责分明,但缺乏前后端联调机制
|
||||
- **性能优化(7.5/10)**: 基本满足需求,但有优化空间(N+5查询、内存泄漏)
|
||||
- **可测试性(8.0/10)**: 测试覆盖完整,但有部分场景未覆盖
|
||||
- **技术债务(7.0/10)**: 有一定技术债务,但已记录并有计划偿还
|
||||
|
||||
---
|
||||
|
||||
## 九、评审结论
|
||||
|
||||
### 9.1 总体结论
|
||||
|
||||
**✅ 通过(有条件)**
|
||||
|
||||
项目整体架构设计和代码质量良好,技术栈选择合理,代码组织清晰。但仍存在以下需要改进的问题:
|
||||
|
||||
- **P1问题(2个)**: 必须在Sprint 12内修复
|
||||
- **P2问题(3个)**: 建议在Sprint 14内修复
|
||||
- **P3问题(4个)**: 可在Sprint 15内修复
|
||||
|
||||
### 9.2 关键建议
|
||||
|
||||
1. **立即行动(Sprint 12)**
|
||||
- 建立前后端联调评审机制
|
||||
- 修复角色继承未接线问题
|
||||
- 完善设计断链修复
|
||||
|
||||
2. **短期行动(Sprint 14)**
|
||||
- 优化性能问题
|
||||
- 完善代码质量
|
||||
- 偿还技术债务
|
||||
|
||||
3. **长期规划(v2.0)**
|
||||
- SSO(CAS/SAML)实现
|
||||
- SDK支持开发
|
||||
- 架构演进
|
||||
|
||||
### 9.3 评审签字
|
||||
|
||||
- [x] 技术专家: 高级项目经理代理
|
||||
- [ ] PM: _____________
|
||||
- [ ] 开发负责人: _____________
|
||||
|
||||
---
|
||||
|
||||
## 十、附件
|
||||
|
||||
- 附件1: 代码审查报告(CODE_REVIEW_REPORT_2026-04-01-V2.md)
|
||||
- 附件2: PRD缺口分析(PRD_GAP_DESIGN_PLAN.md)
|
||||
- 附件3: 设计断链修复计划(DESIGN_GAP_FIX_PLAN.md)
|
||||
- 附件4: 项目管理升级规划(PROJECT_MANAGEMENT_UPGRADE_PLAN.md)
|
||||
|
||||
---
|
||||
|
||||
**评审完成时间**: 2026-04-01
|
||||
**评审报告版本**: v1.0
|
||||
**下次评审计划**: 2026-04-08(P1问题修复后复核)
|
||||
Reference in New Issue
Block a user