menuService.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package service
  2. import (
  3. "iot_manager_service/app/system/dao"
  4. "iot_manager_service/app/system/model"
  5. "iot_manager_service/util/common"
  6. "sort"
  7. "strconv"
  8. )
  9. var MenuService = new(menuService)
  10. type menuService struct{}
  11. func (s *menuService) Get(id int64) (*dao.Menu, error) {
  12. menu := &dao.Menu{
  13. ID: id,
  14. }
  15. err := menu.Get()
  16. if err != nil {
  17. return nil, err
  18. }
  19. return menu, nil
  20. }
  21. func (s *menuService) Submit(req model.MenuSubmit) *common.Errors {
  22. pId, _ := strconv.ParseInt(req.ParentId, 10, 64)
  23. menu := &dao.Menu{
  24. ID: req.ID,
  25. ParentId: pId,
  26. Code: req.Code,
  27. Name: req.Name,
  28. Alias: req.Alias,
  29. Path: req.Path,
  30. Source: req.Source,
  31. Sort: req.Sort,
  32. Category: req.Category,
  33. Action: req.Action,
  34. IsOpen: req.IsOpen,
  35. Remark: req.Remark,
  36. IsDeleted: 0,
  37. }
  38. if menu.ID == 0 {
  39. err := menu.Save()
  40. if err != nil {
  41. return common.FailResponse(err.Error(), nil)
  42. }
  43. return common.SuccessResponse(common.Succeeded, nil)
  44. }
  45. err := menu.Update()
  46. if err != nil {
  47. return common.FailResponse(err.Error(), nil)
  48. }
  49. return common.SuccessResponse(common.Succeeded, nil)
  50. }
  51. func (s *menuService) GetAll() []dao.Menu {
  52. menu := &dao.Menu{}
  53. menus, err := menu.GetAll()
  54. if err != nil {
  55. return nil
  56. }
  57. return menus
  58. }
  59. func (s *menuService) Tree() ([]model.MenuTreeDetail, error) {
  60. allMenus := s.GetAll()
  61. var rsp []model.MenuTreeDetail
  62. //上级角色——多个下级角色数组
  63. tmp := make(map[int64][]dao.Menu)
  64. for _, menu := range allMenus {
  65. childes, isExist := tmp[menu.ParentId]
  66. if isExist {
  67. childes = append(childes, menu)
  68. tmp[menu.ParentId] = childes
  69. } else {
  70. tmp[menu.ParentId] = []dao.Menu{menu}
  71. }
  72. }
  73. if len(tmp) == 0 {
  74. return nil, nil
  75. }
  76. roots, _ := tmp[0]
  77. rsp = menuTreeDfs(rsp, roots, tmp)
  78. return rsp, nil
  79. }
  80. func (s *menuService) Routes(roleId int64) ([]model.MenuRouteDetail, error) {
  81. allMenus := s.GetAll()
  82. menuMap := make(map[int64]dao.Menu)
  83. for _, menu := range allMenus {
  84. menuMap[menu.ID] = menu
  85. }
  86. roleMenus := RoleMenuService.GetMenuByRole(roleId)
  87. var rsp []model.MenuRouteDetail
  88. //上级角色——多个下级角色数组
  89. tmp := make(map[int64][]dao.Menu)
  90. for _, roleMenu := range roleMenus {
  91. if menu, isExist := menuMap[roleMenu.MenuId]; isExist {
  92. childes, isExist := tmp[menu.ParentId]
  93. if isExist {
  94. childes = append(childes, menu)
  95. tmp[menu.ParentId] = childes
  96. } else {
  97. tmp[menu.ParentId] = []dao.Menu{menu}
  98. }
  99. }
  100. }
  101. if len(tmp) == 0 {
  102. return nil, nil
  103. }
  104. roots, _ := tmp[0]
  105. rsp = menuDfs(rsp, roots, tmp)
  106. sort.Slice(rsp, func(i, j int) bool {
  107. if rsp[i].Sort < rsp[j].Sort {
  108. return true
  109. }
  110. return false
  111. })
  112. return rsp, nil
  113. }
  114. func menuDfs(result []model.MenuRouteDetail, menus []dao.Menu, tmp map[int64][]dao.Menu) []model.MenuRouteDetail {
  115. if len(menus) == 0 {
  116. return nil
  117. }
  118. for _, child := range menus {
  119. detail := model.MenuRouteDetail{}
  120. detail.Menu = child
  121. childes, isExist := tmp[child.ID]
  122. if isExist {
  123. detail.HasChildren = true
  124. detail.Children = menuDfs([]model.MenuRouteDetail{}, childes, tmp)
  125. result = append(result, detail)
  126. } else {
  127. detail.HasChildren = false
  128. result = append(result, detail)
  129. }
  130. }
  131. return result
  132. }
  133. func menuTreeDfs(result []model.MenuTreeDetail, menus []dao.Menu, tmp map[int64][]dao.Menu) []model.MenuTreeDetail {
  134. if len(menus) == 0 {
  135. return nil
  136. }
  137. for _, child := range menus {
  138. detail := model.MenuTreeDetail{}
  139. detail.Title = child.Name
  140. detail.ID = strconv.FormatInt(child.ID, 10)
  141. detail.ParentId = strconv.FormatInt(child.ParentId, 10)
  142. detail.Key = strconv.FormatInt(child.ID, 10)
  143. detail.Value = strconv.FormatInt(child.ID, 10)
  144. childes, isExist := tmp[child.ID]
  145. if isExist {
  146. detail.HasChildren = true
  147. detail.Children = menuTreeDfs([]model.MenuTreeDetail{}, childes, tmp)
  148. result = append(result, detail)
  149. } else {
  150. detail.HasChildren = false
  151. result = append(result, detail)
  152. }
  153. }
  154. return result
  155. }
  156. func (s *menuService) LazyList(parentId int64, name, code, alias string) ([]model.MenuLazyListDetail, error) {
  157. menu := &dao.Menu{
  158. ParentId: parentId,
  159. Name: name,
  160. Code: code,
  161. Alias: alias,
  162. }
  163. menus, err := menu.GetByParentId()
  164. if err != nil {
  165. return nil, err
  166. }
  167. var parentIds []int64
  168. for _, m := range menus {
  169. parentIds = append(parentIds, m.ID)
  170. }
  171. hasChildrenMap, err := menu.HasChildren(parentIds)
  172. if err != nil {
  173. return nil, err
  174. }
  175. var rsp []model.MenuLazyListDetail
  176. for _, m := range menus {
  177. hasChildren := hasChildrenMap[m.ID]
  178. rsp = append(rsp, model.MenuLazyListDetail{
  179. Menu: m,
  180. HasChildren: hasChildren,
  181. })
  182. }
  183. return rsp, nil
  184. }
  185. func (s *menuService) GetTree() ([]model.MenuRouteDetail, error) {
  186. menuDao := dao.Menu{ParentId: int64(0)}
  187. var menuDetails []model.MenuRouteDetail
  188. var temp model.MenuRouteDetail
  189. //所有菜单包装为菜单详情
  190. menus, err := menuDao.GetAll()
  191. var allDetails []model.MenuRouteDetail
  192. for _, v := range menus {
  193. temp.Menu = v
  194. allDetails = append(allDetails, temp)
  195. }
  196. //一级菜单 parent_id为0 包装为菜单详情
  197. lv1s, _ := menuDao.GetByParentId()
  198. for _, v := range lv1s {
  199. temp.Menu = v
  200. temp.Children, temp.HasChildren = s.getChildren(temp, allDetails)
  201. menuDetails = append(menuDetails, temp)
  202. }
  203. return menuDetails, err
  204. }
  205. func (s *menuService) getChildren(parent model.MenuRouteDetail,
  206. all []model.MenuRouteDetail) ([]model.MenuRouteDetail, bool) {
  207. id := parent.ID
  208. var children []model.MenuRouteDetail
  209. for _, detail := range all {
  210. if detail.ParentId == id {
  211. detail.Children, detail.HasChildren = s.getChildren(detail, all)
  212. children = append(children, detail)
  213. }
  214. }
  215. return children, children != nil
  216. }