فهرست منبع

职业技能展示方式调整

Xiao_123 7 ماه پیش
والد
کامیت
f0b135acc9

+ 6 - 6
src/components/Enterprise/details.vue

@@ -45,22 +45,22 @@
             <recruitmentPositions v-else :info="info"/>
           </div>
           <div class="content-right">
-            <div v-if="info.enterprise?.workTime && info?.enterprise?.welfareList.length" class="welfare mb-3">
+            <div class="welfare mb-3">
               <h4>工作时间及福利</h4>
-              <div v-if="info.enterprise?.workTime" class="my-3" style="color: var(--color-666);font-size: 14px;">
-                <v-icon size="17" color="#ccc" class="mr-2">mdi-clock</v-icon>{{ info.enterprise.workTime }}
+              <div class="my-3" style="color: var(--color-666);font-size: 14px;">
+                <v-icon size="17" color="#ccc" class="mr-2">mdi-clock</v-icon>{{ info.enterprise?.workTime || '暂无' }}
               </div>
               <div class="welfare-tags">
                 <v-chip size="small" label v-for="(k, i) in info?.enterprise?.welfareList?.slice(0, 6)" :key="i" class="mb-2 welfare-tags-item ellipsis" color="primary">{{ k }}</v-chip>
               </div>
             </div>
-            <div class="welfare" v-if="info?.business">
+            <div class="welfare">
               <h4>工商信息</h4>
               <div :class="['mt-2', 'business-item']" v-for="val in businessList" :key="val.value">
                 <div>{{ val.label }}</div>
                 <div class="business-value ellipsis">
-                  {{ info.business[val.value] || '暂无' }}
-                  <span v-if="val.value === 'registeredCapital' && info.business[val.value]">万元</span>
+                  {{ info?.business ? info.business[val.value] : '暂无' }}
+                  <span v-if="info?.business && val.value === 'registeredCapital' && info?.business[val.value]">万元</span>
                 </div>
                 <div :class="['my-3']"></div>
               </div>

+ 6 - 1
src/components/Position/longStrip.vue

@@ -31,7 +31,7 @@
             <v-img width="50" height="50" :src="val.enterprise.logoUrl || 'https://minio.citupro.com/dev/menduner/7.png'"></v-img>
           </div>
           <div class="ml-3">
-            <div class="cursor-pointer info-name">{{ val.enterprise.name }}</div>
+            <div class="cursor-pointer info-name" @click="handleToEnterprise(val)">{{ val.enterprise.name }}</div>
             <div class="mt-3 ellipsis color-666 font-size-13" style="max-width: 260px;">
               <span v-for="(k, i) in desc" :key="k">
                 {{ val.enterprise[k] }}
