heritage-api/service/menu-service.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
}