2023-12-28 17:21:33 +08:00
|
|
|
|
import { createRouter, createWebHashHistory } from 'vue-router';
|
2021-06-07 17:22:07 +08:00
|
|
|
|
import NProgress from 'nprogress';
|
|
|
|
|
|
import 'nprogress/nprogress.css';
|
2023-12-28 17:21:33 +08:00
|
|
|
|
import { getToken } from '@/common/utils/storage';
|
2023-07-06 20:59:22 +08:00
|
|
|
|
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';
|
2023-10-19 19:00:23 +08:00
|
|
|
|
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';
|
2021-06-07 17:22:07 +08:00
|
|
|
|
|
|
|
|
|
|
// 添加静态路由
|
|
|
|
|
|
const router = createRouter({
|
|
|
|
|
|
history: createWebHashHistory(),
|
2023-12-28 17:21:33 +08:00
|
|
|
|
routes: [...staticRoutes, ...errorRoutes],
|
2021-06-07 17:22:07 +08:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 前端控制路由:初始化方法,防止刷新时丢失
|
|
|
|
|
|
export function initAllFun() {
|
2023-09-16 17:07:48 +08:00
|
|
|
|
const token = getToken(); // 获取浏览器缓存 token 值
|
2021-06-07 17:22:07 +08:00
|
|
|
|
if (!token) {
|
|
|
|
|
|
// 无 token 停止执行下一步
|
2023-07-06 20:59:22 +08:00
|
|
|
|
return false;
|
2021-06-07 17:22:07 +08:00
|
|
|
|
}
|
2023-03-15 11:41:03 +08:00
|
|
|
|
useUserInfo().setUserInfo({});
|
2021-06-07 17:22:07 +08:00
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-07 17:22:07 +08:00
|
|
|
|
// 删除/重置路由
|
|
|
|
|
|
export function resetRoute() {
|
2023-12-28 17:21:33 +08:00
|
|
|
|
useRoutesList().routesList?.forEach((route: any) => {
|
2021-06-07 17:22:07 +08:00
|
|
|
|
const { name } = route;
|
|
|
|
|
|
router.hasRoute(name) && router.removeRoute(name);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-04-13 20:11:22 +08:00
|
|
|
|
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();
|
2023-04-13 20:11:22 +08:00
|
|
|
|
}
|
2021-06-07 17:22:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 路由加载前
|
2023-04-13 20:11:22 +08:00
|
|
|
|
router.beforeEach(async (to, from, next) => {
|
2021-06-07 17:22:07 +08:00
|
|
|
|
NProgress.configure({ showSpinner: false });
|
2023-12-28 17:21:33 +08:00
|
|
|
|
NProgress.start();
|
2021-06-07 17:22:07 +08:00
|
|
|
|
|
|
|
|
|
|
// 如果有标题参数,则再原标题后加上参数来区别
|
2023-09-26 17:38:52 +08:00
|
|
|
|
if (to.meta.titleRename && to.meta.title) {
|
2023-07-06 20:59:22 +08:00
|
|
|
|
to.meta.title = templateResolve(to.meta.title as string, to.query);
|
2021-06-07 17:22:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-16 17:07:48 +08:00
|
|
|
|
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();
|
2023-10-19 19:00:23 +08:00
|
|
|
|
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消息
|
2023-10-19 19:00:23 +08:00
|
|
|
|
if (to.path != '/machine/terminal') {
|
|
|
|
|
|
syssocket.init();
|
2022-05-17 20:23:08 +08:00
|
|
|
|
}
|
2023-10-19 19:00:23 +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 });
|
2021-06-07 17:22:07 +08:00
|
|
|
|
}
|
2023-12-28 17:21:33 +08:00
|
|
|
|
|
|
|
|
|
|
next();
|
2021-06-07 17:22:07 +08:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 路由加载后
|
|
|
|
|
|
router.afterEach(() => {
|
|
|
|
|
|
NProgress.done();
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2023-12-28 17:21:33 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @description 路由跳转错误
|
|
|
|
|
|
* */
|
|
|
|
|
|
router.onError((error) => {
|
|
|
|
|
|
NProgress.done();
|
|
|
|
|
|
console.warn('路由错误', error.message);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2021-06-07 17:22:07 +08:00
|
|
|
|
// 导出路由
|
|
|
|
|
|
export default router;
|