84 lines
2.0 KiB
Go
84 lines
2.0 KiB
Go
package service
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
"myschools.me/heritage/heritage-api/model"
|
|
"myschools.me/heritage/heritage-api/mysql"
|
|
"myschools.me/heritage/heritage-api/redis"
|
|
)
|
|
|
|
func MenuList(usr *model.User) ([]*model.Menu, error) {
|
|
// 先从缓存中获取角色对应的菜单列表
|
|
allMenus, err := redis.MenuListGet(&usr.RoleID)
|
|
if err == nil && len(allMenus) > 0 {
|
|
return allMenus, nil
|
|
}
|
|
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "MenuList",
|
|
}).Warnf("redis.MenuListGet: %v", err)
|
|
}
|
|
|
|
// 获取角色拥有的所有权限
|
|
permissionCodes, err := mysql.RolePermissionsList(&usr.RoleID)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "MenuList",
|
|
}).Warnf("mysql.RolePermissionsList: %v", err)
|
|
return nil, err
|
|
}
|
|
|
|
// 缓存中没有菜单,从数据库获取
|
|
menus, 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 menus {
|
|
if hasPermission(menus[i].PermissionCode) {
|
|
filteredMenus = append(filteredMenus, &menus[i])
|
|
}
|
|
}
|
|
|
|
menutree := menuTreeBuild(filteredMenus, 0)
|
|
|
|
// 将菜单列表放入缓存
|
|
if err := redis.MenuListSet(&usr.RoleID, menutree, 60*time.Second); err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "MenuList",
|
|
}).Warnf("redis.MenuListSet: %v", err)
|
|
// 缓存设置失败,不影响返回结果
|
|
}
|
|
return menutree, 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
|
|
}
|