Browse Source

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

lifanagju_citu 9 months ago
parent
commit
971828eaef

+ 33 - 0
src/api/recruit/enterprise/statistics/index.js

@@ -0,0 +1,33 @@
+import request from '@/config/axios'
+
+// 获取投递简历的年龄分布
+export const getJobCvAgeCount = async (params) => {
+  return await request.get({
+    url: '/app-admin-api/menduner/system/analysis/get/job/cv/age/count',
+    params
+  })
+}
+
+// 获取投递简历的学历分布
+export const getJobCvEduCount = async (params) => {
+  return await request.get({
+    url: '/app-admin-api/menduner/system/analysis/get/job/cv/edu/count',
+    params
+  })
+}
+
+// 获取投递简历的工作经验分布
+export const getJobCvExpCount = async (params) => {
+  return await request.get({
+    url: '/app-admin-api/menduner/system/analysis/get/job/cv/exp/count',
+    params
+  })
+}
+
+// 获取投递简历的性别分布
+export const getJobCvSexCount = async (params) => {
+  return await request.get({
+    url: '/app-admin-api/menduner/system/analysis/get/job/cv/sex/count',
+    params
+  })
+}

+ 1 - 0
src/components/DatePicker/index.vue

@@ -17,6 +17,7 @@
       :clearable="options.clearable ?? true"
       :day-names="['一', '二', '三', '四', '五', '六', '七']"
       v-bind="$attrs"
+      @update:model-value="options?.change"
     ></VueDatePicker>
   </div>
 </template>

+ 6 - 5
src/components/Echarts/index.vue

@@ -16,7 +16,6 @@ const props = defineProps({
     type: [Number, String],
     default: 485
   },
-  // 附加数据
   option: {
     type: [Object, Array],
     default: () => {}
@@ -32,13 +31,15 @@ const initMap = () => {
   chart.value.on('click', (param) => {
     emit('click', param)
   })
-  window.addEventListener('resize',()=>{
-    chart.value.resize()
-  })
+  // window.addEventListener('resize',()=>{
+  //   chart.value.resize()
+  // })
 }
 
 onMounted(() => {
-  initMap()
+  nextTick(()=>{
+    initMap()
+  })
 })
 
 watch(

+ 5 - 5
src/components/Enterprise/hotPromoted.vue

@@ -10,11 +10,11 @@
           <div class="company-info">
             <h3>{{ item.enterprise.anotherName }}</h3>
             <p>
-              {{ item.financingName }}
-              <span class="septal-line" v-if="item.financingName && item.scaleName"></span>
-              {{ item.scaleName }}
-              <span class="septal-line" v-if="item.industryName"></span>
-              {{ item.industryName }}
+              {{ item?.enterprise.financingName }}
+              <span class="septal-line" v-if="item.enterprise.financingName && item.enterprise.scaleName"></span>
+              {{ item?.enterprise.scaleName }}
+              <span class="septal-line" v-if="item.enterprise.industryName"></span>
+              {{ item?.enterprise.industryName }}
             </p>
           </div>
         </div>

+ 7 - 1
src/components/PositionLongStrip/item.vue

@@ -33,7 +33,13 @@
               <h3 v-bind="props" :class="{'default-active': isHovering }" class="title1">{{ item.enterprise.anotherName }}</h3>
             </template>
           </v-hover>
-          <p class="mt-2">{{ item.enterprise.financingName }}<span class="mx-2">|</span>{{ item.enterprise.scaleName }}<span class="mx-2">|</span>{{ item.enterprise.industryName }}</p>
+          <p class="mt-2">
+            {{ item.enterprise.financingName }}
+            <span class="mx-2" v-if="item.enterprise.financingName && item.enterprise.industryName">|</span>
+            {{ item.enterprise.scaleName }}
+            <span class="mx-2" v-if="item.enterprise.scaleName && item.enterprise.industryName">|</span>
+            {{ item.enterprise.industryName }}
+          </p>
         </div>
       </div>
     </div>

+ 15 - 8
src/config/axios/service.js

@@ -201,14 +201,21 @@ service.interceptors.response.use(
     }
     
     // 请求成功后触发获取积分
-    if (!requestCompletionTrigger.length) {
-      return data
-    }
-    const _list = requestCompletionTrigger.filter(_e => {
-      return response.config.url.includes(_e.url)
-    })
-    if (_list.length) {
-      getIntegral(_list.pop().url, userStore)
+    // if (!requestCompletionTrigger.length) {
+    //   return data
+    // }
+    // const _list = requestCompletionTrigger.filter(_e => {
+    //   return response.config.url.includes(_e.url)
+    // })
+    // if (_list.length) {
+    //   getIntegral(_list.pop().url, userStore)
+    // }
+
+    const url = getSuffixAfterPrefix(response.config.url)
+    if (!url || !requestCompletionTrigger.length) return data
+    const _obj = requestCompletionTrigger.find(e => e.url === url)
+    if (_obj) {
+      getIntegral(_obj.url, userStore)
     }
     return data
   },

+ 25 - 0
src/utils/date.js

@@ -60,4 +60,29 @@ export const getStartAndEndOfDay = (dateString) => {
   }
 
   return [formatDate(startDate), formatDate(endDate)]
+}
+
+// 传入一组时间戳,返回 [最早时间点,最晚时间点]
+export const  convertTimestampsToDayRange = (timestamps) => {
+  if (timestamps.length < 2) {
+    throw new Error('Timestamps array must contain at least two elements')
+  }
+  function formatDate(date) {
+    const year = date.getFullYear();
+    const month = String(date.getMonth() + 1).padStart(2, '0')
+    const day = String(date.getDate()).padStart(2, '0')
+    const hours = String(date.getHours()).padStart(2, '0')
+    const minutes = String(date.getMinutes()).padStart(2, '0')
+    const seconds = String(date.getSeconds()).padStart(2, '0')
+    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
+  }
+
+  const startDate = new Date(timestamps[0])
+  const endDate = new Date(timestamps[1])
+
+  const startOfDay = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate())
+
+  const endOfDay = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate() + 1, 0, 0, 0, -1)
+
+  return [formatDate(startOfDay), formatDate(endOfDay)]
 }

