import { createRouter, createWebHistory } from "vue-router"; import { getToken } from "@/utils/request"; import { useUserStore } from "@/stores/user"; import { fetchMyMenus, fetchProfile } from "@/api/admin"; import { ensureContentBeforeSystem, flattenContentMenus, flattenMpUserMenu, withDownloadAssetsMenu, withDashboardMenu, withMpUserMenu, } from "@/utils/menuExtras"; const router = createRouter({ history: createWebHistory(), routes: [ { path: "/login", name: "login", component: () => import("@/views/Login.vue"), meta: { public: true, title: "登录" }, }, { path: "/", component: () => import("@/layouts/MainLayout.vue"), redirect: "/dashboard", children: [ { path: "dashboard", name: "dashboard", component: () => import("@/views/Dashboard.vue"), meta: { title: "工作台" }, }, { path: "content/work", name: "work", component: () => import("@/views/work/WorkManage.vue"), meta: { title: "作品审核" }, }, { path: "content/banner", name: "banner", component: () => import("@/views/content/BannerManage.vue"), meta: { title: "轮播图" }, }, { path: "content/download-assets", name: "download-assets", component: () => import("@/views/content/DownloadAssets.vue"), meta: { title: "下载素材" }, }, { path: "system/admin", name: "system-admin", component: () => import("@/views/system/AdminUser.vue"), meta: { title: "管理员" }, }, { path: "system/role", name: "system-role", component: () => import("@/views/system/Role.vue"), meta: { title: "角色管理" }, }, { path: "system/menu", name: "system-menu", component: () => import("@/views/system/Menu.vue"), meta: { title: "菜单管理" }, }, { path: "system/mp-user", name: "system-mp-user", component: () => import("@/views/system/MpUser.vue"), meta: { title: "用户管理" }, }, ], }, { path: "/:pathMatch(.*)*", redirect: "/dashboard" }, ], }); router.beforeEach(async (to, _from, next) => { document.title = `${(to.meta.title as string) || "后台"} · 稻城亚丁`; if (to.meta.public) { next(); return; } if (!getToken()) { next({ path: "/login", query: { redirect: to.fullPath } }); return; } const store = useUserStore(); if (!store.profile) { try { const [prof, menus] = await Promise.all([fetchProfile(), fetchMyMenus()]); store.setProfile(prof.data); store.setMenus( ensureContentBeforeSystem( withDownloadAssetsMenu( withMpUserMenu( withDashboardMenu(flattenMpUserMenu(flattenContentMenus(menus.data.list))) ) ) ) ); next(); } catch { store.clearProfile(); next({ path: "/login", query: { redirect: to.fullPath } }); } return; } next(); }); export default router;