index.ts 3.18 KB
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;