router.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // 路由懒加载减少首屏体积;没有权限时返回工作台,后端仍会阻止直接请求越权接口。
  2. import { createRouter, createWebHistory } from "vue-router";
  3. import { useSession } from "./store";
  4. import { tokens } from "./api";
  5. const router = createRouter({
  6. history: createWebHistory(),
  7. routes: [
  8. {
  9. path: "/login",
  10. component: () => import("./views/LoginView.vue"),
  11. meta: { title: "登录", public: true },
  12. },
  13. {
  14. path: "/",
  15. component: () => import("./views/DashboardView.vue"),
  16. meta: { title: "审计工作台" },
  17. },
  18. {
  19. path: "/reimbursements",
  20. component: () => import("./views/ReimbursementView.vue"),
  21. meta: { title: "报销管理" },
  22. },
  23. {
  24. path: "/reimbursements/:id",
  25. component: () => import("./views/ReimbursementDetail.vue"),
  26. meta: { title: "报销详情" },
  27. },
  28. {
  29. path: "/audits",
  30. component: () => import("./views/AuditList.vue"),
  31. meta: { title: "审核任务" },
  32. },
  33. {
  34. path: "/audits/:id",
  35. component: () => import("./views/AuditDetail.vue"),
  36. meta: { title: "审核结果" },
  37. },
  38. {
  39. path: "/approvals",
  40. component: () => import("./views/ApprovalView.vue"),
  41. meta: { title: "审批待办", level: 1 },
  42. },
  43. {
  44. path: "/agents",
  45. component: () => import("./views/AgentView.vue"),
  46. meta: { title: "Agent 管理", level: 2 },
  47. },
  48. {
  49. path: "/rules",
  50. component: () => import("./views/RuleView.vue"),
  51. meta: { title: "审计规则", level: 2 },
  52. },
  53. {
  54. path: "/knowledge",
  55. component: () => import("./views/KnowledgeView.vue"),
  56. meta: { title: "政策知识库" },
  57. },
  58. {
  59. path: "/chains",
  60. component: () => import("./views/ChainView.vue"),
  61. meta: { title: "审批链", level: 3 },
  62. },
  63. {
  64. path: "/alerts",
  65. component: () => import("./views/AlertView.vue"),
  66. meta: { title: "异常告警", level: 1 },
  67. },
  68. {
  69. path: "/logs",
  70. component: () => import("./views/LogView.vue"),
  71. meta: { title: "审计日志", level: 2 },
  72. },
  73. {
  74. path: "/users",
  75. component: () => import("./views/UserView.vue"),
  76. meta: { title: "用户与部门", level: 3 },
  77. },
  78. { path: "/:pathMatch(.*)*", redirect: "/" },
  79. ],
  80. });
  81. router.beforeEach(async (to) => {
  82. const session = useSession();
  83. if (to.meta.public) return true;
  84. if (!tokens().access_token)
  85. return { path: "/login", query: { redirect: to.fullPath } };
  86. if (!session.loaded || !session.user) {
  87. try {
  88. await session.load();
  89. } catch {
  90. return "/login";
  91. }
  92. }
  93. if (session.level < Number(to.meta.level || 0)) return "/";
  94. return true;
  95. });
  96. export default router;