Files
goalfylearning-admin/discuss/QUICK_START.md

337 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 快速开发指南
## 添加新配置模块的5分钟快速步骤
假设要添加 `PaymentConfig` (支付配置) 模块。
### 步骤 1: 创建模型 (30秒)
**文件**: `internal/models/payment_config.go`
复制 `user_level_config.go`,替换类名和字段即可。
### 步骤 2: 创建存储层 (1分钟)
**文件**: `internal/storage/payment_config_storage.go`
复制 `user_level_config_storage.go`,改成新的模型名称。
### 步骤 3: 创建服务层 (1分钟)
**文件**: `internal/services/payment_config_service.go`
复制 `user_level_config_service.go`,改成新的存储和模型名称。
### 步骤 4: 创建 Handler (1分钟)
**文件**: `internal/api/handlers/payment_config_handler.go`
复制 `user_level_config_handler.go`,改成新的服务名称。
### 步骤 5: 注册路由 (1分钟)
`internal/api/routes/routes.go` 中的 `SetupRoutes` 函数中添加:
```go
paymentConfigHandler := handlers.NewPaymentConfigHandler(paymentConfigService, logger)
paymentConfigs := admin.Group("/payment-configs")
{
paymentConfigs.GET("", paymentConfigHandler.List)
paymentConfigs.POST("", paymentConfigHandler.Create)
paymentConfigs.GET("/:id", paymentConfigHandler.GetByID)
paymentConfigs.PUT("/:id", paymentConfigHandler.Update)
paymentConfigs.DELETE("/:id", paymentConfigHandler.Delete)
}
```
### 步骤 6: 在 main.go 中注册服务 (30秒)
```go
paymentConfigService := services.NewPaymentConfigService(
storage.NewPaymentConfigStorage(),
logger,
)
router := routes.SetupRoutes(
// ... 其他服务
paymentConfigService,
// ...
)
```
### 步骤 7: 添加数据库迁移 (30秒)
`internal/storage/database.go``AutoMigrate` 中:
```go
err := DB.AutoMigrate(
&models.UserLevelConfig{},
&models.PaymentConfig{}, // 新增
)
```
---
## 文件复制清单
使用这个检查清单确保没有遗漏:
```
[ ] 创建模型文件 internal/models/payment_config.go
[ ] 定义主模型结构体
[ ] 定义 CreateRequest 结构体
[ ] 定义 UpdateRequest 结构体
[ ] 定义 ListRequest 结构体
[ ] 设置 TableName()
[ ] 创建存储文件 internal/storage/payment_config_storage.go
[ ] 定义接口
[ ] 实现 Create
[ ] 实现 GetByID
[ ] 实现 Update
[ ] 实现 Delete
[ ] 实现 List
[ ] 创建服务文件 internal/services/payment_config_service.go
[ ] 定义接口
[ ] 实现 Create包含验证
[ ] 实现 GetByID
[ ] 实现 Update
[ ] 实现 Delete
[ ] 实现 List
[ ] 创建处理器 internal/api/handlers/payment_config_handler.go
[ ] 实现 Create
[ ] 实现 GetByID
[ ] 实现 Update
[ ] 实现 Delete
[ ] 实现 List
[ ] 在 routes.go 中注册路由
[ ] 在 SetupRoutes 函数签名中添加参数
[ ] 创建 Handler 实例
[ ] 定义路由组
[ ] 添加所有 CRUD 路由
[ ] 在 main.go 中注册服务
[ ] 创建 Storage 实例
[ ] 创建 Service 实例
[ ] 在 SetupRoutes 调用中传入 Service
[ ] 在 database.go 中添加迁移
[ ] 在 AutoMigrate 中添加模型
```
---
## API 端点快速查询
### 用户等级配置模块已有端点
```
GET /api/admin/user-level-configs 列表(分页)
GET /api/admin/user-level-configs/all 列表(不分页)
POST /api/admin/user-level-configs 创建
GET /api/admin/user-level-configs/:id 详情
PUT /api/admin/user-level-configs/:id 更新
DELETE /api/admin/user-level-configs/:id 删除
PUT /api/admin/user-level-configs/:id/status 更新状态
```
### 新模块应该实现
```
GET /api/admin/[resource-name] 列表(分页)
POST /api/admin/[resource-name] 创建
GET /api/admin/[resource-name]/:id 详情
PUT /api/admin/[resource-name]/:id 更新
DELETE /api/admin/[resource-name]/:id 删除
```
---
## 常见错误排查
### 1. 导包错误
确保在每个文件顶部都有正确的导入:
```go
import (
"goalfymax-admin/internal/models"
"goalfymax-admin/internal/storage"
"goalfymax-admin/internal/services"
"goalfymax-admin/pkg/utils"
)
```
### 2. Handler 没有注册
-`SetupRoutes` 中创建了 Handler 实例吗?
- Handler 实例是否传给了路由组?
### 3. Service 没有注册
-`main.go` 中创建了 Service 实例吗?
- Service 实例是否传给了 `SetupRoutes`
### 4. 迁移失败
- 模型定义中是否有 `TableName()` 方法?
- 是否在 `database.go``AutoMigrate` 中添加了模型?
### 5. 字段验证不生效
检查请求模型中的 `binding` tag
- `required` - 必填
- `min=1,max=100` - 长度限制
- `email` - 邮箱格式
---
## 测试新模块
### 使用 curl 测试
```bash
# 创建
curl -X POST http://localhost:8087/api/admin/payment-configs \
-H "Content-Type: application/json" \
-d '{"key":"stripe_key","value":"sk_test_xxx","type":"string"}'
# 列表
curl http://localhost:8087/api/admin/payment-configs
# 详情
curl http://localhost:8087/api/admin/payment-configs/1
# 更新
curl -X PUT http://localhost:8087/api/admin/payment-configs/1 \
-H "Content-Type: application/json" \
-d '{"key":"stripe_key","value":"sk_test_yyy"}'
# 删除
curl -X DELETE http://localhost:8087/api/admin/payment-configs/1
```
---
## 关键对比表
### Models 文件
| 用户等级配置 | 新模块 |
|-----------|--------|
| `user_level_config.go` | `payment_config.go` |
| `UserLevelConfig` | `PaymentConfig` |
| `UserLevelConfigCreateRequest` | `PaymentConfigCreateRequest` |
| `admin_user_level_configs` | `admin_payment_configs` |
### Storage 文件
| 用户等级配置 | 新模块 |
|-----------|--------|
| `user_level_config_storage.go` | `payment_config_storage.go` |
| `UserLevelConfigStorage` | `PaymentConfigStorage` |
| `NewUserLevelConfigStorage()` | `NewPaymentConfigStorage()` |
### Service 文件
| 用户等级配置 | 新模块 |
|-----------|--------|
| `user_level_config_service.go` | `payment_config_service.go` |
| `UserLevelConfigService` | `PaymentConfigService` |
| `NewUserLevelConfigService()` | `NewPaymentConfigService()` |
### Handler 文件
| 用户等级配置 | 新模块 |
|-----------|--------|
| `user_level_config_handler.go` | `payment_config_handler.go` |
| `UserLevelConfigHandler` | `PaymentConfigHandler` |
| `NewUserLevelConfigHandler()` | `NewPaymentConfigHandler()` |
### Routes 注册
| 用户等级配置 | 新模块 |
|-----------|--------|
| `/user-level-configs` | `/payment-configs` |
| `userLevelConfigHandler` | `paymentConfigHandler` |
| `userLevelConfigService` | `paymentConfigService` |
---
## 模板代码片段
### 最小模型
```go
package models
import "time"
type PaymentConfig struct {
ID uint `json:"id" gorm:"primaryKey;autoIncrement"`
Key string `json:"key" gorm:"uniqueIndex;not null"`
Value string `json:"value" gorm:"type:longtext"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (PaymentConfig) TableName() string {
return "admin_payment_configs"
}
```
### 最小 Handler 方法
```go
func (h *PaymentConfigHandler) Create(c *gin.Context) {
var req models.PaymentConfigCreateRequest
if err := c.ShouldBindJSON(&req); err != nil {
h.response.ValidateError(c, err)
return
}
result, err := h.service.Create(&req)
if err != nil {
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, result)
}
```
### 最小 Service 方法
```go
func (s *paymentConfigService) Create(req *models.PaymentConfigCreateRequest) (*models.PaymentConfig, error) {
config := &models.PaymentConfig{
Key: req.Key,
Value: req.Value,
}
if err := s.storage.Create(config); err != nil {
s.logger.Error("创建支付配置失败", zap.Error(err))
return nil, errors.New("创建失败")
}
return config, nil
}
```
---
## 内存关键点
1. **三层架构**: Handler -> Service -> Storage
2. **接口优先**: Service 和 Storage 都是接口
3. **命名规范**: `admin_[resource]s` 表名
4. **错误处理**: Service 返回有意义的错误Handler 返回 HTTP 响应
5. **日志**: 每个操作都要记录日志
6. **验证**: Binding tag + Service 层验证
---
## 下一步
如需添加新的配置模块,只需:
1. 复制现有配置模块(如 `user_level_config`
2. 全量替换类名和结构
3. 调整业务逻辑验证(如果有的话)
4. 完成!
预计耗时5-10分钟