瀏覽代碼

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

zhengnaiwen_citu 6 月之前
父節點
當前提交
ad386f0c0a
共有 34 個文件被更改,包括 194 次插入267 次删除
  1. 0 2
      src/components/Enterprise/details.vue
  2. 0 2
      src/components/Enterprise/hotPromoted.vue
  3. 1 2
      src/components/Enterprise/info.vue
  4. 1 1
      src/components/Position/longCompany.vue
  5. 1 1
      src/components/Position/longStrip.vue
  6. 0 2
      src/components/PositionLongStrip/item.vue
  7. 1 1
      src/plugins/snackbar/index.js
  8. 6 1
      src/plugins/snackbar/message.vue
  9. 2 2
      src/router/modules/components/recruit/enterprise.js
  10. 13 10
      src/store/user.js
  11. 0 2
      src/utils/position.js
  12. 1 1
      src/views/mall/purchasePackage/components/packageList.vue
  13. 1 1
      src/views/recruit/entRegister/inReview.vue
  14. 0 16
      src/views/recruit/enterprise/entInfoSetting/informationSettingsComponents/basicInfo.vue
  15. 0 1
      src/views/recruit/enterprise/hirePosition/components/item.vue
  16. 1 0
      src/views/recruit/enterprise/hirePosition/components/jobRequirements.vue
  17. 1 1
      src/views/recruit/enterprise/interviewManagement/components/item.vue
  18. 9 2
      src/views/recruit/enterprise/positionManagement/components/item.vue
  19. 1 0
      src/views/recruit/enterprise/positionManagement/components/jobRequirements.vue
  20. 1 1
      src/views/recruit/enterprise/resume/components/table.vue
  21. 24 2
      src/views/recruit/enterprise/search/retrieval/index.vue
  22. 2 50
      src/views/recruit/personal/PersonalCenter/components/communication.vue
  23. 0 1
      src/views/recruit/personal/PersonalCenter/jobFeedback/components/interview/item.vue
  24. 54 28
      src/views/recruit/personal/PersonalCenter/jobFeedback/components/seenMe.vue
  25. 0 10
      src/views/recruit/personal/PersonalCenter/jobFeedback/index.vue
  26. 17 3
      src/views/recruit/personal/PersonalCenter/memberBenefits/taskCenter/components/suggest.vue
  27. 1 1
      src/views/recruit/personal/PersonalCenter/resume/blockEnt/index.vue
  28. 2 2
      src/views/recruit/personal/PersonalCenter/resume/template/index.vue
  29. 6 6
      src/views/recruit/personal/PersonalCenter/wallet/index.vue
  30. 1 5
      src/views/recruit/personal/company/components/companyItem.vue
  31. 0 70
      src/views/recruit/personal/company/components/financingStatus.vue
  32. 38 24
      src/views/recruit/personal/company/index.vue
  33. 8 6
      src/views/recruit/personal/home/components/homeJobTypeCard/index.vue
  34. 1 10
      src/views/recruit/personal/position/components/dict.js

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

@@ -11,8 +11,6 @@
               <span :style="{'color': statusInfo.color,'font-size': '14px'}">{{ statusInfo.label }}</span> -->
             </div>
             <div class="contact-info">
-              {{ info.financingName }}
-              <span v-if="info.financingName && info.scaleName">·</span> 
               {{ info.scaleName }}
               <span v-if="info.industryName && info.scaleName">·</span> 
               {{ info.industryName }}

+ 0 - 2
src/components/Enterprise/hotPromoted.vue

@@ -10,8 +10,6 @@
           <div class="company-info cursor-pointer">
             <h3>{{ item.enterprise.anotherName }}</h3>
             <p>
-              {{ 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 }}

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

@@ -35,7 +35,6 @@ const props = defineProps({
 })
 
 const list = [
-  { icon: 'mdi-domain', label: 'financingName' },
   { icon: 'mdi-account-multiple', label: 'scaleName' },
   { icon: 'mdi-family-tree', label: 'industryName' }
 ]
