//数据库结构
type AuthMenu struct {
MenuId uint `json:"menu_id" gorm:"column:menu_id;primaryKey;autoIncrement"` // 主键
ParentMenuId uint `json:"parent_menu_id" gorm:"column:parent_menu_id"` // 父类,根为0
Name string `json:"name" gorm:"column:name"` // 名称
Url string `json:"url" gorm:"column:url"` // 菜单URL
Icon string `json:"icon" gorm:"column:icon"` // 菜单图标
Cell string `json:"cell" gorm:"column:cell"` // 菜单层级1一级2二级
DisplayOrder uint `json:"display_order" gorm:"column:display_order"` // 菜单顺序
}
用法:
//定义结构体
type Menu struct {
entities.AuthMenu
Child []*Menu `json:"child"`
}
func MenuList(c *gin.Context) {
//定义查询结果数量
var count int64
//定义查询返回结果切片结构体
var apilist []*Menu
//公共数据库调用方法
db := mysql.GetClient()
sql := db.Debug().Table("auth_menu")
//可选增加条件如
sql.Where("menu_id IN (?)", "1,2")
//查询并返回错误信息
err = sql.Order("display_order desc").Count(&count).Find(&apilist).Error
if err != nil {
c.JSON(http.StatusOK, gin.H{
"code": -1,
"errMsg": err,
})
return
}
//如果没有报错则传递数据进行树状重组,默认传0一级分类
menu := tree(apilist, 0)
c.JSON(http.StatusOK, gin.H{
"code": 1,
"data": menu,
})
}
//生成树结构
func tree(menus []*Menu, pid uint) []*Menu {
//定义子节点目录
var nodes []*Menu
if reflect.ValueOf(menus).IsValid() {
//循环所有一级菜单
for _, v := range menus {
//查询所有该菜单下的所有子菜单
if v.ParentMenuId == pid {
//特别注意压入元素不是单个所有加三个 **...** 告诉切片无论多少元素一并压入
v.Child = append(v.Child, tree(menus, v.MenuId)...)
nodes = append(nodes, v)
}
}
}
return nodes
}
效果如下