sys_menu.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package system
  2. import (
  3. "errors"
  4. "server/dao/system"
  5. "gorm.io/gorm"
  6. "server/model/common/request"
  7. )
  8. //@author: [piexlmax](https://github.com/piexlmax)
  9. //@function: getMenuTreeMap
  10. //@description: 获取路由总树map
  11. //@param: authorityId string
  12. //@return: treeMap map[string][]system.SysMenu, err error
  13. type MenuService struct{}
  14. var MenuServiceApp = new(MenuService)
  15. func (menuService *MenuService) getMenuTreeMap(authorityId uint) (treeMap map[uint][]system.SysMenu, err error) {
  16. var allMenus []system.SysMenu
  17. treeMap = make(map[uint][]system.SysMenu)
  18. SysAuthorityMenus, err := system.QueryAuthorityMenuByAuthorityId(authorityId)
  19. if err != nil {
  20. return
  21. }
  22. var MenuIds []string
  23. for i := range SysAuthorityMenus {
  24. MenuIds = append(MenuIds, SysAuthorityMenus[i].MenuId)
  25. }
  26. baseMenu, err := system.QueryBaseMenuAndParametersByMenuId(MenuIds)
  27. if err != nil {
  28. return
  29. }
  30. for i := range baseMenu {
  31. allMenus = append(allMenus, system.SysMenu{
  32. SysBaseMenu: baseMenu[i],
  33. AuthorityId: authorityId,
  34. MenuId: baseMenu[i].ID,
  35. Parameters: baseMenu[i].Parameters,
  36. })
  37. }
  38. btns, err := system.QueryAuthorityBtnAndSysBaseMenuBtnById(authorityId)
  39. if err != nil {
  40. return
  41. }
  42. var btnMap = make(map[uint]map[string]uint)
  43. for _, v := range btns {
  44. if btnMap[v.SysMenuID] == nil {
  45. btnMap[v.SysMenuID] = make(map[string]uint)
  46. }
  47. btnMap[v.SysMenuID][v.SysBaseMenuBtn.Name] = authorityId
  48. }
  49. for _, v := range allMenus {
  50. v.Btns = btnMap[v.SysBaseMenu.ID]
  51. treeMap[v.ParentId] = append(treeMap[v.ParentId], v)
  52. }
  53. return treeMap, err
  54. }
  55. //@author: [piexlmax](https://github.com/piexlmax)
  56. //@function: GetMenuTree
  57. //@description: 获取动态菜单树
  58. //@param: authorityId string
  59. //@return: menus []system.SysMenu, err error
  60. func (menuService *MenuService) GetMenuTree(authorityId uint) (menus []system.SysMenu, err error) {
  61. menuTree, err := menuService.getMenuTreeMap(authorityId)
  62. menus = menuTree[0]
  63. for i := 0; i < len(menus); i++ {
  64. err = menuService.getChildrenList(&menus[i], menuTree)
  65. }
  66. return menus, err
  67. }
  68. //@author: [piexlmax](https://github.com/piexlmax)
  69. //@function: getChildrenList
  70. //@description: 获取子菜单
  71. //@param: menu *model.SysMenu, treeMap map[string][]model.SysMenu
  72. //@return: err error
  73. func (menuService *MenuService) getChildrenList(menu *system.SysMenu, treeMap map[uint][]system.SysMenu) (err error) {
  74. menu.Children = treeMap[menu.MenuId]
  75. for i := 0; i < len(menu.Children); i++ {
  76. err = menuService.getChildrenList(&menu.Children[i], treeMap)
  77. }
  78. return err
  79. }
  80. //@author: [piexlmax](https://github.com/piexlmax)
  81. //@function: GetInfoList
  82. //@description: 获取路由分页
  83. //@return: list interface{}, total int64,err error
  84. func (menuService *MenuService) GetInfoList() (list interface{}, total int64, err error) {
  85. var menuList []system.SysBaseMenu
  86. treeMap, err := menuService.getBaseMenuTreeMap()
  87. menuList = treeMap[0]
  88. for i := 0; i < len(menuList); i++ {
  89. err = menuService.getBaseChildrenList(&menuList[i], treeMap)
  90. }
  91. return menuList, total, err
  92. }
  93. //@author: [piexlmax](https://github.com/piexlmax)
  94. //@function: getBaseChildrenList
  95. //@description: 获取菜单的子菜单
  96. //@param: menu *model.SysBaseMenu, treeMap map[string][]model.SysBaseMenu
  97. //@return: err error
  98. func (menuService *MenuService) getBaseChildrenList(menu *system.SysBaseMenu, treeMap map[uint][]system.SysBaseMenu) (err error) {
  99. menu.Children = treeMap[menu.ID]
  100. for i := 0; i < len(menu.Children); i++ {
  101. err = menuService.getBaseChildrenList(&menu.Children[i], treeMap)
  102. }
  103. return err
  104. }
  105. //@author: [piexlmax](https://github.com/piexlmax)
  106. //@function: AddBaseMenu
  107. //@description: 添加基础路由
  108. //@param: menu model.SysBaseMenu
  109. //@return: error
  110. func (menuService *MenuService) AddBaseMenu(menu system.SysBaseMenu) error {
  111. _, err := system.QueryBaseMenuByName(menu.Name)
  112. if !errors.Is(err, gorm.ErrRecordNotFound) {
  113. return errors.New("存在重复name,请修改name")
  114. }
  115. return menu.CreateBaseMenu()
  116. }
  117. //@author: [piexlmax](https://github.com/piexlmax)
  118. //@function: getBaseMenuTreeMap
  119. //@description: 获取路由总树map
  120. //@return: treeMap map[string][]system.SysBaseMenu, err error
  121. func (menuService *MenuService) getBaseMenuTreeMap() (treeMap map[uint][]system.SysBaseMenu, err error) {
  122. treeMap = make(map[uint][]system.SysBaseMenu)
  123. allMenus, err := system.QueryBaseMenuAndMenuBtnAndParameters()
  124. for _, v := range allMenus {
  125. treeMap[v.ParentId] = append(treeMap[v.ParentId], v)
  126. }
  127. return treeMap, err
  128. }
  129. //@author: [piexlmax](https://github.com/piexlmax)
  130. //@function: GetBaseMenuTree
  131. //@description: 获取基础路由树
  132. //@return: menus []system.SysBaseMenu, err error
  133. func (menuService *MenuService) GetBaseMenuTree() (menus []system.SysBaseMenu, err error) {
  134. treeMap, err := menuService.getBaseMenuTreeMap()
  135. menus = treeMap[0]
  136. for i := 0; i < len(menus); i++ {
  137. err = menuService.getBaseChildrenList(&menus[i], treeMap)
  138. }
  139. return menus, err
  140. }
  141. //@author: [piexlmax](https://github.com/piexlmax)
  142. //@function: AddMenuAuthority
  143. //@description: 为角色增加menu树
  144. //@param: menus []model.SysBaseMenu, authorityId string
  145. //@return: err error
  146. func (menuService *MenuService) AddMenuAuthority(menus []system.SysBaseMenu, authorityId uint) (err error) {
  147. var auth system.SysAuthority
  148. auth.AuthorityId = authorityId
  149. auth.SysBaseMenus = menus
  150. err = AuthorityServiceApp.SetMenuAuthority(&auth)
  151. return err
  152. }
  153. //@author: [piexlmax](https://github.com/piexlmax)
  154. //@function: GetMenuAuthority
  155. //@description: 查看当前角色树
  156. //@param: info *request.GetAuthorityId
  157. //@return: menus []system.SysMenu, err error
  158. func (menuService *MenuService) GetMenuAuthority(info *request.GetAuthorityId) (menus []system.SysMenu, err error) {
  159. SysAuthorityMenus, err := system.QueryAuthorityMenuByAuthorityId(info.AuthorityId)
  160. if err != nil {
  161. return
  162. }
  163. var MenuIds []string
  164. for i := range SysAuthorityMenus {
  165. MenuIds = append(MenuIds, SysAuthorityMenus[i].MenuId)
  166. }
  167. baseMenu, err := system.QueryBaseMenuAndParametersByMenuId(MenuIds)
  168. for i := range baseMenu {
  169. menus = append(menus, system.SysMenu{
  170. SysBaseMenu: baseMenu[i],
  171. AuthorityId: info.AuthorityId,
  172. MenuId: baseMenu[i].ID,
  173. Parameters: baseMenu[i].Parameters,
  174. })
  175. }
  176. return menus, err
  177. }
  178. // UserAuthorityDefaultRouter 用户角色默认路由检查
  179. //
  180. // Author [SliverHorn](https://github.com/SliverHorn)
  181. func (menuService *MenuService) UserAuthorityDefaultRouter(user *system.SysUser) {
  182. menuIds, err := system.QuerySysBaseMenuIdById(user.AuthorityId)
  183. if err != nil {
  184. return
  185. }
  186. _, err = system.QueryBaseMenuByIdAndDefaultRouter(user.Authority.DefaultRouter, menuIds)
  187. if errors.Is(err, gorm.ErrRecordNotFound) {
  188. user.Authority.DefaultRouter = "404"
  189. }
  190. }