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