| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- package system
- import (
- "fmt"
- "go_server/model/common"
- "gorm.io/gorm"
- )
- type Menus struct {
- common.GormBaseModel
- ParentId int64 `json:"parentId" gorm:"column:parent_id;comment:上级菜单Id"`
- Name string `json:"name" gorm:"column:name;type:varchar(50);comment:菜单名"`
- Icon string `json:"icon" gorm:"column:icon;type:varchar(200);comment:图标"`
- Router string `json:"router" gorm:"column:router;unique;type:varchar(80);comment:前端路由"`
- IsHide bool `json:"isHide" gorm:"comment:是否隐藏"`
- IsFull bool `json:"isFull" gorm:"comment:是否全部"`
- IsAffix bool `json:"isAffix" gorm:"comment:是否前缀"`
- IsKeepAlive bool `json:"isKeepAlive" gorm:"comment:是否保持活跃"`
- PageName string `json:"pageName" gorm:"type:varchar(200);comment:页面名称"`
- Component string `json:"component" gorm:"type:varchar(200);comment:组件"`
- Sort int `json:"sort" gorm:"comment:排序"`
- Enable bool `json:"enable" gorm:"comment:是否启用"`
- }
- func (*Menus) TableName() string {
- return common.ModelPrefix + "menus"
- }
- func NewMenus() *Menus {
- return &Menus{}
- }
- func (*Menus) Comment() string {
- return "前端菜单表"
- }
- type MenuNode struct {
- Id int64 `json:"id"`
- ParentId int64 `json:"parent_id"`
- Name string `json:"name"`
- Icon string `json:"icon"`
- Router string `json:"router"`
- Enable bool `json:"enable"`
- IsHide bool `json:"isHide" gorm:"comment:是否隐藏"`
- IsFull bool `json:"isFull" gorm:"comment:是否全部"`
- IsAffix bool `json:"isAffix" gorm:"comment:是否前缀"`
- IsKeepAlive bool `json:"isKeepAlive" gorm:"comment:是否保持活跃"`
- PageName string `json:"pageName" gorm:"type:varchar(200);comment:页面名称"`
- Component string `json:"component" gorm:"type:varchar(200);comment:组件"`
- Children []*MenuNode `json:"children"`
- }
- func (s *Menus) GetUserTree(db *gorm.DB, userPermissions []string) ([]MenuNode, error) {
- menusNodeTree := make([]MenuNode, 0) // 根节点
- // 所有节点
- allMenus := make([]Menus, 0)
- if err := db.Model(&Menus{}).
- Where("id in (?)", userPermissions).
- Order("sort").
- Find(&allMenus).Error; err != nil {
- return menusNodeTree, err
- }
- for _, m := range allMenus {
- fmt.Println("Component:", m.Component)
- childMenus := make([]*MenuNode, 0)
- if m.ParentId == 0 {
- rootNode := MenuNode{
- Id: m.ID,
- ParentId: m.ParentId,
- Name: m.Name,
- Icon: m.Icon,
- Router: m.Router,
- IsHide: m.IsHide,
- IsFull: m.IsFull,
- IsAffix: m.IsAffix,
- IsKeepAlive: m.IsKeepAlive,
- PageName: m.PageName,
- Component: m.Component,
- Enable: m.Enable,
- Children: childMenus,
- }
- menusNodeTree = append(menusNodeTree, rootNode)
- }
- }
- for i, _ := range menusNodeTree {
- s.walk(allMenus, &menusNodeTree[i])
- }
- return menusNodeTree, nil
- }
- // MenuTree 系统递归树[满足无限层级递归]
- func (s *Menus) SysTree(db *gorm.DB) ([]MenuNode, error) {
- menusNodeTree := make([]MenuNode, 0) // 根节点
- // 所有节点
- allMenus := make([]Menus, 0)
- if err := db.Model(&Menus{}).Where("1=1").
- Order("sort").
- Find(&allMenus).Error; err != nil {
- return menusNodeTree, err
- }
- for _, m := range allMenus {
- childMenus := make([]*MenuNode, 0)
- if m.ParentId == 0 {
- rootNode := MenuNode{
- Id: m.ID,
- ParentId: m.ParentId,
- Name: m.Name,
- Icon: m.Icon,
- Router: m.Router,
- IsHide: m.IsHide,
- IsFull: m.IsFull,
- IsAffix: m.IsAffix,
- Enable: m.Enable,
- IsKeepAlive: m.IsKeepAlive,
- PageName: m.PageName,
- Component: m.Component,
- Children: childMenus,
- }
- menusNodeTree = append(menusNodeTree, rootNode)
- }
- }
- for i, _ := range menusNodeTree {
- s.walk(allMenus, &menusNodeTree[i])
- }
- return menusNodeTree, nil
- }
- // 递归组装菜单树(根节点)
- func (s *Menus) walk(allMenus []Menus, rootNode *MenuNode) {
- // 列出所有下级子目录
- nodes := s.childrenList(allMenus, rootNode.Id)
- if len(nodes) == 0 {
- return
- }
- // 遍历这些文件
- for _, node := range nodes {
- fmt.Println("Component:", node.Component)
- newNode := MenuNode{
- Id: node.Id,
- ParentId: node.ParentId,
- Name: node.Name,
- Icon: node.Icon,
- Router: node.Router,
- Enable: node.Enable,
- IsHide: node.IsHide,
- IsFull: node.IsFull,
- IsAffix: node.IsAffix,
- IsKeepAlive: node.IsKeepAlive,
- PageName: node.PageName,
- Component: node.Component,
- Children: make([]*MenuNode, 0),
- }
- s.walk(allMenus, &newNode)
- rootNode.Children = append(rootNode.Children, &newNode)
- }
- return
- }
- // 获得子节点列表
- func (s *Menus) childrenList(allMenus []Menus, pId int64) (menusNodeTree []MenuNode) {
- for _, m := range allMenus {
- if m.ParentId == pId {
- rootNode := MenuNode{
- Id: m.ID,
- ParentId: m.ParentId,
- Name: m.Name,
- Icon: m.Icon,
- Router: m.Router,
- Enable: m.Enable,
- IsHide: m.IsHide,
- IsFull: m.IsFull,
- IsAffix: m.IsAffix,
- IsKeepAlive: m.IsKeepAlive,
- PageName: m.PageName,
- Component: m.Component,
- Children: make([]*MenuNode, 0),
- }
- menusNodeTree = append(menusNodeTree, rootNode)
- }
- }
- return
- }
|