完善

parent 6f7917fe
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
"vconsole": "^3.15.1", "vconsole": "^3.15.1",
"vue": "^3.3.11", "vue": "^3.3.11",
"vue-i18n": "^9.1.9", "vue-i18n": "^9.1.9",
"wot-design-uni": "^1.3.12", "wot-design-uni": "^1.3.13",
"xinhua-sdk": "^1.8.0" "xinhua-sdk": "^1.8.0"
}, },
"devDependencies": { "devDependencies": {
...@@ -14654,9 +14654,9 @@ ...@@ -14654,9 +14654,9 @@
} }
}, },
"node_modules/wot-design-uni": { "node_modules/wot-design-uni": {
"version": "1.3.12", "version": "1.3.13",
"resolved": "https://registry.npmmirror.com/wot-design-uni/-/wot-design-uni-1.3.12.tgz", "resolved": "https://registry.npmmirror.com/wot-design-uni/-/wot-design-uni-1.3.13.tgz",
"integrity": "sha512-aF4ReRTqLLQ7/JcQQvBZJBivoprX9xrvI0b+xWakis5xDSF7tfz1ndPSCBgPtPdTzIaEG5RAT18x0ueRSUbixQ==", "integrity": "sha512-3LHW480eivYAIDsxQr8KxMHCpeoj45XXpbmslLEvSWdPaRBvkXukaMW8z7wjejrMozxPBkQZT52bktCLBT/kOA==",
"engines": { "engines": {
"HBuilderX": "^3.8.7" "HBuilderX": "^3.8.7"
}, },
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
"vconsole": "^3.15.1", "vconsole": "^3.15.1",
"vue": "^3.3.11", "vue": "^3.3.11",
"vue-i18n": "^9.1.9", "vue-i18n": "^9.1.9",
"wot-design-uni": "^1.3.12", "wot-design-uni": "^1.3.13",
"xinhua-sdk": "^1.8.0" "xinhua-sdk": "^1.8.0"
}, },
"devDependencies": { "devDependencies": {
......
import instance from "@/utils/request"; import instance from "@/utils/request";
// 获取职位列表 // 获取职位列表
export const getjobListApi = params => instance.post("/c/position/page", params); export const getjobListApi = params => instance.post("/c/position/page", params);
// 获取系统匹配岗位
export const getjobListApi2 = params => instance.post("/c/position/recommend/page", params);
// 获取文章匹配岗位
export const getjobListApi3 = articleId => instance.post(`/jobFair/position/${articleId}`);
// 获取职位详情 // 获取职位详情
export const getJobDetailApi = id => instance.post(`/job/detail/${id}`); export const getJobDetailApi = id => instance.post(`/c/position/detail/${id}`);
// 投递简历 // 投递简历
export const submitResumeApi = id => instance.post(`/application/delivery/${id}`); export const submitResumeApi = id => instance.post(`/position/application/delivery/${id}`);
// 获取投递 // 获取投递
export const getSubmitResumeApi = id => instance.post(`/job/getApplication/${id}`); export const getSubmitResumeApi = id => instance.post(`/job/getApplication/${id}`);
// 获取职位详情 // 获取职位详情
export const getCompanyDetailApi = id => instance.post(`/job/company/detail/${id}`); export const getCompanyDetailApi = id => instance.post(`/c/position/company/detail/${id}`);
// 需求信息分页 // 需求信息分页
export const getNeedListApi = data => instance.post("/need/getPageList", data); export const getNeedListApi = data => instance.post("/need/getPageList",data);
// 需求登记 // 需求登记
export const needRegisterApi = id => instance.post(`/need/register/${id}`); export const needRegisterApi = id => instance.post(`/need/register/${id}`);
// 获取平台分页 1零工,2其它 // 获取平台分页 1零工,2其它
......
...@@ -26,7 +26,7 @@ export const saveWorkExperienceApi = params => instance.post("/user/resume/saveW ...@@ -26,7 +26,7 @@ export const saveWorkExperienceApi = params => instance.post("/user/resume/saveW
// 保存教育经历 // 保存教育经历
export const saveEducationExperienceApi = params => instance.post("/user/resume/saveEducationExperience", params); export const saveEducationExperienceApi = params => instance.post("/user/resume/saveEducationExperience", params);
// 获取投递列表 // 获取投递列表
export const getApplicationListApi = params => instance.post("/job/getApplicationList", params); export const getApplicationListApi = params => instance.post("/user/application/page", params);
// 获取面试列表 // 获取面试列表
export const getInterviewListApi = params => instance.post("/job/getInterviewList", params); export const getInterviewListApi = params => instance.post("/job/getInterviewList", params);
......
<template> <template>
<view class="postion-card1" @tap="jump(data.id)"> <view class="postion-card1" @tap="jump(data.id)">
<view class="flex-between"> <view class="flex-between">
<view class="postion-name">{{ data.jobName }}</view> <view class="postion-name">{{ data.name }}</view>
<view v-if="data.minSalary > 0" class="salary" <view v-if="data.minSalary > 0" class="salary"
>{{ data.minSalary / 1000 }}k-{{ data.maxSalary / 1000 }}k<text>/月</text></view >{{ data.minSalary / 1000 }}k-{{ data.maxSalary / 1000 }}k<text>/月</text></view
> >
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
</view> </view>
<view class="flex-between"> <view class="flex-between">
<text class="company-name">{{ data.companyName }}</text> <text class="company-name">{{ data.companyName }}</text>
<text class="address">{{ data.cityName + "-" + data.districtName }}</text> <text class="address">{{ data.cityName + "-" + data.street }}</text>
</view> </view>
</view> </view>
</template> </template>
......
...@@ -54,6 +54,13 @@ ...@@ -54,6 +54,13 @@
"navigationStyle": "custom" "navigationStyle": "custom"
} }
}, },
{
"path": "pages/user/matchingTwo/index",
"style": {
"navigationBarTitleText": "岗位",
"navigationStyle": "custom"
}
},
{ {
"path": "pages/policy/index", "path": "pages/policy/index",
"style": { "style": {
......
...@@ -20,6 +20,9 @@ ...@@ -20,6 +20,9 @@
</view> </view>
<div class="content" v-html="data.content"></div> <div class="content" v-html="data.content"></div>
</div> </div>
<view class="btn-box" v-if="data.type === 3">
<button class="btn" @tap="viewJobPositions">查看岗位</button>
</view>
</div> </div>
</template> </template>
...@@ -35,11 +38,18 @@ onLoad(({ id }) => { ...@@ -35,11 +38,18 @@ onLoad(({ id }) => {
data.value = res.data; data.value = res.data;
}); });
}); });
const viewJobPositions = () => {
uni.navigateTo({
url: `/pages/user/matchingTwo/index?id=${data.value.id}`
});
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.page { .page {
padding: 32rpx; padding: 32rpx;
padding-bottom:calc(112rpx + env(safe-area-inset-bottom)) ;
.top { .top {
padding-bottom: 32rpx; padding-bottom: 32rpx;
margin-bottom: 32rpx; margin-bottom: 32rpx;
...@@ -90,4 +100,22 @@ onLoad(({ id }) => { ...@@ -90,4 +100,22 @@ onLoad(({ id }) => {
} }
} }
} }
.btn-box{
position: fixed;
bottom: 0;
height: 112rpx;
width: 100%;
background: #ffffff;
display: flex;
align-items: center;
padding-bottom:env(safe-area-inset-bottom) ;
.btn{
background: #1F86FF;
width: 622rpx;
height: 80rpx;
line-height: 80rpx;
color: white;
font-size: 28rpx;
}
}
</style> </style>
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
v.name v.name
}}</view> }}</view>
</div> </div>
<scroll-view :scroll-y="true" class="content" @scrolltolower="getData()"> <scroll-view :scroll-y="true" class="content" @scrolltolower="onReachBottom">
<article-list :list="list"></article-list> <article-list :list="list"></article-list>
</scroll-view> </scroll-view>
</div> </div>
...@@ -19,42 +19,45 @@ import articleList from "@/components/articleList/index.vue"; ...@@ -19,42 +19,45 @@ import articleList from "@/components/articleList/index.vue";
import { getArticleListApi, getArticleTypesApi } from "@/api/article.js"; import { getArticleListApi, getArticleTypesApi } from "@/api/article.js";
import { reactive, ref } from "vue"; import { reactive, ref } from "vue";
const active = ref(""); const active = ref("");
const typeList = ref([{ id: "", name: "全部" }]); const typeList = ref([{ id: "", name: "全部" },{ id: -1, name: "招聘会" }]);
getArticleTypesApi(2).then(res => { getArticleTypesApi(2).then(res => {
typeList.value.push(...res.data); typeList.value.push(...res.data);
}); });
onShow(() => { onShow(() => {
changeType({ id: "" }); changeType({ id: "" });
}); });
const changeType = type => { const changeType = type => {
active.value = type.id; active.value = type.id;
pageNo = 1; pageNo = 1;
list.splice(0, list.length); list.value = []
flag = false;
getData(); getData();
}; };
/* 文章 */ /* 文章 */
// 判断是否还有数据 // 判断是否还有数据
let pageNo = 1; let pageNo = 1;
let flag = false; const list = ref([]);
const list = reactive([]);
const getData = () => { const getData = () => {
if (flag) { const params = {
return;
}
getArticleListApi({
type: 2, type: 2,
categoryId: active.value, categoryId: active.value,
pageNo: pageNo++, pageNo,
pageSize: 10 pageSize: 10
}).then(res => { }
if (res.data.length < 10) { if (active.value === -1) {
flag = true; params.type = 3
} delete params.categoryId
list.push(...res.data); }
getArticleListApi(params).then(res => {
list.value.push(...res.data);
}); });
}; };
const onReachBottom = () => {
pageNo++
getData()
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -83,5 +86,6 @@ const getData = () => { ...@@ -83,5 +86,6 @@ const getData = () => {
.content { .content {
flex-grow: 1; flex-grow: 1;
height: 200rpx; height: 200rpx;
padding-bottom: calc(100rpx + env(safe-area-inset-bottom));
} }
</style> </style>
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
v.name v.name
}}</view> }}</view>
</div> </div>
<scroll-view :scroll-y="true" class="content" @scrolltolower="getData()"> <scroll-view :scroll-y="true" class="content" @scrolltolower="onReachBottom">
<article-list :list="list"></article-list> <article-list :list="list"></article-list>
</scroll-view> </scroll-view>
</div> </div>
...@@ -29,32 +29,30 @@ onShow(() => { ...@@ -29,32 +29,30 @@ onShow(() => {
const changeType = type => { const changeType = type => {
active.value = type.id; active.value = type.id;
pageNo = 1; pageNo = 1;
list.splice(0, list.length); list.value = []
flag = false;
getData(); getData();
}; };
/* 文章 */ /* 文章 */
// 判断是否还有数据 // 判断是否还有数据
let pageNo = 1; let pageNo = 1;
let flag = false; const list = ref([]);
const list = reactive([]);
const getData = () => { const getData = () => {
if (flag) { const params = {
return;
}
getArticleListApi({
type: 1, type: 1,
categoryId: active.value, categoryId: active.value,
pageNo: pageNo++, pageNo,
pageSize: 10 pageSize: 10
}).then(res => { }
if (res.data.length < 10) { getArticleListApi(params).then(res => {
flag = true; list.value.push(...res.data);
}
list.push(...res.data);
}); });
}; };
const onReachBottom = () => {
pageNo++
getData()
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -83,5 +81,6 @@ const getData = () => { ...@@ -83,5 +81,6 @@ const getData = () => {
.content { .content {
flex-grow: 1; flex-grow: 1;
height: 200rpx; height: 200rpx;
padding-bottom: calc(100rpx + env(safe-area-inset-bottom));
} }
</style> </style>
...@@ -21,9 +21,9 @@ ...@@ -21,9 +21,9 @@
<view class="pos-name">{{ partTimeJobData.name }}</view> <view class="pos-name">{{ partTimeJobData.name }}</view>
<view class="cos-position"> <view class="cos-position">
<!-- <text>{{partTimeJobData.placeCityName}}</text> --> <!-- <text>{{partTimeJobData.placeCityName}}</text> -->
<text>{{ partTimeJobData.cityName }}</text> <text>{{ partTimeJobData.location?.split('-')[1] }}</text>
<text class="margin-8">|</text> <text class="margin-8">|</text>
<text>{{ partTimeJobData.jobList?.length }}个在招职位</text> <text>{{ partTimeJobData.jobVacancies }}个在招职位</text>
</view> </view>
</view> </view>
</view> </view>
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
<view class="pos-address"> <view class="pos-address">
<text class="title">公司地址</text> <text class="title">公司地址</text>
<view class="address flex-between"> <view class="address flex-between">
<text>{{ partTimeJobData.address }}</text> <text>{{ partTimeJobData.location }}</text>
<!-- <view @click="showNavigation = true"> <!-- <view @click="showNavigation = true">
<image src="@/static/image/icon/navigation.png" mode="" /> <image src="@/static/image/icon/navigation.png" mode="" />
导航 导航
...@@ -40,19 +40,19 @@ ...@@ -40,19 +40,19 @@
</view> </view>
</view> </view>
<!-- 选择地图 --> <!-- 选择地图 -->
<wd-action-sheet <!-- <wd-action-sheet
v-model="showNavigation" v-model="showNavigation"
:actions="navigationActions" :actions="navigationActions"
@close="showNavigation = false" @close="showNavigation = false"
@select="navigationSelect" @select="navigationSelect"
/> /> -->
<!-- 公司介绍 --> <!-- 公司介绍 -->
<view class="pos-introduce pos-padding-top0" v-if="partTimeJobData.companyIntro"> <view class="pos-introduce pos-padding-top0" v-if="partTimeJobData.introduction">
<view class="title"> <view class="title">
<text class="text">公司介绍</text> <text class="text">公司介绍</text>
</view> </view>
<view class="pos-duty activeClass"> <view class="pos-duty activeClass">
<text>{{ partTimeJobData.companyIntro }}</text> <text>{{ partTimeJobData.introduction }}</text>
</view> </view>
</view> </view>
<!-- 公司基本信息 --> <!-- 公司基本信息 -->
...@@ -72,41 +72,41 @@ ...@@ -72,41 +72,41 @@
<text class="pos-label">注册资本:</text> <text class="pos-label">注册资本:</text>
<text class="pos-label-text">{{ partTimeJobData.registeredCapital }}</text> <text class="pos-label-text">{{ partTimeJobData.registeredCapital }}</text>
</view> </view>
<view class="pos-int" v-if="partTimeJobData.companyType"> <view class="pos-int" v-if="partTimeJobData.industry">
<text class="pos-label">行业类型:</text> <text class="pos-label">行业类型:</text>
<text class="pos-label-text">{{ partTimeJobData.industryCategory }}</text> <text class="pos-label-text">{{ partTimeJobData.industry }}</text>
</view> </view>
</view> </view>
<!-- 职位推荐 --> <!-- 职位推荐 -->
<view <view
class="pos-recommend" class="pos-recommend"
:style="`top:${activeRecommend ? top : recommendTop}px`" :style="`top:${activeRecommend ? top : recommendTop}px`"
v-if="partTimeJobData.jobList?.length" v-if="partTimeJobData.positionList?.length"
@touchstart="onTouchStart" @touchstart="onTouchStart"
@touchmove="onTouchMove" @touchmove="onTouchMove"
@touchend="onTouchEnd" @touchend="onTouchEnd"
> >
<view class="title"> <view class="title">
<text class="text" <text class="text"
>公司在招职位<text class="num">{{ partTimeJobData.jobList.length }}</text></text >公司在招职位<text class="num">{{ partTimeJobData.positionList.length }}</text></text
> >
</view> </view>
<scroll-view scroll-x="{{true}}" class="pos-select"> <!-- <scroll-view scroll-x="{{true}}" class="pos-select">
<view class="flex-align-center"> <view class="flex-align-center">
<text :class="activeJobListType === '' ? 'active' : ''" @tap="filterOpstionList('')">全部</text> <text :class="activeJobListType === '' ? 'active' : ''" @tap="filterOpstionList('')">全部</text>
<text <text
:class="activeJobListType === item ? 'active' : ''" :class="activeJobListType === item ? 'active' : ''"
v-for="(item, index) in partTimeJobData.jobTypeTextList" v-for="(item) in partTimeJobData.jobTypeTextList"
:key="item" :key="item"
@tap="filterOpstionList(item)" @tap="filterOpstionList(item)"
>{{ item }}</text >{{ item }}</text
> >
</view> </view>
</scroll-view> </scroll-view> -->
<!-- 职位列表 --> <!-- 职位列表 -->
<scroll-view scroll-y="{{true}}" class="recommend-list-wrap"> <scroll-view scroll-y="{{true}}" class="recommend-list-wrap">
<block v-for="(item, index) in partTimeJobData.jobList" :key="index"> <block v-for="(item, index) in partTimeJobData.positionList" :key="index">
<view class="card-wrap" v-if="item.isShow"> <view class="card-wrap">
<PostionCard1 :data="item"></PostionCard1> <PostionCard1 :data="item"></PostionCard1>
</view> </view>
</block> </block>
...@@ -125,7 +125,8 @@ onLoad(({ id }) => { ...@@ -125,7 +125,8 @@ onLoad(({ id }) => {
console.log(id); console.log(id);
getCompanyDetailApi(id).then(res => { getCompanyDetailApi(id).then(res => {
console.log(res); console.log(res);
partTimeJobData.value = res.data; partTimeJobData.value = res.data.companyInfo;
partTimeJobData.value.positionList = res.data.positionList;
partTimeJobData.value.jobList.forEach(v => { partTimeJobData.value.jobList.forEach(v => {
v.isShow = true; v.isShow = true;
}); });
...@@ -951,8 +952,8 @@ const navigationSelect = ({ item }) => { ...@@ -951,8 +952,8 @@ const navigationSelect = ({ item }) => {
} }
} }
.recommend-list-wrap { .recommend-list-wrap {
flex-grow: 1; // flex-grow: 1;
height: 1000rpx; height: 780rpx;
.card-wrap { .card-wrap {
padding: 32rpx; padding: 32rpx;
border-bottom: 1px solid #f3f4f8; border-bottom: 1px solid #f3f4f8;
......
...@@ -36,10 +36,15 @@ import { reactive, ref } from "vue"; ...@@ -36,10 +36,15 @@ import { reactive, ref } from "vue";
import { getNeedListApi, needRegisterApi } from "@/api/postion"; import { getNeedListApi, needRegisterApi } from "@/api/postion";
const list = reactive([]); const list = reactive([]);
let page = 1; let page = 1;
const getData = () => {
onLoad(({category}) => {
getData(category);
})
const getData = (category) => {
getNeedListApi({ getNeedListApi({
pageSize: 10, pageSize: 10,
pageNo: page++ pageNo: page++,
category
}).then(res => { }).then(res => {
if (res.code == 200) { if (res.code == 200) {
// console.log(list); // console.log(list);
...@@ -79,7 +84,6 @@ const submit = () => { ...@@ -79,7 +84,6 @@ const submit = () => {
show.value = false; show.value = false;
}); });
}; };
getData();
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<NavBar :showIcon="false" backgroundBox="#ffffff"> <NavBar :showIcon="false" backgroundBox="#ffffff">
<view class="search-form"> <view class="search-form">
<wd-icon class="search-icon" name="search"></wd-icon> <wd-icon class="search-icon" name="search"></wd-icon>
<input placeholder="请输入要查询的内容" placeholder-class="log-input-p" type="text" @confirm="confirm" /> <input v-model="keyword" placeholder="请输入要查询的内容" placeholder-class="log-input-p" type="text" @confirm="confirm" />
</view> </view>
</NavBar> </NavBar>
<!-- 轮播区 --> <!-- 轮播区 -->
...@@ -63,14 +63,20 @@ ...@@ -63,14 +63,20 @@
</view> </view>
<view class="region-pop-right"> <view class="region-pop-right">
<scroll-view scroll-y style="height: 652rpx"> <scroll-view scroll-y style="height: 652rpx">
<view <view
class="region-list" class="region-list"
:class="{ 'region-list-color': regionId == v.code }" :class="{ 'region-list-color': regionId == -1 }"
v-for="(v) in regionData" @tap="bindRegionList(-1)"
:key="v.code" >全部</view
@tap="bindRegionList(v.code, v.name)" >
>{{ v.name }}</view <view
> class="region-list"
:class="{ 'region-list-color': regionId == v.code }"
v-for="(v) in regionData"
:key="v.code"
@tap="bindRegionList(v.code)"
>{{ v.name }}</view
>
</scroll-view> </scroll-view>
</view> </view>
</view> </view>
...@@ -94,13 +100,13 @@ ...@@ -94,13 +100,13 @@
<view class="right"> <view class="right">
<view class="title">{{active===0?'薪酬要求':selectionTitle}}</view> <view class="title">{{active===0?'薪酬要求':selectionTitle}}</view>
<view v-if="active===0" class="list"> <view v-if="active===0" class="list">
<view class="item" :class="{'light-two':activeTwo===index}" v-for="(item,index) in salary" :key="index" @tap="choiceDetails(index)">{{item.text}}</view> <view class="item" :class="{'light-two':activeTwo===index}" v-for="(item,index) in salary" :key="index" @tap="choiceDetails(item,index)">{{item.text}}</view>
</view> </view>
<view v-if="active!==0 && active!==4" class="list"> <view v-if="active!==0 && active!==4" class="list">
<view class="item" :class="{'light-two':activeTwo===index}" v-for="(item,index) in dataList" :key="item.code" @tap="choiceDetails(index)">{{item.text}}</view> <view class="item" :class="{'light-two':activeTwo===index}" v-for="(item,index) in dataList" :key="item.code" @tap="choiceDetails(item,index)">{{item.text}}</view>
</view> </view>
<view v-if="active===4" class="list"> <view v-if="active===4" class="list">
<view class="item" :class="{'light-two':activeTwo===index}" v-for="(item,index) in dataList" :key="item.id" @tap="choiceDetails(index)">{{item.name}}</view> <view class="item" :class="{'light-two':activeTwo===index}" v-for="(item,index) in dataList" :key="item.id" @tap="choiceDetails(item,index)">{{item.name}}</view>
</view> </view>
</view> </view>
</view> </view>
...@@ -163,7 +169,7 @@ let showDoubt = ref(false); ...@@ -163,7 +169,7 @@ let showDoubt = ref(false);
let showInvalid = ref(false); let showInvalid = ref(false);
let active = ref(0); let active = ref(0);
let activeTwo = ref(-1); let activeTwo = ref(-1);
let salary = ref([{text:'不限'},{text:'3k以下',min:0,max:3000},{text:'3-5k',min:3000,max:5000},{text:'5-10k',min:5000,max:10000},{text:'10-20k',min:10000,max:20000},{text:'20-50k',min:20000,max:50000},{text:'50k以上',min:50000,max:100000}]) let salary = ref([{text:'不限',min:null,max:null},{text:'3k以下',min:0,max:3000},{text:'3-5k',min:3000,max:5000},{text:'5-10k',min:5000,max:10000},{text:'10-20k',min:10000,max:20000},{text:'20-50k',min:20000,max:50000},{text:'50k以上',min:50000,max:100000}])
onShow(() => { onShow(() => {
getLoginUserApi().then(res => { getLoginUserApi().then(res => {
...@@ -292,23 +298,32 @@ const bindCityList = (code, name) => { ...@@ -292,23 +298,32 @@ const bindCityList = (code, name) => {
cityCode = code; cityCode = code;
}; };
// 选择区 // 选择区
const bindRegionList = (code, name) => { const bindRegionList = (code) => {
let _regionNav; regionId.value = code;
if (name == "全部") { maskType.value = null
for (let i = 0; i < cityData.length; i++) { if (code === -1) {
if (cityId.value == cityData[i].code) { districtCode = null;
_regionNav = cityData[i].name; }else{
} districtCode = code;
}
} else {
pageNo = 1;
regionNav = name;
regionId.value = code;
districtCode = code;
pageNo = 1;
positionListData.value = [];
getListData();
} }
pageNo = 1;
positionListData.value = [];
getListData();
// let _regionNav;
// if (name == "全部") {
// for (let i = 0; i < cityData.length; i++) {
// if (cityId.value == cityData[i].code) {
// _regionNav = cityData[i].name;
// }
// }
// } else {
// pageNo = 1;
// regionNav = name;
// regionId.value = code;
// districtCode = code;
// getListData();
// }
// console.log(code);
}; };
// 职业类型筛选 // 职业类型筛选
const positionType = ref([]); const positionType = ref([]);
...@@ -362,17 +377,16 @@ const bindScreenEducationList = (text, code) => { ...@@ -362,17 +377,16 @@ const bindScreenEducationList = (text, code) => {
getListData(); getListData();
}; };
/* 获取职位列表 */ /* 获取职位列表 */
const keyword = ref("");
let pageNo = 1, let pageNo = 1,
pageSize = 10, pageSize = 10,
isPartTimeJob = null,
cityCode = null,
districtCode = null, districtCode = null,
jobTypeList = [], minSalary = null,
genderType = null, maxSalary = null,
jobIdentityType = null, educationRequirement = null,
orderBy = null, accommodation = null,
keyword = null, identityRequirement = null,
identityRequirementList = []; jobTypePid = null
let positionListData = ref([]); let positionListData = ref([]);
let selectionTitle = ref(""); let selectionTitle = ref("");
...@@ -398,8 +412,33 @@ const choice = (index) => { ...@@ -398,8 +412,33 @@ const choice = (index) => {
dataList.value = positionType.value dataList.value = positionType.value
} }
} }
const choiceDetails = (index) => { const choiceDetails = (data, index) => {
activeTwo.value = index*1 activeTwo.value = index*1
pageNo = 1;
positionListData.value = [];
switch (active.value) {
case 0:
minSalary = data.min;
maxSalary = data.max;
getListData();
break;
case 1:
educationRequirement = data.code;
getListData();
break;
case 2:
accommodation = data.code;
getListData();
break;
case 3:
identityRequirement = data.code;
getListData();
break;
default:
jobTypePid = data.id;
getListData();
}
console.log(data)
} }
// 重置 // 重置
...@@ -407,15 +446,15 @@ const reset = () => { ...@@ -407,15 +446,15 @@ const reset = () => {
return new Promise(resolve => { return new Promise(resolve => {
pageNo = 1; pageNo = 1;
pageSize = 10; pageSize = 10;
isPartTimeJob = null; keyword.value = "";
cityCode = null;
districtCode = null; districtCode = null;
jobTypeList = []; minSalary = null;
genderType = null; maxSalary = null;
jobIdentityType = null; educationRequirement = null;
orderBy = null; accommodation = null;
identityRequirement = null;
jobTypePid = null
positionListData.value = []; positionListData.value = [];
identityRequirementList = [];
resolve(); resolve();
}); });
}; };
...@@ -423,7 +462,7 @@ const reset = () => { ...@@ -423,7 +462,7 @@ const reset = () => {
// 职位搜索 // 职位搜索
const confirm = e => { const confirm = e => {
reset().then(res => { reset().then(res => {
keyword = e.detail.value; keyword.value = e.detail.value;
getListData(); getListData();
}); });
}; };
...@@ -432,16 +471,14 @@ const getListData = () => { ...@@ -432,16 +471,14 @@ const getListData = () => {
let data = { let data = {
pageNo: pageNo, pageNo: pageNo,
pageSize: pageSize, pageSize: pageSize,
isPartTimeJob: isPartTimeJob, keyword: keyword.value || null,
provinceCode: "520000",
cityCode: cityCode || null,
districtCode: districtCode || null, districtCode: districtCode || null,
jobTypeList: jobTypeList || [], minSalary: minSalary || null,
genderType: genderType || null, maxSalary: maxSalary || null,
jobIdentityType: jobIdentityType || null, educationRequirement: educationRequirement || null,
orderBy: orderBy || 1, accommodation: accommodation || null,
keyword: keyword || null, identityRequirement: identityRequirement || null,
identityRequirementList: identityRequirementList || [] jobTypePid: jobTypePid || null
}; };
getjobListApi(data).then(res => { getjobListApi(data).then(res => {
if (res.code == 200) { if (res.code == 200) {
...@@ -1043,7 +1080,7 @@ const getListData = () => { ...@@ -1043,7 +1080,7 @@ const getListData = () => {
.screen-pop-box { .screen-pop-box {
position: relative; position: relative;
width: 100%; width: 100%;
max-height: 900rpx; // max-height: 900rpx;
} }
.screen-pop-content { .screen-pop-content {
position: absolute; position: absolute;
...@@ -1058,7 +1095,7 @@ const getListData = () => { ...@@ -1058,7 +1095,7 @@ const getListData = () => {
display: flex; display: flex;
.left{ .left{
width: 200rpx; width: 200rpx;
max-height:900rpx; // max-height:900rpx;
background: #E8F2FF; background: #E8F2FF;
.item{ .item{
font-size: 32rpx; font-size: 32rpx;
......
<template> <template>
<NavBar :showIcon="true" backgroundBox="#ffffff" :showTitle="true" title="需求登记"></NavBar> <NavBar :showIcon="true" backgroundBox="#ffffff" :showTitle="true" title="需求登记"></NavBar>
<img @tap="navigateTo('/pages/postionList/demandRegistration/index')" src="@/static/image/postion/modular-one.png" class="img"/> <img @tap="navigateTo(`/pages/postionList/demandRegistration/index?category=${1}`)" src="@/static/image/postion/modular-one.png" class="img"/>
<img @tap="navigateTo('/pages/postionList/demandRegistration/index')" src="@/static/image/postion/modular-two.png" class="img"/> <img @tap="navigateTo(`/pages/postionList/demandRegistration/index?category=${2}`)" src="@/static/image/postion/modular-two.png" class="img"/>
<img @tap="navigateTo('/pages/postionList/demandRegistration/index')" src="@/static/image/postion/modular-three.png" class="img"/> <img @tap="navigateTo(`/pages/postionList/demandRegistration/index?category=${3}`)" src="@/static/image/postion/modular-three.png" class="img"/>
<img @tap="navigateTo('/pages/postionList/demandRegistration/index')" src="@/static/image/postion/modular-four.png" class="img"/> <img @tap="navigateTo(`/pages/postionList/demandRegistration/index?category=${4}`)" src="@/static/image/postion/modular-four.png" class="img"/>
</template> </template>
<script setup> <script setup>
......
...@@ -3,12 +3,12 @@ ...@@ -3,12 +3,12 @@
<NavBar :showIcon="true" :showTitle="true" title="职位详情" backgroundBox="#ffffff"></NavBar> <NavBar :showIcon="true" :showTitle="true" title="职位详情" backgroundBox="#ffffff"></NavBar>
<!--pages/position-details/position-details.wxml--> <!--pages/position-details/position-details.wxml-->
<view class="steps-wrap"> <view class="steps-wrap">
<steps v-if="partTimeJobData.jobApplication" :data="partTimeJobData.jobApplication"></steps> <steps v-if="partTimeJobData.application" :data="partTimeJobData.jobApplication"></steps>
</view> </view>
<!-- 职位详情 --> <!-- 职位详情 -->
<view class="pos-details"> <view class="pos-details">
<view class="pos-title"> <view class="pos-title">
<text class="text">{{ partTimeJobData.jobName }}</text> <text class="text">{{ partTimeJobData.name }}</text>
</view> </view>
<view class="salary-wrap"> <view class="salary-wrap">
<view v-if="partTimeJobData"> <view v-if="partTimeJobData">
...@@ -36,23 +36,22 @@ ...@@ -36,23 +36,22 @@
<view class="experience-and-education flex-align-center"> <view class="experience-and-education flex-align-center">
<view class="flex-align-center"> <view class="flex-align-center">
<img src="@/static/image/postion/experience.png" alt="" /> <img src="@/static/image/postion/experience.png" alt="" />
<text>1-3年</text> <text>{{partTimeJobData.minAgeRequirement}}-{{partTimeJobData.maxAgeRequirement }}</text>
</view> </view>
<view class="flex-align-center"> <view class="flex-align-center">
<img src="@/static/image/postion/education.png" alt="" /> <img src="@/static/image/postion/education.png" alt="" />
<text>学历不限</text> <text>{{ partTimeJobData.educationRequirement}}</text>
</view> </view>
</view> </view>
<view class="pos-type flex-between"> <view class="pos-type flex-between">
<view class="flex-align-center position"> <view class="flex-align-center position">
<img src="@/static/image/postion/position.png" alt="" /> <img src="@/static/image/postion/position.png" alt="" />
<text>{{ partTimeJobData.cityName }}·{{ partTimeJobData.districtName }}</text> <text>{{ partTimeJobData.cityName }}</text>
</view> </view>
<view class="type"> <view class="type">
<text v-if="partTimeJobData.isPartTimeJob == 1">兼职</text> <text>{{partTimeJobData.workMode}}</text>
<text v-else>全职</text>
<text class="margin-8">|</text> <text class="margin-8">|</text>
<text>{{ partTimeJobData.jobTypeText }}</text> <text>{{ partTimeJobData.jobTypeName }}</text>
</view> </view>
</view> </view>
<view class="cos-welfare" v-if="partTimeJobData.welfareTags"> <view class="cos-welfare" v-if="partTimeJobData.welfareTags">
...@@ -66,9 +65,9 @@ ...@@ -66,9 +65,9 @@
<text class="gradient-title">职位详情</text> <text class="gradient-title">职位详情</text>
</view> </view>
<view class="pos-int"> <view class="pos-int">
<text class="pos-label" v-for="(item, index) in partTimeJobData.benefitsList" :key="index">{{ item }}</text> <text class="pos-label" v-for="(item, index) in partTimeJobData.benefits" :key="index">{{ item }}</text>
</view> </view>
<view class="pos-duty" :class="{ activeClass: dutyFlag }">{{ partTimeJobData.jobDesc }}</view> <view class="pos-duty" :class="{ activeClass: dutyFlag }">{{ partTimeJobData.positionDesc }}</view>
<view class="duty-more" @tap="moreClick" v-if="partTimeJobData.jobDesc?.length > 150 && dutyFlag === false"> <view class="duty-more" @tap="moreClick" v-if="partTimeJobData.jobDesc?.length > 150 && dutyFlag === false">
<text>查看全部</text> <text>查看全部</text>
</view> </view>
...@@ -77,8 +76,8 @@ ...@@ -77,8 +76,8 @@
<view class="cos-info margin-top24"> <view class="cos-info margin-top24">
<view <view
class="flex-align-center" class="flex-align-center"
@click="navigateTo(`/pages/postionList/companyDetails/index?id=${partTimeJobData.company.id}`)" @click="navigateTo(`/pages/postionList/companyDetails/index?id=${partTimeJobData.companyInfo.id}`)"
data-id="{{partTimeJobData.company.id}}" data-id="{{partTimeJobData.companyInfo.id}}"
bindtap="bindNavCompany" bindtap="bindNavCompany"
> >
<view class="cosimage"> <view class="cosimage">
...@@ -86,8 +85,8 @@ ...@@ -86,8 +85,8 @@
</view> </view>
<view> <view>
<view class="cos-title"> <view class="cos-title">
<text class="cos-name" v-if="partTimeJobData.company?.name != undefined">{{ <text class="cos-name" v-if="partTimeJobData.companyInfo?.name != undefined">{{
partTimeJobData.company?.name partTimeJobData.companyInfo?.name
}}</text> }}</text>
<!-- <image <!-- <image
wx:if="{{partTimeJobData.permRecommendType}}" wx:if="{{partTimeJobData.permRecommendType}}"
...@@ -100,18 +99,18 @@ ...@@ -100,18 +99,18 @@
</view> </view>
<view class="cos-position"> <view class="cos-position">
<text <text
>{{ partTimeJobData.company.cityName || "" }} <text class="margin-8"></text> | >{{ partTimeJobData.companyInfo.location.split('-')[1] || "" }} <text class="margin-8"></text> |
<text class="margin-8"></text>{{ partTimeJobData.company.pubJobNum || 0 }}个在招职位</text <text class="margin-8"></text>{{ partTimeJobData.companyInfo.jobVacancies || 0 }}个在招职位</text
> >
</view> </view>
<!-- <img class="modu-icon" src="@/static/image/temp/test.jpg" /> --> <!-- <img class="modu-icon" src="@/static/image/temp/test.jpg" /> -->
<view class="arrow modu-icon"></view> <view class="arrow modu-icon"></view>
</view> </view>
</view> </view>
<view class="map"> <!-- <view class="map">
<map id="mapId" class="map" :latitude="mapCenter.latitude" :longitude="mapCenter.longitude" :markers="markers"> <map id="mapId" class="map" :latitude="mapCenter.latitude" :longitude="mapCenter.longitude" :markers="markers">
</map> </map>
</view> </view> -->
</view> </view>
<!-- 职位推荐 --> <!-- 职位推荐 -->
...@@ -162,8 +161,8 @@ ...@@ -162,8 +161,8 @@
</view> </view>
</view> </view>
<!-- 聊工作/投简历Btn --> <!-- 聊工作/投简历Btn -->
<view class="btn" v-if="!partTimeJobData.jobApplication"> <view class="btn" v-if="!partTimeJobData.application">
<view class="btn-list back-color" v-if="!partTimeJobData.isRegister" @tap="bindDelivery">投简历</view> <view class="btn-list back-color" @tap="bindDelivery">投简历</view>
</view> </view>
<!-- 提示 --> <!-- 提示 -->
<view class="warn-wrap"> <view class="warn-wrap">
...@@ -184,6 +183,7 @@ ...@@ -184,6 +183,7 @@
import steps from "@/components/steps/index.vue"; import steps from "@/components/steps/index.vue";
import { ref, reactive } from "vue"; import { ref, reactive } from "vue";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { getEnumText} from "@/utils/utils";
import { getJobDetailApi, submitResumeApi } from "@/api/postion"; import { getJobDetailApi, submitResumeApi } from "@/api/postion";
const partTimeJobData = ref({}); const partTimeJobData = ref({});
const recommendList = ref([]); const recommendList = ref([]);
...@@ -214,9 +214,14 @@ const markers = reactive([ ...@@ -214,9 +214,14 @@ const markers = reactive([
} }
]); ]);
const getJobDetail = id => { const getJobDetail = id => {
getJobDetailApi(id).then(({ data }) => { getJobDetailApi(id).then(async ({ data }) => {
data.id = id; data.id = id;
partTimeJobData.value = data; partTimeJobData.value = data.position;
partTimeJobData.value.companyInfo = data.companyInfo;
partTimeJobData.value.application = data.application;
partTimeJobData.value.educationRequirement = await getEnumText("EnumEducationRequirement", data.position.educationRequirement);
partTimeJobData.value.workMode = await getEnumText("EnumWorkMode", data.position.workMode);
partTimeJobData.value.benefits = partTimeJobData.value.benefits.split(',')
// 设置地图点 // 设置地图点
markers[0].latitude = data.locationLatitude; markers[0].latitude = data.locationLatitude;
markers[0].longitude = data.locationLongitude; markers[0].longitude = data.locationLongitude;
...@@ -233,7 +238,7 @@ const bindDelivery = () => { ...@@ -233,7 +238,7 @@ const bindDelivery = () => {
title: "投递成功", title: "投递成功",
icon: "none" icon: "none"
}); });
partTimeJobData.value.jobApplication = res.data; partTimeJobData.value.application = res.data;
} }
}); });
}; };
......
...@@ -3,54 +3,54 @@ ...@@ -3,54 +3,54 @@
<NavBar :showIcon="true" :showTitle="true" title="投递反馈" backgroundBox="#ffffff"></NavBar> <NavBar :showIcon="true" :showTitle="true" title="投递反馈" backgroundBox="#ffffff"></NavBar>
<!-- <view v-if="v.status == 2" class="state success"> 待面试 </view> <!-- <view v-if="v.status == 2" class="state success"> 待面试 </view>
<view v-if="v.status == 4" class="state warning"> 已拒绝 </view> --> <view v-if="v.status == 4" class="state warning"> 已拒绝 </view> -->
<view class="card" v-if="postionData.jobApplication?.status == 4"> <view class="card" v-if="postionData.application?.status == 4">
<view class="t1">不合适</view> <view class="t1">不合适</view>
<view class="t2">抱歉!经公司慎重考虑,很遗憾你不适合该职位感谢你的投递!</view> <view class="t2">抱歉!经公司慎重考虑,很遗憾你不适合该职位感谢你的投递!</view>
<view class="shadow"></view> <view class="shadow"></view>
</view> </view>
<view class="card success" v-if="postionData.jobApplication?.status == 2"> <view class="card success" v-if="postionData.application?.status == 2">
<view class="t1">面试邀约</view> <view class="t1">面试邀约</view>
<view class="t2">你好,陈春瑞!通过对你的简历了解,希望能和你面谈,特此发送面试邀约</view> <view class="t2">你好,{{postionData.application.userName}}!通过对你的简历了解,希望能和你面谈,特此发送面试邀约</view>
<view class="shadow"></view> <view class="shadow"></view>
</view> </view>
<template v-if="postionData.jobApplication?.status == 2"> <template v-if="postionData.application?.status == 2">
<div class="interview-info"> <div class="interview-info">
<div> <div>
<p class="label">面试时间</p> <p class="label">面试时间</p>
<p>{{ dayjs(postionData.jobApplication.interviewTime).format("YYYY-MM-DD HH:mm") }}</p> <p>{{ dayjs(postionData.application.interviewTime).format("YYYY-MM-DD HH:mm") }}</p>
</div> </div>
<div> <div>
<p class="label">面试地点</p> <p class="label">面试地点</p>
<p>{{ postionData.jobApplication.address }}</p> <p>{{ postionData.application.interviewLocation}}</p>
</div> </div>
<div> <div>
<p class="label">联系电话</p> <p class="label">联系电话</p>
<p>{{ postionData.jobApplication.contactPerson }}</p> <p>{{ postionData.application.contactPerson }}</p>
</div> </div>
<div> <div>
<p class="label">联系人</p> <p class="label">联系人</p>
<p>{{ postionData.jobApplication.contactPhone }}</p> <p>{{ postionData.application.contactPhone }}</p>
</div> </div>
</div> </div>
</template> </template>
<template v-else> <template v-else>
<view class="pos-card"> <view class="pos-card">
<view class="pos-name flex-between"> <view class="pos-name flex-between">
<text class="name">{{ postionData.jobName }}</text> <text class="name">{{ postionData.position.name }}</text>
<view>{{ postionData.minSalary / 1000 }}k-{{ postionData.maxSalary / 1000 }}k/<text>/月</text></view> <view>{{ postionData.position.minSalary / 1000 }}k-{{ postionData.position.maxSalary / 1000 }}k/<text>/月</text></view>
</view> </view>
<view class="com-name">{{ postionData.companyName }}</view> <view class="com-name">{{ postionData.position.companyName }}</view>
<view class="tags"> <view class="tags">
<text class="item" v-for="v in postionData.benefits?.split(',') || []" :key="v">{{ v }}</text> <text class="item" v-for="v in postionData.position.benefits?.split(',') || []" :key="v">{{ v }}</text>
</view> </view>
</view> </view>
<view class="pos-detail"> <view class="pos-detail">
{{ postionData.jobDesc }} {{ postionData.position.positionDesc }}
</view> </view>
</template> </template>
<view class="steps-wrap"> <view class="steps-wrap">
<steps :data="postionData.jobApplication"></steps> <steps :data="postionData.application"></steps>
</view> </view>
</div> </div>
</template> </template>
......
...@@ -109,14 +109,14 @@ const educationLevelText = ref(""); ...@@ -109,14 +109,14 @@ const educationLevelText = ref("");
/* 获取用户信息 */ /* 获取用户信息 */
const getUserInfo = () => { const getUserInfo = () => {
getLoginUserApi().then(async res => { getLoginUserApi().then(async res => {
const { avatarPath: _avatarPath, realName: _realName, educationLevel } = res.data; const { avatarPath: _avatarPath, name: _realName, education } = res.data;
realName.value = _realName; realName.value = _realName;
avatarPath.value = _avatarPath; avatarPath.value = _avatarPath;
/* this.setData({ /* this.setData({
avatarPath, avatarPath,
realName, realName,
}); */ }); */
educationLevelText.value = await getEnumText("EnumEducation", educationLevel); educationLevelText.value = await getEnumText("EnumEducation", education);
}); });
getUserResumeApi().then(res => { getUserResumeApi().then(res => {
const { educationExperience } = res.data; const { educationExperience } = res.data;
......
<template> <template>
<view style="height: 100%; padding-bottom: 40px"> <view style="height: 100%; padding-bottom: 40px">
<NavBar :showIcon="true" :showTitle="true" title="系统匹配岗位" backgroundBox="#FFFFFF"></NavBar> <NavBar :showIcon="true" :showTitle="true" title="系统匹配岗位" backgroundBox="#FFFFFF"></NavBar>
<!-- 筛选导航 -->
<view class="select-nav2" :style="{ top: contentHeight }" catchtouchmove="{{true}}">
<view class="select-item">
<text :class="{ active: maskType == 'address' }" @tap="openMask('address')">贵州省</text>
<text :class="{ active: maskType == 'other' }" @tap="openMask('other')">更多筛选</text>
</view>
</view>
<!-- 蒙版弹框 -->
<view :style="{ top: contentHeight }" @touchmove.stop.prevent class="pop-mask" v-if="maskType" @click="maskType = null">
<!-- <NavBar :showIcon="false" backgroundBox="#ffffff" :showTitle="true" title="筛选" /> -->
<view class="select-nav" :style="{ top: '0px' }" catchtouchmove="{{true}}" @tap.stop>
<view class="select-item">
<text :class="{ active: maskType == 'address' }" @tap="openMask('address')">贵州省</text>
<text :class="{ active: maskType == 'other' }" @tap="openMask('other')">更多筛选</text>
</view>
</view>
<!-- 区域弹窗 -->
<view
@click.stop=""
catchtap="preventD"
class="screen-pop address screen-pop-padding {{regionPop? 'screen-pop-tion':''}} "
v-if="maskType === 'address'"
>
<view class="region-pop-content">
<view class="region-pop-left">
<scroll-view scroll-y style="height: 652rpx">
<view
class="region-list"
:class="{ 'region-list-color': cityId == item.code }"
v-for="(item) in cityData"
:key="item.code"
@tap="bindCityList(item.code, item.name)"
>{{ item.name }}</view
>
</scroll-view>
</view>
<view class="region-pop-right">
<scroll-view scroll-y style="height: 652rpx">
<view
class="region-list"
:class="{ 'region-list-color': regionId == v.code }"
v-for="(v) in regionData"
:key="v.code"
@tap="bindRegionList(v.code, v.name)"
>{{ v.name }}</view
>
</scroll-view>
</view>
</view>
</view>
<!-- 筛选弹窗 -->
<view
@click.stop=""
catchtap="preventD"
class="screen-pop other screen-pop-padding {{screenPop? 'screen-pop-tion':''}}"
v-if="maskType === 'other'"
>
<view class="screen-pop-box">
<view class="content-two">
<view class="left">
<view class="item" @tap="choice(0)" :class="{'light':active===0}">薪酬</view>
<view class="item" @tap="choice(1)" :class="{'light':active===1}">学历</view>
<view class="item" @tap="choice(2)" :class="{'light':active===2}">食宿条件</view>
<view class="item" @tap="choice(3)" :class="{'light':active===3}">身份</view>
<view class="item" @tap="choice(4)" :class="{'light':active===4}">职位类型</view>
</view>
<view class="right">
<view class="title">{{active===0?'薪酬要求':selectionTitle}}</view>
<view v-if="active===0" class="list">
<view class="item" :class="{'light-two':activeTwo===index}" v-for="(item,index) in salary" :key="index" @tap="choiceDetails(index)">{{item.text}}</view>
</view>
<view v-if="active!==0 && active!==4" class="list">
<view class="item" :class="{'light-two':activeTwo===index}" v-for="(item,index) in dataList" :key="item.code" @tap="choiceDetails(index)">{{item.text}}</view>
</view>
<view v-if="active===4" class="list">
<view class="item" :class="{'light-two':activeTwo===index}" v-for="(item,index) in dataList" :key="item.id" @tap="choiceDetails(index)">{{item.name}}</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 全职职位列表 --> <!-- 全职职位列表 -->
<view class="content"> <view class="content">
<view class="position-content"> <view class="position-content">
...@@ -99,300 +17,34 @@ ...@@ -99,300 +17,34 @@
</template> </template>
<script setup> <script setup>
import { ref, reactive } from "vue"; import { ref } from "vue";
import { getjobListApi } from "@/api/postion.js";
import { getTreeListApi, dictJobTypeApi, getBannerListApi } from "@/api/common.js";
import postionCard1 from "@/components/postionCard1/index.vue"; import postionCard1 from "@/components/postionCard1/index.vue";
import { getEumData } from "@/utils/utils.js"; import { getjobListApi2 } from "@/api/postion.js";
import { getToken } from "@/utils/token";
import evn from "@/utils/config.js";
import { getLoginUserApi } from "@/api/user";
/* 轮播 */
const swiperList = ref([]);
let swiperListData = [];
let contentHeight = ref(null);
let active = ref(0);
let activeTwo = ref(-1);
let salary = ref([{text:'不限'},{text:'3k以下',min:0,max:3000},{text:'3-5k',min:3000,max:5000},{text:'5-10k',min:5000,max:10000},{text:'10-20k',min:10000,max:20000},{text:'20-50k',min:20000,max:50000},{text:'50k以上',min:50000,max:100000}])
let positionListData = ref([]);
let pageNo = 1;
onShow(() => { onShow(() => {
getLoginUserApi().then(res => { reset();
uni.setStorageSync("userInfo", res.data);
});
getTreeData();
dictJobType();
reset().then(res => {
getListData();
});
initOtherData();
xma.xh.getMenuButtonBoundingClientRect({
success(res) {
contentHeight.value = (res.top + res.bottom) / 2 + 25 + "px";
}
});
}); });
const reset = () => {
pageNo = 1
positionListData.value = []
getListData()
}
onReachBottom(e => { onReachBottom(e => {
pageNo++; pageNo++;
getListData(); getListData();
}); });
// 获取数据
getBannerListApi(1).then(res => {
swiperListData = res.data;
console.log(swiperListData);
swiperList.value = res.data.map(item => evn.APP_IMAGE_BASE_API + item.imgPath);
});
const current = ref(0);
const handleClickSwiper = e => {
console.log(e);
uni.navigateTo({
url: `/pages/articleDetails/index?id=${swiperListData[e.index].articleId}`
});
};
const routerLinkList = [
{
icon: new URL("@/static/image/postion/qiuzhidengji.png", import.meta.url).href,
text: "求职登记",
url: "/pages/user/resume/index"
},
{
icon: new URL("@/static/image/postion/xuqiudengji.png", import.meta.url).href,
text: "需求登记",
url: "/pages/postionList/modular/index"
},
{
icon: new URL("@/static/image/postion/qiuzhixianjing.png", import.meta.url).href,
text: "求职陷阱",
url: "/pages/postionList/trap/index"
},
{
icon: new URL("@/static/image/postion/linggongzhuanqu.png", import.meta.url).href,
text: "零工专区",
url: "/pages/postionList/platformList/index?type=零工专区"
},
{
icon: new URL("@/static/image/postion/qitapingtai.png", import.meta.url).href,
text: "其他平台",
url: "/pages/postionList/platformList/index?type=其他平台"
}
];
const clickNav = url => {
if (url) {
uni.navigateTo({
url
});
}
};
const nothingFlag = false;
const maskType = ref("");
/* 筛选 */
const openMask = type => {
maskType.value = type;
if (type === "address") {
cityCode = "520100";
}
};
// 省市区
let regionPop = false; //区域
let regionNav = "贵州省"; //选中区域
let cityId = ref(null); //选中市id
const cityData = ref([]); //市
const regionId = ref(null); //选中区域id
const regionData = ref([]); //区
const getTreeData = () => {
getTreeListApi({
isCityNeedUnlimited: true,
isDistrictNeedUnlimited: true
}).then(res => {
if (res.code === 200) {
let _data = res.data;
for (let i = 0; i < _data.length; i++) {
if (_data[i].code == 520000) {
let _children = _data[i].children;
cityData.value = _children;
for (let j = 0; j < _children.length; j++) {
if (_children[j].code == 520100) {
cityId.value = 520100;
regionData.value = _data[i].children[j].children;
}
}
}
}
}
});
};
// 选择市
const bindCityList = (code, name) => {
for (let i = 0; i < cityData.value.length; i++) {
if (cityData.value[i].code == code) {
let _children = cityData.value[i].children;
regionData.value = _children;
cityId.value = code;
}
}
cityCode = code;
};
// 选择区
const bindRegionList = (code, name) => {
let _regionNav;
if (name == "全部") {
for (let i = 0; i < cityData.length; i++) {
if (cityId.value == cityData[i].code) {
_regionNav = cityData[i].name;
}
}
} else {
pageNo = 1;
regionNav = name;
regionId.value = code;
districtCode = code;
pageNo = 1;
positionListData.value = [];
getListData();
}
};
// 职业类型筛选
const positionType = ref([]);
const sortNav = ref("职位类型");
const sortId = ref("");
const dictJobType = () => {
dictJobTypeApi({ jobDateType: 1 }).then(({ code, data }) => {
if (code == 200) {
positionType.value = data;
}
});
};
const bindSortList = (name, id) => {
if (name == "全部") {
sortNav.value = "职位类型";
sortId.value = id;
pageNo = 1;
} else {
sortNav.value = name;
sortId.value = id;
jobTypeList = [id];
pageNo = 1;
positionListData.value = [];
getListData();
}
};
// 其他筛选
const educationData = ref([]);
const identityData = ref([]);
const eatAndLiveData = ref([]);
const screenSex = ref("");
const screenSexCode = ref("");
const screenEducation = ref("");
const screenEducationCode = ref("");
const initOtherData = async () => {
educationData.value = await getEumData("EnumEducationRequirement");
identityData.value = await getEumData("EnumIdentityRequirement");
eatAndLiveData.value = await getEumData("EnumAccommodation");
};
// const bindScreenSexList = (text, code) => {
// screenSex.value = text;
// screenSexCode.value = code;
// };
const bindScreenEducationList = (text, code) => {
screenEducation.value = text;
screenEducationCode.value = code;
identityRequirementList = [code];
pageNo = 1;
positionListData.value = [];
getListData();
};
/* 获取职位列表 */
let pageNo = 1,
pageSize = 10,
isPartTimeJob = null,
cityCode = null,
districtCode = null,
jobTypeList = [],
genderType = null,
jobIdentityType = null,
orderBy = null,
keyword = null,
identityRequirementList = [];
let positionListData = ref([]);
let selectionTitle = ref("");
let dataList = ref([]);
const choice = (index) => {
active.value = index * 1
switch (index*1) {
case 1:
selectionTitle.value = '学历要求'
dataList.value = educationData.value
break;
case 2:
selectionTitle.value = '食宿条件'
dataList.value = eatAndLiveData.value
break;
case 3:
selectionTitle.value = '身份条件'
dataList.value = identityData.value
break;
default:
selectionTitle.value = '职位类型'
console.log(positionType.value)
dataList.value = positionType.value
}
}
const choiceDetails = (index) => {
activeTwo.value = index*1
}
// 重置
const reset = () => {
return new Promise(resolve => {
pageNo = 1;
pageSize = 10;
isPartTimeJob = null;
cityCode = null;
districtCode = null;
jobTypeList = [];
genderType = null;
jobIdentityType = null;
orderBy = null;
positionListData.value = [];
identityRequirementList = [];
resolve();
});
};
// 职位搜索
const confirm = e => {
reset().then(res => {
keyword = e.detail.value;
getListData();
});
};
const getListData = () => { const getListData = () => {
let data = { let data = {
pageNo: pageNo, pageNo,
pageSize: pageSize, pageSize: 10
isPartTimeJob: isPartTimeJob,
provinceCode: "520000",
cityCode: cityCode || null,
districtCode: districtCode || null,
jobTypeList: jobTypeList || [],
genderType: genderType || null,
jobIdentityType: jobIdentityType || null,
orderBy: orderBy || 1,
keyword: keyword || null,
identityRequirementList: identityRequirementList || []
}; };
getjobListApi(data).then(res => { getjobListApi2(data).then(res => {
if (res.code == 200) { if (res.code == 200) {
positionListData.value = [...positionListData.value, ...res.data]; positionListData.value = [...positionListData.value, ...res.data];
} }
console.log(positionListData.value);
maskType.value = "";
}); });
}; };
</script> </script>
...@@ -555,7 +207,7 @@ overflow: hidden; ...@@ -555,7 +207,7 @@ overflow: hidden;
// z-index: 30; // z-index: 30;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: space-between;
height: 80rpx; height: 80rpx;
padding: 0 32rpx; padding: 0 32rpx;
background-color: #ffffff; background-color: #ffffff;
...@@ -617,7 +269,7 @@ overflow: hidden; ...@@ -617,7 +269,7 @@ overflow: hidden;
// z-index: 30; // z-index: 30;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: space-between;
height: 80rpx; height: 80rpx;
padding: 0 32rpx; padding: 0 32rpx;
background-color: #ffffff; background-color: #ffffff;
...@@ -728,6 +380,8 @@ overflow: hidden; ...@@ -728,6 +380,8 @@ overflow: hidden;
// 工作列表 // 工作列表
.content { .content {
// min-height: 100vh;
padding-bottom: 100rpx;
.position-content { .position-content {
padding: 0; padding: 0;
background: #f6f7f8; background: #f6f7f8;
...@@ -1047,7 +701,7 @@ overflow: hidden; ...@@ -1047,7 +701,7 @@ overflow: hidden;
.screen-pop-box { .screen-pop-box {
position: relative; position: relative;
width: 100%; width: 100%;
max-height: 900rpx; // max-height: 900rpx;
} }
.screen-pop-content { .screen-pop-content {
position: absolute; position: absolute;
...@@ -1062,7 +716,7 @@ overflow: hidden; ...@@ -1062,7 +716,7 @@ overflow: hidden;
display: flex; display: flex;
.left{ .left{
width: 200rpx; width: 200rpx;
max-height:900rpx; // max-height:900rpx;
background: #E8F2FF; background: #E8F2FF;
.item{ .item{
font-size: 32rpx; font-size: 32rpx;
......
<template>
<view style="height: 100%; padding-bottom: 40px">
<NavBar :showIcon="true" :showTitle="true" title="岗位" backgroundBox="#FFFFFF"></NavBar>
<!-- 全职职位列表 -->
<view class="content">
<view class="position-content">
<view class="item" v-for="(v) in positionListData" :key="v">
<postion-card1 :data="v"></postion-card1>
</view>
</view>
<!-- 暂无职位推荐-->
<view class="nothing" v-if="!positionListData.length">
<view class="nothing-text">暂无职位推荐</view>
</view>
</view>
</view>
</template>
<script setup>
import { ref } from "vue";
import postionCard1 from "@/components/postionCard1/index.vue";
import { getjobListApi3 } from "@/api/postion.js";
let positionListData = ref([]);
// let pageNo = 1;
let articleId = null
let back = false
onLoad(({ id }) => {
articleId = id
getListData(articleId);
});
onShow(() => {
if (back) {
getListData(articleId);
}
});
// const reset = () => {
// pageNo = 1
// positionListData.value = []
// getListData()
// }
// onReachBottom(e => {
// pageNo++;
// getListData();
// });
const getListData = (id) => {
// let data = {
// pageNo,
// pageSize: 10
// };
getjobListApi3(id).then(res => {
if (res.code == 200) {
positionListData.value = res.data;
back = true
}
});
};
</script>
<style lang="scss" scoped>
.one-tips{
overflow: hidden;
.box{
width: 600rpx !important;
height: 500rpx !important;
background: #FFFFFF;
display: flex;
// justify-content: center;
align-items: center;
flex-direction: column;
.img-icon{
width: 250rpx;
height: 200rpx;
margin-top: 20rpx;
}
.text{
font-size: 32rpx;
font-weight: 600;
color: #1B2026;
font-family: PingFang SC;
margin-top: 52rpx;
}
.btns{
width: 90%;
display: flex;
jsustify-content: space-between;
margin-top: 80rpx;
.btn{
width: 240rpx;
height: 72rpx;
line-height: 72rpx;
background: rgba(31, 134, 255, 0.1);
color: #1F86FF;
font-size: 28rpx;
font-weight: 500;
}
}
}
}
.two-tips{
overflow: hidden;
.box{
width: 600rpx !important;
height: 668rpx !important;
background: #FFFFFF;
display: flex;
// justify-content: center;
align-items: center;
flex-direction: column;
.img-icon{
width: 348rpx;
height: 276rpx;
margin-top: 20rpx;
}
.text{
font-size: 28rpx;
font-weight: 600;
color: #1B2026;
font-family: PingFang SC;
}
.text-small{
font-size: 28rpx;
color: #000000;
line-height: 48rpx;
}
.btns{
width: 90%;
display: flex;
jsustify-content: space-between;
margin-top: 40rpx;
.btn-one{
width: 120rpx;
height: 72rpx;
line-height: 72rpx;
background: rgba(31, 134, 255, 0.1);
color: #1F86FF;
font-size: 28rpx;
font-weight: 500;
}
.btn-two{
width: 324rpx;
height: 72rpx;
line-height: 72rpx;
background: #1F86FF;
color: #FFFFFF;
font-size: 28rpx;
font-weight: 500;
}
}
}
}
</style>
<style lang="scss" scoped>
/* page {
background: #ffffff;
} */
.search-form {
display: flex;
align-items: center;
width: 452rpx;
height: 72rpx;
margin-left: 32rpx;
overflow: hidden;
background: #f7f7f7;
border-radius: 68rpx;
.search-icon {
width: 28rpx;
height: 28rpx;
margin-left: 32rpx;
color: #86909c;
}
input {
margin-left: 16rpx;
font-size: 28rpx;
}
.log-input-p {
color: #b3b7bf;
}
}
// 轮播
.banner {
padding: 0 32rpx;
margin-top: 30rpx;
swiper-item {
overflow: hidden;
background-color: #0c81ee;
border-radius: 10rpx;
}
}
// 链接跳转
.router-link {
padding: 40rpx 60rpx;
text-align: center;
border-bottom: 16rpx solid #f3f4f8;
img {
width: 83.66rpx;
height: 80rpx;
}
view {
font-size: 24rpx;
font-weight: normal;
color: #1b2026;
}
}
// 筛选条
.select-nav {
// position: sticky;
// z-index: 30;
display: flex;
align-items: center;
justify-content: space-between;
height: 80rpx;
padding: 0 32rpx;
background-color: #ffffff;
.recommend {
position: relative;
font-size: 36rpx;
font-weight: bold;
color: #1b2026;
letter-spacing: 0;
&::after {
position: absolute;
right: -8rpx;
bottom: 4rpx;
z-index: -1;
display: block;
width: 36px;
height: 16rpx;
content: "";
background: linear-gradient(90deg, rgb(241 246 251 / 0%) 0%, #76a5ff 100%);
}
}
.select-item {
margin-right: 8rpx;
text {
position: relative;
padding: 2rpx 20rpx 2rpx 12rpx;
margin-left: 24rpx;
font-size: 24rpx;
line-height: 24rpx;
color: #1b2026;
background-color: #ffffff;
&::after {
position: absolute;
right: 12rpx;
bottom: 6rpx;
display: block;
width: 0;
height: 0;
content: "";
border: 4rpx solid #1b2026;
border-top-color: transparent;
border-left-color: transparent;
}
&.active {
color: #ffffff;
background: linear-gradient(180deg, #3570ff -3%, #29a5ff 100%);
border-radius: 8rpx;
&::after {
border: 4rpx solid #ffffff;
border-top-color: transparent;
border-left-color: transparent;
}
}
}
}
}
.select-nav2 {
position: sticky;
// z-index: 30;
display: flex;
align-items: center;
justify-content: space-between;
height: 80rpx;
padding: 0 32rpx;
background-color: #ffffff;
.recommend {
position: relative;
font-size: 36rpx;
font-weight: bold;
color: #1b2026;
letter-spacing: 0;
&::after {
position: absolute;
right: -8rpx;
bottom: 4rpx;
z-index: -1;
display: block;
width: 36px;
height: 16rpx;
content: "";
background: linear-gradient(90deg, rgb(241 246 251 / 0%) 0%, #76a5ff 100%);
}
}
.select-item {
margin-right: 8rpx;
text {
position: relative;
padding: 2rpx 20rpx 2rpx 12rpx;
margin-left: 24rpx;
font-size: 24rpx;
line-height: 24rpx;
color: #1b2026;
background-color: #ffffff;
&::after {
position: absolute;
right: 12rpx;
bottom: 6rpx;
display: block;
width: 0;
height: 0;
content: "";
border: 4rpx solid #1b2026;
border-top-color: transparent;
border-left-color: transparent;
}
&.active {
color: #ffffff;
background: linear-gradient(180deg, #3570ff -3%, #29a5ff 100%);
border-radius: 8rpx;
&::after {
border: 4rpx solid #ffffff;
border-top-color: transparent;
border-left-color: transparent;
}
}
}
}
}
// 筛选弹框
.pop-mask {
position: fixed;
inset: 0;
z-index: 100;
background-color: #00000066;
.address {
.region-pop-content {
text-align: center;
background-color: #ffffff;
.region-pop-left {
width: 375rpx;
padding: 0;
.region-list {
width: 375rpx;
padding: 0;
border: 0;
}
.region-list-color {
background-color: #f3f4f8;
}
}
.region-pop-right {
width: 375rpx;
padding: 0;
.region-list {
background-color: #f3f4f8;
border: 0;
}
}
}
}
.position,
.other {
.screen-pop-box {
background-color: #ffffff;
.screen-pop-title {
font-size: 28rpx;
font-weight: 600;
color: #1b2026;
}
.label-list-color {
font-weight: 600;
color: #1f86ff;
background-color: rgb(31 134 255 / 10%);
border-color: transparent;
}
}
}
}
// 工作列表
.content {
// min-height: 100vh;
padding-bottom: 100rpx;
.position-content {
padding: 0;
background: #f6f7f8;
.recommend-list {
position: relative;
padding: 32rpx 32rpx 0;
margin-bottom: 20rpx;
background-color: #ffffff;
border: 0;
}
.item {
padding: 32rpx;
background-color: #ffffff;
border-bottom: 16rpx solid #f3f4f8;
}
}
}
/* nav全职兼职推荐 */
.nav {
/* height: 100rpx; */
box-sizing: border-box;
width: 100%;
padding: 28rpx 40rpx;
padding-bottom: 0;
background: #ffffff;
}
.nav .nav-list {
display: inline-block;
margin-right: 40rpx;
}
.nav .nav-list .nav-list-title {
font-size: 32rpx;
font-weight: 400;
line-height: 44rpx;
color: rgb(128 128 128 / 100%);
transition: 0.3s ease all;
}
.nav .nav-list .nav-active {
font-size: 36rpx;
font-weight: 600;
color: rgb(58 58 60 / 100%);
}
.nav .nav-list .nav-list-before {
width: 60rpx;
height: 8rpx;
margin: 0 auto;
margin-top: 4rpx;
background: rgb(24 146 255 / 100%);
border-radius: 4rpx;
opacity: 0;
transition: 0.3s ease all;
}
.nav .nav-list .before-active {
opacity: 1;
}
/* 筛选导航 */
.nav-screen {
background: #ffffff;
border-bottom: 1px solid rgb(238 239 238 / 100%);
}
/* 职位筛选弹窗 */
.nav-screen .screen-pop-mask {
position: fixed;
inset: 0;
z-index: 10;
background: rgb(0 0 0 / 40%);
transition: 0.3s ease all;
}
.nav-screen .screen-pop {
position: absolute;
/* top: 326rpx; */
top: 230rpx;
left: -1000rpx;
z-index: 20;
width: 100%;
max-height: 652rpx;
padding-left: 40rpx;
overflow-y: auto;
background: #ffffff;
transition: 0.3s ease all;
}
.nav-screen .screen-pop-tion {
left: 0;
}
.nav-screen .screen-pop-list {
font-size: 28rpx;
line-height: 80rpx;
color: #3a3a3c;
background: #ffffff;
border-top: 1px solid #e9e9e9;
}
.nav-screen .screen-pop-list:nth-child(1) {
border: none;
}
/* nav */
.nav-screen-position .nav-screen-child text {
font-size: 32rpx;
font-weight: 500;
line-height: 44rpx;
color: rgb(58 58 60 / 100%);
vertical-align: middle;
}
.nav-screen-position .nav-screen-child .icon {
width: 18rpx;
height: 10rpx;
margin-left: 16rpx;
vertical-align: middle;
transition: 0.3s ease all;
}
.nav-screen-position .nav-screen-child .icon-tion {
transform: rotate(180deg);
}
.nav-screen-list {
display: flex;
/* position: absolute; */
/* top: 94rpx; */
padding: 28rpx 40rpx;
overflow: hidden;
background: #ffffff;
/* z-index: 20; */
}
.nav-screen-list .nav-screen-child {
display: flex;
flex: 1;
align-items: center;
justify-content: center;
width: 200rpx;
height: 56rpx;
color: rgb(128 128 128 / 100%);
text-align: center;
background: rgb(245 245 245 / 100%);
border: 2rpx solid rgb(0 0 0 / 0%);
border-radius: 4rpx;
}
.nav-screen-list .nav-screen-color {
color: #1892ff;
background: rgb(245 245 245 / 0%);
border: 2rpx solid #1892ff;
}
.nav-screen-list .nav-screen-child:nth-child(2) {
margin: 0 34rpx;
}
.nav-screen-list .nav-screen-child text {
overflow: hidden;
font-size: 24rpx;
font-weight: 400;
line-height: 34rpx;
text-overflow: ellipsis;
white-space: nowrap;
}
.nav-screen-list .nav-screen-child .icon {
width: 18rpx;
height: 10rpx;
margin-left: 6rpx;
vertical-align: middle;
transition: 0.3s ease all;
}
.nav-screen-list .nav-screen-child .icon-tion {
transform: rotate(180deg);
}
/* 职位列表 */
.position-content {
padding: 28rpx 32rpx;
padding-bottom: 0rpx;
background: #ffffff;
}
.position-content .recommend-list {
margin-bottom: 28rpx;
border-bottom: 2rpx solid rgb(238 239 238 / 100%);
}
.position-content .recommend-list .recommend-title {
margin-bottom: 14rpx;
overflow: hidden;
}
.recommend-list .recommend-title .sign {
width: auto;
height: 28rpx;
padding: 0 10rpx;
margin-right: 12rpx;
font-size: 20rpx;
font-weight: 400;
line-height: 25rpx;
color: rgb(250 122 96 / 100%);
text-align: center;
vertical-align: middle;
background: rgb(252 229 229 / 100%);
border-radius: 4rpx;
}
.recommend-list .recommend-title .title {
font-size: 32rpx;
font-weight: 500;
color: rgb(58 58 60 / 100%);
vertical-align: middle;
}
.recommend-list .salary-info {
margin-bottom: 28rpx;
overflow: hidden;
}
.recommend-list .salary-info .salary {
font-size: 28rpx;
font-weight: 600;
color: rgb(255 89 55 / 100%);
vertical-align: middle;
}
.recommend-list .salary-info .deliveryBtn {
float: right;
}
.recommend-list .cos-details {
display: flex;
margin-bottom: 18rpx;
}
.recommend-list .cos-details .cos-requirement {
flex: 1;
}
.recommend-list .cos-details .cos-requirement .cos-title {
margin-bottom: 20rpx;
}
.recommend-list .cos-details .cos-requirement .cos-title .cos-name {
display: inline-block;
max-width: 260rpx;
height: 32rpx;
overflow: hidden;
font-weight: 400;
text-overflow: ellipsis;
white-space: nowrap;
vertical-align: middle;
}
.recommend-list .cos-details .cos-requirement .cos-title .cos-name-width {
max-width: 500rpx;
}
.recommend-list .cos-details .cos-requirement .cos-title .cos-recommend {
display: inline-block;
height: 36rpx;
padding: 0 4rpx;
font-size: 20rpx;
font-weight: 400;
line-height: 36rpx;
color: rgb(155 1 1 / 100%);
vertical-align: middle;
background: rgb(255 233 237 / 100%);
border-radius: 4rpx;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.recommend-list .cos-details .cos-requirement .cos-title image {
display: inline-block;
width: 36rpx;
height: 36rpx;
vertical-align: middle;
background-color: rgb(255 233 237 / 100%);
border-top-left-radius: 50%;
border-bottom-left-radius: 50%;
}
.recommend-list .cos-details .cos-ask {
margin-bottom: 16rpx;
font-size: 24rpx;
font-weight: 400;
color: rgb(128 128 128 / 100%);
}
.recommend-list .cos-details .margin-none {
margin-bottom: 0;
}
.recommend-list .cos-details .cos-welfare {
width: 100%;
max-height: 50rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.recommend-list .cos-details .cos-welfare .welfare-list {
float: left;
width: auto;
height: 40rpx;
padding: 0 10rpx;
margin: 0 12rpx 10rpx 0;
font-size: 24rpx;
font-weight: 400;
line-height: 40rpx;
color: rgb(128 128 128 / 100%);
text-align: center;
border: 2rpx solid rgb(186 186 186 / 100%);
border-radius: 4rpx;
}
.recommend-list .cos-details .cos-video {
position: relative;
width: 160rpx;
height: 120rpx;
overflow: hidden;
}
.recommend-list .cos-details .recommend-video {
width: 100%;
height: 100%;
}
.cos-play-icon {
position: absolute;
top: 50%;
left: 50%;
z-index: 1;
width: 64rpx;
height: 64rpx;
transform: translate(-50%, -50%);
}
/* 筛选弹窗 */
.nav-screen .screen-pop-padding {
padding-left: 0;
}
.screen-pop-box {
position: relative;
width: 100%;
// max-height: 900rpx;
}
.screen-pop-content {
position: absolute;
inset: 0 0 0rpx;
padding: 0 40rpx;
overflow: hidden;
}
.screen-pop-padding {
padding: 0;
}
.content-two{
display: flex;
.left{
width: 200rpx;
// max-height:900rpx;
background: #E8F2FF;
.item{
font-size: 32rpx;
width: 200rpx;
text-align: center;
height: 100rpx;
line-height: 100rpx;
}
.light{
background: #ffffff;
color: #1F86FF;
}
}
.right{
width: calc(100% - 200rpx);
padding: 32rpx 24rpx;
.title{
font-size: 24rpx;
font-weight: 500;
color: #1B2026;
}
.list{
margin-top: 24rpx;
display: flex;
flex-wrap: wrap;
align-items: center;
.item{
width: 236rpx;
height: 60rpx;
line-height: 60rpx;
text-align: center;
border-radius: 8rpx;
background: #F0F4FA;
border: 1rpx solid #F0F4FA;
font-size: 24rpx;
color: #1B2026;
margin-right: 11rpx;
margin-bottom: 16rpx;
}
.light-two{
background: #ffffff;
border: 1rpx solid #1F86FF;
color: #1F86FF;
}
}
}
}
::-webkit-scrollbar {
width: 0;
height: 0;
color: rgb(0 0 0 / 0%);
}
.screen-pop-content .screen-pop-title {
margin-top: 28rpx;
margin-bottom: 16rpx;
font-size: 28rpx;
font-weight: 400;
line-height: 40rpx;
color: rgb(58 58 60 / 100%);
}
.screen-pop-content .screen-pop-title text {
color: #1892ff;
}
.screen-pop-content .pop-title-label {
overflow: hidden;
}
.screen-pop-content .pop-padding {
padding: 0 12rpx;
}
.screen-pop-content .label-list {
float: left;
padding: 12rpx 32rpx;
margin: 12rpx 0;
margin-right: 20rpx;
font-size: 28rpx;
font-weight: 400;
color: rgb(128 128 128 / 100%);
border: 1px solid rgb(186 186 186 / 100%);
border-radius: 8rpx;
}
.screen-pop-content .label-list-color {
color: #1892ff;
border-color: #1892ff;
}
.pop-bottom {
position: absolute;
right: 0;
bottom: 0;
left: 0;
padding: 28rpx 32rpx;
overflow: hidden;
background: #ffffff;
border-top: 1px solid rgb(238 239 238 / 100%);
}
.pop-bottom .pop-btn {
float: right;
width: 132rpx;
height: 64rpx;
margin-left: 28rpx;
font-size: 28rpx;
font-weight: 400;
line-height: 64rpx;
color: rgb(58 58 60 / 100%);
text-align: center;
border: 1px solid rgb(186 186 186 / 100%);
border-radius: 8rpx;
}
.pop-bottom .pop-btn:nth-child(2) {
color: #ffffff;
background: rgb(24 146 255 / 100%);
border-color: rgb(24 146 255 / 100%);
}
/* 区域弹窗 */
.region-pop-content {
position: relative;
width: 100%;
height: 652rpx;
}
.region-pop-content .region-pop-left {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 40%;
overflow: hidden;
background: #ffffff;
}
.region-pop-content .region-pop-right {
position: absolute;
top: 0;
right: 0;
bottom: 0;
box-sizing: border-box;
width: 60%;
padding-left: 32rpx;
overflow: hidden;
background: #f7f7f7;
}
.region-pop-content .region-list {
font-size: 28rpx;
line-height: 80rpx;
color: #3a3a3c;
background: #f7f7f7;
border-top: 1px solid #e9e9e9;
}
.region-pop-content .region-pop-left .region-list {
padding-left: 32rpx;
background: #ffffff;
}
.screen-pop .region-list-color {
color: #1892ff;
}
.region-pop-content .region-list:nth-child(1) {
border: none;
}
.range-slider-block {
position: relative;
width: 50rpx;
height: 50rpx;
text-align: center;
background-color: white;
border-radius: 50%;
box-shadow: 0 0 5px #888888;
}
.range-slider-block .range-slider-icon {
position: absolute;
top: 50%;
left: 50%;
display: inline-block;
width: 16rpx;
height: 16rpx;
line-height: 50rpx;
background: #1892ff;
border-radius: 50%;
transform: translate(-50%, -50%);
}
.range-slider-value {
width: 54rpx;
font-size: 24rpx;
font-weight: 400;
line-height: 34rpx;
color: rgb(128 128 128 / 100%);
}
/* 暂无职位推荐 */
.nothing {
/* position: absolute; */
/* top: 60%; */
width: 100%;
margin-top: 150rpx;
/* z-index: 3; */
/* transform: translateY(-50%); */
background: #ffffff;
}
.nothing .nothing-back {
display: block;
width: 406rpx;
height: 256rpx;
margin: 0 auto;
margin-bottom: 28rpx;
/* margin-top: 428rpx; */
}
.nothing .nothing-text {
margin-bottom: 80rpx;
font-size: 28rpx;
font-weight: 400;
line-height: 40rpx;
color: rgb(128 128 128 / 100%);
text-align: center;
}
.nothing .nothing-btn {
box-sizing: border-box;
display: flex;
width: 220rpx;
height: 68rpx;
margin: 0 auto;
border: 1px solid rgb(24 146 255 / 100%);
border-radius: 8rpx;
}
.nothing .nothing-btn image {
width: 40rpx;
height: 40rpx;
margin: 14rpx 10rpx 14rpx 26rpx;
}
.nothing .nothing-btn text {
display: inline-block;
flex: 1;
font-size: 28rpx;
font-weight: 400;
line-height: 68rpx;
color: rgb(24 146 255 / 100%);
vertical-align: middle;
}
.margin-8 {
margin: 0 8rpx;
}
</style>
...@@ -3,19 +3,22 @@ ...@@ -3,19 +3,22 @@
<div class="page"> <div class="page">
<view class="item" v-for="v in list" :key="v.id" @click="jumpToDetail(v)"> <view class="item" v-for="v in list" :key="v.id" @click="jumpToDetail(v)">
<view class="name-salary flex-between"> <view class="name-salary flex-between">
<text class="name">{{ v.jobName }}</text> <text class="name">{{ v.positionName }}</text>
<!-- <text class="salary">6k-12k<text>/月</text></text> --> <!-- <text class="salary">6k-12k<text>/月</text></text> -->
<text class="salary">{{ v.salary }}</text> <text class="salary">{{ v.salary }}</text>
</view> </view>
<view class="com-name">{{ v.companyName }}</view> <view class="bottom-row">
<view class="flex-align-center tags"> <view class="com-name">{{ v.companyName }}</view>
<text v-for="(benefit, index) in v.benefits?.split(',') || []" :key="index">{{ benefit }}</text> <!-- <view class="flex-align-center tags">
<text v-for="(benefit, index) in v.benefits?.split(',') || []" :key="index">{{ benefit }}</text>
</view> -->
<view v-if="v.status == 0" class="state success"> 已投递 </view>
<view v-if="v.status == 1" class="state success"> 已查看 </view>
<view v-if="v.status == 2" class="state success"> 待面试 </view>
<view v-if="v.status == 3" class="state success"> 已面试 </view>
<view v-if="v.status == 4" class="state warning"> 已拒绝 </view>
</view> </view>
<view v-if="v.status == 0" class="state success"> 已投递 </view>
<view v-if="v.status == 1" class="state success"> 已查看 </view>
<view v-if="v.status == 2" class="state success"> 待面试 </view>
<view v-if="v.status == 3" class="state success"> 已面试 </view>
<view v-if="v.status == 4" class="state warning"> 已拒绝 </view>
</view> </view>
</div> </div>
</template> </template>
...@@ -35,7 +38,7 @@ onLoad(e => { ...@@ -35,7 +38,7 @@ onLoad(e => {
}); });
const jumpToDetail = e => { const jumpToDetail = e => {
uni.navigateTo({ uni.navigateTo({
url: "/pages/user/deliveryFeedback/index?id=" + e.jobId url: "/pages/user/deliveryFeedback/index?id=" + e.positionId
}); });
}; };
// "code": "0", // "code": "0",
...@@ -49,11 +52,15 @@ const jumpToDetail = e => { ...@@ -49,11 +52,15 @@ const jumpToDetail = e => {
// "code": "4", // "code": "4",
// "text": "已拒绝", // "text": "已拒绝",
const getList = () => { const getList = () => {
let api = type == "我的投递" ? getApplicationListApi : getInterviewListApi; // let api = type == "我的投递" ? getApplicationListApi : getInterviewListApi;
api({ const params = {
pageNo: pageNo++, pageNo: pageNo++,
pageSize: 10 pageSize: 10,
}).then(res => { }
if (title.value === "我的面试") {
params.status = 3
}
getApplicationListApi(params).then(res => {
list.push(...res.data); list.push(...res.data);
}); });
}; };
...@@ -86,40 +93,46 @@ const getList = () => { ...@@ -86,40 +93,46 @@ const getList = () => {
} }
} }
} }
.com-name { .bottom-row{
margin-top: 8px; display: flex;
font-size: 12px; justify-content: space-between;
font-weight: normal; margin-top: 20rpx;
line-height: 18px; .com-name {
color: #77818f; margin-top: 8px;
} font-size: 12px;
.tags { font-weight: normal;
gap: 7px; line-height: 18px;
height: 30rpx; color: #77818f;
margin-top: 10px;
text {
padding: 2px 4px;
font-size: 10px;
color: #4e5969;
background: #f2f3f5;
} }
} .tags {
.state { gap: 7px;
position: absolute; height: 30rpx;
right: 16px; margin-top: 10px;
bottom: 24px; text {
padding: 8px 16px; padding: 2px 4px;
font-size: 12px; font-size: 10px;
font-weight: 600; color: #4e5969;
line-height: 14px; background: #f2f3f5;
&.warning { }
color: #f53f3f;
background: #ffece8;
} }
&.success { .state {
color: #31cbae; // position: absolute;
background: rgb(49 203 174 / 10%); // right: 16px;
// bottom: 24px;
padding: 8px 16px;
font-size: 12px;
font-weight: 600;
line-height: 14px;
&.warning {
color: #f53f3f;
background: #ffece8;
}
&.success {
color: #31cbae;
background: rgb(49 203 174 / 10%);
}
} }
} }
} }
</style> </style>
...@@ -444,8 +444,17 @@ const getData = async () => { ...@@ -444,8 +444,17 @@ const getData = async () => {
verified.value = 1; verified.value = 1;
return; return;
} }
userInfo.value = data; userInfo.value = data;
educationText.value = educationOpstion.value[data.educationLevel - 1].text; residenceCodes.value = data.residenceCodes
birthCodes.value = data.birthCodes
userInfo.value.identityTypes = data.identityTypes.split(',').map(item => item * 1);
userInfo.value.positionalTitleOne = data.positionalTitle.split('-')[0]
userInfo.value.positionalTitleTwo = data.positionalTitle.split('-')[1]
userInfo.value.professionalCertificatesOne = data.professionalCertificates.split('-')[1]
userInfo.value.professionalCertificatesTwo = data.professionalCertificates.split('-')[1]
value.value = data.residenceCodes.split(',');
value2.value = data.birthCodes.split(',');
educationText.value = educationOpstion.value[data.education - 1].text;
} }
}; };
...@@ -453,7 +462,7 @@ const getData = async () => { ...@@ -453,7 +462,7 @@ const getData = async () => {
const submit = () => { const submit = () => {
console.log(userInfo); console.log(userInfo);
const {citizenId,positionalTitleOne,positionalTitleTwo,professionalCertificatesOne,professionalCertificatesTwo,specialCertificates,major,birthAddress,residenceAddress, avatarPath, name, sex, phone, email, birthday, identityTypes, education, workAge, personalTags } = const {citizenId,positionalTitleOne,positionalTitleTwo,professionalCertificatesOne,professionalCertificatesTwo,specialCertificates,major,birthAddress,residenceAddress, avatarPath, name, sex, phone, email, birthday, identityTypes, education, workAge, personalTags } =
userInfo.value; userInfo.value;
saveUserInfoApi({ saveUserInfoApi({
residenceCodes: residenceCodes.value, residenceCodes: residenceCodes.value,
birthCodes:birthCodes.value, birthCodes:birthCodes.value,
...@@ -508,6 +517,9 @@ const submit = () => { ...@@ -508,6 +517,9 @@ const submit = () => {
font-size: 32rpx; font-size: 32rpx;
color: #000; color: #000;
} }
::v-deep .wd-col-picker__value{
font-weight: 600;
}
} }
</style> </style>
...@@ -751,7 +763,7 @@ const submit = () => { ...@@ -751,7 +763,7 @@ const submit = () => {
height: 48rpx; height: 48rpx;
} }
.placeholder-style { .placeholder-style {
font-size: 28rpx !important; font-size: 24rpx !important;
color: #a0afc3 !important; color: #a0afc3 !important;
} }
.footer-warning { .footer-warning {
......
...@@ -98,11 +98,14 @@ ...@@ -98,11 +98,14 @@
<text class="gradient-title">求职意向</text> <text class="gradient-title">求职意向</text>
<view class="arrow"></view> <view class="arrow"></view>
</view> </view>
<view class="postion">{{ resumeData.preferredPosition }}</view> <view class="postion">{{ resumeData.positionNames }}</view>
<view class="salary" <view class="salary-postion">
>{{ resumeData.minSalary }}{{ resumeData.minSalary ? "-" : "" }}{{ resumeData.maxSalary <view class="salary"
}}{{ resumeData.preferredCityName ? "| " : "" }} {{ resumeData.preferredCityName }}</view >{{ resumeData.minSalary }}{{ resumeData.minSalary ? "-" : "" }}{{ resumeData.maxSalary
> }}{{ resumeData.districtCode ? " | " : "" }} {{ resumeData.districtCode }}</view
>
<text class="text">{{ resumeData.needAccommodation === 1?'需提供住宿':'不需提供住宿' }}</text>
</view>
</view> </view>
<!-- 工作经历 --> <!-- 工作经历 -->
<view class="experience"> <view class="experience">
...@@ -256,30 +259,32 @@ const getUserResume = () => { ...@@ -256,30 +259,32 @@ const getUserResume = () => {
// console.log(res); // console.log(res);
const { const {
personalAdvantages, personalAdvantages,
preferredPosition, positionNames,
positionIds,
positionParentIds,
maxSalary, maxSalary,
minSalary, minSalary,
preferredProvinceName,
preferredProvinceCode,
preferredCityName,
preferredCityCode,
preferredDistrictName,
preferredDistrictCode,
workExperience, workExperience,
educationExperience, educationExperience,
preferredPositionId, currentStatus,
currentStatus districtCode,
provinceCode,
cityCode,
needAccommodation,
preferredCityName
} = res.data; } = res.data;
resumeData.jobStatusText = await getEnumText("EnumUserJobStatus", currentStatus); resumeData.jobStatusText = await getEnumText("EnumUserJobStatus", currentStatus);
resumeData.preferredCityName = preferredCityName; resumeData.preferredCityName = preferredCityName;
resumeData.citySelectedItems = [ resumeData.citySelectedItems = [provinceCode,cityCode,districtCode];
{ name: preferredProvinceName, code: preferredProvinceCode },
{ name: preferredCityName, code: preferredCityCode },
{ name: preferredDistrictName, code: preferredDistrictCode }
];
resumeData.personalAdvantage = personalAdvantages; // 求职状态回 resumeData.personalAdvantage = personalAdvantages; // 求职状态回
// resumeData.preferredPosition = preferredPosition.split(",").join("|"); resumeData.positionNames = positionNames;
// resumeData.preferredPositionId = preferredPositionId.split(","); resumeData.positionIds = positionIds.split(",");
resumeData.positionParentIds = positionParentIds.split(",");
resumeData.districtCodeId = districtCode;
getCityNameByCodeApi(districtCode).then(res => {
resumeData.districtCode = res.data.cityName;
})
resumeData.needAccommodation = needAccommodation
resumeData.maxSalary = maxSalary && maxSalary / 1000 + "k"; resumeData.maxSalary = maxSalary && maxSalary / 1000 + "k";
resumeData.minSalary = minSalary && minSalary / 1000 + "k"; resumeData.minSalary = minSalary && minSalary / 1000 + "k";
resumeData.workExperience = JSON.parse(workExperience || "[]"); resumeData.workExperience = JSON.parse(workExperience || "[]");
...@@ -498,6 +503,14 @@ const deleteItemTwo = index => { ...@@ -498,6 +503,14 @@ const deleteItemTwo = index => {
line-height: 36rpx; line-height: 36rpx;
color: #1b2026; color: #1b2026;
} }
.salary-postion{
display: flex;
align-items: center;
justify-content: space-between;
.text{
margin-top: 16rpx;
}
}
} }
.experience { .experience {
padding: 32rpx; padding: 32rpx;
......
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
<script setup> <script setup>
import { dictJobTypeApi, getTreeListApi } from "@/api/common"; import { dictJobTypeApi, getTreeListApi } from "@/api/common";
import { saveJobIntentionApi } from "@/api/user"; import { saveJobIntentionApi,getCityNameByCodeApi } from "@/api/user";
import { ref } from "vue"; import { ref } from "vue";
import colPicker from "@/components/wd-col-picker22/wd-col-picker.vue"; import colPicker from "@/components/wd-col-picker22/wd-col-picker.vue";
import _ from "lodash"; import _ from "lodash";
...@@ -97,16 +97,19 @@ const salaryText = ref(""); ...@@ -97,16 +97,19 @@ const salaryText = ref("");
onLoad(options => { onLoad(options => {
if (options.data) { if (options.data) {
const data = JSON.parse(decodeURIComponent(options.data)); const data = JSON.parse(decodeURIComponent(options.data));
console.log("data,", data); const preferredPositionList = data.positionNames.split("|");
const preferredPositionList = data.preferredPosition.split("|");
mValue.value = preferredPositionList.map((item, index) => { mValue.value = preferredPositionList.map((item, index) => {
return { return {
name: item, name: item,
id: data.preferredPositionId[index] id: data.positionIds[index],
parentId: data.positionParentIds[index]
}; };
}); });
accommodation.value = data.needAccommodation;
citySelectedItems = data.citySelectedItems; citySelectedItems = data.citySelectedItems;
cityText.value = citySelectedItems.map(v => v.name).join("-"); getCityNameByCodeApi(citySelectedItems[2]).then(res => {
cityText.value = res.data.provinceName+ "-" + res.data.cityName+ "-" + res.data.districtName;
})
salarySelectedItems = [{ value: data.minSalary.slice(0, -1) * 1000 }, { value: data.maxSalary.slice(0, -1) * 1000 }]; salarySelectedItems = [{ value: data.minSalary.slice(0, -1) * 1000 }, { value: data.maxSalary.slice(0, -1) * 1000 }];
salaryText.value = data.minSalary.slice(0, -1) * 1000 + "元" + "~" + data.maxSalary.slice(0, -1) * 1000 + "元"; salaryText.value = data.minSalary.slice(0, -1) * 1000 + "元" + "~" + data.maxSalary.slice(0, -1) * 1000 + "元";
console.log("salarySelectedItems", salarySelectedItems); console.log("salarySelectedItems", salarySelectedItems);
...@@ -164,7 +167,7 @@ const columnChangeCity = ({ selectedItem, resolve, finish }) => { ...@@ -164,7 +167,7 @@ const columnChangeCity = ({ selectedItem, resolve, finish }) => {
}; };
const handleConfirmCity = ({ selectedItems }) => { const handleConfirmCity = ({ selectedItems }) => {
cityText.value = selectedItems.map(v => v.name).join("-"); cityText.value = selectedItems.map(v => v.name).join("-");
citySelectedItems = selectedItems; citySelectedItems = selectedItems.map(item => item.code);
}; };
/* 薪水 */ /* 薪水 */
const salaryOpstion = ref([]); const salaryOpstion = ref([]);
...@@ -206,30 +209,17 @@ const handleConfirmSalary = ({ selectedItems }) => { ...@@ -206,30 +209,17 @@ const handleConfirmSalary = ({ selectedItems }) => {
salarySelectedItems = selectedItems; salarySelectedItems = selectedItems;
}; };
const submit = () => { const submit = () => {
let params = { let params = {};
maxSalary: 0,
minSalary: 0,
preferredCityCode: "",
preferredCityName: "",
preferredDistrictCode: "",
preferredDistrictName: "",
preferredPosition: "",
preferredProvinceCode: "",
preferredProvinceName: "",
preferredPositionId: "",
needAccommodation:""
};
const [p, c, d] = citySelectedItems; const [p, c, d] = citySelectedItems;
params.preferredPosition = mValue.value.map(v => v.name).join(","); console.log('mValue.valuemValue.value',mValue.value);
params.preferredPositionId = mValue.value.map(v => v.id).join(","); params.positionNames = mValue.value.map(v => v.name).join(",");
params.positionIds = mValue.value.map(v => v.id).join(",");
params.positionParentIds = mValue.value.map(v => v.parentId).join(",");
params.minSalary = salarySelectedItems[0].value; params.minSalary = salarySelectedItems[0].value;
params.maxSalary = salarySelectedItems[1].value; params.maxSalary = salarySelectedItems[1].value;
params.preferredProvinceCode = p.code; params.provinceCode = p;
params.preferredProvinceName = p.name; params.cityCode = c;
params.preferredCityCode = c.code; params.districtCode = d;
params.preferredCityName = c.name;
params.preferredDistrictCode = d.code;
params.preferredDistrictName = d.name;
params.needAccommodation = accommodation.value * 1; params.needAccommodation = accommodation.value * 1;
saveJobIntentionApi(params).then(res => { saveJobIntentionApi(params).then(res => {
console.log(res); console.log(res);
......
...@@ -22,6 +22,9 @@ instance.interceptors.request.use( ...@@ -22,6 +22,9 @@ instance.interceptors.request.use(
// }· // }·
const token = getToken(); const token = getToken();
config.headers["User-Token"] = token; config.headers["User-Token"] = token;
uni.showLoading({
title: "加载中..."
})
return config; return config;
}, },
error => { error => {
...@@ -54,6 +57,7 @@ instance.interceptors.response.use( ...@@ -54,6 +57,7 @@ instance.interceptors.response.use(
} }
}); });
} }
uni.hideLoading()
// 在这里可以对响应数据进行预处理 // 在这里可以对响应数据进行预处理
return response.data; return response.data;
}, },
......
...@@ -6942,10 +6942,10 @@ which@^2.0.1: ...@@ -6942,10 +6942,10 @@ which@^2.0.1:
dependencies: dependencies:
isexe "^2.0.0" isexe "^2.0.0"
wot-design-uni@^1.3.12: wot-design-uni@^1.3.13:
version "1.3.12" version "1.3.13"
resolved "https://registry.npmmirror.com/wot-design-uni/-/wot-design-uni-1.3.12.tgz" resolved "https://registry.npmmirror.com/wot-design-uni/-/wot-design-uni-1.3.13.tgz"
integrity sha512-aF4ReRTqLLQ7/JcQQvBZJBivoprX9xrvI0b+xWakis5xDSF7tfz1ndPSCBgPtPdTzIaEG5RAT18x0ueRSUbixQ== integrity sha512-3LHW480eivYAIDsxQr8KxMHCpeoj45XXpbmslLEvSWdPaRBvkXukaMW8z7wjejrMozxPBkQZT52bktCLBT/kOA==
wrap-ansi@^7.0.0: wrap-ansi@^7.0.0:
version "7.0.0" version "7.0.0"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment