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=', routes.value, '=============', 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 };
|
});
|