Files
frontend/src/router/index.js
T
2026-08-11 15:03:02 +08:00

220 lines
6.8 KiB
JavaScript

import { createRouter, createWebHistory } from 'vue-router';
import { useUserStore } from '../store/user';
import i18n from '../i18n';
const { t } = i18n.global;
const APP_NAME = 'Yoresee';
const makeDocumentChildRoutes = (basePath, namePrefix, propsFactory) => [
{
path: `${basePath}/:docId`,
name: `${namePrefix}Editor`,
component: () => import('../views/document/DocumentEditor.vue'),
meta: { requiresAuth: true, dynamicTitle: true },
props: propsFactory
},
{
path: `${basePath}/:docId/attachments`,
name: `${namePrefix}Attachments`,
component: () => import('../views/document/DocumentAttachments.vue'),
meta: { requiresAuth: true, titleKey: 'document.attachments.title' }
},
{
path: `${basePath}/:docId/history`,
name: `${namePrefix}History`,
component: () => import('../views/document/DocumentHistory.vue'),
meta: { requiresAuth: true, titleKey: 'history.title' }
},
{
path: `${basePath}/:docId/setting`,
name: `${namePrefix}Settings`,
component: () => import('../views/document/DocumentSettings.vue'),
meta: { requiresAuth: true, titleKey: 'document.settings.title' }
},
{
path: `${basePath}/:docId/attachment/:attachmentId`,
name: `${namePrefix}AttachmentOpen`,
component: () => import('../views/document/DocumentAttachmentOpen.vue'),
meta: { requiresAuth: true, titleKey: 'document.attachments.previewTitle' }
}
];
const router = createRouter({
history: createWebHistory(),
routes: [
{
path: '/login',
name: 'Login',
component: () => import('../views/auth/Login.vue'),
meta: { titleKey: 'login.title' }
},
{
path: '/register',
name: 'Register',
component: () => import('../views/auth/Register.vue'),
meta: { titleKey: 'register.title' }
},
{
path: '/',
name: 'Home',
component: () => import('../views/workspace/Home.vue'),
meta: { requiresAuth: true, titleKey: 'navigation.home' }
},
{
path: '/mydocuments',
name: 'MyDocuments',
component: () => import('../views/workspace/MyDocuments.vue'),
meta: { requiresAuth: true, titleKey: 'navigation.myDocuments' }
},
{
path: '/documents',
name: 'MyDocumentsAlias',
redirect: '/mydocuments'
},
...makeDocumentChildRoutes('/mydocument', 'MyDocument', (route) => ({ kbId: 'personal', docId: route.params.docId })),
{
path: '/knowledge-base',
name: 'KnowledgeBase',
component: () => import('../views/knowledge-base/KnowledgeBase.vue'),
meta: { requiresAuth: true, titleKey: 'knowledgeBase.title' }
},
{
path: '/templates',
name: 'Templates',
component: () => import('../views/template/Templates.vue'),
meta: { requiresAuth: true, titleKey: 'templates.title' }
},
{
path: '/search',
name: 'Search',
component: () => import('../views/workspace/Search.vue'),
meta: { requiresAuth: true, titleKey: 'search.title' }
},
{
path: '/template/:templateId',
name: 'TemplatePreview',
component: () => import('../views/template/TemplatePreview.vue'),
meta: { requiresAuth: true, dynamicTitle: true }
},
{
path: '/knowledge-base/:id',
name: 'KnowledgeBaseDetail',
component: () => import('../views/knowledge-base/KnowledgeBaseDetail.vue'),
meta: { requiresAuth: true, dynamicTitle: true },
props: true
},
...makeDocumentChildRoutes('/knowledge-base/:kbId/document', 'KnowledgeBaseDocument', true),
{
path: '/user_info/profile',
name: 'UserProfile',
component: () => import('../views/user/UserProfile.vue'),
meta: { requiresAuth: true, titleKey: 'user.profileTitle' }
},
{
path: '/user_info/setting',
name: 'UserSetting',
component: () => import('../views/user/UserSetting.vue'),
meta: { requiresAuth: true, titleKey: 'user.settingTitle' }
},
{
path: '/user_info/invitations',
name: 'UserInvitations',
component: () => import('../views/user/UserInvitations.vue'),
meta: { requiresAuth: true, titleKey: 'user.invite.title' }
},
{
path: '/user_info/notifications',
name: 'UserNotifications',
component: () => import('../views/user/UserNotifications.vue'),
meta: { requiresAuth: true, titleKey: 'user.notifications.title' }
},
{
path: '/manage/security',
name: 'SystemManageSecurity',
component: () => import('../views/manage/SystemManageSecurity.vue'),
meta: { requiresAuth: true, titleKey: 'system.security.title' }
},
{
path: '/manage/user',
name: 'SystemManageUser',
component: () => import('../views/manage/SystemManageUser.vue'),
meta: { requiresAuth: true, titleKey: 'system.user.title' }
},
{
path: '/manage/user_group',
name: 'SystemManageUserGroup',
component: () => import('../views/manage/SystemManageUserGroup.vue'),
meta: { requiresAuth: true, titleKey: 'system.userGroup.title' }
},
{
path: '/manage/user_group/:externalID',
name: 'SystemManageUserGroupDetail',
component: () => import('../views/manage/SystemManageUserGroupDetail.vue'),
meta: { requiresAuth: true, dynamicTitle: true },
props: true
},
{
path: '/manage/organization',
name: 'SystemManageOrganization',
component: () => import('../views/manage/SystemManageOrganization.vue'),
meta: { requiresAuth: true, titleKey: 'system.organization.title' }
},
{
path: '/manage/organization/:externalID',
name: 'SystemManageOrganizationDetail',
component: () => import('../views/manage/SystemManageOrganizationDetail.vue'),
meta: { requiresAuth: true, dynamicTitle: true },
props: true
},
{
path: '/manage/invitations',
name: 'SystemManageInvitations',
component: () => import('../views/manage/SystemManageInvitations.vue'),
meta: { requiresAuth: true, titleKey: 'system.invite.title' }
},
{
path: '/manage',
name: 'SystemManage',
redirect: '/manage/user'
},
{
path: '/404',
name: 'NotFound',
component: () => import('../views/error/NotFound.vue'),
meta: { titleKey: '404' }
},
{
path: '/:pathMatch(.*)*',
redirect: (to) => ({
path: '/404',
query: {
from: to.fullPath
}
})
}
]
});
router.beforeEach((to, from) => {
const userStore = useUserStore();
const requiresAuth = to.matched.some(record => record.meta.requiresAuth);
if (requiresAuth && !userStore.token) {
return '/login';
}
});
router.afterEach((to) => {
if (to.meta.dynamicTitle) return;
const titleKey = to.meta.titleKey;
if (titleKey) {
const pageTitle = t(titleKey);
document.title = `${pageTitle} - ${APP_NAME}`;
} else {
document.title = APP_NAME;
}
});
export default router;