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