@@ -69,7 +68,7 @@ const handleEnterprise = (val) => {
 
 <style lang="scss" scoped>
 .info-box {
-  height: 260px;
+  height: 230px;
   background-color: var(--color-f3);
   border-radius: 8px;
   padding: 20px 15px;

+ 1 - 1
src/components/Position/longCompany.vue

@@ -7,7 +7,7 @@
             <v-img :src="item.logoUrl || 'https://minio.citupro.com/dev/menduner/company-avatar.png'" :alt="item.anotherName" :width="40" style="height: 40px;border-radius: 4px;"/>
           </div>
           <h3 :class="{'default-active': item.active }" class="cursor-pointer" @click="handleClickEnterprise(item, 'briefIntroduction')">{{ item.anotherName }}</h3>
-          <p>{{ item.financingName }}<span v-if="item.financingName && item.industryName" class="mx-2">|</span>{{ item.industryName }}<span v-if="item.scaleName" class="mx-2">|</span>{{ item.scaleName }}</p>
+          <p>{{ item.industryName }}<span v-if="item.scaleName" class="mx-2">|</span>{{ item.scaleName }}</p>
         </div>
         <div v-if="item.active">
           <v-btn class="half-button ml-3" color="primary" size="small" @click.stop="handleCancel(item)">取消收藏</v-btn>

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

@@ -79,7 +79,7 @@ const props = defineProps({
 
 const router = useRouter()
 
-const desc = ['industryName', 'financingName', 'scaleName']
+const desc = ['industryName', 'scaleName']
 
 const handleCancel = async (item) => {
   if (!item.job.id) return Snackbar.warning(t('sys.api.operationFailed'))

+ 0 - 2
src/components/PositionLongStrip/item.vue

@@ -40,8 +40,6 @@
             </template>
           </v-hover>
           <p class="mt-2">
-            {{ item.enterprise.financingName }}
-            <span class="mx-2" v-if="item.enterprise.financingName && item.enterprise.scaleName">|</span>
             {{ item.enterprise.scaleName }}
             <span class="mx-2" v-if="item.enterprise.scaleName && item.enterprise.industryName">|</span>
             {{ item.enterprise.industryName }}

+ 1 - 1
src/plugins/snackbar/index.js

@@ -17,7 +17,7 @@ const toastMessage  = (options)  => {
   }, timeout || 3000)
 }
 toastMessage.success = (message, variant, timeout) => {
-  toastMessage({ message, color: 'success', variant, timeout })
+  toastMessage({ message, color: 'light-green', variant, timeout }) // success
 }
 toastMessage.error = (message, variant, timeout) => {
   toastMessage({ message, color: 'error', variant, timeout })

+ 6 - 1
src/plugins/snackbar/message.vue

@@ -19,16 +19,21 @@
     </v-snackbar>
     <v-snackbar
       v-else
+      style="position: fixed; top: 58%; transform: translateY(-50%)"
       timeout="-1"
       location="top"
+      :absolute="true"
       :variant="variant || 'flat'"
       :color="color"
       v-model="snackbar"
-    >{{message}}
+    >
+    <div class="mx-3 my-2" style="font-size: 20px; color: #fff;">{{message}}</div>
     <template v-slot:actions>
           <v-btn
             color="white"
             variant="text"
+            size="large"
+            class="mr-1"
             @click="snackbar = false"
           >
             关闭

+ 2 - 2
src/router/modules/components/recruit/enterprise.js

@@ -337,10 +337,10 @@ const enterprise = [
     path: '/recruit/enterprise/jobFair',
     component: Layout,
     name: 'jobFair',
-    // show: true, // 暂时隐藏
+    show: true, // 暂时隐藏
     meta: {
       title: '双选会',
-      enName: 'Job Management',
+      enName: 'Job Fair',
       icon: 'mdi-account-filter-outline'
     },
     children: [

+ 13 - 10
src/store/user.js

@@ -199,17 +199,20 @@ export const useUserStore = defineStore('user',
       async checkEnterpriseBaseInfo () {
         try {
           const data = await getEnterpriseBaseInfo()
-          // 检验必填信息
-          const keyArr = ['industryId', 'financingStatus', 'scale', 'introduce', 'logoUrl'] // 必填信息列表
-          let href = '/recruit/enterprise/entInfoSetting'
-          const valid = Object.keys(data).length && keyArr.every(e => {
-            const bool = data[e] && data[e] !== 0
-            if (!bool && e === 'logoUrl') href = '/recruit/enterprise/entInfoSetting?tabKey=2'
-            return bool
-          })
-          if (!valid) {
-            localStorage.setItem('checkEnterpriseBaseInfoFalseHref', href)
+          if (data?.first === true || data?.first === 'true') {  // 首次登录才提示
+            localStorage.setItem('checkEnterpriseBaseInfoFalseHref', '/recruit/enterprise/entInfoSetting')
           }
+          // // 检验必填信息
+          // const keyArr = ['industryId', 'financingStatus', 'scale', 'introduce', 'logoUrl'] // 必填信息列表
+          // let href = '/recruit/enterprise/entInfoSetting'
+          // const valid = Object.keys(data).length && keyArr.every(e => {
+          //   const bool = data[e] && data[e] !== 0
+          //   if (!bool && e === 'logoUrl') href = '/recruit/enterprise/entInfoSetting?tabKey=2'
+          //   return bool
+          // })
+          // if (!valid) {
+          //   localStorage.setItem('checkEnterpriseBaseInfoFalseHref', href)
+          // }
         } catch (error) {
           // console.log(error)
         }

+ 0 - 2
src/utils/position.js

@@ -12,11 +12,9 @@ const dictObj = reactive({
   area: [], // 地区
   jobStatus: [], // 求职状态
   marital: [], // 婚姻状态
-  financing: [] // 融资阶段
 })
 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' },
   { type: 'menduner_job_seek_status', value: 'jobStatus', key: 'jobStatus', label: 'jobStatusName' },
   { type: 'menduner_marital_status', value: 'marital', key: 'maritalStatus', label: 'maritalStatusName' },

+ 1 - 1
src/views/mall/purchasePackage/components/packageList.vue

@@ -2,7 +2,7 @@
 <template>
   <div class="d-flex mt-5 list">
     <div v-for="(val, i) in packDataList" :key="i" class="list-item cursor-pointer" :class="{'active': active === i }" @click="handleClickItem(val, i)">
-      <div v-if="val.id === userStore.userInfo?.vipFlag" class="recommend long">我的套餐</div>
+      <div v-if="val.id === userStore.userInfo?.vipFlag && userStore.userInfo?.vipExpireDate && userStore.userInfo?.vipExpireDate > Date.now()" class="recommend long">我的套餐</div>
       <div v-if="val.recommend" class="recommend">推荐</div>
       <div class="text-center font-weight-bold">{{ val.name }}</div>
       <div class="text-center my-5">

+ 1 - 1
src/views/recruit/entRegister/inReview.vue

@@ -67,7 +67,7 @@
           <span>审核通过</span>
         </div>
         <div class="text-center">
-          <v-btn v-if="!isMobile" class="mt-16 buttons" color="primary" to="/recruitHome">{{ $t('common.toHome') }}</v-btn>
+          <v-btn v-if="!isMobile" class="mt-16 mr-3 buttons" color="primary" to="/recruitHome">{{ $t('common.toHome') }}</v-btn>
           <v-btn v-if="applyInfo.status === '2'" class="mt-16 buttons" color="primary" @click="handleConfirm">{{ $t('common.resubmit') }}</v-btn>
         </div>
       </div>

+ 0 - 16
src/views/recruit/enterprise/entInfoSetting/informationSettingsComponents/basicInfo.vue

@@ -103,21 +103,6 @@ const formItems = ref({
       noParam: true,
       rules: [v => !!v || '请选择所在行业']
     },
-    {
-      type: 'autocomplete',
-      key: 'financingStatus',
-      value: null,
-      label: '融资阶段',
-      outlined: true,
-      clearable: false,
-      itemText: 'label',
-      itemValue: 'value',
-      col: 6,
-      flexStyle: 'mr-3',
-      dictTypeName: 'menduner_financing_status',
-      // rules: [v => !!v || '请选择融资阶段'],
-      items: []
-    },
     {
       type: 'autocomplete',
       key: 'scale',
@@ -127,7 +112,6 @@ const formItems = ref({
       clearable: false,
       itemText: 'label',
       itemValue: 'value',
-      col: 6,
       dictTypeName: 'menduner_scale',
       rules: [v => !!v || '请选择企业规模'],
       items: []

+ 0 - 1
src/views/recruit/enterprise/hirePosition/components/item.vue

@@ -180,7 +180,6 @@ const handleSubmit = async () => {
   font-size: 19px;
 }
 .position {
-  max-width: 46%;
   position: relative;
   .item-select {
     position: absolute;

+ 1 - 0
src/views/recruit/enterprise/hirePosition/components/jobRequirements.vue

@@ -169,6 +169,7 @@ const items = ref({
       value: null,
       default: null,
       label: '工作城市 *',
+      checkStrictly: true,
       itemText: 'name',
       itemValue: 'id',
       clearable: false,

+ 1 - 1
src/views/recruit/enterprise/interviewManagement/components/item.vue

@@ -43,7 +43,7 @@
         </template>
         <span v-if="item.status === '1'" class="font-size-15 color-primary" @click="handleActionClick('completed', item)">完成面试</span>
         <span v-if="item.status === '3'" class="font-size-15 color-primary" @click="handleActionClick('feedback', item)">填写反馈</span>
-        <v-menu v-if="actionItems(item).length">
+        <v-menu v-if="actionItems(item).length && item?.job?.status === '0' && (item.time > Date.now())">
           <template v-slot:activator="{ props }">
             <v-icon v-bind="props" class="mx-3" size="20" color="primary">mdi-dots-horizontal</v-icon>
           </template>

+ 9 - 2
src/views/recruit/enterprise/positionManagement/components/item.vue

@@ -19,7 +19,7 @@
           <div class="item-select ml-5" v-if="tab !== 3">
             <v-checkbox v-model="val.select" hide-details color="primary" @update:model-value="handleChangeSelect"></v-checkbox>
           </div>
-          <div class="d-flex align-center" :class="{'cursor-pointer': tab === 1, 'ml-15': tab !== 3}" @click="handleEdit(val)">
+          <div class="d-flex align-center" :class="{'cursor-pointer': tab === 1, 'ml-15': tab !== 3}" @click="handleDetail(val)">
             <span v-if="val.name.indexOf('style')" v-html="val.name" class="position-name"></span>
             <span v-else class="position-name">{{ val.name }}</span>
           </div>
@@ -63,6 +63,8 @@
             </div>
             <div v-if="tab === 1" class="cursor-pointer actions" @click="handleEdit(val)">{{ $t('common.edit') }}</div>
             <div v-if="tab === 3" class="cursor-pointer actions" @click="handleUpdateExpireTime(val)">修改到期时间</div>
+            <span class="lines"></span>
+            <span class="cursor-pointer actions" @click="handleDetail(val)">详情</span>  
           </div>
         </div>
       </div>
@@ -210,6 +212,12 @@ const handleEdit = async (val) => {
   if (!data || !data.length) return Snackbar.warning('没有该操作权限,请联系平台管理员升级后再试')
   router.push(`/recruit/enterprise/position/edit?id=${val.id}`)
 }
+
+// 职位详情
+const handleDetail = async (val) => {
+  if (!val.id) return
+  window.open(`/recruit/personal/position/details/${val.id}`)
+}
 </script>
 
 <style scoped lang="scss">
@@ -222,7 +230,6 @@ const handleEdit = async (val) => {
   font-size: 19px;
 }
 .position {
-  max-width: 46%;
   position: relative;
   .item-select {
     position: absolute;

+ 1 - 0
src/views/recruit/enterprise/positionManagement/components/jobRequirements.vue

@@ -172,6 +172,7 @@ const items = ref({
       itemText: 'name',
       itemValue: 'id',
       clearable: false,
+      checkStrictly: true,
       items: [],
     },
     {

+ 1 - 1
src/views/recruit/enterprise/resume/components/table.vue

@@ -38,7 +38,7 @@
         <v-btn v-if="tab === 0" :color="item.jobClosed ? 'grey' : 'primary'" variant="text" @click="handleInterviewInvite(item)">邀请面试<v-tooltip v-if="item.jobClosed" activator="parent" location="top">职位已关闭</v-tooltip></v-btn>
         <v-btn v-if="tab === 0" :color="item.jobClosed ? 'grey' : 'primary'" variant="text" @click="handleToCommunicate(item)">立即沟通<v-tooltip v-if="item.jobClosed" activator="parent" location="top">职位已关闭</v-tooltip></v-btn>
         <v-btn v-if="tab === 0 || tab === 1" color="primary" variant="text" @click="handleEliminate(item)">不合适</v-btn>
-        <v-btn v-if="!item.inTalentPool && (tab === 1 || tab === 2 || tab === 3)" color="primary" variant="text" @click="handleJoinToTalentPool(item)">加入储备</v-btn>
+        <v-btn v-if="!item.inTalentPool" color="primary" variant="text" @click="handleJoinToTalentPool(item)">加入储备</v-btn>
         <v-btn v-if="tab === 1 && (item.status === '3' || item.status === '4')" color="primary" variant="text" @click="handleEnterByEnterprise(item)">入职</v-btn>
         <v-btn v-if="tab === 4" color="primary" variant="text" @click="handleCancelEliminate(item)">取消不合适</v-btn>
         <v-btn v-if="tab === 2 && item?.job?.hire" color="primary" variant="text" @click="handleSettlement(item)">结算</v-btn>

+ 24 - 2
src/views/recruit/enterprise/search/retrieval/index.vue

@@ -5,7 +5,10 @@
     </div>
     <div>
       <Position :isClear="clear" @clear="clear = false" :selectData="position" @select="val => position = val"></Position>
-      <Area :isClear="clear" @clear="clear = false" @select="val => handleSearch('areaIds', val)"></Area>
+      <div class="font-size-15 d-flex align-center color-666">
+        <span>地&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;区:</span>
+        <cascade v-model="queryParams.areaIds" :item="selectItems" @change="val => handleSearch('areaIds', val)" style="width: 300px;"></cascade>
+      </div>
       <CommonPage :isClear="clear" @clear="clear = false" class="my-3" dictType="menduner_education_type" title="最高学历" @select="val => handleSearch('eduType', val)"></CommonPage>
       <CommonPage :isClear="clear" @clear="clear = false" dictType="menduner_exp_type" title="工作经验" @select="val => handleSearch('expType', val)"></CommonPage>
       <v-divider class="mt-1 mb-3"></v-divider>
@@ -69,7 +72,6 @@ defineOptions({ name: 'searchRetrieval' })
 import { ref, computed } from 'vue'
 import CommonPage from '../components/common.vue'
 import Position from './components/position.vue'
-import Area from './components/area.vue'
 import { getPersonSearchPage } from '@/api/enterprise.js'
 import { dealDictArrayData } from '@/utils/position'
 import { timesTampChange } from '@/utils/date'
@@ -80,6 +82,7 @@ import Snackbar from '@/plugins/snackbar'
 import { saveInterviewInvite } from '@/api/recruit/enterprise/interview'
 import { useRouter } from 'vue-router'; const router = useRouter()
 import InvitePage from '@/views/recruit/enterprise/interviewManagement/components/invite'
+import { getDict } from '@/hooks/web/useDictionaries'
 
 const textItem = ref({
   type: 'text',
@@ -101,6 +104,25 @@ const queryParams = ref({
   eduType: ''
 })
 
+const selectItems = ref({
+  value: null,
+  itemText: 'name',
+  itemValue: 'id',
+  hideDetails: true,
+  clearable: true,
+  multiple: true,
+  checkStrictly: true,
+  collapseTags: true,
+  placeholder: '地区',
+  items: [],
+})
+
+getDict('areaTreeData', null, 'areaTreeData').then(res => {
+  const data = res?.data?.length ? res.data : []
+  if (data[0] && data[0].id === 10000) data[0].children = []
+  selectItems.value.items = data
+})
+
 const total = ref(0)
 const items = ref([])
 const loading = ref(false)

+ 2 - 50
src/views/recruit/personal/PersonalCenter/components/communication.vue

@@ -52,7 +52,6 @@
 // 沟通过
 defineOptions({ name: 'position-communication' })
 import { ref } from 'vue'
-// import { dealDictArrayData, dealDictObjData } from '@/utils/position'
 import Empty from '@/components/Empty'
 
 const props = defineProps({
@@ -61,56 +60,9 @@ const props = defineProps({
     default: 0
   }
 })
+const list = ref([])
 
-// const items = ref([])
-// const page = ref({
-//   pageNo: 1,
-//   pageSize: 10
-// })
-const list = ref([
-  // {
-  //   contact: {
-  //     name: '肖女士',
-  //     avatars: 'https://cdn.vuetifyjs.com/images/john.jpg',
-  //     postNameCn: '人事经理'
-  //   },
-  //   name: '前端开发工程师',
-  //   areaName: '北京·石景山区·八大处',
-  //   payFrom: 15,
-  //   payTo: 18,
-  //   expName: '3-5年',
-  //   eduName: '本科',
-  //   active: false,
-  //   enterprise: {
-  //     name: '广州辞图科技有限公司',
-  //     industryName: '互联网',
-  //     scaleName: '0-20人',
-  //     financingName: '未融资'
-  //   }
-  // },
-  // {
-  //   contact: {
-  //     name: '肖女士',
-  //     avatars: 'https://cdn.vuetifyjs.com/images/john.jpg',
-  //     postNameCn: '人事经理'
-  //   },
-  //   name: '前端开发工程师',
-  //   areaName: '北京·石景山区·八大处',
-  //   payFrom: 15,
-  //   payTo: 18,
-  //   expName: '3-5年',
-  //   eduName: '本科',
-  //   active: false,
-  //   enterprise: {
-  //     name: '广州辞图科技有限公司',
-  //     industryName: '互联网',
-  //     scaleName: '0-20人',
-  //     financingName: '未融资'
-  //   }
-  // }
-])
-
-const desc = ['industryName', 'financingName', 'scaleName']
+const desc = ['industryName', 'scaleName']
 
 const handleMouseEnter = (val) => {
   if (props.tab !==3 ) val.active = true

+ 0 - 1
src/views/recruit/personal/PersonalCenter/jobFeedback/components/interview/item.vue

@@ -42,7 +42,6 @@
               <span class="mx-2 enterprise-name" @click="handleToEnterprise(val)">{{ val.enterprise.anotherName }}</span>
             [
               <span>{{ val.enterprise.industryName }}</span>
-              <span>&nbsp;·&nbsp;{{ val.enterprise.financingName }}</span>
               <span>&nbsp;·&nbsp;{{ val.enterprise.scaleName }}</span>
             ]
             </div>

+ 54 - 28
src/views/recruit/personal/PersonalCenter/jobFeedback/components/seenMe.vue

@@ -1,39 +1,49 @@
 <template>
-  <div>
-    <div v-if="items.length" class="mt-3">
-      <div class="positionItem elevation-2" v-for="(item, index) in items" :key="index" @mouseenter="item.active = true" @mouseleave="item.active = false">
-        <div class="position-and-company">
-          <div class="position">
-            <div class="float-left">
-              <v-img :src="getUserAvatar(item?.contact.avatar, item?.contact.sex)" :width="40" style="height: 40px;border-radius: 4px;"/>
+  <div style="position: relative; height: 60vh;">
+    <div v-if="userInfo?.entitlement?.viewersList && userInfo?.vipFlag && userInfo?.vipExpireDate && userInfo?.vipExpireDate > Date.now()">
+      <div v-if="items.length" class="mt-3">
+        <div class="positionItem elevation-2" v-for="(item, index) in items" :key="index" @mouseenter="item.active = true" @mouseleave="item.active = false">
+          <div class="position-and-company">
+            <div class="position">
+              <div class="float-left">
+                <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="title1">{{ item.contact.name }}</h3>
+                <p class="mt-2">{{ item?.post?.nameCn }}</p>
+              </div>
             </div>
-            <div class="company-info">
-              <h3 class="title1">{{ item.contact.name }}</h3>
-              <p class="mt-2">{{ item?.post?.nameCn }}</p>
+            <div class="company" @click="handleEnterprise(item)">
+              <div class="float-left">
+                <v-img :src="item?.enterprise.logoUrl || 'https://minio.citupro.com/dev/menduner/company-avatar.png'" :alt="item.enterprise.anotherName" :width="40" style="height: 40px;border-radius: 4px;"/>
+              </div>
+              <div class="company-info">
+                <h3 :class="{'default-active': item.active }" class="title1 cursor-pointer">{{ item.enterprise.anotherName }}</h3>
+                <p class="mt-2">{{ item.enterprise.scaleName }}<span class="mx-2">|</span>{{ item.enterprise.industryName }}</p>
+              </div>
             </div>
           </div>
-          <div class="company" @click="handleEnterprise(item)">
-            <div class="float-left">
-              <v-img :src="item?.enterprise.logoUrl || 'https://minio.citupro.com/dev/menduner/company-avatar.png'" :alt="item.enterprise.anotherName" :width="40" style="height: 40px;border-radius: 4px;"/>
-            </div>
-            <div class="company-info">
-              <h3 :class="{'default-active': item.active }" class="title1 cursor-pointer">{{ item.enterprise.anotherName }}</h3>
-              <p class="mt-2">{{ item.enterprise.financingName }}<span class="mx-2">|</span>{{ item.enterprise.scaleName }}<span class="mx-2">|</span>{{ item.enterprise.industryName }}</p>
-            </div>
+          <div class="footer">
+            {{ $t('position.viewTime') + timesTampChange(item.updateTime)  }}
           </div>
         </div>
-        <div class="footer">
-          {{ $t('position.viewTime') + timesTampChange(item.updateTime)  }}
-        </div>
+        <CtPagination
+          :total="total"
+          :page="page.pageNo"
+          :limit="page.pageSize"
+          @handleChange="handleChangePage"
+        ></CtPagination>
       </div>
-      <CtPagination
-        :total="total"
-        :page="page.pageNo"
-        :limit="page.pageSize"
-        @handleChange="handleChangePage"
-      ></CtPagination>
+      <Empty v-else :elevation="false"></Empty>
+    </div>
+    <div v-else class="mt-8 tips">
+      <span class="color-error" v-if="userInfo?.vipExpireDate > Date.now() && !userInfo?.entitlement?.viewersList">
+        当前会员套餐的福利不包含谁看过我,<span class="text-decoration-underline cursor-pointer" @click="goBuy">去升级</span>
+      </span>
+      <span class="color-error" v-if="!userInfo?.vipExpireDate || (userInfo?.vipExpireDate && userInfo?.vipExpireDate < Date.now())">
+        谁看过我为会员福利内容,<span class="text-decoration-underline cursor-pointer" @click="goBuy">去开通</span>
+      </span>
     </div>
-    <Empty v-else :elevation="false"></Empty>
   </div>
 </template>
 
@@ -47,6 +57,7 @@ import { timesTampChange } from '@/utils/date'
 import Empty from '@/components/Empty'
 import { getUserAvatar } from '@/utils/avatar'
 import { useRouter } from 'vue-router'
+import { useUserStore } from '@/store/user'
 
 const router = useRouter()
 const total = ref(0)
@@ -56,6 +67,12 @@ const page = ref({
   pageSize: 10
 })
 
+const userStore = useUserStore()
+let userInfo = ref(JSON.parse(localStorage.getItem('userInfo')) || {})
+userStore.$subscribe((mutation, state) => {
+  if (state.userInfo && Object.keys(state.userInfo).length) userInfo.value = state?.userInfo
+})
+
 const getData = async () => {
   const res = await getInterestedMePage(page.value)
   items.value = res.list.map(e => {
@@ -78,6 +95,9 @@ const handleEnterprise = (item) => {
   router.push(`/recruit/personal/company/details/${id}?key=briefIntroduction`)
 }
 
+const goBuy = () => {
+  router.push('/recruit/personal/personalCenter/memberBenefits/membershipPackage')
+}
 </script>
 
 <style scoped lang="scss">
@@ -135,4 +155,10 @@ const handleEnterprise = (item) => {
   color: var(--color-999);
   background: linear-gradient(90deg, #f5fcfc 0, #fcfbfa 100%);
 }
+.tips {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+}
 </style>

+ 0 - 10
src/views/recruit/personal/PersonalCenter/jobFeedback/index.vue

@@ -17,13 +17,6 @@ import delivery from './components/delivery.vue'
 import interview from './components/interview/index.vue'
 import interested from './components/interested.vue'
 import seenMe from './components/seenMe.vue'
-import { useUserStore } from '@/store/user'
-
-const userStore = useUserStore()
-let userInfo = ref(JSON.parse(localStorage.getItem('userInfo')) || {})
-userStore.$subscribe((mutation, state) => {
-  if (state.userInfo && Object.keys(state.userInfo).length) userInfo.value = state?.userInfo
-})
 
 const { t } = useI18n()
 const tab = ref(0)
@@ -34,9 +27,6 @@ const data = [
   { title: t('position.haveSeenMe'), path: seenMe }
 ]
 const list = shallowRef(data)
-
-// 判断当前的会员套餐内是否有谁看过我的权益
-if (!userInfo?.value?.entitlement?.viewersList) list.value.pop()
 </script>
 
 <style scoped lang="scss">

+ 17 - 3
src/views/recruit/personal/PersonalCenter/memberBenefits/taskCenter/components/suggest.vue

@@ -11,10 +11,10 @@
         <div class="d-flex ml-2 my-5">
           <div class="ellipsis" style="width: 50%;">{{ item.title }}</div>
           <div class="ellipsis d-flex" style="width: calc(50% - 88px);">
-            <svg-icon class="mx-1" name="integral" size="24"></svg-icon>
-            <span style="color: #10897bad;">{{ item.point }}</span>
+            <!-- <svg-icon class="mx-1" name="integral" size="24"></svg-icon>
+            <span style="color: #10897bad;">{{ item.point }}</span> -->
           </div>
-          <v-chip label :color="item.complete ? 'success' : 'error'">{{ item.complete ? '已完成' : '未完成' }}</v-chip>
+          <v-chip label :color="item.complete ? 'success' : 'error'" @click="handleClick(item)">{{ item.complete ? '已完成' : '未完成' }}</v-chip>
         </div>
       </div>
     </div>
@@ -26,6 +26,7 @@
 defineOptions({name: 'personal-taskCenter-suggest'})
 import { ref } from 'vue'
 import { getTaskList } from '@/api/integral'
+import { useRouter } from 'vue-router'; const router = useRouter()
 
 const loading = ref(false)
 const list = ref([])
@@ -36,11 +37,24 @@ const getRecommendTaskList = async () => {
   try {
     const data = await getTaskList({ mark: '推荐任务', type: 0 })
     list.value = data
+    list.value.push({
+      complete: false,
+      operation: '+',
+      point: 50,
+      sort: 99,
+      title: '购买会员套餐',
+      url: '/recruit/personal/personalCenter/memberBenefits/membershipPackage',
+    })
   } finally {
     loading.value = false
   }
 }
 getRecommendTaskList()
+
+const handleClick = (item) => {
+  if (item.complete || !item.url) return
+  router.push(item.url)
+}
 </script>
 
 <style lang="scss" scoped>

+ 1 - 1
src/views/recruit/personal/PersonalCenter/resume/blockEnt/index.vue

@@ -3,7 +3,7 @@
     <div class="resume-header">
       <div class="resume-title">屏蔽企业设置</div>
     </div>
-    <div class="mt-5" v-if="userInfo?.vipFlag && userInfo?.vipExpireDate">
+    <div class="mt-5" v-if="userInfo?.vipFlag && userInfo?.vipExpireDate && userInfo?.vipExpireDate > Date.now()">
       <!-- 选择 -->
       <div class="d-flex align-center pb-5" style="border-bottom: 1px solid #dddddd;">
         <div style="color: #777;">选择企业: </div>

+ 2 - 2
src/views/recruit/personal/PersonalCenter/resume/template/index.vue

@@ -20,10 +20,10 @@
         </CtTable>
       </div>
       <div v-else class="mt-8 tips">
-        <span class="color-error" v-if="userStore.userInfo?.vipExpireDate && !userStore.userInfo?.entitlement?.resumeTemplate">
+        <span class="color-error" v-if="userStore.userInfo?.vipExpireDate > Date.now() && !userStore.userInfo?.entitlement?.resumeTemplate">
           当前会员套餐的福利不包含简历模板,<span class="text-decoration-underline cursor-pointer" @click="goBuy">去升级</span>
         </span>
-        <span class="color-error" v-if="!userStore.userInfo?.vipExpireDate">
+        <span class="color-error" v-if="!userStore.userInfo?.vipExpireDate || (userStore.userInfo?.vipExpireDate && userStore.userInfo?.vipExpireDate < Date.now())">
           简历模板为会员福利内容,<span class="text-decoration-underline cursor-pointer" @click="goBuy">去开通</span>
         </span>
       </div>

+ 6 - 6
src/views/recruit/personal/PersonalCenter/wallet/index.vue

@@ -15,16 +15,16 @@
 defineOptions({ name: 'person-center-wallet'})
 import myBalance from './myBalance'
 import IntegralPage from '@/views/integral/pointsManagement'
-import { useUserStore } from '@/store/user'
+// import { useUserStore } from '@/store/user'
 import { ref } from 'vue'
 
 const tab = ref(0)
 
-const store = useUserStore()
-const updateAccountInfo = async () => {
-  await store.getUserAccountInfo()
-}
-updateAccountInfo()
+// const store = useUserStore()
+// const updateAccountInfo = async () => {
+//   await store.getUserAccountInfo()
+// }
+// updateAccountInfo()
 
 </script>
 

+ 1 - 5
src/views/recruit/personal/company/components/companyItem.vue

@@ -7,11 +7,7 @@
         </div>
         <div class="company-info">
           <h3 :class="{'default-active': item.active }" style="width: 200px;">{{ item.enterprise.anotherName }}</h3>
-          <p>
-            {{ item.enterprise.financingName }}
-            <span class="septal-line" v-if="item.enterprise.financingName && item.enterprise.industryName"></span>
-            {{ item.enterprise.industryName }}
-          </p>
+          <p>{{ item.enterprise.industryName }}</p>
         </div>
       </div>
       <v-divider class="mx-4"></v-divider>

+ 0 - 70
src/views/recruit/personal/company/components/financingStatus.vue

@@ -1,70 +0,0 @@
-<template>
-  <div class="d-flex">
-    <div class="label-title">融资阶段</div>
-    <div class="label-content">
-      <span 
-        v-for="k in items" 
-        :key="k.value"
-        :class="['label-color', {'actives': k.active}]"
-        @click="handleItemClick(k)"
-      >{{ k.label }}</span>
-    </div>
-  </div>
-</template>
-
-<script setup>
-defineOptions({ name: 'search-financing-status'})
-import { ref, watch } from 'vue'
-import { useRoute } from 'vue-router'
-import { getDict } from '@/hooks/web/useDictionaries'
-
-const emits = defineEmits(['handleClick', 'clear'])
-const props = defineProps({
-  isClear: {
-    type: Boolean,
-    default: false
-  }
-})
-watch(
-  () => props.isClear, 
-  (newVal) => {
-    if (!newVal) return
-    // 清空筛选条件时默认选中不限
-    items.value.map(e => {
-      e.active = false
-      if (e.value === -1) e.active = true
-      return e
-    })
-    emits('clear')
-  }
-)
-
-const route = useRoute()
-const routeQuery = route.query
-
-const items = ref([])
-getDict('menduner_financing_status').then(({ data }) => {
-  data = data?.length && data || []
-  const list = data.map(e => {
-    e.active = false
-    return e
-  })
-  items.value = [{ value: -1, label: '不限', active: true }, ...list]
-  // 刷新回显
-  if (routeQuery.financingStatus) {
-    const obj = items.value.find(e => e.value === routeQuery.financingStatus)
-    items.value.map(e => e.active = false)
-    if (obj) obj.active = true
-  }
-})
-
-const handleItemClick = (k) => {
-  items.value.map(e => e.active = false)
-  k.active = true
-  emits('handleClick', k.value, 'financingStatus')
-}
-</script>
-
-<style scoped lang="scss">
-@import '@/styles/recruit/company.scss';
-</style>

+ 38 - 24
src/views/recruit/personal/company/index.vue

@@ -3,10 +3,10 @@
     <buttons :current="2" style="position: sticky;"></buttons>
     <div class="company-content">
       <div class="white-bgc pb-3 pt-5">
-        <headSearch placeholder="搜索公司关键字" @handleSearch="val => handleSearch(val, 'name')"></headSearch>
+        <headSearch v-model="content" placeholder="搜索公司关键字" @handleSearch="val => handleSearch(val, 'name')"></headSearch>
         <div class="px-5 mt-3 clear-parent">
-          <areaType :isClear="clear" @handleClick="handleSearch"></areaType>
-          <!-- <financingStatus class="my-5" :isClear="clear" @clear="clear = false" @handleClick="handleSearch"></financingStatus> -->
+          <!-- <areaType :isClear="clear" @handleClick="handleSearch"></areaType> -->
+          <cityCascadeSelect @inputChange="inputChange"></cityCascadeSelect>
           <scaleType class="mt-5" :isClear="clear" @clear="clear = false" @handleClick="handleSearch"></scaleType>
           <div class="clear" @click="handleClear">清空筛选条件</div>
         </div>
@@ -15,8 +15,8 @@
         <companyItem class="mt-3" :list="items"></companyItem>
         <MPagination
           :total="total"
-          :page="query.pageNo"
-          :limit="query.pageSize"
+          :page="pages.pageNo"
+          :limit="pages.pageSize"
           @handleChange="handleChangePage"
         ></MPagination>
       </div>
@@ -34,10 +34,11 @@ import { getEnterpriseSearch } from '@/api/enterprise'
 import { dealDictObjData } from '@/utils/position'
 import headSearch from '@/components/headSearch'
 import scaleType from './components/scaleType'
-// import financingStatus from './components/financingStatus.vue'
-import areaType from './components/areaType'
+// import areaType from './components/areaType'
 import companyItem from './components/companyItem'
 import MPagination from '@/components/CtPagination'
+import cityCascadeSelect from '@/views/recruit/personal/position/components/conditionFilter/cityCascadeSelect.vue'
+// F:\work\menduner\src\views\recruit\personal\position\components\conditionFilter\cityCascadeSelect.vue
 
 const route = useRoute()
 const router = useRouter()
@@ -45,14 +46,15 @@ const clear = ref(false)
 
 const total = ref(0)
 const items = ref([])
-const query = ref({
+const pages = ref({
   pageNo: 1,
   pageSize: 12
 })
+const query = ref({})
 
 const dealRouteQuery = (data) => {
   const arr = Object.keys(data).map(e => {
-    if (e !== 'pageSize' && e !== 'pageNo') {
+    if (data[e]) {
       return Array.isArray(data[e]) ? `${e}=${data[e].join()}` : `${e}=${data[e]}`
     }
   }).filter(Boolean)
@@ -61,29 +63,42 @@ const dealRouteQuery = (data) => {
   if (str) router.push(`${route.path}?${str}`)
 }
 
-const content = ref('')
+const content = ref(route.query.name || '')
 // 搜索
 const handleSearch = async (val, key) => {
   if (!val && key !== 'name') return
   if (key === 'name') content.value = val
-  query.value.pageNo = 1
-  // val为-1时选择的是不限或者全国, 此时选中的字段不传
-  if (!val || val === -1 || val[0] === -1) delete query.value[key]
-  else query.value[key] = val
+  pages.value.pageNo = 1
+  query.value[key] = val
+  dealRouteQuery(query.value)
+  await getCompanyData()
+}
+
+const inputChange = async({ idName: key, values }) => { // areaIds
+  if (!values?.length) {
+    values = null
+    delete query.value[key]
+  } else {
+    query.value[key] = values
+  }
+  pages.value.pageNo = 1
   dealRouteQuery(query.value)
   await getCompanyData()
 }
 
 const noParams = ref(true)
 const getCompanyData = async () => {
-  // 没有筛选条件不请求数据
-  if (Object.keys(query.value).length < 3) {
-    noParams.value = true
+  noParams.value = true
+  Object.keys(query.value).forEach(key => {
+    // 没有筛选条件不请求数据
+    if (query.value[key]) noParams.value = false
+  })
+  if (noParams.value === true) {
     items.value = []
     total.value = 0
     return
   }
-  const { list, total: number } = await getEnterpriseSearch(query.value)
+  const { list, total: number } = await getEnterpriseSearch({ ...query.value, ...pages.value })
   if (!list.length) {
     items.value = []
     total.value = 0
@@ -101,11 +116,10 @@ const handleClear = () => {
   clear.value = true
   query.value = {
     name: content.value,
-    pageNo: 1,
-    pageSize: 12
+    areaIds: query.value.areaIds
   }
-  if (content.value) {
-    router.push(`${route.path}?name=${content.value}`)
+  if (query.value.name || query.value.areaIds?.length) {
+    dealRouteQuery(query.value)
     getCompanyData()
   } else {
     router.push(route.path)
@@ -122,7 +136,7 @@ if (Object.keys(route.query).length) {
     else objData[e] = route.query[e]
   })
   if (Object.keys(objData).length) {
-    query.value.pageNo = 1
+    pages.value.pageNo = 1
     query.value = Object.assign(query.value, objData)
     getCompanyData()
   }
@@ -130,7 +144,7 @@ if (Object.keys(route.query).length) {
 
 // 分页
 const handleChangePage = (index) => {
-  query.value.pageNo = index
+  pages.value.pageNo = index
   getCompanyData()
 }
 </script>

+ 8 - 6
src/views/recruit/personal/home/components/homeJobTypeCard/index.vue

@@ -2,7 +2,7 @@
 <template>
   <div class="hasPageCard d-flex" @mouseleave="handleMouseLeave">
     <v-card class="card">
-      <div class="leftCard">
+      <div class="leftCard d-flex flex-column flex-wrap pt-3 pr-2">
         <div
           v-for="(item, index) in items" :key="item.id"
           class="leftCardItem" :class="{'leftIndexAct': index === leftIndex, 'elevation-5': (index === leftIndex)}"
@@ -19,7 +19,7 @@
           </div>
         </div>
         <!-- 分页选择器 -->
-        <div class="mt-2" @mouseover.stop="handleMouseLeave" style="border-top: 1px dashed #e6e6e6; position: absolute; bottom: 4px; width: 100%;">
+        <!-- <div class="mt-2" @mouseover.stop="handleMouseLeave" style="border-top: 1px dashed #e6e6e6; position: absolute; bottom: 4px; width: 100%;">
           <div class="d-flex justify-space-between align-center mx-4" style="height: 40px">
             <div style="color: var(--v-primary-base); font-size: 14px;">
               {{ pageInfo.current }} / {{ pageCount }}
@@ -29,7 +29,7 @@
               <v-btn @click="nextPage" size="x-small" class="ml-2" color="primary" variant="tonal" style="font-size: 20px;"><v-icon icon="mdi-menu-right" size="x-small"></v-icon></v-btn>
             </div>
           </div>
-        </div>
+        </div> -->
       </div>
     </v-card>
     <v-card v-if="rightObj.show" class="card rightCardBox">
@@ -94,9 +94,10 @@ let defaultItems = ref()
 let items = ref([])
 // 翻页
 const getPageItems = () => {
-  const startIndex = (pageInfo.current - 1) * pageInfo.size
-  const endIndex = Math.min(startIndex + pageInfo.size, defaultItems.value.length)
-  items.value = defaultItems.value.slice(startIndex, endIndex)
+  // const startIndex = (pageInfo.current - 1) * pageInfo.size
+  // const endIndex = Math.min(startIndex + pageInfo.size, defaultItems.value.length)
+  // items.value = defaultItems.value.slice(startIndex, endIndex)
+  items.value = defaultItems.value
 }
 getDict('positionTreeData', null, 'positionTreeData').then(({ data }) => {
   data = data?.length && data || []
@@ -158,6 +159,7 @@ const carouselList = ref([
     overflow-x: hidden;
     overflow-y: auto;
     .leftCardItem {
+      width: 50%;
       height: 42px;
       line-height: 42px;
       padding: 0 16px;

+ 1 - 10
src/views/recruit/personal/position/components/dict.js

@@ -82,16 +82,7 @@ const dictList = [
     title: '公司规模',
     path: commonPath,
     toFilterDictDataList: []
-  },
-  {
-    displayDictName: 'menduner_financing_status',
-    key: 'financingStatus',
-    itemKey: 'value',
-    itemText: 'label',
-    title: '融资阶段',
-    path: commonPath,
-    toFilterDictDataList: []
-  },
+  }
 ]
 export const filterList = dictList