import { createRouter, createWebHistory } from 'vue-router'; import { useAuthStore } from '@s/useAuthStore'; import { useUserInfoStore } from '@s/useUserInfoStore'; // 초기 렌더링 속도를 위해 지연 로딩 사용 const routes = [ { path: '/', name: 'Home', component: () => import('@v/MainView.vue'), meta: { requiresAuth: true }, }, { path: '/board', component: () => import('@v/board/TheBoard.vue'), meta: { requiresAuth: true }, children: [ { path: '', name: 'BoardList', component: () => import('@v/board/BoardList.vue'), }, { path: 'write', component: () => import('@v/board/BoardWrite.vue'), }, { path: ':id', name: 'BoardDetail', component: () => import('@v/board/BoardView.vue'), }, { path: 'edit/:id', name: 'BoardEdit', component: () => import('@v/board/BoardEdit.vue'), }, ], }, { path: '/mypage', name: 'MyPage', component: () => import('@v/mypage/MyPage.vue'), meta: { requiresAuth: true }, }, { path: '/wordDict', component: () => import('@v/wordDict/wordDict.vue'), meta: { requiresAuth: true }, }, { path: '/login', name: 'Login', component: () => import('@v/user/TheLogin.vue'), meta: { layout: 'NoLayout', requiresGuest: true }, }, { path: '/register', name: 'Register', component: () => import('@v/user/TheRegister.vue'), meta: { layout: 'NoLayout', requiresGuest: true }, }, { path: '/pw', name: 'Password', component: () => import('@v/user/ThePassword.vue'), meta: { layout: 'NoLayout', requiresGuest: true }, }, { path: '/vacation', name: 'Vacation', component: () => import('@v/vacation/VacationManagement.vue'), meta: { requiresAuth: true }, }, { path: '/voteboard', component: () => import('@v/voteboard/TheVoteBoard.vue'), meta: { requiresAuth: true }, children: [ { path: '', component: () => import('@v/voteboard/voteBoardList.vue'), }, { path: 'write', component: () => import('@v/voteboard/voteboardWrite.vue'), }, ], }, { path: '/projectlist', component: () => import('@v/projectlist/TheProjectList.vue'), meta: { requiresAuth: true }, }, { path: '/commuters', component: () => import('@v/commuters/TheCommuters.vue'), meta: { requiresAuth: true }, }, { path: '/authorization', component: () => import('@v/admin/TheAuthorization.vue'), meta: { requiresAuth: true }, }, { path: '/error/400', name: 'Error400', component: () => import('@v/error/Error400.vue'), meta: { layout: 'NoLayout' }, }, { path: '/error/500', name: 'Error500', component: () => import('@v/error/Error500.vue'), meta: { layout: 'NoLayout' }, }, { path: '/:anything(.*)', name: 'Error404', component: () => import('@v/error/Error404.vue'), meta: { layout: 'NoLayout' }, }, ]; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: routes, }); router.beforeEach(async (to, from, next) => { const authStore = useAuthStore(); await authStore.checkAuthStatus(); // 로그인 상태 확인 const allowedUserId = 1; // 특정 ID (변경필요!!) const userStore = useUserInfoStore(); const userId = userStore.user?.id ?? null; // 로그인이 필요한 페이지인데 로그인되지 않은 경우 → 로그인 페이지로 이동 if (to.meta.requiresAuth && !authStore.isAuthenticated) { return next({ name: 'Login', query: { redirect: to.fullPath } }); } // Authorization 페이지는 ID가 26이 아니면 접근 차단 if (to.path === '/authorization' && userId !== allowedUserId) { return next('/'); } // 비로그인 사용자만 접근 가능한 페이지인데 로그인된 경우 → 홈으로 이동 if (to.meta.requiresGuest && authStore.isAuthenticated) { return next({ name: 'Home' }); } // 모든 조건을 통과하면 정상적으로 이동 next(); }); import axios from 'axios'; axios.interceptors.response.use( response => response, error => { const status = error.response?.status; if (status === 400) { router.push({ name: 'Error400' }); } else if (status === 500) { router.push({ name: 'Error500' }); } return Promise.reject(error); }, ); export default router;