2025-01-23 01:10:59 +00:00

112 lines
2.5 KiB
JavaScript

/**
* @Description: 路由方法
* @Author: zenghua.wang
* @Date: 2022-01-26 21:55:58
* @LastEditors: zenghua.wang
* @LastEditTime: 2024-04-13 21:51:35
*/
import path from 'path-browserify';
import Layout from '@/layouts/index.vue';
import Views from '@/layouts/Views.vue';
import { isEmpty } from './index';
const modules = import.meta.glob('../views/**/**.vue');
/**
* 创建路由菜单
* @param {*} menus
*/
export function createAsyncRoutes(menus = [], isLayout = true) {
if (isEmpty(menus)) return menus;
const res = [];
menus.forEach((menu) => {
const tmp = {
id: menu.id,
parentId: menu.parentId,
path: menu.path,
component: isEmpty(menu.component)
? isLayout
? Layout
: Views
: modules[/* @vite-ignore */ `../views/${menu.component.replace('/views/', '')}`],
redirect: menu.redirect,
name: menu.name,
meta: {
title: menu.title,
icon: menu?.icon || 'icon-demo',
keepAlive: menu.keepAlive,
},
children: menu.children,
};
if (tmp.children) {
tmp.children = createAsyncRoutes(tmp.children, false);
}
res.push(tmp);
});
return res;
}
/**
* 通过递归过滤异步路由表
* @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;
}
/**
* 使用 meta.role 来确定当前用户是否具有权限
* @param roles
* @param route
*/
export function hasPermission(roles, route) {
if (route.meta && route.meta.roles) {
return roles.some((role) => route.meta.roles.includes(role));
} else {
return false;
}
}
/**
* 使用递归,过滤需要缓存的路由
* @param {*} routers
* @returns
*/
export function filterKeepAlive(routers) {
const cacheRouter = [];
const loop = (routers) => {
routers.forEach((item) => {
if (item.meta?.keepAlive && item.name) {
cacheRouter.push(item.name);
}
if (item.children && item.children.length) {
loop(item.children);
}
});
};
loop(routers);
return cacheRouter;
}
/**
*
* @param {*} routers
* @param {*} pathUrl
*/
export function handleRoutes(routers, pathUrl = '') {
routers.forEach((item) => {
item.path = path.resolve(pathUrl, item.path);
});
}