Recruitment_site/offer_frontend/src/router/index.js

72 lines
3.2 KiB
JavaScript

import { createRouter, createWebHistory } from 'vue-router'
import { useAuthStore } from '@/stores/auth'
const routes = [
// 独立入口页
{ path: '/', name: 'Splash', component: () => import('@/views/SplashView.vue') },
// 公开门户
{
path: '/',
component: () => import('@/layouts/PortalLayout.vue'),
children: [
{ path: 'home', name: 'Home', component: () => import('@/views/portal/HomeView.vue') },
{ path: 'jobs', name: 'JobList', component: () => import('@/views/portal/JobListView.vue') },
{ path: 'jobs/:id', name: 'JobDetail', component: () => import('@/views/portal/JobDetailView.vue') },
{ path: 'companies', name: 'CompanyList', component: () => import('@/views/portal/CompanyListView.vue') },
{ path: 'companies/:id', name: 'CompanyDetail', component: () => import('@/views/portal/CompanyDetailView.vue') },
]
},
{ path: '/login', name: 'Login', component: () => import('@/views/auth/LoginView.vue') },
{ path: '/register', name: 'Register', component: () => import('@/views/auth/RegisterView.vue') },
// 求职者中心
{
path: '/seeker',
component: () => import('@/layouts/SeekerLayout.vue'),
meta: { requireAuth: true, role: 'seeker' },
children: [
{ path: 'resume', name: 'SeekerResume', component: () => import('@/views/seeker/ResumeView.vue') },
{ path: 'applications', name: 'SeekerApplications', component: () => import('@/views/seeker/ApplicationsView.vue') },
{ path: 'favorites', name: 'SeekerFavorites', component: () => import('@/views/seeker/FavoritesView.vue') },
{ path: 'profile', name: 'SeekerProfile', component: () => import('@/views/seeker/ProfileView.vue') },
]
},
// 管理后台
{
path: '/admin',
component: () => import('@/layouts/AdminLayout.vue'),
meta: { requireAuth: true, role: 'admin' },
children: [
{ path: 'jobs', name: 'AdminJobs', component: () => import('@/views/admin/JobManageView.vue') },
{ path: 'applications', name: 'AdminApplications', component: () => import('@/views/admin/ApplicationManageView.vue') },
{ path: 'organizations', name: 'AdminOrganizations', component: () => import('@/views/admin/OrganizationManageView.vue'), meta: { role: 'superadmin' } },
{ path: 'users', name: 'AdminUsers', component: () => import('@/views/admin/UserManageView.vue'), meta: { role: 'superadmin' } },
]
},
{ path: '/:pathMatch(.*)*', redirect: '/' },
]
const router = createRouter({
history: createWebHistory(),
routes,
})
router.beforeEach(async (to, from, next) => {
const auth = useAuthStore()
if (to.meta.requireAuth) {
if (!localStorage.getItem('access_token')) {
return next({ name: 'Login', query: { redirect: to.fullPath } })
}
if (!auth.user) {
try { await auth.fetchMe() } catch { return next({ name: 'Login' }) }
}
const requiredRole = to.meta.role
if (requiredRole === 'seeker' && !auth.isSeeker) return next({ path: '/' })
if (requiredRole === 'admin' && !(auth.isAdmin || auth.isSuperAdmin)) return next({ path: '/' })
if (requiredRole === 'superadmin' && !auth.isSuperAdmin) return next({ path: '/admin/jobs' })
}
next()
})
export default router