import router from "@/router"; import { useAdminStoreHook } from "@/store/modules/admin"; import { usePermissionStoreHook } from "@/store/modules/permission"; import NProgress from "nprogress"; import "nprogress/nprogress.css"; NProgress.configure({ showSpinner: false }); // Индикатор загрузки const permissionStore = usePermissionStoreHook(); // Разрешённые маршруты const whiteList = ["/login", "/register"]; router.beforeEach(async (to, from, next) => { NProgress.start(); const hasToken = localStorage.getItem("accessToken"); if (hasToken) { if (to.path === "/login") { // Если пользователь уже вошёл, перейти на главную страницу next({ path: "/" }); NProgress.done(); } else { const adminStore = useAdminStoreHook(); const hasRoles = adminStore.roles && adminStore.roles.length > 0; if (hasRoles) { // Если маршрут не найден, перейти на 404 if (to.matched.length === 0) { from.name ? next({ name: from.name }) : next("/404"); } else { next(); } } else { try { const { roles } = await adminStore.getAdminInfo(); const accessRoutes = permissionStore.generateRoutes(roles); accessRoutes.forEach((route) => { router.addRoute(route); }); next({ ...to, replace: true }); } catch (error) { // Удалить token и перейти на страницу входа await adminStore.resetToken(); next(`/login?redirect=${to.path}`); NProgress.done(); } } } } else { // Без входа доступны только разрешённые страницы if (whiteList.indexOf(to.path) !== -1) { next(); } else { next(`/login?redirect=${to.path}`); NProgress.done(); } } }); router.afterEach(() => { NProgress.done(); });