134 lines
3.3 KiB
JavaScript
134 lines
3.3 KiB
JavaScript
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()
|
||
},
|
||
},
|
||
})
|