longz
2026-06-02 937f99a139bedbacdf15e25cfd55aa592f56082c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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;