import { defineStore } from 'pinia' import { asyncRoutes, basicRoutes } from '@/router/routes' 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 = [], role) { const ret = [] routes.forEach((route) => { if (hasPermission(route, role)) { const curRoute = { ...route, children: [], } if (route.children && route.children.length) { curRoute.children = filterAsyncRoutes(route.children, role) } else { Reflect.deleteProperty(curRoute, 'children') } ret.push(curRoute) } }) 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(role = []) { const accessRoutes = filterAsyncRoutes(asyncRoutes, role) this.accessRoutes = accessRoutes return accessRoutes }, resetPermission() { this.$reset() }, }, })