소스 검색

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

lifanagju_citu 1 년 전
부모
커밋
eef06d7a30

+ 9 - 1
src/api/common/index.js

@@ -35,7 +35,7 @@ export const logout = async () => {
 
 // 修改密码
 export const updatePassword = async (data) => {
-  return await request.post({
+  return await request.put({
     url: '/app-api/menduner/system/mde-user/update-password',
     data
   })
@@ -79,4 +79,12 @@ export const getIndustryListData = async (params) => {
     url: '/app-api/menduner/system/industry/list',
     params
   })
+}
+
+// 获取地区列表
+export const getAreaListData = async (params) => {
+  return await request.get({
+    url: '/app-api/menduner/system/area/list',
+    params
+  })
 }

+ 9 - 0
src/api/enterprise.js

@@ -0,0 +1,9 @@
+import request from '@/config/axios'
+
+// 获取热门企业
+export const getHotEnterprise = async (params) => {
+  return await request.get({
+    url: '/app-api/menduner/system/job/advertised/get/hot/enterprise',
+    params
+  })
+}

+ 41 - 109
src/components/Enterprise/hotPromoted.vue

@@ -4,131 +4,56 @@
       <!-- 公司信息 -->
       <div class="company-info-top">
         <div class="float-left">
-          <v-img :src="item.enterpriseImg" :alt="item.enterpriseName" :width="40" style="height: 40px;border-radius: 4px;"/>
+          <v-img src="../../assets/logo.png" :alt="item.anotherName" :width="40" style="height: 40px;border-radius: 4px;"/>
         </div>
         <div class="company-info">
-          <h3>{{ item.enterpriseName }}</h3>
-          <p>{{ item.enterpriseNature }}<span class="vline"></span>{{ item.scale }}<span class="vline"></span>{{ item.industry }}</p>
+          <h3>{{ item.anotherName }}</h3>
+          <p>{{ item.financingName }}<span class="vline"></span>{{ item.scaleName }}<span class="vline"></span>{{ item.industryName }}</p>
         </div>
       </div>
       <!-- 职位列表 -->
       <ul class="company-job-list">
-        <li class="company-job-item" v-for="(k, i) in item.positions" :key="i">
-          <div class="job-info">
+        <li class="company-job-item" v-for="(k, i) in item.jobList" :key="i">
+          <div class="job-info" @mouseenter="k.active = true" @mouseleave="k.active = false">
             <div class="mb-2 d-flex">
-              <p class="name">{{ k.recruitName }}</p>
+              <p :class="['name', {'default-active': k.active }]">{{ k.name }}</p>
               <v-icon size="20" class="message">mdi-message-processing</v-icon>
-              <span class="salary">{{ k.salary }}</span>
+              <span class="salary">{{ k.payFrom }}-{{ k.payTo }}/{{ k.payName }}</span>
+            </div>
+            <div style="height: 24px; overflow: hidden;">
+              <v-chip size="x-small" label class="mr-1" color="#666" v-for="j in desc" :key="j">{{ k[j.value] }}</v-chip>
             </div>
-            <v-chip size="x-small" label class="mr-1" color="#666" v-for="j in k.tags" :key="j">{{ j }}</v-chip>
           </div>
         </li>
       </ul>
-      <div class="text-center">
-        <v-btn class="buttons" color="primary" variant="outlined">查看更多职位</v-btn>
+      <div class="moreBtn">
+        <v-btn class="buttons" color="primary" variant="outlined">{{ $t('position.moreBtn') }}</v-btn>
       </div>
     </div>
   </div>
 </template>
 
 <script setup name="hotPromoted">
-const list = [
-  {
-    enterpriseImg: 'https://img.bosszhipin.com/beijin/upload/com/workfeel/20231212/7bf6f160950405e90671d208831c3be24a7230ff916830a84f48ca3d2af0604795d2582973667498.png',
-    enterpriseName: '博彦科技',
-    enterpriseNature: '私营企业',
-    scale: '100000人以上',
-    industry: '计算机软件',
-    positions: [
-      {
-        recruitName: '跨境电商运营跨境电商运营跨境电商运营跨境电商运营',
-        salary: '7-9K',
-        tags: ['广州番禺南浦', '本科', '1-3年']
-      },
-      {
-        recruitName: '跨境电商运营',
-        salary: '7-9K',
-        tags: ['广州番禺南浦', '本科', '1-3年']
-      },
-      {
-        recruitName: '跨境电商运营',
-        salary: '7-9K',
-        tags: ['广州番禺南浦', '本科', '1-3年']
-      }
-    ]
-  },
-  {
-    enterpriseImg: 'https://img.bosszhipin.com/beijin/upload/com/workfeel/20231212/7bf6f160950405e90671d208831c3be24a7230ff916830a84f48ca3d2af0604795d2582973667498.png',
-    enterpriseName: '博彦科技',
-    enterpriseNature: '私营企业',
-    scale: '100000人以上',
-    industry: '计算机软件',
-    positions: [
-      {
-        recruitName: '跨境电商运营',
-        salary: '7-9K',
-        tags: ['广州番禺南浦', '本科', '1-3年']
-      },
-      {
-        recruitName: '跨境电商运营',
-        salary: '7-9K',
-        tags: ['广州番禺南浦', '本科', '1-3年']
-      },
-      {
-        recruitName: '跨境电商运营',
-        salary: '7-9K',
-        tags: ['广州番禺南浦', '本科', '1-3年']
-      }
-    ]
-  },
-  {
-    enterpriseImg: 'https://img.bosszhipin.com/beijin/upload/com/workfeel/20231212/7bf6f160950405e90671d208831c3be24a7230ff916830a84f48ca3d2af0604795d2582973667498.png',
-    enterpriseName: '博彦科技',
-    enterpriseNature: '私营企业',
-    scale: '100000人以上',
-    industry: '计算机软件',
-    positions: [
-      {
-        recruitName: '跨境电商运营',
-        salary: '7-9K',
-        tags: ['广州番禺南浦', '本科', '1-3年']
-      },
-      {
-        recruitName: '跨境电商运营',
-        salary: '7-9K',
-        tags: ['广州番禺南浦', '本科', '1-3年']
-      },
-      {
-        recruitName: '跨境电商运营',
-        salary: '7-9K',
-        tags: ['广州番禺南浦', '本科', '1-3年']
-      }
-    ]
-  },
-  {
-    enterpriseImg: 'https://img.bosszhipin.com/beijin/upload/com/workfeel/20231212/7bf6f160950405e90671d208831c3be24a7230ff916830a84f48ca3d2af0604795d2582973667498.png',
-    enterpriseName: '博彦科技',
-    enterpriseNature: '私营企业',
-    scale: '100000人以上',
-    industry: '计算机软件',
-    positions: [
-      {
-        recruitName: '跨境电商运营',
-        salary: '7-9K',
-        tags: ['广州番禺南浦', '本科', '1-3年']
-      },
-      {
-        recruitName: '跨境电商运营',
-        salary: '7-9K',
-        tags: ['广州番禺南浦', '本科', '1-3年']
-      },
-      {
-        recruitName: '跨境电商运营',
-        salary: '7-9K',
-        tags: ['广州番禺南浦', '本科', '1-3年']
-      }
-    ]
+import { ref, watch } from 'vue'
+const props = defineProps({
+  items: {
+    type: Array,
+    default: () => []
   }
+})
+const list = ref([])
+watch(
+  () => props.items, 
+  (newVal) => {
+    list.value = newVal
+  },
+  { immediate: true },
+  { deep: true }
+)
+const desc = [
+  { value: 'areaName' },
+  { value: 'eduName' },
+  { value: 'expName' }
 ]
 </script>
 
@@ -138,6 +63,7 @@ const list = [
   flex-wrap: wrap;
 }
 .sub-li {
+  position: relative;
   width: calc((100% - 24px) / 3);
   min-width: calc((100% - 24px) / 3);
   max-width: calc((100% - 24px) / 3);
@@ -152,6 +78,9 @@ const list = [
   &:nth-child(3n) {
     margin-right: 0;
   }
+  &:hover {
+    box-shadow: 0 16px 40px 0 rgba(153, 153, 153, .3);
+  }
 }
 .company-info {
   float: left;
@@ -230,9 +159,6 @@ ul li {
   text-overflow: ellipsis;
   white-space: nowrap;
   transition: all linear .2s;
-  &:hover {
-    color: var(--v-primary-base);
-  }
 }
 .message {
   color: #bfc1c9;
@@ -240,4 +166,10 @@ ul li {
     color: var(--v-primary-base);
   }
 }
+.moreBtn {
+  position: absolute;
+  bottom: 25px;
+  left: 50%;
+  translate: -50%;
+}
 </style>

+ 18 - 9
src/components/Position/item.vue

@@ -4,14 +4,17 @@
       <div class="job-info">
         <div class="sub-li-top">
           <div class="sub-li-info">
-            <p :class="['name', {'name-active': item.active }]">{{ item.name }}</p>
+            <p :class="['name', {'default-active': item.active }]">{{ item.name }}</p>
             <v-chip size="x-small" color="error" label variant="outlined" class="mr-1">急聘</v-chip>
             <v-chip size="x-small" color="warning" label variant="outlined">NEW</v-chip>
           </div>
           <p class="salary">{{ item.payFrom }}-{{ item.payTo }}/{{ item.payName }}</p>
         </div>
-        <div style="height: 24px;">
-          <v-chip size="x-small" label v-for="(k, i) in tagList" :key="i" class="mr-1" color="#666">{{ k }}</v-chip>
+        <div style="height: 24px;overflow: hidden;">
+          <v-chip size="x-small" label v-for="(k, i) in item.tagList" :key="i" class="mr-1" color="#666">{{ k }}</v-chip>
+        </div>
+        <div>
+          <v-chip size="x-small" label v-for="(j, i) in desc" :key="i" class="mr-1" color="#666" :prepend-icon="j.mdi">{{ item[j.value] }}</v-chip>
         </div>
       </div>
       <div class="sub-li-bottom">
@@ -40,7 +43,6 @@ const props = defineProps({
     default: () => []
   }
 })
-const tagList = ['广州','本科','1-3年']
 const list = ref([])
 watch(
   () => props.items, 
@@ -50,6 +52,11 @@ watch(
   { immediate: true },
   { deep: true }
 )
+const desc = [
+  { mdi: 'mdi-map-marker-outline', value: 'areaName' },
+  { mdi: 'mdi-school-outline', value: 'eduName' },
+  { mdi: 'mdi-clock-time-ten-outline', value: 'expName' }
+]
 </script>
 
 <style lang="scss" scoped>
@@ -58,11 +65,12 @@ watch(
   flex-wrap: wrap;
 }
 .sub-li {
+  position: relative;
   width: calc((100% - 24px) / 3);
   min-width: calc((100% - 24px) / 3);
   max-width: calc((100% - 24px) / 3);
   margin: 0 12px 12px 0;
-  height: 150px;
+  height: 165px;
   border-radius: 12px;
   padding: 0;
   overflow: hidden;
@@ -122,8 +130,12 @@ watch(
   }
 }
 .sub-li-bottom {
+  position: absolute;
+  width: 100%;
+  bottom: -6px;
+  left: 0;
   background: linear-gradient(90deg, #f5fcfc 0, #fcfbfa 100%);
-  margin-top: 0;
+  margin-top: 10px;
   padding-top: 0;
   display: block;
   border: none;
@@ -146,7 +158,4 @@ watch(
   background-color: #e0e0e0;
   margin: 0 10px;
 }
-.name-active {
-  color: var(--v-primary-base);
-}
 </style>

+ 3 - 2
src/hooks/web/useDictionaries.js

@@ -1,4 +1,4 @@
-import { getDictData, getIndustryListData } from '@/api/common/index'
+import { getDictData, getIndustryListData, getAreaListData } from '@/api/common/index'
 // 定义对应的api
 // const DICT_CITY_API = {
 //   menduner_exp_type: getDictData
@@ -22,7 +22,8 @@ export const getDict = (type, params, apiType = 'dict') => {
       const query = params ? params : { type }
       const apiFn = {
         dict: getDictData,
-        industryList: getIndustryListData
+        industryList: getIndustryListData,
+        areaList: getAreaListData
       }
       apiFn[apiType](query).then(data => {
         setDict(type, data, Date.now())

+ 10 - 1
src/locales/en.js

@@ -37,5 +37,14 @@ export default {
     mobileNumberPlaceholder: 'Please Enter Mobile Number',
     getSmsCode: 'Get SMS Code',
   },
-  form: {}
+  form: {},
+  position: {
+    moreBtn: 'View More Positions',
+    recommend: 'Recommended Positions',
+    latest: 'Latest Position',
+    urgent: 'Urgent Position'
+  },
+  enterprise: {
+    moreBtn: 'View More Enterprises'
+  }
 }

+ 10 - 1
src/locales/zh-CN.js

@@ -37,5 +37,14 @@ export default {
     mobileNumberPlaceholder: '请输入手机号码',
     getSmsCode: '获取验证码',
   },
-  form: {}
+  form: {},
+  position: {
+    moreBtn: '查看更多职位',
+    recommend: '推荐职位',
+    latest: '最新职位',
+    urgent: '急聘职位'
+  },
+  enterprise: {
+    moreBtn: '查看更多企业'
+  }
 }

+ 4 - 0
src/styles/index.css

@@ -26,3 +26,7 @@
   margin: 0 auto;
   align-items: center;
 }
+
+.default-active {
+  color: var(--v-primary-base) !important;
+}

+ 1 - 1
src/styles/index.min.css

@@ -1 +1 @@
-:root{--zIndex-dialog:9999;--default-bgc:#eaf4fe;--v-primary-base:#00897B;--v-primary-lighten1:#26A69A;--v-primary-lighten2:#4DB6AC;--v-primary-lighten3:#80CBC4;--v-primary-lighten4:#B2DFDB;--default-text:#666}.buttons{height:36px;width:224px}.half-button{height:36px;width:88px}.default-width{width:1184px;min-width:1184px;max-width:1184px;margin:0 auto;align-items:center}
+:root{--zIndex-dialog:9999;--default-bgc:#eaf4fe;--v-primary-base:#00897B;--v-primary-lighten1:#26A69A;--v-primary-lighten2:#4DB6AC;--v-primary-lighten3:#80CBC4;--v-primary-lighten4:#B2DFDB;--default-text:#666}.buttons{height:36px;width:224px}.half-button{height:36px;width:88px}.default-width{width:1184px;min-width:1184px;max-width:1184px;margin:0 auto;align-items:center}.default-active{color:var(--v-primary-base) !important}

+ 4 - 0
src/styles/index.scss

@@ -25,4 +25,8 @@
   max-width: 1184px;
   margin: 0 auto;
   align-items: center;
+}
+// 高亮
+.default-active {
+  color: var(--v-primary-base) !important;
 }

+ 59 - 35
src/views/Home/personal/account/dynamic/editPassword.vue

@@ -3,38 +3,56 @@
     <h3>修改密码</h3>
     <v-divider class="mb-4"></v-divider>
     <div class="login-user mb-4">当前登录账号: <span style="color: var(--v-primary-base);">{{ userInfo.phone }}</span></div>
-    <div style="width: 300px;">
-      <PhonePage ref="phoneRef"></PhonePage>
-      <v-form ref="passwordRef">
-        <v-text-field
-          v-model="query.password"
-          placeholder="请输入密码" 
-          variant="outlined" 
-          density="compact"
-          color="primary"
-          prepend-inner-icon="mdi-lock-outline" 
-          :append-inner-icon="passwordType ? 'mdi-eye-outline' : 'mdi-eye-off-outline'"
-          :type="passwordType ? 'text' : 'password'"
-          :rules="[v=> !!v || '请填写密码']"
-          @click:append-inner="passwordType = !passwordType"
-        ></v-text-field>
-        <v-text-field
-          v-model="query.checkPassword"
-          placeholder="请再次输入密码" 
-          variant="outlined" 
-          density="compact"
-          color="primary"
-          prepend-inner-icon="mdi-lock-outline" 
-          :append-inner-icon="show ? 'mdi-eye-outline' : 'mdi-eye-off-outline'"
-          :type="show ? 'text' : 'password'"
-          :rules="[v=> !!v || '请再次输入密码', passwordCheck]"
-          @click:append-inner="show = !show"
-        ></v-text-field>
-      </v-form>
-      <div class="text-center">
-        <v-btn class="buttons" color="primary" @click="handleSubmit" :loading="loading">确认密码</v-btn>
-      </div>
-    </div>
+    <v-stepper v-model="stepper" color="primary">
+      <v-stepper-header>
+        <v-stepper-item title="手机验证" value="1"></v-stepper-item>
+        <v-divider></v-divider>
+        <v-stepper-item title="修改密码" value="2"></v-stepper-item>
+      </v-stepper-header>
+      <v-stepper-window>
+        <v-stepper-window-item value="1">
+          <div class="d-flex justify-center">
+            <PhonePage ref="phoneRef" style="width: 300px;"></PhonePage>
+          </div>
+          <div class="text-center">
+            <v-btn class="buttons" color="primary" @click="handleValidate">立即验证</v-btn>
+          </div>
+        </v-stepper-window-item>
+        <v-stepper-window-item value="2">
+          <div class="d-flex justify-center">
+            <v-form ref="passwordRef" style="width: 300px;">
+              <v-text-field
+                v-model="query.password"
+                placeholder="请输入密码" 
+                variant="outlined" 
+                density="compact"
+                color="primary"
+                prepend-inner-icon="mdi-lock-outline" 
+                :append-inner-icon="passwordType ? 'mdi-eye-outline' : 'mdi-eye-off-outline'"
+                :type="passwordType ? 'text' : 'password'"
+                :rules="[v=> !!v || '请填写密码']"
+                @click:append-inner="passwordType = !passwordType"
+              ></v-text-field>
+              <v-text-field
+                v-model="query.checkPassword"
+                placeholder="请再次输入密码" 
+                variant="outlined" 
+                density="compact"
+                color="primary"
+                prepend-inner-icon="mdi-lock-outline" 
+                :append-inner-icon="show ? 'mdi-eye-outline' : 'mdi-eye-off-outline'"
+                :type="show ? 'text' : 'password'"
+                :rules="[v=> !!v || '请再次输入密码', passwordCheck]"
+                @click:append-inner="show = !show"
+              ></v-text-field>
+            </v-form>
+          </div>
+          <div class="text-center">
+            <v-btn class="buttons" color="primary" @click="handleSubmit" :loading="loading">确认密码</v-btn>
+          </div>
+        </v-stepper-window-item>
+      </v-stepper-window>
+    </v-stepper>
   </div>
 </template>
 
@@ -49,6 +67,7 @@ const passwordRef = ref()
 const passwordType = ref(false)
 const show = ref(false)
 const loading = ref(false)
+const stepper = ref('1')
 const query = reactive({
   password: '',
   checkPassword: ''
@@ -61,9 +80,8 @@ const passwordCheck = computed(() => {
 const userInfo = JSON.parse(localStorage.getItem('userInfo'))
 
 const handleSubmit = async () => {
-  const { valid: phoneValid } = await phoneRef.value.phoneForm.validate()
-  const { valid: passValid} = await passwordRef.value.validate()
-  if (!phoneValid || !passValid) return
+  const { valid} = await passwordRef.value.validate()
+  if (!valid) return
   loading.value = true
   try {
     await updatePassword({ password: query.password, code: phoneRef.value.loginData.code })
@@ -72,6 +90,12 @@ const handleSubmit = async () => {
     loading.value = false
   }
 }
+
+const handleValidate = async () => {
+  const { valid } = await phoneRef.value.phoneForm.validate()
+  if (!valid) return
+  stepper.value = '2'
+}
 </script>
 
 <style lang="scss" scoped>

+ 14 - 8
src/views/Home/personal/components/hotPromotedPositions.vue

@@ -1,9 +1,9 @@
 <template>
   <div>
     <v-tabs v-model="tab" align-tabs="start" color="primary" bg-color="#fff" @click="getPositionList">
-      <v-tab :value="1">推荐职位</v-tab>
-      <v-tab :value="2">最新职位</v-tab>
-      <v-tab :value="3">急聘职位</v-tab>
+      <v-tab :value="1">{{ $t('position.recommend') }}</v-tab>
+      <v-tab :value="2">{{ $t('position.latest') }}</v-tab>
+      <v-tab :value="3">{{ $t('position.urgent') }}</v-tab>
     </v-tabs>
     <v-window v-model="tab" class="mt-3">
       <v-window-item :value="1">
@@ -17,7 +17,7 @@
       </v-window-item>
     </v-window>
     <div class="text-center">
-      <v-btn class="buttons" color="primary">查看更多职位</v-btn>
+      <v-btn class="buttons" color="primary">{{ $t('position.moreBtn') }}</v-btn>
     </div>
   </div>
 </template>
@@ -33,12 +33,18 @@ const items = ref([])
 const dictObj = reactive({
   payUnit: [], // 薪资单位
   scale: [], // 规模
-  industry: [] // 行业
+  industry: [], // 行业
+  edu: [], // 学历
+  exp: [], // 工作经验
+  area: [] // 地区
 })
 const dictList = [
   { type: 'menduner_pay_unit', value: 'payUnit', key: 'payUnit', label: 'payName' },
   { type: 'menduner_scale', value: 'scale', key: 'scale', label: 'scaleName' },
-  { type: 'menduner_industry_type', value: 'industry', key: 'industryId', label: 'industryName', params: {}, apiType: 'industryList' }
+  { type: 'menduner_industry_type', value: 'industry', key: 'industryId', label: 'industryName', params: {}, apiType: 'industryList', nameKey: 'nameCn', valueKey: 'id' },
+  { type: 'menduner_education_type', value: 'edu', key: 'eduType', label: 'eduName' },
+  { type: 'menduner_exp_type', value: 'exp', key: 'expType', label: 'expName' },
+  { type: 'menduner_area_type', value: 'area', key: 'areaId', label: 'areaName', params: {}, apiType: 'areaList', nameKey: 'name', valueKey: 'id' }
 ]
 
 // 推荐职位
@@ -47,8 +53,8 @@ const getPositionList = async () => {
   const { list } = await api({ pageNo: 1, pageSize: 9 })
   dictList.forEach(item => {
     items.value = list.map(e => {
-      const valueKey = item.type === 'menduner_industry_type' ? 'nameCn' : 'label'
-      const idKey = item.type === 'menduner_industry_type' ? 'id' : 'value'
+      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]) === e[item.key])[valueKey]
       e.active = false
       return e

+ 63 - 2
src/views/Home/personal/components/popularEnterprises.vue

@@ -1,12 +1,73 @@
 <template>
   <div>
-    <HotPromoted></HotPromoted>
+    <HotPromoted :items="items"></HotPromoted>
     <div class="text-center">
-      <v-btn class="buttons" color="primary">查看更多企业</v-btn>
+      <v-btn class="buttons" color="primary">{{ $t('enterprise.moreBtn') }}</v-btn>
     </div>
   </div>
 </template>
 
 <script setup name="popularEnterprises">
 import HotPromoted from '@/components/Enterprise/hotPromoted.vue'
+import { ref, reactive } from 'vue'
+import { getHotEnterprise } from '@/api/enterprise'
+import { getDict } from '@/hooks/web/useDictionaries'
+
+const items = ref([])
+const dictObj = reactive({
+  payUnit: [], // 薪资单位
+  scale: [], // 规模
+  industry: [], // 行业
+  edu: [], // 学历
+  exp: [], // 工作经验
+  area: [], // 地区
+  financing: [] // 融资类型
+})
+const dictList = [
+  { type: 'menduner_pay_unit', value: 'payUnit', key: 'payUnit', label: 'payName' },
+  { type: 'menduner_education_type', value: 'edu', key: 'eduType', label: 'eduName' },
+  { type: 'menduner_exp_type', value: 'exp', key: 'expType', label: 'expName' },
+  { type: 'menduner_area_type', value: 'area', key: 'areaId', label: 'areaName', params: {}, apiType: 'areaList', nameKey: 'name', valueKey: 'id' },
+  { type: 'menduner_financing_status', value: 'financing', key: 'financingStatus', label: 'financingName', isEnter: true },
+  { type: 'menduner_scale', value: 'scale', key: 'scale', label: 'scaleName', isEnter: true },
+  { type: 'menduner_industry_type', value: 'industry', key: 'industryId', label: 'industryName', params: {}, apiType: 'industryList', nameKey: 'nameCn', valueKey: 'id', isEnter: true }
+]
+
+// 热门企业
+const getHotEnterpriseList = async () => {
+  const { list } = await getHotEnterprise({ pageNo: 1, pageSize: 9 })
+  dictList.forEach(item => {
+    items.value = list.map(e => {
+      if (item.isEnter) {
+        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]) === e[item.key])[valueKey]
+      }
+      const list = e.jobList
+      deal(item, list, e)
+      return e
+    })
+  })
+}
+const deal = (item, list, e) => {
+  if (item.isEnter) return
+  list.map(val => {
+    const valueKey = item.nameKey ? item.nameKey : 'label'
+    const idKey = item.valueKey ? item.valueKey : 'value'
+    val[item.label] = dictObj[item.value].find(k => Number(k[idKey]) === val[item.key])[valueKey]
+    val.active = false
+    return val
+  })
+  e.jobList = list
+}
+
+// 字典
+const getDictList = async () => {
+  dictList.forEach(async (val) => {
+    const { data } = await getDict(val.type, val.params, val.apiType)
+    dictObj[val.value] = data
+  })
+}
+getDictList()
+getHotEnterpriseList()
 </script>