2024-03-11 18:37:43 +08:00

87 lines
2.6 KiB
TypeScript

import router from "@/routers/index";
import { isType } from "@/utils/util";
import { LOGIN_URL } from "@/config/config";
import { ElNotification } from "element-plus";
import { GlobalStore } from "@/stores";
import { AuthStore } from "@/stores/modules/auth";
// 引入 views 文件夹下所有 vue 文件
const modules = import.meta.glob("@/views/**/*.vue");
/**
* 初始化动态路由
*/
export const initDynamicRouter = async (params?: any, defaultUrl?: any) => {
const authStore = AuthStore();
const globalStore = GlobalStore();
try {
// 1.获取菜单列表 && 按钮权限(可合并到一个接口获取,根据后端不同可自行改造)
await authStore.getAuthMenuList(params);
await authStore.getAuthButtonList();
// await authStore.getAuthButtonList(params);
// 2.判断当前用户有没有菜单权限
if (!authStore.authMenuListGet.length) {
ElNotification({
title: "无权限访问",
message: "当前账号无任何菜单权限,请联系系统管理员!",
type: "warning",
duration: 3000
});
globalStore.resetStore();
// router.replace(LOGIN_URL);
router.replace("/load");
return Promise.reject("No permission");
}
// 3.添加动态路由
let toNum = 0; // 记录跳转数,只想跳转一次
authStore.flatMenuListGet.forEach((item: any, index: any) => {
item.children && delete item.children;
if (item.component && isType(item.component) == "string") {
item.component = modules["/src/views" + item.component + ".vue"];
}
if (item.meta.isFull) {
router.addRoute(item);
if (globalStore.path && !defaultUrl) {
console.log("big");
router.push(globalStore.path);
globalStore.setPath(null);
} else {
// 其他处理
}
} else {
router.addRoute("layout", item);
if (globalStore.path) {
// console.log("exec");
if (globalStore.path == item.path && !defaultUrl) {
router.push(globalStore.path);
++toNum;
} else {
if (item.path != "/" && toNum < 1 && !defaultUrl) {
router.push(item.path);
++toNum;
}
if (item.path != "/" && toNum < 1 && defaultUrl) {
router.push(defaultUrl);
++toNum;
}
}
// globalStore.setPath(null);
} else {
// 其他处理
globalStore.setPath(null);
}
}
});
} catch (error) {
// 💢 当按钮 || 菜单请求出错时,重定向到登陆页
globalStore.resetStore();
// router.replace(LOGIN_URL);
router.replace("/load");
return Promise.reject(error);
}
};