1

parent 1606855d
import instance from "@/utils/request";
// 获取消息分页
export const getMessagePageList = params => instance.post("/message/getPageList", params);
export const getMessagePageList = params => instance.post("/message/business/getPageList", params);
......@@ -9,7 +9,11 @@
<image v-if="data.avatarPath" :src="evn.APP_IMAGE_BASE_API + data.avatarPath" mode="" />
<image v-else src="@/static/image/user/default-avatar.png" mode="" />
</view>
<view class="education"> {{ educationExperience.schoolName }}·{{ educationExperience.major }} </view>
<view class="education" v-if="educationExperience">
{{ educationExperience ? educationExperience.schoolName : null }}·{{
educationExperience ? educationExperience.major : null
}}
</view>
<view class="introduce">
{{ data.personalAdvantage }}
</view>
......@@ -22,20 +26,40 @@ import { defineProps, computed } from "vue";
import evn from "@/utils/config";
import { getEnumText } from "@/utils/utils";
import { useAsync } from "@/hooks/useAsync";
const { data } = defineProps({
let { data, jobId, type } = defineProps({
data: {
type: Object,
default: () => ({})
},
jobId: {
type: String,
default: () => ""
},
type: {
type: String,
default: () => "recommend"
}
});
const { data: educationLevelText } = useAsync(getEnumText("EnumEducation", data.educationLevel));
console.log("data", data);
const educationExperience = computed(() => {
return JSON.parse(data?.educationExperience)[0] || {};
if (data.educationLevel) {
return JSON.parse(data?.educationExperience)[0] || {};
} else {
return null;
}
});
const jumpResumeDetail = () => {
console.log("data", data);
if (type == "recommend") {
jobId = data.jobId;
}
uni.navigateTo({
url: `/pages/user/resume/index?jobId=${data.jobId}&userId=${data.userId}&applicationId=${data.applicationId}`
url: `/pages/user/resume/index?jobId=${jobId}&userId=${data.userId}&applicationId=${data.applicationId}&type=${type}`
});
};
</script>
......
......@@ -233,6 +233,7 @@
"borderStyle": "black",
"backgroundColor": "#FFFFFF",
"position": "bottom",
"iconWidth":"52rpx",
"list": [
{
"pagePath": "pages/recommend/index",
......
......@@ -13,8 +13,7 @@
<view class="message flex-between">
<text>{{ v.content }}</text>
<view class="flex-align-center">
<text class="link" v-if="[2, 3, 4, 7].includes(v.type)">立即前往</text>
<view class="arrow"></view>
<text class="link" v-if="[2, 3, 4, 7].includes(v.type)">立即前往></text>
</view>
</view>
</view>
......@@ -98,6 +97,7 @@ getList();
display: flex;
flex-direction: column;
height: 100%;
padding-bottom: 100rpx;
}
.tabs {
display: flex;
......
<template>
<NavBar :showIcon="true" :showTitle="true" title="投递管理" backgroundBox="#FFFFFF"></NavBar>
<div class="page">
<NavBar :showIcon="true" :showTitle="true" title="投递管理" backgroundBox="#FFFFFF"></NavBar>
<div class="filter-bar flex-between">
<p
:class="{ active: apiParams.status == item.code }"
......@@ -13,8 +13,9 @@
</div>
<scroll-view @scrolltolower="getApplicationList()" scroll-y>
<div class="item" v-for="(item, index) in list" :key="index">
<jobSeekersCard :data="item" />
<jobSeekersCard :data="item" :type="'recommend'" />
</div>
<wd-status-tip v-if="list.length == 0" image="../../../static/image/enmpty-dt.png" tip="暂无记录" />
</scroll-view>
</div>
</template>
......@@ -105,7 +106,7 @@ const getApplicationList = () => {
}
scroll-view {
flex-grow: 1;
height: 200rpx;
height: 100vh;
.item {
padding: 16rpx 32rpx;
border-bottom: 16rpx solid #f3f4f8;
......
......@@ -40,7 +40,14 @@
<view class="item" @click="showOtherFilter = true">筛选<view class="arrow"></view> </view>
</view>
</view>
<scroll-view class="recommend-list" scroll-y="{{true}}">
<scroll-view
class="recommend-list"
:refresher-triggered="refresherEnabled"
@refresherrefresh="fresherrefresh"
refresher-enabled="true"
scroll-y="true"
@scrolltolower="getResumeRecommendList"
>
<div class="other-view" v-if="showOtherFilter" @click="showOtherFilter = false">
<div class="wrapper" @click.stop>
<div class="other-view-item">
......@@ -53,8 +60,9 @@
<p
class="select-item"
:class="{ active: v.code == activeEducation }"
@click="activeEducation = v.code"
@click="changeType(v)"
v-for="v in EnumEducationRequirement"
:key="v.code"
>
{{ v.text }}
</p>
......@@ -72,9 +80,9 @@
</div>
<view class="item" v-for="v in applicationList" :key="v.applicationId">
<jobSeekersCard :data="v" />
<jobSeekersCard :data="v" :jobId="myJobId" :type="'application'" />
</view>
<wd-status-tip v-if="!applicationList.length" image="content" tip="暂无内容" />
<wd-status-tip v-if="!applicationList || !applicationList.length" image="content" tip="暂无内容" />
</scroll-view>
</view>
<view class="management" v-if="activeTab == '职位管理'">
......@@ -183,14 +191,30 @@ const changeActiveTab = tab => {
getTopFilter();
getJobList(activeTopFilter.value);
};
let refresherEnabled = ref(true);
/* 获取职位列表 */
const jobListColumns = ref([]);
const jobTypeText = ref("");
const handleConfirm = ({ selectedItems }) => {
const handleConfirm = ({ selectedItems, value }) => {
myJobId.value = selectedItems.id;
jobTypeText.value = selectedItems.jobTypeText;
getResumeRecommendList();
refresh().then(() => {
getResumeRecommendList();
});
};
const myJobId = ref("");
function changeType(v) {
activeEducation0value = v.code;
myJobId.value = v.id;
getResumeRecommendList();
}
function fresherrefresh() {
refresherEnabled.value = true;
refresh().then(() => {
getResumeRecommendList();
});
}
getJobListApi().then(res => {
if (res.code == 200) {
jobListColumns.value = res.data;
......@@ -228,12 +252,43 @@ const getApplicationListParams = ref({
maxWorkYear: "",
education: "",
minAge: "",
isEnd: false,
maxAge: "",
pageNo: 1,
pageSize: 10
});
const careerList = ref([]);
const refresh = () => {
return new Promise((resolve, reject) => {
applicationList.value = [];
getApplicationListParams.value.pageNo = 1;
getApplicationListParams.value.isEnd = false;
resolve();
});
};
const getResumeRecommendList = () => {
getResumeRecommendListApi(getApplicationListParams.value).then(res => {});
if (getApplicationListParams.value.isEnd === true)
return new Promise(resolve => {
resolve();
});
xma.showLoading({
title: "加载中...",
mask: true
});
return getResumeRecommendListApi(getApplicationListParams.value).then(res => {
xma.hideLoading();
refresherEnabled.value = false;
if (!res.data) {
res.data = [];
}
if (res.data.length < getApplicationListParams.value.pageSize) {
getApplicationListParams.value.isEnd = true;
}
getApplicationListParams.value.pageNo += 1;
applicationList.value = applicationList.value.concat(res.data);
});
};
// 城市筛选
const valueCity = ref([]);
......@@ -350,7 +405,6 @@ const getJobList = (status = "") => {
title: "加载中..."
});
getListStatisticsApi({ status }).then(res => {
console.log("resresres", res);
xma.hideLoading();
res.data.forEach(v => {
const { data: workModeText } = useAsync(getEnumText("EnumWorkMode", v.workMode));
......@@ -359,6 +413,10 @@ const getJobList = (status = "") => {
v.statusText = statusText;
});
jobList.value = [...res.data];
if (!status) {
myJobId.value = jobList.value[0].id;
}
});
};
onLoad(() => {
......
......@@ -98,7 +98,13 @@ if (pinias.formData.settlementType == 1) {
const initSalaryColumns = () => {
const temp = [];
const maxSalary = pinias.formData.settlementType === 1 ? 1000 : 50 * multiple;
if (pinias.formData.settlementType === 1) {
temp.push({
value: 10,
label: "10",
next: true
});
}
// 生成序列
for (let i = 1; i * multiple <= maxSalary; i++) {
const currentValue = i * multiple;
......@@ -268,6 +274,13 @@ initViewData();
:deep(.uni-checkbox-input) {
border-radius: 50% !important;
}
.title-box {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 32rpx;
box-sizing: border-box;
}
.welfare {
display: flex;
flex-wrap: wrap;
......
......@@ -75,29 +75,29 @@ const next = () => {
<style lang="scss" scoped>
@import "./common.scss";
image {
width: 12px;
height: 13px;
width: 24rpx;
height: 26rpx;
}
:deep(#u-a-c .uni-system-choose-location .nav) {
top: 20px !important;
top: 40rpx !important;
background-image: none;
}
:deep(#u-a-c .uni-system-choose-location .nav-btn) {
background-color: #007aff;
border-radius: 10px;
border-radius: 20rpx;
}
:deep(#u-a-c .uni-system-choose-location .nav-btn.back) {
background-color: #007aff;
border-radius: 10px;
top: 50px;
left: 10px;
border-radius: 20rpx;
top: 140rpx;
left: 20rpx;
}
:deep(#u-a-c .uni-system-choose-location .nav-btn.confirm) {
background-color: #007aff;
border-radius: 10px;
top: 50px;
right: 10px;
border-radius: 20rpx;
top: 140rpx;
right: 20rpx;
}
.foot-btn {
position: fixed;
......
......@@ -158,12 +158,12 @@ const next = () => {
/* 初始化页面数据 */
const initViewData = async () => {
if (pinias.formData.id) {
console.log(pinias.formData);
identityText.value = await getEnumText("EnumIdentityRequirement", pinias.formData.identityRequirement);
educationText.value = await getEnumText("EnumEducationRequirement", pinias.formData.educationRequirement);
if (pinias.formData.maxAgeRequirement) {
ageText.value = `${pinias.formData.minAgeRequirement}~${pinias.formData.maxAgeRequirement}`;
} else {
ageText.value = "不限";
}
}
};
......
......@@ -86,7 +86,6 @@ const submit = () => {
// 提交
createJobApi(pinias.formData).then(res => {
if (res.code == 200) {
pinias.resetForm();
setTimeout(() => {
wx.hideLoading({
complete: complete => {
......@@ -103,6 +102,8 @@ const submit = () => {
uni.switchTab({
url: "/pages/recommend/index"
});
pinias.resetForm();
}, 3000);
} else {
uni.showToast({
......
<template>
<div class="page">
<NavBar :showIcon="false" :showTitle="false" title="" backgroundBox="#FFFFFF"></NavBar>
<div class="form">
<div class="from-item" v-for="(item, index) in postItem" :key="index + Math.random()">
<div class="title">
......
......@@ -29,10 +29,16 @@
<view class="t1"> 请上传企业营业执照和法人身份证正面照片 </view>
<view class="t1"> (注:图片大小不超过10M) </view>
</view>
<view class="btn-wrap" v-if="status == 2">
<button class="bottom-btn" @tap="submit">提交</button>
</view>
<wd-tabbar
@tap="next"
v-if="status == 2"
custom-style="display: flex;justify-content: center !important;"
fixed
placeholder
safeAreaInsetBottom
>
<view class="foot-btn" @tap="submit">提交</view>
</wd-tabbar>
</div>
</template>
......@@ -135,6 +141,17 @@ const submit = () => {
margin-top: 32rpx;
}
}
.foot-btn {
position: fixed;
display: flex;
align-items: center;
justify-content: center;
width: 622rpx;
height: 80rpx;
color: #ffffff;
background: #1f86ff;
border-radius: 12rpx;
}
.appealing-content {
padding: 32rpx;
view {
......
......@@ -47,7 +47,9 @@
<view class="nav">
<view class="item flex-between" v-for="(v, i) in navList" :key="i" @click="navigateTo(v.url, v.fn)">
<view class="flex-between" style="flex: 1">
<div class="flex align-center"><img :src="v.icon" alt="" />{{ v.text }}</div>
<div style="display: flex; align-items: center">
<img :src="v.icon" alt="" /><view>{{ v.text }}</view>
</div>
<div v-if="v.subText" :class="{ orange: v.auditStatus === 0 || v.auditStatus === 2 }" class="sub-text">
{{ v.subText }}
</div>
......@@ -112,7 +114,6 @@ const navList = reactive([
// url: "/pages/user/businessLicense/fillIn",
// text: "企业认证"
// }
//
]);
/* 个人信息 */
const userInfo = ref({});
......@@ -155,6 +156,7 @@ const getUserInfo = async () => {
let type = companyRes.data.companyAudit.status;
if (type != 1) {
navList[0].subText = await getEnumText("EnumAuditStatus", type);
navList[0].url = "/pages/user/myCompany/index";
navList[0].auditStatus = type;
uni.hideTabBar();
} else {
......@@ -162,28 +164,6 @@ const getUserInfo = async () => {
}
}
}
// const companyRes = await getCompanyInfoApi();
// if (companyRes.code == 200) {
// let status = companyRes.data.companyAudit.status;
// if (status != 1) {
// navList[0].subText = await getEnumText("EnumAuditStatus", status);
// navList[0].auditStatus = status;
// uni.hideTabBar();
// } else {
// uni.showTabBar();
// }
// }
// if (companyRes.data.companyAppeal && companyRes.data.companyAppeal.status == 1) {
// } else if (companyRes.data.companyAppeal.status == 0) {
// navList[0].subText = "申诉中";
// navList[0].url = "/pages/user/businessLicense/appeal";
// uni.hideTabBar();
// } else {
// uni.showTabBar();
// navList[0].url = "/pages/user/businessLicense/appeal";
// navList[0].subText = "申诉不通过";
// }
};
onShow(() => {
getUserInfo();
......
......@@ -140,26 +140,58 @@ const chooseImage = sourceType => {
/* 提交 */
const submit = () => {
console.log(params);
saveCompanyInfoApi(params).then(res => {
if (res.code == 200) {
uni.showToast({
title: "保存成功",
icon: "success",
success() {
setTimeout(() => {
uni.navigateBack({
delta: 1
});
}, 1000);
}
});
} else {
if (
validateForm(params, [
"address",
"cityCode",
"cityName",
"companyIntro",
"districtCode",
"districtName",
"id",
"logoPath",
"nameAbbreviation",
"provinceCode",
"provinceName"
])
) {
saveCompanyInfoApi(params).then(res => {
if (res.code == 200) {
uni.showToast({
title: "保存成功",
icon: "success",
success() {
setTimeout(() => {
uni.navigateBack({
delta: 1
});
}, 1000);
}
});
} else {
uni.showToast({
title: res.message,
icon: "none"
});
}
});
}
};
const validateForm = (formData, requiredFields) => {
for (const field of requiredFields) {
const value = formData[field];
// 排除 0 和 "0" 的值,不作为空值校验
if (value === undefined || value === null || value === "") {
uni.showToast({
title: res.message,
icon: "none"
title: `请填写完整表单`,
icon: "none",
duration: 2000
});
return false;
}
});
}
return true;
};
</script>
......
<template>
<NavBar :showIcon="true" :showTitle="true" title="简历详情" backgroundBox="transparent"></NavBar>
<NavBar :showIcon="true" :showTitle="true" title="简历详情" backgroundBox="#fff"></NavBar>
<div class="resume-page">
<!-- 个人信息 -->
<view class="user-info flex-between">
......@@ -74,18 +74,41 @@
</view>
<!-- {{ status }} -->
<div class="footer flex-center">
<div class="footer" v-if="pageType !== 'application'">
<template v-if="status == 0 || status == 1">
<button class="b1" @click="refuse">不合适</button>
<button class="b2" @click="invitation">邀请面试</button>
<div class="f-btn-box">
<button class="b1" @click="refuse">不合适</button>
<button class="b2" @click="invitation">邀请面试</button>
</div>
</template>
<template v-else>
<div class="f-btn-box">
<button class="b3" :class="`style${status}`">{{ btnText }}</button>
<div class="b4">
<a :href="`tel:${userPhone}`">
<img src="@/static/image/icon/telephone.png" alt="" />
<p>立即联系</p>
</a>
</div>
</div>
</template>
</div>
<div class="footer" v-else>
<template v-if="applicationData.status == 0 || applicationData.status == 1">
<div class="f-btn-box">
<button class="b1" @click="refuse">不合适</button>
<button class="b2" @click="invitation">邀请面试</button>
</div>
</template>
<template v-else>
<button class="b3" :class="`style${status}`">{{ btnText }}</button>
<div class="b4">
<a :href="`tel:${userPhone}`">
<img src="@/static/image/icon/telephone.png" alt="" />
<p>立即联系</p>
</a>
<div class="f-btn-box">
<button class="b3" :class="`style${applicationData.status}`">{{ applicationText }}</button>
<div class="b4">
<a :href="`tel:${applicationData.userPhone}`">
<img src="@/static/image/icon/telephone.png" alt="" />
<p>立即联系</p>
</a>
</div>
</div>
</template>
</div>
......@@ -124,8 +147,12 @@ const resumeData = reactive({
major: "",
userPhone: ""
});
const applicationData = ref({});
// 数据回显
const getUserResume = ({ userId, jobId }) => {
console.log("jobId", jobId);
jobId = !jobId || jobId == "undefined" ? null : jobId;
getUserResumeApi({ userId, jobId }).then(async res => {
const {
personalAdvantage,
......@@ -136,6 +163,8 @@ const getUserResume = ({ userId, jobId }) => {
workExperience,
educationExperience
} = res.data.resume;
applicationData.value = res.data.jobApplication;
const { realName, workExperience: workExperienceYear, educationLevel, avatarPath } = res.data.user;
resumeData.preferredCityName = preferredCityName;
resumeData.personalAdvantage = personalAdvantage; // 求职状态回
......@@ -155,7 +184,9 @@ const getUserResume = ({ userId, jobId }) => {
resumeData.educationExperience = educationExperienceJson;
});
};
onLoad(({ userId, jobId, applicationId }) => {
const pageType = ref(null);
onLoad(({ userId, jobId, applicationId, type }) => {
pageType.value = type;
id = applicationId;
getUserResume({ userId, jobId });
});
......@@ -180,6 +211,18 @@ const btnText = computed(() => {
return "";
}
});
const applicationText = computed(() => {
switch (applicationData.value.status) {
case 2:
return "已邀请面试";
case 3:
return "已面试";
case 4:
return "已拒绝";
default:
return "";
}
});
onShow(() => {
/* "code": "0",
"text": "已投递",
......@@ -191,15 +234,21 @@ onShow(() => {
"text": "已面试",
"code": "4",
"text": "已拒绝", */
getApplicationByIdApi(id).then(res => {
status.value = res.data.status;
userPhone.value = res.data.userPhone;
});
id = id == "undefined" ? null : id;
if (pageType.value == "application") {
} else {
getApplicationByIdApi(id).then(res => {
status.value = res.data.status;
userPhone.value = res.data.userPhone;
});
}
});
/* 拒绝 */
const message = useMessage();
const refuse = () => {
if (pageType.value == "application") {
id = applicationData.value.id;
}
message
.confirm({
msg: "您确认拒绝该简历吗?",
......@@ -221,6 +270,9 @@ const refuse = () => {
};
/* 邀请 */
const invitation = () => {
if (pageType.value == "application") {
id = applicationData.value.id;
}
uni.navigateTo({
url: "/pages/recommend/invitation/index?id=" + id
});
......@@ -230,6 +282,7 @@ const invitation = () => {
<style lang="scss" scoped>
.resume-page {
padding-top: 50rpx;
padding-bottom: 100rpx;
}
.user-info {
padding-bottom: 30rpx;
......@@ -332,8 +385,16 @@ const invitation = () => {
left: 0;
gap: 32rpx;
width: 100%;
padding: 16rpx 0;
border-top: 2rpx solid #1f23290f;
z-index: 99;
.f-btn-box {
display: flex;
justify-content: space-around;
align-items: center;
background: #fff;
z-index: 99;
padding: 16rpx 0;
}
button {
width: 294rpx;
height: 80rpx;
......
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
......@@ -53,12 +53,10 @@ function handleError(message) {
}, 2000);
}
let { code } = response.data;
console.log('response.data', response.data);
if (code == 200) {
return response.data;
} else if (code == 9) {
// handleError("登录已过期");
handleError("登录已过期");
} else if (code == 2) {
handleError("登录超时");
}
......
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