Commit 95b762d1 authored by 李明环(东信)'s avatar 李明环(东信)

完善推荐页面

parent fcbe0593
......@@ -9,3 +9,5 @@ export const getTreeListApi = params => instance.postForm("/dict/dictProvinceCit
export const dictJobTypeApi = params => instance.post("/dict/dictJobType/getTree", params);
// 获取岗位列表类型(1职位,2政策,3动态)
export const getBannerListApi = type => instance.post(`/banner/list/${type}`);
//更具code码获取城市名称
export const getCityNameByCodeApi = code => instance.post(`/dict/dictProvinceCityDistrict/find/city/${code}`);
......@@ -9,26 +9,38 @@ export const updateJobApi = params => instance.post("/b/position/update", params
// 职位列表
export const getJobListApi = params => instance.post("/company/job/list", params);
// 获取简历推荐列表
export const getResumeRecommendListApi = params => instance.post("/company/job/getResumeRecommendList", params);
// 获取推荐简历列表
export const getRecommendedResumeListApi = params => instance.post("/position/resume/recommend/list", params);
// 已投递简历列表
export const getResumeByUserId = userId => instance.post(`/position/resume/detail/${userId}`);
// 更具用户id查询简历
export const getApplicationListApi = params => instance.post("/position/application/list", params);
// 查询职位信息
export const getJobByIdApi = id => instance.post(`/b/position/${id}`);
// 统计职位投递信息
export const getListStatisticsApi = params => instance.post("/b/position/statistics", params);
// 职位列表统计
export const getPositionListApi = params => instance.post("/b/position/list", params);
//获取投递信息通过id
export const getApplicationByIdApi = id => instance.post(`/company/job/getApplication/${id}`);
export const getApplicationByIdApi = id => instance.post(`/position/application/${id}`);
//邀请面试
export const inviteInterviewApi = params => instance.post(`/company/job/inviteInterview`, params);
export const inviteInterviewApi = params => instance.post(`/position/application/interview`, params);
//获取投递列表/
export const getApplicationListApi = params => instance.post("/company/job/getApplicationList", params);
// export const getApplicationListApi = params => instance.post("/company/job/getApplicationList", params);
//获取投递列表
export const getUserResumeApi = params => instance.post(`/company/job/getUserResume`, params);
// export const getUserResumeApi = params => instance.post(`/company/job/getUserResume`, params);
export const getUserResumeApi = id => instance.post(`/position/resume/detail/${id}`);
// 获取职位详情
export const getUserResumeByApplicationIdApi = id => instance.post(`/position/application/resume/${id}`);
// 职位发布(上线)
export const jobReleaseApi = id => instance.post(`/b/position/release/${id}`);
......@@ -41,4 +53,7 @@ export const jobOfftopApi = id => instance.post(`/b/position/top/${id}`);
export const jobOffuntopApi = id => instance.post(`/b/position/untop/${id}`);
// 拒绝申请
export const rejectApplicationApi = id => instance.post(`/company/job/rejectApplication/${id}`);
export const rejectApplicationApi = id => instance.post(`/position/application/reject/${id}`);
// 拒绝推荐
export const resumeInappropriateApi = params => instance.post(`/position/resume/inappropriate`, params);
<template>
<div class="filter">
<div class="filter" id="filter">
<div class="menu">
<p v-for="v in menuList" :class="{ active: v.active }" :key="v.name" @click="onClickMenu(v)">{{ v.name }}</p>
</div>
......@@ -90,7 +90,7 @@ const menuList = ref([]);
const onClickMenu = data => {
menuList.value.forEach(v => (v.active = false));
data.active = true;
document.querySelector(".filter").querySelector(`.${data.className}`).scrollIntoView();
document.querySelector("#filter").querySelector(`.${data.className}`).scrollIntoView();
};
// 学历
const educationList = ref([]);
......@@ -184,19 +184,18 @@ const onCancel = () => {
};
// 1. 确认 接收数据
const onConfirm = () => {
console.log(
educationList.value.find(v => v.active),
genderList.value.find(v => v.active),
workYearList.value.find(v => v.active),
dictJobTypeList.value.find(v => v.active)
);
emit("confirm");
const [minAge, maxAge] = age.value;
const { min: minWorkYear, max: maxWorkYear } = workYearList.value.find(v => v.active) || { min: 0, max: 100 };
const education = educationList.value.find(v => v.active)?.code;
const jobType = dictJobTypeList.value.find(v => v.active)?.id;
const sex = genderList.value.find(v => v.active)?.code;
emit("confirm", { minAge, maxAge, minWorkYear, maxWorkYear, education, jobType, sex });
};
</script>
<style lang="scss" scoped>
.filter {
position: absolute;
position: fixed;
inset: 0;
z-index: 66666666;
display: flex;
......@@ -290,6 +289,7 @@ const onConfirm = () => {
width: 100%;
padding: 16rpx 64rpx;
background-color: #ffffff;
border-top: 1px solid #dae4e7;
button {
display: flex;
align-items: center;
......
<template>
<div>
<view bind:tap="jumpResumeDetail" @click="jumpResumeDetail">
<view @click="jumpResumeDetail">
<view class="info felx-between">
<view class="text-wrap">
<view class="name"> {{ data.realName }} <text>· 今日活跃</text> </view>
<view class="other"> {{ data.workExperience }}年 | {{ educationLevelText }}{{ data.salary }} </view>
<view class="name">
{{ data.name || "名字" }}
<!-- <text>· 今日活跃</text> -->
</view>
<view class="other">
{{ data.workAge }}年 | {{ educationLevelText }}{{ data.minSalary + "~" + data.maxSalary }}
</view>
<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" v-if="educationExperience">
{{ educationExperience ? educationExperience.schoolName : null }}·{{
educationExperience ? educationExperience.major : null
}}
<image v-if="data.avatar" :src="evn.APP_IMAGE_BASE_API + data.avatar" mode="" />
<image v-else src="@/static/image/user/default-avatar.png" mode="" />
</view>
<view class="education"> {{ data.schoolName || "无" }}·{{ data.major || "无" }} </view>
<view class="introduce">
{{ data.personalAdvantage }}
{{ data.personalAdvantages }}
</view>
</view>
</div>
......@@ -26,40 +27,23 @@ import { defineProps, computed } from "vue";
import evn from "@/utils/config";
import { getEnumText } from "@/utils/utils";
import { useAsync } from "@/hooks/useAsync";
let { data, jobId, type } = defineProps({
let { data, 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(() => {
if (data.educationLevel) {
return JSON.parse(data?.educationExperience)[0] || {};
} else {
return null;
}
});
console.log(data);
const { data: educationLevelText } = useAsync(getEnumText("EnumEducation", data.education));
const jumpResumeDetail = () => {
console.log("data", data);
if (type == "recommend") {
jobId = data.jobId;
}
console.log("data.positionId", data.positionId);
uni.navigateTo({
url: `/pages/user/resume/index?jobId=${jobId}&userId=${data.userId}&applicationId=${data.applicationId}&type=${type}`
url: `/pages/user/resume/index?jobId=${data.positionId}&userId=${data.userId}&applicationId=${data.id}&type=${type}`
});
};
</script>
......
......@@ -78,6 +78,7 @@ const list = ref([]);
let flag = true;
const getApplicationList = () => {
if (!flag) return;
uni.showLoading({ title: "加载中..." });
getApplicationListApi(apiParams).then(res => {
if (res.data?.length && flag) {
list.value.push(...res.data);
......@@ -85,6 +86,7 @@ const getApplicationList = () => {
} else {
flag = false;
}
uni.hideLoading();
});
};
</script>
......@@ -122,10 +124,10 @@ scroll-view {
flex-grow: 1;
height: 100%;
.item {
padding: 16rpx 32rpx;
margin-top: 16rpx;
background: #fff;
background: #ffffff;
border-bottom: 16rpx solid #f3f4f8;
padding: 16rpx 32rpx;
}
}
</style>
<template>
<div class="page">
<NavBar :showIcon="false" :showTitle="true" title="推荐"></NavBar>
<view class="tabs" :style="{ position: sticky, top: contentHeight }">
<view class="tabs" :style="{ top: contentHeight }">
<text @tap="changeActiveTab('求职推荐')" :class="activeTab == '求职推荐' ? 'active' : ''">求职推荐</text>
<text @tap="changeActiveTab('职位管理')" :class="activeTab == '职位管理' ? 'active' : ''">职位管理</text>
<text @tap="changeActiveTab('个人投递')" :class="activeTab == '个人投递' ? 'active' : ''">个人投递</text>
</view>
<view class="wrap">
<view class="recommend" v-if="activeTab == '求职推荐'">
<view class="filter flex-between">
<view class="recommend">
<!-- 筛选 -->
<view class="filter flex-between" v-show="activeTab == '求职推荐'">
<view class="filter-opstion">
<view class="t1">按以下职位推荐</view>
<wd-picker
:columns="jobListColumns"
label="单列选项"
value-key="jobType"
label-key="jobTypeText"
v-model="getApplicationListParams.jobType"
@confirm="handleConfirm"
value-key="id"
label-key="name"
v-model="getResumeRecommendListParams.positionId"
@confirm="positionConfirm"
use-default-slot
>
<view class="t2">{{ jobTypeText || "全部" }}</view>
......@@ -48,112 +48,17 @@
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">
<p class="label">工作年限</p>
<wd-slider v-model="workExperienceValue" />
</div>
<div class="other-view-item">
<p class="label">学历要求</p>
<div class="select-list">
<p
class="select-item"
:class="{ active: v.code == activeEducation }"
@click="changeType(v)"
v-for="v in EnumEducationRequirement"
:key="v.code"
>
{{ v.text }}
</p>
</div>
</div>
<div class="other-view-item">
<p class="label">年龄要求</p>
<wd-slider v-model="ageValue" />
</div>
<div class="other-view-item button-wrap">
<div class="reset" @click="resetFilter">重置</div>
<div class="confirm" @click="confirmFilter">完成</div>
</div>
</div>
</div>
<view class="item" v-for="v in applicationList" :key="v.applicationId">
<jobSeekersCard :data="v" :jobId="myJobId" :type="'application'" />
<view class="item" v-for="(v, i) in applicationList" :key="v.userId + v.positionId + v.id">
<jobSeekersCard :data="v" :type="'application'" />
</view>
<wd-status-tip v-if="!applicationList || !applicationList.length" image="content" tip="暂无内容" />
</scroll-view>
</view>
<view class="management" v-if="activeTab == '职位管理'">
<view class="filter flex-between">
<!-- <view class="item" :class="{ active: activeTopFilter == '' }" @click="filterJobList('')">全部职位</view> -->
<view
class="item"
:class="{ active: activeTopFilter === v.code }"
v-for="v in topFilter"
:key="v.code"
@click="filterJobList(v.code)"
>{{ v.text }}</view
>
</view>
<scroll-view class="management-list" :scroll-y="true">
<view class="item" v-for="(v, i) in jobList" :key="i">
<view class="flex-between">
<view class="info">
<view class="name">{{ v.jobName }}</view>
<view class="other"> {{ v.cityName }}{{ v.workModeText }}{{ v.jobTypeText }} </view>
</view>
<view class="state" :class="`style${v.status}`"> {{ v.statusText }} </view>
</view>
<view class="data flex-between">
<view bind:tap="jumpDeliveryManagement" @click="jumpDeliveryManagement(v.id, '0')">
<view class="t1">{{ v.pendingNum || 0 }}</view>
<view class="t2">新投递</view>
</view>
<view bind:tap="jumpDeliveryManagement" @click="jumpDeliveryManagement(v.id, '2')">
<view class="t1">{{ v.interviewNum || 0 }}</view>
<view class="t2">待面试</view>
</view>
<view bind:tap="jumpDeliveryManagement" @click="jumpDeliveryManagement(v.id, '')">
<view class="t1">{{ v.totalNum || 0 }}</view>
<view class="t2">总投递</view>
</view>
</view>
<view class="btn-list flex-between">
<view class="flex-center" @click="jobOffuntopApiFn(v)" v-if="v.top == 1">
<image src="@/static/image/icon/cancelUpload.png" mode="" />
取消置顶
</view>
<view class="flex-center" @click="jobOfftopApiFn(v)" v-else>
<image class="top" src="@/static/image/icon/top.png" mode="" />
置顶
</view>
<view class="flex-center" @click="getJobList(activeTopFilter)">
<image src="@/static/image/icon/refresh.png" mode="" />
刷新
</view>
<view class="flex-center" @click="switchJobStatus(v)">
<image :class="{ rotate: v.status != 3 }" src="@/static/image/icon/download.png" mode="" />
{{ v.status == 3 ? "下线" : "上线" }}
</view>
<view class="flex-center" @click="editJob(v)">
<image src="@/static/image/icon/edit.png" mode="" />
编辑
</view>
</view>
</view>
<wd-status-tip v-if="!jobList.length" image="content" tip="暂无内容" />
</scroll-view>
</view>
<view class="release-postion" @tap="releasePostion"> 发布 </view>
<!-- <wd-fab :draggable="true">
</wd-fab> -->
</view>
<!-- 筛选弹窗 -->
<Filter v-show="showOtherFilter" @confirm="filterConfirm" @cancel="showOtherFilter = false" />
</div>
</template>
<script setup>
/*"code": "0",
"text": "待审核",
......@@ -167,85 +72,48 @@
"text": "下线", */
import { ref } from "vue";
import jobSeekersCard from "@/components/jobSeekersCard/index.vue";
import {
getJobListApi,
getResumeRecommendListApi,
getListStatisticsApi,
jobReleaseApi,
jobOfflineApi,
getJobByIdApi,
jobOfftopApi,
jobOffuntopApi
} from "@/api/postion";
import { getJobListApi, getApplicationListApi, getRecommendedResumeListApi, getPositionListApi } from "@/api/postion";
import { getTreeListApi } from "@/api/common";
import { getEumData, getEnumText } from "@/utils/utils";
import { useAsync } from "@/hooks/useAsync";
import _ from "lodash";
import { useReleasePostionStore } from "./releasePostion/store";
import Filter from "@/components/filter/index.vue";
/* tab */
const contentHeight = ref("100rpx");
const pinias = useReleasePostionStore();
const activeTab = ref("求职推荐");
const changeActiveTab = tab => {
activeTab.value = tab;
getTopFilter();
getJobList(activeTopFilter.value);
getJobListApiFn();
resetParams();
getResumeRecommendList();
/* getTopFilter();
getJobListApiFn(); */
};
let refresherEnabled = ref(true);
/* 获取职位列表 */
const jobListColumns = ref([]);
const jobTypeText = ref("");
const handleConfirm = ({ selectedItems, value }) => {
myJobId.value = selectedItems.id;
jobTypeText.value = selectedItems.jobTypeText;
refresh().then(() => {
const positionConfirm = ({ selectedItems }) => {
jobTypeText.value = selectedItems.name;
resetPageParams();
getResumeRecommendList();
});
};
const myJobId = ref("");
function changeType(v) {
activeEducation.value = v.code;
myJobId.value = v.id;
getResumeRecommendList();
}
function fresherrefresh() {
refresherEnabled.value = true;
refresh().then(() => {
getResumeRecommendList();
});
}
function getJobListApiFn() {
getJobListApi().then(res => {
getPositionListApi({ status: 3 }).then(res => {
if (res.code == 200) {
jobListColumns.value = res.data;
console.log(res.data[0].jobType);
// 初始化选择器
getApplicationListParams.value.jobType = res.data[0].jobType;
jobTypeText.value = res.data[0].jobTypeText;
// 获取推荐列表
getResumeRecommendList();
}
});
}
function jobOfftopApiFn(v) {
jobOfftopApi(v.id).then(res => {
if (res.code == 200) {
getJobList(activeTopFilter.value);
}
});
}
function jobOffuntopApiFn(v) {
jobOffuntopApi(v.id).then(res => {
if (res.code == 200) {
getJobList(activeTopFilter.value);
}
getJobListApiFn();
const jobTypeText = ref("");
function fresherrefresh() {
refresherEnabled.value = true;
refresh().then(() => {
getResumeRecommendList();
});
}
/* 获取推荐 */
// 数据列表
const applicationList = ref([]);
/* 投递接口参数 */
const getApplicationListParams = ref({
jobType: "",
provinceCode: "",
......@@ -255,23 +123,76 @@ const getApplicationListParams = ref({
maxWorkYear: "",
education: "",
minAge: "",
isEnd: false,
maxAge: "",
pageNo: 1,
pageSize: 10
});
const careerList = ref([]);
/* 获取推荐简历列表接口参数 */
const getResumeRecommendListParams = ref({
recommend: true,
positionId: "",
sex: "",
jobType: "",
provinceCode: "",
cityCode: "",
districtCode: "",
education: "",
minAge: "",
maxAge: "",
minWorkAge: "",
maxWorkAge: "",
pageNo: 1,
pageSize: 10
});
const isEnd = ref(false);
const refresh = () => {
return new Promise((resolve, reject) => {
const resetParams = () => {
applicationList.value = [];
getApplicationListParams.value = {
jobType: "",
provinceCode: "",
cityCode: "",
districtCode: "",
minWorkYear: "",
maxWorkYear: "",
education: "",
minAge: "",
maxAge: "",
pageNo: 1,
pageSize: 10
};
getResumeRecommendListParams.value = {
recommend: true,
positionId: "",
sex: "",
jobType: "",
provinceCode: "",
cityCode: "",
districtCode: "",
education: "",
minAge: "",
maxAge: "",
minWorkAge: "",
maxWorkAge: "",
pageNo: 1,
pageSize: 10
};
};
const resetPageParams = () => {
applicationList.value = [];
isEnd.value = false;
getResumeRecommendListParams.value.pageNo = 1;
getApplicationListParams.value.pageNo = 1;
getApplicationListParams.value.isEnd = false;
};
const refresh = () => {
return new Promise((resolve, reject) => {
resetPageParams();
resolve();
});
};
// 获取数据
const getResumeRecommendList = () => {
if (getApplicationListParams.value.isEnd === true)
if (isEnd.value === true)
return new Promise(resolve => {
resolve();
});
......@@ -279,20 +200,42 @@ const getResumeRecommendList = () => {
title: "加载中...",
mask: true
});
return getResumeRecommendListApi(getApplicationListParams.value).then(res => {
// 获取推荐简历
if (activeTab.value === "求职推荐") {
return getRecommendedResumeListApi(getResumeRecommendListParams.value).then(res => {
xma.hideLoading();
refresherEnabled.value = false;
if (!res.data) {
res.data = [];
}
if (res.data.length < getResumeRecommendListParams.value.pageSize) {
isEnd.value = true;
}
getResumeRecommendListParams.value.pageNo += 1;
applicationList.value = applicationList.value.concat(res.data);
// applicationList.value = res.data || [];
});
} else {
// 获取已投递
return getApplicationListApi(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;
isEnd.value = true;
}
getApplicationListParams.value.pageNo += 1;
applicationList.value = applicationList.value.concat(res.data);
});
}
};
onShow(() => {
resetPageParams();
getResumeRecommendList();
});
// 城市筛选
const valueCity = ref([]);
const cityText = ref("全部");
......@@ -338,92 +281,32 @@ const handleConfirmCity = ({ value, selectedItems }) => {
cityText.value = selectedItems[textIndex].name;
}
const [provinceCode, cityCode, districtCode] = value;
getApplicationListParams.value.provinceCode = provinceCode || "";
getApplicationListParams.value.cityCode = cityCode || "";
getApplicationListParams.value.districtCode = districtCode || "";
getApplicationListParams.value.pageNo = 1;
getApplicationListParams.value.pageSize = 10;
getResumeRecommendListParams.value.recommend = false;
getResumeRecommendListParams.value.provinceCode = provinceCode || "";
getResumeRecommendListParams.value.cityCode = cityCode || "";
getResumeRecommendListParams.value.districtCode = districtCode || "";
resetPageParams();
getResumeRecommendList();
};
// 显示其他筛选
const showOtherFilter = ref(false);
// 年龄
const ageValue = ref([0, 100]);
// 年龄
const workExperienceValue = ref([0, 100]);
// 学历
const EnumEducationRequirement = ref([]);
const activeEducation = ref("0");
const getEnumEducationRequirement = async () => {
EnumEducationRequirement.value = await getEumData("EnumEducationRequirement");
};
getEnumEducationRequirement();
// 重置筛选
const resetFilter = () => {
ageValue.value = [0, 100];
workExperienceValue.value = [0, 100];
activeEducation.value = "0";
};
//完成筛选
const confirmFilter = () => {
getApplicationListParams.value.minAge = ageValue.value[0];
getApplicationListParams.value.maxAge = ageValue.value[1];
getApplicationListParams.value.maxWorkYear = workExperienceValue.value[0];
getApplicationListParams.value.minWorkYear = workExperienceValue.value[1];
getApplicationListParams.value.education = activeEducation.value;
getApplicationListParams.value.pageNo = 1;
getApplicationListParams.value.pageSize = 10;
// 获取推荐列表
refresh().then(() => {
getResumeRecommendList();
const filterConfirm = data => {
Object.keys(data).forEach(key => {
getResumeRecommendListParams.value[key] = data[key];
});
showOtherFilter.value = false;
};
/* 跳转到发布职位 */
const releasePostion = () => {
console.log("useReleasePostionStore", useReleasePostionStore);
uni.navigateTo({
url: "/pages/recommend/releasePostion/step1"
});
getResumeRecommendListParams.value.recommend = false;
showOtherFilter.value = false;
resetPageParams();
getResumeRecommendList();
};
/* 获取职位管理 */
const topFilter = ref([]);
const activeTopFilter = ref("");
const jobList = ref([]);
const filterJobList = code => {
activeTopFilter.value = code;
getJobList(code);
};
const getTopFilter = async () => {
const data = await getEumData("EnumJobStatus");
data.unshift({
code: "",
text: "全部"
});
topFilter.value = data;
};
const getJobList = (status = "") => {
xma.showLoading({
title: "加载中..."
});
getListStatisticsApi({ status }).then(res => {
xma.hideLoading();
res.data.forEach(v => {
const { data: workModeText } = useAsync(getEnumText("EnumWorkMode", v.workMode));
const { data: statusText } = useAsync(getEnumText("EnumJobStatus", v.status));
v.workModeText = workModeText;
v.statusText = statusText;
});
jobList.value = [...res.data];
if (!status) {
myJobId.value = jobList.value[0].id;
}
});
};
onLoad(() => {
xma.xh.getSystemInfo({
success(res) {
......@@ -436,118 +319,6 @@ onLoad(() => {
}
});
});
onShow(() => {
getTopFilter();
getJobListApiFn();
getJobList();
});
/* 职位上下线 */
const switchJobStatus = async v => {
let res = null;
if (v.status == 3) {
res = await jobOfflineApi(v.id);
v.status = 4;
} else if (v.status == 4 || v.status == 1) {
res = await jobReleaseApi(v.id);
v.status = 3;
} else {
uni.showToast({
title: "该状态不能操作",
icon: "none"
});
}
if (res && res.code === 200) {
uni.showToast({
title: "操作成功",
icon: "none"
});
getJobList();
} else {
uni.showToast({
title: res.message,
icon: "none"
});
}
};
/* 跳转职位管理 */
const jumpDeliveryManagement = (jobId, status) => {
uni.navigateTo({
url: `/pages/recommend/deliveryManagement/index?jobId=${jobId}&status=${status}`
});
};
/* 编辑职位 */
const editJob = ({ id, status }) => {
if (status == 3) {
uni.showToast({
title: "该职位已上线,不能编辑",
icon: "none"
});
return;
}
getJobByIdApi(id).then(res => {
const {
workMode,
jobName,
jobType,
jobTypeText,
jobDesc,
negotiableSalary,
settlementType,
minSalary,
maxSalary,
benefits,
identityRequirement,
educationRequirement,
minAgeRequirement,
maxAgeRequirement,
recruitmentNumber,
accommodation,
provinceCode,
cityCode,
districtCode,
town,
street,
address,
locationLongitude,
locationLatitude,
contactPerson,
contactPhone
} = res.data;
pinias.setForm({
workMode,
jobName,
jobType,
jobTypeText,
jobDesc,
negotiableSalary,
settlementType,
minSalary,
maxSalary,
benefits,
identityRequirement,
educationRequirement,
minAgeRequirement,
maxAgeRequirement,
recruitmentNumber,
accommodation,
provinceCode,
cityCode,
districtCode,
town,
street,
address,
locationLongitude,
locationLatitude,
contactPerson,
contactPhone
});
pinias.setFormDataKey("id", id);
uni.navigateTo({
url: `/pages/recommend/releasePostion/step1?id=${id}`
});
});
};
</script>
<style lang="scss" scoped>
......@@ -584,30 +355,6 @@ const editJob = ({ id, status }) => {
display: flex;
flex-direction: column;
flex-grow: 1;
.release-postion {
position: fixed;
right: 22rpx;
bottom: 150rpx;
z-index: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 112rpx;
height: 112rpx;
font-size: 24rpx;
font-weight: 500;
line-height: 28rpx;
color: #eaf4ff;
background: linear-gradient(180deg, #3570ff -3%, #29a5ff 100%);
border-radius: 50%;
opacity: 1;
image {
width: 32rpx;
height: 36rpx;
margin-bottom: 6rpx;
}
}
.recommend {
position: relative;
display: flex;
......@@ -760,128 +507,5 @@ const editJob = ({ id, status }) => {
}
}
}
.management {
position: relative;
display: flex;
flex-direction: column;
flex-grow: 1;
.filter {
padding: 20rpx 32rpx;
font-size: 28rpx;
line-height: 44rpx;
color: #77818f;
text-align: center;
border-bottom: 16rpx solid #f3f4f8;
.item.active {
position: relative;
font-weight: 500;
color: #1f86ff;
&::after {
position: absolute;
bottom: -20rpx;
left: 50%;
display: block;
width: 48rpx;
height: 4rpx;
content: "";
background-color: #1f86ff;
transform: translateX(-50%);
}
}
}
.management-list {
flex-grow: 1;
height: 200rpx;
.item {
padding: 32rpx;
padding-bottom: 0;
border-bottom: 16rpx solid #f3f4f8;
.info {
.name {
font-size: 32rpx;
font-weight: 500;
color: #1b2026;
}
.other {
font-size: 24rpx;
font-weight: normal;
line-height: 36rpx;
color: #77818f;
}
}
.state {
padding: 8rpx 16rpx;
font-size: 20rpx;
font-weight: 500;
line-height: 28rpx;
color: #1f86ff;
background: rgb(31 134 255 / 10%);
border-radius: 4rpx;
&.style1 {
color: #18c69c;
background: rgb(31 255 80 / 10%);
}
&.style2 {
color: #f05a25;
background: rgb(240 90 37 / 10%);
}
}
.data {
padding: 16rpx 0;
border-bottom: 2rpx solid rgb(31 35 41 / 15%);
& > view {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 214rpx;
height: 120rpx;
text-align: center;
background: #1f86ff10;
border-radius: 8rpx;
.t1 {
font-size: 48rpx;
font-weight: bold;
line-height: 36rpx;
color: #1f86ff;
}
.t2 {
font-size: 24rpx;
line-height: 36rpx;
color: #77818f;
}
}
}
.btn-list {
margin: 12rpx 0;
.rotate {
transform: rotateZ(180deg);
}
image {
width: 28rpx;
height: 28rpx;
}
.top {
width: 20rpx;
height: 20rpx;
margin-right: 3rpx;
}
view {
flex: 1;
font-size: 24rpx;
font-weight: normal;
line-height: 36rpx;
color: #77818f;
&:not(:first-child) {
border-left: 2rpx solid #77818f;
}
}
}
}
.wd-status-tip {
padding-top: 280rpx;
}
}
}
}
</style>
......@@ -12,26 +12,42 @@
<view class="card">
<image src="@/static/image/user/default-avatar.png" mode="" />
<view class="name">{{ data.realName || "无" }}</view>
<view class="school">贵州大学·心理学</view>
<view class="name">{{ userInfo.name || "无" }}</view>
<view class="school">{{ userInfo.schoolName || "无" }}·{{ userInfo.major || "无" }}</view>
<view class="info-list">
<view class="info flex-between">
<veiw class="label">面试时间</veiw>
<wd-datetime-picker
v-model="date"
style="z-index: 999 !important"
:min-date="new Date(new Date().setHours(0, 0, 0, 0)).getTime()"
use-default-slot
label="日期选择"
@confirm="dateConfirm"
>
<view class="data">{{ date ? dayjs(date).format("YYYY-MM-DD HH:mm") : "选择面试时间" }}</view>
<view :class="{ data: 1, placeholder: !date }">{{
date ? dayjs(date).format("YYYY-MM-DD HH:mm") : "选择面试时间"
}}</view>
</wd-datetime-picker>
<view class="arrow"></view>
</view>
<view class="info flex-between">
<veiw class="label">面试职位</veiw>
<view class="data">{{ data.jobName }}{{ data.salary }}</view>
<!-- <view class="data">{{ data.positionName }}{{ data.salary }}</view> -->
<!-- 需要选择岗位 -->
<template v-if="jobIdTemp">
<view class="data">{{ data.positionName }}{{ data.salary }}</view>
</template>
<template v-else>
<wd-picker
:columns="jobListColumns"
value-key="id"
label-key="name"
@confirm="positionConfirm"
use-default-slot
>
<view class="data" v-if="data.positionName">{{ data.positionName }}{{ data.salary }}</view>
<view class="t2" v-else>请选择职位</view>
</wd-picker>
</template>
<view class="arrow"></view>
</view>
<view class="info flex-between">
......@@ -46,11 +62,9 @@
</view>
<view class="info flex-between">
<veiw class="label">面试地址</veiw>
<view class="data">{{ data.address }}</view>
<view class="data">{{ data.interviewLocation }}</view>
<view class="arrow"></view>
</view>
<map id="mapId" class="map" :latitude="mapCenter.latitude" :longitude="mapCenter.longitude" :markers="markers">
</map>
</view>
</view>
......@@ -62,45 +76,79 @@
<script setup>
import dayjs from "dayjs";
import { getApplicationByIdApi, inviteInterviewApi } from "@/api/postion";
import { getApplicationByIdApi, inviteInterviewApi, getJobByIdApi, getPositionListApi, getResumeByUserId } from "@/api/postion";
import { reactive, ref } from "vue";
const date = ref("");
const dateConfirm = e => {
console.log(e);
};
const jobIdTemp = ref("");
let userIdTemp = "";
const data = ref({});
onLoad(({ id }) => {
/* 获取职位列表 */
const jobListColumns = ref([]);
function getJobListApiFn() {
getPositionListApi({ status: 3 }).then(res => {
if (res.code == 200) {
jobListColumns.value = res.data;
}
});
}
getJobListApiFn();
const positionConfirm = ({ selectedItems }) => {
console.log(selectedItems);
data.value = selectedItems;
data.value.interviewLocation = selectedItems.address;
data.value.salary = selectedItems.minSalary + "~" + selectedItems.maxSalary;
data.value.positionName = selectedItems.name;
jobIdTemp.value = selectedItems.id;
};
onLoad(({ id, jobId, userId }) => {
userIdTemp = userId;
// 投递获取
if (Number(id)) {
getApplicationByIdApi(id).then(res => {
data.value = res.data;
data.value.applicationId = id;
});
} else if (Number(jobId)) {
getJobById(jobId);
}
console.log(1111);
// 查询用户信息
getUserinfo();
});
// 查询用户信息
const userInfo = reactive({
name: "",
schoolName: "",
major: ""
});
const getUserinfo = () => {
getResumeByUserId(userIdTemp).then(res => {
console.log(res);
userInfo.name = res.data.userInfo.name;
const educationExperience = JSON.parse(res.data.userResume.educationExperience || [{}])[0];
userInfo.schoolName = educationExperience.schoolName;
userInfo.major = educationExperience.major;
});
};
const getJobById = jobId => {
// 数据凭借
getJobByIdApi(jobId).then(res => {
res.data.salary = res.data.minSalary + "~" + res.data.maxSalary;
res.data.positionName = res.data.name;
res.data.interviewLocation = res.data.address;
jobIdTemp.value = jobId;
data.value = res.data;
console.log(res);
});
};
const back = () => {
uni.navigateBack();
};
let mapCenter = reactive({
latitude: 26.63,
longitude: 106.67
});
// 地图点
let markers = reactive([
{
id: 1,
latitude: 26.63,
longitude: 106.67,
width: 16,
height: 20,
iconPath: new URL("@/static/image/icon/markers.png", import.meta.url).href,
callout: {
content: "观山湖区高新区产业技术发展研究院",
borderRadius: 2,
padding: 7,
display: "ALWAYS",
textAlign: "center",
bgColor: "#fff",
color: "#000"
}
}
]);
const submit = () => {
if (!date.value) {
......@@ -110,17 +158,27 @@ const submit = () => {
});
return;
}
if (!data.value.applicationId && !jobIdTemp.value) {
uni.showToast({
title: "请选择面试岗位",
icon: "none"
});
return;
}
inviteInterviewApi({
...data.value,
interviewTime: date.value
interviewTime: date.value,
userId: userIdTemp,
positionId: jobIdTemp.value
}).then(res => {
console.log(res);
if (res.code === 200) {
uni.showToast({
title: "邀请成功",
icon: "none"
});
uni.navigateBack();
uni.switchTab({
url: "/pages/recommend/index"
});
}
});
};
......@@ -154,7 +212,7 @@ const submit = () => {
flex-direction: column;
align-items: center;
width: 686rpx;
height: 878rpx;
height: 678rpx;
padding-top: 112rpx;
margin: 100rpx auto 0;
background: #ffffff;
......@@ -208,16 +266,14 @@ const submit = () => {
line-height: 36rpx;
color: #1b2026;
}
.placeholder {
color: #bfcacf;
}
.arrow {
border-color: #77818f;
}
}
}
map {
width: 620rpx;
height: 176rpx;
border-radius: 12rpx;
}
}
.btn-wrap {
position: fixed;
......
......@@ -10,7 +10,13 @@
>{{ v.text }}</view
>
</view>
<scroll-view class="management-list" :scroll-y="true">
<scroll-view
class="management-list"
:scroll-y="true"
:refresher-triggered="refresherEnabled"
@refresherrefresh="onRefresherrefresh"
refresher-enabled
>
<view class="item" v-for="(v, i) in jobList" :key="i">
<view class="flex-between">
<view class="info">
......@@ -94,6 +100,7 @@ const getJobList = (status = "") => {
v.statusText = statusText;
});
jobList.value = [...res.data];
refresherEnabled.value = false;
});
};
onLoad(() => {
......@@ -112,6 +119,7 @@ onShow(() => {
getTopFilter();
getJobList();
});
/* 职位上下线 */
const switchJobStatus = async v => {
let res = null;
......@@ -128,6 +136,7 @@ const switchJobStatus = async v => {
});
}
if (res && res.code === 200) {
v.statusText = await getEnumText("EnumJobStatus", v.status);
uni.showToast({
title: "操作成功",
icon: "none"
......@@ -235,6 +244,14 @@ function jobOffuntopApiFn(v) {
}
});
}
/* 下拉刷新 */
const refresherEnabled = ref(false);
const onRefresherrefresh = e => {
console.log(e);
refresherEnabled.value = true;
getJobList(activeTopFilter.value);
};
</script>
<style lang="scss" scoped>
......
<template>
<view class="item">
<view class="label">学校名称</view>
<input v-model="params.schoolName" placeholder="请输入用户名" border="{{ false }}" />
</view>
<view class="item">
<view class="label">专业名称</view>
<input v-model="params.major" placeholder="请输入用户名" border="{{ false }}" />
</view>
<view class="item">
<view class="label">开始时间</view>
<wd-datetime-picker
:default-value="new Date().getTime()"
:maxDate="new Date().getTime()"
:minDate="new Date('1960/01/01').getTime()"
type="year-month"
v-model="params.startDate"
use-default-slot
class="my-datetime-picker"
>
<view :class="`inner ${params.startDate ? '' : 'placeholder'}`">
{{ format(params.startDate) || "选择开始时间" }}
</view>
</wd-datetime-picker>
</view>
<view class="item">
<view class="label">结束时间</view>
<wd-datetime-picker
:default-value="new Date().getTime()"
:minDate="params.startDate"
:maxDate="new Date().getTime()"
type="year-month"
v-model="params.endDate"
use-default-slot
class="my-datetime-picker"
>
<view :class="`inner ${params.endDate ? '' : 'placeholder'}`">
{{ format(params.endDate) || "结束时间" }}
</view>
</wd-datetime-picker>
</view>
<view class="btn-wrap">
<button @click="submit">保存</button>
</view>
</template>
<script setup>
import { saveEducationExperienceApi } from "@/api/user";
import dayjs from "dayjs";
import { reactive } from "vue";
const params = reactive({ schoolName: "", startDate: 0, endDate: 0, major: "" });
const format = date => date && dayjs(date).format("YYYY-MM-DD");
const submit = () => {
saveEducationExperienceApi(JSON.stringify([params])).then(res => {
if (res.code === 200) {
uni.showToast({
title: "保存成功",
icon: "none"
});
setTimeout(() => {
uni.navigateBack();
}, 1000);
}
});
};
</script>
<style lang="scss" scoped>
.item {
display: flex;
align-items: center;
margin: 0 32rpx;
border-bottom: 2rpx solid #f3f4f8;
.label {
flex: 0 0 160rpx;
padding: 32rpx 0;
font-size: 24rpx;
font-weight: 500;
line-height: 24rpx;
color: #77818f;
}
.placeholder {
color: #77818f;
}
.inner {
height: 88rpx;
padding: 0 32rpx;
font-size: 28rpx;
line-height: 88rpx;
}
textarea {
box-sizing: border-box;
width: 100%;
height: 272rpx;
padding: 32rpx;
margin: 10rpx auto 32rpx;
background: #f2f5fb;
border-radius: 8rpx;
}
}
.btn-wrap {
position: fixed;
bottom: 0;
box-sizing: border-box;
width: 100%;
padding: 16rpx 64rpx;
border-top: 2rpx solid rgb(31 35 41 / 15%);
button {
font-size: 30rpx;
font-weight: 600;
color: #ffffff;
background: #1f86ff;
border-radius: 12rpx;
}
}
</style>
......@@ -119,12 +119,24 @@
<script setup>
import { reactive, computed } from "vue";
import { getUserResumeApi, rejectApplicationApi, getApplicationByIdApi } from "@/api/postion";
import {
getUserResumeApi,
rejectApplicationApi,
resumeInappropriateApi,
getApplicationByIdApi,
getUserResumeByApplicationIdApi
} from "@/api/postion";
import { getCityNameByCodeApi } from "@/api/common";
import { getEnumText, getEumData } from "@/utils/utils.js";
import evn from "@/utils/config.js";
import { useMessage } from "wot-design-uni";
// 投递id
let id = null;
//工作id
let jobIdTemp = null;
//用户id
let userIdTemp = null;
const resumeData = reactive({
preferredCityName: "",
personalAdvantage: "",
......@@ -149,46 +161,64 @@ const resumeData = reactive({
});
const applicationData = ref({});
// 数据回显
const getUserResume = ({ userId, jobId }) => {
console.log("jobId", jobId);
const getUserResume = ({ userId, jobId, applicationId }) => {
// console.log("jobId", jobId);=
// jobId = !jobId || jobId == "undefined" ? null : jobId;
// getUserResumeApi({ userId, jobId }).then(async res => {
let apiFn;
jobId = !jobId || jobId == "undefined" ? null : jobId;
getUserResumeApi({ userId, jobId }).then(async res => {
if (Number(applicationId)) {
apiFn = getUserResumeByApplicationIdApi(applicationId);
} else {
apiFn = getUserResumeApi(userId);
}
apiFn.then(async res => {
console.log(res);
const {
personalAdvantage,
preferredPosition,
personalAdvantages,
maxSalary,
minSalary,
preferredCityName,
workExperience,
educationExperience
} = res.data.resume;
positionNames,
educationExperience,
operator,
cityCode
} = res.data.userResume;
const { workAge, education, avatarPath, phone } = res.data.userInfo;
applicationData.value = res.data.jobApplication;
const { realName, workExperience: workExperienceYear, educationLevel, avatarPath } = res.data.user;
resumeData.preferredCityName = preferredCityName;
resumeData.personalAdvantage = personalAdvantage; // 求职状态回
// resumeData.preferredPosition = preferredPosition.split(",").join("|");
const educationLevelText = await getEnumText("EnumEducation", educationLevel);
resumeData.realName = realName;
resumeData.avatarPath = avatarPath;
resumeData.educationLevel = educationLevelText;
resumeData.workExperienceYear = workExperienceYear;
resumeData.maxSalary = maxSalary && maxSalary / 1000 + "k";
resumeData.personalAdvantage = personalAdvantages; //个人优势
resumeData.maxSalary = maxSalary && maxSalary / 1000 + "k"; //薪水
resumeData.minSalary = minSalary && minSalary / 1000 + "k";
const educationExperienceJson = JSON.parse(educationExperience || "[]");
console.log(educationExperienceJson);
resumeData.schoolName = educationExperienceJson[0]?.schoolName;
resumeData.major = educationExperienceJson[0]?.major;
resumeData.workExperience = JSON.parse(workExperience || "[]");
resumeData.preferredPosition = positionNames;
resumeData.preferredCityName = (await getCityNameByCodeApi(cityCode)).data.cityName;
resumeData.realName = operator;
const educationExperienceJson = JSON.parse(educationExperience || "[]"); //教育精力
resumeData.educationExperience = educationExperienceJson;
resumeData.workExperienceYear = workAge; //工作年限
const educationLevelText = await getEnumText("EnumEducation", education);
resumeData.educationLevel = educationLevelText;
resumeData.avatarPath = avatarPath;
resumeData.schoolName = educationExperienceJson[0]?.schoolName; //学校
resumeData.major = educationExperienceJson[0]?.major; //专业
resumeData.workExperience = JSON.parse(workExperience || "[]"); //工作经历
applicationData.value = res.data.application || { status: 0 };
applicationData.value.userPhone = phone;
/*
const { realName, workExperience: workExperienceYear, educationLevel, avatarPath } = res.data.user;
console.log(educationExperienceJson);
*/
});
};
const pageType = ref(null);
onLoad(({ userId, jobId, applicationId, type }) => {
pageType.value = type;
id = applicationId;
getUserResume({ userId, jobId });
jobIdTemp = jobId;
userIdTemp = userId;
getUserResume({ userId, jobId, applicationId });
});
function navigateTo(url) {
......@@ -255,16 +285,20 @@ const refuse = () => {
title: "拒绝"
})
.then(() => {
console.log("点击了确定按钮");
rejectApplicationApi(id).then(res => {
console.log(id);
const result = id ? rejectApplicationApi(id) : resumeInappropriateApi({ userId: userIdTemp, positionId: jobIdTemp });
result.then(res => {
if (res.code === 200) {
uni.showToast({
title: "已拒绝",
icon: "none"
});
status.value = 4;
applicationData.value.status = 4;
}
});
// resumeInappropriateApi
})
.catch(() => {});
};
......@@ -274,7 +308,7 @@ const invitation = () => {
id = applicationData.value.id;
}
uni.navigateTo({
url: "/pages/recommend/invitation/index?id=" + id
url: `/pages/recommend/invitation/index?id=${id}&jobId=${jobIdTemp}&userId=${userIdTemp}`
});
};
</script>
......@@ -383,17 +417,17 @@ const invitation = () => {
position: fixed;
bottom: 0;
left: 0;
z-index: 99;
gap: 32rpx;
width: 100%;
border-top: 2rpx solid #1f23290f;
z-index: 99;
.f-btn-box {
z-index: 99;
display: flex;
justify-content: space-around;
align-items: center;
background: #fff;
z-index: 99;
justify-content: space-around;
padding: 16rpx 0;
background: #ffffff;
}
button {
width: 294rpx;
......
<template>
<view class="container">
<view class="header">
<view class="title"> 工作/实习经历 </view>
<view class="desc mt20"> 从最近的一份工作/实习经历填写哦 </view>
</view>
<view class="form">
<!-- 公司名称 -->
<view class="form-item">
<view class="form-info">
<view class="label">公司名称</view>
<input type="text" v-model="params.companyName" placeholder="请输入" />
</view>
</view>
<!-- 在职时间 -->
<view class="form-item" bindtap="goToSelectJobType">
<view class="form-info">
<view class="label">在职时间</view>
<view class="time-wrapper flex-r-c mt20">
<wd-datetime-picker
:default-value="new Date().getTime()"
:maxDate="new Date().getTime()"
:minDate="new Date('1960/01/01').getTime()"
type="year-month"
v-model="params.startDate"
class="my-datetime-picker"
/>
<view class="line"></view>
<wd-datetime-picker
:default-value="new Date().getTime()"
:minDate="params.startDate"
:maxDate="new Date().getTime()"
type="year-month"
v-model="params.endDate"
/>
</view>
</view>
</view>
<!-- 职位类型 -->
<wd-col-picker
label="期望职位"
v-model="postionValue"
:columns="postionOpstion"
value-key="name"
label-key="name"
:column-change="columnChangePostion"
@confirm="handleConfirmPostion"
use-default-slot
>
<view class="form-item">
<view class="form-info">
<view class="label">职位类型</view>
<view :class="['cont', 'mt20', !jobTypeText ? 'placeholder-style' : '']">{{
jobTypeText || "请选择"
}}</view>
</view>
<view class="arrow"></view>
</view>
</wd-col-picker>
<!-- 工作内容 -->
<view class="form-item">
<view class="form-info">
<view class="label">工作内容</view>
<textarea v-model="params.content" placeholder="请输入" />
</view>
</view>
</view>
<!-- <view class="btn-wrapper" wx:if="{{isEdit && leng > 1}}">
<button class="del-btn ml32" bindtap="delWorkExperience">删除</button>
<button class="save-btn save-btn-samll" bindtap="save">保存</button>
</view> -->
<view class="btn-wrapper">
<button class="save-btn" @tap="save">保存</button>
</view>
</view>
</template>
<script setup>
import { ref } from "vue";
import { dictJobTypeApi } from "@/api/common";
import { saveWorkExperienceApi } from "@/api/user";
import _ from "lodash";
const jobTypeText = ref("");
const params = reactive({
companyName: "",
startDate: 0,
endDate: 0,
position: "",
content: ""
});
const postionValue = ref([]);
const postionOpstion = ref([]);
dictJobTypeApi({}).then(res => {
postionOpstion.value.push(res.data);
});
const columnChangePostion = ({ selectedItem, resolve, finish }) => {
if (selectedItem.children) {
resolve(selectedItem.children);
} else {
finish();
}
};
const handleConfirmPostion = ({ selectedItems }) => {
console.log(selectedItems);
jobTypeText.value = _.last(selectedItems).name;
};
const save = () => {
params.position = jobTypeText.value;
console.log(params);
saveWorkExperienceApi(JSON.stringify([params])).then(res => {
console.log(res);
if (res.code == 200) {
uni.showToast({
title: "保存成功",
icon: "success"
});
}
});
};
</script>
<style lang="scss" scoped>
.container {
min-height: 100vh;
padding: 0 32rpx;
background-color: #ffffff;
}
.container .header {
padding: 30rpx 0;
}
.container .header .title {
font-size: 32rpx;
font-weight: 600;
color: #213452;
}
.container .header .desc {
font-size: 24rpx;
color: #5c7396;
}
.form-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 36rpx 0;
border-bottom: 1rpx solid #e9e9e9;
}
.form-item .form-info {
width: 92%;
}
.form-item .form-info .label {
font-size: 24rpx;
color: #616c7a;
}
.form-item .form-info .cont {
font-size: 28rpx;
font-weight: 600;
color: #213452;
}
/* 保存按钮 */
.btn-wrapper {
position: fixed;
right: 0;
bottom: 0;
left: 0;
display: flex;
justify-content: center;
width: 100%;
padding: 12rpx 0;
border-top: 1rpx solid #ebebeb;
}
.btn-wrapper .save-btn {
width: 600rpx;
height: 72rpx;
font-size: 32rpx;
line-height: 72rpx;
color: #ffffff;
background: #1892ff;
border-radius: 8rpx;
}
.mt20 {
margin-top: 20rpx;
}
.ml32 {
margin-left: 32rpx;
}
.right-icon {
width: 48rpx;
height: 48rpx;
}
.color-grey {
font-size: 28rpx;
color: #a0afc3;
}
.placeholder-style {
font-size: 28rpx !important;
color: #a0afc3 !important;
}
.flex-r-c {
display: flex;
align-items: center;
justify-content: space-between;
}
.line {
width: 40rpx;
height: 2rpx;
margin: 0 80rpx;
background-color: #8693a3;
}
.overflow-ellipsis {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.btn-wrapper .del-btn {
width: 276rpx;
height: 72rpx;
font-size: 32rpx;
line-height: 72rpx;
color: #1892ff;
background: #ffffff;
border: 2rpx solid #1892ff;
border-radius: 8rpx;
}
.btn-wrapper .save-btn-samll {
width: 380rpx;
height: 72rpx;
}
:deep(.my-datetime-picker) {
.wd-icon-arrow-right {
display: none;
}
}
</style>
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