Files
mayfly-go/mayfly_go_web/src/router/index.ts

128 lines
3.8 KiB
TypeScript
Raw Normal View History

2023-12-28 17:21:33 +08:00
import { createRouter, createWebHashHistory } from 'vue-router';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
2023-12-28 17:21:33 +08:00
import { getToken } from '@/common/utils/storage';
import { templateResolve } from '@/common/utils/string';
2023-03-15 11:41:03 +08:00
import { NextLoading } from '@/common/utils/loading';
2023-12-28 17:21:33 +08:00
import { staticRoutes, URL_LOGIN, URL_401, ROUTER_WHITE_LIST, errorRoutes } from './staticRouter';
import syssocket from '@/common/syssocket';
2023-03-15 11:41:03 +08:00
import pinia from '@/store/index';
import { useThemeConfig } from '@/store/themeConfig';
import { useUserInfo } from '@/store/userInfo';
import { useRoutesList } from '@/store/routesList';
2023-12-28 17:21:33 +08:00
import { initBackendRoutes } from './dynamicRouter';
// 添加静态路由
const router = createRouter({
history: createWebHashHistory(),
2023-12-28 17:21:33 +08:00
routes: [...staticRoutes, ...errorRoutes],
});
// 前端控制路由:初始化方法,防止刷新时丢失
export function initAllFun() {
const token = getToken(); // 获取浏览器缓存 token 值
if (!token) {
// 无 token 停止执行下一步
return false;
}
2023-03-15 11:41:03 +08:00
useUserInfo().setUserInfo({});
resetRoute(); // 删除/重置路由
2023-12-28 17:21:33 +08:00
// router.addRoute(dynamicRoutes[0]);
// // 过滤权限菜单
// useRoutesList().setRoutesList(dynamicRoutes[0].children);
2023-03-15 11:41:03 +08:00
}
// 删除/重置路由
export function resetRoute() {
2023-12-28 17:21:33 +08:00
useRoutesList().routesList?.forEach((route: any) => {
const { name } = route;
router.hasRoute(name) && router.removeRoute(name);
});
}
export async function initRouter() {
2023-09-23 22:52:05 +08:00
NextLoading.start(); // 界面 loading 动画开始执行
try {
// 初始化方法执行
const { isRequestRoutes } = useThemeConfig(pinia).themeConfig;
if (!isRequestRoutes) {
// 未开启后端控制路由
initAllFun();
} else if (isRequestRoutes) {
// 后端控制路由isRequestRoutes 为 true则开启后端控制路由
2023-12-28 17:21:33 +08:00
await initBackendRoutes();
2023-09-23 22:52:05 +08:00
}
} finally {
NextLoading.done();
}
}
// 路由加载前
router.beforeEach(async (to, from, next) => {
NProgress.configure({ showSpinner: false });
2023-12-28 17:21:33 +08:00
NProgress.start();
// 如果有标题参数,则再原标题后加上参数来区别
2023-09-26 17:38:52 +08:00
if (to.meta.titleRename && to.meta.title) {
to.meta.title = templateResolve(to.meta.title as string, to.query);
}
const token = getToken();
2022-05-17 20:23:08 +08:00
2023-12-28 17:21:33 +08:00
const toPath = to.path;
// 判断是访问登陆页有token就在当前页面没有token重置路由与用户信息到登陆页
if (toPath === URL_LOGIN) {
if (token) {
return next(from.fullPath);
}
resetRoute();
syssocket.destory();
2023-12-28 17:21:33 +08:00
return next();
2022-05-17 20:23:08 +08:00
}
2023-12-28 17:21:33 +08:00
// 判断访问页面是否在路由白名单地址(静态路由)中,如果存在直接放行
if (ROUTER_WHITE_LIST.includes(toPath)) {
return next();
}
// 判断是否有token没有重定向到 login 页面
if (!token) {
return next(`${URL_LOGIN}?redirect=${toPath}`);
2022-05-17 20:23:08 +08:00
}
// 终端不需要连接系统websocket消息
if (to.path != '/machine/terminal') {
syssocket.init();
2022-05-17 20:23:08 +08:00
}
2023-12-28 17:21:33 +08:00
// 不存在路由(避免刷新页面找不到路由),则重新初始化路由
if (useRoutesList().routesList?.length == 0) {
try {
// 可能token过期无法获取菜单权限信息等
await initRouter();
} catch (e) {
return next(`${URL_401}?redirect=${toPath}`);
}
return next({ path: toPath, query: to.query });
}
2023-12-28 17:21:33 +08:00
next();
});
// 路由加载后
router.afterEach(() => {
NProgress.done();
});
2023-12-28 17:21:33 +08:00
/**
* @description
* */
router.onError((error) => {
NProgress.done();
console.warn('路由错误', error.message);
});
// 导出路由
export default router;