GO语言菜单树结构实现,Menu是数据库表映射。MenuTree是树结构菜单,目前只考虑2级菜单。后面附源码,亲测可用
package models
import (
"github.com/astaxie/beego/orm"
"time"
)
type Menu struct {
Base
MenuName string
Pid int64
MenuType int8
MenuUrl string
}
type MenuTree struct {
Id int64
MenuName string
Pid int64
MenuType int8
MenuUrl string
Children []*MenuTree
}
func SaveMenu(m *Menu) (int64, error) {
if m.CreateUser == "" {
m.CreateUser = "sys"
}
if m.UpdateUser == "" {
m.UpdateUser = "sys"
}
m.CreateTime = time.Now()
m.UpdateTime = time.Now()
return orm.NewOrm().Insert(m)
}
func GetMenuList() (dataList []interface{}, err error) {
var list []Menu
if _, err := orm.NewOrm().QueryTable(new(Menu)).All(&list); err == nil {
for _, v := range list {
dataList = append(dataList, v)
}
return dataList, nil
}
return nil, err
}
func GetMenuTree() (dataList []interface{}, err error) {
var parentList []*Menu
//获取父节点
if _, err := orm.NewOrm().QueryTable(new(Menu)).Filter("pid", nil).All(&parentList); err != nil {
return nil, err
}
for _, v := range parentList {
parent := MenuTree{v.Id, v.MenuName, v.Pid, v.MenuType, v.MenuUrl, []*MenuTree{}}
var childrenList []*Menu
if _, err := orm.NewOrm().QueryTable(new(Menu)).Filter("pid", v.Id).All(&childrenList); err != nil {
return nil, err
}
for _, c := range childrenList {
child := MenuTree{c.Id, c.MenuName, c.Pid, c.MenuType, c.MenuUrl, []*MenuTree{}}
parent.Children = append(parent.Children, &child)
}
dataList = append(dataList, parent)
}
return dataList, nil
}