import { createRouter, createWebHistory, type RouteLocationNormalized } from "vue-router"; import RootLayout from "@/layout/RootLayout.vue"; import MainLayout from "@/layout/MainLayout.vue"; import Login from "@/pages/user/LoginIndex.vue"; import InviteRegister from "@/pages/user/InviteRegister.vue"; import chartRoutes from "@/router/routes/chartRoutes"; import customerRoutes from "@/router/routes/customerRoutes"; import { managementAccountRoutes, managementSettingRoutes, storeRoutes } from "@/router/routes/managementRoutes"; import permissionRoutes from "@/router/routes/permissionRoutes"; import pointRoutes from "@/router/routes/pointRoutes"; import packageRoutes from "@/router/routes/packageRoutes"; import registrationRoutes from "@/router/routes/registrationRoutes"; import tabRoutes from "@/router/routes/tabRoutes"; import userRoutes from "@/router/routes/userRoutes"; import notifyRoutes from "@/router/routes/notifyRoutes"; import productRoutes from "@/router/routes/productRoutes"; import salesOrderRoutes from "@/router/routes/salesOrderRoutes"; import fulfillmentRoutes from "@/router/routes/fulfillmentRoutes"; import { useCurrentStoreStore } from "@/store/currentStoreStore"; import { useGlobalUIStore } from "@/store/globalUI"; import { gaoRoleCodes } from "@/utils/permission"; import { useUserStore } from "timi-web-api"; const detailRoutes = [ ...customerRoutes, ...userRoutes, ...registrationRoutes, ...managementSettingRoutes, ...storeRoutes, ...permissionRoutes, ...pointRoutes, ...packageRoutes, ...chartRoutes, ...managementAccountRoutes, ...notifyRoutes, ...productRoutes, ...salesOrderRoutes, ...fulfillmentRoutes ]; const router = createRouter({ history: createWebHistory("/"), scrollBehavior(_to, _from, savedPosition) { if (savedPosition) { return savedPosition; } return { left: 0, top: 0 }; }, routes: [ { path: "/", component: RootLayout, children: [ { path: "", redirect: "/customers" }, { path: "login", name: "Login", component: Login, meta: { depth: 1, navBarVisible: false, tabBarVisible: false, bodyBackground: "#F5F5F8", darkBodyBackground: "#10161f" } }, { path: "gao/invite/register", name: "InviteRegister", component: InviteRegister, meta: { depth: 1, navBarVisible: false, tabBarVisible: false, bodyBackground: "#F5F5F8", darkBodyBackground: "#10161f" } }, { path: "", component: MainLayout, meta: { depth: 1, navBarVisible: false, tabBarVisible: false, bodyBackground: "#F5F5F8", darkBodyBackground: "#10161f" }, children: [ ...tabRoutes, ...detailRoutes ] } ] }, { path: "/:pathMatch(.*)*", redirect: "/customers" } ] }); router.beforeEach(async (to) => { const userStore = useUserStore(); if (to.path === "/login" || to.path === "/gao/invite/register") { return userStore.isLogged() ? "/management" : true; } if (!userStore.isLogged()) { return { path: "/login", query: { redirect: to.fullPath } }; } const storeAccessRedirect = await resolveStoreAccessRedirect(to); if (storeAccessRedirect) { return storeAccessRedirect; } return true; }); async function resolveStoreAccessRedirect(to: RouteLocationNormalized): Promise { const userStore = useUserStore(); const routeName = String(to.name || ""); const storeDiaryRouteNameList = ["StoreDiaryList", "StoreDiaryCreate", "StoreDiaryDetail", "StoreDiaryEdit"]; if (storeDiaryRouteNameList.includes(routeName)) { if (!userStore.hasRoles(gaoRoleCodes.storeManager)) { return "/management"; } const currentStoreStore = useCurrentStoreStore(); const store = await currentStoreStore.loadLoginStore(); return store?.id ? undefined : "/management"; } if (!userStore.hasRoles(gaoRoleCodes.storeManager) || userStore.hasRoles(gaoRoleCodes.globalManager)) { return undefined; } const storeRouteNameList = ["StoreList", "StoreCreate", "StoreSort", "StoreEdit", "StoreBusinessDayCalendar"]; if (!storeRouteNameList.includes(routeName)) { return undefined; } const currentStoreStore = useCurrentStoreStore(); const store = await currentStoreStore.loadLoginStore(); if (!store?.id) { return "/management"; } if (to.name === "StoreEdit" || to.name === "StoreBusinessDayCalendar") { return String(to.params.id || "") === store.id ? undefined : `/management/stores/${store.id}`; } return `/management/stores/${store.id}`; } router.afterEach((to) => { const globalUIStore = useGlobalUIStore(); const isDarkMode = globalUIStore.themeMode === "dark"; const fallbackBackground = isDarkMode ? "#10161f" : "#F5F5F8"; const targetBackground = isDarkMode ? to.meta.darkBodyBackground : to.meta.bodyBackground; globalUIStore.setBodyBackground(typeof targetBackground === "string" ? targetBackground : fallbackBackground); }); export default router;