提交 8cb40226 authored 作者: 刘旭's avatar 刘旭

更新代码

上级 a1d48a04
......@@ -62,6 +62,9 @@
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item v-if="JSON.stringify(personalInfo) !== '{}'" @click="toUserResume"
>个人信息</el-dropdown-item
>
<el-dropdown-item @click="logout">退出登录</el-dropdown-item>
</el-dropdown-menu>
</template>
......@@ -105,6 +108,10 @@ const login = () => {
if (token.value) return
show.value = true
}
const toUserResume = () => {
router.push('/recruitmentManagement/editResume')
}
const logout = () => {
userInfoStore.$reset()
globalStore.$reset()
......
......@@ -81,9 +81,10 @@ const mouseleave = () => {
const handleChange = (item: any) => {
dropdownRef.value.style.display = 'none'
if (item.FENTRYID === props.modelValue) return emits('update:modelValue', '')
emits('update:modelValue', item.FENTRYID)
emits('change', item.FENTRYID)
if (item.FENTRYID === props.modelValue) {
emits('update:modelValue', '')
} else emits('update:modelValue', item.FENTRYID)
emits('change')
}
</script>
......
......@@ -12,10 +12,14 @@
index + 1
}}</span>
<el-link>{{ item.FTITLE }}</el-link>
<img v-show="index < 3" src="@/assets/img/icon-new.png" width="28" height="15" alt="" />
<img v-show="index < 3" src="@/assets/img/icon-new.png" width="28" height="15" />
</div>
<div v-show="isMore" class="policy-footer" @click="seeMore">
查看更多<el-icon><i-ep-DArrowRight /></el-icon>
<div v-if="isMore" class="policy-footer">
<span v-if="list.length >= params.total" style="cursor: no-drop">没有更多了</span>
<div v-else style="display: flex; align-items: center" @click="seeMore">
查看更多
<el-icon color="#177CFA"><i-ep-DArrowRight /></el-icon>
</div>
</div>
</div>
</div>
......@@ -31,6 +35,10 @@ defineProps({
type: Array,
default: () => []
} as any,
params: {
type: Object,
default: () => {}
} as any,
isMore: {
type: Boolean,
default: false
......@@ -119,7 +127,7 @@ const seeMore = () => {
justify-content: flex-end;
font-size: 14px;
font-weight: 400;
color: #05a8ff;
color: #177cfa;
cursor: pointer;
}
}
......
<template>
<el-dialog :modelValue="show" :title="title" @close="handleClose">
<div style="display: flex; justify-content: center; width: 100%">
<el-dialog :modelValue="show" width="850" :title="title" @close="handleClose">
<div class="preview-content" style="height: calc(100vh - 182px)">
<vue-office-docx
v-if="suffix === 'docx'"
:src="url"
style="height: 100vh"
style="height: calc(100vh - 182px); width: 810px"
@rendered="rendered"
/>
<iframe
......@@ -18,6 +18,7 @@
<vue-office-pdf
v-else-if="suffix === 'pdf'"
:src="url"
style="height: calc(100vh - 182px)"
@rendered="renderedHandler"
@error="errorHandler"
/>
......@@ -76,7 +77,12 @@ const handleClose = () => {
<style lang="scss" scoped>
.child {
width: 100%;
height: calc(100vh - 70px);
border: 0;
height: calc(100vh - 182px);
}
.preview-content {
display: flex;
justify-content: center;
width: 100%;
height: calc(100vh - 182px);
}
</style>
......@@ -29,3 +29,11 @@ export const getInformation = (data: any) => {
data
)
}
// 查询海报
export const getPoster = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SelectPoster,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
......@@ -118,3 +118,10 @@ export const deleteResume = (data: any) => {
data
)
}
export const getHotPosition = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeHotJobPage,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
......@@ -6,3 +6,10 @@ export const getStreet = () => {
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeStreet,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc'
)
}
// 街道办资料
export const getStreetPosition = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeStreetRecruitmentPage,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
......@@ -42,7 +42,7 @@
</div>
<div v-else-if="index === 5" class="live-broadcast">
<div v-for="col in 6" :key="col" class="live-broadcast-item">
<img src="@/assets/img/Frame377.png" height="214" />
<img src="@/assets/img/Banner.png" height="214" />
<p>
有时候,上天没有给你想要的,不是因为你不配,而是你值得更好的
有时候,上天没有给你想要的,不是因为你不配,而是你值得更好的
......@@ -62,7 +62,7 @@
</div>
<div v-else-if="index === 6" class="flx-direction-column">
<div v-for="col in 5" :key="col" class="entrepreneurship-item">
<img src="@/assets/img/Frame379.png" />
<img src="@/assets/img/Banner.png" />
<div class="entrepreneurship-item-rg">
Lorem ipsum dolor sit amet, consectetur adipiscingelit. Aenean euismod bibendum
laoreet. Proin gravidadolor sit amet lacus accumsan et viverra justocommodo. Proin
......
.skill-container {
width: 100%;
.container {
width: 1316px;
text-align: center;
img {
width: 100%;
margin-top: 24px;
border-radius: 12px;
}
.train-list {
display: flex;
margin: 24px 0;
border: 1px solid #177cfa;
border-radius: 8px;
.train-item {
flex: 0 0 20%;
height: 58px;
line-height: 58px;
border-right: 1px solid #177cfa;
font-size: 24px;
font-weight: 500;
color: #177cfa;
&:nth-child(5) {
border-right: 0;
}
}
}
}
}
<template>
<div>对口帮扶</div>
<div v-loading="loading" class="skill-container flx-center">
<div class="container">
<img :src="baseURL + '/' + commonData?.HbData?.[0].FPOSTERPICTURE" height="560" />
<div style="margin: 24px 0 360px">
<contentBlock :list="commonData?.GaQnData" @change="handleChange" />
</div>
</div>
</div>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { baseURL } from '@/services'
import { getCommon } from '@/services/api/common'
import contentBlock from '@/components/contentBlock.vue'
<style scoped></style>
const router = useRouter()
const loading = ref(true)
const queryList = ref({ pageIndex: 1, pageSize: 10, FormType: 'N' })
const commonData: any = ref()
const handleChange = (row: any) => {
router.push({ path: '/commonDetail', query: { FID: row.FID, FormType: 'N', FTITLE: row.FTITLE } })
}
const init = async () => {
const res: any = await getCommon(queryList.value)
if (res.code === 200) {
commonData.value = res.data
loading.value = false
}
}
init()
</script>
<style lang="scss" scoped>
@import './index.scss';
</style>
......@@ -16,8 +16,12 @@
<img v-show="index < 3" src="@/assets/img/icon-new.png" width="28" height="15" alt="" />
</div>
</div>
<div v-show="isMore" class="flexible-footer" @click="seeMore">
查看更多<el-icon><i-ep-DArrowRight /></el-icon>
<div v-show="isMore" class="flexible-footer">
<span v-if="list.length >= params.total" style="cursor: no-drop">没有更多了</span>
<div v-else style="display: flex; align-items: center" @click="seeMore">
查看更多
<el-icon color="#177CFA"><i-ep-DArrowRight /></el-icon>
</div>
</div>
</div>
</div>
......@@ -33,6 +37,10 @@ defineProps({
type: Array,
default: () => []
} as any,
params: {
type: Object,
default: () => {}
} as any,
isMore: {
type: Boolean,
default: false
......@@ -56,8 +64,8 @@ const seeMore = () => {
flex: 0 0 calc((100% - 50px) / 3);
margin: 0 25px 50px 0;
padding-top: 16px;
background: #ffffff;
box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.05);
// background: #ffffff;
// box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.05);
border-radius: 8px;
box-sizing: border-box;
.flexible-top {
......
<template>
<div v-loading="loading" class="flexible-container">
<div class="container">
<img :src="baseURL + '/' + flexibleData?.HbData?.[0].FPOSTERPICTURE" height="560" />
<img :src="baseURL + '/' + flexibleData?.HbData?.[0]?.FPOSTERPICTURE" height="560" />
<div class="flexible-list">
<flexible
v-for="(item, index) in flexibleNameList"
:key="index"
:title="item.name"
:list="flexibleData?.[item.field]"
:params="paramsData?.[item.field]"
is-more
@change="flexibleChange"
@see-more="seeMore(item.field)"
/>
</div>
<el-input v-model="searchValue" placeholder="搜索关键词" @change="search">
......@@ -86,7 +88,11 @@
<script setup lang="ts">
import { baseURL } from '@/services'
import { getPositionList, getFlexibleEmploym } from '@/services/api/flexibleEmploym'
import {
getPositionList,
getFlexibleEmploym,
getFlexibleEmploymList
} from '@/services/api/flexibleEmploym'
import { useJobDetailStore } from '@/stores/modules/jobDetails'
import flexible from '@/views/flexibleEmploym/components/flexible.vue'
......@@ -118,7 +124,18 @@ const searchValue = ref('')
const loading = ref(true)
const flexibleLoading = ref(false)
const queryList = ref({ pageIndex: 1, pageSize: 10 })
const flexibleData: any = ref()
const flexibleData: any = ref({
HbData: [],
GgData: [],
ZcData: [],
XwData: []
})
const paramsData = reactive({
GgData: { pageIndex: 1, pageSize: 0, total: 0 },
ZcData: { pageIndex: 1, pageSize: 0, total: 0 },
XwData: { pageIndex: 1, pageSize: 0, total: 0 }
}) as any
const flexibleNameList = [
{ name: '公告', field: 'GgData' },
......@@ -130,6 +147,29 @@ const flexibleChange = (row: any) => {
router.push({ path: '/commonDetail', query: { FID: row.FID, FormType: 'D', FTITLE: row.FTITLE } })
}
const seeMore = (Type: string) => {
switch (Type) {
case 'GgData':
if (paramsData.GgData.pageSize <= paramsData.GgData.total) {
paramsData.GgData.pageSize += 10
initFlexibleEmploymList({ ...paramsData.GgData, Type: 'A' })
}
break
case 'ZcData':
if (paramsData.ZcData.pageSize <= paramsData.ZcData.total) {
paramsData.ZcData.pageSize += 10
initFlexibleEmploymList({ ...paramsData.ZcData, Type: 'B' })
}
break
default:
if (paramsData.XwData.pageSize <= paramsData.XwData.total) {
paramsData.XwData.pageSize += 10
initFlexibleEmploymList({ ...paramsData.XwData, Type: 'C' })
}
break
}
}
const handleChange = (name: number) => {
listQuery.obj.postName = tabsList[name].label
initPosition()
......@@ -144,6 +184,26 @@ const search = () => {
initPosition()
}
const initFlexibleEmploymList = async (params: any) => {
const res: any = await getFlexibleEmploymList(params)
if (res.code === 200) {
switch (params.Type) {
case 'A':
flexibleData.value.GgData = res.data || []
paramsData.GgData.total = res.total
break
case 'B':
flexibleData.value.ZcData = res.data || []
paramsData.ZcData.total = res.total
break
default:
flexibleData.value.XwData = res.data || []
paramsData.XwData.total = res.total
break
}
console.log(paramsData)
}
}
const initPosition = async () => {
flexibleLoading.value = true
const res: any = await getPositionList(listQuery)
......@@ -156,10 +216,12 @@ const initPosition = async () => {
const init = async () => {
const res: any = await getFlexibleEmploym(queryList.value)
if (res.code === 200) {
console.log(res)
flexibleData.value = res.data
loading.value = false
flexibleData.value.HbData = res.data?.HbData
seeMore('GgData')
seeMore('ZcData')
seeMore('XwData')
initPosition()
loading.value = false
}
}
......
......@@ -68,10 +68,12 @@
.employment-training {
width: 645px;
height: 400px;
text-align: center;
.employment {
margin-top: 24px;
height: 326px;
box-sizing: border-box;
.employment-item {
......@@ -85,6 +87,9 @@
padding: 0 26px;
margin-bottom: 15px;
cursor: pointer;
&:last-child {
margin-bottom: 0;
}
}
}
.train {
......@@ -110,21 +115,23 @@
.scene {
display: flex;
flex-wrap: wrap;
margin: -5px;
// flex-wrap: wrap;
// margin: -5px;
margin-top: 24px;
.scene-item {
cursor: pointer;
flex: 0 0 calc(16.666% - 10px); /* 让每个盒子占据六分之一的宽度,并且减去间距 */
margin: 5px; /* 设置为盒子之间的间隔 */
width: 206px;
height: 100px;
line-height: 100px;
box-sizing: border-box; /* 让盒子的边框和填充算入盒子的总宽度 */
padding: 13px 63px;
background: #ffffff;
border-radius: 12px;
border: 1px solid rgba(23, 124, 250, 1);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin-right: 16px;
div {
height: 50px;
......
......@@ -77,7 +77,7 @@
专业知识培训
</div>
</div>
<div style="display: flex; margin: 18px 0">
<div style="display: flex; margin: 18px 0 0">
<div
style="position: relative; height: 100px; cursor: pointer"
@click="toTtrain('D')"
......
......@@ -20,6 +20,7 @@
<policy
title="南山就业政策公告"
:list="policyData.noticeData"
:params="policyData.noticeParams"
is-more
@change="handleChange"
@see-more="seeMore(0)"
......@@ -27,6 +28,7 @@
<policy
title="南山就业活动"
:list="policyData.activityData"
:params="policyData.activityParams"
is-more
@change="handleChange"
@see-more="seeMore(1)"
......@@ -49,9 +51,9 @@ const queryList = ref({ pageIndex: 1, pageSize: 10 })
const policyData: any = reactive({
posterUrl: '',
noticeData: [] as any,
noticeParams: { pageIndex: 1, pageSize: 10, total: 10 },
noticeParams: { pageIndex: 1, pageSize: 0, total: 10 },
activityData: [] as any,
activityParams: { pageIndex: 1, pageSize: 10, total: 10 }
activityParams: { pageIndex: 1, pageSize: 0, total: 10 }
})
let timeout: ReturnType<typeof setTimeout>
......@@ -81,7 +83,7 @@ const search = (item: Record<string, any>) => {
const seeMore = async (Type: number) => {
if (Type && policyData.activityParams.pageSize <= policyData.activityParams.total) {
policyData.activityParams.pageSize = policyData.activityParams.pageSize + 10
policyData.activityParams.pageSize += 10
const res: any = await getPolicyList({ ...policyData.activityParams, ...{ Type } })
if (res.code === 200) {
policyData.activityData = res.data
......@@ -89,7 +91,7 @@ const seeMore = async (Type: number) => {
}
}
if (!Type && policyData.noticeParams.pageSize <= policyData.noticeParams.total) {
policyData.noticeParams.pageSize = policyData.noticeParams.pageSize + 10
policyData.noticeParams.pageSize += 10
const res: any = await getPolicyList({ ...policyData.noticeParams, ...{ Type } })
if (res.code === 200) {
policyData.noticeData = res.data
......@@ -106,8 +108,8 @@ const init = async () => {
const res: any = await getPolicy(queryList.value)
if (res.code === 200) {
policyData.posterUrl = res.data?.HbData?.[0].FPOSTERPICTURE
policyData.noticeData = res.data?.GgData
policyData.activityData = res.data?.HdData
seeMore(0)
seeMore(1)
loading.value = false
}
}
......
......@@ -6,14 +6,14 @@
</div>
<div class="personal-info-ct">
<span>年龄:{{ personalInfo?.AGE }}</span>
<span>工作年限:2</span>
<span>学历:{{ personalInfo?.F_LQKJ_EDUCATIONS }}</span>
<span>工作年限:{{ personalInfo?.FGOWORKCOUNT }}</span>
<span>学历:{{ personalInfo?.FEDUCATIONBACKGROUND }}</span>
</div>
<el-divider />
<div class="personal-info-bt">
<div class="personal-info-bt-item">
<div class="personal-info-label">求职状态</div>
<span>{{ personalInfo?.F_LQKJ_DEPARTREMAIN }}</span>
<span>{{ personalInfo?.FDEPARTREMAIN }}</span>
</div>
<div class="personal-info-bt-item">
<div class="personal-info-label">已投递</div>
......@@ -21,7 +21,7 @@
</div>
<div class="personal-info-bt-item">
<div class="personal-info-label">已面试</div>
<span>{{ personalInfo?.InteriviewCount }}</span>
<span>{{ personalInfo?.Interiview }}</span>
</div>
</div>
<div style="width: 100%; display: flex; justify-content: center">
......
......@@ -16,7 +16,7 @@
</div>
<div v-if="positionData.length" class="position-list">
<div v-for="item in positionData" :key="item.FID" class="position-item flx-justify-between">
<div>
<div style="cursor: pointer" @click="preview(item.FID)">
<div class="position-title">{{ item.JobName }}</div>
<div>
<span class="position-label">{{ item.FEDUCATIONALBACKGROUND }}</span>
......@@ -27,8 +27,8 @@
<el-divider direction="vertical" />
<span class="position-label"
>{{ item.FMINIMUMWAGE }}-{{ item.FMAXIMUMSALARY }}.{{
item.FMONTHLYSALARY.replace('月', '')
}}</span
item.FMONTHLYSALARY?.replace('月', '薪')
}}</span
>
<el-divider direction="vertical" />
<span class="position-label">{{ '全职' }}</span>
......@@ -98,7 +98,7 @@ const updatePosition = (FID: string) => {
const preview = (FID: string) => {
initCompanyPositionDetail(FID)
setTimeout(() => {
console.log(positionDetailData.value)
// console.log(positionDetailData.value)
previewShow.value = true
}, 100)
}
......
......@@ -10,7 +10,11 @@
<el-form-item label="公司:">
<span>{{ positionItem?.FirmName }}</span>
</el-form-item>
<el-form-item label="招聘类型:"><span>校招</span></el-form-item>
<el-form-item label="招聘类型:"
><span>{{
positionItem?.FRECRUITMENTTYPE === 'A' ? '社招' : '校招'
}}</span></el-form-item
>
<el-form-item label="职位名称:"
><span>{{ positionItem?.JobName }}</span></el-form-item
>
......@@ -27,7 +31,7 @@
</div>
<div style="margin-left: 42px">
<div class="flx-align-center">
<el-form-item label="经验和学历 :"
<el-form-item label="经验和学历:"
><span>{{ positionItem?.FEXPERIENCE }}</span
><span
style="
......@@ -45,9 +49,9 @@
<div class="flx-align-center">
<el-form-item label="薪资范围:"
><span>
{{ positionItem?.FMINIMUMWAGE }}-{{
positionItem?.FMAXIMUMSALARY
}}&nbsp;&nbsp;13个月</span
{{ positionItem?.FMINIMUMWAGE }}-{{ positionItem?.FMAXIMUMSALARY }}&nbsp;&nbsp;{{
positionItem?.FMONTHLYSALARY?.replace('月', '薪')
}}</span
></el-form-item
>
</div>
......@@ -89,6 +93,7 @@ const handleClose = () => {
<style lang="scss" scoped>
.el-form {
padding-left: 60px;
padding-right: 20px;
}
.position-info {
display: flex;
......
......@@ -5,25 +5,29 @@
<img :src="baseURL + '/' + data?.FPhotosUrl" />
<div>
<div class="resumen-content-header__tp">
<span class="name">{{ data?.Jbdata.FName }}</span>
<span>{{ data?.Jbdata.Age + '岁' }}</span>
<el-divider direction="vertical" />
<span class="name">{{ data?.Jbdata.FName || '姓名' }}</span>
<span>{{ data?.Jbdata.Age ? data?.Jbdata.Age + '岁' : '' }}</span>
<el-divider v-if="data?.Jbdata.Age" direction="vertical" />
<span>{{ data?.Jbdata.FSex === '0' ? '男' : '女' }}</span>
<el-divider direction="vertical" />
<el-divider v-if="data?.Jbdata.FSex" direction="vertical" />
<span>{{
data?.Jbdata.FGoWorkCount > 10 ? '10年以上经验' : data?.Jbdata.FGoWorkCount + '年'
data?.Jbdata.FGoWorkCount
? data?.Jbdata.FGoWorkCount > 10
? '10年以上经验'
: data?.Jbdata.FGoWorkCount + '年'
: ''
}}</span>
<el-divider direction="vertical" />
<el-divider v-if="data?.Jbdata.FGoWorkCount" direction="vertical" />
<span>{{ data?.Jbdata.FEducationBackground }}</span>
<el-divider direction="vertical" />
<el-divider v-if="data?.Jbdata.FEducationBackground" direction="vertical" />
<span>{{ selectDepartRemain(data?.Jbdata.FDepartRemain) }}</span>
</div>
<pre>{{ data?.Jbdata.FPersonalStrengths }}</pre>
</div>
</div>
<!-- 期望职位 -->
<div class="resumen-content-footer">
<div style="display: flex; margin-bottom: 56px">
<!-- 期望职位 -->
<div v-if="data?.Qzdata?.length" style="display: flex; margin-bottom: 56px">
<div class="resume-label">期望职位</div>
<div class="flx-align-center">
<span>{{ data?.Qzdata[0].FDesiredPositionName }}</span>
......@@ -40,7 +44,7 @@
</div>
</div>
<!-- 工作经历 -->
<div style="display: flex; margin-bottom: 32px">
<div v-if="data?.Gzdata.length" style="display: flex; margin-bottom: 32px">
<div class="resume-label">工作经历</div>
<div class="flx-direction-column" style="flex: 1">
<div v-for="item in data?.Gzdata" :key="item.FEntryID">
......@@ -72,7 +76,7 @@
</div>
</div>
<!-- 项目经历 -->
<div style="display: flex; margin-bottom: 56px">
<div v-if="data?.Xmdata.length" style="display: flex; margin-bottom: 56px">
<div class="resume-label">项目经历</div>
<div class="flx-direction-column" style="flex: 1">
<div v-for="item in data?.Xmdata" :key="item.FEntryID">
......@@ -83,8 +87,8 @@
<span>{{ item.FProjectRole }}</span>
</div>
<span style="color: #666666"
>{{ dayjs(item.FStartDate).format('YYYY.MM') }}-{{
dayjs(item.FEndDate).format('YYYY.MM')
>{{ dayjs(item.FProjectStartDate).format('YYYY.MM') }}-{{
dayjs(item.FProjectEndDate).format('YYYY.MM')
}}</span
>
</div>
......@@ -93,7 +97,7 @@
</div>
</div>
<!-- 教育经历 -->
<div style="display: flex; margin-bottom: 56px">
<div v-if="data?.Jydata.length" style="display: flex; margin-bottom: 56px">
<div class="resume-label">教育经历</div>
<div class="flx-direction-column" style="flex: 1">
<div v-for="item in data?.Jydata" :key="item.FEntryID">
......@@ -121,7 +125,7 @@
</div>
</div>
<div style="display: flex; margin-bottom: 56px">
<div v-if="data?.Fjdata.length" style="display: flex; margin-bottom: 56px">
<div class="resume-label">资格证书</div>
<div class="flx-direction-column" style="flex: 1">
<div
......@@ -129,12 +133,13 @@
:key="item.FEntryID"
class="flx-align-center"
style="height: 44px; color: #177cfa; cursor: pointer"
@click="openFile(item)"
>
{{ item.FATTACHMENTNAME }}
</div>
</div>
</div>
<div style="display: flex; margin-bottom: 56px">
<div v-if="data?.Jldata.length" style="display: flex; margin-bottom: 56px">
<div class="resume-label">简历附件</div>
<div class="flx-direction-column" style="flex: 1">
<div
......@@ -142,6 +147,7 @@
:key="item.FEntryID"
class="flx-align-center"
style="height: 44px; color: #177cfa; cursor: pointer"
@click="openFile(item)"
>
{{ item.FATTACHMENTNAME }}
</div>
......@@ -150,12 +156,20 @@
</div>
</div>
</el-dialog>
<previewFile
v-model="state.previewFileShow"
:suffix="state.fileSuffix"
:url="state.fileUrl"
:title="state.previewTitle"
/>
</template>
<script setup lang="ts">
import { jobStatus } from '../config'
import { baseURL } from '@/services'
import dayjs from 'dayjs'
import previewFile from '@/components/previewFile.vue'
defineProps({
show: {
......@@ -169,10 +183,25 @@ defineProps({
})
const emits = defineEmits(['update:show'])
const state = reactive({
previewFileShow: false,
previewTitle: '',
fileSuffix: '',
fileUrl: ''
})
// 设置求职状态
const selectDepartRemain = (departRemain: string) => {
let row = jobStatus.find((item: any) => item.value === departRemain)
return row ? row.label : jobStatus[3]
return row ? row.label : jobStatus[3].label
}
// 预览简历
const openFile = (row: any) => {
state.fileSuffix = row.FATTACHMENTNAME.split('.')[row.FATTACHMENTNAME.split('.').length - 1]
state.fileUrl = baseURL + '/' + row.FFILEIDURL
state.previewTitle = row.FATTACHMENTNAME.split('.')[0]
state.previewFileShow = true
}
const handleClose = () => {
......
......@@ -105,7 +105,7 @@ const list = [
{ name: '学历要求' },
{ name: '院校要求' },
{ name: '经验要求' },
{ name: '年龄要求' }
{ name: '其他要求' }
]
const searchChange = (searchValue: string) => {}
......
......@@ -18,11 +18,11 @@
<span>20岁</span>
</div>
<div class="flx-align-center">
<el-icon><i-ep-OfficeBuilding /></el-icon>
<img src="@/assets/img/icon-learn-time.png" />
<span style="margin-left: 3px">在职求职中</span>
</div>
<div class="flx-align-center">
<el-icon><i-ep-OfficeBuilding /></el-icon>
<img src="@/assets/img/icon-stutus.png" />
<span style="margin-left: 3px">2021-09至2024-07</span>
</div>
</div>
......@@ -39,15 +39,15 @@
<el-dropdown-item>已录用</el-dropdown-item>
<el-dropdown-item>已入职</el-dropdown-item>
<el-dropdown-item>人才库</el-dropdown-item>
<el-dropdown-item>黑名单</el-dropdown-item>
<el-dropdown-item>人才储备</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
<div class="recommend flx-align-center">
<!-- <div class="recommend flx-align-center">
推荐指数
<el-rate v-model="rateValue" style="margin-left: 8px" />
</div>
</div> -->
</div>
</div>
<div class="tab-item-bt flx-justify-between">
......
......@@ -165,7 +165,13 @@ const rules = {
FMyIdentity: [{ required: true, message: '我的牛人身份不能为空', trigger: 'blur' }],
FUserPhone: [
{ required: true, message: '手机号不能为空', trigger: 'blur' },
{ pattern: /^1[3456789]\d{9}$/, message: '请输入有效的手机号', trigger: 'blur' }
{
message: '请输入有效的手机号',
trigger: 'blur',
pattern: (rule: any, value: any) => {
return !value || /^1\d{2}\*{4}\d{4}$/.test(value) || /^1[3456789]\d{9}$/.test(value)
}
}
]
}
......
......@@ -31,16 +31,18 @@ export const filterList = ref([
}
])
export const recruitStatus = [
{ status: '简历未查看', value: companyInfo.value?.NotViewed + '份' },
{ status: '简历待定', value: companyInfo.value?.Pending + '份' },
{ status: '安排面试', value: companyInfo.value?.Arrange + '份' },
{ status: '已面试', value: companyInfo.value?.HaveInterview + '份' },
{ status: '已录用', value: companyInfo.value?.HaveHired + '份' },
{ status: '已入职', value: companyInfo.value?.AlreadyBoard + '份' },
{ status: '人才库', value: companyInfo.value?.TalentPool + '份' },
{ status: '黑名单', value: companyInfo.value?.Blacklist + '份' }
]
export const recruitStatus = computed(() => {
return [
{ status: '简历未查看', value: companyInfo.value?.NotViewed + '份' },
{ status: '简历待定', value: companyInfo.value?.Pending + '份' },
{ status: '安排面试', value: companyInfo.value?.Arrange + '份' },
{ status: '已面试', value: companyInfo.value?.HaveInterview + '份' },
{ status: '已录用', value: companyInfo.value?.HaveHired + '份' },
{ status: '已入职', value: companyInfo.value?.AlreadyBoard + '份' },
{ status: '人才库', value: companyInfo.value?.TalentPool + '份' },
{ status: '人才储备', value: companyInfo.value?.Blacklist + '份' }
]
})
export const positionList = [
{ name: '全部职位', type: '' },
......
......@@ -345,7 +345,6 @@ const handleChange = async (type: string, FNUMBER: string) => {
state.form.FIndustry = FNUMBER
break
case 'Member':
if (!state.isAdd) return
state.form.FScaleS = FNUMBER
break
case 'Financing':
......
......@@ -230,7 +230,6 @@ const state = reactive({
FJobKeywords: [], //职位关键词
FRecruitsNumber: null, //招聘人数
FMonthlySalary: '', //月薪数
FPublisher: '', //发布人(无需填写)
addr: []
} as any,
rules: {
......@@ -301,7 +300,7 @@ const showInput = () => {
}
const handleInputConfirm = () => {
if (state.inputValue) {
if (state.inputValue.trim()) {
state.form.FJobKeywords.push(state.inputValue)
}
state.inputVisible = false
......@@ -327,7 +326,8 @@ const handleResult = () => {
'FWorkPlace',
'FJobKeywords',
'FRecruitsNumber',
'FMonthlySalary'
'FMonthlySalary',
'FPublisher'
],
Model: {
FID: 0,
......@@ -347,8 +347,7 @@ const handleResult = () => {
FWorkPlace: '',
FJobKeywords: '',
FRecruitsNumber: 0,
FMonthlySalary: { FNumber: '' },
FPublisher: ''
FMonthlySalary: { FNumber: '' }
}
}
}
......@@ -431,7 +430,6 @@ const initCompanyPositionDetail = async (FID: string) => {
FJobKeywords: FJOBKEYWORDS, //职位关键词
FRecruitsNumber: FRECRUITSNUMBER, //招聘人数
FMonthlySalary: FMONTHLYSALARY, //月薪数
FPublisher: '', //发布人(无需填写)
addr: addr.slice(0, 3)
}
salaryChange(FMINIMUMWAGE)
......
......@@ -30,7 +30,7 @@
@mouseleave="mouseleave($event, 'user', 0)"
>
<div class="flx-justify-between">
<div class="user-name">{{ state.resumeData?.Jbdata?.FName }}</div>
<div class="user-name">{{ state.resumeData?.Jbdata?.FName || '姓名' }}</div>
<div
id="edit-user0"
class="flx-align-center"
......@@ -45,9 +45,11 @@
<el-col class="user-label flx-align-center" :span="8">
<img src="@/assets/img/icon-resume8.png" width="16" />
<span>{{
state.resumeData?.Jbdata?.FGoWorkCount < 10
? `工作${state.resumeData?.Jbdata?.FGoWorkCount}年`
: '10年以上经验'
state.resumeData?.Jbdata?.FGoWorkCount
? state.resumeData?.Jbdata?.FGoWorkCount < 10
? `工作${state.resumeData?.Jbdata?.FGoWorkCount}年`
: '10年以上经验'
: ''
}}</span>
</el-col>
<el-col class="user-label flx-align-center" :span="8">
......@@ -60,15 +62,17 @@
</el-col>
<el-col class="user-label flx-align-center" :span="8">
<img src="@/assets/img/icon-resume2.png" width="16" />
<span>{{ state.resumeData?.Jbdata?.FUserPhone }}</span>
<span>{{ maskedUserPhone }}</span>
</el-col>
<el-col class="user-label flx-align-center" :span="8">
<img src="@/assets/img/icon-resume3.png" width="16" />
<span>{{ state.resumeData?.Jbdata?.FWechat }}</span>
<span>{{ maskedWechat }}</span>
</el-col>
<el-col class="user-label flx-align-center" :span="8">
<img src="@/assets/img/icon-resume4.png" width="16" />
<span>{{ state.resumeData?.Jbdata?.FEmail }}</span>
<span>{{
state.resumeData?.Jbdata?.FEmail?.replace(/(\d{2})\d+(\d{3}@)/, '$1****$2')
}}</span>
</el-col>
</el-row>
</div>
......@@ -97,7 +101,11 @@
@mouseover="mouseover($event, 'advantage', 0)"
@mouseleave="mouseleave($event, 'advantage', 0)"
>
<pre style="flex: 1">{{ state.resumeData?.Jbdata?.FPersonalStrengths }}</pre>
<pre style="flex: 1">{{
state.resumeData?.Jbdata?.FPersonalStrengths.trim()
? state.resumeData?.Jbdata?.FPersonalStrengths
: '填写您的个人优势'
}}</pre>
<div style="width: 60px">
<div
id="edit-advantage0"
......@@ -213,11 +221,7 @@
<span>{{ item.FPosition }}</span>
</div>
<div>
<span :id="'work-date' + index" style="color: #666666"
>{{ dayjs(item.FStartDate).format('YYYY.MM') }}-{{
dayjs(item.FEndDate).format('YYYY.MM')
}}</span
>
<span :id="'work-date' + index" style="color: #666666">{{ experience }}</span>
<div
:id="'edit-work' + index"
class="flx-align-center"
......@@ -339,7 +343,9 @@
>
<div class="flx-justify-between" style="align-items: start">
<div style="display: flex">
<img src="@/assets/img/icon-resume9.png" width="60" height="60" />
<div class="round-img flx-center">
<img src="@/assets/img/icon-resume5.png" width="34" height="34" />
</div>
<div class="education">
<div>
<span style="font-size: 18px; margin-right: 16px">{{
......@@ -576,9 +582,39 @@ const educationRef = ref()
const uploadImgRef = ref()
const loading = ref(true)
const experience = computed(() => {
const { FGoWorkCount } = state.resumeData?.Jbdata || {}
if (FGoWorkCount) {
if (FGoWorkCount < 10) {
return `工作${FGoWorkCount}年`
} else {
return '10年以上经验'
}
} else {
return ''
}
})
const maskedWechat = computed(() => {
const { FWechat } = state.resumeData?.Jbdata || {}
if (FWechat && FWechat.trim()) {
return FWechat.substring(0, 3) + '****'
} else {
return ''
}
})
const maskedUserPhone = computed(() => {
const { FUserPhone } = state.resumeData?.Jbdata || {}
if (FUserPhone && FUserPhone.trim()) {
return FUserPhone.substring(0, 3) + '****' + FUserPhone.substring(7)
} else {
return ''
}
})
const selectDepartRemain = (departRemain: string) => {
let row = jobStatus.find((item: any) => item.value === departRemain)
return row ? row.label : jobStatus[3]
return row ? row.label : jobStatus[3].label
}
const resumeChange = (row: any) => {
......@@ -631,13 +667,20 @@ const openFile = (row: any) => {
// 修改个人信息
const userInfoClick = () => {
userInfoRef.value.form.Model = { ...userInfoRef.value.form.Model, ...state.resumeData?.Jbdata }
const { FWechat, FUserPhone, FEmail } = state.resumeData.Jbdata
userInfoRef.value.form.Model = {
...userInfoRef.value.form.Model,
...state.resumeData?.Jbdata,
FEmail: FEmail.replace(/(\d{2})\d+(\d{3}@)/, '$1****$2'),
FUserPhone: FUserPhone.substring(0, 3) + '****' + FUserPhone.substring(7),
FWechat: FWechat.substring(0, 3) + '****'
}
state.userInfoShow = true
}
// 设置点击显示唯一
const setShow = (data: any[], showProp: string, showValue: boolean) => {
data.forEach((item: any) => (item[showProp] = showValue))
data?.forEach((item: any) => (item[showProp] = showValue))
}
const addvantageClick = () => {
......@@ -735,7 +778,6 @@ const init = async () => {
loading.value = true
const res: any = await getResume()
if (res.code === 200) {
// console.log(res.data)
state.resumeData = res.data
loading.value = false
}
......
......@@ -29,7 +29,7 @@
/>
<div class="flx-direction-column">
<span class="company-title">{{ userInfoStore.companyInfo?.FNAME }}</span>
<div>
<div style="display: flex; flex-wrap: wrap">
<span class="info-label">{{ userInfoStore.companyInfo?.FINDUSTRY }}</span>
<span class="info-label">{{ userInfoStore.companyInfo?.FFINANCING }}</span>
<span class="info-label">{{ userInfoStore.companyInfo?.FSCALE }}</span>
......
<template>
<div class="main-container">
<!-- <search style="margin: 25px 0" @search-change="searchChange" /> -->
<el-carousel height="560px" style="width: 100%">
<el-carousel-item v-for="item in posterList" :key="item">
<img :src="baseURL + '/' + item.FPOSTERPICTURE" style="width: 100%; height: 100%" />
</el-carousel-item>
</el-carousel>
<autocomplete
style="margin: 25px 0"
:list="querySearch"
placeholder="搜索关键字"
placeholder="搜索职位、公司"
@search-change="searchChange"
@query-search-async="querySearchAsync"
/>
......@@ -40,7 +44,9 @@
<router-link
:to="{
path: '/recruitmentManagement/personal',
query: { searchValue: col.FDATAVALUE }
query: {
searchValue: col.FDATAVALUE.replace(/[\((][^\))]+[\))]/g, '')
}
}"
style="text-decoration: none"
>
......@@ -64,7 +70,7 @@
/>
</div>
</div>
<!-- 热招职位 -->
<div class="hot-position">
<div class="n-title">热招职位</div>
<el-tabs v-model="activeName" class="hot-position-tabs" stretch @tab-click="handleClick">
......@@ -75,38 +81,47 @@
:name="item.name"
class="hot-position-tab-pane"
>
<div class="position-list">
<div v-for="col in 6" :key="col" class="position-item">
<div class="flx-justify-between" style="margin-bottom: 20px">
<div class="position-title nowrap-ellipsis">
销售经理销售经理销售经理销售经理销售经理销售经理
<div v-if="hotPositionList.length">
<div class="position-list">
<div v-for="col in hotPositionList" :key="col.jobfid" class="position-item">
<div @click="toPositionDetail(col.jobfid)">
<div class="flx-justify-between" style="margin-bottom: 20px">
<div class="position-title nowrap-ellipsis">
{{ col.jobname }}
</div>
<div>
<span class="salary">{{ col.fminimumwage }}-{{ col.fmaximumsalary }}</span>
<span class="monthly-pay">元/月</span>
</div>
</div>
<div class="position-label">
<span>{{ col.feducationalbackground }}</span>
<el-divider direction="vertical" />
<span>{{ col.fexperience }}</span>
<el-divider direction="vertical" />
<span>招聘{{ col.FRECRUITSNUMBER }}人</span>
</div>
</div>
<el-divider style="margin: 14px 0" />
<div>
<span class="salary">6000-8000</span>
<span class="monthly-pay">元/月</span>
<div class="company">{{ col.firmname }}</div>
<div class="company-label">
<span>{{ col.ffinancings }}</span>
<el-divider direction="vertical" />
<span>{{ col.fscales }}</span>
<el-divider direction="vertical" />
<span>{{ col.findustry }}</span>
</div>
</div>
</div>
<div class="position-label">
<span>大专</span>
<el-divider direction="vertical" />
<span>1-3年</span>
<el-divider direction="vertical" />
<span>招聘2人</span>
</div>
<el-divider style="margin: 14px 0" />
<div class="company">深圳市世杰创益酒店酒店管理限公司</div>
<div class="company-label">
<span>大专</span>
<el-divider direction="vertical" />
<span>1-3年</span>
<el-divider direction="vertical" />
<span>招聘2人</span>
</div>
</div>
<div class="flx-center" style="text-align: center">
<span class="n-more" @click="seeMore">查看更多</span>
</div>
</div>
<el-empty v-else description="暂无职位" />
</el-tab-pane>
</el-tabs>
<span class="n-more">查看更多</span>
</div>
<!-- 热门企业 -->
......@@ -163,8 +178,13 @@
<script setup lang="ts">
import { baseURL } from '@/services'
import { getPosition, getUserPostionList } from '@/services/api/recruitmentManagement'
import {
getPosition,
getUserPostionList,
getHotPosition
} from '@/services/api/recruitmentManagement'
import { getStreet } from '@/services/api/streetOfficeSpecialTopic'
import { getPoster } from '@/services/api/common'
import { useUserInfoStore } from '@/stores/modules/userInfo'
import autocomplete from '@/components/autocomplete.vue'
......@@ -174,19 +194,21 @@ const menuList = ref([] as any)
const FDATAVALUE = ref()
const streetList = ref()
const posterList: any = ref([])
const hotPositionList: any = ref([])
const querySearch = ref([])
const tabsList = [
{ label: '市场', name: 0 },
{ label: '运营', name: 1 },
{ label: '销售', name: 2 },
{ label: '技术', name: 3 },
{ label: '服务业', name: 4 },
{ label: '设计', name: 5 },
{ label: '管理', name: 6 },
{ label: '人力/财务/行政', name: 7 }
{ label: '市场', name: 'LevelJob_18' },
{ label: '运营', name: 'LevelJob_04' },
{ label: '销售', name: 'LevelJob_05' },
{ label: '技术', name: 'LevelJob_01' },
{ label: '服务业', name: 'LevelJob_11' },
{ label: '设计', name: 'LevelJob_15' },
{ label: '管理', name: 'LevelJob_09' },
{ label: '人力/财务/行政', name: 'LevelJob_07' }
]
const activeName = ref(0)
const activeName = ref('LevelJob_18')
watch(
() => userInfoStore,
......@@ -201,8 +223,9 @@ watch(
{ immediate: true, deep: true }
)
const handleClick = (tab: string) => {
router.push({ path: '/recruitmentManagement/enterprise' })
const handleClick = (tab: any, e: any) => {
activeName.value = tab.props.name
initHotPosition()
}
const querySearchAsync = async (searchVal: string) => {
......@@ -220,6 +243,10 @@ const searchChange = (searchValue: string) => {
router.push({ path: '/recruitmentManagement/personal', query: { searchValue } })
}
const seeMore = () => {
router.push({ path: '/recruitmentManagement/personal' })
}
const subMenuList = computed(() => {
if (!FDATAVALUE.value) return []
const list = JSON.parse(JSON.stringify(menuList.value)) || []
......@@ -247,17 +274,33 @@ const mouseout = (row?: any) => {
if (!row) return
}
const toPositionDetail = (FID: number) => {
router.push({ path: '/recruitmentManagement/positionDetail', query: { FID } })
}
const initHotPosition = async () => {
const res: any = await getHotPosition({ FNUMBER: activeName.value })
if (res.code === 200) {
hotPositionList.value = res.data || []
}
}
const init = async () => {
const res: any = await getPosition()
if (res.code === 200) {
// menuList.value = res.data.LevelJobS.filter((item: any, i: number) => i < 10)
menuList.value = res.data.LevelJobS
menuList.value = res.data?.LevelJobS || []
}
const street: any = await getStreet()
if (street.code === 200) {
streetList.value = street.data.sort((a: any, b: any) => a.FSERIALNUMBER - b.FSERIALNUMBER)
}
const poster: any = await getPoster({ Type: 'O' })
if (street.code === 200) {
posterList.value = poster.data || []
}
await initHotPosition()
}
onMounted(() => {
......
......@@ -193,15 +193,11 @@ const selectChange = (e: any, index: number) => {
}
const clearFilter = () => {
queryList.value.Filter = {
FNAME: queryList.value.Filter.FNAME, //标题
FSUBSTREET: '', //街道
FEXPERIENCE: '', //经验
SalaryRange: '', //薪资范围
FEDUCATIONALBACKGROUND: '', //学历
FSCALES: '', //规模
FFINANCINGS: '' //融资情况
}
queryList.value.Filter.FEXPERIENCE = ''
queryList.value.Filter.SalaryRange = ''
queryList.value.Filter.FEDUCATIONALBACKGROUND = ''
queryList.value.Filter.FFINANCINGS = ''
queryList.value.Filter.FSCALES = ''
initUserPostionList()
}
......@@ -220,7 +216,13 @@ const toPositionDetail = (FID: number) => {
const initUserPostionList = async () => {
filterLoading.value = true
const res: any = await getUserPostionList(queryList.value)
let params = JSON.parse(JSON.stringify(queryList.value))
for (const key in params.Filter) {
params.Filter[key] = params.Filter[key].trim()
}
console.log(params.Filter)
const res: any = await getUserPostionList(params)
if (res.code === 200) {
loading.value = false
filterLoading.value = false
......@@ -239,9 +241,15 @@ const init = async () => {
})
streetList.value.unshift({
FNAME: '全部',
FID: ' ',
FID: '',
active: true
})
if (queryList.value.Filter.FSUBSTREET) {
streetList.value.map((item: any) => {
if (item.FID == queryList.value.Filter.FSUBSTREET) item.active = true
else item.active = false
})
}
}
const res: any = await getInformation({
AuxiliaryS: ['Experience', 'SalaryRange', 'Degree2', 'Member', 'Financing']
......@@ -264,8 +272,10 @@ const init = async () => {
}
onMounted(() => {
const { searchValue } = route.query
const { searchValue, street } = route.query
autocompleteRef.value.searchValue = searchValue
queryList.value.Filter.FNAME = searchValue || ''
queryList.value.Filter.FSUBSTREET = Number(street) || ''
init()
})
</script>
......
......@@ -24,11 +24,38 @@
</div>
<div class="flx-align-center" style="margin-top: 24px">
<span
v-for="(item, index) in detailData?.FJOBKEYWORDS"
v-for="(item, index) in detailData?.FCORPORATEWELFARE.filter(
(e: any, i: number) => i < 5
)"
:key="index"
class="label"
>{{ item }}</span
>
<el-popover
placement="bottom-start"
title=""
:show-arrow="false"
:width="500"
:popper-style="{ background: '#022756', border: '1px solid #ffffff' }"
>
<template #default>
<div class="flx-align-center" style="flex-wrap: wrap">
<span
v-for="(item, index) in detailData?.FCORPORATEWELFARE"
:key="index"
class="label"
style="color: #ffffff; margin-bottom: 8px"
>{{ item }}</span
>
</div>
</template>
<template #reference>
<span class="label popover-label" style="cursor: pointer">
<el-icon><i-ep-MoreFilled /></el-icon>
</span>
</template>
</el-popover>
</div>
</div>
<div class="flx-column-start-between">
......@@ -41,7 +68,7 @@
<div class="position-describe">
<span class="desc-title">职位描述</span>
<div class="keyWords">
<span v-for="(item, index) in detailData?.FCORPORATEWELFARE || []" :key="index">{{
<span v-for="(item, index) in detailData?.FJOBKEYWORDS || []" :key="index">{{
item
}}</span>
</div>
......@@ -53,16 +80,7 @@
<span>{{ detailData?.FPUBLISHERS }}</span>
<div class="flx-align-center" style="font-size: 14px">
{{ detailData?.FirmName }}
<span
style="
display: inline-block;
width: 4px;
height: 4px;
background: #cccccc;
border-radius: 50%;
margin: 0 4px;
"
/>
<span class="round" />
{{ detailData?.FJOBTITLES }}
</div>
</div>
......@@ -90,9 +108,13 @@
:label="item.label"
:span="item.span"
:width="item.width"
>{{
detailData?.gsData[item.prop] ? detailData?.gsData[item.prop] : '-'
}}</el-descriptions-item
><span v-show="item.label">
{{
detailData?.gsData[item.prop] && detailData?.gsData[item.prop] !== ' '
? detailData?.gsData[item.prop]
: '-'
}}
</span></el-descriptions-item
>
</el-descriptions>
<div class="business-expand" @click="businessShow = !businessShow">
......
......@@ -172,7 +172,12 @@
[id^='show-education'] {
cursor: pointer;
padding: 14px 32px;
.round-img {
width: 60px;
height: 60px;
border-radius: 50%;
background: #f8f8f8;
}
&:hover {
padding: 14px 32px;
background: #f8f8f8;
......
......@@ -127,5 +127,6 @@
font-weight: 400;
color: #177cfa;
margin-right: 8px;
margin-bottom: 8px;
}
}
......@@ -50,6 +50,7 @@
.personal-contnet {
width: 100%;
min-height: 300px;
.personal-ct-item {
cursor: pointer;
background: #ffffff;
......
......@@ -57,6 +57,7 @@
padding: 24px 36px;
.keyWords {
width: 90%;
margin: 24px 0 20px;
span {
display: inline-block;
......@@ -66,6 +67,7 @@
margin-right: 12px;
font-size: 14px;
color: #177cfa;
margin-bottom: 8px;
}
}
pre {
......@@ -88,6 +90,7 @@
border-radius: 12px;
box-sizing: border-box;
padding: 24px 36px;
.text-container {
position: relative;
max-height: calc(3 * 1.3em); /* 3行文本的高度,假设行高为1.2em */
......@@ -150,19 +153,6 @@
}
}
}
.label {
display: block;
box-sizing: border-box;
height: 26px;
background: #1c406e;
font-size: 12px;
border-radius: 4px;
padding: 0 10px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 8px;
}
.desc-title {
font-size: 18px;
......@@ -173,4 +163,35 @@
pre {
white-space: pre-wrap;
}
.round {
display: inline-block;
width: 4px;
height: 4px;
background: #cccccc;
border-radius: 50%;
margin: 0 4px;
}
}
.popover-label {
padding: 1px 10px;
box-sizing: border-box;
}
.popover-label:hover {
border: 1px solid #177cfa !important;
}
.label {
display: block;
box-sizing: border-box;
height: 26px;
background: #1c406e;
font-size: 12px;
border-radius: 4px;
padding: 0 10px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 8px;
}
......@@ -172,6 +172,7 @@
margin: -5px;
margin: 24px 0;
.hot-position-item {
width: calc(33.333% - 10px);
flex: 0 0 calc(33.333% - 10px);
margin: 5px;
box-sizing: border-box;
......@@ -187,6 +188,7 @@
font-weight: 400;
color: #222222;
line-height: 14px;
text-align: left;
}
.item-rg {
font-size: 18px;
......@@ -196,7 +198,11 @@
.hot-position-item-ft {
margin-top: 16px;
display: flex;
span:first-child {
width: 40%;
}
span {
display: inline-block;
padding: 6px 12px;
background: #f8f8f8;
border-radius: 4px;
......
......@@ -29,9 +29,9 @@
<div class="street-card-content flx-center">
<div class="content-top">{{ streetOverview }}</div>
<p>{{ streetDetail?.FSTREETOVERVIEW }}</p>
<div class="content-footer">
<!-- <div class="content-footer">
查看更多<el-icon><i-ep-DArrowRight /></el-icon>
</div>
</div> -->
</div>
</div>
......@@ -56,49 +56,67 @@
<div class="hot-position">
<div class="n-title">热招职位</div>
<div class="hot-position-list">
<div v-for="item in 6" :key="item" class="hot-position-item">
<div
v-for="item in streetPositionList?.Zwdata || []"
:key="item"
class="hot-position-item"
@click="toPositionDetail(item.FID)"
>
<div class="flx-justify-between">
<div class="item-lf nowrap-ellipsis" title="软件测试 (学信网可查,深圳 福田区 新洲)">
软件测试 (学信网可查,深圳 福田区 新洲)
<div class="item-lf nowrap-ellipsis" :title="item.JobName">
{{ item.JobName }}
</div>
<div class="item-rg">11-15K</div>
<div class="item-rg">{{ item.FMINIMUMWAGE }}-{{ item.FMAXIMUMSALARY }}</div>
</div>
<div class="hot-position-item-ft">
<span>深圳 福田区 新洲</span>
<span>经验不限 </span>
<span>学历不限</span>
<span class="nowrap-ellipsis">{{
`${item.FWORKPLACE.split('/')[0]} ${item.FWORKPLACE.split('/')[1]} ${
item.FWORKPLACE.split('/')[2]
}`
}}</span>
<span>{{ item.FEXPERIENCE }}</span>
<span>{{ item.FEDUCATIONALBACKGROUND }}</span>
</div>
</div>
</div>
<span class="n-more">查看更多</span>
<span class="n-more" @click="toPersonal">查看更多</span>
</div>
<div class="hot-position">
<div class="n-title">辖区企业</div>
<div class="hot-position-list">
<div v-for="item in 6" :key="item" class="hot-position-item enterprise">
<div class="enterprise-tp">
<div
v-for="item in streetPositionList?.Qydata || []"
:key="item"
class="hot-position-item enterprise"
>
<div class="enterprise-tp" @click="toPositionDetail(item.JobName)">
<div class="flx-justify-between">
<div
class="item-lf nowrap-ellipsis"
title="软件测试 (学信网可查,深圳 福田区 新洲)"
>
软件测试 (学信网可查,深圳 福田区 新洲)
<div class="item-lf nowrap-ellipsis" :title="item.JobName">
{{ item.JobName }}
</div>
<div class="item-rg">11-15K</div>
<div class="item-rg">{{ item.FMINIMUMWAGE }}-{{ item.FMAXIMUMSALARY }}</div>
</div>
<div class="hot-position-item-ft">
<span>深圳 福田区 新洲</span>
<span>经验不限 </span>
<span>学历不限</span>
<span class="nowrap-ellipsis">{{
`${item.FWORKPLACE.split('/')[0]} ${item.FWORKPLACE.split('/')[1]} ${
item.FWORKPLACE.split('/')[2]
}`
}}</span>
<span>{{ item.FEXPERIENCE }}</span>
<span>{{ item.FEDUCATIONALBACKGROUND }}</span>
</div>
</div>
<div class="enterprise-bt flx-justify-between">
<div class="flx-align-center">
<img src="@/assets/img/icon-gonggao.png" width="24px" height="24px" />
<span style="margin-left: 8px">好乐租</span>
<span style="margin-left: 8px">{{ item.FirmName }}</span>
</div>
<div>
<span>{{ item.FINDUSTRY }}</span>
<el-divider direction="vertical" />
<span>{{ item.FFINANCINGS }}</span>
</div>
<div><span>软件开发</span> <span class="line" /> <span>未融资</span></div>
</div>
</div>
</div>
......@@ -110,10 +128,12 @@
<script setup lang="ts">
import { baseURL } from '@/services'
import { getStreet } from '@/services/api/streetOfficeSpecialTopic'
import { getStreet, getStreetPosition } from '@/services/api/streetOfficeSpecialTopic'
const route = useRoute()
const router = useRouter()
const streetList: any = ref([])
const streetPositionList: any = ref([])
const streetData = ref([
{
name: '街道概况',
......@@ -141,6 +161,7 @@ const streetOverview = ref()
const streetDetail: any = ref()
const overviewDetail: any = ref()
const loading = ref(true)
watch(
() => streetActive.value,
......@@ -155,8 +176,17 @@ watch(
}
)
const toPositionDetail = (FID: number) => {
router.push({ path: '/recruitmentManagement/positionDetail', query: { FID } })
}
const toPersonal = () => {
router.push({ path: '/recruitmentManagement/personal', query: { street: streetActive.value } })
}
const change = (FID: string) => {
streetActive.value = FID
initStreetPosition()
}
const streeChange = (index: number) => {
......@@ -168,14 +198,26 @@ const streeChange = (index: number) => {
})
}
const initStreetPosition = async () => {
const res: any = await getStreetPosition({ FID: streetActive.value })
if (res.code === 200) {
streetPositionList.value = res.data || []
}
}
const init = async () => {
loading.value = true
const res: any = await getStreet()
if (res.code === 200) {
streetList.value = res.data
.map((item: any) => ({ ...item, FNAME: item.FNAME + '专题' }))
.sort((a: any, b: any) => a.FSERIALNUMBER - b.FSERIALNUMBER)
const { FID } = route.query
streetActive.value = FID || streetList.value[0]?.FID || null
if (!streetActive.value) {
const { FID } = route.query
streetActive.value = FID || streetList.value[0]?.FID || null
}
initStreetPosition()
loading.value = false
}
}
......
.skill-container {
width: 100%;
.container {
width: 1316px;
text-align: center;
img {
width: 100%;
margin-top: 24px;
border-radius: 12px;
}
.train-list {
display: flex;
margin: 24px 0;
border: 1px solid #177cfa;
border-radius: 8px;
.train-item {
flex: 0 0 20%;
height: 58px;
line-height: 58px;
border-right: 1px solid #177cfa;
font-size: 24px;
font-weight: 500;
color: #177cfa;
&:nth-child(5) {
border-right: 0;
}
}
}
}
}
<template>
<div>人力实训基地</div>
<div v-loading="loading" class="skill-container flx-center">
<div class="container">
<img :src="baseURL + '/' + commonData?.HbData?.[0].FPOSTERPICTURE" height="560" />
<div style="margin: 24px 0 360px">
<contentBlock :list="commonData?.GaQnData" @change="handleChange" />
</div>
</div>
</div>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { baseURL } from '@/services'
import { getCommon } from '@/services/api/common'
import contentBlock from '@/components/contentBlock.vue'
<style scoped></style>
const router = useRouter()
const loading = ref(true)
const queryList = ref({ pageIndex: 1, pageSize: 10, FormType: 'M' })
const commonData: any = ref()
const handleChange = (row: any) => {
router.push({ path: '/commonDetail', query: { FID: row.FID, FormType: 'M', FTITLE: row.FTITLE } })
}
const init = async () => {
const res: any = await getCommon(queryList.value)
if (res.code === 200) {
commonData.value = res.data
loading.value = false
}
}
init()
</script>
<style lang="scss" scoped>
@import './index.scss';
</style>
......@@ -17,6 +17,8 @@ declare module 'vue' {
ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
ElButton: typeof import('element-plus/es')['ElButton']
ElCarousel: typeof import('element-plus/es')['ElCarousel']
ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem']
ElCascader: typeof import('element-plus/es')['ElCascader']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCol: typeof import('element-plus/es')['ElCol']
......@@ -42,6 +44,7 @@ declare module 'vue' {
ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopover: typeof import('element-plus/es')['ElPopover']
ElRate: typeof import('element-plus/es')['ElRate']
ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
......
......@@ -80,16 +80,6 @@ export default defineConfig({
}
}
},
// build: {
// minify: 'terser',
// terserOptions: {
// compress: {
// //生产环境时移除console.log()
// drop_console: true,
// drop_debugger: true
// }
// }
// },
build: {
outDir: 'dist',
sourcemap: false,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论