Bladeren bron

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

lifanagju_citu 7 maanden geleden
bovenliggende
commit
1dcaa4de2b

+ 9 - 1
src/api/enterprise.js

@@ -187,10 +187,18 @@ export const checkRecruiterPassword = async () => {
   })
 }
 
-// 分页检索人才信息
+// 找人-搜索
 export const getPersonSearchPage = async (params) => {
   return await request.get({
     url: '/app-api/menduner/system/recruit/person-search/page',
     params
   })
+}
+
+// 找人-推荐
+export const getPersonRecommendPage = async (params) => {
+  return await request.get({
+    url: '/app-api/menduner/system/recruit/person-recommend/page',
+    params
+  })
 }

BIN
src/assets/headerBg.jpg


BIN
src/assets/headerBg.png


+ 1 - 1
src/layout/company/side.vue

@@ -34,7 +34,6 @@
             :to="val.path"
             :title="getCurrentLocaleLang() === 'zh_CN' ? val.title : val.enName"
             rounded="shaped"
-            :value="val.path"
           ></v-list-item>
         </v-list-group>
       </template>
@@ -83,6 +82,7 @@ const getList = (arr, obj = []) => {
   }
   return obj
 }
+
 </script>
 
 <style scoped lang="scss">

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

@@ -175,11 +175,11 @@ const navList = [
   //   ]
   // },
   { title: '直聘', path: '/recruit/personal/recommend', noLeaving: true },
-  { title: '甄选', path: '/mall' },
-  { title: '猎', path: '/headhunting' },
+  { title: '商城', path: '/mall' },
+  { title: '猎', path: '/headhunting' },
   { title: '火苗儿' },
   { title: '联合会' },
-  { title: '数据' },
+  // { title: '数据' },
   { title: '了解门墩儿', path: '/about' }
 ]
 

+ 2 - 2
src/styles/personal/navBar.css

@@ -52,7 +52,7 @@
   width: 100vw;
   margin: 0 auto;
   align-items: center;