+ 1 - 0
src/utils/position.js

@@ -56,6 +56,7 @@ export const dealDictArrayData = (res, list) => {
 }
 
 export const dealDictObjData = (res, obj) => {
+  res = obj
   Object.keys(obj).map(e => {
     const data = dictList.value.find(k => k.key === e)
     if (!data) return

+ 6 - 3
src/views/recruit/enterprise/informationManagement/informationSettings.vue

@@ -23,11 +23,14 @@ import welfareLabel from './informationSettingsComponents/welfareLabel.vue'
 import businessInformation from './informationSettingsComponents/businessInformation.vue'
 import authentication from './informationSettingsComponents/authentication.vue'
 import { ref, watch } from 'vue'
-import { useRoute, useRouter } from 'vue-router'
+import { 
+  useRoute, 
+  // useRouter
+} from 'vue-router'
 import { useI18n } from '@/hooks/web/useI18n'
 
 const route = useRoute()
-const router = useRouter()
+// const router = useRouter()
 const { t } = useI18n()
 // tab
 const tab = ref(1)
@@ -43,7 +46,7 @@ const tabList = [
 
 watch(() => route?.query?.tabKey, (newVal) => { if (newVal) tab.value = newVal - 0 })
 const handleTabClick = () => {
-  router.push(`${route.path}?tabKey=${tab.value.toString()}`)
+  // router.push(`${route.path}?tabKey=${tab.value.toString()}`)
 }
 </script>
 

+ 6 - 6
src/views/recruit/enterprise/informationManagement/informationSettingsComponents/basicInfo.vue

@@ -5,8 +5,8 @@
     <CtForm ref="CtFormRef" :items="formItems" style="width: 900px;margin: 0 auto">
       <template #name="{ item }">
         <div v-show="!item.show" class="text-right" style="width: 80px; line-height: 40px;">
-          <v-icon :color="statusInfo.color" size="20">{{ authInfo && authInfo.status === '1' ? 'mdi-shield-check' : 'mdi-shield-remove' }}</v-icon> <!-- mdi-shield-remove -->
-          <span style="color: var(--v-primary-base);font-size: 14px;">{{ statusInfo.label }}</span>
+          <v-icon :color="statusInfo.color" size="20">{{ statusInfo.mdi }}</v-icon>
+          <span :style="{'color': statusInfo.color,'font-size': '14px'}">{{ statusInfo.label }}</span>
         </div>
       </template>
       <template #industryId="{ item }">
@@ -185,10 +185,10 @@ getDict('menduner_industry_type', {}, 'industryList').then(({ data }) => {
 // 获取企业实名信息
 const authInfo = ref({})
 const statusList = [
-  { label: '未认证', color: 'warning', value: null },
-  { label: '审核中', color: 'warning', value: '0' },
-  { label: '已认证', color: 'primary', value: '1' },
-  { label: '已驳回', color: 'error', value: '2' }
+  { label: '未认证', color: '#fb8c00', value: null, mdi: 'mdi-shield-remove' },
+  { label: '审核中', color: '#fb8c00', value: '0', mdi: 'mdi-shield-half-full' },
+  { label: '已认证', color: '#00897B', value: '1', mdi: 'mdi-shield-check' },
+  { label: '已驳回', color: '#fe574a', value: '2', mdi: 'mdi-shield-off' }
 ]
 const getAuthInfo = async () => {
   const data = await getEnterpriseAuth()

+ 0 - 174
src/views/recruit/enterprise/statistics/components/data.js

@@ -1,174 +0,0 @@
-export const list = [
-  {
-    col: 6,
-    option: {
-      title: {
-        text: '性别比例'
-      },
-      tooltip: {
-        trigger: 'item'
-      },
-      legend: {
-        top: '5%',
-        left: 'center'
-      },
-      series: [
-        {
-          name: 'Access From',
-          type: 'pie',
-          radius: ['40%', '70%'],
-          avoidLabelOverlap: false,
-          itemStyle: {
-            borderRadius: 10,
-            borderColor: '#fff',
-            borderWidth: 2
-          },
-          label: {
-            show: true,
-            formatter: e => {
-              return e.name + ': ' + e.value + '%'
-            }
-          },
-          labelLine: {
-            show: true
-          },
-          data: [
-            { value: 65, name: '男' },
-            { value: 35, name: '女' }
-          ]
-        }
-      ]
-    }
-  },
-  {
-    col: 6,
-    option: {
-      title: {
-        text: '年龄分布'
-      },
-      xAxis: {
-        type: 'category',
-        name: '范围',
-        data: ['18-22岁', '22-30岁', '30-39岁', '40-49岁', '50-59岁']
-      },
-      yAxis: {
-        type: 'value'
-      },
-      grid: {
-        left: '0',
-        top: '60',
-        right: '50',
-        bottom: '10',
-        containLabel: true
-      },
-      series: [
-        {
-          data: [120, 200, 150, 80, 70],
-          type: 'bar',
-          barWidth: 40,
-          label: {
-            show: true
-          }
-        }
-      ]
-    }
-  },
-  {
-    col: 6,
-    option: {
-      title: {
-        text: '工作年限分布'
-      },
-      xAxis: {
-        type: 'category',
-        name: '范围',
-        data: ['应届毕业生', '1年以上', '2年以上', '3年以上', '5年以上', '8年以上', '10年以上']
-      },
-      yAxis: {
-        type: 'value'
-      },
-      grid: {
-        left: '0',
-        top: '60',
-        right: '50',
-        bottom: '10',
-        containLabel: true
-      },
-      series: [
-        {
-          data: [120, 200, 150, 80, 70, 110, 130],
-          type: 'bar',
-          barWidth: 40,
-          label: {
-            show: true
-          }
-        }
-      ]
-    }
-  },
-  {
-    col: 6,
-    option: {
-      title: {
-        text: '学历分布'
-      },
-      xAxis: {
-        type: 'category',
-        name: '范围',
-        data: ['本科以上', '大专', '中专', '中技', '高中', '初中']
-      },
-      yAxis: {
-        type: 'value'
-      },
-      grid: {
-        left: '0',
-        top: '60',
-        right: '50',
-        bottom: '10',
-        containLabel: true
-      },
-      series: [
-        {
-          data: [120, 200, 150, 80, 70, 110],
-          type: 'bar',
-          barWidth: 40,
-          label: {
-            show: true
-          }
-        }
-      ]
-    }
-  },
-  // {
-  //   col: 12,
-  //   option: {
-  //     title: {
-  //       text: '期望月薪'
-  //     },
-  //     xAxis: {
-  //       type: 'category',
-  //       data: ['3-5k', '5-8k', '8-12k', '12-15k', '15-20k', '20-30k', '面议']
-  //     },
-  //     yAxis: {
-  //       type: 'value'
-  //     },
-  //     grid: {
-  //       left: '0',
-  //       top: '50',
-  //       right: '0',
-  //       bottom: 0,
-  //       containLabel: true
-  //     },
-  //     series: [
-  //       {
-  //         data: [120, 200, 150, 80, 70, 110, 130],
-  //         type: 'bar',
-  //         barWidth: 40,
-  //         label: {
-  //           show: true
-  //         }
-  //       }
-  //     ]
-  //   }
-  // }
-]

+ 136 - 17
src/views/recruit/enterprise/statistics/components/resume.vue

@@ -1,47 +1,51 @@
 <template>
-  <!-- <v-container>
-    <v-row>
-      <v-col class="bgc" v-for="(val, i) in list" :key="i" :md="val.col">
-        <Echarts :height="400" :option="val.option"></Echarts>
-      </v-col>
-    </v-row>
-  </v-container> -->
   <div class="chart-box">
     <div class="chart-item" v-for="(val, i) in list" :key="i">
       <Echarts :height="400" :option="val.option"></Echarts>
     </div>
-    <div class="fullChart">
+    <!-- <div class="fullChart">
       <Echarts :height="400" :option="option"></Echarts>
-    </div>
+    </div> -->
   </div>
 </template>
 
 <script setup>
 defineOptions({ name: 'resume-analysis'})
-import { list } from './data.js'
+import { ref, onMounted, watch, nextTick } from 'vue'
+import cloneDeep from 'lodash/cloneDeep'
+import { getJobCvAgeCount, getJobCvEduCount, getJobCvSexCount, getJobCvExpCount } from '@/api/recruit/enterprise/statistics'
+
+const props = defineProps({
+  query: Object
+})
 
-const option = {
+// 柱状图公共option
+const barCommonOption = {
   title: {
-    text: '期望月薪'
+    text: ''
   },
   xAxis: {
     type: 'category',
     name: '范围',
-    data: ['3-5k', '5-8k', '8-12k', '12-15k', '15-20k', '20-30k', '面议']
+    axisLabel: {
+      rotate: 30
+    },
+    data: []
   },
   yAxis: {
-    type: 'value'
+    type: 'value',
+    name: '数量(人)'
   },
   grid: {
-    left: '0',
-    top: '60',
+    left: '20',
+    top: '70',
     right: '50',
     bottom: '10',
     containLabel: true
   },
   series: [
     {
-      data: [120, 200, 150, 80, 70, 110, 130],
+      data: [],
       type: 'bar',
       barWidth: 40,
       label: {
@@ -51,6 +55,121 @@ const option = {
   ]
 }
 
+// 期望月薪柱状图
+// const option = {
+//   title: {
+//     text: '期望月薪'
+//   },
+//   xAxis: {
+//     type: 'category',
+//     name: '范围',
+//     data: ['3-5k', '5-8k', '8-12k', '12-15k', '15-20k', '20-30k', '面议']
+//   },
+//   yAxis: {
+//     type: 'value'
+//   },
+//   grid: {
+//     left: '0',
+//     top: '60',
+//     right: '50',
+//     bottom: '10',
+//     containLabel: true
+//   },
+//   series: [
+//     {
+//       data: [120, 200, 150, 80, 70, 110, 130],
+//       type: 'bar',
+//       barWidth: 40,
+//       label: {
+//         show: true
+//       }
+//     }
+//   ]
+// }
+
+const list = ref([
+  {
+    api: getJobCvSexCount,
+    isPie: true,
+    option: {
+      title: {
+        text: '性别分布'
+      },
+      tooltip: {
+        trigger: 'item'
+      },
+      legend: {
+        top: '5%',
+        left: 'center'
+      },
+      series: [
+        {
+          name: '性别分布',
+          type: 'pie',
+          radius: ['40%', '70%'],
+          avoidLabelOverlap: false,
+          itemStyle: {
+            borderRadius: 10,
+            borderColor: '#fff',
+            borderWidth: 2
+          },
+          label: {
+            show: true,
+            formatter: e => {
+              return e.data.key + ': ' + e.value + '人'
+            }
+          },
+          labelLine: {
+            show: true
+          },
+          data: []
+        }
+      ]
+    }
+  },
+  {
+    api: getJobCvAgeCount,
+    title: '年龄分布',
+    option: cloneDeep(barCommonOption)
+  },
+  {
+    api: getJobCvExpCount,
+    title: '工作年限分布',
+    option: cloneDeep(barCommonOption)
+  },
+  {
+    api: getJobCvEduCount,
+    title: '学历分布',
+    option: cloneDeep(barCommonOption)
+  }
+])
+
+const getStatistics = () => {
+  list.value.forEach(async (e) => {
+    const data = await e.api(props.query)
+    if (e.isPie) {
+      e.option.series[0].data = data
+    } else {
+      e.option.title.text = e.title
+      e.option.xAxis.data = data.x
+      e.option.series[0].data = data.y
+    }
+  })
+}
+
+onMounted(() => {
+  nextTick(() => {
+    getStatistics()
+  })
+})
+
+watch(
+  () => props.query,
+  (val) => {
+    if (val) getStatistics()
+  },
+  { deep: true }
+)
 </script>
 
 <style scoped lang="scss">

+ 35 - 6
src/views/recruit/enterprise/statistics/overallAnalysis.vue

@@ -4,13 +4,13 @@
       <div class="d-flex align-center">
         <span>选择时间</span>
         <div class="ml-5 after">
-          <span v-for="(k, i) in list" :key="i" :class="['item', { 'active': current === (i + 1) }]" @click="current = i + 1 ">{{ k }}</span>
+          <span v-for="(k, i) in list" :key="i" :class="['item', { 'active': current === i }]" @click="handleClickType(i)">{{ k.label }}</span>
         </div>
       </div>
       <div class="d-flex align-center ml-15">
         <span>自定义日期</span>
         <div class="ml-5">
-          <date-picker v-model="date" :options="{ range: true, clearable: true, placeholder: '请选择要查看的时间范围' }"></date-picker>
+          <date-picker v-model="date" :options="{ range: true, clearable: true, placeholder: '请选择要查看的时间范围', change: handleChangeDate, format: 'timestamp' }"></date-picker>
         </div>
       </div>
     </div>
@@ -24,7 +24,7 @@
       <v-tabs class="mb-5" v-model="tab" align-tabs="start" color="primary" bg-color="#f7f8fa">
         <v-tab :value="1">应聘简历分析</v-tab>
       </v-tabs>
-      <ResumeAnalysis></ResumeAnalysis>
+      <ResumeAnalysis :query="query"></ResumeAnalysis>
     </div>
     <div>
       <v-tabs v-model="tab" align-tabs="start" color="primary" bg-color="#f7f8fa">
@@ -37,15 +37,44 @@
 
 <script setup>
 defineOptions({ name: 'overallAnalysis'})
-import { ref } from 'vue'
+import { reactive, ref } from 'vue'
 import Overview from './components/overview.vue'
 import DailyPage from './components/daily.vue'
 import ResumeAnalysis from './components/resume.vue'
+import { convertTimestampsToDayRange } from '@/utils/date'
 
 const tab = ref(1)
 const date = ref(null)
-const current = ref(1)
-const list = ['最近7天', '上个月', '上季度']
+const current = ref(0)
+const query = reactive({
+  type: 0,
+  time: null
+})
+const list = [
+  { label: '最近7天', value: 0 },
+  { label: '上个月', value: 1 },
+  { label: '上季度', value: 2 }
+]
+
+// 类型选择
+const handleClickType = (i) => {
+  current.value = i
+  query.time = null
+  date.value = null
+  query.type = list[i].value
+}
+
+// 时间范围选择
+const handleChangeDate = (time) => {
+  if (!time) {
+    query.type = 0
+    query.time = null
+    return
+  }
+  current.value = null
+  query.type = 99
+  query.time = convertTimestampsToDayRange(time)
+}
 
 </script>
 

+ 4 - 7
src/views/recruit/personal/PersonalCenter/dynamic/right.vue

@@ -43,12 +43,12 @@
       </div>
       <span class="more-text">{{ $t('resume.uploadUpToFiveCopies') }}</span>
       <div v-if="attachmentList.length">
-        <div class="d-flex attachment-item my-2 cursor-pointer" v-for="k in attachmentList" :key="k.id">
+        <div class="d-flex attachment-item my-2" 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>
-          <v-icon color="error" @click="handleDelete(k)">mdi-trash-can-outline</v-icon>
+          <v-icon class="cursor-pointer" color="primary" @click="previewFile(k.url)">mdi-eye-outline</v-icon>
+          <v-icon class="cursor-pointer mx-2" color="primary" @click="handleDownload(k)">mdi-download-box-outline</v-icon>
+          <v-icon class="cursor-pointer" color="error" @click="handleDelete(k)">mdi-trash-can-outline</v-icon>
         </div>
       </div>
       <div v-else class="more-text d-flex justify-center">暂无简历,请先上传</div>
@@ -281,9 +281,6 @@ const interviewScheduleMore = () => {
     font-size: 14px;
     .file-name {
       width: 230px;
-      &:hover {
-        color: var(--v-primary-base);
-      }
     }
   }
 }

+ 8 - 50
src/views/recruit/personal/home/components/popularEnterprises.vue

@@ -9,63 +9,21 @@
 
 <script setup name="popularEnterprises">
 import HotPromoted from '@/components/Enterprise/hotPromoted.vue'
-import { ref, reactive } from 'vue'
+import { ref } from 'vue'
 import { getHotEnterprise } from '@/api/enterprise'
-import { getDict } from '@/hooks/web/useDictionaries'
-import { dealDictArrayData } from '@/utils/position'
+import { dealDictArrayData, dealDictObjData } from '@/utils/position'
 
 const items = ref([])
-const dictObj = reactive({
-  payUnit: [], // 薪资单位
-  scale: [], // 规模
-  industry: [], // 行业
-  edu: [], // 学历
-  exp: [], // 工作经验
-  area: [], // 地区
-  financing: [] // 融资类型
-})
-const dictList = ref([
-  { 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.value.forEach(item => {
-    items.value = list.map(e => {
-      if (item.isEnter) {
-        const valueKey = item.nameKey ? item.nameKey : 'label'
-        const idKey = item.valueKey ? item.valueKey : 'value'
-        const obj = dictObj[item.value].find(k => k[idKey] === e.enterprise[item.key])
-        if (!obj) return
-        e[item.label] = obj[valueKey]
-      }
-      const list = e.jobList
-      if (!item.isEnter) {
-        // 职位列表
-        e.jobList = dealDictArrayData([], list).slice(0, 3)
-      }
-      return e
-    })
+  items.value = list.map(e => {
+    let jobList = []
+    const enterprise = dealDictObjData({}, e.enterprise)
+    if (e.jobList && e.jobList.length) jobList = dealDictArrayData([], e.jobList).slice(0, 3)
+    return { enterprise, jobList }
   })
 }
-
-// 字典
-const getDictList = async () => {
-  dictList.value.forEach(async (val) => {
-    const { data } = await getDict(val.type, val.params, val.apiType)
-    dictObj[val.value] = data
-  })
-}
-const getData = async () => {
-  await getDictList()
-  getHotEnterpriseList()
-}
-getData()
+getHotEnterpriseList()
 </script>

+ 1 - 1
src/views/recruit/personal/remuse/components/basicInfo.vue

@@ -161,7 +161,7 @@ const handleUploadFile = async (e) => {
   if (!data) return
   Snackbar.success(t('common.uploadSucMsg'))
   await updatePersonAvatar(data)
-  if (baseInfo.value.userId) await userStore.getUserBaseInfos(baseInfo.value.userId)
+  await userStore.getUserBaseInfos(baseInfo.value.userId)
   getBasicInfo()
 }
 

+ 1 - 0
src/views/recruit/personal/remuse/components/educationExp.vue

@@ -72,6 +72,7 @@ const getSchoolListData = async (name, init = '') => {
   item.items = data
 }
 const debouncedCallbackSchool = debounce(newValue => {
+  if (!newValue) return
   getSchoolListData(newValue)
 }, 500)