Admin插件使用


    需要如下几步:

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

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

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

    • 安装
    • 生成

    在项目文件夹下执行

    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就是表格数据生成方法。对应的访问路由地址就是:

    设置访问菜单

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

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

    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. info.SetTable("users").SetTitle("Users").SetDescription("Users").
    44. SetAction(template.HTML(`<a href="http://google.com"><i class="fa fa-google"></i></a>`)) // 自定义操作按钮
    45. formList := userTable.GetForm()
    46. // 设置主键Id不可以编辑
    47. formList.AddField("ID", "id", db.Int, form.Default).FieldNotAllowEdit()
    48. formList.AddField("Ip", "ip", db.Varchar, form.Text)
    49. formList.AddField("Name", "name", db.Varchar, form.Text)
    50. // 使用 FieldOptions 设置 radio 类型内容
    51. formList.AddField("Gender", "gender", db.Tinyint, form.Radio).
    52. FieldOptions([]map[string]string{
    53. {
    54. "field": "gender",
    55. "label": "male",
    56. "value": "0",
    57. "selected": "true",
    58. }, {
    59. "field": "gender",
    60. "label": "female",
    61. "value": "1",
    62. "selected": "false",
    63. },
    64. })
    65. formList.AddField("Phone", "phone", db.Varchar, form.Text)
    66. formList.AddField("City", "city", db.Varchar, form.Text)
    67. // 自定义一个表单字段,使用 FieldPostFilterFn 可以进行连表操作
    68. formList.AddField("Custom Field", "role", db.Varchar, form.Text).
    69. FieldPostFilterFn(func(value types.PostFieldModel) string {
    70. fmt.Println("user custom field", value)
    71. return ""
    72. })
    73. formList.AddField("UpdatedAt", "updated_at", db.Timestamp, form.Default).FieldNotAllowAdd(true)
    74. formList.AddField("CreatedAt", "created_at", db.Timestamp, form.Default).FieldNotAllowAdd(true)
    75. // 使用 SetTabGroups 将表单分为几部分tab显示
    76. formList.SetTabGroups(types.
    77. NewTabGroups("id", "ip", "name", "gender", "city").
    78. AddGroup("phone", "role", "created_at", "updated_at")).
    79. SetTabHeaders("profile1", "profile2")
    80. // 设置表单页面标题和描述,以及对应sql表名
    81. formList.SetTable("users").SetTitle("Users").SetDescription("Users")
    82. // 使用 SetPostHook 设置表单提交后的触发操作
    83. formList.SetPostHook(func(values form2.Values) {
    84. fmt.Println("userTable.GetForm().PostHook", values)
    85. })
    86. return
    87. }

    通过调用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. GetDeletable() bool
    6. GetExportable() bool
    7. GetPrimaryKey() PrimaryKey
    8. GetDataFromDatabase(path string, params parameter.Parameters, isAll bool) (PanelInfo, error)
    9. GetDataFromDatabaseWithIds(path string, params parameter.Parameters, ids []string) (PanelInfo, error)
    10. GetDataFromDatabaseWithId(id string) ([]types.FormField, [][]types.FormField, []string, string, string, error)
    11. UpdateDataFromDatabase(dataList form.Values) error
    12. InsertDataFromDatabase(dataList form.Values) error
    13. DeleteDataFromDatabase(id string) error

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

    • 此为数据表格

    • 此为数据表单

    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输入框
    • 颜色选择框
    • 货币输入框
    • 数字输入框

    详见:

    这样子去引用:

    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. },

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