import { defineStore } from 'pinia'; import { asyncRoutes, constantRoutes } from '@/router'; import { ref } from 'vue'; /** * Use meta.role to determine if the current user has permission * @param roles * @param route */ function hasPermission(roles, route) { console.trace('hasPermission'); console.log('hasPermission', roles, route, '============='); if (route.meta && route.meta.roles) { const rolesArr = route.meta.roles; return roles.some(role => rolesArr.includes(role)); } else { return true; } } /** * Filter asynchronous routing tables by recursion * @param routes asyncRoutes * @param roles */ export function filterAsyncRoutes(routes, roles) { const res = []; routes.forEach(route => { const tmp = { ...route }; if (hasPermission(roles, tmp)) { if (tmp.children) { tmp.children = filterAsyncRoutes(tmp.children, roles); } res.push(tmp); } }); return res; } export const usePermissionStore = defineStore('permission', () => { const routes = ref([]); const addRoutes = ref([]); function setRoutes(val) { addRoutes.value = val; routes.value = constantRoutes.concat(val); console.log('this.routes=', this.routes, '=============', constantRoutes); } function generateRoutes(roles) { let accessedRoutes; if (roles.includes('admin')) { console.log('1', '============='); accessedRoutes = asyncRoutes || []; } else { console.log('2', '============='); accessedRoutes = filterAsyncRoutes(asyncRoutes, roles); } setRoutes(accessedRoutes); console.log('accessedRoutes=', accessedRoutes, '============='); return accessedRoutes; } return { routes, addRoutes, setRoutes, generateRoutes }; });