基本使用
使用命令行将sql表生成一个数据表格类型,如:
1
CREATE TABLE `users` (
2
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
3
`name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
4
`gender` tinyint(4) DEFAULT NULL,
5
`city` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
6
`ip` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
7
`phone` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
8
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
9
`updated_at` timestamp NULL DEFAULT NULL,
10
PRIMARY KEY (`id`)
11
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Copied!
生成了:
1
package main
2
3
import (
4
...
5
)
6
7
func GetUserTable(ctx *context.Context) (userTable table.Table) {
8
9
// 初始化数据表模型
10
userTable = table.NewDefaultTable(table.Config{...})
11
12
info := userTable.GetInfo()
13
14
// 设置ID为可排序
15
info.AddField("ID", "id", db.Int).FieldSortable(true)
16
info.AddField("Name", "name", db.Varchar)
17
18
...
19
20
// 设置页面标题和描述
21
info.SetTable("users").SetTitle("Users").SetDescription("Users").
22
SetAction(template.HTML(`<a href="http://google.com"><i class="fa fa-google"></i></a>`)) // custom operation button
23
24
...
25
}
Copied!

添加列

1
// 添加一个字段,字段标题为 ID,字段名为 id,字段类型为 int
2
info.AddField("ID", "id", db.Int)
3
4
// 添加第二个字段,字段标题为 Name,字段名为 name,字段类型为 varchar
5
info.AddField("Name", "name", db.Varchar)
6
7
// 添加第三个字段,一个sql表不存在的字段
8
info.AddField("Custom", "custom", db.Varchar)
Copied!

修改显示输出

1
// 根据字段的值输出对应的内容
2
info.AddField("Gender", "gender", db.Tinyint).FieldDisplay(func(model types.FieldModel) interface{} {
3
if model.Value == "0" {
4
return "men"
5
}
6
if model.Value == "1" {
7
return "women"
8
}
9
return "unknown"
10
})
11
12
// 输出html
13
info.AddField("Name", "name", db.Varchar).FieldDisplay(func(model types.FieldModel) interface{} {
14
return "<span class='label'>" + model.Value + "</span>"
15
})
Copied!
FieldDisplay方法接收的匿名函数绑定了当前行的数据对象,可以在里面调用当前行的其它字段数据
1
info.AddField("First Name", "first_name", db.Varchar).FieldHide()
2
info.AddField("Last Name", "last_name", db.Varchar).FieldHide()
3
4
// 不存的字段列
5
info.AddField("Full Name", "full_name", db.Varchar).FieldDisplay(func(model types.FieldModel) interface{} {
6
return model.Row["first_name"].(string) + " " + model.Row["last_name"].(string)
7
})
Copied!

禁用创建按钮

1
info.HideNewButton()
Copied!

隐藏编辑按钮

1
info.HideEditButton()
Copied!

隐藏导出按钮

1
info.HideExportButton()
Copied!

隐藏删除按钮

1
info.HideDeleteButton()
Copied!

隐藏详情按钮

1
info.HideDetailButton()
Copied!

默认隐藏列选择框

1
info.HideRowSelector()
Copied!

默认隐藏筛选框

1
info.HideFilterArea()
Copied!

预查询

1
// 字段, 操作符, 参数
2
info.Where("type", "=", 0)
3
// 原生sql
4
info.WhereRaw("type = 0 or sex = 1")
5
// or语句,以下会生成:type = 3 or type = 0
6
info.Where("type", "=", 3).WhereOr("type", "=", 0)
Copied!

自定义主键

1
userTable = table.NewDefaultTable(table.DefaultConfig().SetPrimaryKey("UUID", db.Varchar))
Copied!

导出设置

1
// 设置导出未经显示处理的原生值,默认为显示处理后的值
2
info.ExportValue()
Copied!

设置筛选表单布局

1
info.SetFilterFormLayout(layout form.Layout)
Copied!

设置筛选表单项宽度

1
// 设置标题宽度,1到12,默认为2
2
info.SetFilterFormHeadWidth(w int)
3
// 设置输入框宽度,1到12,默认为10,两者之和为12
4
info.SetFilterFormInputWidth(w int)
Copied!

自定义筛选逻辑

1
info.SetQueryFilterFn(func(param parameter.Parameters, conn db.Connection) (ids []string, stopQuery bool) {
2
// 根据参数与连接对象返回表格筛选id,stopQuery代表是否停止框架逻辑的筛选,是的话直接则返回当前结果
3
})
Copied!

设置默认排序规则

1
// 顺序
2
info.SetSortAsc()
3
// 倒序
4
info.SetSortDesc()
Copied!

设置默认排序字段

1
info.SetSortField("created_at")
Copied!

连表

连表需要设置连表表名与连表字段
1
// 增加字段名
2
info.AddField("Role Name", "role_name", db.Varchar).FieldJoin(types.Join{
3
Table: "role", // 连表的表名
4
Field: "id", // 要连表的字段
5
JoinField: "user_id", // 连表的表的字段
6
})
Copied!
这将会生成类似这样的sql语句:
1
select ..., role.`role_name` from users left join role on users.`id` = role.`user_id` where ...
Copied!
多对多关系的连表,只需继续使用 FieldJoin :
1
info.AddField("Role Name", "role_name", db.Varchar)FieldJoin(types.Join{
2
Table: "role_users",
3
JoinField: "user_id",
4
Field: "id",
5
}).
6
FieldJoin(types.Join{
7
Table: "roles",
8
JoinField: "id",
9
Field: "role_id",
10
BaseTable: "role_users",
11
})
Copied!
这将会生成类似这样的sql语句:
1
select ..., roles.`role_name` from users left join role on users.`id` = role_users.`user_id` left join role_users.`role_id` = role.`id` where ...
Copied!
从而完成一次多对多关系的查询。

新增按钮

如果您需要新增一些功能按钮,可以调用:
1
info.AddButton(title template.HTML, icon string, action Action, color ...template.HTML)
Copied!
其中,title为Button的标题,icon为Button的icon,action为Button的操作,color为背景色与文字颜色。
例如:
1
import (
2
...
3
"github.com/GoAdminGroup/go-admin/template/icon"
4
"github.com/GoAdminGroup/go-admin/template/types/action"
5
...
6
)
7
8
info.AddButton("今日情况", icon.Save, action.PopUp("/admin/data/analyze", "数据分析"))
Copied!
添加了一个popup的操作,将会去请求对应路由,对应路由返回的就是popup的内容,「数据分析」为对应popup的标题。
操作的类Action为一个接口,如下:
1
type Action interface {
2
// 返回对应的JS
3
Js() template.JS
4
// 获取class
5
BtnClass() template.HTML
6
// 返回按钮的属性
7
BtnAttribute() template.HTML
8
// 返回额外的HTML
9
ExtContent() template.HTML
10
// 设置按钮的ID,供给Js()方法调用
11
SetBtnId(btnId string)
12
// 设置数据
13
SetBtnData(data interface{})
14
// 返回请求节点,包括路由方法和对应控制器方法
15
GetCallbacks() context.Node
16
}
Copied!
可以自己实现一个Action,也可以直接使用框架提供的Action。系统内置提供以下四个Action,一个是popup操作,一个是跳转操作,一个ajax操作,还有过滤操作(用于下拉框)。
1
import (
2
"github.com/GoAdminGroup/go-admin/template/types/action"
3
)
4
5
// 返回一个Jump Action,参数一为url,参数二为额外的html
6
// Jump Action是一个跳转操作。如果需要跳转url中带上id,可以这样写:
7
//
8
action.Jump("/admin/info/manager?id={{.Id}}")
9
//
10
// 其中{{.Id}}为id的占位符
11
12
action.Jump("/admin/info/manager")
13
action.JumpInNewTab("/admin/info/manager", "管理员")
14
15
// 如果是行中的action,想要取得同行数据作为参数,比如行中有一列叫name,那么可以这样传:
16
action.Jump(`/admin/info/manager?name={{(index .Value "name").Value}}`)
17
18
// 这里 (index .Value "name") 取得的对象是:https://godoc.org/github.com/GoAdminGroup/go-admin/template/types#InfoItem
19
20
// 返回一个PopUp Action,参数一为url,参数二为popup标题,参数三为对应的控制器方法。
21
// 用户点击按钮后会请求对应的方法,带上请求id,请求转发到对应控制器方法后进行处理返回。
22
action.PopUp("/admin/popup", "Popup Example", func(ctx *context.Context) (success bool, msg string, data interface{}) {
23
// 获取参数
24
// ctx.FormValue["id"]
25
// ctx.FormValue["ids"]
26
27
// 这里返回的data为前端显示html内容
28
return true, "", "<h2>hello world</h2>"
29
})
30
31
// 返回一个Ajax Action,参数一为url,参数二为对应的控制器方法。
32
action.Ajax("/admin/ajax",
33
func(ctx *context.Context) (success bool, msg string, data interface{}) {
34
// 获取参数
35
// ctx.FormValue["id"] 选择的id
36
// ctx.FormValue["ids"] 选择的id列表,是逗号分割的字符串
37
return true, "success", ""
38
})
Copied!
新增下拉筛选按钮
1
// 参数一位标题,参数二为选项,参数三为action
2
info.AddSelectBox("gender", types.FieldOptions{
3
{Value: "", Text: ""},
4
{Value: "0", Text: "men"},
5
{Value: "1", Text: "women"},
6
}, action.FieldFilter("gender"))
Copied!
FieldFilter中的参数为筛选字段名。

新增列按钮

有时候想要增加一个列的操作按钮,可以使用:
1
info.AddColumnButtons(head string, buttons ...Button)
Copied!

增加列内容

如果你单纯想增加一列,跟数据库字段不是一对一,可以使用这个API。
1
info.AddColumn(head string, fn FieldFilterFn)
Copied!

设置详情页

可以自定义详情页显示内容
1
package datamodel
2
3
import (
4
...
5
)
6
7
func GetUserTable(ctx *context.Context) (userTable table.Table) {
8
9
userTable = table.NewDefaultTable(table.Config{...})
10
11
detail := userTable.GetDetail()
12
13
detail.AddField("ID", "id", db.Int)
14
detail.AddField("Name", "name", db.Varchar)
15
16
detail.SetTable("users").
17
SetTitle("用户详情").
18
SetDescription("用户详情")
19
20
...
21
}
Copied!
如果你想直接复制列表的设置,并且再增加额外的字段
1
detail := userTable.GetDetailFromInfo()
2
detail.AddField("额外字段", "external", db.Varchar)
Copied!
注意:如果不设置的话,则默认用列表页设置的显示

自定义数据源

如果您想自己定义一个数据源,不想从SQL数据库中自动读取,可以有两种方式:

编写自定义数据源函数

1
package main
2
3
import (
4
...
5
"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter"
6
...
7
)
8
9
func GetUserTable(ctx *context.Context) (userTable table.Table) {
10
11
userTable = table.NewDefaultTable(table.Config{
12
...
13
})
14
15
info := externalTable.GetInfo()
16
info.AddField("ID", "id", db.Int).FieldSortable()
17
info.AddField("Title", "title", db.Varchar)
18
19
info.SetTable("external").
20
SetTitle("Externals").
21
SetDescription("Externals").
22
// 返回值:第一个为数据列表,第二个为数据量
23
SetGetDataFn(func(param parameter.Parameters) (data []map[string]interface{}, size int) {
24
// 注意需要对以下两种情况进行处理
25
26
// 情况1:返回全部数据
27
param.IsAll()
28
29
// 情况2:返回指定主键对应的数据
30
param.PK()
31
32
// 对于参数说明
33
//
34
// param.SortField 排序字段
35
// param.Fields 筛选的字段
36
// param.SortType 排序类型
37
// param.Columns 隐藏的字段
38
// param.PageSize 每页数据数
39
// param.Page 当面页码
40
41
return []map[string]interface{}{
42
{
43
"id": 10,
44
"title": "this is a title",
45
}, {
46
"id": 11,
47
"title": "this is a title2",
48
}, {
49
"id": 12,
50
"title": "this is a title3",
51
}, {
52
"id": 13,
53
"title": "this is a title4",
54
},
55
}, 10
56
})
57
58
...
59
}
Copied!

通过设置数据源URL

设置数据源链接,GoAdmin将自动从数据源链接拉取数据。如下:
1
package main
2
3
import (
4
...
5
)
6
7
func GetUserTable(ctx *context.Context) (userTable table.Table) {
8
9
// 初始化数据表模型,并设置数据源url
10
userTable = table.NewDefaultTable(table.Config{
11
...
12
SourceURL: "http://xx.xx.xx.xx/xxx",
13
...
14
})
15
16
info := userTable.GetInfo()
17
18
// 设置ID为可排序
19
info.AddField("ID", "id", db.Int).FieldSortable(true)
20
info.AddField("Name", "name", db.Varchar)
21
22
...
Copied!
设置好数据源url后,数据源需满足返回的数据格式为JSON,并按照以下结构返回:
1
{
2
"data": [
3
{
4
"id": 1,
5
"name":"张三"
6
},{
7
"id": 2,
8
"name":"李四"
9
}
10
],
11
"size": 10
12
}
Copied!
说明:
data: 为数据表数据,是数组,每一个数组项表示一行数据,数据项的键表示字段名,对应值表示字段值。
size: 为所有数据的总量
在数据源url对应接口中,会收到以下URL参数:
__page: 当面页码
__pageSize: 页面数据数
__sort: 排序字段
__sort_type: 排序类型
__columns: 隐藏的字段
接口需拿取对应的URL参数进行处理返回对应的JSON格式数据,GoAdmin会将数据展示出来。
Last modified 9mo ago