go-admingo-admin
  • 指南
  • 开发
    • 进阶
    • 指令
  • 前端
  • 高阶
  • 授权
  • 帮助
  • GitHub
  • Changelog
⌘ K
标准写法
标准模块开发
服务端基础
后端目录结构
后端配置文件
启动后端服务
前端基础
前端目录结构
前端配置文件
启动前端服务
开发模式
Actions 模式
常规模式
第一个接口
分层开发
API 层
Service 层
DTO 定义
Model 定义
路由注册
多环境配置
数据库表规范
数据权限
统一响应
代码生成
生成前配置
生成业务代码
一键生成菜单
菜单绑定接口
配置角色权限
验证功能
用 AI 生成代码
进阶能力
Runtime 核心 API
认证与鉴权
日志
请求追踪
缓存
队列
文件上传
限流
定时任务
Air 热加载
Swagger 文档
代码生成工具
最后更新时间:
Open-source MIT Licensed | Copyright © 2020-present
Powered by go-admin-team

TABLE OF CONTENTS

‌
‌
‌
‌

DTO 定义

DTO(Data Transfer Object)描述一次请求携带的数据:字段、校验规则,以及列表查询时的搜索条件。请求进入后先由 DTO 接收与校验,再进入后续处理。

go-admin 中的 DTO 分三类:列表查询用 Search、新增修改用 Control、按 ID 操作用 ById。

INFO

每个模块都需要这一层,无论使用 Actions 模式 还是常规模式。

Import

go
package dto
import (
"go-admin/app/admin/models"
common "go-admin/common/models"
"go-admin/common/dto"
)

Search 模块

首先定义 search 接口对应的请求数据接收属性,其次是根据需要将属性一一列出。

接口名称说明
GetNeedSearch实现 gorm 的 scope

样例代码:

go
// SysPostPageReq 列表或者搜索使用结构体
type SysPostPageReq struct {
dto.Pagination `search:"-"`
PostId int `form:"postId" search:"type:exact;column:post_id;table:sys_post" comment:"id"` // id
PostName string `form:"postName" search:"type:contains;column:post_name;table:sys_post" comment:"名称"` // 名称
PostCode string `form:"postCode" search:"type:contains;column:post_code;table:sys_post" comment:"编码"` // 编码
Sort int `form:"sort" search:"type:exact;column:sort;table:sys_post" comment:"排序"` // 排序
Status int `form:"status" search:"type:exact;column:status;table:sys_post" comment:"状态"` // 状态
Remark string `form:"remark" search:"type:exact;column:remark;table:sys_post" comment:"备注"` // 备注
}
func (m *SysPostPageReq) GetNeedSearch() interface{} {
return *m
}

struct 说明

只针对 serach 中内容说明:

tags 名称说明
type操作类型
column数据库表字段名
table数据库表名称

type 说明

type描述query 示例
exact/iexact等于status=1
glt不等于postName<>1
contains/icontanins包含name=n
gt/gte大于/大于等于age=18
lt/lte小于/小于等于age=18
startswith/istartswith以…起始content=hell
endswith/iendswith以…结束content=world
inin 查询status=0&status=1
isnullisnull 查询startTime=1
order排序sort=asc/sort=desc
join链接-

示例:

go
type ApplicationQuery struct {
Id string `search:"type:icontains;column:id;table:receipt" form:"id"`
Domain string `search:"type:icontains;column:domain;table:receipt" form:"domain"`
Version string `search:"type:exact;column:version;table:receipt" form:"version"`
Status []int `search:"type:in;column:status;table:receipt" form:"status"`
Start time.Time `search:"type:gte;column:created_at;table:receipt" form:"start"`
End time.Time `search:"type:lte;column:created_at;table:receipt" form:"end"`
TestJoin `search:"type:left;on:id:receipt_id;table:receipt_goods;join:receipts"`
ApplicationOrder
}
type ApplicationOrder struct {
IdOrder string `search:"type:order;column:id;table:receipt" form"id_order"`
}
type TestJoin struct {
PaymentAccount string `search:"type:icontains;column:payment_account;table:receipts" form:"payment_account"`
}

Insert 模块

接口名称说明
Generate模型转换
GetId获取数据 id 属性
go
// SysPostInsertReq 增使用的结构体
type SysPostInsertReq struct {
PostId int `uri:"id" comment:"id"`
PostName string `form:"postName" comment:"名称"`
PostCode string `form:"postCode" comment:"编码"`
Sort int `form:"sort" comment:"排序"`
Status int `form:"status" comment:"状态"`
Remark string `form:"remark" comment:"备注"`
common.ControlBy
}
func (s *SysPostInsertReq) Generate(model *models.SysPost) {
model.PostName = s.PostName
model.PostCode = s.PostCode
model.Sort = s.Sort
model.Status = s.Status
model.Remark = s.Remark
if s.ControlBy.UpdateBy != 0 {
model.UpdateBy = s.UpdateBy
}
if s.ControlBy.CreateBy != 0 {
model.CreateBy = s.CreateBy
}
}
// GetId 获取数据对应的ID
func (s *SysPostInsertReq) GetId() interface{} {
return s.PostId
}

Update 模块

接口名称说明
Generate模型转换
GetId获取数据 id 属性
go
// SysPostUpdateReq 改使用的结构体
type SysPostUpdateReq struct {
PostId int `uri:"id" comment:"id"`
PostName string `form:"postName" comment:"名称"`
PostCode string `form:"postCode" comment:"编码"`
Sort int `form:"sort" comment:"排序"`
Status int `form:"status" comment:"状态"`
Remark string `form:"remark" comment:"备注"`
common.ControlBy
}
func (s *SysPostUpdateReq) Generate(model *models.SysPost) {
model.PostId = s.PostId
model.PostName = s.PostName
model.PostCode = s.PostCode
model.Sort = s.Sort
model.Status = s.Status
model.Remark = s.Remark
if s.ControlBy.UpdateBy != 0 {
model.UpdateBy = s.UpdateBy
}
if s.ControlBy.CreateBy != 0 {
model.CreateBy = s.CreateBy
}
}
func (s *SysPostUpdateReq) GetId() interface{} {
return s.PostId
}

Get 模块

接口名称说明
GetId获取数据 id 属性
go
// SysPostGetReq 获取单个的结构体
type SysPostGetReq struct {
Id int `uri:"id"`
}
func (s *SysPostGetReq) GetId() interface{} {
return s.Id
}

Delete 模块

接口名称说明
Generate模型转换
GetId获取数据 id 属性
go
// SysPostDeleteReq 删除的结构体
type SysPostDeleteReq struct {
Ids []int `json:"ids"`
common.ControlBy
}
func (s *SysPostDeleteReq) Generate(model *models.SysPost) {
if s.ControlBy.UpdateBy != 0 {
model.UpdateBy = s.UpdateBy
}
if s.ControlBy.CreateBy != 0 {
model.CreateBy = s.CreateBy
}
}
func (s *SysPostDeleteReq) GetId() interface{} {
return s.Ids
}

WARNING

从哪里获得帮助:

如果你在阅读本教程的过程中有任何疑问,可以前往提交建议。