132 lines
3.5 KiB
Go
132 lines
3.5 KiB
Go
package isql
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/eryajf/go-ldap-admin/model"
|
|
"github.com/eryajf/go-ldap-admin/public/common"
|
|
|
|
"github.com/thoas/go-funk"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type MenuService struct{}
|
|
|
|
// Exist 判断资源是否存在
|
|
func (s MenuService) Exist(filter map[string]interface{}) bool {
|
|
var dataObj model.Menu
|
|
err := common.DB.Debug().Order("created_at DESC").Where(filter).First(&dataObj).Error
|
|
return !errors.Is(err, gorm.ErrRecordNotFound)
|
|
}
|
|
|
|
// Count 获取资源总数
|
|
func (s MenuService) Count() (int64, error) {
|
|
var count int64
|
|
err := common.DB.Model(&model.Menu{}).Count(&count).Error
|
|
return count, err
|
|
}
|
|
|
|
// Add 创建资源
|
|
func (s MenuService) Add(menu *model.Menu) error {
|
|
return common.DB.Create(menu).Error
|
|
}
|
|
|
|
// Update 更新资源
|
|
func (s MenuService) Update(menu *model.Menu) error {
|
|
return common.DB.Model(&model.Menu{}).Where("id = ?", menu.ID).Updates(menu).Error
|
|
}
|
|
|
|
// Find 获取单个资源
|
|
func (s MenuService) Find(filter map[string]interface{}, data *model.Menu) error {
|
|
return common.DB.Where(filter).First(&data).Error
|
|
}
|
|
|
|
// List 获取数据列表
|
|
func (s MenuService) List() (menus []*model.Menu, err error) {
|
|
err = common.DB.Order("sort").Find(&menus).Error
|
|
return menus, err
|
|
}
|
|
|
|
// List 获取数据列表
|
|
func (s MenuService) ListUserMenus(roleIds []uint) (menus []*model.Menu, err error) {
|
|
err = common.DB.Where("id IN (select menu_id as id from role_menus where role_id IN (?))", roleIds).Order("sort").Find(&menus).Error
|
|
return menus, err
|
|
}
|
|
|
|
// 批量删除资源
|
|
func (s MenuService) Delete(menuIds []uint) error {
|
|
return common.DB.Where("id IN (?)", menuIds).Select("Roles").Unscoped().Delete(&model.Menu{}).Error
|
|
}
|
|
|
|
// GetUserMenusByUserId 根据用户ID获取用户的权限(可访问)菜单列表
|
|
func (s MenuService) GetUserMenusByUserId(userId uint) ([]*model.Menu, error) {
|
|
// 获取用户
|
|
var user model.User
|
|
err := common.DB.Where("id = ?", userId).Preload("Roles").First(&user).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
// 获取角色
|
|
roles := user.Roles
|
|
// 所有角色的菜单集合
|
|
allRoleMenus := make([]*model.Menu, 0)
|
|
for _, role := range roles {
|
|
var userRole model.Role
|
|
err := common.DB.Where("id = ?", role.ID).Preload("Menus").First(&userRole).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
// 获取角色的菜单
|
|
menus := userRole.Menus
|
|
allRoleMenus = append(allRoleMenus, menus...)
|
|
}
|
|
|
|
// 所有角色的菜单集合去重
|
|
allRoleMenusId := make([]int, 0)
|
|
for _, menu := range allRoleMenus {
|
|
allRoleMenusId = append(allRoleMenusId, int(menu.ID))
|
|
}
|
|
allRoleMenusIdUniq := funk.UniqInt(allRoleMenusId)
|
|
allRoleMenusUniq := make([]*model.Menu, 0)
|
|
for _, id := range allRoleMenusIdUniq {
|
|
for _, menu := range allRoleMenus {
|
|
if id == int(menu.ID) {
|
|
allRoleMenusUniq = append(allRoleMenusUniq, menu)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
// 获取状态status为1的菜单
|
|
accessMenus := make([]*model.Menu, 0)
|
|
for _, menu := range allRoleMenusUniq {
|
|
if menu.Status == 1 {
|
|
accessMenus = append(accessMenus, menu)
|
|
}
|
|
}
|
|
|
|
return accessMenus, err
|
|
}
|
|
|
|
// GenMenuTree 生成菜单树
|
|
func GenMenuTree(parentId uint, menus []*model.Menu) []*model.Menu {
|
|
tree := make([]*model.Menu, 0)
|
|
|
|
for _, m := range menus {
|
|
if m.ParentId == parentId {
|
|
children := GenMenuTree(m.ID, menus)
|
|
m.Children = children
|
|
tree = append(tree, m)
|
|
}
|
|
}
|
|
return tree
|
|
}
|
|
|
|
// // GetMenuTree 获取菜单树
|
|
// func (s MenuService) GetMenuTree() ([]*model.Menu, error) {
|
|
// var menus []*model.Menu
|
|
// err := common.DB.Order("sort").Find(&menus).Error
|
|
// // parentId为0的是根菜单
|
|
// return GenMenuTree(0, menus), err
|
|
// }
|