_menu.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import { ref } from "vue"
  2. import { defineStore } from "pinia"
  3. import Stroage from "@/core/utils/storages"
  4. import type { RouteRecordRaw } from "vue-router"
  5. import type { MenuItem, MenuRouteMap, FunctionMenu } from "@/core/config/MainMenuConfig"
  6. import { MenuRouteMaps } from "@/router/menuMap"
  7. import router, { to404 } from "@/router"
  8. import apis from "@/api"
  9. import configs from "@/core/config/Index"
  10. export const useMenuStore = defineStore("meun", () => {
  11. const MENU_KEY = "fun_menu"
  12. let menuData: Array<FunctionMenu> = JSON.parse(Stroage.getItem(MENU_KEY) || "[]")
  13. const menus = ref<Array<FunctionMenu>>([])
  14. const sidebarMenus = ref<Array<MenuItem>>([] as Array<MenuItem>)
  15. const headMenus = ref<Array<MenuItem>>([] as Array<MenuItem>)
  16. const routes = ref<Array<RouteRecordRaw>>([] as Array<RouteRecordRaw>)
  17. const getSidebarMenus = (): Array<MenuItem> => {
  18. return sidebarMenus.value
  19. }
  20. const getHeadMenus = (): Array<MenuItem> => {
  21. return headMenus.value
  22. }
  23. const formatterMenus = (menus: Array<FunctionMenu>) => {
  24. const parent: MenuItem = {
  25. pages: [],
  26. }
  27. menus.forEach((v) => {
  28. const item = formatterMenuItem(v)
  29. parent.pages?.push(item)
  30. })
  31. sidebarMenus.value.push(parent)
  32. headMenus.value.push({
  33. sectionTitle: "数据大屏",
  34. route: "/DataCenter",
  35. fontIcon: "fas fa-home",
  36. })
  37. }
  38. const formatterMenuItem = (fun: FunctionMenu) => {
  39. menus.value.push(fun)
  40. const menu: MenuRouteMap | undefined = MenuRouteMaps.find(
  41. (v) => v.path.toLocaleLowerCase() == fun.url.trimEnd().toLocaleLowerCase()
  42. )
  43. const item: MenuItem = {
  44. //sectionTitle: fun.displayName,
  45. parentName: fun.parentName,
  46. fontIcon: menu?.icon ?? "fas fa-cog",
  47. svgIcon: menu?.svg,
  48. }
  49. // if (menu?.path) {
  50. // item.route = menu?.path
  51. // }
  52. item.route = fun.url
  53. if (fun.children && fun.children.length) {
  54. item.sectionTitle = fun.name
  55. item.sub = []
  56. fun.children.forEach((v) => {
  57. item.sub?.push(formatterMenuItem(v))
  58. })
  59. } else {
  60. item.heading = fun.name
  61. }
  62. return item
  63. }
  64. const getBreadcrumbs = (fun: FunctionMenu, breadcrumbs?: Array<string>): Array<string> => {
  65. breadcrumbs = breadcrumbs || []
  66. // if (fun.url == homeRouter.path) {
  67. // return breadcrumbs
  68. // }
  69. breadcrumbs.unshift(fun.name)
  70. const parent = menus.value.find((a) => a.id == fun.parentId)
  71. if (parent) {
  72. return getBreadcrumbs(parent, breadcrumbs)
  73. }
  74. return breadcrumbs
  75. }
  76. const formatterRoutes = (funs: Array<FunctionMenu>, withChild = true) => {
  77. //router.addRoute(configs.MAIN_ROUTER_NAME, homeRouter)
  78. if (funs && funs.length) {
  79. funs.forEach((v) => {
  80. formatterRouteItem(v, withChild)
  81. })
  82. }
  83. router.addRoute(to404)
  84. //console.log("===========", router.getRoutes());
  85. }
  86. const formatterRouteItem = (fun: FunctionMenu, withChild = true) => {
  87. const menu: MenuRouteMap | undefined = MenuRouteMaps.find((v) => v.path == fun.url)
  88. if (menu?.component == null) {
  89. if (withChild && fun.children && fun.children.length) {
  90. fun.children.forEach((v) => {
  91. formatterRouteItem(v)
  92. })
  93. }
  94. return
  95. }
  96. const item: RouteRecordRaw = {
  97. name: fun.name,
  98. path: menu?.path ?? "",
  99. component: menu?.component,
  100. meta: {
  101. permission: menu?.auth == undefined ? true : !!menu?.auth,
  102. pageTitle: fun.name,
  103. breadcrumbs: getBreadcrumbs(fun),
  104. },
  105. }
  106. routes.value.push(item)
  107. router.addRoute(configs.MAIN_ROUTER_NAME, item)
  108. }
  109. const formatter = (funs: Array<FunctionMenu>) => {
  110. sidebarMenus.value = []
  111. headMenus.value = []
  112. menus.value = []
  113. routes.value = []
  114. formatterMenus(funs)
  115. formatterRoutes(funs)
  116. //console.log("----------", routes.value)
  117. }
  118. function loadMenus() {
  119. return new Promise((reslove, redirect) => {
  120. if (menuData && menuData.length) {
  121. formatter(menuData)
  122. reslove("")
  123. } else {
  124. apis.authApi
  125. .getMenus()
  126. .then(({ data }) => {
  127. formatter(data || [])
  128. menuData = data
  129. Stroage.setItem(MENU_KEY, JSON.stringify(data))
  130. reslove("")
  131. })
  132. .catch((e) => {
  133. console.error("菜单加载失败!", e.message)
  134. redirect(e)
  135. //router.push({ name: "sign-in" })
  136. })
  137. }
  138. })
  139. }
  140. function reLoadMenus() {
  141. removeMenus()
  142. return loadMenus()
  143. }
  144. function removeMenus() {
  145. Stroage.removeItem(MENU_KEY)
  146. menuData = []
  147. }
  148. return {
  149. getSidebarMenus,
  150. getHeadMenus,
  151. getBreadcrumbs,
  152. loadMenus,
  153. reLoadMenus,
  154. removeMenus,
  155. }
  156. })