File size: 8,622 Bytes
8059bf0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 | # 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:
1. **Sets Page Title**: Updates document title based on route meta
2. **Checks Authentication**:
- Public routes (`requiresAuth: false`) are accessible without login
- Protected routes require authentication
- Redirects to `/login` if not authenticated
3. **Prevents Double Login**:
- Redirects authenticated users away from login/register pages
4. **Role-Based Access Control**:
- Admin routes (`requiresAdmin: true`) require admin role
- Non-admin users are redirected to `/dashboard`
5. **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:
```typescript
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:
```typescript
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`):
```typescript
const authStore = useAuthStore()
// Check authentication status
authStore.isAuthenticated
// Check admin role
authStore.isAdmin
```
## Usage Examples
### Programmatic Navigation
```typescript
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
```vue
<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
```typescript
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:
```typescript
router.onError((error) => {
console.error('Router error:', error)
})
```
## Testing Routes
To test navigation guards and route access:
1. **Public Route Access**: Visit `/login` without authentication
2. **Protected Route**: Try accessing `/dashboard` without login (should redirect)
3. **Admin Access**: Login as regular user, try `/admin/users` (should redirect to dashboard)
4. **Admin Success**: Login as admin, access `/admin/users` (should succeed)
5. **404 Handling**: Visit non-existent route (should show 404 page)
## Development Tips
### Adding New Routes
1. Add route definition in `routes` array
2. Create corresponding view component
3. Set appropriate meta fields (`requiresAuth`, `requiresAdmin`)
4. Use lazy loading with `() => import()`
5. Update this README with route documentation
### Debugging Navigation
Enable Vue Router debug mode:
```typescript
// 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.html` for 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
1. **Client-Side Only**: Navigation guards are client-side; server must also validate
2. **Token Validation**: API should verify JWT token on every request
3. **Role Checking**: Backend must verify admin role, not just frontend
4. **XSS Protection**: Vue automatically escapes template content
5. **CSRF Protection**: Use CSRF tokens for state-changing operations
## Performance Optimization
1. **Lazy Loading**: All routes use dynamic imports
2. **Code Splitting**: Vite automatically splits route chunks
3. **Prefetching**: Consider adding route prefetch for common paths
4. **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
|