## 主要变更 ### 🏗️ 架构重构 - 采用简洁的四层架构:API → Service → Repository → Model - 遵循 Go 语言最佳实践和命名规范 - 实现依赖注入和接口导向设计 - 统一错误处理和响应格式 ### 📁 目录结构优化 - 删除重复模块 (application/, domain/, infrastructure/ 等) - 规范化命名 (使用 Go 风格的 snake_case) - 清理无关文件 (package.json, node_modules/ 等) - 新增规范化的测试目录结构 ### 📚 文档系统 - 为每个模块创建详细的 CLAUDE.md 指导文件 - 包含开发规范、最佳实践和使用示例 - 支持模块化开发,缩短上下文长度 ### 🔧 开发规范 - 统一接口命名规范 (UserServicer, PhotoRepositoryr) - 标准化错误处理机制 - 完善的测试策略 (单元测试、集成测试、性能测试) - 规范化的配置管理 ### 🗂️ 新增文件 - cmd/server/ - 服务启动入口和配置 - internal/model/ - 数据模型层 (entity, dto, request) - pkg/ - 共享工具包 (logger, response, validator) - tests/ - 完整测试结构 - docs/ - API 文档和架构设计 - .gitignore - Git 忽略文件配置 ### 🗑️ 清理内容 - 删除 Node.js 相关文件 (package.json, node_modules/) - 移除重复的架构目录 - 清理临时文件和构建产物 - 删除重复的文档文件 ## 影响 - 提高代码可维护性和可扩展性 - 统一开发规范,提升团队协作效率 - 优化项目结构,符合 Go 语言生态标准 - 完善文档体系,降低上手难度
596 lines
17 KiB
Markdown
596 lines
17 KiB
Markdown
# Backend API Service - CLAUDE.md
|
||
|
||
本文件为 Claude Code 在后端 API 服务模块中工作时提供指导。
|
||
|
||
## 🎯 模块概览
|
||
|
||
这是一个基于 Go + Gin 框架的 REST API 后端服务,采用简洁的四层架构模式,遵循 Go 语言的简洁设计哲学。
|
||
|
||
### 主要特性
|
||
- 🏗️ 简洁四层架构 (API → Service → Repository → Model)
|
||
- 🚀 多种部署模式 (生产/开发/Mock)
|
||
- 📊 多数据库支持 (PostgreSQL + SQLite + Redis)
|
||
- 🔐 JWT 认证 + 基于角色的访问控制
|
||
- 📁 文件上传和存储管理
|
||
- 🐳 Docker 容器化部署
|
||
- 📊 健康检查和监控
|
||
- 📚 API 文档生成
|
||
|
||
### 技术栈
|
||
- **语言**: Go 1.23+
|
||
- **框架**: Gin v1.10.1
|
||
- **数据库**: PostgreSQL (生产) + SQLite (开发) + Redis (缓存)
|
||
- **ORM**: GORM v1.30.0
|
||
- **认证**: JWT (golang-jwt/jwt/v5)
|
||
- **日志**: Uber Zap
|
||
- **配置**: Viper
|
||
- **容器化**: Docker + Docker Compose
|
||
|
||
## 📁 简洁架构设计
|
||
|
||
### 核心模块结构(重构后)
|
||
```
|
||
backend/
|
||
├── CLAUDE.md # 📋 当前文件 - 后端总览
|
||
├── cmd/ # 🚀 应用入口模块
|
||
│ ├── server/ # 服务启动器
|
||
│ │ ├── CLAUDE.md # 启动服务配置指导
|
||
│ │ └── main.go # 统一入口(支持多模式)
|
||
│ └── migrate/ # 数据库迁移工具
|
||
│ └── main.go
|
||
├── internal/ # 📦 核心业务模块
|
||
│ ├── api/ # 🌐 HTTP 接口层
|
||
│ │ ├── CLAUDE.md # API 路由和处理器指导
|
||
│ │ ├── handlers/ # HTTP 处理器
|
||
│ │ ├── middleware/ # 中间件
|
||
│ │ ├── routes/ # 路由定义
|
||
│ │ └── validators/ # 请求验证
|
||
│ ├── service/ # 📋 业务逻辑层
|
||
│ │ ├── CLAUDE.md # 业务逻辑开发指导
|
||
│ │ ├── auth/ # 认证服务
|
||
│ │ ├── user/ # 用户服务
|
||
│ │ ├── photo/ # 照片服务
|
||
│ │ ├── category/ # 分类服务
|
||
│ │ └── storage/ # 文件存储服务
|
||
│ ├── repository/ # 🔧 数据访问层
|
||
│ │ ├── CLAUDE.md # 数据访问开发指导
|
||
│ │ ├── interfaces/ # 仓储接口
|
||
│ │ ├── postgres/ # PostgreSQL 实现
|
||
│ │ ├── redis/ # Redis 实现
|
||
│ │ └── sqlite/ # SQLite 实现
|
||
│ ├── model/ # 📦 数据模型层
|
||
│ │ ├── CLAUDE.md # 数据模型设计指导
|
||
│ │ ├── entity/ # 实体模型
|
||
│ │ ├── dto/ # 数据传输对象
|
||
│ │ └── request/ # 请求响应模型
|
||
│ └── config/ # ⚙️ 配置管理
|
||
│ ├── CLAUDE.md # 配置文件管理指导
|
||
│ └── config.go # 配置结构体
|
||
├── pkg/ # 📦 共享包模块
|
||
│ ├── CLAUDE.md # 公共工具包指导
|
||
│ ├── logger/ # 日志工具
|
||
│ ├── response/ # 响应格式
|
||
│ ├── validator/ # 验证器
|
||
│ └── utils/ # 通用工具
|
||
├── configs/ # 📋 配置文件
|
||
├── migrations/ # 📊 数据库迁移
|
||
├── tests/ # 🧪 测试模块
|
||
│ ├── CLAUDE.md # 测试编写和执行指导
|
||
│ ├── unit/ # 单元测试
|
||
│ ├── integration/ # 集成测试
|
||
│ └── mocks/ # 模拟对象
|
||
└── docs/ # 📚 文档模块
|
||
├── CLAUDE.md # API 文档和接口设计指导
|
||
└── api/ # API 文档
|
||
```
|
||
|
||
### Go 风格的四层架构
|
||
|
||
#### 🌐 API 层 (`internal/api/`)
|
||
- **职责**: HTTP 请求处理、路由定义、中间件、参数验证
|
||
- **文件**: `handlers/`, `middleware/`, `routes/`, `validators/`
|
||
- **指导**: `internal/api/CLAUDE.md`
|
||
|
||
#### 📋 Service 层 (`internal/service/`)
|
||
- **职责**: 业务逻辑处理、服务编排、事务管理
|
||
- **文件**: `auth/`, `user/`, `photo/`, `category/`, `storage/`
|
||
- **指导**: `internal/service/CLAUDE.md`
|
||
|
||
#### 🔧 Repository 层 (`internal/repository/`)
|
||
- **职责**: 数据访问、数据库操作、缓存管理
|
||
- **文件**: `interfaces/`, `postgres/`, `redis/`, `sqlite/`
|
||
- **指导**: `internal/repository/CLAUDE.md`
|
||
|
||
#### 📦 Model 层 (`internal/model/`)
|
||
- **职责**: 数据模型、实体定义、DTO 转换
|
||
- **文件**: `entity/`, `dto/`, `request/`
|
||
- **指导**: `internal/model/CLAUDE.md`
|
||
|
||
### 简洁性原则
|
||
|
||
1. **单一职责**: 每个模块只负责一个明确的功能
|
||
2. **依赖注入**: 使用接口解耦,便于测试和扩展
|
||
3. **配置集中**: 所有配置统一管理,支持多环境
|
||
4. **错误处理**: 统一的错误处理机制
|
||
5. **代码生成**: 减少重复代码,提高开发效率
|
||
|
||
## 🚀 快速开始
|
||
|
||
### 开发环境设置
|
||
```bash
|
||
# 1. 环境准备
|
||
cd backend/
|
||
make setup # 初始化开发环境
|
||
|
||
# 2. 开发模式选择
|
||
make dev-simple # Mock 服务器 (前端开发)
|
||
make dev # SQLite 开发服务器 (全功能)
|
||
make dev-full # PostgreSQL 开发服务器 (生产环境)
|
||
|
||
# 3. 生产部署
|
||
make prod-up # Docker 容器部署
|
||
```
|
||
|
||
### 服务模式说明
|
||
- **Mock 模式**: 快速响应的模拟 API,用于前端开发
|
||
- **开发模式**: 完整功能的 SQLite 数据库,用于本地开发
|
||
- **生产模式**: PostgreSQL + Redis,用于生产环境
|
||
|
||
## 🔧 Go 风格开发规范
|
||
|
||
### 代码结构规范
|
||
1. **四层架构**: API → Service → Repository → Model
|
||
2. **接口导向**: 使用接口定义契约,便于测试和替换
|
||
3. **依赖注入**: 构造函数注入,避免全局变量
|
||
4. **错误处理**: 显式错误处理,避免 panic
|
||
5. **并发安全**: 使用 context 和 sync 包确保并发安全
|
||
|
||
### Go 语言命名规范
|
||
```
|
||
文件和目录:
|
||
- 文件名: snake_case (user_service.go)
|
||
- 包名: 小写单词 (userservice 或 user)
|
||
- 目录名: 小写单词 (auth, user, photo)
|
||
|
||
代码命名:
|
||
- 结构体: PascalCase (UserService, PhotoEntity)
|
||
- 接口: PascalCase + er结尾 (UserServicer, PhotoStorer)
|
||
- 方法/函数: PascalCase (GetUser, CreatePhoto)
|
||
- 变量: camelCase (userService, photoList)
|
||
- 常量: PascalCase (MaxUserCount, DefaultPageSize)
|
||
- 枚举: PascalCase (UserStatusActive, UserStatusInactive)
|
||
```
|
||
|
||
### 接口设计规范
|
||
```go
|
||
// 接口定义
|
||
type UserServicer interface {
|
||
GetUser(ctx context.Context, id uint) (*entity.User, error)
|
||
CreateUser(ctx context.Context, req *dto.CreateUserRequest) (*entity.User, error)
|
||
UpdateUser(ctx context.Context, id uint, req *dto.UpdateUserRequest) error
|
||
DeleteUser(ctx context.Context, id uint) error
|
||
ListUsers(ctx context.Context, opts *dto.ListUsersOptions) ([]*entity.User, int64, error)
|
||
}
|
||
|
||
// 实现规范
|
||
type UserService struct {
|
||
userRepo repository.UserRepositoryr
|
||
logger logger.Logger
|
||
}
|
||
|
||
func NewUserService(userRepo repository.UserRepositoryr, logger logger.Logger) UserServicer {
|
||
return &UserService{
|
||
userRepo: userRepo,
|
||
logger: logger,
|
||
}
|
||
}
|
||
```
|
||
|
||
### RESTful API 设计规范
|
||
```
|
||
资源路径规范:
|
||
GET /api/v1/users # 获取用户列表
|
||
POST /api/v1/users # 创建用户
|
||
GET /api/v1/users/:id # 获取用户详情
|
||
PUT /api/v1/users/:id # 更新用户
|
||
DELETE /api/v1/users/:id # 删除用户
|
||
|
||
嵌套资源:
|
||
GET /api/v1/users/:id/photos # 获取用户的照片
|
||
POST /api/v1/users/:id/photos # 为用户创建照片
|
||
|
||
查询参数:
|
||
GET /api/v1/users?page=1&limit=20&sort=created_at&order=desc
|
||
```
|
||
|
||
### 统一响应格式
|
||
```go
|
||
// 成功响应
|
||
type SuccessResponse struct {
|
||
Success bool `json:"success"`
|
||
Data interface{} `json:"data,omitempty"`
|
||
Message string `json:"message,omitempty"`
|
||
Timestamp int64 `json:"timestamp"`
|
||
}
|
||
|
||
// 错误响应
|
||
type ErrorResponse struct {
|
||
Success bool `json:"success"`
|
||
Error Error `json:"error"`
|
||
Timestamp int64 `json:"timestamp"`
|
||
}
|
||
|
||
type Error struct {
|
||
Code string `json:"code"`
|
||
Message string `json:"message"`
|
||
Details string `json:"details,omitempty"`
|
||
}
|
||
```
|
||
|
||
### 错误处理规范
|
||
```go
|
||
// 自定义错误类型
|
||
type AppError struct {
|
||
Code string
|
||
Message string
|
||
Details string
|
||
Err error
|
||
}
|
||
|
||
func (e *AppError) Error() string {
|
||
return e.Message
|
||
}
|
||
|
||
// 错误码定义
|
||
const (
|
||
ErrCodeUserNotFound = "USER_NOT_FOUND"
|
||
ErrCodeInvalidParameter = "INVALID_PARAMETER"
|
||
ErrCodePermissionDenied = "PERMISSION_DENIED"
|
||
ErrCodeInternalError = "INTERNAL_ERROR"
|
||
)
|
||
|
||
// 错误处理函数
|
||
func HandleError(c *gin.Context, err error) {
|
||
var appErr *AppError
|
||
if errors.As(err, &appErr) {
|
||
c.JSON(http.StatusBadRequest, ErrorResponse{
|
||
Success: false,
|
||
Error: Error{
|
||
Code: appErr.Code,
|
||
Message: appErr.Message,
|
||
Details: appErr.Details,
|
||
},
|
||
Timestamp: time.Now().Unix(),
|
||
})
|
||
return
|
||
}
|
||
|
||
// 未知错误
|
||
c.JSON(http.StatusInternalServerError, ErrorResponse{
|
||
Success: false,
|
||
Error: Error{
|
||
Code: ErrCodeInternalError,
|
||
Message: "内部服务器错误",
|
||
},
|
||
Timestamp: time.Now().Unix(),
|
||
})
|
||
}
|
||
```
|
||
|
||
### 日志记录规范
|
||
```go
|
||
// 结构化日志
|
||
logger.Info("user created successfully",
|
||
zap.String("user_id", user.ID),
|
||
zap.String("username", user.Username),
|
||
zap.String("operation", "create_user"),
|
||
)
|
||
|
||
// 错误日志
|
||
logger.Error("failed to create user",
|
||
zap.Error(err),
|
||
zap.String("username", req.Username),
|
||
zap.String("operation", "create_user"),
|
||
)
|
||
```
|
||
|
||
### 配置管理规范
|
||
```go
|
||
// 配置结构体
|
||
type Config struct {
|
||
Server ServerConfig `mapstructure:"server"`
|
||
Database DatabaseConfig `mapstructure:"database"`
|
||
Redis RedisConfig `mapstructure:"redis"`
|
||
JWT JWTConfig `mapstructure:"jwt"`
|
||
Storage StorageConfig `mapstructure:"storage"`
|
||
}
|
||
|
||
// 环境变量映射
|
||
type ServerConfig struct {
|
||
Port string `mapstructure:"port" env:"SERVER_PORT"`
|
||
Mode string `mapstructure:"mode" env:"SERVER_MODE"`
|
||
LogLevel string `mapstructure:"log_level" env:"LOG_LEVEL"`
|
||
}
|
||
```
|
||
|
||
## 📊 数据库设计
|
||
|
||
### 主要实体
|
||
- **User**: 用户信息和权限
|
||
- **Photo**: 照片信息和元数据
|
||
- **Category**: 照片分类
|
||
- **Tag**: 照片标签
|
||
- **Album**: 相册管理
|
||
|
||
### 关系设计
|
||
```
|
||
User (1:N) Photo
|
||
Photo (N:M) Category
|
||
Photo (N:M) Tag
|
||
User (1:N) Album
|
||
Album (N:M) Photo
|
||
```
|
||
|
||
## 🔐 认证和授权
|
||
|
||
### JWT 认证流程
|
||
1. 用户登录 → 验证凭据
|
||
2. 生成 JWT Token (AccessToken + RefreshToken)
|
||
3. 客户端携带 Token 访问受保护资源
|
||
4. 服务器验证 Token 有效性
|
||
|
||
### 权限角色
|
||
- **Admin**: 系统管理员 (所有权限)
|
||
- **Editor**: 内容编辑者 (内容管理)
|
||
- **User**: 普通用户 (查看权限)
|
||
|
||
## 🧪 测试策略
|
||
|
||
### 测试类型
|
||
- **单元测试**: 业务逻辑和工具函数
|
||
- **集成测试**: API 接口和数据库交互
|
||
- **性能测试**: 接口响应时间和并发测试
|
||
|
||
### 测试工具
|
||
- **Go Testing**: 内置测试框架
|
||
- **Testify**: 断言和模拟工具
|
||
- **Mockery**: 接口模拟生成
|
||
|
||
## 📚 API 文档
|
||
|
||
### 文档生成
|
||
- **Swagger/OpenAPI**: 自动生成 API 文档
|
||
- **Postman Collection**: 接口测试集合
|
||
- **README**: 快速开始指南
|
||
|
||
### 文档维护
|
||
- 接口变更时同步更新文档
|
||
- 提供完整的请求/响应示例
|
||
- 包含错误码和处理说明
|
||
|
||
## 🚀 部署配置
|
||
|
||
### 环境变量
|
||
```bash
|
||
# 数据库配置
|
||
DB_HOST=localhost
|
||
DB_PORT=5432
|
||
DB_NAME=photography
|
||
DB_USER=postgres
|
||
DB_PASSWORD=password
|
||
|
||
# JWT 配置
|
||
JWT_SECRET=your-secret-key
|
||
JWT_EXPIRES_IN=24h
|
||
|
||
# 文件存储
|
||
STORAGE_TYPE=local
|
||
STORAGE_PATH=./uploads
|
||
```
|
||
|
||
### Docker 部署
|
||
```bash
|
||
# 构建镜像
|
||
make build-image
|
||
|
||
# 启动服务
|
||
make prod-up
|
||
|
||
# 查看日志
|
||
make logs
|
||
```
|
||
|
||
## 📋 常用命令
|
||
|
||
### 开发命令
|
||
```bash
|
||
# 代码生成
|
||
make generate # 生成代码 (mocks, swagger)
|
||
|
||
# 代码检查
|
||
make lint # 代码检查
|
||
make fmt # 代码格式化
|
||
make vet # 代码分析
|
||
|
||
# 测试
|
||
make test # 运行测试
|
||
make test-cover # 测试覆盖率
|
||
make test-integration # 集成测试
|
||
|
||
# 构建
|
||
make build # 构建二进制文件
|
||
make build-image # 构建 Docker 镜像
|
||
```
|
||
|
||
### 数据库命令
|
||
```bash
|
||
# 迁移
|
||
make migrate-up # 应用迁移
|
||
make migrate-down # 回滚迁移
|
||
make migrate-create # 创建迁移文件
|
||
|
||
# 数据库管理
|
||
make db-reset # 重置数据库
|
||
make db-seed # 导入种子数据
|
||
```
|
||
|
||
## 🔍 问题排查
|
||
|
||
### 常见问题
|
||
1. **数据库连接失败**: 检查配置文件和环境变量
|
||
2. **JWT 验证失败**: 检查密钥配置和 Token 格式
|
||
3. **文件上传失败**: 检查存储配置和权限设置
|
||
4. **API 响应慢**: 检查数据库查询和缓存配置
|
||
|
||
### 日志查看
|
||
```bash
|
||
# 查看应用日志
|
||
tail -f logs/app.log
|
||
|
||
# 查看错误日志
|
||
tail -f logs/error.log
|
||
|
||
# 查看访问日志
|
||
tail -f logs/access.log
|
||
```
|
||
|
||
## 🎯 模块工作指南
|
||
|
||
### 根据工作内容选择模块
|
||
|
||
#### 🚀 应用启动和配置
|
||
```bash
|
||
cd cmd/server/
|
||
# 参考 cmd/server/CLAUDE.md
|
||
```
|
||
**适用场景**: 服务启动、配置初始化、依赖注入
|
||
|
||
#### 🌐 API 接口开发
|
||
```bash
|
||
cd internal/api/
|
||
# 参考 internal/api/CLAUDE.md
|
||
```
|
||
**适用场景**: 路由定义、HTTP 处理器、中间件、请求验证
|
||
|
||
#### 📋 业务逻辑开发
|
||
```bash
|
||
cd internal/application/
|
||
# 参考 internal/application/CLAUDE.md
|
||
```
|
||
**适用场景**: 业务逻辑、服务编排、数据传输对象
|
||
|
||
#### 🏢 领域模型设计
|
||
```bash
|
||
cd internal/domain/
|
||
# 参考 internal/domain/CLAUDE.md
|
||
```
|
||
**适用场景**: 业务实体、业务规则、仓储接口
|
||
|
||
#### 🔧 基础设施开发
|
||
```bash
|
||
cd internal/infrastructure/
|
||
# 参考 internal/infrastructure/CLAUDE.md
|
||
```
|
||
**适用场景**: 数据库、缓存、文件存储、外部服务
|
||
|
||
#### 📦 工具包开发
|
||
```bash
|
||
cd pkg/
|
||
# 参考 pkg/CLAUDE.md
|
||
```
|
||
**适用场景**: 通用工具、日志、验证器、响应格式
|
||
|
||
#### 🧪 测试开发
|
||
```bash
|
||
cd tests/
|
||
# 参考 tests/CLAUDE.md
|
||
```
|
||
**适用场景**: 单元测试、集成测试、性能测试
|
||
|
||
#### 📚 文档维护
|
||
```bash
|
||
cd docs/
|
||
# 参考 docs/CLAUDE.md
|
||
```
|
||
**适用场景**: API 文档、架构设计、部署指南
|
||
|
||
## 🔄 最佳实践
|
||
|
||
### 开发流程
|
||
1. **功能分析**: 确定需求和技术方案
|
||
2. **选择模块**: 根据工作内容选择对应模块
|
||
3. **阅读指导**: 详细阅读模块的 CLAUDE.md 文件
|
||
4. **编码实现**: 遵循模块规范进行开发
|
||
5. **测试验证**: 编写和运行相关测试
|
||
6. **文档更新**: 同步更新相关文档
|
||
|
||
### 代码质量
|
||
- **代码审查**: 提交前进行代码审查
|
||
- **测试覆盖**: 保持合理的测试覆盖率
|
||
- **性能优化**: 关注接口响应时间和资源使用
|
||
- **安全检查**: 验证认证、授权和数据验证
|
||
|
||
### 模块协调
|
||
- **接口一致性**: 确保模块间接口的一致性
|
||
- **依赖管理**: 合理管理模块间的依赖关系
|
||
- **配置统一**: 统一配置管理和环境变量
|
||
- **错误处理**: 统一错误处理和响应格式
|
||
|
||
## 📈 项目状态
|
||
|
||
### 已完成功能
|
||
- ✅ 清洁架构设计
|
||
- ✅ 多数据库支持
|
||
- ✅ JWT 认证系统
|
||
- ✅ 文件上传功能
|
||
- ✅ Docker 部署
|
||
- ✅ 基础 API 接口
|
||
|
||
### 开发中功能
|
||
- 🔄 完整的测试覆盖
|
||
- 🔄 API 文档生成
|
||
- 🔄 性能监控
|
||
- 🔄 缓存优化
|
||
|
||
### 计划中功能
|
||
- 📋 微服务架构
|
||
- 📋 分布式文件存储
|
||
- 📋 消息队列集成
|
||
- 📋 监控和报警系统
|
||
|
||
## 🔧 开发环境
|
||
|
||
### 必需工具
|
||
- **Go 1.23+**: 编程语言
|
||
- **PostgreSQL 14+**: 主数据库
|
||
- **Redis 6+**: 缓存数据库
|
||
- **Docker**: 容器化部署
|
||
- **Make**: 构建工具
|
||
|
||
### 推荐工具
|
||
- **GoLand/VSCode**: 代码编辑器
|
||
- **Postman**: API 测试
|
||
- **DBeaver**: 数据库管理
|
||
- **Redis Desktop Manager**: Redis 管理
|
||
|
||
## 💡 开发技巧
|
||
|
||
### 性能优化
|
||
- 使用数据库连接池
|
||
- 实现查询结果缓存
|
||
- 优化 SQL 查询语句
|
||
- 使用异步处理
|
||
|
||
### 安全防护
|
||
- 输入参数验证
|
||
- SQL 注入防护
|
||
- XSS 攻击防护
|
||
- 访问频率限制
|
||
|
||
### 错误处理
|
||
- 统一错误响应格式
|
||
- 详细的错误日志记录
|
||
- 适当的错误码设计
|
||
- 友好的错误提示
|
||
|
||
本 CLAUDE.md 文件为后端开发提供了全面的指导,每个子模块都有详细的 CLAUDE.md 文件,确保开发过程中可以快速获取相关信息,提高开发效率。 |