干燥机配套车间生产管理系统/云平台服务端
baoshiwei
2024-05-27 fa3ac93010bea3805438ee3ab0a182bfbf7423da
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 {
   // èœå•权限编码,例如:“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)
}