72 lines
3.2 KiB
JavaScript
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
|