31 lines
911 B
TypeScript
31 lines
911 B
TypeScript
|
|
import router from '@/router';
|
||
|
|
import { auth, handleRouteGuard } from '@/hooks/useAuth';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 全局路由守卫
|
||
|
|
* 核心流程:
|
||
|
|
* 1. 白名单(/login 等) → 直接放行
|
||
|
|
* 2. 已登录 → 加载菜单权限(首次) → 放行
|
||
|
|
* 3. 未登录 → 跳转 /login
|
||
|
|
* 4. 页面标题自动设置
|
||
|
|
*/
|
||
|
|
router.beforeEach(async (to, _from, next) => {
|
||
|
|
// 设置页面标题
|
||
|
|
const appTitle = import.meta.env.VITE_APP_TITLE || 'CPMS 运营平台';
|
||
|
|
document.title = to.meta.title ? `${to.meta.title} - ${appTitle}` : appTitle;
|
||
|
|
|
||
|
|
const { allow, redirect } = await handleRouteGuard(to.path);
|
||
|
|
|
||
|
|
if (allow) {
|
||
|
|
// 已登录访问 /login → 跳首页
|
||
|
|
if (to.path === '/login' && auth.isLoggedIn()) {
|
||
|
|
const { homePath } = await import('@/stores/menuStore').then((m) => m.useMenuStore());
|
||
|
|
next(homePath.value);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
next();
|
||
|
|
} else {
|
||
|
|
next(redirect || '/login');
|
||
|
|
}
|
||
|
|
});
|