Files
claude-relay-service/web/admin-spa/src/router/index.js
shaw 9c4dc714f8 Revert "Merge pull request #424 from Wangnov/feat/i18n"
This reverts commit 1d915d8327, reversing
changes made to 009f7c84f6.
2025-09-12 09:21:53 +08:00

210 lines
5.2 KiB
JavaScript

import { createRouter, createWebHistory } from 'vue-router'
import { useAuthStore } from '@/stores/auth'
import { useUserStore } from '@/stores/user'
import { APP_CONFIG } from '@/config/app'
// 路由懒加载
const LoginView = () => import('@/views/LoginView.vue')
const UserLoginView = () => import('@/views/UserLoginView.vue')
const UserDashboardView = () => import('@/views/UserDashboardView.vue')
const UserManagementView = () => import('@/views/UserManagementView.vue')
const MainLayout = () => import('@/components/layout/MainLayout.vue')
const DashboardView = () => import('@/views/DashboardView.vue')
const ApiKeysView = () => import('@/views/ApiKeysView.vue')
const AccountsView = () => import('@/views/AccountsView.vue')
const TutorialView = () => import('@/views/TutorialView.vue')
const SettingsView = () => import('@/views/SettingsView.vue')
const ApiStatsView = () => import('@/views/ApiStatsView.vue')
const routes = [
{
path: '/',
redirect: () => {
// 智能重定向:避免循环
const currentPath = window.location.pathname
const basePath = APP_CONFIG.basePath.replace(/\/$/, '') // 移除末尾斜杠
// 如果当前路径已经是 basePath 或 basePath/,重定向到 api-stats
if (currentPath === basePath || currentPath === basePath + '/') {
return '/api-stats'
}
// 否则保持默认重定向
return '/api-stats'
}
},
{
path: '/login',
name: 'Login',
component: LoginView,
meta: { requiresAuth: false }
},
{
path: '/admin-login',
redirect: '/login'
},
{
path: '/user-login',
name: 'UserLogin',
component: UserLoginView,
meta: { requiresAuth: false, userAuth: true }
},
{
path: '/user-dashboard',
name: 'UserDashboard',
component: UserDashboardView,
meta: { requiresUserAuth: true }
},
{
path: '/api-stats',
name: 'ApiStats',
component: ApiStatsView,
meta: { requiresAuth: false }
},
{
path: '/dashboard',
component: MainLayout,
meta: { requiresAuth: true },
children: [
{
path: '',
name: 'Dashboard',
component: DashboardView
}
]
},
{
path: '/api-keys',
component: MainLayout,
meta: { requiresAuth: true },
children: [
{
path: '',
name: 'ApiKeys',
component: ApiKeysView
}
]
},
{
path: '/accounts',
component: MainLayout,
meta: { requiresAuth: true },
children: [
{
path: '',
name: 'Accounts',
component: AccountsView
}
]
},
{
path: '/tutorial',
component: MainLayout,
meta: { requiresAuth: true },
children: [
{
path: '',
name: 'Tutorial',
component: TutorialView
}
]
},
{
path: '/settings',
component: MainLayout,
meta: { requiresAuth: true },
children: [
{
path: '',
name: 'Settings',
component: SettingsView
}
]
},
{
path: '/user-management',
component: MainLayout,
meta: { requiresAuth: true },
children: [
{
path: '',
name: 'UserManagement',
component: UserManagementView
}
]
},
// 捕获所有未匹配的路由
{
path: '/:pathMatch(.*)*',
redirect: '/api-stats'
}
]
const router = createRouter({
history: createWebHistory(APP_CONFIG.basePath),
routes
})
// 路由守卫
router.beforeEach(async (to, from, next) => {
const authStore = useAuthStore()
const userStore = useUserStore()
console.log('路由导航:', {
to: to.path,
from: from.path,
fullPath: to.fullPath,
requiresAuth: to.meta.requiresAuth,
requiresUserAuth: to.meta.requiresUserAuth,
isAuthenticated: authStore.isAuthenticated,
isUserAuthenticated: userStore.isAuthenticated
})
// 防止重定向循环:如果已经在目标路径,直接放行
if (to.path === from.path && to.fullPath === from.fullPath) {
return next()
}
// 检查用户认证状态
if (to.meta.requiresUserAuth) {
if (!userStore.isAuthenticated) {
// 尝试检查本地存储的认证信息
try {
const isUserLoggedIn = await userStore.checkAuth()
if (!isUserLoggedIn) {
return next('/user-login')
}
} catch (error) {
// If the error is about disabled account, redirect to login with error
if (error.message && error.message.includes('disabled')) {
// Import showToast to display the error
const { showToast } = await import('@/utils/toast')
showToast(error.message, 'error')
}
return next('/user-login')
}
}
return next()
}
// API Stats 页面不需要认证,直接放行
if (to.path === '/api-stats' || to.path.startsWith('/api-stats')) {
next()
} else if (to.path === '/user-login') {
// 如果已经是用户登录状态,重定向到用户仪表板
if (userStore.isAuthenticated) {
next('/user-dashboard')
} else {
next()
}
} else if (to.meta.requiresAuth && !authStore.isAuthenticated) {
next('/login')
} else if (to.path === '/login' && authStore.isAuthenticated) {
next('/dashboard')
} else {
next()
}
})
export default router