Files
geo/apps/admin-web/src/router/index.ts
T

167 lines
4.7 KiB
TypeScript
Raw Normal View History

import { createRouter, createWebHistory } from "vue-router";
import { pinia } from "@/stores/pinia";
import { useAuthStore } from "@/stores/auth";
const router = createRouter({
history: createWebHistory(),
routes: [
{
path: "/login",
name: "login",
component: () => import("@/views/LoginView.vue"),
meta: {
titleKey: "route.login.title",
descriptionKey: "route.login.description",
},
},
{
path: "/",
component: () => import("@/layouts/AppShell.vue"),
meta: {
requiresAuth: true,
},
children: [
{
path: "",
redirect: "/workspace",
},
{
path: "workspace",
name: "workspace",
component: () => import("@/views/WorkspaceView.vue"),
meta: {
titleKey: "route.workspace.title",
descriptionKey: "route.workspace.description",
navKey: "/workspace",
},
},
{
path: "articles/templates",
name: "articles-templates",
component: () => import("@/views/TemplatesView.vue"),
meta: {
titleKey: "route.templates.title",
descriptionKey: "route.templates.description",
navKey: "/articles/templates",
},
},
{
path: "articles/wizard",
name: "article-wizard",
component: () => import("@/views/TemplateWizardView.vue"),
meta: {
titleKey: "route.wizard.title",
descriptionKey: "route.wizard.description",
navKey: "/articles/templates",
},
},
{
path: "articles/:id/edit",
name: "article-editor",
component: () => import("@/views/ArticleEditorView.vue"),
meta: {
titleKey: "route.articleEditor.title",
descriptionKey: "route.articleEditor.description",
navKey: null,
},
},
{
path: "articles/custom",
name: "articles-custom",
component: () => import("@/views/CustomGenerateView.vue"),
meta: {
titleKey: "route.custom.title",
descriptionKey: "route.custom.description",
navKey: "/articles/custom",
},
},
{
path: "articles/free-create",
name: "articles-free-create",
component: () => import("@/views/FreeCreateView.vue"),
meta: {
titleKey: "route.freeCreate.title",
descriptionKey: "route.freeCreate.description",
navKey: "/articles/free-create",
},
},
{
path: "media",
name: "media",
component: () => import("@/views/MediaView.vue"),
meta: {
titleKey: "route.media.title",
descriptionKey: "route.media.description",
navKey: "/media",
},
},
{
path: "brands",
name: "brands",
component: () => import("@/views/BrandsView.vue"),
meta: {
titleKey: "route.brands.title",
descriptionKey: "route.brands.description",
navKey: "/brands",
},
},
{
path: "tracking",
name: "tracking",
2026-04-12 09:56:18 +08:00
component: () => import("@/views/TrackingView.vue"),
meta: {
titleKey: "route.tracking.title",
descriptionKey: "route.tracking.description",
navKey: "/tracking",
},
},
2026-04-12 09:56:18 +08:00
{
path: "tracking/questions/:brandId/:questionId",
name: "tracking-question-detail",
component: () => import("@/views/TrackingQuestionDetailView.vue"),
meta: {
titleKey: "route.trackingQuestion.title",
descriptionKey: "route.trackingQuestion.description",
navKey: "/tracking",
},
},
{
path: "knowledge",
name: "knowledge",
component: () => import("@/views/KnowledgeView.vue"),
meta: {
titleKey: "route.knowledge.title",
descriptionKey: "route.knowledge.description",
navKey: "/knowledge",
},
},
],
},
],
});
router.beforeEach(async (to) => {
const authStore = useAuthStore(pinia);
if (!authStore.initialized) {
await authStore.bootstrap();
}
const requiresAuth = to.matched.some((record) => record.meta.requiresAuth);
if (requiresAuth && !authStore.isAuthenticated) {
return {
name: "login",
query: { redirect: to.fullPath },
};
}
if (to.name === "login" && authStore.isAuthenticated) {
return { name: "workspace" };
}
return true;
});
export { router };