zhangqian
2023-08-26 5193dcb9336e853502baf8a539d3f45efebe2f86
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
package system
 
import (
    "errors"
    "strconv"
 
    "gorm.io/gorm"
    "srm/global"
    "srm/model/common/request"
    "srm/model/system"
)
 
//@author: [piexlmax](https://github.com/piexlmax)
//@function: getMenuTreeMap
//@description: 获取路由总树map
//@param: authorityId string
//@return: treeMap map[string][]system.SysMenu, err error
 
type MenuService struct{}
 
var MenuServiceApp = new(MenuService)
 
func (menuService *MenuService) getMenuTreeMap(authorityId uint) (treeMap map[string][]system.SysMenu, err error) {
    var allMenus []system.SysMenu
    var baseMenu []system.SysBaseMenu
    var btns []system.SysAuthorityBtn
    treeMap = make(map[string][]system.SysMenu)
 
    var SysAuthorityMenus []system.SysAuthorityMenu
    err = global.GVA_DB.Where("sys_authority_authority_id = ?", authorityId).Find(&SysAuthorityMenus).Error
    if err != nil {
        return
    }
 
    var MenuIds []string
 
    for i := range SysAuthorityMenus {
        MenuIds = append(MenuIds, SysAuthorityMenus[i].MenuId)
    }
 
    err = global.GVA_DB.Where("id in (?)", MenuIds).Order("sort").Preload("Parameters").Find(&baseMenu).Error
    if err != nil {
        return
    }
 
    for i := range baseMenu {
        allMenus = append(allMenus, system.SysMenu{
            SysBaseMenu: baseMenu[i],
            AuthorityId: authorityId,
            MenuId:      strconv.Itoa(int(baseMenu[i].ID)),
            Parameters:  baseMenu[i].Parameters,
        })
    }
 
    err = global.GVA_DB.Where("authority_id = ?", authorityId).Preload("SysBaseMenuBtn").Find(&btns).Error
    if err != nil {
        return
    }
    var btnMap = make(map[uint]map[string]uint)
    for _, v := range btns {
        if btnMap[v.SysMenuID] == nil {
            btnMap[v.SysMenuID] = make(map[string]uint)
        }
        btnMap[v.SysMenuID][v.SysBaseMenuBtn.Name] = authorityId
    }
    for _, v := range allMenus {
        v.Btns = btnMap[v.ID]
        treeMap[v.ParentId] = append(treeMap[v.ParentId], v)
    }
    return treeMap, err
}
 
//@author: [piexlmax](https://github.com/piexlmax)
//@function: GetMenuTree
//@description: 获取动态菜单树
//@param: authorityId string
//@return: menus []system.SysMenu, err error
 
func (menuService *MenuService) GetMenuTree(authorityId uint) (menus []system.SysMenu, err error) {
    menuTree, err := menuService.getMenuTreeMap(authorityId)
    menus = menuTree["0"]
    for i := 0; i < len(menus); i++ {
        err = menuService.getChildrenList(&menus[i], menuTree)
    }
    return menus, err
}
 
//@author: [piexlmax](https://github.com/piexlmax)
//@function: getChildrenList
//@description: 获取子菜单
//@param: menu *model.SysMenu, treeMap map[string][]model.SysMenu
//@return: err error
 
func (menuService *MenuService) getChildrenList(menu *system.SysMenu, treeMap map[string][]system.SysMenu) (err error) {
    menu.Children = treeMap[menu.MenuId]
    for i := 0; i < len(menu.Children); i++ {
        err = menuService.getChildrenList(&menu.Children[i], treeMap)
    }
    return err
}
 
//@author: [piexlmax](https://github.com/piexlmax)
//@function: GetInfoList
//@description: 获取路由分页
//@return: list interface{}, total int64,err error
 
func (menuService *MenuService) GetInfoList() (list interface{}, total int64, err error) {
    var menuList []system.SysBaseMenu
    treeMap, err := menuService.getBaseMenuTreeMap()
    menuList = treeMap["0"]
    for i := 0; i < len(menuList); i++ {
        err = menuService.getBaseChildrenList(&menuList[i], treeMap)
    }
    return menuList, total, err
}
 
//@author: [piexlmax](https://github.com/piexlmax)
//@function: getBaseChildrenList
//@description: 获取菜单的子菜单
//@param: menu *model.SysBaseMenu, treeMap map[string][]model.SysBaseMenu
//@return: err error
 
func (menuService *MenuService) getBaseChildrenList(menu *system.SysBaseMenu, treeMap map[string][]system.SysBaseMenu) (err error) {
    menu.Children = treeMap[strconv.Itoa(int(menu.ID))]
    for i := 0; i < len(menu.Children); i++ {
        err = menuService.getBaseChildrenList(&menu.Children[i], treeMap)
    }
    return err
}
 
//@author: [piexlmax](https://github.com/piexlmax)
//@function: AddBaseMenu
//@description: 添加基础路由
//@param: menu model.SysBaseMenu
//@return: error
 
