index.js 4.21 KB
/*
 * @Date: 2025-03-20 20:36:36
 * @LastEditors: hookehuyr hookehuyr@gmail.com
 * @LastEditTime: 2025-03-21 16:25:52
 * @FilePath: /mlaj/src/router/index.js
 * @Description: 文件描述
 */
import { createRouter, createWebHashHistory } from 'vue-router'
import checkinRoutes from './checkin'

const routes = [
  {
    path: '/',
    name: 'HomePage',
    component: () => import('../views/HomePage.vue'),
    meta: { title: '美乐爱觉' },
  },
  {
    path: '/courses',
    name: 'Courses',
    component: () => import('../views/courses/CoursesPage.vue'),
    meta: { title: '课程' },
  },
  {
    path: '/courses/:id',
    name: 'CourseDetail',
    component: () => import('../views/courses/CourseDetailPage.vue'),
    meta: { title: '课程详情' },
  },
  {
    path: '/courses/:id/reviews',
    name: 'CourseReviews',
    component: () => import('../views/courses/CourseReviewsPage.vue'),
    meta: { title: '课程评价' }
  },
  {
    path: '/courses-list',
    name: 'CourseList',
    component: () => import('../views/courses/CourseListPage.vue'),
    meta: { title: '课程列表' }
  },
  {
    path: '/profile',
    name: 'Profile',
    component: () => import('../views/profile/ProfilePage.vue'),
    meta: { title: '个人中心' },
  },
  {
    path: '/login',
    name: 'Login',
    component: () => import('../views/auth/LoginPage.vue'),
    meta: { title: '登录' }
  },
  {
    path: '/register',
    name: 'Register',
    component: () => import('../views/auth/RegisterPage.vue'),
    meta: { title: '注册' }
  },
  {
    path: '/forgotPwd',
    name: 'ForgotPassword',
    component: () => import('../views/auth/ForgotPasswordPage.vue'),
    meta: { title: '忘记密码' }
  },
  {
    path: '/activities',
    name: 'Activities',
    component: () => import('../views/activities/ActivitiesPage.vue'),
    meta: { title: '活动列表' }
  },
  {
    path: '/activities/:id',
    name: 'ActivityDetail',
    component: () => import('../views/activities/ActivityDetailPage.vue'),
    props: true,
    meta: { title: '活动详情' }
  },
  {
    path: '/activities/:id/signup',
    name: 'ActivitySignup',
    component: () => import('../views/activities/ActivitySignupPage.vue'),
    meta: {
      title: '活动报名'
    }
  },
  {
    path: '/profile/activities',
    name: 'MyActivities',
    component: () => import('../views/activities/MyActivitiesPage.vue'),
    meta: { title: '我的活动' }
  },
  {
    path: '/checkout',
    name: 'CheckoutPage',
    component: () => import('../views/checkout/CheckoutPage.vue'),
    props: true,
    meta: { title: '结账' }
  },
  {
    path: '/profile/courses',
    name: 'MyCourses',
    component: () => import('../views/courses/MyCoursesPage.vue'),
    meta: { title: '我的课程' }
  },
  {
    path: '/profile/orders',
    name: 'Orders',
    component: () => import('../views/profile/OrdersPage.vue'),
    meta: { title: '我的订单' }
  },
  {
    path: '/profile/favorites',
    name: 'MyFavorites',
    component: () => import('../views/profile/MyFavoritesPage.vue'),
    meta: { title: '我的收藏' }
  },
  {
    path: '/test',
    name: 'test',
    component: () => import('../views/test.vue'),
    meta: { title: 'test' }
  },
  ...checkinRoutes
]

const router = createRouter({
  history: createWebHashHistory(import.meta.env.VITE_BASE || '/'),
  routes,
  scrollBehavior(to, from, savedPosition) {
    // 每次路由切换后,页面滚动到顶部
    return savedPosition || { top: 0, left: 0 }
  }
})

// TAG: 需要登录才能访问的路由
const authRequiredRoutes = [
  '/profile',
  '/profile/activities',
  '/profile/courses',
  '/profile/orders',
  '/profile/favorites',
  '/checkout'
]

// 导航守卫
router.beforeEach((to, from, next) => {
  const currentUser = JSON.parse(localStorage.getItem('currentUser'))

  // 如果是登录页面且有redirect参数,未登录用户直接跳转到首页
  if (to.path === '/login' && to.query.redirect && !currentUser) {
    next('/')
    return
  }

  // 检查是否需要认证
  if (authRequiredRoutes.some(route => to.path.startsWith(route))) {
    if (!currentUser) {
      // 未登录时重定向到登录页面
      next({ path: '/login', query: { redirect: to.fullPath } })
      return
    }
  }

  next()
})

export default router