# dto

首先介绍以下 dto 在 go-admin 中的作用。dto 是一个数据接收模块,每一个请求进来,携带的数据需要在 dto 中进行处理验证;

# Import

package dto

import (
	"github.com/gin-gonic/gin"
	"github.com/go-admin-team/go-admin-core/sdk/api"

	"go-admin/app/admin/models"
	"go-admin/common/dto"
	common "go-admin/common/models"
)
1
2
3
4
5
6
7
8
9
10

# Search 模块

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

接口名称 说明
GetNeedSearch 实现 gorm 的 scope
Bind 数据 Bind
Generate 模型转换

样例代码:

type SysFileDirSearch struct {
	dto.Pagination `search:"-"`
	ID    int    `form:"Id" search:"type:exact;column:id;table:sys_file_dir" comment:"标识"`
	Label string `form:"label" search:"type:exact;column:label;table:sys_file_dir" comment:"目录名称"`
	PId   string `form:"pId" search:"type:exact;column:p_id;table:sys_file_dir" comment:"上级目录"`
	Path string `form:"path" search:"type:exact;column:path;table:sys_file_dir" comment:"路径"`
}

func (m *SysFileDirSearch) GetNeedSearch() interface{} {
	return *m
}

// Bind 数据Bind
func (m *SysFileDirSearch) Bind(ctx *gin.Context) error {
	log := api.GetRequestLogger(ctx)
	err := ctx.ShouldBind(m)
	if err != nil {
		log.Debugf("ShouldBind error: %s", err.Error())
	}
	return err
}

// Generate 模型转换
func (m *SysFileDirSearch) Generate() dto.Index {
	o := *m
	return &o
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# struct 说明

只针对 serach 中内容说明:

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

# type 说明

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

示例:

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"`
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# Form 模块

接口名称 说明
Bind 数据 Bind
Generate 模型转换
GenerateM 数据模型转化
GetId 获取数据 id 属性
type SysFileDirControl struct {
	ID       int    `uri:"Id" comment:"标识"` // 标识
	Label    string `json:"label" comment:"目录名称"`
	PId      int    `json:"pId" comment:"上级目录"`
	Sort     string `json:"sort" comment:"排序"`
	Path     string `json:"path" comment:"路径"`
	CreateBy int    `json:"-"`
	UpdateBy int    `json:"-"`
}

func (s *SysFileDirControl) Bind(ctx *gin.Context) error {
	log := api.GetRequestLogger(ctx)
	err := ctx.ShouldBindUri(s)
	if err != nil {
		log.Debugf("ShouldBindUri error: %s", err.Error())
		return err
	}
	err = ctx.ShouldBind(s)
	if err != nil {
		log.Debugf("ShouldBind error: %s", err.Error())
	}
	return err
}

func (s *SysFileDirControl) Generate() dto.Control {
	cp := *s
	return &cp
}

func (s *SysFileDirControl) GenerateM() (common.ActiveRecord, error) {
	return &models.SysFileDir{
		Model: common.Model{Id: s.ID},
		Label: s.Label,
		PId:   s.PId,
		//Sort:  s.Sort,
		Path: s.Path,
		ControlBy: common.ControlBy{
			CreateBy: s.CreateBy,
			UpdateBy: s.UpdateBy,
		},
	}, nil
}

func (s *SysFileDirControl) GetId() interface{} {
	return s.ID
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

# Delete & detail 模块

接口名称 说明
Bind 数据 Bind,不需要实现,go-admin 已经内置
Generate 模型转换
GenerateM 数据模型转化
type SysFileDirById struct {
	dto.ObjectById
	UpdateBy int `json:"-"`
}

func (s *SysFileDirById) Generate() dto.Control {
	cp := *s
	return &cp
}

func (s *SysFileDirById) GenerateM() (common.ActiveRecord, error) {
	return &models.SysFileDir{}, nil
}
1
2
3
4
5
6
7
8
9
10
11
12
13
上次更新: 2021/6/1 下午6:56:16