|
|
@@ -7,12 +7,36 @@ import { storage } from '@/utils/Storage';
|
|
|
import { PageEnum } from '@/enums/pageEnum';
|
|
|
import { ErrorPageRoute } from '@/router/base';
|
|
|
import NProgress from 'nprogress';
|
|
|
+import { ElMessage } from 'element-plus';
|
|
|
import { getRedirectUrl } from '@/utils/getRedirectUrl';
|
|
|
|
|
|
const LOGIN_PATH = PageEnum.BASE_LOGIN;
|
|
|
|
|
|
const whitePathList = [LOGIN_PATH, PageEnum.BASE_HOME]; // no redirect whitelist
|
|
|
|
|
|
+const setDynamicRoute = async (router) => {
|
|
|
+ const userStore = useUserStoreWidthOut();
|
|
|
+ const asyncRouteStore = useAsyncRouteStoreWidthOut();
|
|
|
+ try {
|
|
|
+ const userInfo = await userStore.GetInfo();
|
|
|
+ const routes = await asyncRouteStore.generateRoutes(userInfo);
|
|
|
+ // 动态添加可访问路由表
|
|
|
+ routes.forEach((item) => {
|
|
|
+ router.addRoute(item as unknown as RouteRecordRaw);
|
|
|
+ });
|
|
|
+ //添加404
|
|
|
+ const isErrorPage = router.getRoutes().findIndex((item) => item.name === ErrorPageRoute.name);
|
|
|
+ if (isErrorPage === -1) {
|
|
|
+ router.addRoute(ErrorPageRoute as unknown as RouteRecordRaw);
|
|
|
+ }
|
|
|
+ asyncRouteStore.setDynamicAddedRoute(true);
|
|
|
+ } catch (error) {
|
|
|
+ ElMessage.error('请先登录');
|
|
|
+ userStore.showLogin = true;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
export function createRouterGuards(router: Router) {
|
|
|
const userStore = useUserStoreWidthOut();
|
|
|
const asyncRouteStore = useAsyncRouteStoreWidthOut();
|
|
|
@@ -22,15 +46,17 @@ export function createRouterGuards(router: Router) {
|
|
|
next(PageEnum.BASE_HOME);
|
|
|
return;
|
|
|
}
|
|
|
+ const token = storage.get(ACCESS_TOKEN);
|
|
|
|
|
|
// Whitelist can be directly entered
|
|
|
if (whitePathList.includes(to.path as PageEnum)) {
|
|
|
next();
|
|
|
+ if (token && !asyncRouteStore.getIsDynamicAddedRoute) {
|
|
|
+ setDynamicRoute(router);
|
|
|
+ }
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- const token = storage.get(ACCESS_TOKEN);
|
|
|
-
|
|
|
if (!token) {
|
|
|
// You can access without permissions. You need to set the routing meta.ignoreAuth to true
|
|
|
if (to.meta.ignoreAuth) {
|
|
|
@@ -39,20 +65,22 @@ export function createRouterGuards(router: Router) {
|
|
|
}
|
|
|
// redirect login page
|
|
|
// 这里登录要改造
|
|
|
- // const redirectData: { path: string; replace: boolean; query?: Recordable<string> } = {
|
|
|
- // path: LOGIN_PATH,
|
|
|
- // replace: true,
|
|
|
- // };
|
|
|
- // if (to.path) {
|
|
|
- // redirectData.query = {
|
|
|
- // ...redirectData.query,
|
|
|
- // redirect: to.path,
|
|
|
- // };
|
|
|
- // }
|
|
|
+ const redirectData: { path: string; replace: boolean; query?: Recordable<string> } = {
|
|
|
+ path: LOGIN_PATH,
|
|
|
+ replace: true,
|
|
|
+ };
|
|
|
+ if (to.path) {
|
|
|
+ redirectData.query = {
|
|
|
+ ...redirectData.query,
|
|
|
+ redirect: to.path,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ // ElMessage.error('请先登录');
|
|
|
+ userStore.showLogin = true;
|
|
|
// next(redirectData);
|
|
|
// window.location.href = getRedirectUrl();
|
|
|
- // next();
|
|
|
- // return;
|
|
|
+ next();
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
if (asyncRouteStore.getIsDynamicAddedRoute) {
|
|
|
@@ -60,29 +88,11 @@ export function createRouterGuards(router: Router) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- try {
|
|
|
- const userInfo = await userStore.GetInfo();
|
|
|
- const routes = await asyncRouteStore.generateRoutes(userInfo);
|
|
|
- // 动态添加可访问路由表
|
|
|
- routes.forEach((item) => {
|
|
|
- router.addRoute(item as unknown as RouteRecordRaw);
|
|
|
- });
|
|
|
- } catch (err) {
|
|
|
- console.log('login error', err);
|
|
|
- // window.location.href = getRedirectUrl();
|
|
|
- }
|
|
|
-
|
|
|
- //添加404
|
|
|
- const isErrorPage = router.getRoutes().findIndex((item) => item.name === ErrorPageRoute.name);
|
|
|
- if (isErrorPage === -1) {
|
|
|
- router.addRoute(ErrorPageRoute as unknown as RouteRecordRaw);
|
|
|
- }
|
|
|
-
|
|
|
+ await setDynamicRoute(router);
|
|
|
+ NProgress.done();
|
|
|
const redirectPath = (from.query.redirect || to.path) as string;
|
|
|
const redirect = decodeURIComponent(redirectPath);
|
|
|
const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect };
|
|
|
- asyncRouteStore.setDynamicAddedRoute(true);
|
|
|
- NProgress.done();
|
|
|
next(nextData);
|
|
|
});
|
|
|
|