Selaa lähdekoodia

Merge branch 'dev' of https://git.citupro.com/zhengnaiwen_citu/menduner into dev

Xiao_123 11 kuukautta sitten
vanhempi
commit
5a1ba87f7a

+ 16 - 5
src/views/enterprise/talentPool/components/details.vue

@@ -1,6 +1,6 @@
 <!-- 人才库 - 人才详情 -->
 <template>
-  <div class="white-bgc py-2 d-flex justify-center" style="width: 100%;">
+  <div class="white-bgc pt-2 pb-16 d-flex justify-center" style="width: 100%;">
     <div style="width: 940px;overflow-y: auto;background: none;" class=" pa-3 mr-3">
       <!-- 基本信息 -->
       <baseInfo class="mt-5"></baseInfo>
@@ -12,7 +12,7 @@
       <!-- 职业技能 -->
       <div class="d-flex mt-8">
         <span class="mr-6">{{ $t('resume.vocationalSkills') }}</span>
-        <!-- <vocationalSkills style="flex: 1;"></vocationalSkills> -->
+        <vocationalSkills style="flex: 1;"></vocationalSkills>
       </div>
       <!-- 求职意向 -->
       <div class="d-flex mt-8">
@@ -27,17 +27,22 @@
       <!-- 项目经历 -->
       <div class="d-flex mt-8">
         <span class="mr-6">{{ $t('resume.projectExperience') }}</span>
-        <!-- <projectExperience style="flex: 1;"></projectExperience> -->
+        <projectExperience style="flex: 1;"></projectExperience>
       </div>
       <!-- 培训经历 -->
       <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>
@@ -59,8 +64,13 @@
 
 <script setup>
 import baseInfo from './details/baseInfo.vue'
+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、上班。"
@@ -69,6 +79,7 @@ const operateItems = [
   { text: '不合适', icon: 'mdi-close-circle-outline' },
   { text: '发起对话', icon: 'mdi-chat-processing-outline' },
   { text: '加入人才库', icon: 'mdi-tab-plus' },
+  { text: '操作记录', icon: 'mdi-clock-edit-outline' },
 ]
 </script>
 <style lang="scss" scoped>

+ 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>

+ 58 - 0
src/views/enterprise/talentPool/components/details/projectExperience.vue

@@ -0,0 +1,58 @@
+<template>
+  <div>
+    <div v-for="(k, i) in dataList" :key="i" class="exp mx-n2" @mouseenter="k.active = true" @mouseleave="k.active = false">
+      <div class="d-flex align-center justify-space-between">
+        <div>
+          <span style="font-size: 16px">{{ k.name }}</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>
+        <span class="label-title">项目描述:</span>
+        <span class="label-title">{{ k.content }}</span>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { timesTampChange } from '@/utils/date'
+import { ref } from 'vue'
+
+defineOptions({name: 'enterprise-talentPool-details-projectExperience'})
+const dataList = ref([
+  {
+    id: "1793912379075624961", 
+    name: "阅读器APP", 
+    startTime: 1629475200000, 
+    endTime: 1636646400000, 
+    content: "可以通过互联网搜索喝=和载海量书籍,或者通过上传进行本地书籍。提供了多种海外知名小说资源给用户下载书籍,支持Epub、Mobi、PDF、txt、UMD等全主流阅读模式。", 
+    createTime: 1716565815000, 
+    updateTime: 1716565815000
+  }, 
+  {
+    id: "1793913376493699073", 
+    name: "商城harbor多模版1", 
+    startTime: 1629475200000, 
+    endTime: 1636646400000, 
+    content: "商城harbor多模版项目是一个味用户提供购物体验的独立站平台,主要向海外销售产品。", 
+    createTime: 1716566053000, 
+    updateTime: 1716566080000
+  }
+])
+</script>
+<style lang="scss" scoped>
+.exp {
+  font-size: 15px;
+  // cursor: pointer;
+  border-radius: 6px;
+  padding: 2px 10px 8px;
+  // &:hover {
+  //   background-color: #f8f8f8;
+  // }
+}
+</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>

+ 58 - 0
src/views/enterprise/talentPool/components/details/vocationalSkills.vue

@@ -0,0 +1,58 @@
+<template>
+  <div>
+    <div 
+      :class="['dataList-item']" 
+      v-for="(k, i) in dataList" 
+      :key="i" 
+    >
+      <span >{{ getText(k.skillId, skills) }}</span>
+      <span class="vline"></span>
+      <span style="color: #999;">{{ getText(k.level, skillLevelArr) }}</span>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { getText } from '@/utils/getText'
+import { getDict } from '@/hooks/web/useDictionaries'
+import { ref } from 'vue';
+defineOptions({name: 'enterprise-talentPool-details-vocationalSkills'})
+const skills = [{ label: '英语四级', value: '0' }, { label: '英语六级', value: '1' }, { label: 'office办公软件', value: '2' }]
+const dataList = ref([
+  {
+    id: "1795704760633024513", 
+    skillId: "0", 
+    level: "2", 
+    createTime: 1716964352000, 
+    updateTime: 1716964352000
+  }, 
+  {
+    id: "1795741375308914690", 
+    skillId: "2", 
+    level: "3", 
+    createTime: 1716973082000, 
+    updateTime: 1716973082000
+  }
+])
+const skillLevelArr = ref([])
+getDict('menduner_skill_level').then(({ data }) => { // 字典
+  data = data?.length && data || []
+  skillLevelArr.value = data
+})
+</script>
+<style lang="scss" scoped>
+.dataList-item {
+  // cursor: pointer;
+  border-radius: 6px;
+  // line-height: 36px;
+  // &:hover {
+  //   background-color: #f8f8f8;
+  // }
+  span {
+    font-size: 15px;
+  }
+  .grey-text {
+    color: #999;
+  }
+}
+</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)