go语言菜单树结构

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
}





 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值