Browse Source

公众号二维码图片更换

Xiao_123 7 tháng trước cách đây
mục cha
commit
5780d25a78

+ 7 - 0
src/config/axios/service.js

@@ -10,6 +10,7 @@ import { enterpriseRefreshToken, userRefreshToken } from '@/api/common'
 import { getToken, getRefreshToken, setToken, setRefreshToken, getIsEnterprise } from '@/utils/auth'
 import { rewardEventTrackClick } from '@/api/integral'
 import errorCode from './errorCode'
+// import router from '@/router'
 
 import { useI18n } from '@/hooks/web/useI18n'
 
@@ -246,7 +247,13 @@ const handleAuthorized = () => {
   const { t } = useI18n()
   const user = useUserStore()
   user.handleClearStorage() // 清除缓存
+
+  // const path = router.currentRoute.value.fullPath
+  // const hasRecommendedPath = path.includes('/recruit/enterprise/talentRecommendation')
+
   if (!isReLogin.show) {
+    // 人才推荐页面不需要弹窗提示
+    // if (hasRecommendedPath) return
     // 如果已经到重新登录页面则不进行弹窗提示
     if (window.location.href.includes('login?redirect=')) {
       return

+ 2 - 2
src/layout/company/slider.vue

@@ -5,7 +5,7 @@
         <v-icon class="icons" size="30">{{ item.mdi }}</v-icon>
         <v-tooltip :text="item.tips" location="start" activator="parent">
           <div v-if="item.showImg" class="ma-3" style="text-align: center">
-            <v-img cover aspect-ratio="1/1" src="https://minio.citupro.com/dev/static/mendunerCode.jpg" :width="170" style="height: 170px;"></v-img>
+            <v-img cover aspect-ratio="1/1" src="https://minio.citupro.com/dev/menduner/official-account-code4.jpg" :width="170" style="height: 170px;"></v-img>
             <span class="tips-text">关注门墩儿微信公众号</span>
           </div>
           <span v-else>{{ item.tips }}</span>
@@ -22,7 +22,7 @@ import { useRouter } from 'vue-router'
 const router = useRouter()
 const list = [
   { mdi: 'mdi-arrow-up-bold', tips: '返回顶部' },
-  { mdi: 'mdi-qrcode', tips: '微信公众号', showImg: 'https://minio.citupro.com/dev/static/mendunerCode.jpg' },
+  { mdi: 'mdi-qrcode', tips: '微信公众号', showImg: 'https://minio.citupro.com/dev/menduner/official-account-code4.jpg' },
   { mdi: 'mdi-bell-outline', tips: '消息', path: '/recruit/enterprise/chatTools' }
 ]
 

+ 1 - 1
src/layout/personal/footer.vue

@@ -19,7 +19,7 @@
       </div>
       <div class="right size d-flex">
         <div>
-          <v-img :width="100" cover aspect-ratio="16/9" src="https://minio.citupro.com/dev/static/mendunerCode.jpg" style="height: 100px;"></v-img>
+          <v-img :width="100" cover aspect-ratio="16/9" src="https://minio.citupro.com/dev/menduner/official-account-code4.jpg" style="height: 100px;"></v-img>
           <div class="mt-2" style="text-align: center;">微信公众号</div>
         </div>
         <div class="ml-5">

+ 3 - 3
src/layout/personal/slider.vue

@@ -5,7 +5,7 @@
         <v-icon class="icons" size="30">{{ item.mdi }}</v-icon>
         <v-tooltip :text="item.tips" location="start" activator="parent">
           <div v-if="item.showImg" class="ma-3" style="text-align: center">
-            <v-img cover aspect-ratio="1/1" src="https://minio.citupro.com/dev/static/mendunerCode.jpg" :width="170" style="height: 170px;"></v-img>
+            <v-img cover aspect-ratio="1/1" src="https://minio.citupro.com/dev/menduner/official-account-code4.jpg" :width="170" style="height: 170px;"></v-img>
             <span class="tips-text">关注门墩儿微信公众号</span>
           </div>
           <span v-else>{{ item.tips }}</span>
@@ -23,11 +23,11 @@ import { getToken } from '@/utils/auth'
 const router = useRouter()
 const defaultList = [
   { mdi: 'mdi-arrow-up-bold', tips: '返回顶部' },
-  { mdi: 'mdi-qrcode', tips: '微信公众号', showImg: 'https://minio.citupro.com/dev/static/mendunerCode.jpg' }
+  { mdi: 'mdi-qrcode', tips: '微信公众号', showImg: 'https://minio.citupro.com/dev/menduner/official-account-code4.jpg' }
 ]
 const hasTokenList = [
   { mdi: 'mdi-arrow-up-bold', tips: '返回顶部' },
-  { mdi: 'mdi-qrcode', tips: '微信公众号', showImg: 'https://minio.citupro.com/dev/static/mendunerCode.jpg' },
+  { mdi: 'mdi-qrcode', tips: '微信公众号', showImg: 'https://minio.citupro.com/dev/menduner/official-account-code4.jpg' },
   { mdi: 'mdi-bell-outline', tips: '消息', path: '/recruit/personal/message' },
   { mdi: 'mdi-list-box-outline', tips: '在线简历', path: '/recruit/personal/personalCenter/resume/online' }
 ]

+ 2 - 2
src/views/entrances/components/slider.vue

@@ -5,7 +5,7 @@
         <v-icon class="icons" size="30">{{ item.mdi }}</v-icon>
         <v-tooltip :text="item.tips" location="start" activator="parent">
           <div v-if="item.showImg" class="ma-3" style="text-align: center">
-            <v-img cover aspect-ratio="1/1" src="https://minio.citupro.com/dev/static/mendunerCode.jpg" :width="170" style="height: 170px;"></v-img>
+            <v-img cover aspect-ratio="1/1" src="https://minio.citupro.com/dev/menduner/official-account-code4.jpg" :width="170" style="height: 170px;"></v-img>
             <span class="tips-text">关注门墩儿微信公众号</span>
           </div>
           <span v-else>{{ item.tips }}</span>
@@ -22,7 +22,7 @@ import { useRouter } from 'vue-router'
 const router = useRouter()
 const list = [
   // { mdi: 'mdi-arrow-up-bold', tips: '返回顶部' },
-  { mdi: 'mdi-qrcode', tips: '微信公众号', showImg: 'https://minio.citupro.com/dev/static/mendunerCode.jpg' },
+  { mdi: 'mdi-qrcode', tips: '微信公众号', showImg: 'https://minio.citupro.com/dev/menduner/official-account-code4.jpg' },
   { mdi: 'mdi-face-agent', tips: '客服' },
   { mdi: 'mdi-application-settings', tips: '预约演示', path: '/' }
 ]

+ 5 - 5
src/views/headhunting/components/content.vue

@@ -5,7 +5,7 @@
       <div class="carousel-desc common-width">
         <h1>门墩儿猎头</h1>
         <hr class="carousel-desc-line" />
-        <div class="carousel-desc-text">门墩儿猎头深知卓越的领导力是企业业绩增长的关键。我们专注于为企业提供精准的人才洞见,助力企业在人才招聘、培养和晋升方面做出明智选择,从而优化高管团队的整体表现,推动企业持续发展。</div>
+        <div class="carousel-desc-text">我们深知卓越的领导力是企业业绩增长的关键。我们专注于为企业提供精准的人才洞见,助力企业在人才招聘、培养和晋升方面做出明智选择,从而优化高管团队的整体表现,推动企业持续发展。</div>
       </div>
     </div>
     <!-- 数值示例 -->
@@ -96,14 +96,14 @@
             <p>手&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;机:18501626969</p>
             <div class="mt-5 text-center">
               <div style="width: 120px; height: 120px; margin: auto;">
-                <v-img class="ml-2" cover aspect-ratio="1/1" src="https://minio.citupro.com/dev/static/mendunerCode.jpg" width="120" height="120"></v-img>
+                <v-img class="ml-2" cover aspect-ratio="1/1" src="https://minio.citupro.com/dev/menduner/official-account-code4.jpg" width="120" height="120"></v-img>
               </div>
               <span class="tips-text ml-6">关注门墩儿微信公众号</span>
             </div>
           </div>
         </div>
         <div class="right text-end">
-          <img src="https://cn.spencerstuart.com/-/media/2019/november/homepagesocial_1039.jpg?h=770&amp;w=1093&amp;la=en&amp;hash=FA4B0309C1DDFD2FC1648005B9232838" height="324" width="460" alt="" />
+          <img src="https://minio.citupro.com/dev/menduner/headhunting/concact-bg.jpg" height="324" width="460" alt="" />
         </div>
       </div>
     </div>
@@ -182,10 +182,10 @@ const handleClick = (type, id) => {
     margin: 0 auto;
     text-align: center;
     h1 {
-      padding: 32px 0;
+      padding: 32px 0 10px 0;
     }
     &-line {
-      background-color: #fbcc11;
+      background-color: #30ffed;
       width: 42px;
       height: 5px;
       margin: 0 auto;

+ 4 - 4
src/views/headhunting/components/serviceContent.vue

@@ -141,9 +141,9 @@ const handleClick = (type, id) => {
 }
 .carousel-box {
   width: 100%;
-  height: 748px;
+  height: 500px;
   color: #fff;
-  background-image: url('https://www.spencerstuart.com/-/media/2024/04/ceo-acceleration-building-team/thmb-ceoacceleration-dec2023-1600x900.jpg');
+  background-image: url('https://minio.citupro.com/dev/menduner/headhunting/service-bg.jpg');
   background-size: cover;
   background-repeat: no-repeat;
   background-position: center center;
@@ -152,11 +152,11 @@ const handleClick = (type, id) => {
   .carousel-desc {
     height: 100%;
     margin: auto;
-    padding: 95px 0 165px 0;
+    padding: 55px 0 95px 0;
     h2 {
       margin: auto;
       text-align: center;
-      max-width: 870px;
+      max-width: 673px;
       font-size: 80px;
       font-weight: 500;
       line-height: 1.136364;

+ 1 - 1
src/views/recruit/enterprise/membershipPackage/components/package.vue

@@ -34,7 +34,7 @@
     <div class="scan color-666 d-flex flex-column align-center mt-5">
       <div class="font-weight-bold">微信扫一扫</div>
       <div class="font-size-15 my-3">高级客户经理为您报价(扫码后可电话联系)</div>
-      <v-img cover aspect-ratio="1/1" src="https://minio.citupro.com/dev/static/mendunerCode.jpg" width="170" height="170"></v-img>
+      <v-img cover aspect-ratio="1/1" src="https://minio.citupro.com/dev/menduner/official-account-code4.jpg" width="170" height="170"></v-img>
     </div>
   </div>
 

+ 179 - 0
src/views/recruit/enterprise/talentRecommendation/components/filter.vue

@@ -0,0 +1,179 @@
+<template>
+  <div style="max-height: 80vh; overflow-y: auto;">
+    <div class="d-flex align-center mt-5">
+      <TextInput v-model="textItem.value" :item="textItem" @appendInnerClick="handleSearch"></TextInput>
+      <span class="pl-6 color-666" style="width: 60px; min-width: 60px;" @click="emit('close')">取消</span>
+    </div>
+    <v-divider class="my-3"></v-divider>
+    <!-- 职位 -->
+    <div class="mb-3">
+      <div class="mb-2 font-size-20">职位</div>
+      <div class="d-flex font-size-14 flex-wrap">
+        <div v-for="val in items" :key="val.id" class="mr-2 tag mb-2" :class="{'active': val.active}" @click="handleFirst(val)">{{ val.nameCn }}</div>
+      </div>
+      <div v-if="children.length" class="mx-3" style="border-top: 1px dashed #ccc;"></div>
+      <div v-if="children.length" class="mt-5 font-size-14 d-flex flex-wrap triangle-container pa-3">
+        <div 
+          v-for="k in children" 
+          :key="k.id" 
+          class="second-tag mr-2 mb-2" 
+          :class="{'active': select.findIndex(e => e.id === k.id) !== -1}"
+          @click="handleSecond(k)"
+        >{{ k.nameCn }}</div>
+      </div>
+    </div>
+    <!-- 最高学历、工作经验 -->
+    <div v-for="val in list" :key="val.key" class="mb-3">
+      <div class="mb-2 font-size-20">{{ val.title }}</div>
+      <v-chip-group v-model="val.value" selected-class="text-primary" mandatory @update:modelValue="e => val.value = e" class="flex-wrap">
+        <v-chip v-for="val in val.items" :key="val.id" :text="val.label" :value="val.value" label filter></v-chip>
+      </v-chip-group>
+    </div>
+    <div class="white-bgc pb-5" style="position: sticky; bottom: 0;">
+      <v-divider class="mb-5"></v-divider>
+      <div class="d-flex align-center">
+        <v-btn color="primary" variant="outlined" style="width: 100px;" @click="handleReset">重 置</v-btn>
+        <v-btn class="ml-5" color="primary" style="flex: 1;" @click="handleConfirm">确 定</v-btn>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+defineOptions({ name: 'filterPage'})
+import { ref } from 'vue'
+import { getDict } from '@/hooks/web/useDictionaries'
+
+const emit = defineEmits(['close', 'search'])
+const textItem = ref({
+  type: 'text',
+  value: '',
+  label: '请输入关键词搜索',
+  clearable: false,
+  hideDetails: true,
+  appendInnerIcon: 'mdi-magnify'
+})
+const query = ref({
+  content: '',
+  positionIds: [],
+  areaIds: [],
+  expType: '',
+  eduType: ''
+})
+const list = ref([
+  {
+    title: '最高学历',
+    dictTypeName: 'menduner_education_type',
+    items: [],
+    value: -1,
+    key: 'eduType'
+  },
+  {
+    title: '工作经验',
+    dictTypeName: 'menduner_exp_type',
+    items: [],
+    value: -1,
+    key: 'expType'
+  }
+])
+list.value.forEach(e => {
+  getDict(e.dictTypeName).then(({ data }) => {
+    e.items = [{ value: -1, label: '不限' }, ...data] || []
+  })
+})
+
+// 职位树状
+const items = ref([])
+getDict('positionTreeData', {}, 'positionTreeData').then(({ data }) => {
+  if (!data) return
+  items.value = data.map(e => {
+    e.active = false
+    return e
+  })
+})
+
+const children = ref([])
+const handleFirst = (val) => {
+  if (val.active) {
+    val.active = false
+    children.value = []
+    select.value = select.value.filter(e => e.parentId !== val.id)
+    return
+  }
+  items.value.forEach(e => e.active = false)
+  val.active = !val.active
+  children.value = val.children || []
+}
+
+const handleSearch = () => {
+  query.value.content = textItem.value.value
+  emit('search', query.value)
+}
+
+const select = ref([])
+const handleSecond = (val) => {
+  const index = select.value.findIndex(e => e.id === val.id)
+  if (index !== -1) {
+    select.value.splice(index, 1)
+  } else select.value.push(val)
+  console.log(select.value, 'select')
+  // emit('select', select.value)
+}
+
+// 重置
+const handleReset = () => {
+  query.value = {
+    content: '',
+    positionIds: [],
+    areaIds: [],
+    expType: '',
+    eduType: ''
+  }
+  select.value = []
+  list.value.forEach(e => e.value = -1)
+  items.value.forEach(e => e.active = false)
+  emit('search', query.value)
+}
+const handleConfirm = () => {
+  query.value.content = textItem.value.value
+  query.value.positionIds = select.value.map(e => e.id)
+  list.value.forEach(e => query.value[e.key] = e.value === -1 ? '' : e.value)
+  emit('search', query.value)
+}
+</script>
+
+<style scoped lang="scss">
+.active {
+  border: 1px solid var(--v-primary-base) !important;
+  color: var(--v-primary-base) !important;
+}
+.tag {
+  padding: 5px 15px;
+  border: 1px solid #d3d0d0;
+  border-radius: 5px;
+}
+.second-tag {
+  background-color: #fff;
+  color: #666;
+  padding: 5px 15px;
+  border-radius: 5px;
+}
+.triangle-container {
+  position: relative;
+  background-color: #f2f2f2;
+  &::after {  
+    content: "";  
+    position: absolute;  
+    left: 10%;
+    top: -19px;
+    margin-left: -5px;
+    border-width: 10px 10px 10px 10px;
+    border-style: solid;  
+    border-color: transparent transparent #f2f2f2 transparent;
+  }
+}
+:deep(.v-slide-group__content) {
+  width: 100% !important;
+  flex-wrap: wrap !important;
+}
+</style>

+ 44 - 13
src/views/recruit/enterprise/talentRecommendation/index.vue

@@ -10,7 +10,8 @@
     <div v-else class="content py-3" @scroll="handleScroll">
       <v-card class="py-3 px-5" :style="{'width': isMobile ? '100%' : '750px'}" style="min-height: calc(100vh - 24px); box-sizing: border-box; margin: 0 auto;">
         <div class="d-flex align-center" style="width: 340px; margin: auto;">
-          <Autocomplete v-model="query.jobId" :item="selectItems" @change="handleChange"></Autocomplete>
+          <!-- <Autocomplete v-model="query.jobId" :item="selectItems" @change="handleChange"></Autocomplete> -->
+          <TextInput v-model="textItem.value" :item="textItem" @click="openDrawer" @appendInnerClick="openDrawer"></TextInput>
         </div>
         <v-divider></v-divider>
         <div v-if="items.length">
@@ -23,10 +24,10 @@
                 <p class="font-size-20">{{ val.name }}</p>
                 <p class="color-999 font-size-16">
                   {{ val.jobStatusName }}
-                  <span v-if="val.jobStatusName && val.expType" class="septal-line"></span>
-                  {{ val.expType }}
-                  <span v-if="val.eduType" class="septal-line"></span>
-                  {{ val.eduType }}
+                  <span v-if="val.jobStatusName && val.expName" class="septal-line"></span>
+                  {{ val.expName }}
+                  <span v-if="val.eduName" class="septal-line"></span>
+                  {{ val.eduName }}
                 </p>
               </div>
             </div>
@@ -38,6 +39,10 @@
     </div>
 
     <Loading :visible="loading"></Loading>
+
+    <v-navigation-drawer v-model="screen" location="top" temporary class="px-5" style="border-radius: 0 0 10px 10px;">
+      <FilterPage ref="filterRef" @close="screen = false" @search="handleSearch"></FilterPage>
+    </v-navigation-drawer>
   </div>
 </template>
 
@@ -49,10 +54,11 @@ import passwordFrom from '@/views/login/components/passwordPage.vue'
 import Snackbar from '@/plugins/snackbar'
 import { useUserStore } from '@/store/user'
 import { passwordLogin } from '@/api/common'
-import { getPersonRecommendPage, getJobAdvertised } from '@/api/enterprise'
+import { getPersonRecommendPage, getJobAdvertised, getPersonSearchPage } from '@/api/enterprise'
 import { dealDictArrayData } from '@/utils/position'
 import { getUserAvatar } from '@/utils/avatar'
 import { useRouter } from 'vue-router'
+import FilterPage from './components/filter.vue'
 
 const router = useRouter()
 const loading = ref(false)
@@ -62,7 +68,7 @@ const total = ref(0)
 const query = ref({
   pageNo: 1,
   pageSize: 20,
-  jobId: null
+  // jobId: null
 })
 const selectItems = ref({
   label: '已发布职位',
@@ -71,6 +77,15 @@ const selectItems = ref({
   width: 600,
   items: []
 })
+const textItem = ref({
+  type: 'text',
+  width: 600,
+  value: '',
+  label: '请输入关键词搜索',
+  clearable: false,
+  readonly: true,
+  appendInnerIcon: 'mdi-magnify'
+})
 
 // 已发布职位列表
 const getJobList = async () => {
@@ -97,7 +112,7 @@ const getData = async (isEmpty) => {
   // isEmpty:是否清空列表
   loading.value = true
   try {
-    const res = await getPersonRecommendPage(query.value)
+    const res = await getPersonSearchPage(query.value)
     const list = res.list || []
     items.value = list.length ? !isEmpty ? [...items.value, ...dealDictArrayData([], list)] : dealDictArrayData([], list) : []
     total.value = res.total
@@ -107,7 +122,7 @@ const getData = async (isEmpty) => {
     loading.value = false
   }
 }
-getData()
+if (getToken(1)) getData()
 
 // 底部加载
 const handleScroll = (e) => {
@@ -120,10 +135,10 @@ const handleScroll = (e) => {
 }
 
 // 选择发布职位
-const handleChange = () => {
-  query.value.pageNo = 1
-  getData(true)
-}
+// const handleChange = () => {
+//   query.value.pageNo = 1
+//   getData(true)
+// }
 
 // 登录
 const handleLogin = async () => {
@@ -147,6 +162,22 @@ const handleDetail = ({ userId, id }) => {
   if (!userId || !id) return
   router.push(`/recruit/enterprise/talentRecommendation/details/${userId}?id=${id}`)
 }
+
+// 筛选
+const filterRef = ref()
+const screen = ref(false)
+const openDrawer = () => {
+  screen.value = true
+}
+
+const handleSearch = (val) => {
+  console.log(val, 'search')
+  screen.value = false
+  textItem.value.value = val.content
+  query.value.pageNo = 1
+  query.value = Object.assign(query.value, val)
+  getData(true)
+}
 </script>
 
 <style scoped lang="scss">

+ 1 - 0
src/views/recruit/personal/home/components/homeJobTypeCard/index.vue

@@ -129,6 +129,7 @@ const carouselList = ref([
   { src: 'https://minio.citupro.com/dev/menduner/preferredGroup/IHG-banner-new.gif' },
   { src: 'https://minio.citupro.com/dev/menduner/home/%E6%82%A6%E6%A6%95.jpg' },
   { src: 'https://minio.citupro.com/dev/menduner/home/%E6%B4%B2%E9%99%85%E5%81%87%E6%97%A5.jpg' },
+  { src: 'https://minio.citupro.com/dev/menduner/preferredGroup/SWISS-HOTEL-MANAGEMENT-SCHOOL-MBA.jpg'},
   { src: 'https://minio.citupro.com/dev/menduner/preferredGroup/Hong-Kong-Polytechnic-University-banner.jpg' }
 ])
 </script>

+ 4 - 4
src/views/recruit/personal/home/components/hotJobs.vue

@@ -1,8 +1,8 @@
 <template>
-  <div class="default-width text-center mb-6 d-flex align-center">
-    <span class="mr-2 color-666" style="width: 100px;">{{ $t('position.popularPosition') }}:</span>
-    <div style="flex: 1; overflow: hidden; height: 40px; ">
-      <span v-for="(item, index) in jobs" :key="index" label size="small" class="ml-2 my-1 tag"  @click="handleClick(item)">{{ item.nameCn }}</span>
+  <div class="default-width mb-6 d-flex align-center justify-center">
+    <span class="mr-2 color-666" style="width: 68px; min-width: 68px;">{{ $t('position.popularPosition') }}:</span>
+    <div style="overflow: hidden; height: 40px; ">
+      <span v-for="(item, index) in jobs" :key="index" label size="small" class="mr-2 my-1 tag"  @click="handleClick(item)">{{ item.nameCn }}</span>
     </div>
   </div>
 </template>

+ 2 - 1
src/views/recruit/personal/home/components/popularEnterprises.vue

@@ -6,7 +6,8 @@
         <div class="home-title-line"></div>
       </div>
     </div>
-    <HotPromoted class="mt-5" :items="items"></HotPromoted>
+    <HotPromoted v-if="items.length" class="mt-5" :items="items"></HotPromoted>
+    <Empty v-else :elevation="false" class="mt-3" message="暂无精选企业"></Empty>
     <div v-if="items.length" class="text-center">
       <v-btn class="buttons btnColor" color="primary" to="/recruit/personal/company">{{ $t('enterprise.moreBtn') }}</v-btn>
     </div>