refactor: align framework cleanup with new bootstrap flow

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
This commit is contained in:
2025-11-19 12:47:25 +08:00
parent 39d14ec093
commit d66323487b
67 changed files with 3020 additions and 3992 deletions

200
openspec/project.md Normal file
View File

@@ -0,0 +1,200 @@
# Project Context
## Purpose
junhong_cmp_fiber 是一个基于 Go + Fiber 的企业级中后台管理系统Content Management Platform提供完整的业务管理和数据处理能力。
**核心目标:**
- 提供高性能、可扩展的后端 API 服务
- 实现完善的权限管理和数据权限控制RBAC
- 支持异步任务处理和批量数据操作
- 提供统一的错误处理和日志审计能力
- 构建可维护、高质量的 Go 代码库
## Tech Stack
**核心框架:**
- **Go 1.25.4** - 编程语言
- **Fiber v2.x** - 高性能 HTTP 框架(基于 fasthttp
- **GORM v1.25.x** - ORM 框架,用于数据库操作
**数据存储:**
- **PostgreSQL 14+** - 主数据库
- **Redis 6.0+** - 缓存和任务队列存储
**基础设施:**
- **Asynq v0.24.x** - 异步任务队列
- **Viper** - 配置管理
- **Zap + Lumberjack.v2** - 结构化日志和日志轮转
- **sonic** - 高性能 JSON 序列化
- **golang-migrate** - 数据库迁移工具
- **validator** - 请求参数验证
**开发工具:**
- **Go Modules** - 依赖管理
- **gofmt** - 代码格式化
- **go vet** - 静态分析
- **golangci-lint** - 代码质量检查
## Project Conventions
### Code Style
**严格遵循 Go 官方规范:**
- 必须使用 `gofmt` 格式化所有代码
- 遵循 [Effective Go](https://go.dev/doc/effective_go) 和 [Go Code Review Comments](https://go.dev/wiki/CodeReviewComments)
- 变量命名使用 Go 风格:`userID`(不是 `userId`)、`HTTPServer`(不是 `HttpServer`
- 缩写词全部大写或全部小写:`URL``ID``HTTP`(导出)或 `url``id``http`(未导出)
- 包名简短、小写、单数、无下划线:`user``order``pkg`
- 接口命名使用 `-er` 后缀:`Reader``Writer``Logger`
**注释和文档规范:**
- 所有导出的函数、类型和常量必须有 Go 风格文档注释(英文)
- 代码注释implementation comments使用中文
- 日志消息使用中文
- 用户可见错误消息使用中文(通过 `pkg/errors/` 双语支持)
- 变量名、函数名、类型名必须使用英文
**常量管理:**
- 业务常量必须定义在 `pkg/constants/`
- Redis key 必须使用函数生成:`Redis{Module}{Purpose}Key(params...)`
- Redis key 格式:`{module}:{purpose}:{identifier}`
- 禁止硬编码 magic numbers 和字符串字面量
**函数复杂度:**
- 函数长度不超过 50-100 行(核心逻辑 ≤ 50 行)
- 超过 100 行的函数必须拆分
- 遵循单一职责原则Single Responsibility Principle
### Architecture Patterns
**严格的四层架构:**
```
Handler 层 → Service 层 → Store 层 → Model 层
```
- **Handler 层**:处理 HTTP 请求/响应,参数验证,不包含业务逻辑
- **Service 层**:包含所有业务逻辑,支持跨模块调用
- **Store 层**:统一管理数据访问,支持事务处理
- **Model 层**:定义数据结构和 DTO
**依赖注入:**
- 所有依赖通过结构体字段注入(不使用构造函数模式)
- 禁止使用 Java 风格的 DI 框架
**错误处理:**
- 所有公共错误在 `pkg/errors/` 定义
- 使用统一错误码和双语错误消息
- Handler 层通过返回 `error` 传递给全局 ErrorHandler
- 禁止手动构造错误响应
**响应格式:**
- 所有 API 响应使用 `pkg/response/` 的统一格式
- 标准响应结构:`{code, message, data, timestamp}`
**数据库设计原则(核心):**
-**禁止使用外键约束**Foreign Key Constraints
-**禁止使用 GORM 关联关系**`foreignKey``hasMany``belongsTo` 等)
- ✅ 表之间关联通过存储关联 ID 字段手动维护
- ✅ 关联数据查询在代码层面显式执行
- ✅ 模型结构体只包含简单字段,不嵌套其他模型
- **理由**:灵活性、性能、可控性、分布式友好
**Go 惯用模式vs Java**
- ✅ 扁平化包结构(按功能组织,不按层次)
- ✅ 小而专注的接口1-3 个方法)
- ✅ 使用组合composition不是继承
- ✅ 直接访问导出字段,不使用 getter/setter
- ✅ 显式错误返回,不使用 panic/recover
- ❌ 禁止过度抽象(不必要的工厂、构造器)
- ❌ 禁止类型前缀(`IService``AbstractBase``ServiceImpl`
### Testing Strategy
**测试要求:**
- 所有核心业务逻辑Service 层)必须有单元测试
- 所有 API 端点必须有集成测试
- 测试使用 Go 标准 `testing`
- 测试文件命名:`*_test.go`
- 测试函数命名:`func TestUserCreate(t *testing.T)`
**测试性能:**
- 单元测试 < 100ms
- 集成测试 < 1s
- 测试覆盖率 ≥ 70%(核心业务 ≥ 90%
**测试最佳实践:**
- 使用 table-driven tests 处理多个测试用例
- 使用 `t.Helper()` 标记辅助函数
- 使用 mock 或 testcontainers不依赖外部服务
### Git Workflow
**分支策略:**
- 功能开发使用独立分支:`{feature-id}-{feature-name}`
- 完成后合并到主分支
**Commit 规范:**
- 遵循项目现有 commit message 风格
- 清晰描述变更内容和原因
- 包含 feature ID`feat: 实现 RBAC 权限系统 (004-rbac-data-permission)`
## Domain Context
**业务模块:**
- **RBAC 权限系统**:基于角色的访问控制,支持数据权限
- **用户管理**:用户注册、认证、权限分配
- **数据权限**:支持全部数据、本部门数据、本人数据、自定义数据权限
- **异步任务**:批量数据处理、定时任务
**核心概念:**
- **权限控制**:通过中间件实现路由级和数据级权限控制
- **数据隔离**:基于用户权限自动过滤查询数据
- **审计日志**:完整记录所有 API 请求和响应request/response body
## Important Constraints
**技术栈约束(严格遵守):**
- ❌ 禁止使用 `database/sql` 直接调用(必须使用 GORM
- ❌ 禁止使用 `net/http` 替代 Fiber
- ❌ 禁止使用 `encoding/json` 替代 sonic除非必要
- ❌ 禁止绕过框架使用原生调用
- **理由**:确保代码一致性、可维护性和长期技术债务可控
**性能要求:**
- API 响应时间P95< 200ms
- API 响应时间P99< 500ms
- 数据库查询 < 50ms
- 列表查询必须分页(默认 20最大 100
**资源限制:**
- API 服务内存 < 500MB
- Worker 服务内存 < 1GB
- 数据库连接池MaxOpenConns=25, MaxIdleConns=10
- Redis 连接池PoolSize=10, MinIdleConns=5
**安全要求:**
- 避免 OWASP Top 10 漏洞XSS、SQL 注入、命令注入等)
- 敏感数据脱敏
- 完整的访问日志审计
**日志要求:**
- 所有 HTTP 请求必须记录访问日志(`access.log`
- 记录完整请求/响应 body限制 50KB
- 使用 JSON 格式便于分析
## External Dependencies
**数据库:**
- PostgreSQL 14+ (必需,端口 5432
- Redis 6.0+(必需,端口 6379
**开发工具:**
- golang-migrate CLI数据库迁移
- golangci-lint代码质量
**可选服务:**
- 监控系统Prometheus/Grafana
- 日志收集ELK Stack
- API 文档Swagger/OpenAPI