import { createRouter, createWebHistory } from "vue-router";
|
import { useAuthStore } from "../stores/auth";
|
|
const pagePermissionOrder = [
|
{ path: "/dashboard", permission: "dashboard:page" },
|
{ path: "/appointments", permission: "appointments:page" },
|
{ path: "/approvals", permission: "approvals:page" },
|
{ path: "/system/approval-settings", permission: "config:approval-settings:page" },
|
{ path: "/system/booking-settings", permission: "config:booking-settings:page" },
|
{ path: "/system/visit-reasons", permission: "config:visit-reasons:page" },
|
{ path: "/system/content-settings", permission: "config:content-settings:page" },
|
{ path: "/system/sensitive-words", permission: "config:sensitive-words:page" },
|
{ path: "/exports", permission: "exports:page" },
|
{ path: "/staff/depts", permission: "sys:depts:page" },
|
{ path: "/staff/employees", permission: "sys:staff:page" },
|
{ path: "/staff/groups", permission: "sys:staff-groups:page" },
|
{ path: "/visitor-info", permission: "sys:visitor-users:page" },
|
{ path: "/users", permission: "sys:users:page" },
|
{ path: "/roles", permission: "sys:roles:page" },
|
{ path: "/region/pass-areas", permission: "sys:pass-areas:page" },
|
{ path: "/region/local-units", permission: "sys:local-units:page" },
|
];
|
|
function resolveFirstAllowedPath() {
|
const auth = useAuthStore();
|
return pagePermissionOrder.find((item) => auth.hasPermission(item.permission))?.path || "/login";
|
}
|
|
const router = createRouter({
|
history: createWebHistory(),
|
routes: [
|
{ path: "/login", component: () => import("../views/LoginView.vue") },
|
{
|
path: "/",
|
component: () => import("../layouts/MainLayout.vue"),
|
meta: { requiresAuth: true },
|
children: [
|
{ path: "", redirect: "/dashboard" },
|
{ path: "403", component: () => import("../views/ForbiddenView.vue") },
|
{ path: "dashboard", component: () => import("../views/DashboardView.vue"), meta: { permission: "dashboard:page" } },
|
{ path: "appointments", component: () => import("../views/AppointmentListView.vue"), meta: { permission: "appointments:page" } },
|
{ path: "approvals", component: () => import("../views/ApprovalTodoView.vue"), meta: { title: "操作日志", permission: "approvals:page" } },
|
{ path: "config", redirect: "/system/booking-settings" },
|
{
|
path: "system/approval-settings",
|
component: () => import("../views/ApprovalSettingsView.vue"),
|
meta: { title: "审核配置", permission: "config:approval-settings:page" },
|
},
|
{
|
path: "system/booking-settings",
|
component: () => import("../views/BookingSettingsView.vue"),
|
meta: { title: "预约配置", permission: "config:booking-settings:page" },
|
},
|
{
|
path: "system/visit-reasons",
|
component: () => import("../views/VisitReasonsSettingsView.vue"),
|
meta: { title: "来访事由配置", permission: "config:visit-reasons:page" },
|
},
|
{
|
path: "system/content-settings",
|
component: () => import("../views/ContentSettingsView.vue"),
|
meta: { title: "内容设置", permission: "config:content-settings:page" },
|
},
|
{
|
path: "system/sensitive-words",
|
component: () => import("../views/SensitiveWordsView.vue"),
|
meta: { title: "敏感词库", permission: "config:sensitive-words:page" },
|
},
|
{ path: "exports", component: () => import("../views/ExportView.vue"), meta: { title: "操作日志", permission: "exports:page" } },
|
{ path: "staff/depts", component: () => import("../views/DeptManageView.vue"), meta: { permission: "sys:depts:page" } },
|
{ path: "staff/employees", component: () => import("../views/StaffEmployeesView.vue"), meta: { permission: "sys:staff:page" } },
|
{
|
path: "staff/groups",
|
component: () => import("../views/StaffGroupsView.vue"),
|
meta: { title: "人员分组", permission: "sys:staff-groups:page" },
|
},
|
{
|
path: "visitor-info",
|
component: () => import("../views/VisitorInfoView.vue"),
|
meta: { title: "访客信息", permission: "sys:visitor-users:page" },
|
},
|
{ path: "staff/groups/:id", name: "staff-group-detail", component: () => import("../views/StaffGroupDetailView.vue"), meta: { permission: "sys:staff-groups:detail" } },
|
{ path: "users", component: () => import("../views/UsersView.vue"), meta: { permission: "sys:users:page" } },
|
{ path: "roles/create", name: "role-create", component: () => import("../views/RoleFormView.vue"), meta: { permission: "sys:roles:create" } },
|
{ path: "roles/:id/edit", name: "role-edit", component: () => import("../views/RoleFormView.vue"), meta: { permission: "sys:roles:update" } },
|
{ path: "roles/:id", name: "role-detail", component: () => import("../views/RoleDetailView.vue"), meta: { permission: "sys:roles:detail" } },
|
{ path: "roles", name: "role-list", component: () => import("../views/RolesView.vue"), meta: { permission: "sys:roles:page" } },
|
{
|
path: "region/pass-areas",
|
component: () => import("../views/PassAreasView.vue"),
|
meta: { title: "通行区域管理", permission: "sys:pass-areas:page" },
|
},
|
{ path: "region/local-units", component: () => import("../views/RegionLocalUnitsView.vue"), meta: { permission: "sys:local-units:page" } },
|
],
|
},
|
],
|
});
|
|
router.beforeEach((to, _from, next) => {
|
const auth = useAuthStore();
|
if (to.path === "/login" && auth.token) {
|
const redirectPath = resolveFirstAllowedPath();
|
if (redirectPath === "/login") {
|
auth.clear();
|
next();
|
return;
|
}
|
next(redirectPath);
|
return;
|
}
|
if (to.meta.requiresAuth && !auth.token) {
|
next("/login");
|
return;
|
}
|
const requiredPermission = typeof to.meta.permission === "string" ? to.meta.permission : "";
|
if (requiredPermission && !auth.hasPermission(requiredPermission)) {
|
const redirectPath = resolveFirstAllowedPath();
|
if (redirectPath === to.path) {
|
next();
|
return;
|
}
|
if (redirectPath === "/login") {
|
auth.clear();
|
}
|
next(redirectPath);
|
return;
|
}
|
if (to.path === "/") {
|
const redirectPath = resolveFirstAllowedPath();
|
if (redirectPath === "/") {
|
next();
|
return;
|
}
|
if (redirectPath === "/login" && auth.token) {
|
auth.clear();
|
}
|
next(redirectPath);
|
return;
|
}
|
next();
|
});
|
|
export default router;
|