@@ -81,6 +81,11 @@ const handleCancel = async (item) => {
 const handleToPositionDetails = (item) => {
   router.push(`/recruit/personal/position/details/${item.job.id}`)
 }
+
+// 企业详情
+const handleToEnterprise = (item) => {
+  router.push(`/recruit/personal/company/details/${item.enterprise.id}?key=briefIntroduction`)
+}
 </script>
 
 <style scoped lang="scss">

+ 6 - 1
src/utils/headhuntingData.js

@@ -2,6 +2,7 @@
 export const serviceData = [
   {
     title: '高级管理精英甄选',
+    id: 'selection-senior-management-elite',
     startDesc: '我们深知企业在转型升级过程中,高级管理人才的重要性。因此,门墩儿猎头凭借丰富的行业经验、专业的人才筛选能力和严谨的服务态度,为企业量身定制高级管理人才解决方案。我们的高级管理精英甄选业务涵盖各行各业,包括但不限于金融、互联网、房地产、制造业等领域。我们通过深入了解企业发展战略、企业文化及岗位需求,运用先进的猎头技术和丰富的人才资源库,为企业精准挖掘、评估和推荐具备以下特质的高级管理人才:',
     endDesc: '门墩儿猎头始终秉承“客户至上、诚信为本”的服务宗旨,以专业、高效、贴心的服务,为企业输送了一批又一批高级管理精英,助力企业实现战略目标。我们相信,在门墩儿猎头的助力下,企业将不断迈向新的征程。',
     children: [
@@ -13,7 +14,8 @@ export const serviceData = [
   },
   {
     title: '人才发展储备策略',
-    startDesc: '我们深知企业在转型升级过程中,高级管理人才的重要性。因此,门墩儿猎头凭借丰富的行业经验、专业的人才筛选能力和严谨的服务态度,为企业量身定制高级管理人才解决方案。我们的高级管理精英甄选业务涵盖各行各业,包括但不限于金融、互联网、房地产、制造业等领域。我们通过深入了解企业发展战略、企业文化及岗位需求,运用先进的猎头技术和丰富的人才资源库,为企业精准挖掘、评估和推荐具备以下特质的高级管理人才:',
+    id: 'talent-development-reserve-strategy',
+    startDesc: '门墩儿猎头深知企业在长远发展过程中,人才储备的重要性。因此,我们为企业量身打造了一套全面的人才发展储备策略,旨在帮助企业构建坚实的人才梯队,确保企业在不同发展阶段都能拥有充足的人才支持。',
     startTitle: '门墩儿猎头的人才发展储备策略主要包括以下几个方面:',
     endDesc: '通过门墩儿猎头的人才发展储备策略,企业不仅能够有效应对人才流失的风险,还能在激烈的市场竞争中保持核心竞争力,实现可持续发展。我们致力于成为企业信赖的人才战略合作伙伴,为企业的发展壮大提供源源不断的动力。',
     children: [
@@ -26,6 +28,7 @@ export const serviceData = [
   },
   {
     title: '管理者能力提升方案',
+    id: 'manager-capability-enhancement-plan',
     startDesc: '门墩儿猎头深刻认识到,优秀的管理者是推动企业持续发展的关键因素。为此,我们精心打造了一套管理者能力提升方案,旨在帮助企业提升管理团队的整体素质,增强企业的管理效能,从而在复杂多变的市场环境中保持领先地位。',
     startTitle: '门墩儿猎头的管理者能力提升方案包括以下核心内容:',
     endDesc: '门墩儿猎头的管理者能力提升方案,不仅帮助企业培养了一批具有国际视野和本土实战经验的管理人才,还为企业注入了强大的管理动力,助力企业在激烈的市场竞争中保持领先地位,实现长远发展。我们坚信,通过门墩儿猎头的专业服务,企业的管理团队将不断迈向新的高度。',
@@ -39,6 +42,7 @@ export const serviceData = [
   },
   {
     title: '卓越成长轨迹',
+    id: 'excellent-growth-trajectory',
     startDesc: '门墩儿猎头的卓越成长轨迹服务,是一项旨在帮助企业规划和实现关键人才职业发展路径的全方位服务。该服务通过精心设计的人才成长路线图,助力企业培育和保留核心人才,确保企业在不断变化的市场环境中保持竞争优势和持续发展的动力。',
     startTitle: '以下是卓越成长轨迹服务的详细描述:',
     endDesc: '门墩儿猎头的卓越成长轨迹服务,不仅为企业打造了一支高素质、高效率的人才队伍,也为企业创造了一个持续学习、不断进步的组织文化。我们的服务帮助企业实现人才与企业共同成长,为企业的长远发展奠定了坚实的人才基础。',
@@ -53,6 +57,7 @@ export const serviceData = [
   },
   {
     title: '高管信誉与资质验证',
+    id: 'senior-management-elite-verification',
     startDesc: '门墩儿猎头深知企业在招募高级管理人员时,高管信誉与资质的重要性。为此,我们推出了高管信誉与资质验证服务,这是一项专业的背景调查和资质审核服务,旨在为企业提供准确、可靠的高管候选人评估,确保企业能够招募到具备优秀职业道德和过硬专业能力的高层领导。',
     startTitle: '以下是高管信誉与资质验证服务的详细描述:',
     endDesc: '门墩儿猎头的高管信誉与资质验证服务,为企业招募高管提供了坚实的安全保障,帮助企业规避了因高管个人问题带来的风险,确保了企业高层管理的稳定性和企业声誉的完整性。通过我们的专业服务,企业能够更加放心地选拔和任用高层管理人才,为企业的长远发展保驾护航。',

+ 13 - 8
src/views/headhunting/components/content.vue

@@ -23,8 +23,8 @@
             v-for="(val, index) in service" 
             :key="index" 
             :style="{'border-left': index !== 0 ? '1px solid #56738f' : 'none'}"
+            @click="handleClick('service', val.id, val.title)"
           >{{ val.title }}</li>
-            <!-- @click="handleClick('service', val.title)" -->
         </ul>
       </div>
     </div>
@@ -112,6 +112,10 @@
 
 <script setup>
 defineOptions({ name: 'headhunting-carousel'})
+import { useRouter } from 'vue-router'
+
+const router = useRouter()
+
 // 数值示例
 const list = [
   { title: '70家', desc: '全球分支机构' },
@@ -121,10 +125,10 @@ const list = [
 // 服务
 const service = [
   { title: '高级管理精英甄选', id: 'selection-senior-management-elite' },
-  { title: '人才发展储备策略' },
-  { title: '管理者能力提升方案' },
-  { title: '卓越成长轨迹' },
-  { title: '高管信誉与资质验证' }
+  { title: '人才发展储备策略', id: 'talent-development-reserve-strategy' },
+  { title: '管理者能力提升方案', id: 'manager-capability-enhancement-plan' },
+  { title: '卓越成长轨迹', id: 'excellent-growth-trajectory' },
+  { title: '高管信誉与资质验证', id: 'senior-management-elite-verification' }
 ]
 // 办公地点
 const countryOffice = [
@@ -150,9 +154,10 @@ const social = [
   { showTooltip: true, desc: '关注门墩儿官方微信公众号,获悉热点资讯和行业洞见。', url: 'https://cn.spencerstuart.com/-/media/wechat.jpg?h=75&amp;w=75&amp;la=zh-CN&amp;hash=B9D5E58A097630C3C5A878D5ED49B4A6' }
 ]
 
-// const handleClick = (type, title) => {
-//   window.open()
-// }
+const handleClick = (type, id) => {
+  if (!type && !id) return
+  router.push(`/headhunting/service/details?type=${type}&key=${id}`)
+}
 </script>
 
 <style scoped lang="scss">

+ 18 - 10
src/views/headhunting/components/serviceContent.vue

@@ -22,7 +22,7 @@
       </div>
       <div class="service-content mt-5">
         <div class="service-item" v-for="(item, index) in service" :key="index" 
-          @mouseenter="item.active = true" @mouseleave="item.active = false"
+          @mouseenter="item.active = true" @mouseleave="item.active = false" @click="handleClick('service', item.id)"
         >
           <div v-if="!item.active" class="service-title">
             {{ item.title }}
@@ -58,18 +58,21 @@
 <script setup>
 defineOptions({ name: 'headhunting-serviceContent'})
 import { ref } from 'vue'
+import { useRouter } from 'vue-router'
+
+const router = useRouter()
 
 // 我们的服务
 const service = ref([
-  { title: '高管搜索与招募', desc: '我们协助世界一流企业构建成功的领导团队。', active: false },
-  { title: '董事会服务', desc: '我我们协助建立专业合规、经验丰富且多元化的董事会,并为董事会交接、业绩及治理等问题提供建议。', active: false },
-  { title: '首席执行官继任计划', desc: '我们在CEO继任领域拥有数十年的顾问经验,致力于协助董事会制定、规划和执行CEO继任的全过程。', active: false },
-  { title: '高管评估服务', desc: '我们的综合评估方法能提供翔实数据和深入见解,从而评价和预测领导者的表现、契合度和影响力。', active: false },
-  { title: '领导力咨询服务', desc: '我们提供甄选和培养领导者、优化团队效能,以及评估和改进企业文化所需的见解。', active: false },
-  { title: '董事会服务', desc: '我们提供的高管和董事人选,能够制定明确的数字化战略,并驾驭企业转型所需的人才、运营及文化变革。', active: false },
-  { title: '中国业务部', desc: '我们的中国业务部为中国企业进入德国和欧洲拓展业务提供高管寻聘和领导力咨询服务,同时陪伴德国企业在中国市场的发展。', active: false },
-  { title: '多样性', desc: '我们致力于广泛发展关于多文化问题的专业基础,确保我们能为客户提供当前候选人名单中最具资格的人才。', active: false },
-  { title: '家族业务', desc: '作为家族控股公司和家族支配公司的受托顾问,我们具有家族客户所注重的敏感、谨慎和灵活的特征', active: false }
+  { title: '高级管理精英甄选', desc: '我们协助世界一流企业构建成功的领导团队。', active: false, id: 'selection-senior-management-elite' },
+  { title: '人才发展储备策略', desc: '我我们协助建立专业合规、经验丰富且多元化的董事会,并为董事会交接、业绩及治理等问题提供建议。', id: 'talent-development-reserve-strategy' },
+  { title: '管理者能力提升方案', desc: '我们在CEO继任领域拥有数十年的顾问经验,致力于协助董事会制定、规划和执行CEO继任的全过程。', id: 'manager-capability-enhancement-plan' },
+  { title: '卓越成长轨迹', desc: '我们的综合评估方法能提供翔实数据和深入见解,从而评价和预测领导者的表现、契合度和影响力。', active: false, id: 'excellent-growth-trajectory' },
+  { title: '高管信誉与资质验证', desc: '我们提供甄选和培养领导者、优化团队效能,以及评估和改进企业文化所需的见解。', active: false, id: 'senior-management-elite-verification' },
+  { title: '董事会服务', desc: '我们提供的高管和董事人选,能够制定明确的数字化战略,并驾驭企业转型所需的人才、运营及文化变革。', active: false, id: 'senior-management-elite-verification' },
+  { title: '中国业务部', desc: '我们的中国业务部为中国企业进入德国和欧洲拓展业务提供高管寻聘和领导力咨询服务,同时陪伴德国企业在中国市场的发展。', active: false, id: 'senior-management-elite-verification' },
+  { title: '多样性', desc: '我们致力于广泛发展关于多文化问题的专业基础,确保我们能为客户提供当前候选人名单中最具资格的人才。', active: false, id: 'senior-management-elite-verification' },
+  { title: '家族业务', desc: '作为家族控股公司和家族支配公司的受托顾问,我们具有家族客户所注重的敏感、谨慎和灵活的特征', active: false, id: 'senior-management-elite-verification' }
 ])
 
 const list = [
@@ -102,6 +105,11 @@ const list = [
     ]
   }
 ]
+
+const handleClick = (type, id) => {
+  if (!type && !id) return
+  router.push(`/headhunting/service/details?type=${type}&key=${id}`)
+}
 </script>
 
 <style scoped lang="scss">

+ 21 - 7
src/views/headhunting/details.vue

@@ -1,18 +1,32 @@
 <template>
-  <div>xxx</div>
+  <div>
+    <navBar @click="handleClickNav"></navBar>
+    <div>
+      <service v-if="query.type === 'service'" :id="query.key" class="content-box"></service>
+    </div>
+  </div>
 </template>
 
 <script setup>
 defineOptions({ name: 'headhuntingDetails' })
 import { useRouter } from 'vue-router'
+import navBar from './components/nav.vue'
+import service from './drill/service.vue'
 
-const router  = useRouter()
-router.beforeEach((to, from, next) => {
-  document.title = to.meta.title
-  next()
-})
+const router = useRouter()
+const query = router.currentRoute.value.query
+
+const handleClickNav = (path) => {
+  if (!path) return
+  router.push(path)
+}
 </script>
 
 <style scoped lang="scss">
-
+.content-box {
+  width: 1000px;
+  max-width: 1000px;
+  min-width: 1000px;
+  margin: 0 auto;
+}
 </style>

+ 46 - 0
src/views/headhunting/drill/service.vue

@@ -0,0 +1,46 @@
+<template>
+  <div style="color: #4c4c4e;">
+    <div class="mt-5">
+      <v-breadcrumbs :items="paths" class="pa-0 ma-0"></v-breadcrumbs>
+    </div>
+    <h1 class="my-5">{{ data.title }}</h1>
+    <p class="font-weight-bold">{{ data.startDesc }}</p>
+    <p v-if="data.startTitle" class="font-weight-bold mt-1">{{ data.startTitle }}</p>
+    <ul>
+      <li v-for="(val, index) in data.children" :key="index">{{ val }}</li>
+    </ul>
+    <p>{{ data.endDesc }}</p>
+  </div>
+</template>
+
+<script setup>
+defineOptions({ name: 'headhunting-drill-service' })
+import { ref } from 'vue'
+import { serviceData } from '@/utils/headhuntingData'
+
+const props = defineProps({
+  id: {
+    type: String,
+    default: ''
+  }
+})
+
+const data = ref(serviceData.find(e => e.id === props.id))
+
+const paths = [
+  { title: '首页', disabled: false, href: '/headhunting' },
+  { title: '我们的服务', disabled: false, href: '/headhunting/service' },
+  { title: data.value.title, disabled: true, href: '' }
+]
+</script>
+
+<style scoped lang="scss">
+ul {
+  list-style: none;
+  margin-left: 20px;
+  margin-top: 10px;
+  li {
+    margin-bottom: 1.5rem;
+  }
+}
+</style>

+ 4 - 5
src/views/recruit/personal/PersonalCenter/jobFeedback/components/seenMe.vue

@@ -8,7 +8,7 @@
               <v-img :src="getUserAvatar(item?.contact.avatar, item?.contact.sex)" :width="40" style="height: 40px;border-radius: 4px;"/>
             </div>
             <div class="company-info">
-              <h3 :class="{'default-active': item.active }" class="title1">{{ item.contact.name }}</h3>
+              <h3 class="title1">{{ item.contact.name }}</h3>
               <p class="mt-2">{{ item?.post?.nameCn }}</p>
             </div>
           </div>
@@ -46,7 +46,9 @@ import { dealDictObjData } from '@/utils/position'
 import { timesTampChange } from '@/utils/date'
 import Empty from '@/components/Empty'
 import { getUserAvatar } from '@/utils/avatar'
+import { useRouter } from 'vue-router'
 
+const router = useRouter()
 const total = ref(0)
 const items = ref([])
 const page = ref({
@@ -73,7 +75,7 @@ const handleChangePage = (e) => {
 const handleEnterprise = (item) => {
   const id = item.enterprise.id
   if (!id) return
-  window.open(`/recruit/personal/company/details/${id}?key=briefIntroduction`)
+  router.push(`/recruit/personal/company/details/${id}?key=briefIntroduction`)
 }
 
 </script>
@@ -88,9 +90,6 @@ const handleEnterprise = (item) => {
   text-overflow: ellipsis;
   white-space: nowrap;
   font-size: 16px;
-  &:hover {
-    color: var(--v-primary-base);
-  }
 }
 .company {
   flex: 1;

+ 10 - 16
src/views/recruit/personal/PersonalCenter/resume/online/components/vocationalSkills.vue

@@ -15,20 +15,13 @@
     <div v-else-if="!dataList?.length" class="resumeNoDataText">{{ $t('resume.dataDefaultPrompt') }}{{ $t('resume.vocationalSkills') }}...</div>
     <!-- 展示 -->
     <div v-else>
-      <div
-        :class="['dataList-item']" 
-        v-for="(k, i) in dataList" 
-        :key="i" 
-        @mouseenter="k.active = true" 
-        @mouseleave="k.active = false"
-      >
-        <span>{{ getText(k.skillId, skillList, 'nameCn', 'id') }}</span>
-        <span class="septal-line"></span>
-        <span style="color: var(--color-999);">{{ getText(k.level, skillLevelArr) }}</span>
-        <span class="float-right" v-if="k.active">
-          <v-btn variant="text" color="primary" prepend-icon="mdi-square-edit-outline" @click="handleEdit(k)">{{ $t('common.edit') }}</v-btn>
-          <v-btn variant="text" color="primary" prepend-icon="mdi-trash-can-outline" @click="handleDelete(k)">{{ $t('common.delete') }}</v-btn>
-        </span>
+      <div>
+        <v-chip v-for="k in dataList" class="mr-3" :key="k.id">
+          <span class="cursor-pointer" @click="handleEdit(k)">{{ getText(k.skillId, skillList, 'nameCn', 'id') }}/{{ getText(k.level, skillLevelArr) }}</span>
+          <template v-slot:append>
+            <v-icon class="ml-2" @click="handleDelete(k)">mdi-close-circle</v-icon>
+          </template>
+        </v-chip>
       </div>
     </div>
   </div>
@@ -48,7 +41,6 @@ const isEdit = ref(false)
 const formPageRef = ref()
 const type = ref('')
 const editId = ref(null)
-// const skills = [{ label: '英语四级', value: '0' }, { label: '英语六级', value: '1' }, { label: 'office办公软件', value: '2' }]
 
 const formItems = ref({
   options: [
@@ -63,6 +55,7 @@ const formItems = ref({
       itemValue: 'id',
       closeOnContentClick: true,
       flexStyle: 'mr-3',
+      disabled: false,
       col: 8,
       rules: [v => !!v || '请选择技能名称'],
       items: [],
@@ -128,7 +121,7 @@ const handleSave = async () => {
 const handleEdit = (item) => {
   editId.value = item.id
   formItems.value.options.forEach(e => {
-    // if (item[e.key]) e.value = item[e.key].toString()
+    if (e.key === 'skillId') e.disabled = true
     e.value = item[e.key]
   })
   isEdit.value = true
@@ -138,6 +131,7 @@ const handleAdd = () => {
   isEdit.value = true
   type.value = 'add'
   formItems.value.options.forEach(e => {
+    if (e.key === 'skillId') e.disabled = false
     e.value = null
   })
   isEdit.value = true

+ 2 - 2
src/views/recruit/personal/position/components/conditionFilter/areaType.vue

@@ -35,11 +35,11 @@ let selectedItems = ref([])
 getDict('menduner_area_type', {}, 'areaList').then(({ data }) => {
   data = data?.length && data || []
   const arr = props.list.map(e => {
-    const obj = data.find(k => Number(k.id) === Number(e.key))
+    const obj = data.find(k => k.id === e.key)
     if (!obj) return
     const { id, parentId, type, name: label } = obj
     return { id, label, number: e.value, parentId, type }
-  })
+  }).filter(Boolean)
   items.value = [{ id: -1, label: '全部' }, ...arr]
   show.value = true
 })