¶Ô±ÈÐÂÎļþ |
| | |
| | | import type { AppRouteRecordRaw, Menu } from '/@/router/types' |
| | | |
| | | import { defineStore } from 'pinia' |
| | | import { toRaw } from 'vue' |
| | | import { useAppStoreWithOut } from './app' |
| | | import { useUserStore } from './user' |
| | | import { useI18n } from '/@/hooks/web/useI18n' |
| | | import { transformRouteToMenu } from '/@/router/helper/menuHelper' |
| | | import { addSlashToRouteComponent, flatMultiLevelRoutes, transformObjToRoute } from '/@/router/helper/routeHelper' |
| | | import { store } from '/@/store' |
| | | |
| | | import projectSetting from '/@/settings/projectSetting' |
| | | |
| | | import { PermissionModeEnum } from '/@/enums/appEnum' |
| | | |
| | | import { asyncRoutes } from '/@/router/routes' |
| | | import { ERROR_LOG_ROUTE, PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic' |
| | | |
| | | import { filter } from '/@/utils/helper/treeHelper' |
| | | |
| | | import { getMenuList, switchVue3Menu } from '/@/api/sys/menu' |
| | | import { getPermCode } from '/@/api/sys/user' |
| | | |
| | | import { PageEnum } from '/@/enums/pageEnum' |
| | | import { useMessage } from '/@/hooks/web/useMessage' |
| | | |
| | | // ç³»ç»æé |
| | | interface AuthItem { |
| | | // èåæéç¼ç ï¼ä¾å¦ï¼âsys:schedule:list,sys:schedule:infoâ,å¤ä¸ªéå·éå¼ |
| | | action: string |
| | | // æéçç¥1æ¾ç¤º2ç¦ç¨ |
| | | type: string | number |
| | | // æéç¶æ(0æ æ1ææ) |
| | | status: string | number |
| | | // æéåç§° |
| | | describe?: string |
| | | isAuth?: boolean |
| | | } |
| | | |
| | | interface PermissionState { |
| | | // Permission code list |
| | | permCodeList: string[] | number[] |
| | | // Whether the route has been dynamically added |
| | | isDynamicAddedRoute: boolean |
| | | // To trigger a menu update |
| | | lastBuildMenuTime: number |
| | | // Backstage menu list |
| | | backMenuList: Menu[] |
| | | frontMenuList: Menu[] |
| | | // ç¨æ·ææ¥æçæé |
| | | authList: AuthItem[] |
| | | // å
¨é¨æéé
ç½® |
| | | allAuthList: AuthItem[] |
| | | // ç³»ç»å®å
¨æ¨¡å¼ |
| | | sysSafeMode: boolean |
| | | // onlineå表æé®æé |
| | | onlineSubTableAuthMap: object |
| | | } |
| | | export const usePermissionStore = defineStore({ |
| | | id: 'app-permission', |
| | | state: (): PermissionState => ({ |
| | | permCodeList: [], |
| | | // Whether the route has been dynamically added |
| | | isDynamicAddedRoute: false, |
| | | // To trigger a menu update |
| | | lastBuildMenuTime: 0, |
| | | // Backstage menu list |
| | | backMenuList: [], |
| | | // menu List |
| | | frontMenuList: [], |
| | | authList: [], |
| | | allAuthList: [], |
| | | sysSafeMode: false, |
| | | onlineSubTableAuthMap: {}, |
| | | }), |
| | | getters: { |
| | | getPermCodeList(): string[] | number[] { |
| | | return this.permCodeList |
| | | }, |
| | | getBackMenuList(): Menu[] { |
| | | return this.backMenuList |
| | | }, |
| | | getFrontMenuList(): Menu[] { |
| | | return this.frontMenuList |
| | | }, |
| | | getLastBuildMenuTime(): number { |
| | | return this.lastBuildMenuTime |
| | | }, |
| | | getIsDynamicAddedRoute(): boolean { |
| | | return this.isDynamicAddedRoute |
| | | }, |
| | | |
| | | //update-begin-author:taoyan date:2022-6-1 for: VUEN-1162 å表æé®æ²¡æ§å¶ |
| | | getOnlineSubTableAuth: (state) => { |
| | | return (code) => state.onlineSubTableAuthMap[code] |
| | | }, |
| | | //update-end-author:taoyan date:2022-6-1 for: VUEN-1162 å表æé®æ²¡æ§å¶ |
| | | }, |
| | | actions: { |
| | | setPermCodeList(codeList: string[]) { |
| | | this.permCodeList = codeList |
| | | }, |
| | | |
| | | setBackMenuList(list: Menu[]) { |
| | | this.backMenuList = list |
| | | list?.length > 0 && this.setLastBuildMenuTime() |
| | | }, |
| | | |
| | | setFrontMenuList(list: Menu[]) { |
| | | this.frontMenuList = list |
| | | }, |
| | | |
| | | setLastBuildMenuTime() { |
| | | this.lastBuildMenuTime = new Date().getTime() |
| | | }, |
| | | |
| | | setDynamicAddedRoute(added: boolean) { |
| | | this.isDynamicAddedRoute = added |
| | | }, |
| | | resetState(): void { |
| | | this.isDynamicAddedRoute = false |
| | | this.permCodeList = [] |
| | | this.backMenuList = [] |
| | | this.lastBuildMenuTime = 0 |
| | | }, |
| | | async changePermissionCode() { |
| | | const systemPermission = await getPermCode() |
| | | const codeList = systemPermission.codeList |
| | | this.setPermCodeList(codeList) |
| | | this.setAuthData(systemPermission) |
| | | }, |
| | | async buildRoutesAction(): Promise<AppRouteRecordRaw[]> { |
| | | const { t } = useI18n() |
| | | const userStore = useUserStore() |
| | | const appStore = useAppStoreWithOut() |
| | | |
| | | let routes: AppRouteRecordRaw[] = [] |
| | | const roleList = toRaw(userStore.getRoleList) || [] |
| | | const { permissionMode = projectSetting.permissionMode } = appStore.getProjectConfig |
| | | |
| | | const routeFilter = (route: AppRouteRecordRaw) => { |
| | | const { meta } = route |
| | | const { roles } = meta || {} |
| | | if (!roles) return true |
| | | return roleList.some((role) => roles.includes(role)) |
| | | } |
| | | |
| | | const routeRemoveIgnoreFilter = (route: AppRouteRecordRaw) => { |
| | | const { meta } = route |
| | | const { ignoreRoute } = meta || {} |
| | | return !ignoreRoute |
| | | } |
| | | |
| | | /** |
| | | * @description æ ¹æ®è®¾ç½®çé¦é¡µpathï¼ä¿®æ£routesä¸çaffixæ è®°ï¼åºå®é¦é¡µï¼ |
| | | * */ |
| | | const patchHomeAffix = (routes: AppRouteRecordRaw[]) => { |
| | | if (!routes || routes.length === 0) return |
| | | let homePath: string = userStore.getUserInfo.homePath || PageEnum.BASE_HOME |
| | | function patcher(routes: AppRouteRecordRaw[], parentPath = '') { |
| | | if (parentPath) parentPath = parentPath + '/' |
| | | routes.forEach((route: AppRouteRecordRaw) => { |
| | | const { path, children, redirect } = route |
| | | const currentPath = path.startsWith('/') ? path : parentPath + path |
| | | if (currentPath === homePath) { |
| | | if (redirect) { |
| | | homePath = route.redirect! as string |
| | | } else { |
| | | route.meta = Object.assign({}, route.meta, { affix: true }) |
| | | throw new Error('end') |
| | | } |
| | | } |
| | | children && children.length > 0 && patcher(children, currentPath) |
| | | }) |
| | | } |
| | | try { |
| | | patcher(routes) |
| | | } catch (e) { |
| | | // å·²å¤ç宿¯è·³åºå¾ªç¯ |
| | | } |
| | | return |
| | | } |
| | | |
| | | switch (permissionMode) { |
| | | case PermissionModeEnum.ROLE: |
| | | routes = filter(asyncRoutes, routeFilter) |
| | | routes = routes.filter(routeFilter) |
| | | // å°å¤çº§è·¯ç±è½¬æ¢ä¸ºäºçº§ |
| | | routes = flatMultiLevelRoutes(routes) |
| | | break |
| | | |
| | | case PermissionModeEnum.ROUTE_MAPPING: |
| | | routes = filter(asyncRoutes, routeFilter) |
| | | routes = routes.filter(routeFilter) |
| | | const menuList = transformRouteToMenu(routes, true) |
| | | routes = filter(routes, routeRemoveIgnoreFilter) |
| | | routes = routes.filter(routeRemoveIgnoreFilter) |
| | | menuList.sort((a, b) => { |
| | | return (a.meta?.orderNo || 0) - (b.meta?.orderNo || 0) |
| | | }) |
| | | |
| | | this.setFrontMenuList(menuList) |
| | | // å°å¤çº§è·¯ç±è½¬æ¢ä¸ºäºçº§ |
| | | routes = flatMultiLevelRoutes(routes) |
| | | break |
| | | |
| | | // åå°èåæå»º |
| | | case PermissionModeEnum.BACK: |
| | | const { createMessage, createWarningModal } = useMessage() |
| | | // èåå è½½æç¤º |
| | | // createMessage.loading({ |
| | | // content: t('sys.app.menuLoading'), |
| | | // duration: 1, |
| | | // }); |
| | | |
| | | // ä»åå°è·åæéç ï¼ |
| | | // è¿ä¸ªå½æ°å¯è½åªéè¦æ§è¡ä¸æ¬¡ï¼å¹¶ä¸å®é
ç项ç®å¯ä»¥å¨æ£ç¡®çæ¶é´è¢«æ¾ç½® |
| | | let routeList: AppRouteRecordRaw[] = [] |
| | | try { |
| | | this.changePermissionCode() |
| | | routeList = (await getMenuList()) as AppRouteRecordRaw[] |
| | | // update-begin----author:sunjianlei---date:20220315------for: 夿æ¯å¦æ¯ vue3 çæ¬çèå --- |
| | | let hasIndex = false |
| | | let hasIcon = false |
| | | for (const menuItem of routeList) { |
| | | // æ¡ä»¶1ï¼å¤æç»ä»¶æ¯å¦æ¯ layouts/default/index |
| | | if (!hasIndex) { |
| | | hasIndex = menuItem.component === 'layouts/default/index' |
| | | } |
| | | // æ¡ä»¶2ï¼å¤æå¾æ æ¯å¦å¸¦æ åå· |
| | | if (!hasIcon) { |
| | | hasIcon = !!menuItem.meta?.icon?.includes(':') |
| | | } |
| | | // 满足任ä½ä¸ä¸ªæ¡ä»¶é½ç´æ¥è·³åºå¾ªç¯ |
| | | if (hasIcon || hasIndex) { |
| | | break |
| | | } |
| | | } |
| | | // 两个æ¡ä»¶é½ä¸æ»¡è¶³ï¼å°±å¼¹åºæç¤ºæ¡ |
| | | if (!hasIcon && !hasIndex) { |
| | | // å»¶è¿1.5ç§ä¹åååºç°æç¤ºï¼å¦åæç¤ºæ¡åºä¸æ¥ |
| | | setTimeout( |
| | | () => |
| | | createWarningModal({ |
| | | title: 'æ£æµæç¤º', |
| | | content: 'å½åèåè¡¨æ¯ <b>Vue2çæ¬</b>ï¼å¯¼è´èåå è½½å¼å¸¸!<br>ç¹å»ç¡®è®¤ï¼åæ¢å°Vue3çèåï¼', |
| | | onOk: function () { |
| | | switchVue3Menu() |
| | | location.reload() |
| | | }, |
| | | }), |
| | | 100 |
| | | ) |
| | | } |
| | | // update-end----author:sunjianlei---date:20220315------for: 夿æ¯å¦æ¯ vue3 çæ¬çèå --- |
| | | } catch (error) { |
| | | console.error(error) |
| | | } |
| | | // ç»ä»¶å°ååå ææ å¤ç author: lsq date:2021-09-08 |
| | | routeList = addSlashToRouteComponent(routeList) |
| | | // 卿å¼å
¥ç»ä»¶ |
| | | routeList = transformObjToRoute(routeList) |
| | | |
| | | // æå»ºåå°è·¯ç±èå |
| | | const backMenuList = transformRouteToMenu(routeList) |
| | | this.setBackMenuList(backMenuList) |
| | | |
| | | // å é¤meta.ignoreRoute项 |
| | | routeList = filter(routeList, routeRemoveIgnoreFilter) |
| | | routeList = routeList.filter(routeRemoveIgnoreFilter) |
| | | |
| | | routeList = flatMultiLevelRoutes(routeList) |
| | | routes = [PAGE_NOT_FOUND_ROUTE, ...routeList] |
| | | break |
| | | } |
| | | |
| | | routes.push(ERROR_LOG_ROUTE) |
| | | patchHomeAffix(routes) |
| | | return routes |
| | | }, |
| | | setAuthData(systemPermission) { |
| | | this.authList = systemPermission.auth |
| | | this.allAuthList = systemPermission.allAuth |
| | | this.sysSafeMode = systemPermission.sysSafeMode |
| | | }, |
| | | setAuthList(authList: AuthItem[]) { |
| | | this.authList = authList |
| | | }, |
| | | setAllAuthList(authList: AuthItem[]) { |
| | | this.allAuthList = authList |
| | | }, |
| | | |
| | | //update-begin-author:taoyan date:2022-6-1 for: VUEN-1162 å表æé®æ²¡æ§å¶ |
| | | setOnlineSubTableAuth(code, hideBtnList) { |
| | | this.onlineSubTableAuthMap[code] = hideBtnList |
| | | }, |
| | | //update-end-author:taoyan date:2022-6-1 for: VUEN-1162 å表æé®æ²¡æ§å¶ |
| | | }, |
| | | }) |
| | | |
| | | // éè¦å¨è®¾ç½®ä¹å¤ä½¿ç¨ |
| | | export function usePermissionStoreWithOut() { |
| | | return usePermissionStore(store) |
| | | } |