Browse Source

人才库详情

lifanagju_citu 11 tháng trước cách đây
mục cha
commit
ee7cf45431

+ 10 - 2
src/views/enterprise/talentPool/components/details.vue

@@ -32,12 +32,17 @@
       <!-- 培训经历 -->
       <div class="d-flex mt-8">
         <span class="mr-6">{{ $t('resume.trainingExperience') }}</span>
-        <!-- <trainingExperience style="flex: 1;"></trainingExperience> -->
+        <trainingExperience style="flex: 1;"></trainingExperience>
       </div>
       <!-- 教育经历 -->
       <div class="d-flex mt-8">
         <span class="mr-6">{{ $t('resume.educationExp') }}</span>
-        <!-- <educationExp style="flex: 1;"></educationExp> -->
+        <educationExp style="flex: 1;"></educationExp>
+      </div>
+      <!-- 附件简历 -->
+      <div class="d-flex mt-8">
+        <span class="mr-6">{{ $t('resume.attachmentResume') }}</span>
+        <attachmentResume style="flex: 1;"></attachmentResume>
       </div>
       <!--  -->
     </div>
@@ -63,6 +68,9 @@ import vocationalSkills from './details/vocationalSkills.vue'
 import jobIntention from './details/jobIntention.vue'
 import workExperience from './details/workExperience.vue'
 import projectExperience from './details/projectExperience.vue'
+import trainingExperience from './details/trainingExperience.vue'
+import educationExp from './details/educationExp.vue'
+import attachmentResume from './details/attachmentResume.vue'
 defineOptions({name: 'enterprise-talentPool-details'})
 
 const advantage = "1、熟悉 Java  技术平台,并稳定形成生产力,CCF 中国计算机学会会员,获得微软 MCP、MCSA 认证。 \n2、熟悉通用缓存/DB /搜索引擎/消息队列等中间件。对业内高可用高并发及分布式技术解决方案有充分理解。\n3、同时具备常用大数据解决方案实践经验,包括实时计算(Storm/Flink )及离线计算(Hive/ETL/Spark)。 \n4、对搜索推荐/订单交易等业务方向具备多年实践经验。\n5、上班。"

+ 77 - 0
src/views/enterprise/talentPool/components/details/attachmentResume.vue

@@ -0,0 +1,77 @@
+<template>
+  <div>
+    <div class="d-flex attachment-item mb-2 cursor-pointer" v-for="k in attachmentList" :key="k.id">
+      <v-icon color="primary">mdi-file-account</v-icon>
+      <div class="file-name ellipsis ml-2">{{ k.title }}</div>
+      <v-icon color="primary" @click="previewFile(k.url)">mdi-eye-outline</v-icon>
+      <v-icon class="mx-2" color="primary" @click="handleDownload(k)">mdi-download-box-outline</v-icon>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ref } from 'vue'
+import { previewFile } from '@/utils'
+defineOptions({name: 'enterprise-talentPool-details-attachmentResume'})
+
+const attachmentList = ref([
+  {
+    id: "1797473178549903362", 
+    title: "林同学-Java-15875754758.docx", 
+    url: "http://menduner.citupro.com:6868/admin-api/infra/file/24/get/725800ca45aced6c9742e94f576051c8c2527cd49b332c15be2dfbf17daedb92.docx", 
+    createTime: 1717385976000, 
+    updateTime: 1717385976000
+  }, 
+  {
+    id: "1797484319040229377", 
+    title: "林同学-C++-15875754758.docx", 
+    url: "http://menduner.citupro.com:6868/admin-api/infra/file/24/get/725800ca45aced6c9742e94f576051c8c2527cd49b332c15be2dfbf17daedb92.docx", 
+    createTime: 1717388632000, 
+    updateTime: 1717388632000
+  }, 
+  {
+    id: "1797511196383563778", 
+    title: "林同学-PHP-15875754758.docx", 
+    url: "http://menduner.citupro.com:6868/admin-api/infra/file/24/get/725800ca45aced6c9742e94f576051c8c2527cd49b332c15be2dfbf17daedb92.docx", 
+    createTime: 1717395040000, 
+    updateTime: 1717395040000
+  }
+])
+
+const getBlob = (url) => {
+  return new Promise(resolve => {
+    const xhr = new XMLHttpRequest()
+    xhr.open('GET', url, true)
+    xhr.responseType = 'blob'
+    xhr.onload = () => {
+      if (xhr.status === 200) resolve(xhr.response)
+    }
+    xhr.send()
+  })
+}
+
+const saveAs = (blob, filename) => {
+  var link = document.createElement('a')
+  link.href = window.URL.createObjectURL(blob)
+  link.download = filename
+  link.click()
+}
+// 下载附件
+const handleDownload = (k) => {
+  getBlob(k.url).then(blob => {
+    saveAs(blob, k.title)
+  })
+}
+</script>
+<style lang="scss" scoped>
+  .attachment-item {
+    color: #555;
+    font-size: 14px;
+    .file-name {
+      width: 230px;
+      &:hover {
+        color: var(--v-primary-base);
+      }
+    }
+  }
+</style>

