小说网站前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

220 lines
7.6 KiB

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;