- import auth from '@/plugins/auth';
- import router, { constantRoutes } from '@/router';
- import { getRouters } from '@/api/menu';
- import Layout from '@/layout/index';
- import ParentView from '@/components/ParentView';
- import InnerLink from '@/layout/components/InnerLink';
- // 匹配views里面所有的.vue文件
- const modules = import.meta.glob('./../../views/**/*.vue');
-
- const usePermissionStore = defineStore('permission', {
- state: () => ({
- routes: [],
- addRoutes: [],
- sidebarRouters: [],
- }),
- actions: {
- setRoutes(routes) {
- this.addRoutes = routes;
- this.routes = constantRoutes.concat(routes);
- },
- setSidebarRouters(routes) {
- this.sidebarRouters = routes;
- },
- generateRoutes(roles) {
- return new Promise(resolve => {
- // 向后端请求路由数据
- getRouters('').then(res => {
- const sdata = JSON.parse(JSON.stringify(res.data));
- const rdata = JSON.parse(JSON.stringify(res.data));
- const sidebarRoutes = filterAsyncRouter(sdata);
- const rewriteRoutes = filterAsyncRouter(rdata, false, true);
- this.setSidebarRouters(constantRoutes.concat(sidebarRoutes));
- resolve(rewriteRoutes);
- console.log('2222222222222', rewriteRoutes);
- // 登录成功之后才默认加载菜单设置
- if (localStorage.getItem('fromDoorXG') == 'chengguanweiScreen') {
- localStorage.setItem('routerPartXG', rewriteRoutes[1].name); //默认加载第一个菜单
- } else {
- router.push({ path: '/chengguanweiScreen' });
- }
- });
- });
- },
- },
- });
-
- // 遍历后台传来的路由字符串,转换为组件对象
- function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
- return asyncRouterMap.filter(route => {
- route.componentfullPath = route.component;
- if (type && route.children) {
- route.children = filterChildren(route.children);
- }
- if (route.component) {
- // Layout ParentView 组件特殊处理
- if (route.component === 'Layout') {
- route.component = Layout;
- } else if (route.component === 'ParentView') {
- route.component = ParentView;
- } else if (route.component === 'InnerLink') {
- route.component = InnerLink;
- } else {
- route.component = loadView(route.component);
- }
- }
- if (route.children != null && route.children && route.children.length) {
- route.children = filterAsyncRouter(route.children, route, type);
- } else {
- delete route['children'];
- delete route['redirect'];
- }
- return true;
- });
- }
-
- function filterChildren(childrenMap, lastRouter = false) {
- var children = [];
- childrenMap.forEach((el, index) => {
- if (el.children && el.children.length) {
- if (el.component === 'ParentView' && !lastRouter) {
- el.children.forEach(c => {
- c.path = el.path + '/' + c.path;
- if (c.children && c.children.length) {
- children = children.concat(filterChildren(c.children, c));
- return;
- }
- children.push(c);
- });
- return;
- }
- }
- if (lastRouter) {
- el.path = lastRouter.path + '/' + el.path;
- }
- children = children.concat(el);
- });
- return children;
- }
-
- // 动态路由遍历,验证是否具备权限
- export function filterDynamicRoutes(routes) {
- const res = [];
- routes.forEach(route => {
- if (route.permissions) {
- if (auth.hasPermiOr(route.permissions)) {
- res.push(route);
- }
- } else if (route.roles) {
- if (auth.hasRoleOr(route.roles)) {
- res.push(route);
- }
- }
- });
- return res;
- }
-
- export const loadView = view => {
- let res;
- for (const path in modules) {
- const dir = path.split('views/')[1].split('.vue')[0];
- if (dir === view) {
- res = () => modules[path]();
- }
- }
- return res;
- };
-
- export default usePermissionStore;