system_menu.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package model
  2. import (
  3. "kpt-pasture/util"
  4. "time"
  5. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  6. )
  7. const (
  8. PermissionBtnAdd = "permission:btn:add"
  9. PermissionBtnEdit = "permission:btn:edit"
  10. PermissionBtnDelete = "permission:btn:delete"
  11. )
  12. var PermissionBtnMap = map[pasturePb.ButtonType_Kind]string{
  13. pasturePb.ButtonType_Add: PermissionBtnAdd,
  14. pasturePb.ButtonType_Edit: PermissionBtnEdit,
  15. pasturePb.ButtonType_Delete: PermissionBtnDelete,
  16. }
  17. type SystemMenu struct {
  18. Id int64 `json:"id"`
  19. Name string `json:"name"`
  20. Title string `json:"title"`
  21. Path string `json:"path"`
  22. Icon string `json:"icon"`
  23. Component string `json:"component"`
  24. Redirect string `json:"redirect"`
  25. Auths string `json:"auths"`
  26. MenuType pasturePb.MenuType_Kind `json:"menuType"`
  27. ButtonType pasturePb.ButtonType_Kind `json:"buttonType"`
  28. ParentId int64 `json:"parentId"`
  29. Rank int32 `json:"rank"`
  30. ExtraIcon string `json:"extraIcon"`
  31. EnterTransition string `json:"enterTransition"`
  32. ActivePath string `json:"activePath"`
  33. FrameSrc string `json:"frameSrc"`
  34. FrameLoading pasturePb.IsShow_Kind `json:"frameLoading"`
  35. Keepalive pasturePb.IsShow_Kind `json:"keepalive"`
  36. HiddenTag pasturePb.IsShow_Kind `json:"hiddenTag"`
  37. ShowLink pasturePb.IsShow_Kind `json:"showLink"`
  38. ShowParent pasturePb.IsShow_Kind `json:"showParent"`
  39. IsShow pasturePb.IsShow_Kind `json:"isShow"`
  40. IsDelete pasturePb.IsShow_Kind `json:"isDelete"`
  41. CreatedAt int64 `json:"createdAt"`
  42. UpdatedAt int64 `json:"updatedAt"`
  43. }
  44. func (s *SystemMenu) TableName() string {
  45. return "system_menu"
  46. }
  47. func (s *SystemMenu) MenuUpdate(req *pasturePb.SearchMenuRequest) {
  48. s.Name = req.Name
  49. s.Path = req.Path
  50. s.MenuType = req.MenuType
  51. s.Title = req.Title
  52. s.ParentId = int64(req.ParentId)
  53. s.FrameSrc = req.FrameSrc
  54. s.FrameLoading = util.BooleanToIsShow(req.FrameLoading)
  55. s.Keepalive = util.BooleanToIsShow(req.Keepalive)
  56. s.HiddenTag = util.BooleanToIsShow(req.HiddenTag)
  57. s.ShowLink = util.BooleanToIsShow(req.ShowLink)
  58. s.ShowParent = util.BooleanToIsShow(req.ShowParent)
  59. s.Icon = req.Icon
  60. s.Component = req.Component
  61. s.Redirect = req.Redirect
  62. s.Auths = req.Auths
  63. s.Rank = req.Rank
  64. s.ExtraIcon = req.ExtraIcon
  65. s.EnterTransition = req.EnterTransition
  66. s.ActivePath = req.ActivePath
  67. s.IsShow = req.IsShow
  68. }
  69. // NewSystemMenu AddMenuRequest
  70. func NewSystemMenu(req *pasturePb.SearchMenuRequest) *SystemMenu {
  71. return &SystemMenu{
  72. Name: req.Name,
  73. Title: req.Title,
  74. Path: req.Path,
  75. Icon: req.Icon,
  76. Component: req.Component,
  77. Redirect: req.Redirect,
  78. Auths: req.Auths,
  79. MenuType: req.MenuType,
  80. ParentId: int64(req.ParentId),
  81. Rank: req.Rank,
  82. ExtraIcon: req.ExtraIcon,
  83. EnterTransition: req.EnterTransition,
  84. ActivePath: req.ActivePath,
  85. FrameSrc: req.FrameSrc,
  86. FrameLoading: util.BooleanToIsShow(req.FrameLoading),
  87. Keepalive: util.BooleanToIsShow(req.Keepalive),
  88. HiddenTag: util.BooleanToIsShow(req.HiddenTag),
  89. ShowLink: util.BooleanToIsShow(req.ShowLink),
  90. ShowParent: util.BooleanToIsShow(req.ShowParent),
  91. IsShow: pasturePb.IsShow_Ok,
  92. IsDelete: pasturePb.IsShow_Ok,
  93. }
  94. }
  95. type SystemMenuSlice []*SystemMenu
  96. func (s SystemMenuSlice) ToPB() []*pasturePb.SearchMenuRequest {
  97. res := make([]*pasturePb.SearchMenuRequest, len(s))
  98. for i, menu := range s {
  99. var frameLoading, keepalive, hiddenTag, showLink, showParent bool
  100. if menu.FrameLoading == pasturePb.IsShow_Ok {
  101. frameLoading = true
  102. }
  103. if menu.Keepalive == pasturePb.IsShow_Ok {
  104. keepalive = true
  105. }
  106. if menu.HiddenTag == pasturePb.IsShow_Ok {
  107. hiddenTag = true
  108. }
  109. if menu.ShowLink == pasturePb.IsShow_Ok {
  110. showLink = true
  111. }
  112. if menu.ShowParent == pasturePb.IsShow_Ok {
  113. showParent = true
  114. }
  115. res[i] = &pasturePb.SearchMenuRequest{
  116. Id: int32(menu.Id),
  117. Name: menu.Name,
  118. ParentId: int32(menu.ParentId),
  119. MenuType: menu.MenuType,
  120. Title: menu.Title,
  121. Path: menu.Path,
  122. IsShow: menu.IsShow,
  123. Component: menu.Component,
  124. Icon: menu.Icon,
  125. Redirect: menu.Redirect,
  126. Auths: menu.Auths,
  127. Rank: menu.Rank,
  128. ExtraIcon: menu.ExtraIcon,
  129. EnterTransition: menu.EnterTransition,
  130. ActivePath: menu.ActivePath,
  131. FrameSrc: menu.FrameSrc,
  132. FrameLoading: frameLoading,
  133. Keepalive: keepalive,
  134. HiddenTag: hiddenTag,
  135. ShowLink: showLink,
  136. ShowParent: showParent,
  137. CreatedAtFormat: time.Unix(menu.CreatedAt, 0).Local().Format(LayoutTime),
  138. UpdatedAtFormat: time.Unix(menu.UpdatedAt, 0).Local().Format(LayoutTime),
  139. }
  140. }
  141. return res
  142. }
  143. func (s SystemMenuSlice) ToTree() []*pasturePb.MenuTree {
  144. if len(s) == 0 {
  145. return make([]*pasturePb.MenuTree, 0)
  146. }
  147. // 1. 一次性创建所有节点并建立ID映射
  148. nodeMap := make(map[int32]*pasturePb.MenuTree, len(s))
  149. allNodes := make([]*pasturePb.MenuTree, len(s))
  150. for i, v := range s {
  151. node := &pasturePb.MenuTree{
  152. Id: int32(v.Id),
  153. Path: v.Path,
  154. ParentId: int32(v.ParentId),
  155. Name: v.Name,
  156. ButtonType: v.ButtonType,
  157. MenuType: v.MenuType,
  158. Meta: &pasturePb.MenuMeta{
  159. Icon: v.Icon,
  160. Title: v.Title,
  161. Rank: v.Rank,
  162. Roles: []string{},
  163. ShowLink: v.ShowLink == pasturePb.IsShow_Ok,
  164. Auths: make([]string, 0),
  165. },
  166. Children: make([]*pasturePb.MenuTree, 0),
  167. }
  168. allNodes[i] = node
  169. nodeMap[node.Id] = node
  170. }
  171. // 2. 构建树结构
  172. rootNodes := make([]*pasturePb.MenuTree, 0, len(s)/2) // 假设约一半是根节点
  173. for _, node := range allNodes {
  174. if node.ParentId == 0 {
  175. rootNodes = append(rootNodes, node)
  176. } else {
  177. if parent, exists := nodeMap[node.ParentId]; exists {
  178. parent.Children = append(parent.Children, node)
  179. }
  180. }
  181. }
  182. // 3. 处理特殊节点类型
  183. for _, node := range nodeMap {
  184. if node.MenuType == pasturePb.MenuType_Button && node.ButtonType > pasturePb.ButtonType_Invalid {
  185. if parent, ok := nodeMap[node.ParentId]; ok && parent.Meta != nil {
  186. parent.Meta.Auths = append(parent.Meta.Auths, PermissionBtnMap[node.ButtonType])
  187. }
  188. }
  189. }
  190. return rootNodes
  191. }
  192. type MenuItem struct {
  193. Path string `json:"path"`
  194. Name string `json:"name"`
  195. Meta MenuMeta `json:"meta"`
  196. Children []*MenuItem `json:"children"`
  197. }
  198. type MenuMeta struct {
  199. Icon string `json:"icon"`
  200. Title string `json:"title"`
  201. Rank int32 `json:"rank"`
  202. ShowLink bool `json:"showLink"`
  203. Hidden bool `json:"hidden"`
  204. }