import { defineStore } from 'pinia' import { basicRoutes } from '@/router/routes' import { RouterView } from 'vue-router' const Layout = () => import('@/layout/index.vue') // 匹配views里面所有的.vue文件,动态引入 const modules = import.meta.glob('/src/views/**/*.vue') // export function getModulesKey() { return Object.keys(modules).map((item) => item.replace('/src/views/', '').replace('.vue', '')) } // 动态加载组件 export function loadRouteView(component) { try { const key = Object.keys(modules).find((key) => { return key.includes(`${component}.vue`) }) if (key) { return modules[key] } throw Error(`找不到组件${component},请确保组件路径正确`) } catch (error) { console.error(error) return RouterView } } // function hasPermission(route, role) { // // * 不需要权限直接返回true // if (!route.meta?.requireAuth) return true // const routeRole = route.meta?.role ? route.meta.role : [] // // * 登录用户没有角色或者路由没有设置角色判定为没有权限 // if (!role.length || !routeRole.length) return false // // * 路由指定的角色包含任一登录用户角色则判定有权限 // return role.some((item) => routeRole.includes(item)) // } // 过滤异步路由 function filterAsyncRoutes(routes = [], firstRoute = true) { const ret = [] routes.forEach((route) => { // 过滤掉type为3的路由 if (route.type === 3) return const isHidden = route.is_show === 1 ? false : true const meta = { requireAuth: true, title: route.name, icon: route.icon, order: route.sort, } const curRoute = { path: route.route, name: route.name, isHidden, meta, children: [], } if (route.route === '/' && firstRoute) { curRoute['redirect'] = route.subMenu[0].route } else if (route.subMenu && route.type === 1) { curRoute['redirect'] = `${route.subMenu[0].route}` } if (route.subMenu && route.subMenu.length) { curRoute.children = filterAsyncRoutes(route.subMenu, false) } else { Reflect.deleteProperty(curRoute, 'children') } switch (route.type) { case 1: curRoute.component = firstRoute ? Layout : RouterView break case 2: curRoute.component = loadRouteView(route.components) break } ret.push(curRoute) }) return ret } // 递归寻找type为3的路由 function findType3Routes(routes = []) { const ret = [] routes.forEach((route) => { if (route.type === 3) { ret.push(route.api_route) } if (route.subMenu && route.subMenu.length) { ret.push(...findType3Routes(route.subMenu)) } }) return ret } export const usePermissionStore = defineStore('permission', { state() { return { accessRoutes: [], } }, getters: { routes() { return basicRoutes.concat(this.accessRoutes) }, menus() { return this.routes.filter((route) => route.name && !route.isHidden) }, }, actions: { generateRoutes() { const menus = JSON.parse(localStorage.getItem('menu')) const accessRoutes = filterAsyncRoutes(menus) window.localStorage.setItem('roles', JSON.stringify(findType3Routes(menus))) this.accessRoutes = accessRoutes return accessRoutes }, resetPermission() { this.$reset() }, }, })