import { createRouter, createWebHistory } from 'vue-router' import NProgress from 'nprogress' import 'nprogress/nprogress.css' import { constantRoutes } from '@/router/routes.js' NProgress.configure({ showSpinner: false }) const router = createRouter({ history: createWebHistory(), routes: constantRoutes, scrollBehavior(to, from, savedPosition) { if (savedPosition) { return savedPosition } return { top: 0 } } }) // Whitelist paths that don't require authentication const WHITE_LIST = ['/login', '/register', '/404'] router.beforeEach(async (to, from, next) => { NProgress.start() // Lazily import stores to avoid circular dependency at module init time const { useUserStore } = await import('@/stores/user.js') const { usePermissionStore } = await import('@/stores/permission.js') const userStore = useUserStore() const permissionStore = usePermissionStore() const token = userStore.token if (token) { if (to.path === '/login') { // Already logged in — redirect to home next({ path: '/' }) } else { // Check if user info has been fetched if (!userStore.userInfo) { try { await userStore.getInfo() const accessRoutes = permissionStore.generateRoutes(userStore.menus) accessRoutes.forEach((route) => router.addRoute(route)) // Replace so the new routes are active next({ ...to, replace: true }) } catch (err) { // Token invalid — clear and redirect await userStore.logout() next(`/login?redirect=${to.path}`) } } else { next() } } } else { // No token if (WHITE_LIST.includes(to.path)) { next() } else { next(`/login?redirect=${to.path}`) } } }) router.afterEach(() => { NProgress.done() }) export default router