Xiao_123 9 hónapja
szülő
commit
ec9b4866b0

+ 1 - 0
components.d.ts

@@ -25,6 +25,7 @@ declare module 'vue' {
     Details: typeof import('./src/components/Enterprise/details.vue')['default']
     Echarts: typeof import('./src/components/Echarts/index.vue')['default']
     Empty: typeof import('./src/components/Empty/index.vue')['default']
+    File: typeof import('./src/components/Upload/file.vue')['default']
     HeadSearch: typeof import('./src/components/headSearch/index.vue')['default']
     HotPromoted: typeof import('./src/components/Enterprise/hotPromoted.vue')['default']
     Img: typeof import('./src/components/Upload/img.vue')['default']

+ 56 - 0
src/components/Upload/file.vue

@@ -0,0 +1,56 @@
+<template>
+  <input type="file" ref="fileInput" :accept="accept" style="display: none;" @change="handleUploadFile"/>
+</template>
+
+<script setup>
+defineOptions({ name: 'upload-file'})
+import { ref } from 'vue'
+import Snackbar from '@/plugins/snackbar'
+import { useI18n } from '@/hooks/web/useI18n'
+import { uploadFile } from '@/api/common'
+
+const emits = defineEmits(['success'])
+defineProps({
+  accept: {
+    type: String,
+    default: '.pdf, .doc, .docx'
+  }
+})
+
+const { t } = useI18n()
+
+const clicked = ref(false)
+const fileInput = ref()
+
+const trigger = () => {
+  if (clicked.value) return
+  clicked.value = true
+  fileInput.value.click()
+  clicked.value = false
+}
+
+const handleUploadFile = async (e) => {
+  if (!e.target.files.length) return
+
+  const file = e.target.files[0]
+  const size = file.size
+  if (size / (1024*1024) > 10) {
+    Snackbar.warning(t('common.fileSizeExceed'))
+    return
+  }
+  const arr = file.name.split('.')
+  const formData = new FormData()
+  formData.append('file', file)
+  const { data } = await uploadFile(formData)
+  if (!data) return
+  emits('success', data, arr[0])
+}
+
+defineExpose({
+  trigger
+})
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 1 - 1
src/views/recruit/components/message/components/chatting.vue

@@ -17,7 +17,7 @@
           <span class="name">{{ info.name }}</span>
           <template v-if="info.enterpriseId">
             <span>{{ info.postNameCn }}</span>
-            <span class="septal-line"></span>
+            <span v-if="info.postNameCn && info.enterpriseName" class="septal-line"></span>
             <span>{{ info.enterpriseName }}</span>
           </template>
         </p>

+ 21 - 0
src/views/recruit/components/message/index.vue

@@ -109,6 +109,8 @@
     </div>
   </div>
 
+  <File ref="uploadFile" @success="handleUploadResume"></File>
+
   <CtDialog :visible="showInvite" :widthType="2" titleClass="text-h6" title="邀请面试" @close="showInvite = false" @submit="handleSubmit">
     <InvitePage v-if="showInvite" ref="inviteRef" :item-data="itemData" :position="positionList"></InvitePage>
   </CtDialog>
@@ -143,6 +145,7 @@ import { getUserAvatar } from '@/utils/avatar'
 import { getJobAdvertised } from '@/api/enterprise'
 import { dealDictArrayData } from '@/utils/position'
 import { saveInterviewInvite } from '@/api/recruit/enterprise/interview'
+import { savePersonResumeCv } from '@/api/recruit/personal/resume'
 import { useI18n } from '@/hooks/web/useI18n'
 import { userInterviewInviteReject, userInterviewInviteConsent } from '@/api/recruit/personal/personalCenter'
 import { getPersonResumeCv } from '@/api/recruit/personal/resume'
@@ -175,6 +178,7 @@ const itemData = ref({})
 const inviteRef = ref()
 
 // 发送简历
+const uploadFile = ref()
 const showResume = ref(false)
 const resumeList = ref([])
 const selectResume = ref(null)
@@ -309,6 +313,7 @@ async function handleSendResume (item) {
     const result = await getPersonResumeCv()
     if (result.length === 0) {
       Snackbar.error(t('resume.resumeYetSubmit'))
+      uploadFile.value.trigger()
       return
     }
     resumeList.value = result
@@ -329,6 +334,22 @@ async function handleSendResume (item) {
  *        3 => 信息描述
  * }
  */
+
+// 没有上传过简历的弹窗上传并发送给对方
+const handleUploadResume = async (url, title) => {
+  if (!url || !title) return
+  await savePersonResumeCv({ title, url })
+  const text = {
+    remark: '发送简历',
+    query: {
+      src: url,
+      title
+    },
+    type: 1
+  }
+  send (JSON.stringify(text), channelItem.value, 105)
+}
+
 function handleSubmitResume () {
   if (!selectResume.value) {
     Snackbar.error(t('resume.selectResumeToSubmit'))

+ 6 - 34
src/views/recruit/personal/PersonalCenter/dynamic/right.vue

@@ -32,13 +32,7 @@
         <span class="title">{{ $t('resume.attachmentResume') }}</span>
         <span class="upload--text cursor-pointer" @click="openFileInput">
           {{ $t('common.upload') }}
-          <input
-            type="file"
-            ref="fileInput"
-            accept=".pdf, .doc, .docx"
-            style="display: none;"
-            @change="handleUploadFile"
-          />
+          <File ref="uploadFile" @success="handleUploadResume"></File>
         </span>
       </div>
       <span class="more-text">{{ $t('resume.uploadUpToFiveCopies') }}</span>
@@ -68,7 +62,6 @@
 <script setup>
 defineOptions({ name: 'personal-center-right'})
 import { ref } from 'vue'
-import { uploadFile } from '@/api/common'
 import { previewFile } from '@/utils'
 import { useRouter } from 'vue-router'
 import { useRoute } from 'vue-router'; const route = useRoute()
@@ -95,7 +88,6 @@ userStore.$subscribe((mutation, state) => {
 })
 
 const resumeList = ref([
-  // { icon: 'mdi-upload', title: t('resume.topResume'), desc: t('resume.increaseMoreExposure') },
   { name: 'refresh', icon: 'mdi-refresh', title: t('resume.refreshResume'), desc: t('resume.enhanceResumeActivity') },
   { name: 'interview', icon: 'mdi-account-multiple-check-outline', title: t('resume.interviewSchedule'), desc: '' },
 ])
@@ -116,37 +108,17 @@ const getList = async () => {
 getList()
 
 // 选择文件
-const fileInput = ref()
-const clicked = ref(false)
+const uploadFile = ref()
 const openFileInput = () => {
   if (attachmentList.value.length >= 5) return Snackbar.warning(t('resume.uploadFiveCopies'))
-  if (clicked.value) return
-  clicked.value = true
-  fileInput.value.click()
-  clicked.value = false
+  uploadFile.value.trigger()
 }
 
 // 上传附件
-const typeList = ['pdf', 'doc', 'docx']
-const handleUploadFile = async (e) => {
-  if (!e.target.files.length) return
-  const file = e.target.files[0]
-  const size = file.size
-  if (size / (1024*1024) > 10) {
-    Snackbar.warning(t('common.fileSizeExceed'))
-    return
-  }
-  const arr = file.name.split('.')
-  if (typeList.indexOf(arr[arr.length - 1]) < 0) {
-    Snackbar.warning(t('common.fileFormatIncorrect'))
-    return
-  }
-  const formData = new FormData()
-  formData.append('file', file)
-  const { data } = await uploadFile(formData)
-  if (!data) return
+const handleUploadResume = async (url, title) => {
+  if (!url || !title) return
   Snackbar.success(t('common.uploadSucMsg'))
-  await savePersonResumeCv({ title: file.name, url: data })
+  await savePersonResumeCv({ title, url })
   getList()
 }
 

+ 10 - 32
src/views/recruit/personal/position/components/details.vue

@@ -79,9 +79,6 @@
                     {{ info.contact.postNameCn }}</div>
                 </div>
               </div>
-              <!-- <div class="float-right">
-                <v-chip color="primary" label>{{ $t('position.currentOnline') }}</v-chip>
-              </div> -->
             </div>
             <v-divider class="my-3"></v-divider>
             <div>
@@ -113,7 +110,7 @@
     </div>
 
     <!-- 简历上传 -->
-    <input type="file" ref="fileInput" accept=".pdf, .doc, .docx" style="display: none;" @change="handleUploadFile"/>
+    <File ref="uploadFile" @success="handleUploadResume"></File>
 
     <!-- 选择简历 -->
     <selectResumeDialog v-model="showResume" :list="resumeList" @submit="handleSubmit" @close="handleClose"></selectResumeDialog>
@@ -150,8 +147,7 @@ defineOptions({ name: 'position-details' })
 import { computed, ref } from 'vue'
 import { useRouter } from 'vue-router'
 import { timesTampChange } from '@/utils/date'
-import { uploadFile } from '@/api/common'
-import { getPersonResumeCv } from '@/api/recruit/personal/resume'
+import { getPersonResumeCv, savePersonResumeCv } from '@/api/recruit/personal/resume'
 import { useI18n } from '@/hooks/web/useI18n'
 import { getPositionDetails, getSimilarPosition, getJobFavoriteCheck, getPersonJobFavorite, getPersonJobUnfavorite, jobCvRelCheckSend, jobCvRelSend } from '@/api/position'
 import { dealDictObjData, dealDictArrayData } from '@/utils/position'
@@ -247,26 +243,13 @@ const handleCollection = async () => {
 }
 
 // 投递简历时,若当前用户没有简历列表则弹窗上传简历以及投递
-const typeList = ['pdf', 'doc', 'docx']
-const handleUploadFile = async (e) => {
-  if (!e.target.files.length) return
-  const file = e.target.files[0]
-  const size = file.size
-  if (size / (1024*1024) > 10) {
-    Snackbar.warning(t('common.fileSizeExceed'))
-    return
-  }
-  const arr = file.name.split('.')
-  if (typeList.indexOf(arr[arr.length - 1]) < 0) {
-    Snackbar.warning(t('common.fileFormatIncorrect'))
-    return
-  }
-  const formData = new FormData()
-  formData.append('file', file)
-  const { data } = await uploadFile(formData)
-  if (!data) return
-
-  await jobCvRelSend({ jobId: id, title: arr[0], url: data, type: info.value.hire ? 1 : 0 })
+const uploadFile = ref()
+const handleUploadResume = async (url, title) => {
+  if (!url || !title) return
+  // 简历上传
+  await savePersonResumeCv({ title, url })
+  // 简历投递
+  await jobCvRelSend({ jobId: id, title, url, type: info.value.hire ? 1 : 0 })
   setTimeout(() => {
     Snackbar.success(t('resume.deliverySuccess'))
     deliveryCheck()
@@ -274,8 +257,6 @@ const handleUploadFile = async (e) => {
 }
 
 const showResume = ref(false)
-const clicked = ref(false)
-const fileInput = ref()
 
 // 效验是否有投递简历
 const resumeList = ref([])
@@ -287,10 +268,7 @@ const handleDelivery = async () => {
   // 没有上传过简历的先去上传
   if (!result.length) {
     Snackbar.warning('您还未上传过简历,请先上传简历')
-    if (clicked.value) return
-    clicked.value = true
-    fileInput.value.click()
-    clicked.value = false
+    uploadFile.value.trigger()
     return
   }
   showResume.value = true

+ 11 - 7
src/views/recruit/personal/position/components/rightRecommend.vue

@@ -1,15 +1,18 @@
 <template>
   <v-card class="position-box">
     <h4 class="h4 mb-3">{{ $t('position.recommend') }}</h4>
-    <div v-for="(item, index) in items" :key="index" class="mb-2 cursor-pointer" @click="handlePosition(item)">
-      <p class="recruit-name">{{ item.name }}</p>
-      <span class="recruit-salary">{{ item.payFrom }}-{{ item.payTo }}/{{ item.payName }}</span>
-      <div :class="['enterprise', {'border-bottom-dashed': index !== items.length - 1}]" @click="handleEnterprise(item)">
-        <v-img class="float-left" :src="item.logoUrl || 'https://minio.citupro.com/dev/menduner/company-avatar.png'" :width="30" :height="30"></v-img>
-        <span class="float-left enterprise-name">{{ item.anotherName }}</span>
-        <span class="float-right enterprise-address">{{ item.areaName }}</span>
+    <div v-if="items.length">
+      <div v-for="(item, index) in items" :key="index" class="mb-2 cursor-pointer" @click="handlePosition(item)">
+        <p class="recruit-name">{{ item.name }}</p>
+        <span class="recruit-salary">{{ item.payFrom }}-{{ item.payTo }}/{{ item.payName }}</span>
+        <div :class="['enterprise', {'border-bottom-dashed': index !== items.length - 1}]" @click="handleEnterprise(item)">
+          <v-img class="float-left" :src="item.logoUrl || 'https://minio.citupro.com/dev/menduner/company-avatar.png'" :width="30" :height="30"></v-img>
+          <span class="float-left enterprise-name">{{ item.anotherName }}</span>
+          <span class="float-right enterprise-address">{{ item.areaName }}</span>
+        </div>
       </div>
     </div>
+    <Empty v-else :elevation="false" message="暂无推荐职位"></Empty>
   </v-card>
 </template>
 
@@ -23,6 +26,7 @@ const items = ref([])
 
 const getList = async () => {
   const { list } = await getPromotedPosition({ pageSize: 10, pageNo: 1 })
+  if (!list.length) return items.value = []
   items.value = dealDictArrayData([], list)
 }
 getList()