Admin插件使用


admin插件可以帮助你实现快速生成数据库数据表增删改查的Web数据管理平台。

快速开始

需要如下几步:

  • 生成数据表对应的配置文件
  • 设置访问路由
  • 初始化,并在引擎中加载
  • 设置访问菜单

生成配置文件

假设你的数据库里面有一个数据表users,如:

  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;

使用自带的命令行工具可以帮助你快速生成配置文件,如:

  • 安装
  1. go install github.com/GoAdminGroup/go-admin/adm
  • 生成

在项目文件夹下执行

  1. adm generate

注意:选择表格的时候,按空格选择,不是按回车

根据提示填写信息,运行完之后,会生成一个文件users.go,这个就是对应数据表的配置文件了,关于如何配置,在后面详细介绍。

设置访问路由

生成完配置文件后,同时也会生成一个路由配置文件tables.go,如:

  1. package main
  2. import "github.com/GoAdminGroup/go-admin/plugins/admin/models"
  3. // The key of Generators is the prefix of table info url.
  4. // The corresponding value is the Form and Table data.
  5. //
  6. // http://{{config.DOMAIN}}:{{PORT}}/{{config.PREFIX}}/info/{{key}}
  7. //
  8. // example:
  9. //
  10. // "user" => http://localhost:9033/admin/info/user
  11. //
  12. var Generators = map[string]models.TableGenerator{
  13. "user": GetUserTable,
  14. }

其中,"user"就是对应的访问路由前缀,GetUserTable就是表格数据生成方法。对应的访问路由地址就是:http://localhost:9033/admin/info/user

初始化,并在引擎中加载

初始化,需要调用NewAdmin方法,然后将上面的Generators传进去即可。然后再调用引擎的AddPlugins方法加载引擎。

  1. package main
  2. import (
  3. "github.com/gin-gonic/gin"
  4. _ "github.com/GoAdminGroup/go-admin/adapter/gin" // 必须引入,如若不引入,则需要自己定义
  5. _ "github.com/GoAdminGroup/themes/adminlte" // 必须引入,不然报错
  6. _ "github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql"
  7. "github.com/GoAdminGroup/go-admin/engine"
  8. "github.com/GoAdminGroup/go-admin/plugins/admin"
  9. "github.com/GoAdminGroup/go-admin/modules/config"
  10. "github.com/GoAdminGroup/go-admin/modules/language"
  11. )
  12. func main() {
  13. r := gin.Default()
  14. eng := engine.Default()
  15. cfg := config.Config{
  16. Databases: config.DatabaseList{
  17. "default": {
  18. Host: "127.0.0.1",
  19. Port: "3306",
  20. User: "root",
  21. Pwd: "root",
  22. Name: "godmin",
  23. MaxIdleCon: 50,
  24. MaxOpenCon: 150,
  25. Driver: config.DriverMysql,
  26. },
  27. },
  28. UrlPrefix: "admin", // 访问网站的前缀
  29. // Store 必须设置且保证有写权限,否则增加不了新的管理员用户
  30. Store: config.Store{
  31. Path: "./uploads",
  32. Prefix: "uploads",
  33. },
  34. Language: language.CN,
  35. }
  36. adminPlugin := admin.NewAdmin(Generators)
  37. // 也可以调用 AddGenerator 方法加载
  38. // adminPlugin.AddGenerator("user", GetUserTable)
  39. eng.AddConfig(cfg).
  40. AddPlugins(adminPlugin). // 加载插件
  41. Use(r)
  42. r.Run(":9033")
  43. }

设置访问菜单

运行起来后,访问登录网址,进入到菜单管理页面,设置好数据表的管理菜单就可以在侧边栏中进入了。

注:

在以上例子中,登录网址为:http://localhost:9033/admin/login

菜单管理页面为:http://localhost:9033/admin/menu

