The previous Sora removal missed several frontend references, causing TypeScript build errors for sora_client_enabled and a missing SoraView.vue import. Clean up all remaining Sora code from types, router, sidebar, settings, store, and accounts API.
Vue Router Configuration
Overview
This directory contains the Vue Router configuration for the Sub2API frontend application. The router implements a comprehensive navigation system with authentication guards, role-based access control, and lazy loading.
Files
- index.ts: Main router configuration with route definitions and navigation guards
- meta.d.ts: TypeScript type definitions for route meta fields
Route Structure
Public Routes (No Authentication Required)
| Path | Component | Description |
|---|---|---|
/login |
LoginView | User login page |
/register |
RegisterView | User registration page |
User Routes (Authentication Required)
| Path | Component | Description |
|---|---|---|
/ |
- | Redirects to /dashboard |
/dashboard |
DashboardView | User dashboard with stats |
/keys |
KeysView | API key management |
/usage |
UsageView | Usage records and statistics |
/redeem |
RedeemView | Redeem code interface |
/profile |
ProfileView | User profile settings |
Admin Routes (Admin Role Required)
| Path | Component | Description |
|---|---|---|
/admin |
- | Redirects to /admin/dashboard |
/admin/dashboard |
AdminDashboardView | Admin dashboard |
/admin/users |
AdminUsersView | User management |
/admin/groups |
AdminGroupsView | Group management |
/admin/accounts |
AdminAccountsView | Account management |
/admin/proxies |
AdminProxiesView | Proxy management |
/admin/redeem |
AdminRedeemView | Redeem code management |
Special Routes
| Path | Component | Description |
|---|---|---|
/:pathMatch(.*) |
NotFoundView | 404 error page |
Navigation Guards
Authentication Guard (beforeEach)
The router implements a comprehensive navigation guard that:
- Sets Page Title: Updates document title based on route meta
- Checks Authentication:
- Public routes (
requiresAuth: false) are accessible without login - Protected routes require authentication
- Redirects to
/loginif not authenticated
- Public routes (
- Prevents Double Login:
- Redirects authenticated users away from login/register pages
- Role-Based Access Control:
- Admin routes (
requiresAdmin: true) require admin role - Non-admin users are redirected to
/dashboard
- Admin routes (
- Preserves Intended Destination:
- Saves original URL in query parameter for post-login redirect
Flow Diagram
User navigates to route
↓
Set page title from meta
↓
Is route public? ──Yes──→ Already authenticated? ──Yes──→ Redirect to /dashboard
↓ No ↓ No
↓ Allow access
↓
Is user authenticated? ──No──→ Redirect to /login with redirect query
↓ Yes
↓
Requires admin role? ──Yes──→ Is user admin? ──No──→ Redirect to /dashboard
↓ No ↓ Yes
↓ ↓
Allow access ←────────────────────────────────┘
Route Meta Fields
Each route can define the following meta fields:
interface RouteMeta {
requiresAuth?: boolean // Default: true (requires authentication)
requiresAdmin?: boolean // Default: false (admin access only)
title?: string // Page title
breadcrumbs?: Array<{
// Breadcrumb navigation
label: string
to?: string
}>
icon?: string // Icon for navigation menu
hideInMenu?: boolean // Hide from navigation menu
}
Lazy Loading
All route components use dynamic imports for code splitting:
component: () => import('@/views/user/DashboardView.vue')
Benefits:
- Reduced initial bundle size
- Faster initial page load
- Components loaded on-demand
- Automatic code splitting by Vite
Authentication Store Integration
The router integrates with the Pinia auth store (@/stores/auth):
const authStore = useAuthStore()
// Check authentication status
authStore.isAuthenticated
// Check admin role
authStore.isAdmin
Usage Examples
Programmatic Navigation
import { useRouter } from 'vue-router'
const router = useRouter()
// Navigate to a route
router.push('/dashboard')
// Navigate with query parameters
router.push({
path: '/usage',
query: { filter: 'today' }
})
// Navigate to admin route (will be blocked if not admin)
router.push('/admin/users')
Route Links
<template>
<!-- Simple link -->
<router-link to="/dashboard">Dashboard</router-link>
<!-- Named route -->
<router-link :to="{ name: 'Keys' }">API Keys</router-link>
<!-- With query parameters -->
<router-link :to="{ path: '/usage', query: { page: 1 } }"> Usage </router-link>
</template>
Checking Current Route
import { useRoute } from 'vue-router'
const route = useRoute()
// Check if on admin page
const isAdminPage = route.path.startsWith('/admin')
// Get route meta
const requiresAdmin = route.meta.requiresAdmin
Scroll Behavior
The router implements automatic scroll management:
- Browser Navigation: Restores saved scroll position
- New Routes: Scrolls to top of page
- Hash Links: Scrolls to anchor (when implemented)
Error Handling
The router includes error handling for navigation failures:
router.onError((error) => {
console.error('Router error:', error)
})
Testing Routes
To test navigation guards and route access:
- Public Route Access: Visit
/loginwithout authentication - Protected Route: Try accessing
/dashboardwithout login (should redirect) - Admin Access: Login as regular user, try
/admin/users(should redirect to dashboard) - Admin Success: Login as admin, access
/admin/users(should succeed) - 404 Handling: Visit non-existent route (should show 404 page)
Development Tips
Adding New Routes
- Add route definition in
routesarray - Create corresponding view component
- Set appropriate meta fields (
requiresAuth,requiresAdmin) - Use lazy loading with
() => import() - Update this README with route documentation
Debugging Navigation
Enable Vue Router debug mode:
// In browser console
window.__VUE_ROUTER__ = router
// Check current route
router.currentRoute.value
Common Issues
Issue: 404 on page refresh
- Cause: Server not configured for SPA
- Solution: Configure server to serve
index.htmlfor all routes
Issue: Navigation guard runs twice
- Cause: Multiple
next()calls - Solution: Ensure only one
next()call per code path
Issue: User data not loaded
- Cause: Auth store not initialized
- Solution: Call
authStore.checkAuth()in App.vue or main.ts
Security Considerations
- Client-Side Only: Navigation guards are client-side; server must also validate
- Token Validation: API should verify JWT token on every request
- Role Checking: Backend must verify admin role, not just frontend
- XSS Protection: Vue automatically escapes template content
- CSRF Protection: Use CSRF tokens for state-changing operations
Performance Optimization
- Lazy Loading: All routes use dynamic imports
- Code Splitting: Vite automatically splits route chunks
- Prefetching: Consider adding route prefetch for common paths
- Route Caching: Vue Router caches component instances
Future Enhancements
- Add breadcrumb navigation system
- Implement route-based permissions beyond admin/user
- Add route transition animations
- Implement route prefetching for anticipated navigation
- Add navigation analytics tracking