Xiao_123 hai 6 meses
pai
achega
15f96239fb

+ 46 - 0
src/api/recruit/enterprise/jobFair.js

@@ -0,0 +1,46 @@
+import request from '@/config/axios'
+
+// 获得招聘会列表
+export const getJobFairList = async () => {
+  return await request.get({
+    url: '/app-api/menduner/system/job-fair/list'
+  })
+}
+
+// 保存招聘职位扩展信息
+export const saveJobAdvertisedExtend = async (data) => {
+  return await request.post({
+    url: '/app-api/menduner/system/recruit/job-advertised/save/extend',
+    data
+  })
+}
+
+// 获取招聘职位扩展信息
+export const getJobAdvertisedExtend = async (jobId) => {
+  return await request.get({
+    url: '/app-api/menduner/system/recruit/job-advertised/get/extend?jobId=' + jobId
+  })
+}
+
+// 根据招聘会id获取加入的职位列表
+export const getJobFairPosition = async (id) => {
+  return await request.get({
+    url: '/app-api/menduner/system/recruit/job-fair/get/by/job-fair?id=' + id
+  })
+}
+
+// 企业将职位移除招聘会
+export const quitJobFairPosition = async (data) => {
+  return await request.post({
+    url: '/app-api/menduner/system/recruit/job-fair/quit',
+    data
+  })
+}
+
+// 企业将职位加入招聘会
+export const joinJobFairPosition = async (data) => {
+  return await request.post({
+    url: '/app-api/menduner/system/recruit/job-fair/join',
+    data
+  })
+}

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

@@ -339,7 +339,7 @@ const enterprise = [
     name: 'jobFair',
     show: true, // 暂时隐藏
     meta: {
-      title: '招聘会',
+      title: '双选会',
       enName: 'Job Management',
       icon: 'mdi-account-filter-outline'
     },
@@ -348,10 +348,19 @@ const enterprise = [
         path: '/recruit/enterprise/jobFair',
         show: true,
         meta: {
-          title: '招聘会',
+          title: '双选会',
           enName: 'Job Fair'
         },
         component: () => import('@/views/recruit/enterprise/jobFair/index.vue')
+      },
+      {
+        path: '/recruit/enterprise/jobFair/details/:id',
+        show: true,
+        meta: {
+          title: '双选会详情',
+          enName: 'Job Fair Details'
+        },
+        component: () => import('@/views/recruit/enterprise/jobFair/details.vue')
       }
     ]
   }

+ 55 - 0
src/views/recruit/enterprise/jobFair/components/job.vue

@@ -0,0 +1,55 @@
+<template>
+  <div>
+    <div class="text-end mb-3">
+      <v-btn color="primary" class="mr-3" @click="handleAdd">新增职位</v-btn>
+      <v-btn color="primary" variant="outlined" @click="handleJoin">选择已发布的职位加入招聘会</v-btn>
+    </div>
+    <JobItem :items="jobList"></JobItem>
+
+    <v-navigation-drawer v-model="showDrawer" location="right" temporary width="600">
+      <div class="resume-box">
+        <div class="resume-header">
+          <div class="resume-title">已发布职位</div>
+        </div>
+      </div>
+    </v-navigation-drawer>
+  </div>
+</template>
+
+<script setup>
+defineOptions({ name: 'jobFairJob'})
+import { ref } from 'vue'
+import { getJobFairPosition } from '@/api/recruit/enterprise/jobFair'
+import { dealDictArrayData } from '@/utils/position.js'
+import JobItem from '../job/item.vue'
+// import { useRouter } from 'vue-router'
+import Snackbar from '@/plugins/snackbar'
+import { getEnterprisePubJobTypePermission } from '@/api/recruit/enterprise/position'
+
+const props = defineProps({ id: [String, Number]})
+// const router = useRouter()
+
+// 职位列表
+const jobList = ref([])
+const getJobList = async () => {
+  const data = await getJobFairPosition(props.id)
+  if (!data || !data.length) return jobList.value = []
+  jobList.value = dealDictArrayData([], data)
+}
+getJobList()
+
+const handleAdd = async () => {
+  const data = await getEnterprisePubJobTypePermission()
+  if (!data || !data.length) return Snackbar.warning('没有该操作权限,请联系平台管理员升级后再试')
+  // router.push(`/recruit/enterprise/position/add`)
+}
+
+const showDrawer = ref(false)
+const handleJoin = () => {
+  showDrawer.value = true
+}
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 12 - 0
src/views/recruit/enterprise/jobFair/components/resume.vue

@@ -0,0 +1,12 @@
+<template>
+  <div>简历{{id}}</div>
+</template>
+
+<script setup>
+defineOptions({ name: 'jobFairResume'})
+defineProps({ id: [String, Number]})
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 26 - 0
src/views/recruit/enterprise/jobFair/details.vue

@@ -0,0 +1,26 @@
+<template>
+  <v-card class="card-box pa-5">
+    <v-tabs v-model="tab" align-tabs="center" color="primary" bg-color="#f7f8fa" class="mb-3">
+      <v-tab :value="0">职位</v-tab>
+      <v-tab :value="1">投递简历</v-tab>
+    </v-tabs>
+    <JobFairDetailsJob v-if="tab === 0" :id="id"></JobFairDetailsJob>
+    <JobFairDetailsResume v-else :id="id"></JobFairDetailsResume>
+  </v-card>
+</template>
+
+<script setup>
+defineOptions({ name: 'jobFairDetails' })
+import { ref } from 'vue'
+import { useRouter } from 'vue-router'
+import JobFairDetailsJob from './components/job.vue'
+import JobFairDetailsResume from './components/resume.vue'
+
+const router = useRouter()
+const id = router.currentRoute.value.params.id
+const tab = ref(0)
+
+</script>
+
+<style scoped lang="scss">
+</style>

