Files
soul-yongping/.cursor/rules/soul-api.mdc

76 lines
4.0 KiB
Plaintext
Raw Permalink 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.

---
description: soul-api 路由边界 + 编码规范(合并版,防互窜 + GORM/Gin/响应约定)
globs: soul-api/**/*
alwaysApply: false
---
# soul-api 开发规范
> **Skill 加载**:编辑 soul-api 代码时,**必须使用 Read 工具读取 `e:\Gongsi\Mycontent\.cursor\skills\api-dev\SKILL.md` 的完整内容**,该 Skill 包含业务对接、与前端边界协同等补充约定。本规则侧重编码规范与路由边界。
## 1. 路由按使用方归类(强制)
新增或修改接口必须**先明确使用方**,再挂到对应路由组:
| 使用方 | 路由组 | 路径前缀 | 鉴权 |
|--------|--------|----------|------|
| 管理端 | `admin` / `db` | `/api/admin/…`、`/api/db/…` | `middleware.AdminAuth()` |
| 小程序 | `miniprogram` | `/api/miniprogram/…` | 按接口需要 |
| 两端共用 | `api` 下 + `miniprogram` 下各挂一遍 | `/api/xxx` 与 `/api/miniprogram/xxx` | 各自鉴权 |
即使业务逻辑相同,也必须按使用方做路径区分。禁止仅提供 `/api/vip/*` 等通用路径让两端混用。
### 禁止行为
- 禁止在 `miniprogram` 组挂仅管理端调用的接口后台审核、DB 初始化等)。
- 禁止在 `admin`/`db` 组挂小程序专属逻辑wx code 登录、小程序码生成等)。
- 禁止在 handler 内混用管理端/小程序路径语义(根据 path 分支写两套业务而不按使用方拆 handler/路由)。
handler 注释标明使用方,如 `// GET /api/miniprogram/withdraw/records 小程序-提现记录`。
管理端列表接口需包含:`user_name`/`userNickname`、`userAvatar`、`status`、`amount`。提现状态 DB 存 `pending`/`processing`/`success`/`failed`。
## 2. 数据访问:优先 GORM
- 通过 `database.DB()` 获取 `*gorm.DB`,操作集中在 `internal/model` 的模型上。
- 常规 CRUD 必须用链式 API`Where/First/Find/Create/Save/Updates/Delete`)。
- 原子更新用 `gorm.Expr`,如 `Update("pending_earnings", gorm.Expr("pending_earnings + ?", delta))`。
- 多表写入必须用 `db.Transaction(func(tx *gorm.DB) error { ... })`。
- 用 `Preload`/`Joins` 减少 N+1仅需单列时用 `Pluck`;重复条件抽 Scopes。
- 禁止 handler 中手写 `db.Exec/db.Raw`,除非:复杂统计 SQL 用 GORM 表达冗长(须加注释);原子多列 SET。
## 3. Model 与表结构
- 结构体放 `internal/model`,文件名与业务一致。
- 必须包含 `gorm` 标签column/primaryKey/type+ `json` 标签(小写驼峰)。
- 不对外暴露的字段用 `json:"-"`。
- 实现 `TableName() string`(若表名与默认不一致)。
## 4. 依赖物尽其用
- **Gin**:入参 `c.ShouldBindJSON` + `binding` 标签校验;统一 `c.JSON` 返回。
- **配置**:仅通过 `internal/config` 的 `config.Load()` 读环境变量,不直接 `os.Getenv`。
- **中间件**:安全头 `middleware.Secure()`,跨域 `cors`,限流 `middleware.NewRateLimiter`。
- **微信/支付**:统一走 `internal/wechat`PowerWeChathandler 只做参数与结果转换。
- **JWT**:管理端鉴权用 `internal/auth` 的 `IssueAdminJWT`/`ParseAdminJWT`/`GetAdminJWTFromRequest`。
## 5. 目录与包约定
- `cmd/server/main.go`:入口,只做初始化与启停。
- `internal/handler`HTTP 处理函数,绑定→校验→调 DB/wechat→写响应。逻辑复杂时抽到 `internal/service`。
- `internal/router`:注册路由与中间件,不写业务逻辑。
- `internal/database`:仅提供 `Init(dsn)` 与 `DB()`。
- 新增接口流程:确定使用方 → 确定路由 Group → 实现 handler + GORM model。
## 6. 响应与错误
- 成功:`gin.H{"success": true, "data": ...}` 或 `"message": "..."`。
- 失败:`gin.H{"success": false, "error": "..."}`。
- 不吞错误DB/wechat 的 `err` 必须处理并返回。
- HTTP 状态码:业务错误可用 200 + `success: false`;未授权/禁止用 401/403。
## 7. 代码风格
- 遵循 `gofmt`;导出函数 PascalCase内部 camelCase。
- 公开 handler 或复杂逻辑处写清用途注释。