-  padding: 30px;
+  padding: 0 30px;
 }
 
 .nav-logo {
@@ -153,7 +153,7 @@
 .menuList {
   display: flex;
   height: 50px;
-  align-items: center;
+  line-height: 55px;
 }
 
 .menuList div {

File diff suppressed because it is too large
+ 0 - 0
src/styles/personal/navBar.min.css


+ 3 - 2
src/styles/personal/navBar.scss

@@ -49,7 +49,7 @@
   // max-width: 1184px;
   margin: 0 auto;
   align-items: center;
-  padding: 30px;
+  padding: 0 30px;
 }
 .nav-logo {
   float: left;
@@ -146,7 +146,8 @@
 .menuList {
   display: flex;
   height: 50px;
-  align-items: center;
+  line-height: 55px;
+  // align-items: center;
   div {
     margin-left: 10px;
   }

+ 5 - 4
src/views/about/index.vue

@@ -2,19 +2,20 @@
   <div style="width: 100%; height: 100%;" class="">
     <div class="banner"></div>
     <div class="default-width white-bgc px-10 my-3">
-      <div class="py-15">
+      <div class="pb-15 pt-10">
         <h1 class="title">公司简介</h1>
         <p class="mb-5 mt-10">门墩儿是聚焦酒店及现代服务业人力资源技术与人才数据服务的互联网科技公司。</p>
         <p>通过一体化的人力资源运营技术平台,致力于为企业提供人力资源数据服务支持,同时基于数据与技术,为企业提供线上招聘、猎头、实习生及知识付费等全方位人力资源解决方案。</p>
       </div>
-      <div class="d-flex box">
+      <div class="d-flex box mt-5">
         <div class="box-item" v-for="(val, i) in list" :key="i" :style="{'background-image': `url('${val.url}')`}">
           <p class="font-size-19 mb-3">{{ val.title }}</p>
           <p class="font-size-14 pt-3" style="border-top: 1px solid rgba(255, 255, 255, .5)">{{ val.desc }}</p>
         </div>
       </div>
       <div class="py-15">
-        <h1 class="title">学术和行业之声</h1>
+        <v-divider></v-divider>
+        <h1 class="title mt-15">学术和行业之声</h1>
         <div class="mt-10">
           <div v-for="(val, i) in introduce" :key="i" :style="{'text-align': i % 2 === 0 ? 'left' : 'right'}" class="py-15 bole-item">
             <div class="left">
@@ -24,7 +25,7 @@
               <p class="font-size-18">{{ val.name }}</p>
               <p class="font-size-14 my-1">{{ val.job }}</p>
               <p class="font-size-14">{{ val.company }}</p>
-              <p class="font-size-14 mt-2">{{ val.desc }}</p>
+              <p class="font-size-14 mt-5">{{ val.desc }}</p>
             </div>
           </div>
         </div>

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

@@ -143,11 +143,11 @@ const formItems = ref({
       key: 'openTime',
       dateType: 'date', // 时间类型 year month date time
       value: null,
-      label: '开业时间 *',
+      label: '开业时间',
       col: 6,
       flexStyle: 'mr-3',
       outlined: true,
-      rules: [v => !!v || '请选择开业时间']
+      // rules: [v => !!v || '请选择开业时间']
       // options: {},
     },
     {

+ 1 - 1
src/views/recruit/enterprise/search/index.vue

@@ -15,7 +15,7 @@ import { ref } from 'vue'
 import searchRecommend from './recommend/index.vue'
 import searchRetrieval from './retrieval/index.vue'
 
-const tab = ref(1)
+const tab = ref(0)
 </script>
 
 <style scoped lang="scss">

+ 134 - 1
src/views/recruit/enterprise/search/recommend/index.vue

@@ -1,9 +1,142 @@
 <template>
-  <div>searchRecommend</div>
+  <div>
+    <div class="d-flex align-center mt-5" style="width: 600px; margin: auto;">
+      <Autocomplete v-model="query.jobId" :item="selectItems" @change="handleChange"></Autocomplete>
+    </div>
+    <CtTable
+      class="mt-3"
+      :items="items"
+      :headers="headers"
+      :loading="loading"
+      :elevation="0"
+      :isTools="false"
+      :showPage="true"
+      :total="total"
+      :page-info="query"
+      itemKey="id"
+      @pageHandleChange="handleChangePage"
+    >
+      <template #name="{ item }">
+        <div class="d-flex align-center cursor-pointer" @click="handleToPersonDetail(item)">
+          <v-badge
+            v-if="item?.sex === '1' || item?.sex === '2'"
+            bordered
+            offset-y="6"
+            :color="badgeColor(item)"
+            :icon="badgeIcon(item)">
+            <v-avatar size="40" :image="getUserAvatar(item.avatar, item.sex)"></v-avatar>
+          </v-badge>
+          <v-avatar v-else size="40" :image="getUserAvatar(item.avatar, item.sex)"></v-avatar>
+          <span class="defaultLink ml-3 mt-2">{{ item?.name }}</span>
+        </div>
+      </template>
+      <template #actions="{ item }">
+        <v-btn color="primary" variant="text" @click="handleCommunicate(item)">立即沟通</v-btn>
+      </template>
+    </CtTable>
+  </div>
 </template>
 
 <script setup>
 defineOptions({ name: 'searchRecommend' })
+import { ref, computed } from 'vue'
+import { getPersonRecommendPage, getJobAdvertised } from '@/api/enterprise'
+import { timesTampChange } from '@/utils/date'
+import { talkToUser, defaultTextEnt } from '@/hooks/web/useIM'
+import { useRouter } from 'vue-router'
+import { dealDictArrayData } from '@/utils/position'
+import { getUserAvatar } from '@/utils/avatar'
+
+const router = useRouter()
+const query = ref({
+  pageNo: 1,
+  pageSize: 10,
+  jobId: null
+})
+const selectItems = ref({
+  label: '推荐的职位',
+  placeholder: '请选择要进行推荐的职位',
+  clearable: true,
+  width: 600,
+  items: []
+})
+const total = ref(0)
+const items = ref([])
+const loading = ref(false)
+const headers = ref([
+  { title: '姓名', key: 'name', sortable: false },
+  { title: '求职状态', key: 'jobStatusName', sortable: false },
+  { title: '工作年限', key: 'expName', sortable: false },
+  { title: '最高学历', key: 'eduName', sortable: false },
+  { title: '所在城市', key: 'areaName', sortable: false },
+  { title: '户籍地', key: 'regName', sortable: false },
+  { title: '婚姻状况', key: 'maritalStatusName', sortable: false },
+  { title: '首次工作时间', key: 'firstWorkTime', sortable: false, value: item => timesTampChange(item.firstWorkTime, 'Y-M-D') },
+  { title: '操作', key: 'actions', sortable: false }
+])
+
+// 职位列表
+const getJobList = async () => {
+  const data = await getJobAdvertised({})
+  if (data.length) {
+    const list = dealDictArrayData([], data)
+    selectItems.value.items = list.map(e => {
+      return { label: `${e.name}${e.areaName ? '_' + e.areaName : ''} ${e.payFrom ? e.payFrom + '-' : ''}${e.payTo}${e.payName ? '/' + e.payName : ''}`, value: e.id }
+    })
+  }
+}
+getJobList()
+
+// 列表
+const getData = async () => {
+  loading.value = true
+  try {
+    const res = await getPersonRecommendPage(query.value)
+    if (!res.list.length) {
+      items.value = []
+      total.value = 0
+      return
+    }
+    items.value = dealDictArrayData([], res.list)
+    total.value = res.total
+  } finally {
+    loading.value = false
+  }
+}
+getData()
+
+// 推荐
+const handleChange = () => {
+  query.value.pageNo = 1
+  getData()
+}
+
+// 分页
+const handleChangePage = (e) =>{
+  query.value.pageNo = e
+  getData()
+}
+
+// 立即沟通
+const handleCommunicate = async (item) => {
+  const userId = item.userId
+  await talkToUser({userId, text: defaultTextEnt})
+  let url = `/recruit/enterprise/chatTools?id=${userId}`
+  router.push(url)
+}
+
+// 人才详情
+const handleToPersonDetail = ({ userId, id }) => {
+  if (!userId || !id) return
+  window.open(`/recruit/enterprise/talentPool/details/${userId}?id=${id}`)
+}
+
+const badgeColor = computed(() => (item) => {
+  return (item && item.sex) ? (item.sex === '1' ? '#1867c0' : 'error') : 'error'
+})
+const badgeIcon = computed(() => (item) => {
+  return (item && item.sex) ? (item.sex === '1' ? 'mdi-gender-male' : 'mdi-gender-female') : 'mdi-gender-female'
+})
 </script>
 
 <style scoped lang="scss">

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

@@ -1,5 +1,5 @@
 <template>
-  <div class="mt-3">
+  <div class="mt-4">
     <div class="d-flex justify-center">
       <TextInput v-model="query.content" :item="textItem" @enter="handleConfirm" @appendInnerClick="handleConfirm"></TextInput>
     </div>
@@ -47,7 +47,7 @@
             <v-avatar size="40" :image="getUserAvatar(item.avatar, item.sex)"></v-avatar>
           </v-badge>
           <v-avatar v-else size="40" :image="getUserAvatar(item.avatar, item.sex)"></v-avatar>
-          <span class="defaultLink ml-3">{{ item?.name }}</span>
+          <span class="defaultLink ml-3 mt-2">{{ item?.name }}</span>
         </div>
       </template>
       <template #actions="{ item }">
@@ -101,8 +101,8 @@ const headers = ref([
   { title: '户籍地', key: 'regName', sortable: false },
   { title: '婚姻状况', key: 'maritalStatusName', sortable: false },
   { title: '首次工作时间', key: 'firstWorkTime', sortable: false, value: item => timesTampChange(item.firstWorkTime, 'Y-M-D') },
-  { title: '联系电话', key: 'phone', sortable: false },
-  { title: '常用邮箱', key: 'email', sortable: false },
+  // { title: '联系电话', key: 'phone', sortable: false },
+  // { title: '常用邮箱', key: 'email', sortable: false },
   { title: '操作', key: 'actions', sortable: false }
 ])
 

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

@@ -34,7 +34,6 @@
               style="padding-left: 40px;"
               :to="val.path"
               :title="getCurrentLocaleLang() === 'zh_CN' ? val.title : val.enName"
-              :value="val.path"
             ></v-list-item>
           </v-list-group>
         </template>

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

@@ -3,7 +3,7 @@
   <div class="contentBox py-10 px-3">
     <div class="d-flex align-center justify-center">
       <div class="home-title">
-        优质企业
+        优选集团
         <div class="home-title-line"></div>
       </div>
     </div>

+ 0 - 61
src/views/recruit/personal/home/components/headCarousel.vue

@@ -1,61 +0,0 @@
-<template>
-  <div>
-    <v-carousel height="80" :show-arrows="false" hide-delimiters cycle>
-      <!-- <template v-slot:prev="{ props }">
-        <v-btn
-          tonal
-          plain
-          size="x-small"
-          icon="$prev"
-          variant="elevated"
-          @click="props.onClick"
-        ></v-btn>
-      </template>
-      <template v-slot:next="{ props }">
-        <v-btn
-          tonal
-          plain
-          size="x-small"
-          icon="$next"
-          variant="elevated"
-          @click="props.onClick"
-        ></v-btn>
-      </template> -->
-      <v-carousel-item src="@/assets/headerBg.png" cover style="position: relative;">
-        <div class="tips">专属职位推荐,助力职业发展</div>
-      </v-carousel-item>
-      <!-- <v-carousel-item
-        v-for="(item,i) in items"
-        :key="i"
-        :src="item.src"
-        cover
-      ></v-carousel-item> -->
-    </v-carousel>
-  </div>
-</template>
-
-<script setup>
-// import { ref } from 'vue'
-
-defineOptions({ name:'personal-headCarousel'})
-
-// const items = ref([
-//   // { src: 'https://cdn.vuetifyjs.com/images/carousel/squirrel.jpg', },
-//   // { src: 'https://cdn.vuetifyjs.com/images/carousel/sky.jpg', },
-//   // { src: 'https://cdn.vuetifyjs.com/images/carousel/bird.jpg', },
-//   { src: 'https://cdn.vuetifyjs.com/images/carousel/planet.jpg', },
-// ])
-</script>
-
-<style lang="scss" scoped>
-.tips {
-  color: #fff;
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
-  font-size: 22px;
-  font-weight: 100;
-  text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
-}
-</style>

+ 8 - 2
src/views/recruit/personal/home/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div>
-    <headCarousel></headCarousel>
+    <!-- 顶部广告图 -->
+    <div class="banner"></div>
     <div class="stickyBox py-5">
       <headSearch @handleSearch="handleSearch"></headSearch>
     </div>
@@ -23,7 +24,6 @@
 <script setup>
 defineOptions({ name:'personal-index'})
 import simplePage from '@/views/recruit/personal/shareJob/sendResume/simple.vue'
-import headCarousel from './components/headCarousel.vue'
 import headSearch from '@/components/headSearch'
 import hotJobs from './components/hotJobs.vue'
 import homeJobTypeCard from './components/homeJobTypeCard'
@@ -100,4 +100,10 @@ const handleOpenAdvertise = () => {
 .content-box {
   margin-top: -360px;
 }
+.banner {
+  width: 100%;
+  height: 110px;
+  background: url("@/assets/headerBg.jpg") no-repeat;
+  background-size: contain;
+}
 </style>

Some files were not shown because too many files changed in this diff