feat(projects): 动态路由根路由重定向只需取决于后端返回的路由首页

ISSUES CLOSED: \
This commit is contained in:
Soybean 2022-06-06 22:44:53 +08:00
parent ae99e57c52
commit 434ab1c560
5 changed files with 36 additions and 10 deletions

1
.env
View File

@ -9,4 +9,5 @@ VITE_APP_DESC=SoybeanAdmin是一个中后台管理系统模版
# 权限路由模式: static dynamic # 权限路由模式: static dynamic
VITE_AUTH_ROUTE_MODE=dynamic VITE_AUTH_ROUTE_MODE=dynamic
# 路由首页(根路由重定向), 用于static模式的权限路由dynamic模式取决于后端返回的路由首页
VITE_ROUTE_HOME_PATH=/dashboard/analysis VITE_ROUTE_HOME_PATH=/dashboard/analysis

View File

@ -31,6 +31,14 @@ export async function createDynamicRouteGuard(
if (to.name === routeName('not-found-page')) { if (to.name === routeName('not-found-page')) {
// 动态路由没有加载导致被not-found-page路由捕获等待权限路由加载好了回到之前的路由 // 动态路由没有加载导致被not-found-page路由捕获等待权限路由加载好了回到之前的路由
// 若路由是从根路由重定向过来的,重新回到根路由
const ROOT_ROUTE_NAME: AuthRoute.RouteKey = 'root';
if (to.redirectedFrom?.name === ROOT_ROUTE_NAME) {
next({ path: '/', replace: true, query: to.query });
return false;
}
next({ path: to.fullPath, replace: true, query: to.query }); next({ path: to.fullPath, replace: true, query: to.query });
return false; return false;
} }

View File

@ -1,15 +1,18 @@
import { getLoginModuleRegExp } from '@/utils'; import { getLoginModuleRegExp } from '@/utils';
/** 根路由: / */
export const ROOT_ROUTE: AuthRoute.Route = {
name: 'root',
path: '/',
redirect: import.meta.env.VITE_ROUTE_HOME_PATH,
meta: {
title: 'Root'
}
};
/** 固定的路由 */ /** 固定的路由 */
export const constantRoutes: AuthRoute.Route[] = [ export const constantRoutes: AuthRoute.Route[] = [
{ ROOT_ROUTE,
name: 'root',
path: '/',
redirect: import.meta.env.VITE_ROUTE_HOME_PATH,
meta: {
title: 'Root'
}
},
{ {
name: 'login', name: 'login',
path: '/login', path: '/login',

View File

@ -1,14 +1,16 @@
import { defineStore } from 'pinia'; import { defineStore } from 'pinia';
import { router, constantRoutes, routes as staticRoutes } from '@/router'; import { router, ROOT_ROUTE, constantRoutes, routes as staticRoutes } from '@/router';
import { fetchUserRoutes } from '@/service'; import { fetchUserRoutes } from '@/service';
import { import {
getUserInfo, getUserInfo,
transformAuthRouteToMenu, transformAuthRouteToMenu,
transformAuthRoutesToVueRoutes, transformAuthRoutesToVueRoutes,
transformAuthRouteToVueRoute,
transformAuthRoutesToSearchMenus, transformAuthRoutesToSearchMenus,
getCacheRoutes, getCacheRoutes,
filterAuthRoutesByUserPermission, filterAuthRoutesByUserPermission,
transformRoutePathToRouteName, transformRoutePathToRouteName,
transformRouteNameToRoutePath,
getConstantRouteNames getConstantRouteNames
} from '@/utils'; } from '@/utils';
import { useAuthStore } from '../auth'; import { useAuthStore } from '../auth';
@ -75,12 +77,24 @@ export const useRouteStore = defineStore('route-store', {
this.cacheRoutes = getCacheRoutes(vueRoutes); this.cacheRoutes = getCacheRoutes(vueRoutes);
}, },
/** 动态路由模式下:更新根路由的重定向 */
handleUpdateRootRedirect(routeKey: AuthRoute.RouteKey) {
if (routeKey === 'root' || routeKey === 'not-found-page') {
throw Error('routeKey的值不能为root或者not-found-page');
}
const rootRoute: AuthRoute.Route = { ...ROOT_ROUTE, redirect: transformRouteNameToRoutePath(routeKey) };
const rootRouteName: AuthRoute.RouteKey = 'root';
router.removeRoute(rootRouteName);
const rootVueRoute = transformAuthRouteToVueRoute(rootRoute)[0];
router.addRoute(rootVueRoute);
},
/** 初始化动态路由 */ /** 初始化动态路由 */
async initDynamicRoute() { async initDynamicRoute() {
const { userId } = getUserInfo(); const { userId } = getUserInfo();
const { data } = await fetchUserRoutes(userId); const { data } = await fetchUserRoutes(userId);
if (data) { if (data) {
this.routeHomeName = data.home; this.routeHomeName = data.home;
this.handleUpdateRootRedirect(data.home);
this.handleAuthRoutes(data.routes); this.handleAuthRoutes(data.routes);
} }
}, },

View File

@ -82,7 +82,7 @@ type ComponentAction = Record<AuthRoute.RouteComponent, () => void>;
* vue路由 * vue路由
* @param item - * @param item -
*/ */
function transformAuthRouteToVueRoute(item: AuthRoute.Route) { export function transformAuthRouteToVueRoute(item: AuthRoute.Route) {
const resultRoute: RouteRecordRaw[] = []; const resultRoute: RouteRecordRaw[] = [];
const itemRoute = { ...item } as RouteRecordRaw; const itemRoute = { ...item } as RouteRecordRaw;