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 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) { if ( adminStore.forcePasswordChange && to.path !== "/admin/change-password" ) { next({ path: "/admin/change-password", query: { redirect: to.fullPath }, }); return; } // Если маршрут не найден, перейти на 404 if (to.matched.length === 0) { from.name ? next({ name: from.name }) : next("/404"); } else { next(); } } else { try { const { roles, forcePasswordChange } = await adminStore.getAdminInfo(); const permissionStore = usePermissionStoreHook(); const accessRoutes = permissionStore.generateRoutes(roles); accessRoutes.forEach((route) => { router.addRoute(route); }); if (forcePasswordChange && to.path !== "/admin/change-password") { next({ path: "/admin/change-password", query: { redirect: to.fullPath }, replace: true, }); return; } 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(); });