|
@@ -1,41 +1,41 @@
|
|
<template>
|
|
<template>
|
|
<div>
|
|
<div>
|
|
- <div class="default-width banner px-6">
|
|
|
|
- <div class="banner-title">
|
|
|
|
- <h1 class="ellipsis">{{ info.name }}</h1>
|
|
|
|
- <span class="salary">{{ info.payFrom }}-{{ info.payTo }}/{{ positionInfo.payName }}</span>
|
|
|
|
- <span class="refresh-time">{{ timesTampChange(info.updateTime) }} 刷新 <v-icon color="warning" size="20">mdi-alert-outline</v-icon></span>
|
|
|
|
- </div>
|
|
|
|
- <div class="banner-tags mt-4">
|
|
|
|
- <span v-for="k in desc" :key="k.mdi" class="mr-10">
|
|
|
|
- <v-icon color="#666" size="20">{{ k.mdi }}</v-icon>
|
|
|
|
- <span class="ml-1">{{ positionInfo[k.value] }}</span>
|
|
|
|
- </span>
|
|
|
|
- </div>
|
|
|
|
- <div class="banner-tools my-4" style="height: 47px;">
|
|
|
|
- <div class="float-left" style="line-height: 40px;">
|
|
|
|
- <v-chip size="small" label v-for="(k, i) in info.tagList" :key="i" class="mr-1" color="primary">{{ k }}</v-chip>
|
|
|
|
- </div>
|
|
|
|
- <div class="banner-tools-btns float-right">
|
|
|
|
- <v-btn class="radius mr-2" variant="outlined" color="error" prepend-icon="mdi-share-outline" style="width: 187px; height: 36px;">分享 赚小钱赚大钱</v-btn>
|
|
|
|
- <v-btn
|
|
|
|
- class="button-item radius"
|
|
|
|
- color="warning"
|
|
|
|
- variant="outlined"
|
|
|
|
- :prepend-icon="isCollection ? 'mdi-heart' : 'mdi-heart-outline'"
|
|
|
|
- @click="handleCollection"
|
|
|
|
- >{{ isCollection ? '取消收藏': '收藏' }}</v-btn>
|
|
|
|
- <v-btn class="button-item mx-2 radius" color="success" variant="outlined">立即沟通</v-btn>
|
|
|
|
- <v-btn class="button-item radius" color="primary" variant="outlined">投递简历</v-btn>
|
|
|
|
- </div>
|
|
|
|
|
|
+ <div class="default-width banner px-6">
|
|
|
|
+ <div class="banner-title">
|
|
|
|
+ <h1 class="ellipsis">{{ info.name }}</h1>
|
|
|
|
+ <span class="salary">{{ info.payFrom }}-{{ info.payTo }}/{{ positionInfo.payName }}</span>
|
|
|
|
+ <span class="refresh-time">{{ timesTampChange(info.updateTime) }} {{ $t('common.refresh') }} <v-icon color="warning" size="20">mdi-alert-outline</v-icon></span>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="banner-tags mt-4">
|
|
|
|
+ <span v-for="k in desc" :key="k.mdi" class="mr-10">
|
|
|
|
+ <v-icon color="#666" size="20">{{ k.mdi }}</v-icon>
|
|
|
|
+ <span class="ml-1">{{ positionInfo[k.value] }}</span>
|
|
|
|
+ </span>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="banner-tools my-4">
|
|
|
|
+ <v-chip size="small" label v-for="(k, i) in info.tagList" :key="i" class="mr-1" color="primary">{{ k }}</v-chip>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="d-flex justify-end mb-5">
|
|
|
|
+ <div class="banner-tools-btns">
|
|
|
|
+ <v-btn class="radius mr-2" variant="outlined" color="error" prepend-icon="mdi-share-outline" style="width: 187px; height: 36px;">分享 赚小钱赚大钱</v-btn>
|
|
|
|
+ <v-btn
|
|
|
|
+ class="button-item radius"
|
|
|
|
+ color="warning"
|
|
|
|
+ variant="outlined"
|
|
|
|
+ :prepend-icon="isCollection ? 'mdi-heart' : 'mdi-heart-outline'"
|
|
|
|
+ @click="handleCollection"
|
|
|
|
+ >{{ isCollection ? $t('position.cancelFavorite') : $t('position.collection') }}</v-btn>
|
|
|
|
+ <v-btn class="button-item mx-2 radius" color="success" variant="outlined">{{ $t('position.communicate') }}</v-btn>
|
|
|
|
+ <v-btn class="button-item radius" color="primary" variant="outlined" @click="handleDelivery">{{ $t('position.submitResume') }}</v-btn>
|
|
</div>
|
|
</div>
|
|
- <v-divider></v-divider>
|
|
|
|
- <div class="d-flex">
|
|
|
|
|
|
+ </div>
|
|
|
|
+ <v-divider></v-divider>
|
|
|
|
+ <div class="d-flex">
|
|
<div class="content-left">
|
|
<div class="content-left">
|
|
<div v-if="Object.keys(info).length">
|
|
<div v-if="Object.keys(info).length">
|
|
- <div>岗位职责:</div>
|
|
|
|
|
|
+ <div>{{ $t('position.jobResponsibilities') }}:</div>
|
|
<div class="requirement" v-html="info.content.replace(/\n/g, '</br>')"></div>
|
|
<div class="requirement" v-html="info.content.replace(/\n/g, '</br>')"></div>
|
|
- <div class="mt-3">岗位要求:</div>
|
|
|
|
|
|
+ <div class="mt-3">{{ $t('position.jobRequirements') }}:</div>
|
|
<div class="requirement" v-html="info.requirement.replace(/\n/g, '</br>')"></div>
|
|
<div class="requirement" v-html="info.requirement.replace(/\n/g, '</br>')"></div>
|
|
</div>
|
|
</div>
|
|
<v-divider class="my-3"></v-divider>
|
|
<v-divider class="my-3"></v-divider>
|
|
@@ -48,20 +48,20 @@
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="float-right">
|
|
<div class="float-right">
|
|
- <v-chip color="primary" label>当前在线</v-chip>
|
|
|
|
|
|
+ <v-chip color="primary" label>{{ $t('position.currentOnline') }}</v-chip>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<v-divider class="my-3"></v-divider>
|
|
<v-divider class="my-3"></v-divider>
|
|
<div>
|
|
<div>
|
|
- <h4>工作地址</h4>
|
|
|
|
|
|
+ <h4>{{ $t('position.address') }}</h4>
|
|
<div class="mt-1">
|
|
<div class="mt-1">
|
|
<v-icon size="25" color="primary">mdi-map-marker</v-icon>
|
|
<v-icon size="25" color="primary">mdi-map-marker</v-icon>
|
|
<span style="color: #666;font-size: 15px;">{{ info.address }}</span>
|
|
<span style="color: #666;font-size: 15px;">{{ info.address }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="mt-3 text-center">
|
|
<div class="mt-3 text-center">
|
|
- <v-btn class="half-button mr-2 radius" color="success" variant="outlined">立即沟通</v-btn>
|
|
|
|
- <v-btn class="half-button radius" color="primary">投递简历</v-btn>
|
|
|
|
|
|
+ <v-btn class="mr-2 radius" color="success" variant="outlined">{{ $t('position.communicate') }}</v-btn>
|
|
|
|
+ <v-btn class="radius" color="primary" @click="handleDelivery">{{ $t('position.submitResume') }}</v-btn>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="content-right" v-if="Object.keys(info).length">
|
|
<div class="content-right" v-if="Object.keys(info).length">
|
|
@@ -70,8 +70,29 @@
|
|
<!-- 相似职位 -->
|
|
<!-- 相似职位 -->
|
|
<similarPositions class="mt-3" :list="similarList" :info="info"></similarPositions>
|
|
<similarPositions class="mt-3" :list="similarList" :info="info"></similarPositions>
|
|
</div>
|
|
</div>
|
|
- </div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <!-- 弹窗提示去上传简历 -->
|
|
|
|
+ <v-dialog v-model="dialog" max-width="400" persistent>
|
|
|
|
+ <v-card :text="$t('resume.resumeYetSubmit')" :title="$t('common.confirmTitle')">
|
|
|
|
+ <template #prepend>
|
|
|
|
+ <v-icon color="warning">mdi-alert-circle-outline</v-icon>
|
|
|
|
+ </template>
|
|
|
|
+ <template v-slot:actions>
|
|
|
|
+ <v-spacer></v-spacer>
|
|
|
|
+ <v-btn @click="dialog = false">{{ $t('common.cancel') }}</v-btn>
|
|
|
|
+ <v-btn color="success" @click="handleToUpload">{{ $t('common.toUpload') }}</v-btn>
|
|
|
|
+ </template>
|
|
|
|
+ </v-card>
|
|
|
|
+ </v-dialog>
|
|
|
|
+
|
|
|
|
+ <!-- 选择简历 -->
|
|
|
|
+ <Dialog :visible="showResume" :widthType="2" :title="$t('resume.selectResumeToSubmit')" @close="handleClose" @submit="handleSubmit">
|
|
|
|
+ <v-radio-group v-model="selectResume">
|
|
|
|
+ <v-radio v-for="val in resumeList" :key="val.id" :value="val.id" :label="val.title" color="primary"></v-radio>
|
|
|
|
+ </v-radio-group>
|
|
|
|
+ </Dialog>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
@@ -80,11 +101,16 @@ defineOptions({ name: 'position-details' })
|
|
import { ref } from 'vue'
|
|
import { ref } from 'vue'
|
|
import { useRouter } from 'vue-router'
|
|
import { useRouter } from 'vue-router'
|
|
import { timesTampChange } from '@/utils/date'
|
|
import { timesTampChange } from '@/utils/date'
|
|
-import { getPositionDetails, getSimilarPosition, getJobFavoriteCheck, getPersonJobFavorite, getPersonJobUnfavorite } from '@/api/position'
|
|
|
|
|
|
+import { getPersonResumeCv } from '@/api/resume'
|
|
|
|
+import { useI18n } from '@/hooks/web/useI18n'
|
|
|
|
+import { getPositionDetails, getSimilarPosition, getJobFavoriteCheck, getPersonJobFavorite, getPersonJobUnfavorite, jobCvRelCheckSend, jobCvRelSend } from '@/api/position'
|
|
import { dealDictData } from '@/views/recruit/position/components/dict'
|
|
import { dealDictData } from '@/views/recruit/position/components/dict'
|
|
import similarPositions from '@/components/Position/similarPositions.vue'
|
|
import similarPositions from '@/components/Position/similarPositions.vue'
|
|
import EnterpriseInfo from '@/components/Enterprise/info.vue'
|
|
import EnterpriseInfo from '@/components/Enterprise/info.vue'
|
|
|
|
+import Snackbar from '@/plugins/snackbar'
|
|
|
|
+import Dialog from '@/components/CtDialog'
|
|
|
|
|
|
|
|
+const { t } = useI18n()
|
|
const router = useRouter()
|
|
const router = useRouter()
|
|
const { id } = router.currentRoute.value.params
|
|
const { id } = router.currentRoute.value.params
|
|
|
|
|
|
@@ -129,6 +155,44 @@ const handleCollection = async () => {
|
|
await api(isCollection.value ? id : { jobId: id })
|
|
await api(isCollection.value ? id : { jobId: id })
|
|
getCollectionStatus()
|
|
getCollectionStatus()
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+const dialog = ref(false)
|
|
|
|
+const showResume = ref(false)
|
|
|
|
+// 去上传附件
|
|
|
|
+const handleToUpload = () => {
|
|
|
|
+ dialog.value = false
|
|
|
|
+ window.open('/personalCenter')
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 效验是否有投递简历
|
|
|
|
+const resumeList = ref([])
|
|
|
|
+const selectResume = ref()
|
|
|
|
+const handleDelivery = async () => {
|
|
|
|
+ const data = await jobCvRelCheckSend({ jobId: id })
|
|
|
|
+ if (data) return Snackbar.warning(t('resume.alreadyResume'))
|
|
|
|
+ const result = await getPersonResumeCv()
|
|
|
|
+ resumeList.value = result
|
|
|
|
+ // 没有上传过简历的先去上传
|
|
|
|
+ if (!result.length) {
|
|
|
|
+ dialog.value = true
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ showResume.value = true
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 简历投递
|
|
|
|
+const handleClose = () => {
|
|
|
|
+ showResume.value = false
|
|
|
|
+ selectResume.value = null
|
|
|
|
+}
|
|
|
|
+const handleSubmit = async () =>{
|
|
|
|
+ if (!selectResume.value) return Snackbar.warning(t('resume.selectResumeToSubmit'))
|
|
|
|
+ const obj = resumeList.value.find(e => e.id === selectResume.value)
|
|
|
|
+ if (!obj) return Snackbar.warning(t('resume.selectedResumeNotExist'))
|
|
|
|
+ await jobCvRelSend({ jobId: id, title: obj.title, url: obj.url })
|
|
|
|
+ Snackbar.success(t('resume.deliverySuccess'))
|
|
|
|
+ handleClose()
|
|
|
|
+}
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
<style lang="scss" scoped>
|
|
@@ -151,7 +215,7 @@ const handleCollection = async () => {
|
|
vertical-align: middle;
|
|
vertical-align: middle;
|
|
}
|
|
}
|
|
.button-item {
|
|
.button-item {
|
|
- width: 110px;
|
|
|
|
|
|
+ min-width: 110px;
|
|
height: 36px
|
|
height: 36px
|
|
}
|
|
}
|
|
.salary {
|
|
.salary {
|
|
@@ -176,7 +240,7 @@ const handleCollection = async () => {
|
|
border-radius: 8px;
|
|
border-radius: 8px;
|
|
}
|
|
}
|
|
.content-left {
|
|
.content-left {
|
|
- width: 864px;
|
|
|
|
|
|
+ width: 810px;
|
|
padding: 20px 20px;
|
|
padding: 20px 20px;
|
|
}
|
|
}
|
|
.content-right {
|
|
.content-right {
|