业务数据表生成方法文件介绍

  1. package datamodel
  2. import (
  3. "fmt"
  4. "github.com/GoAdminGroup/go-admin/modules/db"
  5. form2 "github.com/GoAdminGroup/go-admin/plugins/admin/modules/form"
  6. "github.com/GoAdminGroup/go-admin/plugins/admin/modules/table"
  7. "github.com/GoAdminGroup/go-admin/template/types"
  8. "github.com/GoAdminGroup/go-admin/template/types/form"
  9. )
  10. func GetUserTable() (userTable table.Table) {
  11. // 设置模型配置
  12. userTable = table.NewDefaultTable(table.Config{
  13. Driver: db.DriverMysql,
  14. CanAdd: true, // 是否可以新增
  15. Editable: true, // 是否可以编辑
  16. Deletable: true, // 是否可以删除
  17. Exportable: true, // 是否可以导出为excel
  18. Connection: table.DefaultConnectionName,
  19. PrimaryKey: table.PrimaryKey{
  20. Type: db.Int,
  21. Name: table.DefaultPrimaryKeyName,
  22. },
  23. })
  24. info := userTable.GetInfo()
  25. // AddField方法,第一个参数为标题,第二参数为字段名,第三个参数为字段的数据库类型
  26. // 设置主键id为可排序
  27. info.AddField("ID", "id", db.Int).FieldSortable(true)
  28. info.AddField("Name", "name", db.Varchar)
  29. // 使用 FieldDisplay 过滤性别显示
  30. info.AddField("Gender", "gender", db.Tinyint).FieldDisplay(func(model types.FieldModel) interface{} {
  31. if model.Value == "0" {
  32. return "men"
  33. }
  34. if model.Value == "1" {
  35. return "women"
  36. }
  37. return "unknown"
  38. })
  39. info.AddField("Phone", "phone", db.Varchar)
  40. info.AddField("City", "city", db.Varchar)
  41. info.AddField("CreatedAt", "created_at", db.Timestamp)
  42. info.AddField("UpdatedAt", "updated_at", db.Timestamp)
  43. // 设置表格页面标题和描述,以及对应sql表名
  44. info.SetTable("users").SetTitle("Users").SetDescription("Users").
  45. SetAction(template.HTML(`<a href="http://google.com"><i class="fa fa-google"></i></a>`)) // 自定义操作按钮
  46. formList := userTable.GetForm()
  47. // 设置主键Id不可以编辑
  48. formList.AddField("ID", "id", db.Int, form.Default).FieldNotAllowEdit()
  49. formList.AddField("Ip", "ip", db.Varchar, form.Text)
  50. formList.AddField("Name", "name", db.Varchar, form.Text)
  51. // 使用 FieldOptions 设置 radio 类型内容
  52. formList.AddField("Gender", "gender", db.Tinyint, form.Radio).
  53. FieldOptions([]map[string]string{
  54. {
  55. "field": "gender",
  56. "label": "male",
  57. "value": "0",
  58. "selected": "true",
  59. }, {
  60. "field": "gender",
  61. "label": "female",
  62. "value": "1",
  63. "selected": "false",
  64. },
  65. })
  66. formList.AddField("Phone", "phone", db.Varchar, form.Text)
  67. formList.AddField("City", "city", db.Varchar, form.Text)
  68. // 自定义一个表单字段,使用 FieldPostFilterFn 可以进行连表操作
  69. formList.AddField("Custom Field", "role", db.Varchar, form.Text).
  70. FieldPostFilterFn(func(value types.PostFieldModel) string {
  71. fmt.Println("user custom field", value)
  72. return ""
  73. })
  74. formList.AddField("UpdatedAt", "updated_at", db.Timestamp, form.Default).FieldNotAllowAdd(true)
  75. formList.AddField("CreatedAt", "created_at", db.Timestamp, form.Default).FieldNotAllowAdd(true)
  76. // 使用 SetTabGroups 将表单分为几部分tab显示
  77. formList.SetTabGroups(types.
  78. NewTabGroups("id", "ip", "name", "gender", "city").
  79. AddGroup("phone", "role", "created_at", "updated_at")).
  80. SetTabHeaders("profile1", "profile2")
  81. // 设置表单页面标题和描述,以及对应sql表名
  82. formList.SetTable("users").SetTitle("Users").SetDescription("Users")
  83. // 使用 SetPostHook 设置表单提交后的触发操作
  84. formList.SetPostHook(func(values form2.Values) {
  85. fmt.Println("userTable.GetForm().PostHook", values)
  86. })
  87. return
  88. }

通过调用models.NewDefaultTable(models.DefaultTableConfig)方法传入数据表模型配置进行初始化,数据表模型配置为:

  1. type Config struct {
  2. Driver string // 数据库驱动
  3. Connection string // 数据库连接名,在全局配置中定义
  4. CanAdd bool // 是否可以新增数据
  5. Editable bool // 是否可以编辑
  6. Deletable bool // 是否可以删除
  7. Exportable bool // 是否可以导出
  8. PrimaryKey PrimaryKey // 数据表的主键
  9. }
  10. type PrimaryKey struct {
  11. Type db.DatabaseType // 主键字段类型
  12. Name string // 主键字段名
  13. }

