|
@@ -1,6 +1,6 @@
|
|
|
<template>
|
|
|
<div>
|
|
|
- <div v-if="!getToken(1)" class="login-content">
|
|
|
+ <div v-if="showLogin" class="login-content">
|
|
|
<div class="login-content-box pa-10">
|
|
|
<div class="login-content-box-title text-center mt-4">请先登录您的企业账号</div>
|
|
|
<passwordFrom class="mt-10" ref="passRef" placeholder="请输入企业邮箱" :validEmail="true"></passwordFrom>
|
|
@@ -10,9 +10,24 @@
|
|
|
<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> -->
|
|
|
<TextInput v-model="textItem.value" :item="textItem" @click="openDrawer" @appendInnerClick="openDrawer"></TextInput>
|
|
|
</div>
|
|
|
+ <!-- 已发布职位 -->
|
|
|
+ <div class="text-end mb-1">
|
|
|
+ <v-menu transition="slide-y-transition">
|
|
|
+ <template v-slot:activator="{ props, isActive }">
|
|
|
+ <v-btn color="primary" v-bind="props" variant="tonal" :append-icon="isActive ? 'mdi mdi-menu-up' : 'mdi mdi-menu-down'">
|
|
|
+ {{ query?.jobId ? select : '选择已发布职位推荐' }}
|
|
|
+ </v-btn>
|
|
|
+ </template>
|
|
|
+ <v-list>
|
|
|
+ <v-list-item v-for="k in selectItems.items" :key="k.value" color="primary" :active="k.value === query?.jobId">
|
|
|
+ <v-list-item-title @click="handleActive(k)">{{ k.label }}</v-list-item-title>
|
|
|
+ </v-list-item>
|
|
|
+ </v-list>
|
|
|
+ </v-menu>
|
|
|
+ <v-icon v-if="query?.jobId" color="primary" size="30" class="ml-3" @click="handleClearJob">mdi-close-circle-outline</v-icon>
|
|
|
+ </div>
|
|
|
<v-divider></v-divider>
|
|
|
<div v-if="items.length">
|
|
|
<div v-for="(val, index) in items" :key="val.id" @click="handleDetail(val)">
|
|
@@ -49,12 +64,11 @@
|
|
|
<script setup>
|
|
|
defineOptions({ name: 'talentRecommendation'})
|
|
|
import { ref, onMounted } from 'vue'
|
|
|
-import { getToken } from '@/utils/auth'
|
|
|
import passwordFrom from '@/views/login/components/passwordPage.vue'
|
|
|
import Snackbar from '@/plugins/snackbar'
|
|
|
import { useUserStore } from '@/store/user'
|
|
|
import { passwordLogin } from '@/api/common'
|
|
|
-import { getJobAdvertised, getPersonSearchPage } from '@/api/enterprise'
|
|
|
+import { getJobAdvertised, getPersonSearchPage, getPersonRecommendPage } from '@/api/enterprise'
|
|
|
import { dealDictArrayData } from '@/utils/position'
|
|
|
import { getUserAvatar } from '@/utils/avatar'
|
|
|
import { useRouter } from 'vue-router'
|
|
@@ -67,9 +81,12 @@ const items = ref([])
|
|
|
const total = ref(0)
|
|
|
const query = ref({
|
|
|
pageNo: 1,
|
|
|
- pageSize: 20,
|
|
|
- // jobId: null
|
|
|
+ pageSize: 20
|
|
|
})
|
|
|
+const select = ref('')
|
|
|
+const screen1 = ref(false)
|
|
|
+const token = ref(localStorage.getItem('ENT_ACCESS_TOKEN'))
|
|
|
+const showLogin = ref(token.value ? false : true)
|
|
|
const selectItems = ref({
|
|
|
label: '已发布职位',
|
|
|
placeholder: '请选择要进行推荐的职位',
|
|
@@ -98,10 +115,30 @@ const getJobList = async () => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// 组件挂载后添加事件监听器
|
|
|
+const handleActive = (k) => {
|
|
|
+ select.value = k.label
|
|
|
+ query.value.jobId = k.value
|
|
|
+ query.value.pageNo = 1
|
|
|
+ screen1.value = false
|
|
|
+ getData(true)
|
|
|
+}
|
|
|
+
|
|
|
+const handleClearJob = () => {
|
|
|
+ select.value = ''
|
|
|
+ delete query.value.jobId
|
|
|
+ query.value.pageNo = 1
|
|
|
+ items.value = []
|
|
|
+ total.value = 0
|
|
|
+ screen1.value = false
|
|
|
+}
|
|
|
+
|
|
|
+// 组件挂载后添加事件监听器
|
|
|
const isMobile = ref(false)
|
|
|
onMounted(() => {
|
|
|
- if (!getToken(1)) Snackbar.warning('请先登录')
|
|
|
+ if (!token.value) {
|
|
|
+ Snackbar.warning('请先登录')
|
|
|
+ showLogin.value = true
|
|
|
+ }
|
|
|
else getJobList()
|
|
|
const userAgent = navigator.userAgent
|
|
|
isMobile.value = /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i.test(userAgent)
|
|
@@ -112,20 +149,35 @@ const getData = async (isEmpty) => {
|
|
|
// isEmpty:是否清空列表
|
|
|
loading.value = true
|
|
|
try {
|
|
|
- const res = await getPersonSearchPage(query.value)
|
|
|
+ const res = query.value?.jobId ? await getPersonRecommendPage(query.value) : await getPersonSearchPage(query.value)
|
|
|
const list = res.list || []
|
|
|
items.value = list.length ? !isEmpty ? [...items.value, ...dealDictArrayData([], list)] : dealDictArrayData([], list) : []
|
|
|
total.value = res.total
|
|
|
} catch (err) {
|
|
|
loading.value = false
|
|
|
+ if (err.code === 401) {
|
|
|
+ items.value = []
|
|
|
+ total.value = 0
|
|
|
+ token.value = null
|
|
|
+ query.value = {
|
|
|
+ pageNo: 1,
|
|
|
+ pageSize: 20
|
|
|
+ }
|
|
|
+ Snackbar.warning('请先登录')
|
|
|
+ showLogin.value = true
|
|
|
+ }
|
|
|
} finally {
|
|
|
loading.value = false
|
|
|
}
|
|
|
}
|
|
|
-// if (getToken(1)) getData()
|
|
|
|
|
|
// 底部加载
|
|
|
const handleScroll = (e) => {
|
|
|
+ if (!token.value) {
|
|
|
+ showLogin.value = true
|
|
|
+ Snackbar.warning('请先登录')
|
|
|
+ return
|
|
|
+ }
|
|
|
if (e.srcElement.scrollTop + e.srcElement.clientHeight > e.srcElement.scrollHeight - 10) {
|
|
|
if (items.value.length < total.value) {
|
|
|
query.value.pageNo++
|
|
@@ -134,12 +186,6 @@ const handleScroll = (e) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// 选择发布职位
|
|
|
-// const handleChange = () => {
|
|
|
-// query.value.pageNo = 1
|
|
|
-// getData(true)
|
|
|
-// }
|
|
|
-
|
|
|
// 登录
|
|
|
const handleLogin = async () => {
|
|
|
const { valid } = await passRef.value.passwordForm.validate()
|
|
@@ -149,9 +195,12 @@ const handleLogin = async () => {
|
|
|
const data = await passwordLogin({ ...passRef.value.loginData, account: passRef.value.loginData.phone })
|
|
|
await useUserStore().changeRole({ ...data, type: 'emailLogin', noJump: true })
|
|
|
await getJobList()
|
|
|
- // await getData()
|
|
|
+ if (data?.accessToken) {
|
|
|
+ token.value = data?.accessToken
|
|
|
+ showLogin.value = false
|
|
|
+ }
|
|
|
} catch (err) {
|
|
|
- Snackbar.warning(err.msg)
|
|
|
+ Snackbar.warning(err)
|
|
|
} finally {
|
|
|
loading.value = false
|
|
|
}
|
|
@@ -159,6 +208,11 @@ const handleLogin = async () => {
|
|
|
|
|
|
// 人才详情
|
|
|
const handleDetail = ({ userId, id }) => {
|
|
|
+ if (!token.value) {
|
|
|
+ showLogin.value = true
|
|
|
+ Snackbar.warning('请先登录')
|
|
|
+ return
|
|
|
+ }
|
|
|
if (!userId || !id) return
|
|
|
router.push(`/recruit/enterprise/talentRecommendation/details/${userId}?id=${id}`)
|
|
|
}
|
|
@@ -167,12 +221,20 @@ const handleDetail = ({ userId, id }) => {
|
|
|
const filterRef = ref()
|
|
|
const screen = ref(false)
|
|
|
const openDrawer = () => {
|
|
|
- if (!getToken(1)) return
|
|
|
+ if (!token.value) {
|
|
|
+ showLogin.value = true
|
|
|
+ Snackbar.warning('请先登录')
|
|
|
+ return
|
|
|
+ }
|
|
|
screen.value = true
|
|
|
}
|
|
|
|
|
|
const handleSearch = (val) => {
|
|
|
- // console.log(val, 'search')
|
|
|
+ if (!token.value) {
|
|
|
+ showLogin.value = true
|
|
|
+ Snackbar.warning('请先登录')
|
|
|
+ return
|
|
|
+ }
|
|
|
screen.value = false
|
|
|
textItem.value.value = val.content
|
|
|
query.value.pageNo = 1
|
|
@@ -212,4 +274,8 @@ const handleSearch = (val) => {
|
|
|
height: 10px;
|
|
|
background-color: #f2f4f7;
|
|
|
}
|
|
|
+.active {
|
|
|
+ color: var(--v-primary-base);
|
|
|
+ border: 2px solid var(--v-primary-base);
|
|
|
+}
|
|
|
</style>
|