From fa3ac93010bea3805438ee3ab0a182bfbf7423da Mon Sep 17 00:00:00 2001 From: baoshiwei <baoshiwei@shlanbao.cn> Date: 星期一, 27 五月 2024 16:19:31 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/store/modules/permission.ts | 304 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 304 insertions(+), 0 deletions(-) diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts new file mode 100644 index 0000000..c09c301 --- /dev/null +++ b/src/store/modules/permission.ts @@ -0,0 +1,304 @@ +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 { + // 鑿滃崟鏉冮檺缂栫爜锛屼緥濡傦細鈥渟ys: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 鏍规嵁璁剧疆鐨勯椤祊ath锛屼慨姝outes涓殑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, + // }); + + // 浠庡悗鍙拌幏鍙栨潈闄愮爜锛� + // 杩欎釜鍑芥暟鍙兘鍙渶瑕佹墽琛屼竴娆★紝骞朵笖瀹為檯鐨勯」鐩彲浠ュ湪姝g‘鐨勬椂闂磋鏀剧疆 + 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) +} -- Gitblit v1.9.3