提交 | 用户 | age
|
2f6253
|
1 |
import type { AppRouteRecordRaw, Menu } from '/@/router/types'; |
陈 |
2 |
|
215d8b
|
3 |
import { defineStore } from 'pinia'; |
V |
4 |
import { store } from '/@/store'; |
|
5 |
import { useI18n } from '/@/hooks/web/useI18n'; |
|
6 |
import { useUserStore } from './user'; |
|
7 |
import { useAppStoreWidthOut } from './app'; |
8fb039
|
8 |
import { toRaw } from 'vue'; |
215d8b
|
9 |
import { transformObjToRoute, flatMultiLevelRoutes } from '/@/router/helper/routeHelper'; |
V |
10 |
import { transformRouteToMenu } from '/@/router/helper/menuHelper'; |
8fb039
|
11 |
|
215d8b
|
12 |
import projectSetting from '/@/settings/projectSetting'; |
2f6253
|
13 |
|
陈 |
14 |
import { PermissionModeEnum } from '/@/enums/appEnum'; |
|
15 |
|
ecfb70
|
16 |
import { asyncRoutes } from '/@/router/routes'; |
8fb039
|
17 |
import { ERROR_LOG_ROUTE, PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic'; |
2f6253
|
18 |
|
8fb039
|
19 |
import { filter } from '/@/utils/helper/treeHelper'; |
V |
20 |
|
9e5e63
|
21 |
import { getMenuList } from '/@/api/sys/menu'; |
N |
22 |
import { getPermCode } from '/@/api/sys/user'; |
8fb039
|
23 |
|
2f6253
|
24 |
import { useMessage } from '/@/hooks/web/useMessage'; |
66acb2
|
25 |
|
215d8b
|
26 |
interface PermissionState { |
e23336
|
27 |
// Permission code list |
e8d6f8
|
28 |
permCodeList: string[] | number[]; |
2f6253
|
29 |
// Whether the route has been dynamically added |
215d8b
|
30 |
isDynamicAddedRoute: boolean; |
e23336
|
31 |
// To trigger a menu update |
215d8b
|
32 |
lastBuildMenuTime: number; |
e23336
|
33 |
// Backstage menu list |
215d8b
|
34 |
backMenuList: Menu[]; |
2f6253
|
35 |
} |
215d8b
|
36 |
export const usePermissionStore = defineStore({ |
V |
37 |
id: 'app-permission', |
|
38 |
state: (): PermissionState => ({ |
|
39 |
permCodeList: [], |
|
40 |
// Whether the route has been dynamically added |
|
41 |
isDynamicAddedRoute: false, |
|
42 |
// To trigger a menu update |
|
43 |
lastBuildMenuTime: 0, |
|
44 |
// Backstage menu list |
|
45 |
backMenuList: [], |
|
46 |
}), |
|
47 |
getters: { |
e8d6f8
|
48 |
getPermCodeList(): string[] | number[] { |
215d8b
|
49 |
return this.permCodeList; |
V |
50 |
}, |
e8d6f8
|
51 |
getBackMenuList(): Menu[] { |
215d8b
|
52 |
return this.backMenuList; |
V |
53 |
}, |
e8d6f8
|
54 |
getLastBuildMenuTime(): number { |
215d8b
|
55 |
return this.lastBuildMenuTime; |
V |
56 |
}, |
e8d6f8
|
57 |
getIsDynamicAddedRoute(): boolean { |
215d8b
|
58 |
return this.isDynamicAddedRoute; |
V |
59 |
}, |
|
60 |
}, |
|
61 |
actions: { |
|
62 |
setPermCodeList(codeList: string[]) { |
|
63 |
this.permCodeList = codeList; |
|
64 |
}, |
|
65 |
|
|
66 |
setBackMenuList(list: Menu[]) { |
|
67 |
this.backMenuList = list; |
132c7f
|
68 |
list?.length > 0 && this.setLastBuildMenuTime(); |
215d8b
|
69 |
}, |
V |
70 |
|
|
71 |
setLastBuildMenuTime() { |
|
72 |
this.lastBuildMenuTime = new Date().getTime(); |
|
73 |
}, |
|
74 |
|
|
75 |
setDynamicAddedRoute(added: boolean) { |
|
76 |
this.isDynamicAddedRoute = added; |
|
77 |
}, |
|
78 |
resetState(): void { |
|
79 |
this.isDynamicAddedRoute = false; |
|
80 |
this.permCodeList = []; |
|
81 |
this.backMenuList = []; |
|
82 |
this.lastBuildMenuTime = 0; |
|
83 |
}, |
9e5e63
|
84 |
async changePermissionCode() { |
N |
85 |
const codeList = await getPermCode(); |
215d8b
|
86 |
this.setPermCodeList(codeList); |
V |
87 |
}, |
9e5e63
|
88 |
async buildRoutesAction(): Promise<AppRouteRecordRaw[]> { |
215d8b
|
89 |
const { t } = useI18n(); |
V |
90 |
const userStore = useUserStore(); |
|
91 |
const appStore = useAppStoreWidthOut(); |
|
92 |
|
|
93 |
let routes: AppRouteRecordRaw[] = []; |
aebad6
|
94 |
const roleList = toRaw(userStore.getRoleList) || []; |
215d8b
|
95 |
const { permissionMode = projectSetting.permissionMode } = appStore.getProjectConfig; |
V |
96 |
// role permissions |
|
97 |
if (permissionMode === PermissionModeEnum.ROLE) { |
|
98 |
const routeFilter = (route: AppRouteRecordRaw) => { |
|
99 |
const { meta } = route; |
|
100 |
const { roles } = meta || {}; |
|
101 |
if (!roles) return true; |
|
102 |
return roleList.some((role) => roles.includes(role)); |
|
103 |
}; |
|
104 |
routes = filter(asyncRoutes, routeFilter); |
|
105 |
routes = routes.filter(routeFilter); |
|
106 |
// Convert multi-level routing to level 2 routing |
|
107 |
routes = flatMultiLevelRoutes(routes); |
|
108 |
// If you are sure that you do not need to do background dynamic permissions, please comment the entire judgment below |
|
109 |
} else if (permissionMode === PermissionModeEnum.BACK) { |
|
110 |
const { createMessage } = useMessage(); |
|
111 |
|
|
112 |
createMessage.loading({ |
|
113 |
content: t('sys.app.menuLoading'), |
|
114 |
duration: 1, |
|
115 |
}); |
|
116 |
|
|
117 |
// !Simulate to obtain permission codes from the background, |
|
118 |
// this function may only need to be executed once, and the actual project can be put at the right time by itself |
6a8820
|
119 |
let routeList: AppRouteRecordRaw[] = []; |
215d8b
|
120 |
try { |
9e5e63
|
121 |
this.changePermissionCode(); |
N |
122 |
routeList = (await getMenuList()) as AppRouteRecordRaw[]; |
6a8820
|
123 |
} catch (error) { |
V |
124 |
console.error(error); |
215d8b
|
125 |
} |
V |
126 |
|
|
127 |
// Dynamically introduce components |
|
128 |
routeList = transformObjToRoute(routeList); |
|
129 |
|
|
130 |
// Background routing to menu structure |
|
131 |
const backMenuList = transformRouteToMenu(routeList); |
|
132 |
this.setBackMenuList(backMenuList); |
|
133 |
|
|
134 |
routeList = flatMultiLevelRoutes(routeList); |
|
135 |
routes = [PAGE_NOT_FOUND_ROUTE, ...routeList]; |
|
136 |
} |
|
137 |
routes.push(ERROR_LOG_ROUTE); |
|
138 |
return routes; |
|
139 |
}, |
|
140 |
}, |
|
141 |
}); |
|
142 |
|
|
143 |
// Need to be used outside the setup |
|
144 |
export function usePermissionStoreWidthOut() { |
|
145 |
return usePermissionStore(store); |
|
146 |
} |