72 lines
1.6 KiB
Go
72 lines
1.6 KiB
Go
package service
|
|
|
|
import (
|
|
"github.com/sirupsen/logrus"
|
|
"myschools.me/heritage/heritage-api/model"
|
|
"myschools.me/heritage/heritage-api/mysql"
|
|
)
|
|
|
|
func MenuList(usr *model.User) ([]*model.Menu, error) {
|
|
// 获取用户角色 ID
|
|
roleID, found, err := mysql.UserRoleIDByUserID(&usr.ID)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "MenuList",
|
|
}).Warnf("mysql.UserRoleIDByUserID: %v", err)
|
|
return nil, err
|
|
}
|
|
if !found {
|
|
return nil, nil
|
|
}
|
|
|
|
// 获取角色拥有的所有权限
|
|
permissionCodes, err := mysql.RolePermissionsList(roleID)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "MenuList",
|
|
}).Warnf("mysql.RolePermissionsList: %v", err)
|
|
return nil, err
|
|
}
|
|
|
|
// 获取所有菜单
|
|
allMenus, err := mysql.MenuList()
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "MenuList",
|
|
}).Warnf("mysql.MenuList: %v", err)
|
|
return nil, err
|
|
}
|
|
|
|
// 权限检查辅助函数
|
|
hasPermission := func(code string) bool {
|
|
for _, p := range permissionCodes {
|
|
if p == "*" || p == code {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// 过滤有权限的菜单
|
|
var filteredMenus []*model.Menu
|
|
for i := range allMenus {
|
|
if hasPermission(allMenus[i].PermissionCode) {
|
|
filteredMenus = append(filteredMenus, &allMenus[i])
|
|
}
|
|
}
|
|
|
|
return menuTreeBuild(filteredMenus, 0), nil
|
|
}
|
|
|
|
func menuTreeBuild(menus []*model.Menu, parentID uint) []*model.Menu {
|
|
var tree []*model.Menu
|
|
for _, menu := range menus {
|
|
if menu.ParentID == parentID {
|
|
children := menuTreeBuild(menus, menu.ID)
|
|
menu.Children = children
|
|
tree = append(tree, menu)
|
|
}
|
|
}
|
|
return tree
|
|
}
|