70 lines
2.4 KiB
Go
70 lines
2.4 KiB
Go
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();
|
|
});
|