router.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { createRouter, createWebHistory } from 'vue-router'
  2. import { admin } from './lib/api'
  3. export const router = createRouter({
  4. history: createWebHistory('/admin/'),
  5. routes: [
  6. { path: '/', redirect: '/playground' },
  7. { path: '/login', component: () => import('./views/LoginView.vue'), meta: { public: true } },
  8. { path: '/playground/:sessionId?', name: 'playground', component: () => import('./views/PlaygroundView.vue') },
  9. { path: '/sessions/:sessionId?', name: 'sessions', component: () => import('./views/SessionsView.vue') },
  10. { path: '/overview', component: () => import('./views/OverviewView.vue') },
  11. { path: '/profiles/:id?', name: 'profiles', component: () => import('./views/ProfilesView.vue') },
  12. { path: '/knowledge', component: () => import('./views/KnowledgeView.vue') },
  13. { path: '/files', component: () => import('./views/FilesView.vue') },
  14. { path: '/plugins', component: () => import('./views/PluginsView.vue') },
  15. { path: '/mcp', component: () => import('./views/McpView.vue') },
  16. { path: '/api-keys', component: () => import('./views/ApiKeysView.vue') },
  17. { path: '/api-docs', component: () => import('./views/ApiDocsView.vue') },
  18. { path: '/audit', component: () => import('./views/AuditView.vue') },
  19. { path: '/settings', component: () => import('./views/SettingsView.vue') },
  20. { path: '/:pathMatch(.*)*', redirect: '/playground' },
  21. ],
  22. })
  23. let checked = false
  24. router.beforeEach(async to => {
  25. if (to.meta.public) return true
  26. if (checked) return true
  27. const { loggedIn } = await admin.me().catch(() => ({ loggedIn: false }))
  28. if (!loggedIn) return { path: '/login', query: { next: to.fullPath } }
  29. checked = true
  30. return true
  31. })
  32. /** 接口返回 401 时回到登录页 */
  33. export function requireLogin() {
  34. checked = false
  35. void router.push({ path: '/login', query: { next: router.currentRoute.value.fullPath } })
  36. }