fix: 🐛 修复登录成功路由无法跳转问题和相关代码优化

This commit is contained in:
Ray.Hao
2025-08-04 15:04:11 +08:00
parent 4a224bbd0e
commit 0179b5c470
7 changed files with 96 additions and 221 deletions

View File

@@ -8,78 +8,64 @@ const modules = import.meta.glob("../../views/**/**.vue");
const Layout = () => import("@/layouts/index.vue");
export const usePermissionStore = defineStore("permission", () => {
// 存储所有路由,包括静态路由动态路由
// 所有路由静态路由 + 动态路由
const routes = ref<RouteRecordRaw[]>([]);
// 混合模式左侧菜单路由
const sideMenuRoutes = ref<RouteRecordRaw[]>([]);
// 路由是否加载完
const routesLoaded = ref(false);
// 混合布局的左侧菜单路由
const mixLayoutSideMenus = ref<RouteRecordRaw[]>([]);
// 动态路由是否已生
const isDynamicRoutesGenerated = ref(false);
/**
* 获取后台动态路由数据,解析并注册到全局路由
*
* @returns Promise<RouteRecordRaw[]> 解析后的动态路由列表
* 生成动态路由
*/
function generateRoutes() {
return new Promise<RouteRecordRaw[]>((resolve, reject) => {
MenuAPI.getRoutes()
.then((data) => {
const dynamicRoutes = parseDynamicRoutes(data);
async function generateRoutes(): Promise<RouteRecordRaw[]> {
try {
const data = await MenuAPI.getRoutes();
const dynamicRoutes = parseDynamicRoutes(data);
routes.value = [...constantRoutes, ...dynamicRoutes];
routesLoaded.value = true;
routes.value = [...constantRoutes, ...dynamicRoutes];
isDynamicRoutesGenerated.value = true;
resolve(dynamicRoutes);
})
.catch((error) => {
console.error("❌ Failed to generate routes:", error);
// 即使失败也要设置状态,避免无限重试
routesLoaded.value = false;
reject(error);
});
});
return dynamicRoutes;
} catch (error) {
console.error("❌ Failed to generate routes:", error);
isDynamicRoutesGenerated.value = false;
throw error;
}
}
/**
* 根据父菜单路径设置侧边菜单
*
* @param parentPath 父菜单的路径,用于查找对应的菜单项
* 设置混合布局的左侧菜单
*/
const updateSideMenu = (parentPath: string) => {
const matchedItem = routes.value.find((item) => item.path === parentPath);
if (matchedItem && matchedItem.children) {
sideMenuRoutes.value = matchedItem.children;
}
const setMixLayoutSideMenus = (parentPath: string) => {
const parentMenu = routes.value.find((item) => item.path === parentPath);
mixLayoutSideMenus.value = parentMenu?.children || [];
};
/**
* 重置路由
* 重置路由状态
*/
const resetRouter = () => {
// 创建常量路由名称集合用于O(1)时间复杂度的查找
// 移除动态路由
const constantRouteNames = new Set(constantRoutes.map((route) => route.name).filter(Boolean));
// 从 router 实例中移除动态路由
routes.value.forEach((route) => {
if (route.name && !constantRouteNames.has(route.name)) {
router.removeRoute(route.name);
}
});
// 重置为仅包含常量路由
// 重置状态
routes.value = [...constantRoutes];
sideMenuRoutes.value = [];
routesLoaded.value = false;
mixLayoutSideMenus.value = [];
isDynamicRoutesGenerated.value = false;
};
return {
routes,
sideMenuRoutes,
routesLoaded,
mixLayoutSideMenus,
isDynamicRoutesGenerated,
generateRoutes,
updateSideMenu,
setMixLayoutSideMenus,
resetRouter,
};
});