UNPKG

@tianyio/quality-helper

Version:

A comprehensive quality helper tool for project scaffolding and management

224 lines (201 loc) 5.09 kB
import { createRouter, createWebHistory, type RouteRecordRaw, type Router, type NavigationFailure, } from 'vue-router' // 路由配置 const routes: RouteRecordRaw[] = [ { path: '/', name: 'Home', component: () => import('../views/Home.vue'), meta: { title: '首页', keepAlive: true, transition: 'fade', }, }, { path: '/about', name: 'About', component: () => import('../views/About.vue'), meta: { title: '关于', keepAlive: false, transition: 'slide-left', }, }, { path: '/pinia-demo', name: 'PiniaDemo', component: () => import('../components/PiniaDemo.vue'), meta: { title: 'Pinia 3.0.3 演示', requiresAuth: false, keepAlive: true, }, }, { path: '/:pathMatch(.*)*', name: 'NotFound', component: () => import('../views/NotFound.vue'), meta: { title: '页面未找到', }, }, ] // 创建路由实例 const router: Router = createRouter({ history: createWebHistory(import.meta.env.FAST_WIN_SITE_ROOT), routes, // 增强的滚动行为 scrollBehavior: (to, from, savedPosition) => { // 如果有保存的位置(浏览器前进/后退) if (savedPosition) { return savedPosition } // 如果路由有锚点 if (to.hash) { return { el: to.hash, behavior: 'smooth', } } // 如果是同一个路由的不同参数,保持当前位置 if (to.name === from.name) { return false } // 默认滚动到顶部 return { top: 0, behavior: 'smooth' } }, // 严格模式,确保路由匹配的准确性 strict: true, // 敏感模式,区分大小写 sensitive: false, }) // 全局前置守卫 - 认证检查 router.beforeEach(async (to, from, next) => { try { // 开发环境下的路由日志 if (import.meta.env.DEV) { console.log(`🧭 路由跳转: ${from.path} -> ${to.path}`) } // 检查是否需要认证 if (to.meta?.['requiresAuth']) { // 这里可以添加认证逻辑 // const isAuthenticated = await checkAuth() // if (!isAuthenticated) { // next({ name: 'Login', query: { redirect: to.fullPath } }) // return // } } // 检查用户角色权限 if (to.meta && Array.isArray(to.meta['roles']) && to.meta['roles'].length > 0) { // 这里可以添加角色检查逻辑 // const userRoles = await getUserRoles() // const hasPermission = to.meta.roles.some(role => userRoles.includes(role)) // if (!hasPermission) { // next({ name: 'Forbidden' }) // return // } } next() } catch (error) { console.error('路由守卫错误:', error) next(false) // 取消导航 } }) // 全局解析守卫 - 在导航被确认之前调用 router.beforeResolve(async (to, from, next) => { try { // 设置页面标题 if (to.meta?.['title']) { document.title = `${to.meta['title']} - FastWeb应用` } // 可以在这里添加数据预加载逻辑 // if (to.meta?.preload) { // await preloadData(to) // } next() } catch (error) { console.error('路由解析错误:', error) next(false) } }) // 全局后置钩子 router.afterEach((to, from, failure) => { // 处理导航失败 if (failure) { console.error('导航失败:', failure) return } // 页面访问统计 if (import.meta.env.FAST_ENABLE_ANALYTICS === 'true') { console.log('📊 页面访问统计:', { path: to.path, name: to.name, params: to.params, query: to.query, timestamp: new Date().toISOString(), }) } // 移除加载状态 const loadingElement = document.querySelector('.route-loading') if (loadingElement) { loadingElement.remove() } }) // 导航错误处理 router.onError((error: Error) => { console.error('路由错误:', error) // 可以在这里添加错误上报逻辑 if (import.meta.env.PROD) { // reportError(error) } }) // 路由工具函数 export const routerUtils = { /** * 安全的路由跳转 */ async safePush(to: string | object): Promise<void> { try { await router.push(to) } catch (error) { if (error && typeof error === 'object' && 'type' in error) { const navError = error as NavigationFailure // 忽略重复导航错误 if (navError.type !== 16 /* NavigationFailureType.duplicated */) { console.error('导航失败:', navError) } } else { console.error('导航错误:', error) } } }, /** * 安全的路由替换 */ async safeReplace(to: string | object): Promise<void> { try { await router.replace(to) } catch (error) { console.error('路由替换失败:', error) } }, /** * 检查路由是否存在 */ hasRoute(name: string): boolean { return router.hasRoute(name) }, /** * 获取当前路由信息 */ getCurrentRoute() { return router.currentRoute.value }, } export default router