Files
wireguard-dashboard-admin/src/router/index.ts

174 lines
5.6 KiB
TypeScript
Raw Normal View History

2021-12-14 10:51:07 +08:00
import { toRouteType } from "./types";
2021-10-16 16:16:58 +08:00
import { openLink } from "/@/utils/link";
import NProgress from "/@/utils/progress";
2021-12-14 10:51:07 +08:00
import { constantRoutes } from "./modules";
2021-12-06 17:11:15 +08:00
import { transformI18n } from "/@/plugins/i18n";
2021-12-14 10:51:07 +08:00
import remainingRouter from "./modules/remaining";
import { split, find, findIndex } from "lodash-es";
2021-10-16 16:16:58 +08:00
import { storageSession, storageLocal } from "/@/utils/storage";
2021-11-28 16:39:26 +08:00
import { useMultiTagsStoreHook } from "/@/store/modules/multiTags";
2021-12-14 10:51:07 +08:00
import { usePermissionStoreHook } from "/@/store/modules/permission";
import { Router, RouteMeta, createRouter, RouteRecordName } from "vue-router";
import {
initRouter,
getHistoryMode,
getParentPaths,
findRouteByPath,
handleAliveRoute
} from "./utils";
2021-10-16 16:16:58 +08:00
// 创建路由实例
export const router: Router = createRouter({
2021-12-14 10:51:07 +08:00
history: getHistoryMode(),
routes: constantRoutes.concat(...remainingRouter),
strict: true,
2021-10-16 16:16:58 +08:00
scrollBehavior(to, from, savedPosition) {
return new Promise(resolve => {
if (savedPosition) {
return savedPosition;
} else {
if (from.meta.saveSrollTop) {
const top: number =
document.documentElement.scrollTop || document.body.scrollTop;
resolve({ left: 0, top });
}
}
});
}
});
// 路由白名单
const whiteList = ["/login"];
2021-10-16 16:16:58 +08:00
2021-12-14 10:51:07 +08:00
router.beforeEach((to: toRouteType, _from, next) => {
2021-10-16 16:16:58 +08:00
if (to.meta?.keepAlive) {
const newMatched = to.matched;
handleAliveRoute(newMatched, "add");
// 页面整体刷新和点击标签页刷新
if (_from.name === undefined || _from.name === "redirect") {
handleAliveRoute(newMatched);
}
}
const name = storageSession.getItem("info");
NProgress.start();
const externalLink = to?.redirectedFrom?.fullPath;
2021-11-16 22:17:57 +08:00
if (!externalLink)
to.matched.some(item => {
item.meta.title
? (document.title = transformI18n(
item.meta.title as string,
item.meta?.i18n as boolean
))
: "";
});
2021-10-16 16:16:58 +08:00
if (name) {
if (_from?.name) {
// 如果路由包含http 则是超链接 反之是普通路由
if (externalLink && externalLink.includes("http")) {
openLink(`http${split(externalLink, "http")[1]}`);
NProgress.done();
} else {
next();
}
} else {
// 刷新
2021-12-14 10:51:07 +08:00
if (usePermissionStoreHook().wholeMenus.length === 0)
2021-10-16 16:16:58 +08:00
initRouter(name.username).then((router: Router) => {
2021-11-28 16:39:26 +08:00
if (!useMultiTagsStoreHook().getMultiTagsCache) {
2021-12-06 17:11:15 +08:00
const handTag = (
path: string,
parentPath: string,
name: RouteRecordName,
meta: RouteMeta
): void => {
useMultiTagsStoreHook().handleTags("push", {
path,
parentPath,
name,
meta
});
};
2021-12-14 10:51:07 +08:00
// 未开启标签页缓存,刷新页面重定向到顶级路由(参考标签页操作例子,只针对静态路由)
2021-12-06 17:11:15 +08:00
if (to.meta?.realPath) {
2021-12-14 10:51:07 +08:00
const routes = router.options.routes;
const { refreshRedirect } = to.meta;
const { name, meta } = findRouteByPath(refreshRedirect, routes);
handTag(
refreshRedirect,
getParentPaths(refreshRedirect, routes)[1],
name,
meta
);
return router.push(refreshRedirect);
2021-12-06 17:11:15 +08:00
} else {
2021-12-08 11:22:03 +08:00
const { path } = to;
2021-12-14 10:51:07 +08:00
const index = findIndex(remainingRouter, v => {
return v.path == path;
});
const routes =
index === -1
? router.options.routes[0].children
: router.options.routes;
2021-12-08 11:22:03 +08:00
const route = findRouteByPath(path, routes);
const routePartent = getParentPaths(path, routes);
2021-12-14 10:51:07 +08:00
// 未开启标签页缓存,刷新页面重定向到顶级路由(参考标签页操作例子,只针对动态路由)
if (routePartent.length === 0) {
const { name, meta } = findRouteByPath(
route?.meta?.refreshRedirect,
routes
);
handTag(
route.meta?.refreshRedirect,
getParentPaths(route.meta?.refreshRedirect, routes)[0],
name,
meta
);
return router.push(route.meta?.refreshRedirect);
} else {
handTag(
route.path,
routePartent[routePartent.length - 1],
route.name,
route.meta
);
return router.push(path);
}
2021-12-06 17:11:15 +08:00
}
2021-11-28 16:39:26 +08:00
}
2021-12-14 10:51:07 +08:00
router.push(to.fullPath);
2021-10-16 16:16:58 +08:00
// 刷新页面更新标签栏与页面路由匹配
2021-11-28 16:39:26 +08:00
const localRoutes = storageLocal.getItem("responsive-tags");
2021-12-14 10:51:07 +08:00
const home = find(router.options?.routes, route => {
return route.path === "/";
});
const optionsRoutes = [home, ...router.options?.routes[0].children];
2021-10-16 16:16:58 +08:00
const newLocalRoutes = [];
optionsRoutes.forEach(ors => {
localRoutes.forEach(lrs => {
if (ors.path === lrs.parentPath) {
newLocalRoutes.push(lrs);
}
});
});
});
next();
}
} else {
if (to.path !== "/login") {
if (whiteList.indexOf(to.path) !== -1) {
next();
} else {
next({ path: "/login" });
}
} else {
next();
}
}
});
router.afterEach(() => {
NProgress.done();
});
export default router;