+ 91 - 0
src/views/enterprise/talentPool/components/details/educationExp.vue

@@ -0,0 +1,91 @@
+<template>
+  <div>
+    <div
+      v-for="(item, index) in dataList" :key="'educationExp' + index"
+      :class="[' mx-n2', {'mt-5': index }]"
+    >
+      <div class="educExpItem">
+        <div class="level1 d-flex align-center justify-space-between">
+          <div>
+            <span style="font-size: 16px;">{{ item.schoolName }}</span>
+            <span class="color6 font15 ml-5">
+              <span>{{ timesTampChange(item.startTime).slice(0, 10) }}</span>
+              <span class="mx-1">至</span>
+              <span>{{ timesTampChange(item.endTime).slice(0, 10) }}</span>
+            </span>
+          </div>
+          <div v-if="item.active">
+            <v-btn  variant="text" color="primary" prepend-icon="mdi-square-edit-outline" @click="handle(item)">{{ $t('common.edit') }}</v-btn>
+            <v-btn  variant="text" color="primary" prepend-icon="mdi-trash-can-outline" @click="handleDelete(item)">{{ $t('common.delete') }}</v-btn>
+          </div>
+        </div>
+        <div class="level2 my-2">
+          <span class="color6 font15">{{ item.major }}</span>
+          <span class="vline"  v-if="item.educationSystemType"></span>
+          <span class="color6 font15">{{ getText(item.educationSystemType, dictItemsObj.educationSystemType) }}</span>
+        </div>
+        <div class="level3">
+          <span class="color6 font15">在校经历:{{ item.content }}</span>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { reactive, ref  } from 'vue'
+import { timesTampChange } from '@/utils/date'
+import { getText } from '@/utils/getText'
+import { getDict } from '@/hooks/web/useDictionaries'
+
+defineOptions({name: 'enterprise-talentPool-details-educationExp'})
+
+const dataList = ref([
+  {
+    id: "1795302374122373121", 
+    userId: "1", 
+    schoolId: null, 
+    schoolName: "广州大学", 
+    educationType: "4", 
+    educationSystemType: "0", 
+    majorId: null, 
+    major: "计算机", 
+    startTime: 1715184000000, 
+    endTime: 1716566400000, 
+    content: "​程序设计基础、面向对象程序设计、软件工程导论、离散结构、数据结构与算法、工程经济学、团队激励与沟通、软件工程职业实践、计算机系统基础、操作系统、数据库概论、网络及其计算、人机交互的软件工程方法、软件工程综合实践、软件构造、软件设计与体系结构、软件质量保证与测试等。", 
+    createTime: 1716868416000, 
+    updateTime: 1718184443000
+  }, 
+  {
+    id: "1795407945051865089", 
+    userId: "1", 
+    schoolId: "1926", 
+    schoolName: "广州医科大学", 
+    educationType: "4", 
+    educationSystemType: "1", 
+    majorId: "378", 
+    major: "医学信息工程", 
+    startTime: 1715270400000, 
+    endTime: 1716480000000, 
+    content: "在校经历", 
+    createTime: 1716893586000, 
+    updateTime: 1718184443000
+  }, 
+])
+
+// 获取字典内容
+const dictList = [
+  { type: 'menduner_education_system_type', key: 'educationSystemType' }
+]
+const dictItemsObj = reactive({})
+const getDictData = async (obj) => {
+  const { data } = await getDict(obj.type)
+  dictItemsObj[obj.key] = data || []
+}
+const getOptions = () => {
+  dictList.forEach(obj =>  getDictData(obj))
+}
+getOptions()
+</script>
+<style lang="scss" scoped>
+</style>

