107 lines
4.3 KiB
TypeScript
Raw Normal View History

2024-04-13 15:54:07 +08:00
import NProgress from "@/config/nprogress";
import pinia from "@/store/index";
2024-03-31 15:51:00 +08:00
import { createRouter, createWebHashHistory } from "vue-router";
2024-04-12 00:31:21 +08:00
import { staticRoutes, notFoundAndNoPower } from "@/router/route.ts";
2024-04-18 13:01:43 +08:00
import { initSetRouter, currentlyRoute } from "@/router/route-output";
2024-04-11 13:07:43 +08:00
import { storeToRefs } from "pinia";
import { useUserInfoStore } from "@/store/modules/user-info";
import { useRoutesListStore } from "@/store/modules/route-list";
import { useRoutingMethod } from "@/hooks/useRoutingMethod";
2024-07-14 19:29:43 +08:00
// import { useRoute } from "vue-router";
// const route = useRoute();
2024-03-31 15:51:00 +08:00
/**
* vue的路由示例
* @method createRouter(options: RouterOptions): Router
* @link https://next.router.vuejs.org/zh/api/#createrouter
*/
2024-04-12 00:31:21 +08:00
const router = createRouter({
2024-03-31 15:51:00 +08:00
history: createWebHashHistory(),
/**
2024-04-13 15:54:07 +08:00
* addRoute动态添加
* 1staticRoutes登录页
* 2notFoundAndNoPower 404401 No match found for location with path 'xxx'
2024-03-31 15:51:00 +08:00
* 2 notFoundAndNoPower 404401
2024-04-13 15:54:07 +08:00
* notFoundAndNoPower 404401
* notFoundAndNoPower layout容器展示
2024-03-31 15:51:00 +08:00
*/
2024-04-13 15:54:07 +08:00
routes: [...staticRoutes, ...notFoundAndNoPower]
2024-03-31 15:51:00 +08:00
});
2024-04-13 15:54:07 +08:00
/**
*
2024-07-25 18:46:47 +08:00
* 1500
* 2token
* 3token
* 4tokenhome页
* 5token
2024-04-13 15:54:07 +08:00
*
* routeTree不能持久化缓存
* addRoute动态添加的路由失效
*/
2024-03-31 15:51:00 +08:00
router.beforeEach(async (to, from, next) => {
NProgress.start(); // 开启进度条
2024-04-11 13:07:43 +08:00
const store = useUserInfoStore(pinia);
const { token } = storeToRefs(store);
2024-04-21 00:26:49 +08:00
console.log("去", to, "来自", from);
2024-07-14 19:29:43 +08:00
// next()内部加了path等于跳转指定路由会再次触发router.beforeEach内部无参数等于放行不会触发router.beforeEach
// 浏览器离线,条件:网络离线、跳转路径非 /500
// 这里拦截的是在无网络情况下的正常跳转跳转500
if (!navigator.onLine && to.path !== "/500") {
next("/500"); // 跳转500
} else if (to.path === "/login" && !token.value) {
2024-04-20 16:54:12 +08:00
// 1、去登录页无token放行
2024-04-08 20:25:28 +08:00
next();
2024-04-11 13:07:43 +08:00
} else if (!token.value) {
2024-04-20 16:54:12 +08:00
// 2、没有token直接重定向到登录页
2024-04-08 20:25:28 +08:00
next("/login");
2024-04-11 13:07:43 +08:00
} else if (to.path === "/login" && token.value) {
2024-04-20 16:54:12 +08:00
// 3、去登录页有token直接重定向到home页
2024-04-08 20:25:28 +08:00
next("/home");
2024-04-20 16:54:12 +08:00
// 项目内的跳转,处理跳转路由高亮
currentlyRoute(to.name as string);
2024-04-08 20:25:28 +08:00
} else {
2024-07-14 19:29:43 +08:00
// 无网络跳转500放行
if (!navigator.onLine && to.path == "/500") {
return next();
}
2024-04-20 16:54:12 +08:00
// 4、去非登录页有token校验是否动态添加过路由添加过则放行未添加则执行路由初始化
2024-04-13 15:54:07 +08:00
const routeStore = useRoutesListStore(pinia);
const { routeTree } = storeToRefs(routeStore);
// 获取外链路由的处理函数
// 所有的路由正常放行,只不过额外判断是否是外链,如果是,则打开新窗口跳转外链
// 外链的页面依旧正常打开只不过不会参与缓存与tabs显示符合路由跳转的直觉
const { openExternalLinks } = useRoutingMethod();
2024-04-13 15:54:07 +08:00
// 如果缓存的路由是0则说明未动态添加路由先添加再跳转
// 解决刷新页面404的问题
if (routeTree.value.length == 0) {
await initSetRouter();
// 处理外链跳转
openExternalLinks(to);
2024-04-20 16:54:12 +08:00
// 处理完重新跳转
2024-04-13 15:54:07 +08:00
next({ path: to.path, query: to.query });
} else {
// 处理外链跳转
openExternalLinks(to);
2024-04-13 15:54:07 +08:00
// 动态路由添加过走这里,直接放行
next();
2024-04-20 16:54:12 +08:00
// 项目内的跳转,处理跳转路由高亮
currentlyRoute(to.name as string);
2024-04-13 15:54:07 +08:00
}
2024-04-08 20:25:28 +08:00
}
2024-03-31 15:51:00 +08:00
});
// 路由跳转错误
router.onError(error => {
NProgress.done();
console.warn("路由错误", error.message);
});
// 路由加载后
router.afterEach(() => {
NProgress.done();
});
export default router;