bug修复

parent 0cea30ae
import instance from "@/utils/request"; import instance from "@/utils/request";
// 获取消息分页 // 获取消息分页
export const getMessagePageList = params => instance.post("/message/getPageList", params); export const getMessagePageList = params => instance.post("/message/consumer/getPageList", params);
...@@ -8,7 +8,7 @@ export const submitResumeApi = id => instance.post(`/job/application/${id}`); ...@@ -8,7 +8,7 @@ export const submitResumeApi = id => instance.post(`/job/application/${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(`/company/detail/${id}`); export const getCompanyDetailApi = id => instance.post(`/job/company/detail/${id}`);
// 需求信息分页 // 需求信息分页
export const getNeedListApi = data => instance.post("/need/getPageList", data); export const getNeedListApi = data => instance.post("/need/getPageList", data);
......
...@@ -7,7 +7,10 @@ ...@@ -7,7 +7,10 @@
class="item flex-between" class="item flex-between"
:class="[v.infoType == 1 ? 'layout1' : 'layout2']" :class="[v.infoType == 1 ? 'layout1' : 'layout2']"
> >
<img :src="evn.APP_IMAGE_BASE_API + v.thumbnailPath" v-if="v.infoType == 2" /> <view v-if="v.infoType == 2" class="view-box">
<img :src="evn.APP_IMAGE_BASE_API + v.thumbnailPath" />
<wd-icon name="play-circle" size="36px" class="icon"></wd-icon>
</view>
<view> <view>
<view class="title">{{ v.title }}</view> <view class="title">{{ v.title }}</view>
<view class="flex-align-center"> <view class="flex-align-center">
...@@ -81,10 +84,22 @@ const props = defineProps({ ...@@ -81,10 +84,22 @@ const props = defineProps({
.layout2 { .layout2 {
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: flex-start;
img { .view-box {
position: relative;
width: 100%; width: 100%;
height: 294rpx; img {
margin: 0; width: 100%;
height: 294rpx;
margin: 0;
}
.icon {
position: absolute;
top: 50%;
left: 50%;
margin: auto;
color: #ffffff;
transform: translateX(-50%) translateY(-50%);
}
} }
.title { .title {
margin-top: 32rpx; margin-top: 32rpx;
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,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">贵阳-观山湖区</text> <text class="address">{{ data.cityName + "-" + data.districtName }}</text>
</view> </view>
</view> </view>
</template> </template>
......
...@@ -42,7 +42,10 @@ ...@@ -42,7 +42,10 @@
@close="handlePickerClose" @close="handlePickerClose"
> >
<view class="flex-align-center tags"> <view class="flex-align-center tags">
<div v-for="(item, index) in mValue" :key="index" type="primary">{{ item.name }}</div> <div v-for="(item, index) in mValue" :key="index" type="primary">
{{ item.name }}
<wd-icon name="close" size="22rpx" style="color: gray" @tap="deleteItem(index)"></wd-icon>
</div>
</view> </view>
<view class="wd-col-picker__selected"> <view class="wd-col-picker__selected">
<scroll-view :scroll-x="true" scroll-with-animation :scroll-left="scrollLeft"> <scroll-view :scroll-x="true" scroll-with-animation :scroll-left="scrollLeft">
...@@ -117,7 +120,7 @@ const $item = ".wd-col-picker__selected-item"; ...@@ -117,7 +120,7 @@ const $item = ".wd-col-picker__selected-item";
const props = defineProps(colPickerProps); const props = defineProps(colPickerProps);
console.log(props.mMax); console.log(props.mMax);
console.log(props.mValue); console.log(props.mValue);
const emit = defineEmits(["close", "update:modelValue", "update:mValue", "confirm"]); const emit = defineEmits(["close", "update:modelValue", "update:mValue", "confirm", "delete:mValue"]);
const pickerShow = ref<boolean>(false); const pickerShow = ref<boolean>(false);
const currentCol = ref<number>(0); const currentCol = ref<number>(0);
...@@ -157,6 +160,10 @@ const showValue = computed(() => { ...@@ -157,6 +160,10 @@ const showValue = computed(() => {
} }
}); });
const deleteItem = index => {
emit("delete:mValue", index);
};
watch( watch(
() => props.modelValue, () => props.modelValue,
newValue => { newValue => {
......
...@@ -13,6 +13,13 @@ ...@@ -13,6 +13,13 @@
"navigationStyle": "custom" "navigationStyle": "custom"
} }
}, },
{
"path": "pages/webView/index",
"style": {
"navigationBarTitleText": "webWiew",
"navigationStyle": "custom"
}
},
{ {
"path": "pages/messageList/index", "path": "pages/messageList/index",
"style": { "style": {
...@@ -201,6 +208,7 @@ ...@@ -201,6 +208,7 @@
"borderStyle": "black", "borderStyle": "black",
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"position": "bottom", "position": "bottom",
"iconWidth": "52rpx",
"list": [ "list": [
{ {
"pagePath": "pages/postionList/index", "pagePath": "pages/postionList/index",
......
...@@ -14,6 +14,10 @@ ...@@ -14,6 +14,10 @@
{{ data.views }} {{ data.views }}
</div> </div>
</div> </div>
<view class="title-bottom">
<text>相关介绍</text>
<img class="title-photo" src="@/static/image/article/relevant.png" alt="" />
</view>
<div class="content" v-html="data.content"></div> <div class="content" v-html="data.content"></div>
</div> </div>
</div> </div>
...@@ -69,5 +73,21 @@ onLoad(({ id }) => { ...@@ -69,5 +73,21 @@ onLoad(({ id }) => {
} }
} }
} }
.title-bottom {
position: relative;
width: 150rpx;
margin-bottom: 16rpx;
text {
font-size: 36rpx;
font-weight: 600;
}
.title-photo {
position: absolute;
right: 0;
bottom: 0;
width: 122rpx;
height: 16rpx;
}
}
} }
</style> </style>
<template> <template>
<NavBar :showIcon="false" backgroundBox="#ffffff" :showTitle="true" title="动态"></NavBar> <view style="padding-bottom: 40px">
<div class="policy"> <NavBar :showIcon="false" backgroundBox="#ffffff" :showTitle="true" title="动态"></NavBar>
<div class="tab-name" :enable-flex="true" :scroll-x="true"> <div class="policy">
<view :class="{ item: 1, active: active == v.id }" v-for="v in typeList" :key="v.id" @click="changeType(v)">{{ <div class="tab-name" :enable-flex="true" :scroll-x="true">
v.name <view :class="{ item: 1, active: active == v.id }" v-for="v in typeList" :key="v.id" @click="changeType(v)">{{
}}</view> v.name
}}</view>
</div>
<scroll-view :scroll-y="true" class="content" @scrolltolower="getData()">
<article-list :list="list"></article-list>
</scroll-view>
</div> </div>
<scroll-view :scroll-y="true" class="content" @scrolltolower="getData()"> </view>
<article-list :list="list"></article-list>
</scroll-view>
</div>
</template> </template>
<script setup> <script setup>
......
<template> <template>
<NavBar :showIcon="false" backgroundBox="#ffffff" :showTitle="true" title="消息"></NavBar> <view style="padding-bottom: 40px">
<div class="message-list"> <NavBar :showIcon="false" backgroundBox="#ffffff" :showTitle="true" title="消息"></NavBar>
<scroll-view :scroll-y="true" @scrolltolower="getList"> <div class="message-list">
<view class="system"> <scroll-view :scroll-y="true" @scrolltolower="getList">
<view class="item flex-between" v-for="(v, i) in list" :key="i"> <view class="system">
<img src="@/static/image/user/default-avatar.png" alt="" /> <view class="item flex-between" v-for="(v, i) in list" :key="i">
<view class="content"> <img src="@/static/image/user/default-avatar.png" alt="" />
<view class="name-date flex-between"> <view class="content">
<text class="name">{{ v.title || "" }}</text> <view class="name-date flex-between">
<text class="date">2024-06-21 12:30</text> <text class="name">{{ v.title || "" }}</text>
</view> <text class="date">2024-06-21 12:30</text>
<view class="message flex-between"> </view>
<text>{{ v.content }}</text> <view class="message flex-between">
<view class="flex-align-center"> <text>{{ v.content }}</text>
<text class="link">立即前往</text> <view class="flex-align-center">
<view class="arrow"></view> <text class="link">立即前往</text>
<view class="arrow"></view>
</view>
</view> </view>
</view> </view>
</view> </view>
</view> </view>
</view> </scroll-view>
</scroll-view> </div>
</div> </view>
</template> </template>
<script setup> <script setup>
...@@ -32,11 +34,22 @@ import _ from "lodash"; ...@@ -32,11 +34,22 @@ import _ from "lodash";
const list = ref([]); const list = ref([]);
let pageNo = 1; let pageNo = 1;
onShow(() => { onShow(() => {
getList(); resetData().then(res => {
getList();
});
}); });
// 重置数据
const resetData = () => {
return new Promise(resolve => {
pageNo = 1;
list.value = [];
resolve();
});
};
const getList = () => { const getList = () => {
getMessagePageList({ getMessagePageList({
pageNo: pageNo++, pageNo: pageNo,
pageSize: 10 pageSize: 10
}).then(res => { }).then(res => {
res.data.forEach(async v => { res.data.forEach(async v => {
...@@ -46,6 +59,10 @@ const getList = () => { ...@@ -46,6 +59,10 @@ const getList = () => {
list.value = _.concat(list.value, res.data); list.value = _.concat(list.value, res.data);
}); });
}; };
onReachBottom(() => {
pageNo++;
getList();
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
<template> <template>
<NavBar :showIcon="false" backgroundBox="#ffffff" :showTitle="true" title="政策"></NavBar> <view style="padding-bottom: 40px">
<div class="policy"> <NavBar :showIcon="false" backgroundBox="#ffffff" :showTitle="true" title="政策"></NavBar>
<div class="tab-name" :enable-flex="true" :scroll-x="true"> <div class="policy">
<view :class="{ item: 1, active: active == v.id }" v-for="v in typeList" :key="v.id" @click="changeType(v)">{{ <div class="tab-name" :enable-flex="true" :scroll-x="true">
v.name <view :class="{ item: 1, active: active == v.id }" v-for="v in typeList" :key="v.id" @click="changeType(v)">{{
}}</view> v.name
}}</view>
</div>
<scroll-view :scroll-y="true" class="content" @scrolltolower="getData()">
<article-list :list="list"></article-list>
</scroll-view>
</div> </div>
<scroll-view :scroll-y="true" class="content" @scrolltolower="getData()"> </view>
<article-list :list="list"></article-list>
</scroll-view>
</div>
</template> </template>
<script setup> <script setup>
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
<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>贵州</text> <text>{{ partTimeJobData.cityName }}</text>
<text class="margin-8">|</text> <text class="margin-8">|</text>
<text>{{ partTimeJobData.jobList?.length }}个在招职位</text> <text>{{ partTimeJobData.jobList?.length }}个在招职位</text>
</view> </view>
...@@ -154,7 +154,7 @@ const onTouchEnd = e => { ...@@ -154,7 +154,7 @@ const onTouchEnd = e => {
}; };
const setRecommendTop = () => { const setRecommendTop = () => {
const { windowHeight, windowTop } = uni.getWindowInfo(); const { windowHeight, windowTop } = uni.getWindowInfo();
top.value = 60; top.value = 200;
recommendTop.value = windowHeight - 178; recommendTop.value = windowHeight - 178;
}; };
......
...@@ -7,41 +7,32 @@ ...@@ -7,41 +7,32 @@
<input placeholder="搜索职位,公司" placeholder-class="log-input-p" type="text"></input> <input placeholder="搜索职位,公司" placeholder-class="log-input-p" type="text"></input>
</view> </view>
</nav-bar> --> </nav-bar> -->
<NavBar :showIcon="false" backgroundBox="#ffffff"> <view style="padding-bottom: 40px">
<view class="search-form"> <NavBar :showIcon="false" backgroundBox="#ffffff">
<wd-icon class="search-icon" name="search"></wd-icon> <view class="search-form">
<input placeholder="请输入要查询的内容" placeholder-class="log-input-p" type="text" /> <wd-icon class="search-icon" name="search"></wd-icon>
</view> <input placeholder="请输入要查询的内容" placeholder-class="log-input-p" type="text" @confirm="confirm" />
</NavBar> </view>
<!-- 轮播区 --> </NavBar>
<!-- 轮播区 -->
<wd-swiper <wd-swiper
class="banner" class="banner"
:list="swiperList" :list="swiperList"
autoplay autoplay
v-model:current="current" v-model:current="current"
:indicator="{ type: 'dots-bar' }" :indicator="{ type: 'dots-bar' }"
@click="handleClickSwiper" @click="handleClickSwiper"
></wd-swiper> ></wd-swiper>
<!-- 零工培训 --> <!-- 零工培训 -->
<view class="router-link flex-between"> <view class="router-link flex-between">
<view v-for="(v, i) in routerLinkList" :key="i" tap="navigateTo" @click="clickNav(v.url)"> <view v-for="(v, i) in routerLinkList" :key="i" tap="navigateTo" @click="clickNav(v.url)">
<img :src="v.icon" /> <img :src="v.icon" />
<view>{{ v.text }}</view> <view>{{ v.text }}</view>
</view> </view>
</view>
<!-- 筛选导航 -->
<view class="select-nav" :style="{ top: '0px' }" catchtouchmove="{{true}}">
<view class="recommend">推荐</view>
<view class="select-item">
<text :class="{ active: maskType == 'address' }" @tap="openMask('address')">贵州省</text>
<text :class="{ active: maskType == 'position' }" @tap="openMask('position')">职位类型</text>
<text :class="{ active: maskType == 'other' }" @tap="openMask('other')">更多筛选</text>
</view> </view>
</view> <!-- 筛选导航 -->
<!-- 蒙版弹框 --> <view class="select-nav" :style="{ top: '0px' }" catchtouchmove="{{true}}">
<view @touchmove.stop.prevent class="pop-mask" v-if="maskType" @click="maskType = null">
<view class="select-nav" :style="{ top: '0px' }" catchtouchmove="{{true}}" @tap.stop>
<view class="recommend">推荐</view> <view class="recommend">推荐</view>
<view class="select-item"> <view class="select-item">
<text :class="{ active: maskType == 'address' }" @tap="openMask('address')">贵州省</text> <text :class="{ active: maskType == 'address' }" @tap="openMask('address')">贵州省</text>
...@@ -49,127 +40,125 @@ ...@@ -49,127 +40,125 @@
<text :class="{ active: maskType == 'other' }" @tap="openMask('other')">更多筛选</text> <text :class="{ active: maskType == 'other' }" @tap="openMask('other')">更多筛选</text>
</view> </view>
</view> </view>
<!-- 区域弹窗 --> <!-- 蒙版弹框 -->
<view <view :style="{ top: contentHeight }" @touchmove.stop.prevent class="pop-mask" v-if="maskType" @click="maskType = null">
@click.stop="" <!-- <NavBar :showIcon="false" backgroundBox="#ffffff" :showTitle="true" title="筛选" /> -->
catchtap="preventD" <view class="select-nav" :style="{ top: '0px' }" catchtouchmove="{{true}}" @tap.stop>
class="screen-pop address screen-pop-padding {{regionPop? 'screen-pop-tion':''}} " <view class="recommend">推荐</view>
v-if="maskType === 'address'" <view class="select-item">
> <text :class="{ active: maskType == 'address' }" @tap="openMask('address')">贵州省</text>
<view class="region-pop-content"> <text :class="{ active: maskType == 'position' }" @tap="openMask('position')">职位类型</text>
<view class="region-pop-left"> <text :class="{ active: maskType == 'other' }" @tap="openMask('other')">更多筛选</text>
<scroll-view scroll-y style="height: 652rpx">
<view
class="region-list"
:class="{ 'region-list-color': cityId == item.code }"
v-for="(item, index) in cityData"
:key="item.code"
@tap="bindCityList(item.code, item.name)"
>{{ item.name }}</view
>
</scroll-view>
</view> </view>
<view class="region-pop-right"> </view>
<scroll-view scroll-y style="height: 652rpx"> <!-- 区域弹窗 -->
<view <view
class="region-list" @click.stop=""
:class="{ 'region-list-color': regionId == v.code }" catchtap="preventD"
v-for="(v, i) in regionData" class="screen-pop address screen-pop-padding {{regionPop? 'screen-pop-tion':''}} "
:key="v.code" v-if="maskType === 'address'"
@tap="bindRegionList(v.code, v.name)" >
>{{ v.name }}</view <view class="region-pop-content">
> <view class="region-pop-left">
</scroll-view> <scroll-view scroll-y style="height: 652rpx">
<view
class="region-list"
:class="{ 'region-list-color': cityId == item.code }"
v-for="(item, index) 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, i) in regionData"
:key="v.code"
@tap="bindRegionList(v.code, v.name)"
>{{ v.name }}</view
>
</scroll-view>
</view>
</view> </view>
</view> </view>
</view> <!-- 职位类型弹窗 -->
<!-- 职位类型弹窗 --> <view
<view @click.stop=""
@click.stop="" catchtap="preventD"
catchtap="preventD" class="screen-pop position screen-pop-padding {{sortPop? 'screen-pop-tion':''}}"
class="screen-pop position screen-pop-padding {{sortPop? 'screen-pop-tion':''}}" v-if="maskType === 'position'"
v-if="maskType === 'position'" >
> <view class="screen-pop-box">
<view class="screen-pop-box"> <view class="screen-pop-content screen-pop-padding">
<view class="screen-pop-content screen-pop-padding"> <scroll-view scroll-y class="screen-pop-padding40" style="height: 652rpx">
<scroll-view scroll-y class="screen-pop-padding40" style="height: 652rpx"> <view>
<view> <view class="screen-pop-title">全部</view>
<view class="screen-pop-title">全部</view> <view class="pop-title-label">
<view class="pop-title-label"> <view
<view class="label-list"
class="label-list" :class="{ 'label-list-color': sortNav == '职位类型' }"
:class="{ 'label-list-color': sortNav == '职位类型' }" @tap="bindSortList('全部', '')"
@tap="bindSortList('全部', '')" >全部</view
>全部</view >
> </view>
</view> </view>
</view> <view v-for="(item, index) in positionType" :key="index">
<view v-for="(item, index) in positionType" :key="index"> <view class="screen-pop-title">{{ item.name }}</view>
<view class="screen-pop-title">{{ item.name }}</view> <view class="pop-title-label">
<view
v-for="(v, i) in item.children"
:class="['label-list', sortNav == v.name ? 'label-list-color' : '']"
:key="i"
@tap="bindSortList(v.name, v.id)"
>{{ v.name }}</view
>
</view>
</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="screen-pop-content screen-pop-padding" style="bottom: 130rpx">
<scroll-view scroll-y class="screen-pop-padding40" style="height: 522rpx">
<view class="screen-pop-title">身份要求</view>
<view class="pop-title-label"> <view class="pop-title-label">
<view <view
v-for="(v, i) in item.children" v-for="item in identityData"
:class="['label-list', sortNav == v.name ? 'label-list-color' : '']" :class="['label-list', screenEducation == item.text ? 'label-list-color' : '']"
:key="i" :key="item.code"
@tap="bindSortList(v.name, v.id)" @tap="bindScreenEducationList(item.text, item.code)"
>{{ v.name }}</view >{{ item.text }}</view
> >
</view> </view>
</view> </scroll-view>
</scroll-view> </view>
</view> </view>
</view> </view>
</view> </view>
<!-- 筛选弹窗 --> <!-- 全职职位列表 -->
<view <view class="content">
@click.stop="" <view class="position-content">
catchtap="preventD" <view class="item" v-for="(v, i) in positionListData" :key="v">
class="screen-pop other screen-pop-padding {{screenPop? 'screen-pop-tion':''}}" <postion-card1 :data="v"></postion-card1>
v-if="maskType === 'other'"
>
<view class="screen-pop-box">
<view class="screen-pop-content screen-pop-padding" style="bottom: 130rpx">
<scroll-view scroll-y class="screen-pop-padding40" style="height: 522rpx">
<view class="screen-pop-title">性别要求</view>
<view class="pop-title-label">
<view
v-for="item in screenSexData"
:class="['label-list', screenSex == item.text ? 'label-list-color' : '']"
:key="item.code"
@tap="bindScreenSexList(item.text, item.code)"
>{{ item.text }}</view
>
</view>
<view class="screen-pop-title">身份要求</view>
<view class="pop-title-label">
<view
v-for="item in identityData"
:class="['label-list', screenEducation == item.text ? 'label-list-color' : '']"
:key="item.code"
@tap="bindScreenEducationList(item.text, item.code)"
>{{ item.text }}</view
>
</view>
</scroll-view>
</view>
<view class="pop-bottom">
<view class="pop-btn" @tap="maskType = ''">完成</view>
<view class="pop-btn" bindtap="bindScreenReset">重置</view>
</view> </view>
</view> </view>
</view> <!-- 暂无职位推荐-->
</view> <view class="nothing" v-if="!positionListData.length">
<!-- 全职职位列表 --> <view class="nothing-text">暂无职位推荐</view>
<view class="content">
<view class="position-content">
<view class="item" v-for="(v, i) in positionListData" :key="v">
<postion-card1 :data="v"></postion-card1>
</view> </view>
</view> </view>
<!-- 暂无职位推荐-->
<view class="nothing" v-if="!positionListData.length">
<view class="nothing-text">暂无职位推荐</view>
</view>
</view> </view>
</template> </template>
...@@ -182,22 +171,39 @@ import { getEumData } from "@/utils/utils.js"; ...@@ -182,22 +171,39 @@ import { getEumData } from "@/utils/utils.js";
import evn from "@/utils/config.js"; import evn from "@/utils/config.js";
/* 轮播 */ /* 轮播 */
const swiperList = ref([]); const swiperList = ref([]);
let swiperListData = [];
let contentHeight = ref(null);
onShow(() => { onShow(() => {
getTreeData(); getTreeData();
dictJobType(); dictJobType();
getListData(); reset().then(res => {
getListData();
});
initOtherData(); initOtherData();
xma.xh.getMenuButtonBoundingClientRect({
success(res) {
contentHeight.value = (res.top + res.bottom) / 2 + 25 + "px";
}
});
});
onReachBottom(e => {
pageNo++;
getListData();
}); });
// 获取数据 // 获取数据
getBannerListApi(1).then(res => { getBannerListApi(1).then(res => {
console.log(res); swiperListData = res.data;
console.log(swiperListData);
swiperList.value = res.data.map(item => evn.APP_IMAGE_BASE_API + item.imgPath); swiperList.value = res.data.map(item => evn.APP_IMAGE_BASE_API + item.imgPath);
}); });
const current = ref(0); const current = ref(0);
const handleClickSwiper = e => { const handleClickSwiper = e => {
console.log(e); console.log(e);
uni.navigateTo({
url: `/pages/articleDetails/index?id=${swiperListData[e.index].articleId}`
});
}; };
const routerLinkList = [ const routerLinkList = [
{ {
...@@ -244,6 +250,9 @@ const openMask = type => { ...@@ -244,6 +250,9 @@ const openMask = type => {
scrollTop: 280, scrollTop: 280,
duration: 0 duration: 0
}); });
if (type === "address") {
cityCode = "520100";
}
}; };
// 省市区 // 省市区
let regionPop = false; //区域 let regionPop = false; //区域
...@@ -265,6 +274,7 @@ const getTreeData = () => { ...@@ -265,6 +274,7 @@ const getTreeData = () => {
cityData.value = _children; cityData.value = _children;
for (let j = 0; j < _children.length; j++) { for (let j = 0; j < _children.length; j++) {
if (_children[j].code == 520100) { if (_children[j].code == 520100) {
cityId.value = 520100;
regionData.value = _data[i].children[j].children; regionData.value = _data[i].children[j].children;
} }
} }
...@@ -283,6 +293,7 @@ const bindCityList = (code, name) => { ...@@ -283,6 +293,7 @@ const bindCityList = (code, name) => {
cityId.value = code; cityId.value = code;
} }
} }
cityCode = code;
}; };
// 选择区 // 选择区
const bindRegionList = (code, name) => { const bindRegionList = (code, name) => {
...@@ -297,6 +308,10 @@ const bindRegionList = (code, name) => { ...@@ -297,6 +308,10 @@ const bindRegionList = (code, name) => {
pageNo = 1; pageNo = 1;
regionNav = name; regionNav = name;
regionId.value = code; regionId.value = code;
districtCode = code;
pageNo = 1;
positionListData.value = [];
getListData();
} }
}; };
// 职业类型筛选 // 职业类型筛选
...@@ -318,7 +333,10 @@ const bindSortList = (name, id) => { ...@@ -318,7 +333,10 @@ const bindSortList = (name, id) => {
} else { } else {
sortNav.value = name; sortNav.value = name;
sortId.value = id; sortId.value = id;
jobTypeList = [id];
pageNo = 1; pageNo = 1;
positionListData.value = [];
getListData();
} }
}; };
...@@ -333,13 +351,17 @@ const initOtherData = async () => { ...@@ -333,13 +351,17 @@ const initOtherData = async () => {
screenSexData.value = await getEumData("EnumGenderRequirement"); screenSexData.value = await getEumData("EnumGenderRequirement");
identityData.value = await getEumData("EnumIdentityRequirement"); identityData.value = await getEumData("EnumIdentityRequirement");
}; };
const bindScreenSexList = (text, code) => { // const bindScreenSexList = (text, code) => {
screenSex.value = text; // screenSex.value = text;
screenSexCode.value = code; // screenSexCode.value = code;
}; // };
const bindScreenEducationList = (text, code) => { const bindScreenEducationList = (text, code) => {
screenEducation.value = text; screenEducation.value = text;
screenEducationCode.value = code; screenEducationCode.value = code;
identityRequirementList = [code];
pageNo = 1;
positionListData.value = [];
getListData();
}; };
/* 获取职位列表 */ /* 获取职位列表 */
let pageNo = 1, let pageNo = 1,
...@@ -347,28 +369,61 @@ let pageNo = 1, ...@@ -347,28 +369,61 @@ let pageNo = 1,
isPartTimeJob = null, isPartTimeJob = null,
cityCode = null, cityCode = null,
districtCode = null, districtCode = null,
jobType = null, jobTypeList = [],
genderType = null, genderType = null,
jobIdentityType = null, jobIdentityType = null,
orderBy = null; orderBy = null,
const positionListData = reactive([]); keyword = null,
identityRequirementList = [];
let positionListData = ref([]);
// 重置
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: pageNo,
pageSize: pageSize, pageSize: pageSize,
isPartTimeJob: isPartTimeJob, isPartTimeJob: isPartTimeJob,
provinceCode: "", provinceCode: "520000",
cityCode: cityCode || null, cityCode: cityCode || null,
districtCode: districtCode || null, districtCode: districtCode || null,
jobType: jobType || null, jobTypeList: jobTypeList || [],
genderType: genderType || null, genderType: genderType || null,
jobIdentityType: jobIdentityType || null, jobIdentityType: jobIdentityType || null,
orderBy: orderBy || 1 orderBy: orderBy || 1,
keyword: keyword || null,
identityRequirementList: identityRequirementList || []
}; };
getjobListApi(data).then(res => { getjobListApi(data).then(res => {
if (res.code == 200) { if (res.code == 200) {
positionListData.push(...res.data); positionListData.value = [...positionListData.value, ...res.data];
} }
console.log(positionListData.value);
maskType.value = "";
}); });
}; };
</script> </script>
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<input placeholder="请输入要查询的内容" placeholder-class="log-input-p" type="text" /> <input placeholder="请输入要查询的内容" placeholder-class="log-input-p" type="text" />
</view> </view>
<view class="list"> <view class="list">
<view class="item flex-between" v-for="v in platformList" :key="v.id"> <view class="item flex-between" v-for="v in platformList" :key="v.id" @tap="toWeb(v.link)">
<view class="com flex-align-center"> <view class="com flex-align-center">
<image :src="evn.APP_IMAGE_BASE_API + v.logo" /> <image :src="evn.APP_IMAGE_BASE_API + v.logo" />
<view class="text"> <view class="text">
...@@ -51,6 +51,11 @@ onLoad(opstion => { ...@@ -51,6 +51,11 @@ onLoad(opstion => {
}); });
getData(); getData();
}); });
const toWeb = url => {
uni.navigateTo({
url: `/pages/webView/index?url=${url}`
});
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -105,9 +105,10 @@ ...@@ -105,9 +105,10 @@
> >
</view> </view>
<view class="cos-position"> <view class="cos-position">
<text>{{ partTimeJobData.company?.placeCityName }}</text> <text
>{{ partTimeJobData.company.cityName || "" }} <text class="margin-8"></text> |
<text>{{ partTimeJobData.countRecruiting | 0 }} <text class="margin-8">|</text>个在招职位</text> <text class="margin-8"></text>{{ partTimeJobData.company.pubJobNum || 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>
......
...@@ -2,11 +2,16 @@ ...@@ -2,11 +2,16 @@
<NavBar :showIcon="true" :showTitle="true" title="教育经历" backgroundBox="#ffffff"></NavBar> <NavBar :showIcon="true" :showTitle="true" title="教育经历" backgroundBox="#ffffff"></NavBar>
<view class="item"> <view class="item">
<view class="label">学校名称</view> <view class="label">学校名称</view>
<input v-model="params.schoolName" placeholder="请输入用户名" border="{{ false }}" /> <input
v-model="params.schoolName"
placeholder-style="font-size: 24rpx;"
placeholder="请输入用户名"
border="{{ false }}"
/>
</view> </view>
<view class="item"> <view class="item">
<view class="label">专业名称</view> <view class="label">专业名称</view>
<input v-model="params.major" placeholder="请输入用户名" border="{{ false }}" /> <input v-model="params.major" placeholder-style="font-size: 24rpx;" placeholder="请输入用户名" border="{{ false }}" />
</view> </view>
<view class="item"> <view class="item">
...@@ -51,7 +56,31 @@ import { saveEducationExperienceApi } from "@/api/user"; ...@@ -51,7 +56,31 @@ import { saveEducationExperienceApi } from "@/api/user";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { reactive } from "vue"; import { reactive } from "vue";
const params = reactive({ schoolName: "", startDate: 0, endDate: 0, major: "" }); const params = reactive({ schoolName: "", startDate: 0, endDate: 0, major: "" });
let allList = [];
let modify = false;
let dataIndex = null;
onLoad(options => {
if (options.data) {
// 获取并解码 JSON 字符串
const arrayStr = decodeURIComponent(options.data);
const arrayData = JSON.parse(arrayStr);
allList = [...arrayData];
console.log("allList", allList);
if (options.index) {
modify = true;
dataIndex = options.index * 1;
const data = arrayData[options.index];
params.schoolName = data.schoolName;
params.major = data.major;
params.startDate = data.startDate;
params.endDate = data.endDate;
allList = allList.filter((item, index) => index !== options.index * 1);
console.log("allList", allList);
}
}
});
const format = date => date && dayjs(date).format("YYYY-MM-DD"); const format = date => date && dayjs(date).format("YYYY-MM-DD");
const submit = () => { const submit = () => {
let really = true; let really = true;
for (let key in params) { for (let key in params) {
...@@ -66,7 +95,12 @@ const submit = () => { ...@@ -66,7 +95,12 @@ const submit = () => {
}); });
return; return;
} }
saveEducationExperienceApi(JSON.stringify([params])).then(res => { if (modify) {
allList.splice(dataIndex, 0, params);
} else {
allList.push(params);
}
saveEducationExperienceApi(JSON.stringify(allList)).then(res => {
if (res.code === 200) { if (res.code === 200) {
uni.showToast({ uni.showToast({
title: "保存成功", title: "保存成功",
...@@ -100,7 +134,7 @@ const submit = () => { ...@@ -100,7 +134,7 @@ const submit = () => {
.inner { .inner {
height: 88rpx; height: 88rpx;
padding: 0 32rpx; padding: 0 32rpx;
font-size: 28rpx; font-size: 24rpx;
line-height: 88rpx; line-height: 88rpx;
} }
textarea { textarea {
......
<template> <template>
<div class="essential-information"> <div class="essential-information">
<NavBar :showIcon="true" :showTitle="true" title="基本信息"></NavBar> <NavBar backgroundBox="#ffffff" :showIcon="true" :showTitle="true" title="基本信息"></NavBar>
<view <view
class="real-name-authentication flex-between" class="real-name-authentication flex-between"
v-if="verified == 0" v-if="verified == 0"
@tap="navigateTo('/pages/user/resume/realNameAuthentication/index')" @tap="toIdcard"
data-url="/subPackages/resume/pages/real-name-authentication/real-name-authentication" data-url="/subPackages/resume/pages/real-name-authentication/real-name-authentication"
> >
<view class="flex-align-center"> <view class="flex-align-center">
...@@ -25,6 +25,17 @@ ...@@ -25,6 +25,17 @@
<img class="avatar" v-if="userInfo.avatarPath" :src="evn.APP_IMAGE_BASE_API + userInfo.avatarPath" /> <img class="avatar" v-if="userInfo.avatarPath" :src="evn.APP_IMAGE_BASE_API + userInfo.avatarPath" />
<img class="avatar" v-else src="@/static/image/user/default-avatar.png" /> <img class="avatar" v-else src="@/static/image/user/default-avatar.png" />
</view> </view>
<view class="my-info-list flex-column">
<view class="my-info-title label">
<text>昵称</text>
</view>
<input
class="my-info-form"
v-model="userInfo.realName"
placeholder="请输入"
placeholder-class="placeholder-style"
/>
</view>
<!-- 性别 --> <!-- 性别 -->
<view class="my-info-list pd-b-38"> <view class="my-info-list pd-b-38">
<view class="my-info-title label"> <view class="my-info-title label">
...@@ -127,6 +138,20 @@ ...@@ -127,6 +138,20 @@
<text>邮箱</text> <text>邮箱</text>
</view> </view>
<input <input
cursor-spacing="30"
class="my-info-form"
v-model="userInfo.email"
placeholder="请填写邮箱"
placeholder-class="placeholder-style"
/>
</view>
<!-- 邮箱 -->
<view class="my-info-list flex-column" style="opacity: 0">
<view class="my-info-title label">
<text>邮箱</text>
</view>
<input
cursor-spacing="30"
class="my-info-form" class="my-info-form"
v-model="userInfo.email" v-model="userInfo.email"
placeholder="请填写邮箱" placeholder="请填写邮箱"
...@@ -151,27 +176,40 @@ let verified = ref(0); ...@@ -151,27 +176,40 @@ let verified = ref(0);
const cropperFlag = 0; const cropperFlag = 0;
const identityCode = 0; const identityCode = 0;
const userInfo = ref({ const userInfo = ref({
userId: "575447396285247488", userId: "",
username: "15585110655", username: "",
avatarPath: "v2MpPublishMedia/2024-07-16/1721120465826.jpg", avatarPath: "user/default-avatar.png",
realName: "陈家驹", realName: "",
gender: 2, gender: 2,
phone: "13368604081", phone: "",
email: "15165156@qq.com", email: "",
birthDate: 1633017600000, birthDate: "",
identityType: 2, identityType: 2,
educationLevel: 6, educationLevel: 6,
workExperience: 11, workExperience: 11,
personalTags: null, personalTags: null,
verified: 1, verified: 1,
loginTime: 1721804335908, loginTime: "",
jobStatus: 1, jobStatus: 1,
completeResume: false, completeResume: false,
user: null user: null
}); });
onMounted(() => { onMounted(() => {
getData(); getEumDataFn().then(res => {
getData();
});
}); });
// 页面跳转
const toIdcard = () => {
uni.navigateTo({
url: "/pages/user/resume/realNameAuthentication/index",
success: function (res) {
// 通过eventChannel向被打开页面传送数据
res.eventChannel.emit("pageEvent", userInfo.value);
}
});
};
/* 头像 */ /* 头像 */
const bindUploadImg = () => { const bindUploadImg = () => {
uni.chooseFile({ uni.chooseFile({
...@@ -212,12 +250,18 @@ getEumData("EnumIdentityType").then(res => { ...@@ -212,12 +250,18 @@ getEumData("EnumIdentityType").then(res => {
/* 学历 */ /* 学历 */
const educationText = ref(""); const educationText = ref("");
const educationOpstion = ref([]); const educationOpstion = ref([]);
getEumData("EnumEducation").then(res => { const getEumDataFn = () => {
res.forEach(v => { return new Promise(resolve => {
v.code = v.code * 1; getEumData("EnumEducation").then(res => {
res.forEach(v => {
v.code = v.code * 1;
});
educationOpstion.value = res;
resolve();
});
}); });
educationOpstion.value = res; };
});
const changeEducationLevel = e => { const changeEducationLevel = e => {
educationText.value = e.selectedItems.text; educationText.value = e.selectedItems.text;
}; };
...@@ -231,6 +275,7 @@ const getData = async () => { ...@@ -231,6 +275,7 @@ const getData = async () => {
return; return;
} }
userInfo.value = data; userInfo.value = data;
educationText.value = educationOpstion.value[data.educationLevel - 1].text;
} }
}; };
...@@ -604,10 +649,11 @@ const submit = () => { ...@@ -604,10 +649,11 @@ const submit = () => {
} }
} }
.my-form-submit { .my-form-submit {
position: absolute; position: fixed;
bottom: 0; bottom: 0;
left: 0; left: 0;
width: 100%; width: 100%;
padding-bottom: env(safe-area-inset-bottom);
text-align: center; text-align: center;
border-top: 1rpx solid #ebebeb; border-top: 1rpx solid #ebebeb;
} }
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
</wd-picker> </wd-picker>
</view> </view>
<!-- 个人优势 --> <!-- 个人优势 -->
<view class="advantage" @click="navigateTo('/pages/user/resume/introduce/index')"> <view class="advantage" @click="navigateTo(`/pages/user/resume/introduce/index?data=${resumeData.personalAdvantage}`)">
<view class="flex-between"> <view class="flex-between">
<text class="gradient-title">个人优势</text> <text class="gradient-title">个人优势</text>
<view class="arrow" bind:tap="navigateTo"></view> <view class="arrow" bind:tap="navigateTo"></view>
...@@ -43,44 +43,100 @@ ...@@ -43,44 +43,100 @@
</view> </view>
</view> </view>
<!-- 求职意向 --> <!-- 求职意向 -->
<view class="intention" @click="navigateTo('/pages/user/resume/jobIntention/index')"> <view
class="intention"
@click="navigateTo(`/pages/user/resume/jobIntention/index?data=${encodeURIComponent(JSON.stringify(resumeData))}`)"
>
<view class="flex-between"> <view class="flex-between">
<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.preferredPosition }}</view>
<view class="salary">{{ resumeData.minSalary }}-{{ resumeData.maxSalary }}| {{ resumeData.preferredCityName }}</view> <view class="salary"
>{{ resumeData.minSalary }}{{ resumeData.minSalary ? "-" : "" }}{{ resumeData.maxSalary
}}{{ resumeData.preferredCityName ? "| " : "" }} {{ resumeData.preferredCityName }}</view
>
</view> </view>
<!-- 工作经历 --> <!-- 工作经历 -->
<view class="experience" @click="navigateTo('/pages/user/resume/workExperience/index')"> <view class="experience">
<view class="flex-between"> <view class="flex-between">
<text class="gradient-title">工作经历</text> <text class="gradient-title">工作经历</text>
<view class="arrow"></view> <wd-icon
name="add"
size="24rpx"
@click="
navigateTo(
`/pages/user/resume/workExperience/index?data=${encodeURIComponent(
JSON.stringify(resumeData.workExperience)
)}`
)
"
></wd-icon>
</view> </view>
<view class="list"> <view class="list">
<view class="item" v-for="(item, index) in resumeData.workExperience" :key="index"> <view
class="item"
v-for="(item, index) in resumeData.workExperience"
:key="index"
@tap="
navigateTo(
`/pages/user/resume/workExperience/index?data=${encodeURIComponent(
JSON.stringify(resumeData.workExperience)
)}&index=${index}`
)
"
>
<view class="name-date flex-between"> <view class="name-date flex-between">
<text class="name">·{{ item.companyName }}</text> <text class="name">·{{ item.companyName }}</text>
<text class="date">{{ item.startDate }} ~ {{ item.endDate }}</text> <text class="date">{{ item.startDate }} ~ {{ item.endDate }}</text>
</view> </view>
<view class="postion">·{{ item.position }}</view> <view class="flex-between">
<view class="content"> ·{{ item.content }} </view> <view>
<view class="postion">·{{ item.position }}</view>
<view class="content"> ·{{ item.content }} </view>
</view>
<wd-icon name="error-fill" size="36rpx" style="color: red" @tap.stop="deleteItem(index)"></wd-icon>
</view>
</view> </view>
</view> </view>
</view> </view>
<!-- 教育经历 --> <!-- 教育经历 -->
<view class="experience" @click="navigateTo('/pages/user/resume/educationExperience/index')"> <view class="experience">
<view class="flex-between"> <view class="flex-between">
<text class="gradient-title">教育经历</text> <text class="gradient-title">教育经历</text>
<view class="arrow"></view> <wd-icon
name="add"
size="24rpx"
@click="
navigateTo(
`/pages/user/resume/educationExperience/index?data=${encodeURIComponent(
JSON.stringify(resumeData.educationExperience)
)}`
)
"
></wd-icon>
</view> </view>
<view class="list"> <view class="list">
<view class="item" v-for="(item, index) in resumeData.educationExperience" :key="index"> <view
class="item"
v-for="(item, index) in resumeData.educationExperience"
:key="index"
@tap="
navigateTo(
`/pages/user/resume/educationExperience/index?data=${encodeURIComponent(
JSON.stringify(resumeData.educationExperience)
)}&index=${index}`
)
"
>
<view class="name-date flex-between"> <view class="name-date flex-between">
<text class="name">·{{ item.schoolName }}</text> <text class="name">·{{ item.schoolName }}</text>
<text class="date">{{ item.startDate }}~{{ item.endDate }}</text> <text class="date">{{ item.startDate }}~{{ item.endDate }}</text>
</view> </view>
<view class="postion">·{{ item.major }}</view> <view class="flex-between">
<view class="postion">·{{ item.major }}</view>
<wd-icon name="error-fill" size="36rpx" style="color: red" @tap.stop="deleteItemTwo(index)"></wd-icon>
</view>
<!-- <view class="content"> <!-- <view class="content">
·内容:预计,建筑工程将在今年底竣工。宿舍会在明年8月启用,让多达600名学生入住。 ·内容:预计,建筑工程将在今年底竣工。宿舍会在明年8月启用,让多达600名学生入住。
国大学生事务处处长何汉杰说,国大的宿舍都各有特色,并解释为何要兴建以体育为主题的宿舍。 国大学生事务处处长何汉杰说,国大的宿舍都各有特色,并解释为何要兴建以体育为主题的宿舍。
...@@ -94,7 +150,13 @@ ...@@ -94,7 +150,13 @@
<script setup> <script setup>
import { reactive } from "vue"; import { reactive } from "vue";
import { getUserResumeApi, getLoginUserApi, saveJobStatusApi } from "@/api/user"; import {
getUserResumeApi,
getLoginUserApi,
saveJobStatusApi,
saveWorkExperienceApi,
saveEducationExperienceApi
} from "@/api/user";
import { getEnumText, getEumData } from "@/utils/utils.js"; import { getEnumText, getEumData } from "@/utils/utils.js";
import { useToast } from "wot-design-uni"; import { useToast } from "wot-design-uni";
import { navigateTo } from "@/utils/utils.js"; import { navigateTo } from "@/utils/utils.js";
...@@ -139,14 +201,26 @@ const getUserResume = () => { ...@@ -139,14 +201,26 @@ const getUserResume = () => {
preferredPosition, preferredPosition,
maxSalary, maxSalary,
minSalary, minSalary,
preferredProvinceName,
preferredProvinceCode,
preferredCityName, preferredCityName,
preferredCityCode,
preferredDistrictName,
preferredDistrictCode,
workExperience, workExperience,
educationExperience educationExperience,
preferredPositionId
} = res.data; } = res.data;
resumeData.preferredCityName = preferredCityName; resumeData.preferredCityName = preferredCityName;
resumeData.citySelectedItems = [
{ name: preferredProvinceName, code: preferredProvinceCode },
{ name: preferredCityName, code: preferredCityCode },
{ name: preferredDistrictName, code: preferredDistrictCode }
];
resumeData.personalAdvantage = personalAdvantage; // 求职状态回 resumeData.personalAdvantage = personalAdvantage; // 求职状态回
resumeData.preferredPosition = preferredPosition.split(",").join("|"); resumeData.preferredPosition = preferredPosition.split(",").join("|");
resumeData.preferredPositionId = preferredPositionId.split(",");
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 || "[]");
...@@ -191,11 +265,59 @@ const changeJobStatus = async e => { ...@@ -191,11 +265,59 @@ const changeJobStatus = async e => {
const { code, message } = await saveJobStatusApi({ jobStatus: e.value }); const { code, message } = await saveJobStatusApi({ jobStatus: e.value });
if (code == 200) { if (code == 200) {
resumeData.jobStatusText = e.selectedItems.text; resumeData.jobStatusText = e.selectedItems.text;
toast.success("保存成功"); uni.showToast({
message: "保存成功",
icon: "none"
});
} else { } else {
toast.error(message); uni.showToast({
message: message,
icon: "none"
});
} }
}; };
const deleteItem = index => {
uni.showModal({
title: "删除",
content: "是否删除该条记录?",
success: async res => {
if (res.confirm) {
console.log("resumeData.workExperience", resumeData.workExperience);
resumeData.workExperience.splice(index, 1);
saveWorkExperienceApi(JSON.stringify(resumeData.workExperience)).then(res => {
if (res.code == 200) {
uni.showToast({
title: "删除成功",
icon: "success"
});
}
});
}
}
});
};
const deleteItemTwo = index => {
uni.showModal({
title: "删除",
content: "是否删除该条记录?",
success: async res => {
if (res.confirm) {
console.log("resumeData.workExperience", resumeData.workExperience);
resumeData.educationExperience.splice(index, 1);
saveEducationExperienceApi(JSON.stringify(resumeData.educationExperience)).then(res => {
if (res.code == 200) {
uni.showToast({
title: "删除成功",
icon: "success"
});
}
});
}
}
});
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -19,6 +19,10 @@ ...@@ -19,6 +19,10 @@
import { ref } from "vue"; import { ref } from "vue";
import { saveAdvantageApi } from "@/api/user.js"; import { saveAdvantageApi } from "@/api/user.js";
const inputvalue = ref(""); const inputvalue = ref("");
onLoad(options => {
inputvalue.value = options.data;
});
const save = () => { const save = () => {
saveAdvantageApi({ personalAdvantage: inputvalue.value }).then(res => { saveAdvantageApi({ personalAdvantage: inputvalue.value }).then(res => {
console.log(res); console.log(res);
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
:column-change="columnChange" :column-change="columnChange"
:before-confirm="beforeConfirm" :before-confirm="beforeConfirm"
@confirm="handleConfirm" @confirm="handleConfirm"
@delete:mValue="handleDelete"
use-default-slot use-default-slot
> >
<view class="form-item"> <view class="form-item">
...@@ -82,11 +83,35 @@ import _ from "lodash"; ...@@ -82,11 +83,35 @@ import _ from "lodash";
const value = ref([]); const value = ref([]);
const mValue = ref([]); const mValue = ref([]);
const columns = ref([]); const columns = ref([]);
onLoad(options => {
if (options.data) {
const data = JSON.parse(decodeURIComponent(options.data));
console.log("data,", data);
const preferredPositionList = data.preferredPosition.split("|");
mValue.value = preferredPositionList.map((item, index) => {
return {
name: item,
id: data.preferredPositionId[index]
};
});
citySelectedItems = data.citySelectedItems;
cityText.value = citySelectedItems.map(v => v.name).join("-");
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 + "元";
console.log("salarySelectedItems", salarySelectedItems);
}
});
const handleDelete = index => {
mValue.value.splice(index, 1);
};
dictJobTypeApi({}).then(res => { dictJobTypeApi({}).then(res => {
columns.value.push(res.data); columns.value.push(res.data);
console.log(columns); console.log(columns);
}); });
const columnChange = ({ selectedItem, resolve, finish }) => { const columnChange = ({ selectedItem, resolve, finish }) => {
console.log("columnChange", selectedItem);
if (selectedItem.children) { if (selectedItem.children) {
resolve(selectedItem.children); resolve(selectedItem.children);
} else { } else {
...@@ -94,17 +119,19 @@ const columnChange = ({ selectedItem, resolve, finish }) => { ...@@ -94,17 +119,19 @@ const columnChange = ({ selectedItem, resolve, finish }) => {
} }
}; };
const beforeConfirm = (value2, selectedItems, resolve) => { const beforeConfirm = (value2, selectedItems, resolve) => {
console.log("selectedItems", selectedItems);
/* 判断是否点到重复的 */ /* 判断是否点到重复的 */
const tagter = _.last(selectedItems); const tagter = _.last(selectedItems);
const index = mValue.value.indexOf(tagter); const index = mValue.value.indexOf(tagter);
if (index != -1) { if (index != -1) {
mValue.value.splice(index, 1); mValue.value.splice(index, 1);
} else { } else {
console.log("tagter", tagter);
mValue.value.push(tagter); mValue.value.push(tagter);
if (mValue.value.length >= 3) { // if (mValue.value.length >= 3) {
// _.pullAt(mValue.value, 0); // _.pullAt(mValue.value, 0);
resolve(true); resolve(true);
} // }
} }
resolve(false); resolve(false);
}; };
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<view class="input-form"> <view class="input-form">
<view class="item"> <view class="item">
<view class="label">姓名</view> <view class="label">姓名</view>
<input type="text" v-model="data.realName" placeholder="请输入姓名" /> <input type="text" :value="data.realName" placeholder="请输入姓名" />
</view> </view>
<view class="item"> <view class="item">
<view class="label">身份证号</view> <view class="label">身份证号</view>
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
</template> </template>
<script setup> <script setup>
import { ref, reactive } from "vue"; import { ref, reactive, getCurrentInstance } from "vue";
import { uploadFiles } from "@/utils/fileUpload.js"; import { uploadFiles } from "@/utils/fileUpload.js";
import evn from "@/utils/config.js"; import evn from "@/utils/config.js";
import { saveIdCardApi } from "@/api/user.js"; import { saveIdCardApi } from "@/api/user.js";
...@@ -44,6 +44,16 @@ const data = reactive({ ...@@ -44,6 +44,16 @@ const data = reactive({
}); });
const idCardFrontPathDefle = new URL("@/static/image/user/idcardFront.png", import.meta.url); const idCardFrontPathDefle = new URL("@/static/image/user/idcardFront.png", import.meta.url);
const idCardBackPathDefle = new URL("@/static/image/user/idcardBack.png", import.meta.url); const idCardBackPathDefle = new URL("@/static/image/user/idcardBack.png", import.meta.url);
onLoad(() => {
const instance = getCurrentInstance().proxy;
const eventChannel = instance.getOpenerEventChannel();
eventChannel.on("pageEvent", function (datas) {
data.realName = datas.realName;
data.citizenId = datas.citizenId;
data.idCardFrontPath = datas.idCardFrontPath;
data.idCardBackPath = datas.idCardBackPath;
});
});
const uploadeImage = type => { const uploadeImage = type => {
// 正面 // 正面
...@@ -62,8 +72,31 @@ const uploadeImage = type => { ...@@ -62,8 +72,31 @@ const uploadeImage = type => {
}); });
}; };
const submit = () => { const submit = () => {
let release = true;
for (let i in data) {
if (!data[i]) {
release = false;
}
}
if (!release) {
uni.showToast({
title: "请完善信息",
icon: "none"
});
return;
}
saveIdCardApi(data).then(res => { saveIdCardApi(data).then(res => {
console.log(res); if (res.code == 200) {
uni.showToast({
title: "提交成功",
icon: "none"
});
setTimeout(() => {
uni.navigateBack({
delta: 1
});
}, 1500);
}
}); });
}; };
</script> </script>
...@@ -115,6 +148,7 @@ const submit = () => { ...@@ -115,6 +148,7 @@ const submit = () => {
.btn-wrap { .btn-wrap {
position: fixed; position: fixed;
bottom: 0; bottom: 0;
left: 0;
box-sizing: border-box; box-sizing: border-box;
width: 100%; width: 100%;
padding: 16rpx 64rpx; padding: 16rpx 64rpx;
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
:maxDate="new Date().getTime()" :maxDate="new Date().getTime()"
type="year-month" type="year-month"
v-model="params.endDate" v-model="params.endDate"
:formatter="formatter"
/> />
</view> </view>
</view> </view>
...@@ -63,7 +64,7 @@ ...@@ -63,7 +64,7 @@
<view class="form-item"> <view class="form-item">
<view class="form-info"> <view class="form-info">
<view class="label">工作内容</view> <view class="label">工作内容</view>
<textarea v-model="params.content" placeholder="请输入" /> <textarea :maxlength="500" v-model="params.content" placeholder="请输入" />
</view> </view>
</view> </view>
</view> </view>
...@@ -90,9 +91,43 @@ const params = reactive({ ...@@ -90,9 +91,43 @@ const params = reactive({
position: "", position: "",
content: "" content: ""
}); });
let allList = [];
let modify = false;
let dataIndex = null;
const postionValue = ref([]); const postionValue = ref([]);
const postionOpstion = ref([]); const postionOpstion = ref([]);
const value = ref(Date.now());
onLoad(options => {
if (options.data) {
const arrayStr = decodeURIComponent(options.data);
const arrayData = JSON.parse(arrayStr);
allList = [...arrayData];
if (options.index) {
modify = true;
dataIndex = options.index * 1;
const data = arrayData[options.index];
console.log("data", data);
params.companyName = data.companyName;
params.startDate = data.startDate;
params.endDate = data.endDate;
jobTypeText.value = data.position;
params.content = data.content;
allList = allList.filter((item, index) => index !== options.index * 1);
console.log("allList", allList);
}
}
});
const formatter = (type, value) => {
switch (type) {
case "year":
return value + "年";
case "month":
return value + "月";
default:
return "至今";
}
};
dictJobTypeApi({}).then(res => { dictJobTypeApi({}).then(res => {
postionOpstion.value.push(res.data); postionOpstion.value.push(res.data);
}); });
...@@ -122,7 +157,12 @@ const save = () => { ...@@ -122,7 +157,12 @@ const save = () => {
}); });
return; return;
} }
saveWorkExperienceApi(JSON.stringify([params])).then(res => { if (modify) {
allList.splice(dataIndex, 0, params);
} else {
allList.push(params);
}
saveWorkExperienceApi(JSON.stringify(allList)).then(res => {
console.log(res); console.log(res);
if (res.code == 200) { if (res.code == 200) {
uni.showToast({ uni.showToast({
......
<template>
<web-view :src="url"></web-view>
</template>
<script setup>
import { ref } from "vue";
let url = ref("");
onLoad(options => {
url.value = options.url;
});
</script>
<style lang="scss" scoped></style>
src/static/image/tabBar/community.png

1.72 KB | W: | H:

src/static/image/tabBar/community.png

1.72 KB | W: | H:

src/static/image/tabBar/community.png
src/static/image/tabBar/community.png
src/static/image/tabBar/community.png
src/static/image/tabBar/community.png
  • 2-up
  • Swipe
  • Onion skin
src/static/image/tabBar/home.png

824 Bytes | W: | H:

src/static/image/tabBar/home.png

897 Bytes | W: | H:

src/static/image/tabBar/home.png
src/static/image/tabBar/home.png
src/static/image/tabBar/home.png
src/static/image/tabBar/home.png
  • 2-up
  • Swipe
  • Onion skin
src/static/image/tabBar/homeActive.png

890 Bytes | W: | H:

src/static/image/tabBar/homeActive.png

992 Bytes | W: | H:

src/static/image/tabBar/homeActive.png
src/static/image/tabBar/homeActive.png
src/static/image/tabBar/homeActive.png
src/static/image/tabBar/homeActive.png
  • 2-up
  • Swipe
  • Onion skin
src/static/image/tabBar/msg.png

668 Bytes | W: | H:

src/static/image/tabBar/msg.png

763 Bytes | W: | H:

src/static/image/tabBar/msg.png
src/static/image/tabBar/msg.png
src/static/image/tabBar/msg.png
src/static/image/tabBar/msg.png
  • 2-up
  • Swipe
  • Onion skin
src/static/image/tabBar/msgActive.png

693 Bytes | W: | H:

src/static/image/tabBar/msgActive.png

803 Bytes | W: | H:

src/static/image/tabBar/msgActive.png
src/static/image/tabBar/msgActive.png
src/static/image/tabBar/msgActive.png
src/static/image/tabBar/msgActive.png
  • 2-up
  • Swipe
  • Onion skin
src/static/image/tabBar/policy.png

1.55 KB | W: | H:

src/static/image/tabBar/policy.png

1.24 KB | W: | H:

src/static/image/tabBar/policy.png
src/static/image/tabBar/policy.png
src/static/image/tabBar/policy.png
src/static/image/tabBar/policy.png
  • 2-up
  • Swipe
  • Onion skin
src/static/image/tabBar/user.png

1.09 KB | W: | H:

src/static/image/tabBar/user.png

1.17 KB | W: | H:

src/static/image/tabBar/user.png
src/static/image/tabBar/user.png
src/static/image/tabBar/user.png
src/static/image/tabBar/user.png
  • 2-up
  • Swipe
  • Onion skin
src/static/image/tabBar/userActive.png

1.15 KB | W: | H:

src/static/image/tabBar/userActive.png

1.26 KB | W: | H:

src/static/image/tabBar/userActive.png
src/static/image/tabBar/userActive.png
src/static/image/tabBar/userActive.png
src/static/image/tabBar/userActive.png
  • 2-up
  • Swipe
  • Onion skin
import axios from "axios"; import axios from "axios";
import { getToken } from "./token"; import { getToken } from "./token";
// const baseURL = "https://lygsh-api.wjzpgz.com/"; // const baseURL = "https://lygsh-api.wjzpgz.com/";
const baseURL = "http://192.168.11.158:8080/"; const baseURL = "http://192.168.11.181:8080/";
// 创建一个 axios 实例 // 创建一个 axios 实例
const instance = axios.create({ const instance = axios.create({
baseURL, // 设置基础 URL baseURL, // 设置基础 URL
...@@ -33,6 +33,27 @@ instance.interceptors.request.use( ...@@ -33,6 +33,27 @@ instance.interceptors.request.use(
// 响应拦截器 // 响应拦截器
instance.interceptors.response.use( instance.interceptors.response.use(
response => { response => {
if (response.data.code === 4 || response.data.code === 8) {
uni.showToast({
title: response.data.message,
icon: "none"
});
}
if (response.data.code === 9) {
uni.showModal({
title: "提示",
content: "请先完善基本信息!",
success: function (res) {
if (res.confirm) {
uni.navigateTo({
url: "/pages/user/resume/essentialInformation/index"
});
} else if (res.cancel) {
console.log("用户点击取消");
}
}
});
}
// 在这里可以对响应数据进行预处理 // 在这里可以对响应数据进行预处理
return response.data; return response.data;
}, },
......
class SwipeHandler { class SwipeHandler {
constructor() { constructor() {
this.startY = 0; this.startY = 0;
this.endY = 0; this.endY = 0;
this.startTime = 0; this.startTime = 0;
this.endTime = 0; this.endTime = 0;
} }
onTouchStart(e) { onTouchStart(e) {
this.startY = e.touches[0].clientY; this.startY = e.touches[0].clientY;
this.startTime = Date.now(); this.startTime = Date.now();
} }
onTouchMove(e) { onTouchMove(e) {
// 在这里可以更新Y坐标,但通常只需要开始和结束时的坐标 // 在这里可以更新Y坐标,但通常只需要开始和结束时的坐标
} }
onTouchEnd(e) { onTouchEnd(e) {
this.endY = e.changedTouches[0].clientY; this.endY = e.changedTouches[0].clientY;
this.endTime = Date.now(); this.endTime = Date.now();
const distanceThreshold = 150; // 设置滑动距离阈值,单位:像素 const distanceThreshold = 50; // 设置滑动距离阈值,单位:像素
const timeThreshold = 200; // 设置时间阈值,单位:毫秒 const timeThreshold = 200; // 设置时间阈值,单位:毫秒
const distance = this.startY - this.endY; const distance = this.startY - this.endY;
const duration = this.endTime - this.startTime; const duration = this.endTime - this.startTime;
if (Math.abs(distance) > distanceThreshold && duration < timeThreshold) { if (Math.abs(distance) > distanceThreshold && duration < timeThreshold) {
if (distance > 0) { if (distance > 0) {
// 向上滑动 // 向上滑动
console.log('向上滑动'); console.log("向上滑动");
return 'up' return "up";
} else { } else {
// 向下滑动 // 向下滑动
console.log('向下滑动'); console.log("向下滑动");
return 'down' return "down";
}
} }
}
} }
} }
export default SwipeHandler export default SwipeHandler;
/* const swipeHandler = new SwipeHandler(); /* const swipeHandler = new SwipeHandler();
Page({ Page({
...@@ -52,4 +52,4 @@ export default SwipeHandler ...@@ -52,4 +52,4 @@ export default SwipeHandler
onTouchEnd: function(e) { onTouchEnd: function(e) {
swipeHandler.onTouchEnd(e); swipeHandler.onTouchEnd(e);
} }
}); */ }); */
\ No newline at end of file
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