system_menu.go 7.6 KB

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