permission.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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 { flatMultiLevelRoutes, generateRoute } from '@/utils/routerHelper'
  6. import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
  7. const { wsCache } = useCache()
  8. export interface PermissionState {
  9. routers: AppRouteRecordRaw[]
  10. addRouters: AppRouteRecordRaw[]
  11. menuTabRouters: AppRouteRecordRaw[]
  12. }
  13. export const usePermissionStore = defineStore('permission', {
  14. state: (): PermissionState => ({
  15. routers: [],
  16. addRouters: [],
  17. menuTabRouters: []
  18. }),
  19. getters: {
  20. getRouters(): AppRouteRecordRaw[] {
  21. return this.routers
  22. },
  23. getAddRouters(): AppRouteRecordRaw[] {
  24. return flatMultiLevelRoutes(cloneDeep(this.addRouters))
  25. },
  26. getMenuTabRouters(): AppRouteRecordRaw[] {
  27. return this.menuTabRouters
  28. }
  29. },
  30. actions: {
  31. async generateRoutes(): Promise<unknown> {
  32. return new Promise<void>(async (resolve) => {
  33. // 获得菜单列表,它在登录的时候,setUserInfoAction 方法中已经进行获取
  34. let res: AppCustomRouteRecordRaw[] = []
  35. if (wsCache.get(CACHE_KEY.ROLE_ROUTERS)) {
  36. res = wsCache.get(CACHE_KEY.ROLE_ROUTERS) as AppCustomRouteRecordRaw[]
  37. }
  38. const routerMap: AppRouteRecordRaw[] = generateRoute(res)
  39. // 动态路由,404一定要放到最后面
  40. this.addRouters = routerMap.concat([
  41. {
  42. path: '/:path(.*)*',
  43. redirect: '/404',
  44. name: '404Page',
  45. meta: {
  46. hidden: true,
  47. breadcrumb: false
  48. }
  49. }
  50. ])
  51. // 渲染菜单的所有路由
  52. this.routers = cloneDeep(remainingRouter).concat(routerMap)
  53. resolve()
  54. })
  55. },
  56. setMenuTabRouters(routers: AppRouteRecordRaw[]): void {
  57. this.menuTabRouters = routers
  58. }
  59. }
  60. })
  61. export const usePermissionStoreWithOut = () => {
  62. return usePermissionStore(store)
  63. }