diff --git a/offer_frontend/src/views/portal/JobDetailView.vue b/offer_frontend/src/views/portal/JobDetailView.vue index 628a305..267e3f8 100644 --- a/offer_frontend/src/views/portal/JobDetailView.vue +++ b/offer_frontend/src/views/portal/JobDetailView.vue @@ -25,8 +25,13 @@ {{ collected ? '已收藏' : '收藏' }} - - 立即投递 + + {{ applied ? '已投递' : '立即投递' }}

登录后才能投递

@@ -107,8 +112,14 @@ {{ job.organization.email }} - - 立即投递 + + {{ applied ? '已投递' : '立即投递' }}

已投递成功

@@ -122,7 +133,7 @@ import { ref, onMounted } from 'vue' import { useRoute, useRouter } from 'vue-router' import { getJob, toggleFavorite } from '@/api/jobs' -import { applyJob } from '@/api/applications' +import { applyJob, getMyApplications } from '@/api/applications' import { useAuthStore } from '@/stores/auth' import { ElMessage } from 'element-plus' import { Location, OfficeBuilding, Star, Message } from '@element-plus/icons-vue' @@ -138,9 +149,23 @@ const collected = ref(false) onMounted(async () => { loading.value = true - const { data } = await getJob(route.params.id) - job.value = data - loading.value = false + try { + const { data } = await getJob(route.params.id) + job.value = data + + // 如果用户已登录,检查是否已投递 + if (auth.isLoggedIn && auth.isSeeker) { + try { + const { data: applications } = await getMyApplications() + // 检查该职位是否已在已投递列表中 + applied.value = applications.results?.some(app => app.job.id === parseInt(route.params.id)) || false + } catch (e) { + console.error('Failed to fetch applications:', e) + } + } + } finally { + loading.value = false + } }) function formatDate(dt) { @@ -159,6 +184,8 @@ async function toggleCollect() { async function handleApply() { if (!auth.isLoggedIn) return router.push({ name: 'Login', query: { redirect: route.fullPath } }) if (!auth.isSeeker) return ElMessage.warning('管理员账号无法投递职位') + if (applied.value) return ElMessage.warning('您已投递过该职位') + applying.value = true try { await applyJob(job.value.id) @@ -166,6 +193,7 @@ async function handleApply() { ElMessage.success('投递成功!') } catch (e) { if (e.response?.status === 400) { + applied.value = true ElMessage.warning(e.response.data?.detail || '您已投递过该职位') } else { ElMessage.error('投递失败,请先完善简历') @@ -255,10 +283,16 @@ async function handleApply() { padding: 10px 28px; font-size: 15px; } -.btn-apply:hover { +.btn-apply:hover:not(:disabled) { background: #c42820 !important; border-color: #c42820 !important; } +.btn-apply:disabled { + background: #ccc !important; + border-color: #ccc !important; + color: #fff !important; + cursor: not-allowed !important; +} .apply-hint { font-size: 12px; color: #999; @@ -445,10 +479,16 @@ async function handleApply() { color: #fff !important; font-weight: 600; } -.btn-apply-sm:hover { +.btn-apply-sm:hover:not(:disabled) { background: #c42820 !important; border-color: #c42820 !important; } +.btn-apply-sm:disabled { + background: #ccc !important; + border-color: #ccc !important; + color: #fff !important; + cursor: not-allowed !important; +} .apply-hint-sm { text-align: center; font-size: 12px;