业务数据表生成方法是一个函数,返回了models.Table这个类型对象。以下是models.Table的定义:

  1. type Table interface {
  2. GetInfo() *types.InfoPanel
  3. GetForm() *types.FormPanel
  4. GetCanAdd() bool
  5. GetEditable() bool
  6. GetDeletable() bool
  7. GetExportable() bool
  8. GetPrimaryKey() PrimaryKey
  9. GetDataFromDatabase(path string, params parameter.Parameters, isAll bool) (PanelInfo, error)
  10. GetDataFromDatabaseWithIds(path string, params parameter.Parameters, ids []string) (PanelInfo, error)
  11. GetDataFromDatabaseWithId(id string) ([]types.FormField, [][]types.FormField, []string, string, string, error)
  12. UpdateDataFromDatabase(dataList form.Values) error
  13. InsertDataFromDatabase(dataList form.Values) error
  14. DeleteDataFromDatabase(id string) error
  15. }

主要包括了GetInfo()GetForm(),这两个函数返回的类型对应的ui就是显示数据的表格和编辑新建数据的表单,截图展示如下:

  • 此为数据表格

Admin插件使用 - 图1

  • 此为数据表单

Admin插件使用 - 图2

Info表格

  1. type InfoPanel struct {
  2. FieldList []Field // 字段类型
  3. Table string // 表格
  4. Title string // 标题
  5. Description string // 描述
  6. }
  7. type InfoPanel struct {
  8. FieldList []Field // 字段列表
  9. Table string // 表格
  10. Title string // 标题
  11. Description string // 描述
  12. Sort Sort // 默认排序
  13. TabGroups TabGroups // tab分组
  14. TabHeaders TabHeaders // tab分组标题
  15. Action template.HTML // 表单操作html内容
  16. HeaderHtml template.HTML // 头部自定义html内容
  17. FooterHtml template.HTML // 底部自定义html内容
  18. }
  19. type Field struct {
  20. Head string // 标题
  21. Field string // 字段名
  22. TypeName db.DatabaseType // 字段类型
  23. Join Join // 连表设置
  24. Width int // 宽度,单位为px
  25. Sortable bool // 是否可以排序
  26. Fixed bool // 是否固定
  27. Filterable bool // 是否可以筛选
  28. Hide bool // 是否隐藏
  29. Display FieldFilterFn // 显示过滤函数
  30. DisplayProcessChains DisplayProcessFnChains // 显示处理函数
  31. }
  32. // 连表设置
  33. // 例子:left join Table on Table.JoinField = Field
  34. type Join struct {
  35. Table string // 连表表名
  36. Field string // 字段
  37. JoinField string // 连表字段名
  38. }

Form表单

  1. type FormPanel struct {
  2. FieldList FormFields // 字段列表
  3. Table string // 表格
  4. Title string // 标题
  5. Description string // 描述
  6. TabGroups TabGroups // tab分组,使用示例:[这里](https://github.com/GoAdminGroup/go-admin/blob/master/examples/datamodel/user.go#L76)
  7. TabHeaders TabHeaders // tab分组标题,使用示例:[这里](https://github.com/GoAdminGroup/go-admin/blob/master/examples/datamodel/user.go#L78)
  8. HeaderHtml template.HTML // 头部自定义内容
  9. FooterHtml template.HTML // 底部自定义内容
  10. Validator FormValidator // 表单验证函数
  11. PostHook FormPostHookFn // 表单提交后触发函数
  12. UpdateFn FormPostFn // 表单更新函数,设置了此函数,则接管了该表单的更新操作,PostHook不再生效
  13. InsertFn FormPostFn // 表单插入函数,设置了此函数,则接管了该表单的插入操作,PostHook不再生效
  14. }
  15. // 表单验证函数,可以对传过来的表单的值进行验证
  16. type FormValidator func(values form.Values) error
  17. // 表单触发函数,表单数据插入数据库后触发的函数
  18. type FormPostHookFn func(values form.Values)
  19. type FormField struct {
  20. Field string // 字段名
  21. TypeName string // 字段类型名
  22. Head string // 标题
  23. FormType form.Type // 表单类型
  24. Default string // 默认
  25. Value string // 表单默认值
  26. Options []map[string]string // 表单选项
  27. DefaultOptionDelimiter string // 默认分隔符
  28. Editable bool // 是否可编辑
  29. NotAllowAdd bool // 是否不允许新增
  30. Must bool // 是否为必填项
  31. Hide bool // 是否隐藏
  32. HelpMsg template.HTML // 帮助信息
  33. OptionExt template.JS // 单选/多选的额外设置,详见:https://select2.org/configuration/options-api
  34. Display FieldFilterFn // 显示过滤函数
  35. DisplayProcessChains DisplayProcessFnChains // 显示处理函数
  36. PostFilterFn PostFieldFilterFn // 表单过滤函数:用于对提交字段值的处理,处理后插入数据库
  37. }

