import { createRouter, createWebHistory } from 'vue-router'; import { AUTH_INJECTION_KEY } from '../components/auth/AuthProvider.vue'; import layout from '../layout/index.vue'; const routes = [ { path: '/', name: 'layout', component: layout, children: [ { path: '', name: 'Home', component: () => import('../views/home/Home.vue') }, { path: 'book/:id', name: 'BookDetail', component: () => import('../views/book/index.vue'), props: true }, { path: 'book/:id/chapter/:chapterId', name: 'ChapterDetail', component: () => import('../views/book/chapter.vue'), props: true }, { path: 'category', name: 'Category', component: () => import('../views/home/category.vue'), props: true }, { path: 'category/:id', name: 'CategoryDetail', component: () => import('../views/home/category.vue'), props: true }, { path: 'ranking', name: 'ranking', component: () => import('../views/home/ranking.vue') }, { path: 'bookshelf', name: 'Bookshelf', component: () => import('../views/home/Bookshelf.vue'), meta: { requiresAuth: true } }, { path: 'author', name: 'authorCenter', component: () => import('../views/author/AuthorCenter.vue'), meta: { requiresAuth: true, requiresAuthor: true }, redirect: { name: 'authorWorks' }, children: [ { path: 'works', name: 'authorWorks', component: () => import('../views/author/components/WorksManagement.vue'), meta: { requiresAuth: true, requiresAuthor: true } }, { path: 'readers', name: 'authorReaders', component: () => import('../views/author/components/ReadersManagement.vue'), meta: { requiresAuth: true, requiresAuthor: true } } ] }, { path: 'author/work/create', name: 'createWork', component: () => import('../views/author/CreateWork.vue'), meta: { requiresAuth: true, requiresAuthor: true } }, { path: 'author/work/:id/setup', name: 'workSetup', component: () => import('../views/author/WorkSetup.vue'), meta: { requiresAuth: true, requiresAuthor: true } }, { path: 'author/work/:id/edit', name: 'workEdit', component: () => import('../views/author/WorkEdit.vue'), meta: { requiresAuth: true, requiresAuthor: true } } ] }, { path: '/:pathMatch(.*)*', name: 'NotFound', component: () => import('../views/NotFound.vue') } ]; const router = createRouter({ history: createWebHistory(), routes }); // 创建一个事件总线用于通信 export const routerEvents = { triggerLogin: null }; // 全局路由守卫 router.beforeEach((to, from, next) => { // 调试信息 console.log('[Router] 路由切换:', { from: from.path, to: to.path, meta: to.meta }); // 首先尝试从localStorage获取登录和作家状态 const token = localStorage.getItem('token'); const isLoggedIn = !!token; const isAuthor = localStorage.getItem('isAuthor') === 'true'; // 输出当前状态 console.log('[Router] 当前状态:', { isLoggedIn, isAuthor }); // 获取路由需要的权限 const requiresAuth = to.matched.some(record => record.meta.requiresAuth); const requiresAuthor = to.matched.some(record => record.meta.requiresAuthor); // 如果路由不需要任何权限,直接放行 if (!requiresAuth && !requiresAuthor) { next(); return; } // 处理需要登录的路由 if (requiresAuth && !isLoggedIn) { const targetRoute = to.fullPath; console.log('[Router] 需要登录权限,未登录,跳转到首页'); // 尝试调用登录弹窗 setTimeout(() => { const authContext = window.$authContext; if (authContext && typeof authContext.openLogin === 'function') { authContext.openLogin(() => { // 登录成功后导航到原来想要去的页面 router.push(targetRoute); }); } else { // 如果authContext还未挂载,则设置事件供之后触发 routerEvents.triggerLogin = () => { const context = window.$authContext; if (context && typeof context.openLogin === 'function') { context.openLogin(() => { router.push(targetRoute); }); } }; } }, 0); // 跳转到首页 next({ path: '/' }); return; } // 处理需要作家权限的路由 if (requiresAuthor) { // 如果已经是作家,直接放行 if (isAuthor) { console.log('[Router] 需要作家权限,已是作家,直接放行'); next(); return; } console.log('[Router] 需要作家权限,非作家,跳转到首页'); // 未登录或不是作家,需要先登录再申请成为作家 if (!isLoggedIn) { const targetRoute = to.fullPath; setTimeout(() => { const authContext = window.$authContext; if (authContext && typeof authContext.openLogin === 'function') { authContext.openLogin(() => { // 登录成功后显示作家申请 const authorContext = window.$authorApplicationContext; if (authorContext && typeof authorContext.openApplicationModal === 'function') { authorContext.openApplicationModal(() => { // 申请成功后导航到作家专区 router.push(targetRoute); }); } }); } }, 0); } else { // 已登录但不是作家,直接显示作家申请 setTimeout(() => { const authorContext = window.$authorApplicationContext; if (authorContext && typeof authorContext.openApplicationModal === 'function') { authorContext.openApplicationModal(() => { // 申请成功后导航到作家专区 router.push(to.fullPath); }); } }, 0); } // 跳转到首页 next({ path: '/' }); return; } // 通过所有检查 console.log('[Router] 通过所有权限检查'); next(); }); export default router;