// 路由懒加载减少首屏体积;没有权限时返回工作台,后端仍会阻止直接请求越权接口。 import { createRouter, createWebHistory } from "vue-router"; import { useSession } from "./store"; import { tokens } from "./api"; const router = createRouter({ history: createWebHistory(), routes: [ { path: "/login", component: () => import("./views/LoginView.vue"), meta: { title: "登录", public: true }, }, { path: "/", component: () => import("./views/DashboardView.vue"), meta: { title: "审计工作台" }, }, { path: "/reimbursements", component: () => import("./views/ReimbursementView.vue"), meta: { title: "报销管理" }, }, { path: "/reimbursements/:id", component: () => import("./views/ReimbursementDetail.vue"), meta: { title: "报销详情" }, }, { path: "/audits", component: () => import("./views/AuditList.vue"), meta: { title: "审核任务" }, }, { path: "/audits/:id", component: () => import("./views/AuditDetail.vue"), meta: { title: "审核结果" }, }, { path: "/approvals", component: () => import("./views/ApprovalView.vue"), meta: { title: "审批待办", level: 1 }, }, { path: "/agents", component: () => import("./views/AgentView.vue"), meta: { title: "Agent 管理", level: 2 }, }, { path: "/rules", component: () => import("./views/RuleView.vue"), meta: { title: "审计规则", level: 2 }, }, { path: "/knowledge", component: () => import("./views/KnowledgeView.vue"), meta: { title: "政策知识库" }, }, { path: "/chains", component: () => import("./views/ChainView.vue"), meta: { title: "审批链", level: 3 }, }, { path: "/alerts", component: () => import("./views/AlertView.vue"), meta: { title: "异常告警", level: 1 }, }, { path: "/logs", component: () => import("./views/LogView.vue"), meta: { title: "审计日志", level: 2 }, }, { path: "/users", component: () => import("./views/UserView.vue"), meta: { title: "用户与部门", level: 3 }, }, { path: "/:pathMatch(.*)*", redirect: "/" }, ], }); router.beforeEach(async (to) => { const session = useSession(); if (to.meta.public) return true; if (!tokens().access_token) return { path: "/login", query: { redirect: to.fullPath } }; if (!session.loaded || !session.user) { try { await session.load(); } catch { return "/login"; } } if (session.level < Number(to.meta.level || 0)) return "/"; return true; }); export default router;