puzhibing
2026-08-28 e92cd56bb56b111c1afe9922191f9897215ff6b0
frontend-admin/src/router/index.ts
@@ -9,6 +9,7 @@
  { 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" },
@@ -35,9 +36,10 @@
      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: { permission: "approvals:page" } },
        { path: "approvals", component: () => import("../views/ApprovalTodoView.vue"), meta: { title: "操作日志", permission: "approvals:page" } },
        { path: "config", redirect: "/system/booking-settings" },
        {
          path: "system/approval-settings",
@@ -59,7 +61,12 @@
          component: () => import("../views/ContentSettingsView.vue"),
          meta: { title: "内容设置", permission: "config:content-settings:page" },
        },
        { path: "exports", component: () => import("../views/ExportView.vue"), meta: { permission: "exports: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" } },
        {
@@ -92,7 +99,13 @@
router.beforeEach((to, _from, next) => {
  const auth = useAuthStore();
  if (to.path === "/login" && auth.token) {
    next(resolveFirstAllowedPath());
    const redirectPath = resolveFirstAllowedPath();
    if (redirectPath === "/login") {
      auth.clear();
      next();
      return;
    }
    next(redirectPath);
    return;
  }
  if (to.meta.requiresAuth && !auth.token) {
@@ -101,11 +114,27 @@
  }
  const requiredPermission = typeof to.meta.permission === "string" ? to.meta.permission : "";
  if (requiredPermission && !auth.hasPermission(requiredPermission)) {
    next(resolveFirstAllowedPath());
    const redirectPath = resolveFirstAllowedPath();
    if (redirectPath === to.path) {
      next();
      return;
    }
    if (redirectPath === "/login") {
      auth.clear();
    }
    next(redirectPath);
    return;
  }
  if (to.path === "/") {
    next(resolveFirstAllowedPath());
    const redirectPath = resolveFirstAllowedPath();
    if (redirectPath === "/") {
      next();
      return;
    }
    if (redirectPath === "/login" && auth.token) {
      auth.clear();
    }
    next(redirectPath);
    return;
  }
  next();