func (menuService *MenuService) AddBaseMenu(menu system.SysBaseMenu) error {
    if !errors.Is(global.GVA_DB.Where("name = ?", menu.Name).First(&system.SysBaseMenu{}).Error, gorm.ErrRecordNotFound) {
        return errors.New("存在重复name,请修改name")
    }
    return global.GVA_DB.Create(&menu).Error
}
 
//@author: [piexlmax](https://github.com/piexlmax)
//@function: getBaseMenuTreeMap
//@description: 获取路由总树map
//@return: treeMap map[string][]system.SysBaseMenu, err error
 
func (menuService *MenuService) getBaseMenuTreeMap() (treeMap map[string][]system.SysBaseMenu, err error) {
    var allMenus []system.SysBaseMenu
    treeMap = make(map[string][]system.SysBaseMenu)
    err = global.GVA_DB.Order("sort").Preload("MenuBtn").Preload("Parameters").Find(&allMenus).Error
    for _, v := range allMenus {
        treeMap[v.ParentId] = append(treeMap[v.ParentId], v)
    }
    return treeMap, err
}
 
//@author: [piexlmax](https://github.com/piexlmax)
//@function: GetBaseMenuTree
//@description: 获取基础路由树
//@return: menus []system.SysBaseMenu, err error
 
func (menuService *MenuService) GetBaseMenuTree() (menus []system.SysBaseMenu, err error) {
    treeMap, err := menuService.getBaseMenuTreeMap()
    menus = treeMap["0"]
    for i := 0; i < len(menus); i++ {
        err = menuService.getBaseChildrenList(&menus[i], treeMap)
    }
    return menus, err
}
 
//@author: [piexlmax](https://github.com/piexlmax)
//@function: AddMenuAuthority
//@description: 为角色增加menu树
//@param: menus []model.SysBaseMenu, authorityId string
//@return: err error
 
func (menuService *MenuService) AddMenuAuthority(menus []system.SysBaseMenu, authorityId uint) (err error) {
    var auth system.SysAuthority
    auth.AuthorityId = authorityId
    auth.SysBaseMenus = menus
    err = AuthorityServiceApp.SetMenuAuthority(&auth)
    return err
}
 
//@author: [piexlmax](https://github.com/piexlmax)
//@function: GetMenuAuthority
//@description: 查看当前角色树
//@param: info *request.GetAuthorityId
//@return: menus []system.SysMenu, err error
 
func (menuService *MenuService) GetMenuAuthority(info *request.GetAuthorityId) (menus []system.SysMenu, err error) {
    var baseMenu []system.SysBaseMenu
    var SysAuthorityMenus []system.SysAuthorityMenu
    err = global.GVA_DB.Where("sys_authority_authority_id = ?", info.AuthorityId).Find(&SysAuthorityMenus).Error
    if err != nil {
        return
    }
 
    var MenuIds []string
 
    for i := range SysAuthorityMenus {
        MenuIds = append(MenuIds, SysAuthorityMenus[i].MenuId)
    }
 
    err = global.GVA_DB.Where("id in (?) ", MenuIds).Order("sort").Find(&baseMenu).Error
 
    for i := range baseMenu {
        menus = append(menus, system.SysMenu{
            SysBaseMenu: baseMenu[i],
            AuthorityId: info.AuthorityId,
            MenuId:      strconv.Itoa(int(baseMenu[i].ID)),
            Parameters:  baseMenu[i].Parameters,
        })
    }
    // sql := "SELECT authority_menu.keep_alive,authority_menu.default_menu,authority_menu.created_at,authority_menu.updated_at,authority_menu.deleted_at,authority_menu.menu_level,authority_menu.parent_id,authority_menu.path,authority_menu.`name`,authority_menu.hidden,authority_menu.component,authority_menu.title,authority_menu.icon,authority_menu.sort,authority_menu.menu_id,authority_menu.authority_id FROM authority_menu WHERE authority_menu.authority_id = ? ORDER BY authority_menu.sort ASC"
    // err = global.GVA_DB.Raw(sql, authorityId).Scan(&menus).Error
    return menus, err
}
 
// UserAuthorityDefaultRouter 用户角色默认路由检查
//
//    Author [SliverHorn](https://github.com/SliverHorn)
func (menuService *MenuService) UserAuthorityDefaultRouter(user *system.SysUser) {
    var menuIds []string
    err := global.GVA_DB.Model(&system.SysAuthorityMenu{}).Where("sys_authority_authority_id = ?", user.AuthorityId).Pluck("sys_base_menu_id", &menuIds).Error
    if err != nil {
        return
    }
    var am system.SysBaseMenu
    err = global.GVA_DB.First(&am, "name = ? and id in (?)", user.Authority.DefaultRouter, menuIds).Error
    if errors.Is(err, gorm.ErrRecordNotFound) {
        user.Authority.DefaultRouter = "404"
    }
}