permission.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { defineStore } from 'pinia'
  2. import { store } from '../index'
  3. import { cloneDeep } from 'lodash-es'
  4. import remainingRouter from '@/router/modules/remaining'
  5. import { generateRoute, flatMultiLevelRoutes } from '@/utils/routerHelper'
  6. import { getAsyncRoutesApi } from '@/api/login'
  7. import { useCache } from '@/hooks/web/useCache'
  8. const { wsCache } = useCache()
  9. export interface PermissionState {
  10. routers: AppRouteRecordRaw[]
  11. addRouters: AppRouteRecordRaw[]
  12. menuTabRouters: AppRouteRecordRaw[]
  13. }
  14. export const usePermissionStore = defineStore('permission', {
  15. state: (): PermissionState => ({
  16. routers: [],
  17. addRouters: [],
  18. menuTabRouters: []
  19. }),
  20. getters: {
  21. getRouters(): AppRouteRecordRaw[] {
  22. return this.routers
  23. },
  24. getAddRouters(): AppRouteRecordRaw[] {
  25. return flatMultiLevelRoutes(cloneDeep(this.addRouters))
  26. },
  27. getMenuTabRouters(): AppRouteRecordRaw[] {
  28. return this.menuTabRouters
  29. }
  30. },
  31. actions: {
  32. async generateRoutes(): Promise<unknown> {
  33. return new Promise<void>(async (resolve) => {
  34. let res: AppCustomRouteRecordRaw[]
  35. if (wsCache.get('roleRouters')) {
  36. res = wsCache.get('roleRouters') as AppCustomRouteRecordRaw[]
  37. } else {
  38. res = await getAsyncRoutesApi()
  39. wsCache.set('roleRouters', res)
  40. }
  41. const routerMap: AppRouteRecordRaw[] = generateRoute(res as AppCustomRouteRecordRaw[])
  42. // 动态路由,404一定要放到最后面
  43. this.addRouters = routerMap.concat([
  44. {
  45. path: '/:path(.*)*',
  46. redirect: '/404',
  47. name: '404Page',
  48. meta: {
  49. hidden: true,
  50. breadcrumb: false
  51. }
  52. }
  53. ])
  54. // 渲染菜单的所有路由
  55. this.routers = cloneDeep(remainingRouter).concat(routerMap)
  56. resolve()
  57. })
  58. },
  59. setMenuTabRouters(routers: AppRouteRecordRaw[]): void {
  60. this.menuTabRouters = routers
  61. }
  62. }
  63. })
  64. export const usePermissionStoreWithOut = () => {
  65. return usePermissionStore(store)
  66. }