-
-
Notifications
You must be signed in to change notification settings - Fork 241
/
menu_isql.go
131 lines (112 loc) · 3.54 KB
/
menu_isql.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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
// }