Xiao_123 11 kuukautta sitten
vanhempi
commit
139daa9db1

+ 1 - 2
src/api/resume.js

@@ -197,7 +197,6 @@ export const getPersonResumeCv = async () => {
 // 修改求职类型
 export const updateJobStatus = async (data) => {
   return await request.post({
-    url: '/app-api/menduner/system/person/resume/job/status/update',
-    data
+    url: '/app-api/menduner/system/person/resume/job/status/update?status=' + data,
   })
 }

+ 2 - 2
src/components/Enterprise/components/positions.vue

@@ -78,7 +78,7 @@ import { reactive, ref, provide } from 'vue'
 import { useRoute, useRouter } from 'vue-router'
 import { timesTampChange } from '@/utils/date'
 import { getDict } from '@/hooks/web/useDictionaries'
-import { dealDictData } from '@/views/recruit/position/components/dict'
+import { dealDictObjData } from '@/views/recruit/position/components/dict'
 import { getJobAdvertisedPositionCount, getJobAreaByEnterpriseId, getJobAdvertisedSearch } from '@/api/position'
 import MPagination from '@/components/CtPagination'
 import expType from '@/views/recruit/position/components/conditionFilter/expType.vue'
@@ -183,7 +183,7 @@ const getPositionList = async (isSearch) => {
   total.value = number
   list.value = arr.map(e => {
     e.active = false
-    e.job = { ...e.job, ...dealDictData({}, e.job) }
+    e.job = { ...e.job, ...dealDictObjData({}, e.job) }
     return e
   })
 }

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

@@ -87,7 +87,7 @@ import EnterpriseIntroduction from './components/introduction.vue'
 import recruitmentPositions from './components/positions.vue'
 import { getEnterpriseDetails, getEnterpriseSubscribeCheck, getEnterpriseSubscribe, getEnterpriseUnsubscribe, enterpriseClick } from '@/api/enterprise'
 import { timesTampChange } from '@/utils/date'
-import { dealDictData } from '@/views/recruit/position/components/dict.js'
+import { dealDictObjData } from '@/views/recruit/position/components/dict.js'
 import { useRoute, useRouter } from 'vue-router'
 
 const props = defineProps({
@@ -129,7 +129,7 @@ const getDetails = async () => {
   const time = timesTampChange(data.business.establishmentTime)
   data.business.establishmentTime = time.slice(0, 10)
 
-  info.value = { ...data, ...dealDictData({}, data.enterprise) }
+  info.value = { ...data, ...dealDictObjData({}, data.enterprise) }
   getCollectionStatus(id)
 }
 getDetails()

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

@@ -25,7 +25,7 @@
 <script setup>
 defineOptions({ name: 'enterprise-info' })
 import { ref } from 'vue'
-import { dealDictData } from '@/views/recruit/position/components/dict'
+import { dealDictObjData } from '@/views/recruit/position/components/dict'
 const props = defineProps({
   info: {
     type: Object,
@@ -41,7 +41,7 @@ const list = [
 const obj = ref({})
 const getData = async () => {
   const prise = props.info.enterprise
-  obj.value = dealDictData(obj.value, prise)
+  obj.value = dealDictObjData({}, prise)
 }
 getData()
 

+ 16 - 9
src/layout/company/navBar.vue

@@ -60,7 +60,7 @@
                 :key="item.name"
                 :value="item.lang"
                 :active="localeStore.currentLocale.lang === item.lang"
-                @click="localeStore.setCurrentLocale(item)"
+                @click="handleChangeLocale(item)"
               >
                 <v-list-item-title>{{ item.name }}</v-list-item-title>
               </v-list-item>
@@ -79,6 +79,7 @@ import { ref } from 'vue'
 import { getToken } from '@/utils/auth'
 import { useUserStore } from '@/store/user'
 import { useLocaleStore } from '@/store/locale'
+import { useI18n } from '@/hooks/web/useI18n'
 defineOptions({ name: 'personal-navbar' })
 
 defineProps({
@@ -88,6 +89,7 @@ defineProps({
   }
 })
 
+const { t } = useI18n()
 const localeStore = useLocaleStore()
 const userStore = useUserStore()
 
@@ -95,10 +97,9 @@ import { useRouter } from 'vue-router'
 const router = useRouter()
 const handleLogoClick = () => { router.push({ path: '/enterprise/home'}) }
 
-const changeRole = () => {
-  router.push({ path: '/' })
-  // router.push({ path: '/enterprise/register' })
-}
+// const changeRole = () => {
+//   router.push({ path: '/' })
+// }
 
 const handleToPersonalCenter = () => {
   // router.push({ path: '/personalCenter' })
@@ -111,12 +112,18 @@ const handleLogout = async () => {
 }
 
 const items = ref([
-  { title: '联系人信息', icon: 'mdi-account-outline', change: () => router.push({ path: '/resume' }) },
-  { title: '账号管理', icon: 'mdi-cog-outline', change: () => router.push({ path: '/personalAccount/accountBinding' }) },
-  { title: '切换为求职者', icon: 'mdi-swap-horizontal', change: changeRole },
-  { title: '退出登录', icon: 'mdi-logout', change: handleLogout }
+  // { title: '联系人信息', icon: 'mdi-account-outline', change: () => router.push({ path: '/resume' }) },
+  // { title: '账号管理', icon: 'mdi-cog-outline', change: () => router.push({ path: '/personalAccount/accountBinding' }) },
+  // { title: '切换为求职者', icon: 'mdi-swap-horizontal', change: changeRole },
+  { title: t('setting.logOut'), icon: 'mdi-logout', change: handleLogout }
 ])
 const baseInfo = JSON.parse(localStorage.getItem('baseInfo')) // 人才信息
+
+// 语言切换
+const handleChangeLocale = (item) => {
+  localeStore.setCurrentLocale(item)
+  location.reload()
+}
 </script>
 
 <style lang="scss" scoped>

+ 9 - 7
src/layout/personal/navBar.vue

@@ -102,6 +102,7 @@ import { ref } from 'vue'
 import { getToken } from '@/utils/auth'
 import { useUserStore } from '@/store/user'
 import { useLocaleStore } from '@/store/locale'
+import { useI18n } from '@/hooks/web/useI18n'
 import { getUserBindEnterpriseList, getUserRegisterEnterpriseApply } from '@/api/personal/user'
 defineOptions({ name: 'personal-navbar' })
 
@@ -112,13 +113,14 @@ defineProps({
   }
 })
 
+const { t } = useI18n()
 const localeStore = useLocaleStore()
 const userStore = useUserStore()
 
 const list = ref([
-  { text: '首页', path: '/home' },
-  { text: '职位', path: '/recruit/position' },
-  { text: '公司', path: '/recruit/company' }
+  { text: t('common.home'), path: '/home' },
+  { text: t('common.position'), path: '/recruit/position' },
+  { text: t('common.company'), path: '/recruit/company' }
 ])
 
 import { useRouter } from 'vue-router'
@@ -168,10 +170,10 @@ const changeRole = async () => {
 }
 
 const items = ref([
-  { title: '在线简历', icon: 'mdi-list-box-outline', change: () => router.push({ path: '/resume' }) },
-  { title: '账号设置', icon: 'mdi-cog-outline', change: () => router.push({ path: '/personalAccount/accountBinding' }) },
-  { title: '切换为招聘者', icon: 'mdi-swap-horizontal', change: changeLoginType },
-  { title: '退出登录', icon: 'mdi-logout', change: handleLogout }
+  { title: t('resume.onlineResume'), icon: 'mdi-list-box-outline', change: () => router.push({ path: '/resume' }) },
+  { title: t('setting.accountSettings'), icon: 'mdi-cog-outline', change: () => router.push({ path: '/personalAccount/accountBinding' }) },
+  { title: t('setting.switchToRecruit'), icon: 'mdi-swap-horizontal', change: changeLoginType },
+  { title: t('setting.logOut'), icon: 'mdi-logout', change: handleLogout }
 ])
 
 let baseInfo = ref(JSON.parse(localStorage.getItem('baseInfo')) || {}) // 人才信息

+ 24 - 4
src/locales/en.js

@@ -20,7 +20,12 @@ export default {
     uploadErrMsg: 'Upload failed',
     fileSizeExceed: 'The file size cannot exceed 10M',
     fileFormatIncorrect: 'The uploaded file format is incorrect',
-    refresh: 'Refresh'
+    refresh: 'Refresh',
+    currentlyUnavailable: 'Currently unavailable',
+    upload: 'Upload',
+    home: 'Home',
+    position: 'Position',
+    company: 'Company'
   },
   sys: {
     api: {
@@ -108,7 +113,9 @@ export default {
     collection: 'Collection',
     recruitmentPosition: 'Recruitment positions',
     similarPosition: 'Similar positions',
-    address: 'Work address'
+    address: 'Work address',
+    positionCollection: 'Position Collection',
+    companyCollection: 'Company Collection'
   },
   enterprise: {
     companyInfo: 'Company Information',
@@ -126,6 +133,7 @@ export default {
   },
   resume: {
     basicInfo: 'Basic Information',
+    onlineResume: 'Online resume',
     personalAdvantages: 'Personal Advantages',
     jobIntention: 'Job Intention',
     trainingExperience: 'Training Experience',
@@ -143,13 +151,25 @@ export default {
     resumeYetSubmit: 'You have not uploaded your resume yet. Please upload your resume first before submitting it',
     alreadyResume: 'You have already submitted your resume, please do not resubmit it',
     deliverySuccess: 'Delivery successful',
-    selectedResumeNotExist: 'The currently selected resume does not exist'
+    selectedResumeNotExist: 'The currently selected resume does not exist',
+    phoneNumber: 'Mobile phone number',
+    userEmail: 'User email',
+    dateOfBirth: 'Date of Birth:',
+    currentAddress: 'Current address',
+    topResume: 'Top resume',
+    refreshResume: 'Refresh resume',
+    increaseMoreExposure: 'Increase more exposure',
+    enhanceResumeActivity: 'Enhance resume activity',
+    attachmentResume: 'Attachment resume',
+    uploadUpToFiveCopies: 'Upload up to 5 copies'
   },
   setting: {
     accountSettings: 'Account Settings',
     accountBinding: 'Account binding',
     realNameAuthentication: 'Real name authentication',
     editPassword: 'Change password',
-    privacyPolicySettings: 'Privacy settings'
+    privacyPolicySettings: 'Privacy settings',
+    logOut: 'Logout',
+    switchToRecruit: 'Switch to Recruiter'
   }
 }

+ 24 - 4
src/locales/zh-CN.js

@@ -20,7 +20,12 @@ export default {
     uploadErrMsg: '上传失败',
     fileSizeExceed: '文件大小不能超过10M',
     fileFormatIncorrect: '上传的文件格式不正确',
-    refresh: '刷新'
+    refresh: '刷新',
+    currentlyUnavailable: '暂无',
+    upload: '上传',
+    home: '首页',
+    position: '职位',
+    company: '公司'
   },
   sys: {
     api: {
@@ -108,7 +113,9 @@ export default {
     collection: '收藏',
     recruitmentPosition: '在招职位',
     similarPosition: '相似职位',
-    address: '工作地址'
+    address: '工作地址',
+    positionCollection: '职位收藏',
+    companyCollection: '公司收藏'
   },
   enterprise: {
     companyInfo: '公司信息',
@@ -126,6 +133,7 @@ export default {
   },
   resume: {
     basicInfo: '基础信息',
+    onlineResume: '在线简历',
     personalAdvantages: '个人优势',
     jobIntention: '求职意向',
     trainingExperience: '培训经历',
@@ -143,13 +151,25 @@ export default {
     resumeYetSubmit: '您还未上传过简历,请先上传简历后再投递',
     alreadyResume: '您已投递过简历,请勿重复投递',
     deliverySuccess: '投递成功',
-    selectedResumeNotExist: '当前选择的简历不存在'
+    selectedResumeNotExist: '当前选择的简历不存在',
+    phoneNumber: '手机号码',
+    userEmail: '用户邮箱',
+    dateOfBirth: '出生日期',
+    currentAddress: '现居地址',
+    topResume: '置顶简历',
+    refreshResume: '刷新简历',
+    increaseMoreExposure: '增加更多曝光度',
+    enhanceResumeActivity: '提升简历活跃度',
+    attachmentResume: '附件简历',
+    uploadUpToFiveCopies: '最多上传5份'
   },
   setting: {
     accountSettings: '账号设置',
     accountBinding: '账号绑定',
     realNameAuthentication: '实名认证',
     editPassword: '修改密码',
-    privacyPolicySettings: '隐私设置'
+    privacyPolicySettings: '隐私设置',
+    logOut: '退出登录',
+    switchToRecruit: '切换为招聘者'
   }
 }

+ 2 - 2
src/views/Home/personal/components/hotPromotedPositions.vue

@@ -26,7 +26,7 @@
 import PositionCard from '@/components/Position/item.vue'
 import { ref } from 'vue'
 import { getPromotedPosition, getLatestPosition, getUrgentPosition } from '@/api/position'
-import { dealDictData } from '@/views/recruit/position/components/dict'
+import { dealDictArrayData } from '@/views/recruit/position/components/dict'
 
 const tab = ref(1)
 const items = ref([])
@@ -35,7 +35,7 @@ const items = ref([])
 const getPositionList = async () => {
   const api = tab.value === 1 ? getPromotedPosition : (tab.value === 2 ? getLatestPosition : getUrgentPosition)
   const { list } = await api({ pageNo: 1, pageSize: 9 })
-  items.value = dealDictData(items.value, list)
+  items.value = dealDictArrayData([], list)
 }
 getPositionList()
 

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

@@ -12,7 +12,7 @@ import HotPromoted from '@/components/Enterprise/hotPromoted.vue'
 import { ref, reactive } from 'vue'
 import { getHotEnterprise } from '@/api/enterprise'
 import { getDict } from '@/hooks/web/useDictionaries'
-import { dealDictData } from '@/views/recruit/position/components/dict'
+import { dealDictArrayData } from '@/views/recruit/position/components/dict'
 
 const items = ref([])
 const dictObj = reactive({
@@ -47,7 +47,7 @@ const getHotEnterpriseList = async () => {
       const list = e.jobList
       if (!item.isEnter) {
         // 职位列表
-        e.jobList = dealDictData(e.jobList, list).slice(0, 3)
+        e.jobList = dealDictArrayData([], list).slice(0, 3)
       }
       return e
     })

+ 3 - 3
src/views/PersonalCenter/components/posiitonItem.vue

@@ -145,9 +145,9 @@ const handleMouseEnter = (val) => {
     padding: 16px 24px;
     justify-content: space-between;
     .job-info {
-      width: 500px;
-      min-width: 500px;
-      max-width: 500px;
+      width: 430px;
+      min-width: 430px;
+      max-width: 430px;
       font-weight: 500;
       font-size: 16px;
       .job-name {

+ 36 - 12
src/views/PersonalCenter/dynamic/left.vue

@@ -11,32 +11,42 @@
       </v-badge>
       <div class="ml-5 content">
         <div class="username">
-          <span class="mr-2">{{ baseInfo?.name ?? $t('sys.tourist') }}</span>
+          <span class="mr-2">{{ baseInfo?.name || $t('sys.tourist') }}</span>
           <v-icon class="cursor-pointer" style="width: 80px; height: 22px;">
             <v-img width="80" height="22" src="https://minio.citupro.com/dev/menduner/upgrade.png"></v-img>
           </v-icon>
         </div>
         <div class="userInfo">
-          {{ baseInfo?.expTypeText || '暂无' }}<span class="vline"></span>{{ baseInfo?.eduTypeText || '暂无' }}
+          {{ baseInfo?.expTypeText || $t('common.currentlyUnavailable') }}<span class="vline"></span>{{ baseInfo?.eduTypeText || $t('common.currentlyUnavailable') }}
         </div>
         <div class="mt-3">
-          <v-select v-model="selectVal" :items="items" density="compact" variant="outlined" item-title="label" item-value="value" hide-details color="primary"></v-select>
+          <v-select 
+            v-model="selectVal" 
+            :items="items" 
+            density="compact" 
+            variant="outlined" 
+            item-title="label" 
+            item-value="value" 
+            hide-details 
+            color="primary"
+            @update:model-value="handleChangeJobStatus"
+          ></v-select>
         </div>
       </div>
       <div class="otherInfo">
         <div>
-          <span>手机号:{{ baseInfo?.phone || '暂无' }}</span>
+          <span>{{ $t('resume.phoneNumber') }}:{{ baseInfo?.phone || $t('common.currentlyUnavailable') }}</span>
         </div>
         <div class="my-3">
-          <span>用户邮箱:{{ baseInfo?.email || '暂无' }}</span>
+          <span>{{ $t('resume.userEmail') }}:{{ baseInfo?.email || $t('common.currentlyUnavailable') }}</span>
         </div>
         <div>
-          <span>出生日期:{{ baseInfo?.birthdayText || '暂无' }}</span>
+          <span>{{ $t('resume.dateOfBirth') }}:{{ baseInfo?.birthdayText || $t('common.currentlyUnavailable') }}</span>
         </div>
-        <div class="mt-3">现居地址: {{ baseInfo?.areaName || '暂无' }}</div>
+        <div class="mt-3">{{ $t('resume.currentAddress') }}: {{ baseInfo?.areaName || $t('common.currentlyUnavailable') }}</div>
       </div>
       <div class="slider-btn">
-        <v-btn class="slider-btn-item" rounded variant="outlined" color="primary" append-icon="mdi-menu-right" to="/resume">在线简历</v-btn>
+        <v-btn class="slider-btn-item" rounded variant="outlined" color="primary" append-icon="mdi-menu-right" to="/resume">{{ $t('resume.onlineResume') }}</v-btn>
       </div>
     </div>
 
@@ -51,8 +61,8 @@
       </v-tabs>
       <v-divider></v-divider>
       <v-tabs v-if="tab === 4" v-model="secondTab" align-tabs="start" color="primary" bg-color="#fff">
-        <v-tab :value="7">职位收藏</v-tab>
-        <v-tab :value="8">公司收藏</v-tab>
+        <v-tab :value="7">{{  $t('position.positionCollection') }}</v-tab>
+        <v-tab :value="8">{{ $t('position.companyCollection') }}</v-tab>
       </v-tabs>
     </div>
     <div class="left-bottom">
@@ -62,16 +72,21 @@
 </template>
 
 <script setup>
-import { getDict } from '@/hooks/web/useDictionaries'
 defineOptions({ name: 'personal-center-left'})
+import { getDict } from '@/hooks/web/useDictionaries'
 import { ref } from 'vue'
+import { useUserStore } from '@/store/user'
+import { updateJobStatus } from '@/api/resume'
 import PositionItem from '../components/posiitonItem.vue'
+import Snackbar from '@/plugins/snackbar'
 
 const tab = ref(1)
 const secondTab = ref(7)
 const selectVal = ref('0')
 const items = ref([])
+const userStore = useUserStore()
 
+// 求职类型字典
 getDict('menduner_job_status').then(({ data }) => {
   data = data?.length && data || []
   items.value = data
@@ -80,9 +95,18 @@ getDict('menduner_job_status').then(({ data }) => {
 let baseInfo = ref({})
 const getBasicInfo = () => {
   baseInfo.value = JSON.parse(localStorage.getItem('baseInfo')) // 人才信息
+  selectVal.value = baseInfo.value.jobStatus
 }
 getBasicInfo()
 
+// 求职类型更换
+const handleChangeJobStatus = async () => {
+  await updateJobStatus(selectVal.value)
+  Snackbar.success('更新成功')
+  await userStore.getUserBaseInfos(baseInfo.value.userId)
+  getBasicInfo()
+}
+
 const getPositionList = () => {}
 </script>
 
@@ -136,7 +160,7 @@ const getPositionList = () => {}
   }
   .slider-btn {
     position: relative;
-    width: 146px;
+    min-width: 188px;
     height: 100%;
     overflow: hidden;
     .slider-btn-item {

+ 8 - 7
src/views/PersonalCenter/dynamic/right.vue

@@ -11,10 +11,9 @@
     </div>
     <div class="attachment white-bgc radius mt-3">
       <div>
-        <span class="title">附件简历</span>
-        <span class="more-text">最多上传5份</span>
+        <span class="title">{{ $t('resume.attachmentResume') }}</span>
         <span class="upload--text cursor-pointer" @click="openFileInput">
-          上传
+          {{ $t('common.upload') }}
           <input
             type="file"
             ref="fileInput"
@@ -24,6 +23,7 @@
           />
         </span>
       </div>
+      <span class="more-text">{{ $t('resume.uploadUpToFiveCopies') }}</span>
       <div class="d-flex attachment-item my-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>
@@ -45,8 +45,8 @@ import Confirm from '@/plugins/confirm'
 
 const { t } = useI18n()
 const resumeList = [
-  { icon: 'mdi-upload', title: '置顶简历', desc: '增加更多曝光度' },
-  { icon: 'mdi-refresh', title: '刷新简历', desc: '提升简历活跃度' }
+  { icon: 'mdi-upload', title: t('resume.topResume'), desc: t('resume.increaseMoreExposure') },
+  { icon: 'mdi-refresh', title: t('resume.refreshResume'), desc: t('resume.enhanceResumeActivity') }
 ]
 
 // 获取附件
@@ -124,8 +124,9 @@ const handleDelete = ({ id }) => {
   .topping {
     display: flex;
     align-items: center;
+    justify-content: center;
     width: 50%;
-    height: 60px;
+    height: 90px;
     padding: 12px;
     margin-right: 12px;
     cursor: pointer;
@@ -164,7 +165,7 @@ const handleDelete = ({ id }) => {
     color: #555;
     font-size: 14px;
     .file-name {
-      width: 180px;
+      width: 260px;
       &:hover {
         color: var(--v-primary-base);
       }

+ 1 - 1
src/views/PersonalCenter/index.vue

@@ -18,7 +18,7 @@ import RightPage from './dynamic/right.vue'
 
 <style scoped lang="scss">
 .left {
-  width: 884px;
+  width: 800px;
 }
 .right {
   flex: 1;

+ 2 - 2
src/views/recruit/company/index.vue

@@ -24,7 +24,7 @@
 defineOptions({name: 'retrieval-company-page'})
 import { ref } from 'vue'
 import { getEnterpriseSearch } from '@/api/enterprise'
-import { dealDictData } from '../position/components/dict'
+import { dealDictArrayData } from '../position/components/dict'
 import headSearch from '@/components/headSearch'
 import scaleType from './components/scaleType'
 import natureType from './components/natureType'
@@ -63,7 +63,7 @@ const handleSearch = async (val, key) => {
 const getCompanyData = async () => {
   const { list, total: number } = await getEnterpriseSearch(query.value)
   total.value = number
-  items.value = dealDictData(items.value, list)
+  items.value = dealDictArrayData([], list)
 }
 getCompanyData()
 

+ 3 - 3
src/views/recruit/position/components/details.vue

@@ -104,7 +104,7 @@ import { timesTampChange } from '@/utils/date'
 import { getPersonResumeCv } from '@/api/resume'
 import { useI18n } from '@/hooks/web/useI18n'
 import { getPositionDetails, getSimilarPosition, getJobFavoriteCheck, getPersonJobFavorite, getPersonJobUnfavorite, jobCvRelCheckSend, jobCvRelSend } from '@/api/position'
-import { dealDictData } from '@/views/recruit/position/components/dict'
+import { dealDictObjData, dealDictArrayData } from '@/views/recruit/position/components/dict'
 import similarPositions from '@/components/Position/similarPositions.vue'
 import EnterpriseInfo from '@/components/Enterprise/info.vue'
 import Snackbar from '@/plugins/snackbar'
@@ -120,7 +120,7 @@ const positionInfo = ref({})
 const getPositionDetail = async () => {
   const data = await getPositionDetails({ id })
   info.value = data
-  positionInfo.value = { ...dealDictData(positionInfo.value, info.value), ...info.value }
+  positionInfo.value = { ...dealDictObjData({}, info.value), ...info.value }
 }
 getPositionDetail()
 
@@ -136,7 +136,7 @@ const getSimilarPositionList = async () => {
   if (!Object.keys(positionInfo).length) return
   const { list } = await getSimilarPosition({ pageNo: 1, pageSize: 4, positionId: positionInfo.value.positionId, expType: positionInfo.value.expType })
   const items = list.splice(0, 4)
-  similarList.value = dealDictData(similarList.value, items)
+  similarList.value = dealDictArrayData([], items)
 }
 
 getSimilarPositionList()

+ 29 - 26
src/views/recruit/position/components/dict.js

@@ -1,4 +1,4 @@
-import { reactive } from 'vue'
+import { reactive, ref } from 'vue'
 import { getDict } from '@/hooks/web/useDictionaries'
 
 const dictObj = reactive({
@@ -10,7 +10,7 @@ const dictObj = reactive({
   area: [], // 地区
   financing: [] // 融资阶段
 })
-const dictList = [
+const dictList = ref([
   { type: 'menduner_pay_unit', value: 'payUnit', key: 'payUnit', label: 'payName' },
   { type: 'menduner_financing_status', value: 'financing', key: 'financingStatus', label: 'financingName' },
   { type: 'menduner_scale', value: 'scale', key: 'scale', label: 'scaleName' },
@@ -18,43 +18,46 @@ const dictList = [
   { 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' }
-]
+])
 
 // 字典
 const getDictList = async () => {
-  dictList.forEach(async (val) => {
+  dictList.value.forEach(async (val) => {
     const { data } = await getDict(val.type, val.params, val.apiType)
     dictObj[val.value] = data
   })
 }
-const getData = async () => {
+export const getData = async () => {
   await getDictList()
 }
 getData()
 
-export const dealDictData = (res, list) => {
-  dictList.forEach(item => {
+export const dealDictArrayData = (res, list) => {
+  dictList.value.forEach(item => {
     const valueKey = item.nameKey ? item.nameKey : 'label'
     const idKey = item.valueKey ? item.valueKey : 'value'
-    if (Array.isArray(list)) {
-      const next = list.find(val => val[item?.key])
-      if (!next) return
-      res = list.map(e => {
-        const obj = dictObj[item.value].find(k => Number(k[idKey]) === Number(e[item.key]))
-        if (!obj) return
-        e[item.label] = obj[valueKey] || ''
-        e.active = false
-        return e
-      })
-      return
-    }
-    for(let i in list) {
-      if (i === item.key) {
-        const obj = dictObj[item.value].find(k => Number(k[idKey]) === Number(list[i]))
-        if (!obj) return
-        res[item.label] = obj[valueKey]
-      }
-    }
+    const next = list.find(val => val[item?.key])
+    if (!next) return
+    res = list.map(e => {
+      const obj = dictObj[item.value].find(k => Number(k[idKey]) === Number(e[item.key]))
+      if (!obj) return
+      e[item.label] = obj[valueKey] || ''
+      e.active = false
+      return e
+    })
+  })
+  return res
+}
+
+export const dealDictObjData = (res, obj) => {
+  Object.keys(obj).map(e => {
+    const data = dictList.value.find(k => k.key === e)
+    if (!data) return
+    const valueKey = data.nameKey ? data.nameKey : 'label'
+    const idKey = data.valueKey ? data.valueKey : 'value'
+    const result = dictObj[data.value].find(val => val[idKey] === obj[e])
+    if (!result) return
+    res[data.label] = result[valueKey]
   })
   return res
 }

+ 3 - 3
src/views/recruit/position/index.vue

@@ -38,7 +38,7 @@ import Empty from '@/components/Empty'
 import { getJobAdvertisedSearch } from '@/api/position'
 import CtPagination from '@/components/CtPagination'
 import { provide, reactive, ref, nextTick } from 'vue'
-import { dealDictData } from '@/views/recruit/position/components/dict'
+import { dealDictObjData } from '@/views/recruit/position/components/dict'
 
 import { useRoute, useRouter } from 'vue-router'
 defineOptions({name: 'retrieval-position-page'})
@@ -59,8 +59,8 @@ let pageReqVO = reactive({
 const getPositionList = async () => {
   const { list, total: number } = await getJobAdvertisedSearch(pageReqVO)
   items.value = list.map(e => {
-    e.job = { ...e.job, ...dealDictData({}, e.job) }
-    e.enterprise = { ...e.enterprise, ...dealDictData({}, e.enterprise) }
+    e.job = { ...e.job, ...dealDictObjData({}, e.job) }
+    e.enterprise = { ...e.enterprise, ...dealDictObjData({}, e.enterprise) }
     return e
   })
   total.value = number