Files
fe.ems.vue3/src/router/index.ts
2025-05-09 14:34:17 +08:00

142 lines
3.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
import {
createRouter,
createWebHistory,
createWebHashHistory,
} from 'vue-router';
import { constantRoutes } from './routers';
import { getAccessToken } from '@/plugins/auth-token';
import { validHttp } from '@/utils/regular-utils';
import useUserStore from '@/store/modules/user';
import useAppStore from '@/store/modules/app';
import useNeListStore from '@/store/modules/ne_list';
import useRouterStore from '@/store/modules/router';
// NProgress Configuration
NProgress.configure({ showSpinner: false });
// 根据.env配置获取是否带井号和基础路径
const hasHash = import.meta.env.VITE_HISTORY_HASH;
const bashUrl = import.meta.env.VITE_HISTORY_BASE_URL;
/**全局路由 */
const router = createRouter({
history:
hasHash === 'true'
? createWebHashHistory(bashUrl)
: createWebHistory(bashUrl),
routes: constantRoutes,
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition;
} else {
return { top: 0 };
}
},
});
/**全局路由-后置守卫 */
router.afterEach((to, from, failure) => {
NProgress.done();
const title = to.meta?.title;
// 设置标题
if (!failure && title) {
useAppStore().setTitle(to.meta.title);
}
});
/**无Token可访问页面地址白名单 */
const WHITE_LIST: string[] = [
'/login',
'/auth-redirect',
'/help',
'/register',
'/quick-start',
'/trace-task-hlr',
];
/**全局路由-前置守卫 */
router.beforeEach(async (to, from, next) => {
NProgress.start();
// 获取系统配置信息
const appStore = useAppStore();
if (!appStore.loginBackground) {
await appStore.fnSysConf();
}
// // 需要系统引导跳转
// if (appStore.bootloader && to.path !== '/quick-start') {
// next({ name: 'QuickStart' });
// }
// // 不重复引导
// if (!appStore.bootloader && to.path === '/quick-start') {
// next({ name: 'Index' });
// }
let token = getAccessToken();
// 免用户登录认证
if (!appStore.loginAuth) {
token = '== Not Login Auth ==';
}
// 没有token
if (!token) {
if (WHITE_LIST.includes(to.path)) {
// 在免登录白名单,直接进入
next();
} else {
// 否则全部重定向到登录页
next(`/login?redirect=${to.fullPath}`);
}
}
// 有Token
if (token) {
if (to.path === '/login') {
// 防止重复访问登录页面
next({ name: 'Index' });
} else {
// 判断当前用户是否有角色信息
const user = useUserStore();
if (user.roles && user.roles.length === 0) {
try {
// 获取网元信息
await useNeListStore().fnNelist();
// 获取用户信息
await user.fnGetInfo();
// 获取路由信息
const accessRoutes = await useRouterStore().generateRoutes();
// 根据后台配置生成可访问的路由表
if (accessRoutes && accessRoutes.length !== 0) {
for (const route of accessRoutes) {
// 动态添加可访问路由表http开头会异常
if (!validHttp(route.path)) {
router.addRoute(route);
}
}
}
// 刷新替换原先路由确保addRoutes已完成
next({ ...to, replace: true });
} catch (error: any) {
console.error(`[${to.path}]: ${error.message}`);
await user.fnLogOut();
next({ name: 'Login' });
}
} else if (
to.meta.neType &&
to.meta.neType.length > 0 &&
!useNeListStore().fnHasNe(to.meta.neType)
) {
next({ name: 'NotPermission' });
} else {
next();
}
}
}
});
export default router;