import { createRouter, createWebHistory, type Router } from 'vue-router';
import routes from '../routes';
import { initAppRoutes, isRoutesInitialized } from '../microAppRouter';
import { useUserStore } from '../stores/user';
import { useMenuStore } from '../stores/menu';
import { getAccessToken } from '../utils/token';
import { getUrlHashToken } from '../utils/token';
// 创建路由实例
const router: Router = createRouter({
history: createWebHistory(),
routes,
});
// å…ˆåˆå§‹åŒ–å¾®å‰ç«¯åº”ç”¨è·¯ç”±ï¼ˆå¼‚æ¥æ“作)
// 我们ä¸ä¼šç‰å¾…其完æˆå†å¯¼å‡ºrouter,但会在导航守å«ä¸æ£€æŸ¥åˆå§‹åŒ–状æ€
initAppRoutes(router).catch(error => {
console.error('åˆå§‹åŒ–微应用路由失败:', error);
});
// 全局导航守å«
router.beforeEach(async (to, from, next) => {
// 先检查URL䏿˜¯å¦æœ‰token并处ç†
const hashToken = getUrlHashToken();
// 如果URL䏿œ‰hash tokenï¼Œé‡æ–°è·¯ç”±åˆ°ç›¸åŒé¡µé¢ï¼Œä¿æŒåŽŸæŸ¥è¯¢å‚æ•°
if (hashToken) {
// ä¿ç•™åŽŸæŸ¥è¯¢å‚æ•°ï¼Œç¡®ä¿å¯¼èˆªç»“æŸåŽhash消失
window.location.hash = '';
return next({ path: to.path, query: to.query });
}
if (!isRoutesInitialized() && to.path === '/loading') {
// å¦‚æžœæ˜¯åŠ è½½é¡µé¢ï¼Œç›´æŽ¥æ”¾è¡Œ
return next();
}
// 检查微应用路由是å¦å·²åˆå§‹åŒ–完æˆ
if (!isRoutesInitialized() && to.path !== '/login') {
// å¯ä»¥é€‰æ‹©æ˜¾ç¤ºåŠ è½½é¡µé¢æˆ–é‡å®šå‘到特定页é¢
console.log('ç‰å¾…微应用路由åˆå§‹åŒ–完æˆ...');
// å¯ä»¥æ·»åŠ ä¸€ä¸ªåŠ è½½ä¸çš„页é¢
return next({ path: '/loading', query: { redirect: to.fullPath } });
}
// 获å–localStorageä¸çš„token
const hasToken = !!getAccessToken();
// 获å–store
const userStore = useUserStore();
const menuStore = useMenuStore();
// 判æ–路由是å¦éœ€è¦è®¤è¯ï¼ˆæ ¹æ®è·¯ç”±å…ƒä¿¡æ¯ï¼‰
// 使用å¯é€‰é“¾å’Œç©ºå€¼åˆå¹¶è¿ç®—符,如果meta或auth未定义,默认需è¦è®¤è¯
const requireAuth = to.meta?.auth ?? true;
// 如果已ç»åœ¨ç™»å½•页且è¦åŽ»çš„ä¹Ÿæ˜¯ç™»å½•é¡µï¼Œç›´æŽ¥æ”¾è¡Œ
if (from.path === '/login' && to.path === '/login') {
return next();
}
// 如果有token
if (hasToken) {
// 如果去登录页,直接跳转到首页
if (to.path === '/login') {
if (to.query.redirect) {
next({ path: to.query.redirect as string });
} else {
next({ path: '/' });
}
} else {
// 如果没有用户信æ¯ï¼ŒèŽ·å–用户信æ¯
if (!userStore.hasUserInfo) {
try {
await userStore.fetchUserInfoAsync();
} catch (error) {
// 获å–用户信æ¯å¤±è´¥ï¼Œå¯èƒ½æ˜¯tokenæ— æ•ˆï¼Œè·³è½¬åˆ°ç™»å½•é¡µ
console.error('获å–用户信æ¯å¤±è´¥:', error);
next({ path: '/login' });
return;
}
}
// 如果没有èœå•ä¿¡æ¯ï¼ŒèŽ·å–èœå•ä¿¡æ¯
if (!menuStore.hasMenus) {
try {
await menuStore.fetchMenuAsync();
} catch (error) {
console.error('获å–èœå•ä¿¡æ¯å¤±è´¥:', error);
// 获å–èœå•失败但ä¸å½±å“å¯¼èˆªï¼Œç»§ç»æ”¾è¡Œ
}
}
// æ›´æ–°å½“å‰æ´»åЍèœå•
if (menuStore.hasMenus) {
menuStore.setActiveMenuByPath(to.path);
}
// ç»§ç»å¯¼èˆª
next();
}
} else {
// æ— token的情况
// 如果路由ä¸éœ€è¦è®¤è¯ï¼Œç›´æŽ¥æ”¾è¡Œ
if (!requireAuth) {
next();
} else {
// 需è¦è®¤è¯çš„路由,é‡å®šå‘到登录页
next({ path: '/login', query: { redirect: to.fullPath } });
}
}
});
export default router;
|