瀏覽代碼

相似职位对接数据

Xiao_123 1 年之前
父節點
當前提交
99e703feb3

+ 8 - 0
src/api/position.js

@@ -30,4 +30,12 @@ export const getPositionDetails = async (params) => {
     url: '/app-api/menduner/system/job/advertised/get/detail',
     params
   })
+}
+
+// 职位详情-相似职位
+export const getSimilarPosition = async (params) => {
+  return await request.get({
+    url: '/app-api/menduner/system/job/advertised/get/acquainted',
+    params
+  })
 }

+ 1 - 2
src/components/Enterprise/info.vue

@@ -2,7 +2,7 @@
   <div class="info-box">
     <h4 class="mb-3">公司信息</h4>
     <div style="height: 50px;">
-      <v-img class="float-left" :src="props.info.enterprise.logo_url" :width="45" height="45"></v-img>
+      <v-img class="float-left" :src="props.info.enterprise.logoUrl" :width="45" height="45"></v-img>
       <div class="ml-3 float-left">
         <p class="enterprise-name">{{ props.info.enterprise.anotherName }}</p>
         <v-icon color="primary" size="20">mdi-shield-check</v-icon> <!-- mdi-shield-remove -->
@@ -32,7 +32,6 @@ const props = defineProps({
     default: () => {}
   }
 })
-console.log(props.info, 'props-info')
 
 const dictObj = reactive({
   scale: [],

+ 13 - 33
src/components/Position/similarPositions.vue

@@ -1,13 +1,13 @@
 <template>
   <div class="position-box">
     <h4 class="mb-3">相似职位</h4>
-    <div v-for="(item, index) in list" :key="index" class="mb-2 cursor-pointer">
-      <p class="recruit-name">{{ item.recruitName }}</p>
-      <span class="recruit-salary">{{ item.salary }}</span>
+    <div v-for="(item, index) in props.list" :key="index" class="mb-2 cursor-pointer">
+      <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 !== list.length - 1}]">
-        <v-img class="float-left" src="https://img.bosszhipin.com/beijin/upload/com/logo/20230908/7b5b554d84f9729c6903b0c0cc1dcd8701d6c481534346fb7ef6001aff3ae087644bf666b1b70622.png" :width="30" :height="30"></v-img>
-        <span class="float-left enterprise-name">{{ item.enterpriseName }}</span>
-        <span class="float-right enterprise-address">{{ item.address }}</span>
+        <v-img class="float-left" :src="item.logoUrl" :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 class="text-center more-btn">
@@ -17,32 +17,12 @@
 </template>
 
 <script setup name="similarPositions">
-const list = [
-  {
-    recruitName: '产品经理',
-    salary: '12-4k',
-    enterpriseName: '辞图科技有限公司',
-    address: '广州'
-  },
-  {
-    recruitName: '产品经理',
-    salary: '12-4k',
-    enterpriseName: '辞图科技有限公司',
-    address: '广州'
-  },
-  {
-    recruitName: '产品经理',
-    salary: '12-4k',
-    enterpriseName: '辞图科技有限公司',
-    address: '广州'
-  },
-  {
-    recruitName: '产品经理',
-    salary: '12-4k',
-    enterpriseName: '辞图科技有限公司',
-    address: '广州'
+const props = defineProps({
+  list: {
+    type: Array,
+    default: () => []
   }
-]
+})
 </script>
 
 <style lang="scss" scoped>
@@ -54,10 +34,10 @@ const list = [
   padding: 20px 15px;
 }
 .recruit-name {
-  width: 120px;
+  width: 95px;
   font-weight: 500;
   display: inline-block;
-  max-width: 120px;
+  max-width: 95px;
   vertical-align: middle;
   white-space: nowrap;
   text-overflow: ellipsis;

+ 43 - 6
src/views/recruit/position/components/details.vue

@@ -61,7 +61,7 @@
             <!-- 公司信息 -->
             <EnterpriseInfo :info="{ ...info, position: { ...positionInfo } }"></EnterpriseInfo>
             <!-- 相似职位 -->
-            <similarPositions class="mt-3"></similarPositions>
+            <similarPositions class="mt-3" :list="similarList"></similarPositions>
           </div>
         </div>
       </div>
@@ -70,9 +70,10 @@
 
 <script setup>
 defineOptions({ name: 'position-details' })
-import { ref } from 'vue'
+import { ref, reactive } from 'vue'
 import { useRouter } from 'vue-router'
-import { getPositionDetails } from '@/api/position'
+import { getDict } from '@/hooks/web/useDictionaries'
+import { getPositionDetails, getSimilarPosition } from '@/api/position'
 import similarPositions from '@/components/Position/similarPositions.vue'
 import EnterpriseInfo from '@/components/Enterprise/info.vue'
 
@@ -89,11 +90,47 @@ const getPositionDetail = async () => {
 getPositionDetail()
 
 const desc = [
-  { mdi: 'mdi-map-marker-outline', value: 'areaName', label: '广州' },
-  { mdi: 'mdi-school-outline', value: 'eduName', label: '本科' },
-  { mdi: 'mdi-clock-time-ten-outline', value: 'expName', label: '1-3年' }
+  { mdi: 'mdi-map-marker-outline', value: 'areaName' },
+  { mdi: 'mdi-school-outline', value: 'eduName' },
+  { mdi: 'mdi-clock-time-ten-outline', value: 'expName' }
 ]
 
+// 相似职位
+const similarList = ref([])
+const getSimilarPositionList = async () => {
+  if (!Object.keys(positionInfo).length) return
+  const { list } = await getSimilarPosition({ pageNo: 1, pageSize: 4, positionId: positionInfo.positionId, expType: positionInfo.expType })
+  const items = list.splice(0, 4)
+  dictList.forEach(item => {
+    similarList.value = items.map(e => {
+      const valueKey = item.nameKey ? item.nameKey : 'label'
+      const idKey = item.valueKey ? item.valueKey : 'value'
+      e[item.label] = dictObj[item.value].find(k => Number(k[idKey]) === Number(e[item.key]))[valueKey] || ''
+      return e
+    })
+  })
+}
+
+const dictObj = reactive({
+  payUnit: [],
+  area: []
+})
+const dictList = [
+  { type: 'menduner_pay_unit', value: 'payUnit', key: 'payUnit', label: 'payName' },
+  { type: 'menduner_area_type', value: 'area', key: 'areaId', label: 'areaName', params: {}, apiType: 'areaList', nameKey: 'name', valueKey: 'id' }
+]
+// 字典
+const getDictList = async () => {
+  dictList.forEach(async (val) => {
+    const { data } = await getDict(val.type, val.params, val.apiType)
+    dictObj[val.value] = data
+  })
+}
+const getData = async () => {
+  await getDictList()
+  getSimilarPositionList()
+}
+getData()
 </script>
 
 <style lang="scss" scoped>