mirror of
https://gitee.com/dromara/mayfly-go
synced 2026-05-17 00:15:25 +08:00
60 lines
1.4 KiB
Markdown
60 lines
1.4 KiB
Markdown
---
|
||
trigger: always_on
|
||
---
|
||
|
||
# API 层规范
|
||
|
||
## Handler 标准结构
|
||
|
||
```go
|
||
type Db struct {
|
||
dbApp application.Db `inject:"T"`
|
||
tagApp tagapp.TagTree `inject:"T"`
|
||
}
|
||
|
||
// @router /api/dbs [get]
|
||
func (d *Db) Dbs(rc *req.Ctx) {
|
||
queryCond := req.BindQuery[entity.DbQuery](rc) // 1. 绑定参数
|
||
loginAccount := rc.GetLoginAccount() // 2. 获取上下文
|
||
result, err := d.dbApp.GetPageList(queryCond) // 3. 调用应用层
|
||
biz.ErrIsNil(err) // 4. 断言错误(仅API层)
|
||
rc.ResData = result // 5. 返回结果
|
||
}
|
||
```
|
||
|
||
## 路由配置
|
||
|
||
```go
|
||
func (d *Db) ReqConfs() *req.Confs {
|
||
return req.NewConfs("/dbs",
|
||
req.NewGet("", d.Dbs),
|
||
req.NewPost("", d.Save).Log(req.NewLogSaveI(imsg.LogDbSave)),
|
||
req.NewDelete(":dbId", d.DeleteDb).Log(req.NewLogSaveI(imsg.LogDbDelete)),
|
||
)
|
||
}
|
||
```
|
||
|
||
## 断言边界
|
||
|
||
**✅ API 层可用断言**:
|
||
|
||
```go
|
||
func (d *Db) Save(rc *req.Ctx) {
|
||
form := req.BindFormAndValid[form.DbForm](rc)
|
||
biz.IsTrue(form.InstanceId > 0, "实例ID不能为空")
|
||
biz.ErrIsNil(d.dbApp.SaveDb(rc, &entity.Db{Name: form.Name}))
|
||
rc.ResData = "保存成功"
|
||
}
|
||
```
|
||
|
||
**🚫 Application 层禁止断言,必须返回 error**:
|
||
|
||
```go
|
||
func (d *dbAppImpl) SaveDb(ctx context.Context, db *entity.Db) error {
|
||
if db.Name == "" {
|
||
return errorx.NewBiz("名称不能为空")
|
||
}
|
||
return d.Save(ctx, db)
|
||
}
|
||
```
|