- 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;
|