目前支持的表单类型有:

  • 默认
  • 普通文本
  • 单选
  • 密码
  • 富文本
  • 文件
  • 双选择框
  • 多选
  • icon下拉选择框
  • 时间选择框
  • radio选择框
  • email输入框
  • url输入框
  • ip输入框
  • 颜色选择框
  • 货币输入框
  • 数字输入框

详见:https://github.com/GoAdminGroup/go-admin/blob/master/template/types/form/form.go

这样子去引用:

  1. import "github.com/GoAdminGroup/go-admin/template/types/form"
  2. ...
  3. FormType: form.File,
  4. ...

对于选择类型:单选、多选、选择框,需要指定 Options 值。格式为:

  1. ...
  2. Options: []map[string]string{
  3. {
  4. "field": "男生",
  5. "value": "0",
  6. },{
  7. "field": "女生",
  8. "value": "1",
  9. },
  10. }
  11. ...

其中,field为显示内容,value为选择对应的值。

过滤函数FilterFn与表单过滤函数PostFilterFn说明

  1. // FieldModel 其中ID为主键,Value为对应的字段在该主键下的值
  2. type FieldModel struct {
  3. ID string
  4. Value string
  5. }
  6. // FieldFilterFn 过滤函数决定从数据库取到的值Value传到前端显示的格式。
  7. // 目前接受返回的类型为:template.HTML, string, []string
  8. //
  9. // 对于表格,可以返回template.HTML类型,包括html和css样式,使得表格中字段可以个性化的显示,如:
  10. //
  11. // FilterFn: func(model types.FieldModel) interface{} {
  12. // return template.Get("adminlte").Label().SetContent(template2.HTML(model.Value)).GetContent()
  13. // },
  14. //
  15. // 对于表单,需要注意的是,如果是为选择框类型:Select/SelectSingle/SelectBox,则需要返回数组:[]string,如:
  16. //
  17. // FilterFn: func(model types.FieldModel) interface{} {
  18. // return strings.Split(model.Value, ",")
  19. // },
  20. //
  21. // 对于其他表单类型,则应返回string类型
  22. type FieldFilterFn func(value FieldModel) interface{}
  23. // PostFieldModel contains ID and value of the single query result.
  24. type PostFieldModel struct {
  25. ID string
  26. Value FieldModelValue
  27. Row map[string]interface{}
  28. }
  29. type FieldModelValue []string
  30. func (r FieldModelValue) Value() string {
  31. return r.First()
  32. }
  33. func (r FieldModelValue) First() string {
  34. return r[0]
  35. }
  36. // PostFieldFilterFn 表单提交过滤函数,用于提交表单的时候对表单数据的处理。表单数据传过来,经过表单提交过滤函数
  37. // 的处理后再存入数据库中。
  38. //
  39. // 如果是为选择框类型:Select/SelectSingle/SelectBox,需要将数组类型转化为字符串类型,如:
  40. //
  41. // PostFilterFn: func(model types.PostFieldModel) string {
  42. // return strings.Join(model.Value, ",")
  43. // },
  44. //
  45. // 同时也可以用来连表更新或插入数据。
  46. // 自定义的字段,比如用户表的角色,需要更新。在这里可以根据传过来的主键ID以及表单数据Value,进行连表更新。如:
  47. //
  48. // PostFilterFn: func(model types.PostFieldModel) {
  49. // db.Table("role").Insert(dialect.H{
  50. // "user_id": model.ID,
  51. // "role_id": model.Value.Value(),
  52. // })
  53. // },
  54. //
  55. type PostFieldFilterFn func(value PostFieldModel) string