router.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738
  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: '/plugins', component: () => import('./views/PluginsView.vue') },
  14. { path: '/mcp', component: () => import('./views/McpView.vue') },
  15. { path: '/api-keys', component: () => import('./views/ApiKeysView.vue') },
  16. { path: '/api-docs', component: () => import('./views/ApiDocsView.vue') },
  17. { path: '/audit', component: () => import('./views/AuditView.vue') },
  18. { path: '/settings', component: () => import('./views/SettingsView.vue') },
  19. { path: '/:pathMatch(.*)*', redirect: '/playground' },
  20. ],
  21. })
  22. let checked = false
  23. router.beforeEach(async to => {
  24. if (to.meta.public) return true
  25. if (checked) return true
  26. const { loggedIn } = await admin.me().catch(() => ({ loggedIn: false }))
  27. if (!loggedIn) return { path: '/login', query: { next: to.fullPath } }
  28. checked = true
  29. return true
  30. })
  31. /** 接口返回 401 时回到登录页 */
  32. export function requireLogin() {
  33. checked = false
  34. void router.push({ path: '/login', query: { next: router.currentRoute.value.fullPath } })
  35. }