+ 62 - 0
src/views/enterprise/talentPool/components/details/trainingExperience.vue

@@ -0,0 +1,62 @@
+<template>
+  <div v-if="dataList.length">
+    <div v-for="(k, i) in dataList" :key="i" class="exp mx-n2">
+      <div class="level1 d-flex align-center justify-space-between">
+        <div>
+          <span style="font-size: 16px;">{{ k.orgName }}</span>
+          <span class="label-title ml-5">
+            <span>{{ timesTampChange(k.startTime).slice(0, 7) }}</span>
+            <span class="mx-1">至</span>
+            <span>{{ timesTampChange(k.endTime).slice(0, 7) }}</span>
+          </span>
+        </div>
+      </div>
+      <div class="my-2">
+        <span class="label-title">培训课程:{{ k.course }}</span>
+      </div>
+      <div>
+        <span class="label-title">培训描述:</span>
+        <span class="label-title">{{ k.content }}</span>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ref  } from 'vue'
+import { timesTampChange } from '@/utils/date'
+defineOptions({name: 'enterprise-talentPool-details-trainingExperience'})
+const dataList = ref([
+  {
+    id: "1793902618095550466", 
+    startTime: 1711900800000, 
+    endTime: 1714406400000, 
+    orgName: "海外产品培训中心", 
+    course: "产品设计与分析", 
+    content: "同时具备常用大数据解决方案实践经验,包括实时计算(Storm/Flink )及离线计算(Hive/ETL/Spark)。 对搜索推荐/订单交易/经营分析等业务方向具备多年实践经验。 ", 
+    createTime: 1716563488000, 
+    updateTime: 1716564558000
+  }, 
+  {
+    id: "1793907923500040194", 
+    startTime: 1704038400000, 
+    endTime: 1714406400000, 
+    orgName: "广东教育基地", 
+    course: "微生物", 
+    content: "同时具备常用大数据解决方案实践经验,包括实时计算(Storm/Flink )及离线计算(Hive/ETL/Spark)。 对搜索推荐/订单交易/经营分析等业务方向具备多年实践经验。 ", 
+    createTime: 1716564753000, 
+    updateTime: 1716963732000
+  }
+])
+</script>
+<style lang="scss" scoped>
+.exp {
+  font-size: 15px;
+  // cursor: pointer;
+  border-radius: 6px;
+  padding: 2px 10px 8px;
+  // &:hover {
+  //   background-color: #f8f8f8;
+  // }
+}
+</style>

+ 2 - 2
src/views/resume/components/educationExp.vue

@@ -61,7 +61,6 @@ import { nextTick, reactive, ref } from 'vue'
 const editId = ref(null)
 const CtFormRef = ref()
 const dictItemsObj = reactive({})
-dictItemsObj.educationSystemType = [{ label: '全日制', value: '0' }, { label: '非全日制', value: '1' }]
 
 // 学校下拉列表
 const getSchoolListData = async (name, init = '') => {
@@ -261,7 +260,8 @@ const handleDelete = ({ id }) => {
 
 // 获取字典内容
 const dictList = [
-  { type: 'menduner_education_type', key: 'educationType' }
+  { type: 'menduner_education_type', key: 'educationType' },
+  { type: 'menduner_education_system_type', key: 'educationSystemType' }
 ]
 const getDictData = async (obj) => {
   const item = formItems.value.options.find(e => e.key === obj.key)