+ 42 - 2
src/views/recruit/enterprise/jobFair/index.vue

@@ -1,13 +1,53 @@
 <template>
   <v-card class="card-box pa-5">
-    111
+    <v-card v-for="(k, i) in list" :key="i" class="elevation-3 mb-5">
+      <img :src="k.url" style="width: 100%; height: 300px;">
+      <div class="pa-5">
+        <div class="color-primary font-weight-bold font-size-18 mb-1">{{ k.title }}</div>
+        <div class="color-666">{{ k.desc }}</div>
+        <div class="text-end">
+          <v-btn color="primary" variant="outlined" @click.stop="handleBlockEnterprise(k.id)">立即加入</v-btn>
+        </div>
+      </div>
+    </v-card>
   </v-card>
 </template>
 
 <script setup>
 defineOptions({ name: 'jobFair'})
+import { ref } from 'vue'
+import { useRouter } from 'vue-router'
+// import { getJobFairList } from '@/api/recruit/enterprise/jobFair'
+
+const router = useRouter()
+const list = ref([
+  {
+    id: 1,
+    url: 'https://minio.menduner.com/dev/menduner/jobFair.jfif',
+    title: '中瑞实习双选会',
+    desc: '2024年中瑞实习双选会,旨在为毕业生提供更多的就业机会和职业发展机会。'
+  },
+  {
+    id: 2,
+    url: 'https://minio.menduner.com/dev/menduner/jobFair2.jfif',
+    title: '2025年春季校园招聘会',
+    desc: '2025年春季校园招聘会,旨在为毕业生提供更多的就业机会和职业发展机会。'
+  }
+])
+
+// const getList = async () => {
+//   const data = await getJobFairList()
+//   console.log(data, 'data')
+//   list.value = data
+// }
+// getList()
+
+// 立即加入
+const handleBlockEnterprise = (id) => {
+  router.push(`/recruit/enterprise/jobFair/details/${id}`)
+}
 </script>
 
 <style scoped lang="scss">
 
-</style>
+</style>

+ 106 - 0
src/views/recruit/enterprise/jobFair/job/item.vue

@@ -0,0 +1,106 @@
+<template>
+  <div>
+    <div v-for="val in items" :key="val.id" class="itemBox mb-3" style="height: 134px;">
+      <div class="d-flex justify-space-between cursor-pointer" style="padding: 10px 20px;" @click="handleEdit(val)">
+        <div class="position">
+          <div class="d-flex align-center">
+            <!-- <span v-if="val.name.indexOf('style')" v-html="val.name" class="position-name"></span> -->
+            <span class="position-name">{{ val.name }}</span>
+          </div>
+          <div :class="['mt-3', 'other-info', 'ellipsis']">
+            <span>{{ val.areaName }}</span>
+            <span class="lines" v-if="val.areaName && val.eduName"></span>
+            <span>{{ val.eduName }}</span>
+            <span class="lines"></span>
+            <span>{{ val.expName }}</span>
+            <span class="lines"></span>
+            <span v-if="!val.payFrom && !val.payTo">面议</span>
+            <span v-else>{{ val.payFrom ? val.payFrom + '-' : '' }}{{ val.payTo }}{{ val.payName ? '/' + val.payName : '' }}</span>
+            <span class="lines" v-if="val.positionName"></span>
+            <span>{{ val.positionName }}</span>
+          </div>
+        </div>
+      </div>
+      <div class="bottom pa-5 d-flex justify-space-between align-center">
+        <div>到期时间:{{ val.expireTime ? timesTampChange(val.expireTime, 'Y-M-D') : '长期有效' }}</div>
+        <div class="d-flex">
+          <span class="cursor-pointer actions">编辑</span>
+          <span class="lines"></span>
+          <span class="cursor-pointer actions">移出双选会</span>
+        </div>
+      </div>
+    </div>
+  </div>
+
+  <Loading :visible="loading"></Loading>
+</template>
+
+<script setup>
+defineOptions({ name: 'enterprise-position-item'})
+import { ref } from 'vue'
+import { useRouter } from 'vue-router'
+import { timesTampChange } from '@/utils/date'
+import Snackbar from '@/plugins/snackbar'
+import { getEnterprisePubJobTypePermission } from '@/api/recruit/enterprise/position'
+
+// const emit = defineEmits(['refresh'])
+defineProps({
+  items: Array
+})
+
+const loading = ref(false)
+
+const router = useRouter()
+// 职位编辑
+const handleEdit = async (val) => {
+  console.log(val, 'val-edit')
+  const data = await getEnterprisePubJobTypePermission()
+  if (!data || !data.length) return Snackbar.warning('没有该操作权限,请联系平台管理员升级后再试')
+  // router.push(`/recruit/enterprise/position/edit?id=${val.id}`)
+}
+</script>
+
+<style scoped lang="scss">
+.itemBox {
+  position: relative;
+  border: 1px solid #e5e6eb;
+}
+.position-name {
+  color: var(--color-333);
+  font-size: 19px;
+}
+.position {
+  max-width: 46%;
+  position: relative;
+  .item-select {
+    position: absolute;
+    left: -8px;
+    top: -13px;
+  }
+}
+.lines {
+  display: inline-block;
+  width: 1px;
+  height: 17px;
+  vertical-align: middle;
+  background-color: #e0e0e0;
+  margin: 0 10px;
+}
+.other-info {
+  font-size: 15px;
+  color: var(--color-666);
+}
+.bottom {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 40px;
+  background-color: #f7f8fa;
+  font-size: 14px;
+  color: var(--color-888);
+}
+.actions:hover {
+  color: var(--v-primary-base);
+}
+</style>