menu.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { shallowRef } from 'vue'
  2. import { AuthType } from '@/constants/menu'
  3. import { queryAccountMenu } from '@/services/api/account'
  4. import { defineStore } from '../store'
  5. import { sessionData } from '../storage'
  6. export const useMenuStore = defineStore(() => {
  7. const loading = shallowRef(false)
  8. const userRoutes = sessionData.getRef('userRoutes')
  9. // 获取用户路由表
  10. const getUserRoutes = async () => {
  11. try {
  12. loading.value = true
  13. const res = await queryAccountMenu()
  14. userRoutes.value = res
  15. } finally {
  16. loading.value = false
  17. }
  18. }
  19. // 根据 code 查找对应的子路由
  20. const getChildrenRoutes = (routeName: string) => {
  21. const findChildren = (data: Model.UserRoutes[]): Model.UserRoutes[] => {
  22. for (const item of data) {
  23. const { code, children } = item
  24. if (code === routeName) return children ?? []
  25. if (children) {
  26. const res = findChildren(children)
  27. if (res.length) return res
  28. }
  29. }
  30. return []
  31. }
  32. return findChildren(userRoutes.value)
  33. }
  34. // 过滤菜单
  35. const filterMenus = (data: Model.UserRoutes[], parentPath = '') => {
  36. return data.reduce<Model.UserRoutes[]>((pre, cur) => {
  37. if (!cur.hidden && cur.authType === AuthType.Menu) {
  38. const routePath = (parentPath ? parentPath + '/' : '') + cur.url
  39. pre.push({
  40. ...cur,
  41. url: routePath,
  42. children: cur.children ? filterMenus(cur.children, routePath) : [],
  43. })
  44. }
  45. return pre
  46. }, [])
  47. }
  48. // 获取用户菜单(无限级)
  49. const getUserMenus = (level = 0) => {
  50. // 过滤层级
  51. const filterLevel = (data: Model.UserRoutes[], n: number): Model.UserRoutes[] => {
  52. if (level) {
  53. return data.map((e) => ({ ...e, children: n <= 1 ? [] : filterLevel(e.children ?? [], n - 1) }))
  54. }
  55. return data
  56. }
  57. return filterMenus(filterLevel(userRoutes.value, level))
  58. }
  59. // 获取子菜单
  60. const getChildrenMenus = (routeName: string) => {
  61. const children = getChildrenRoutes(routeName)
  62. return filterMenus(children)
  63. }
  64. return {
  65. loading,
  66. userRoutes,
  67. getUserRoutes,
  68. getChildrenRoutes,
  69. getUserMenus,
  70. getChildrenMenus
  71. }
  72. })