Commit 767df028 authored by 李明环(东信)'s avatar 李明环(东信)
parents 95b762d1 72074153
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
"files.eol": "\n", "files.eol": "\n",
"typescript.tsdk": "node_modules/typescript/lib", "typescript.tsdk": "node_modules/typescript/lib",
"[vue]": { "[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode" "editor.defaultFormatter": "octref.vetur"
}, },
"[typescript]": { "[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode" "editor.defaultFormatter": "esbenp.prettier-vscode"
......
...@@ -8,8 +8,4 @@ export const getArticleDetailApi = id => instance.post(`/article/detail/${id}`); ...@@ -8,8 +8,4 @@ export const getArticleDetailApi = id => instance.post(`/article/detail/${id}`);
export const getArticleTypesApi = type => instance.post(`/article/category/list/${type}`); export const getArticleTypesApi = type => instance.post(`/article/category/list/${type}`);
//招聘会报名状态 //招聘会报名状态
export const registerStatus = articleId => instance.post(`/jobFair/register/status/${articleId}`); export const registerStatus = articleId => instance.post(`/article/jobFair/check/${articleId}`);
\ No newline at end of file
// 参加招聘会
export const jobFairRegisterApi = params => instance.post(`/jobFair/register`, params);
...@@ -49,6 +49,17 @@ export const companyReviewInfo = params => instance.post("/b/company/review/info ...@@ -49,6 +49,17 @@ export const companyReviewInfo = params => instance.post("/b/company/review/info
export const companyReviewUpdate = params => instance.post("/b/company/review/update", params); export const companyReviewUpdate = params => instance.post("/b/company/review/update", params);
//职位列表 //职位列表
export const positionList = params => instance.post("/b/position/list", params); export const positionList = params => instance.post("/b/position/list", params);
//批量创建岗位
export const positionAddList = params => instance.post("/b/position/addList", params);
//批量更新职位
export const positionuUdateList = params => instance.post("/b/position/updateList", params);
//根据id获取反馈信息 //根据id获取反馈信息
export const feedbackById = params => instance.post(`/feedback/${params}`); export const feedbackById = params => instance.post(`/feedback/${params}`);
//根据id获取反馈信息
export const jobFair = params => instance.post(`/jobFair/${params}`);
// 参加招聘会
export const jobFairRegisterApi = params => instance.post(`/jobFair/register`, params);
...@@ -39,6 +39,7 @@ const iconPath = new URL(`../../static/image/icon/${props.icon}.png`, import.met ...@@ -39,6 +39,7 @@ const iconPath = new URL(`../../static/image/icon/${props.icon}.png`, import.met
font-size: 32rpx; font-size: 32rpx;
font-weight: 600; font-weight: 600;
line-height: 36rpx; line-height: 36rpx;
white-space: nowrap;
} }
.icon { .icon {
position: absolute; position: absolute;
......
...@@ -39,7 +39,7 @@ const props = defineProps({ ...@@ -39,7 +39,7 @@ const props = defineProps({
default: () => [] default: () => []
} }
}); });
const emit = defineEmits(["update:modelValue"]); const emit = defineEmits(["update:modelValue", "update"]);
// 激活类名 // 激活类名
const isActive = e => { const isActive = e => {
if (props.multiple) { if (props.multiple) {
...@@ -61,6 +61,8 @@ const onClickItem = e => { ...@@ -61,6 +61,8 @@ const onClickItem = e => {
} else { } else {
emit("update:modelValue", value); emit("update:modelValue", value);
} }
emit("update");
}; };
</script> </script>
......
...@@ -26,10 +26,14 @@ ...@@ -26,10 +26,14 @@
placeholder placeholder
safeAreaInsetBottom safeAreaInsetBottom
> >
<wd-button @tap="next" :disabled="data.bmStutas || !data.bm" round="false" class="foot-btn">{{ <!-- <wd-button @tap="next" :disabled="data.bmStutas || !data.bm" round="false" class="foot-btn">{{
!data.bmStutas && data.bm ? "立即报名" : data.bmStutas ? "已报名" : "报名结束" !data.bmStutas && data.bm ? "立即报名" : data.bmStutas ? "已报名" : "报名结束"
}}</wd-button> -->
<wd-button @tap="next" :disabled="!data.bm" round="false" class="foot-btn">{{
data.bm ? "立即报名" : "报名结束"
}}</wd-button> }}</wd-button>
</wd-tabbar> </wd-tabbar>
<wd-action-sheet v-model="show" :actions="actions" @close="close" @select="select" />
</div> </div>
</template> </template>
...@@ -39,6 +43,15 @@ import evn from "@/utils/config.js"; ...@@ -39,6 +43,15 @@ import evn from "@/utils/config.js";
import { ref } from "vue"; import { ref } from "vue";
import dayjs from "dayjs"; import dayjs from "dayjs";
const data = ref({}); const data = ref({});
const show = ref(false);
const actions = ref([
{
name: "更新岗位"
},
{
name: "新增岗位"
}
]);
let articleId = ref(null); let articleId = ref(null);
onLoad(({ id }) => { onLoad(({ id }) => {
articleId.value = id; articleId.value = id;
...@@ -53,12 +66,27 @@ onLoad(({ id }) => { ...@@ -53,12 +66,27 @@ onLoad(({ id }) => {
data.value.bm = false; data.value.bm = false;
} }
registerStatus(id).then(Res => { // registerStatus(id).then(Res => {
data.value.bmStutas = Res.data; // data.value.bmStutas = Res.data;
}); // });
}); });
console.log("data.value", data.value.bm, data.value.bmStutas);
}); });
function showActions() {}
function close() {
show.value = false;
}
function select({ item, index }) {
if (index == 0) {
xma.navigateTo({
url: `/pages/signUp/addPost?articleId=${articleId.value}&type=update`
});
} else {
xma.navigateTo({
url: `/pages/signUp/addPost?articleId=${articleId.value}&type=add`
});
}
}
onShow(() => { onShow(() => {
const currentTime = Date.now(); const currentTime = Date.now();
getArticleDetailApi(articleId.value).then(res => { getArticleDetailApi(articleId.value).then(res => {
...@@ -71,16 +99,14 @@ onShow(() => { ...@@ -71,16 +99,14 @@ onShow(() => {
data.value.bm = false; data.value.bm = false;
} }
registerStatus(articleId.value).then(Res => { // registerStatus(articleId.value).then(Res => {
data.value.bmStutas = Res.data; // data.value.bmStutas = Res.data;
}); // });
}); });
}); });
const form = ref();
function next() { function next() {
xma.navigateTo({ show.value = true;
url: `/pages/signUp/index?articleId=${articleId.value}`
});
} }
</script> </script>
......
...@@ -43,7 +43,7 @@ const login = () => { ...@@ -43,7 +43,7 @@ const login = () => {
}); });
} else { } else {
uni.navigateTo({ uni.navigateTo({
url: "/pages/user/businessLicense/fillIn" url: "/pages/user/businessLicense/fillIn?steps=1"
}); });
} }
}); });
......
...@@ -25,12 +25,10 @@ const login = async () => { ...@@ -25,12 +25,10 @@ const login = async () => {
// 已经判断是否注册过企业 // 已经判断是否注册过企业
if (userInfoRes.data) { if (userInfoRes.data) {
const { status } = userInfoRes.data; const { status } = userInfoRes.data;
console.log("status", typeof status);
switch (status) { switch (status) {
case 0: case 0:
uni.navigateTo({ uni.navigateTo({
url: `/pages/user/businessLicense/fillIn` url: `/pages/user/businessLicense/fillIn?steps=1`
}); });
break; break;
default: default:
...@@ -41,7 +39,7 @@ const login = async () => { ...@@ -41,7 +39,7 @@ const login = async () => {
} }
} else { } else {
uni.navigateTo({ uni.navigateTo({
url: `/pages/user/businessLicense/fillIn` url: `/pages/user/businessLicense/fillIn?steps=1`
}); });
} }
} }
......
<template> <template>
<div class="page"> <div class="page">
<NavBar :showIcon="true" :showTitle="true" title="岗位信息" backgroundBox="#FFFFFF"></NavBar> <NavBar :showIcon="true" :showTitle="true" title="岗位信息" backgroundBox="#FFFFFF"></NavBar>
<wd-tabs sticky :offset-top="0" v-model="tab"> <view class="from-1" v-if="pageType == 'update'">
<block v-for="item in tabList" :key="item.id"> <wd-checkbox-group v-model="value">
<wd-tab :title="item.name"> <view class="wd-cell-item" v-for="i in gwList" :key="i.id">
<view class="from-1" v-if="tab == 0"> <wd-checkbox :modelValue="i.id"></wd-checkbox>
<wd-checkbox-group v-model="value"> <view class="right">
<view class="wd-cell-item" v-for="i in gwList" :key="i.id"> <view class="position-name">{{ i.name }}</view>
<wd-checkbox :value="i"></wd-checkbox> <view class="tip">贵阳|{{ i.workDic }}{{ i.jobTypeName }}</view>
<view class="right"> </view>
<view class="position-name">{{ i.name }}</view> </view>
<view class="tip">贵阳|{{ i.workDic }}{{ i.jobTypeName }}</view> </wd-checkbox-group>
</view> </view>
<view v-else>
<view class="from-2" v-for="(item, index) in jobForm" :key="index">
<view class="title">新增岗位信息{{ index + 1 }}</view>
<selectbox
@update="initSalaryColumns"
:options="EnumWorkMode"
label-key="text"
value-key="code"
v-model="item.workMode"
></selectbox>
<!-- 职位类型 -->
<form-row>
<form-item title="职位类型">
<wd-col-picker
v-model="positionTypeValue"
:columns="columns"
:column-change="columnChange"
@confirm="params => handleConfirm(params, item)"
label-key="name"
value-key="id"
use-default-slot
>
<view :class="`inner flex-between ${item.jobTypeName ? '' : 'placeholder'}`">
{{ item.jobTypeName || "请选择职位类型" }}
</view> </view>
</wd-checkbox-group> </wd-col-picker>
</form-item>
</form-row>
<!-- 职位标题 -->
<form-row>
<form-item title="职位标题" icon="arrow">
<input type="text" v-model="item.name" placeholder="输入职位标题如“财务总监”" />
</form-item>
</form-row>
<!-- 职位描述 -->
<form-row>
<form-item title="职位描述" :border="false" icon="">
<textarea v-model="item.positionDesc" placeholder="请输入你的职位描述"></textarea>
</form-item>
</form-row>
<view class="transverse">
<form-item title="职位薪资" icon="">
<view
v-if="item.settlementType == 4"
:class="`inner flex-between ${item.salaryText ? '' : 'placeholder'}`"
@click="onOpen(item, index)"
>
{{ item.salaryText || "请选择月薪范围" }}
<!-- <view class="arrow"></view> -->
<checkbox
class="checkbox"
:value="item.negotiableSalary"
@click="onChecked(item)"
:checked="item.negotiableSalary == 1"
>面议</checkbox
>
</view>
<view
v-else
:class="`inner flex-between ${item.salaryText ? '' : 'placeholder'}`"
@click="onOpen(item, index)"
>
{{ item.salaryText || "请选择时薪范围" }}
<!-- <view class="arrow"></view> -->
<checkbox
class="checkbox"
:value="item.negotiableSalary"
@click="onChecked(item)"
:checked="item.negotiableSalary == 1"
>面议</checkbox
>
</view>
</form-item>
<form-item title="工作地址" icon="">
<wd-col-picker
v-model="cityValue"
:columns="cityOpstion"
value-key="code"
label-key="name"
:column-change="columnChangeCity"
@confirm="params => handleConfirmCity(params, item)"
use-default-slot
>
<p :class="{ placeholder: !item.cityText }" class="text-single">
{{ item.cityText || "请选择公司所在地" }}
</p>
</wd-col-picker>
</form-item>
</view>
<form-item title="是否提供食宿" icon="">
<wd-radio-group v-model="item.accommodation" inline shape="dot">
<wd-radio v-for="(v, n) in radioOpstion" :value="v.code" :key="n">{{ v.text }}</wd-radio>
</wd-radio-group>
</form-item>
<form-item title="福利待遇" icon="">
<view class="welfare">
<view
v-for="(el, nl) in item.myBenefits"
:class="`t ${el.active ? 'active' : ''}`"
@tap="onChangeBenefits(el, item)"
:key="nl"
>{{ el.text }}</view
>
</view> </view>
<view v-else>2</view> </form-item>
</wd-tab> <form-item title="身份要求" icon="">
</block> <wd-picker
</wd-tabs> :columns="identityPostion"
value-key="code"
label-key="text"
v-model="item.identityRequirement"
@confirm="params => handleConfirmIdentity(params, item)"
use-default-slot
>
<view :class="`inner flex-between ${item.identityText ? '' : 'placeholder'}`">
<view class="flex-align-center">
{{ item.identityText || "请选择身份要求" }}
</view>
</view>
</wd-picker>
</form-item>
<view class="transverse">
<form-item title="学历要求" icon="">
<wd-picker
:columns="educationPostion"
value-key="code"
label-key="text"
v-model="item.educationRequirement"
@confirm="params => handleConfirmEducation(params, item)"
use-default-slot
>
<view :class="`inner flex-between ${item.educationText ? '' : 'placeholder'}`">
<view class="flex-align-center">
{{ item.educationText || "请选择学历" }}
</view>
</view>
</wd-picker> </form-item
><form-item title="年龄要求" icon="">
<wd-col-picker
v-model="ageValue"
:columns="ageColumns"
:column-change="ageColumnChange"
@confirm="params => ageHandleConfirm(params, item)"
use-default-slot
>
<view :class="`inner flex-between ${item.ageText ? '' : 'placeholder'}`">
{{ item.ageText || "请选择年龄范围" }}
</view>
</wd-col-picker>
</form-item>
</view>
<form-row :fill="false">
<form-item title="专业技术职称" icon="edit">
<input
type="text"
@input="inputMajor($event, item)"
v-model="item.majorInputValue"
placeholder="请填写职称"
/>
</form-item>
<form-item title="">
<wd-picker
:columns="levelOptions"
value-key="text"
label-key="text"
v-model="majorSelectValue"
@confirm="params => handMajoration(params, item)"
use-default-slot
>
<view :class="`inner flex-between ${majorSelectValue ? '' : 'placeholder'}`">
<view class="flex-align-center" bind:tap="onShowIdentitySelect">
{{ majorSelectValue || "请选择职业等级" }}
</view>
</view>
</wd-picker>
</form-item>
</form-row>
<form-row :fill="false">
<form-item title="职业资格/技能等级证书" icon="edit">
<input
type="text"
@input="inputLeve($event, item)"
v-model="item.certificateInputValue"
placeholder="请填写职业资格"
/>
</form-item>
<form-item title="">
<wd-picker
:columns="levelOptions"
value-key="text"
label-key="text"
@confirm="params => handlelevelation(params, item)"
v-model="certificateSelectValue"
use-default-slot
>
<view :class="`inner flex-between ${item.certificateSelectValue ? '' : 'placeholder'}`">
<view class="flex-align-center">
{{ item.certificateSelectValue || "请选择职业资格等级" }}
</view>
</view>
</wd-picker>
</form-item>
</form-row>
<form-item title="特种作业证" icon="edit">
<input v-model="item.specialCertificates" type="text" placeholder="请填写特种作业证" />
</form-item>
<form-row :fill="false">
<form-item title="招聘人数" icon="edit">
<input type="number" v-model="item.recruitmentNumber" placeholder="请输入招聘人数" />
</form-item>
<form-item title="联系电话" icon="edit">
<input type="number" v-model="item.contactPhone" placeholder="请输入联系电话" />
</form-item> </form-row
><form-item title="联系人" icon="edit">
<input type="text" v-model="item.contactPerson" placeholder="请输入联系人" />
</form-item>
</view>
</view>
<wd-popup
v-model="salaryShow"
position="bottom"
custom-style="height:40%;border-radius: 20rpx;z-index:999;"
@close="handleClose"
>
<view class="title-box"
><view></view>
<view class="title">薪资选择</view>
<wd-icon @click="handleClose" name="close" size="30rpx"></wd-icon>
</view>
<wd-picker-view
@change="params => salaryHandleConfirm(params, item)"
use-default-slot
:columns="salaryColumns"
v-if="salaryShow"
v-model="salaryValue"
></wd-picker-view>
<view style="display: flex; justify-content: center; width: 100%"
><wd-button style="width: 80%" @click="handleClose" block :round="false">确定</wd-button></view
>
</wd-popup>
<wd-tabbar <wd-tabbar
v-if="tab == 0" v-if="pageType == 'update'"
custom-style="display: flex;justify-content: center !important;z-index:1;" custom-style="display: flex;justify-content: center !important;z-index:1;"
fixed fixed
placeholder placeholder
safeAreaInsetBottom safeAreaInsetBottom
> >
<view class="footer"> <button class="foot-btn" @click="openMask">下一步</button></view> <view class="footer"> <button class="foot-btn" @click="submitFrom">提交报名</button></view>
</wd-tabbar> </wd-tabbar>
<wd-tabbar <wd-tabbar
v-else v-else
...@@ -37,7 +271,7 @@ ...@@ -37,7 +271,7 @@
> >
<view class="footer"> <view class="footer">
<button class="foot-btn1" @click="addPost">继续添加</button> <button class="foot-btn1" @click="addPost">继续添加</button>
<button class="foot-btn" @click="openMask">提交报名</button></view <button class="foot-btn" @click="submitFrom">提交报名</button></view
> >
</wd-tabbar> </wd-tabbar>
</div> </div>
...@@ -45,34 +279,535 @@ ...@@ -45,34 +279,535 @@
<script setup> <script setup>
import { ref } from "vue"; import { ref } from "vue";
import { positionList } from "@/api/user"; import { positionList, positionAddList, positionuUdateList, jobFair, jobFairRegisterApi } from "@/api/user";
import Selectbox from "@/components/form/selectbox.vue";
import FormItem from "@/components/form/form-item.vue";
import FormRow from "@/components/form/form-row.vue";
import { dictJobTypeApi, getTreeListApi } from "@/api/common";
import { validateForm } from "@/utils/utils";
import town from "@/assets/town.json";
import { getEumData } from "@/utils/utils"; import { getEumData } from "@/utils/utils";
const tab = ref(0); const tab = ref(0);
const value = ref([]); const value = ref([]);
const gwList = ref([]); const gwList = ref([]);
const columns = ref([]);
/* 获取省市区 */
const cityOpstion = ref([]);
const cityValue = ref([]);
const cityText = ref("");
let citySelectedItems = [];
const salaryShow = ref(false);
const salaryValue = ref([]);
const identityPostion = ref([]);
const educationPostion = ref([]);
/* 福利待遇 */
/* 薪资选择 */
let salaryText = ref("");
const salaryColumns = ref([]);
/* 是否提供住宿 */
const radioOpstion = ref([]);
const certificateInputValue = ref("");
const certificateSelectValue = ref("");
const majorInputValue = ref("");
const majorSelectValue = ref("");
/* 职业类型 */
const positionTypeValue = ref([]);
/* 兼职全职枚举 */
const EnumWorkMode = ref([]); const EnumWorkMode = ref([]);
const articleIds = ref("");
const pageType = ref("");
/* 等级选择项 */
const levelOptions = ref(["初级", "中级", "高级", "高级以上"]);
const ageValue = ref([]);
const ageColumns = ref([]);
const jobForm = ref([
{
workMode: 1,
name: "",
jobTypeId: null,
jobTypePid: "",
jobTypeName: "",
postitDesc: "",
negotiableSalary: 0,
settlementType: 4,
minSalary: null,
maxSalary: null,
benefits: "",
identityRequirement: 1,
educationRequirement: 0,
minAgeRequirement: 0,
maxAgeRequirement: 0,
recruitmentNumber: 1,
accommodation: 0,
provinceCode: "",
cityCode: "",
districtCode: "",
street: "",
address: "",
contactPerson: "",
contactPhone: "",
positionalTitle: "",
professionalCertificates: "",
specialCertificates: "",
articleId: articleIds.value,
salaryText: "", //显示
myBenefits: [
{
text: "年底双薪",
active: false
},
{
text: "节假日福利",
active: false
},
{
text: "旅游团建",
active: false
},
{
text: "生日福利",
active: false
},
{
text: "五险一金",
active: false
},
{
text: "三险一金",
active: false
}
]
}
]);
onLoad(({ articleId, type }) => {
articleIds.value = articleId;
pageType.value = type;
jobForm.value[0].articleId = articleId;
jobFair(articleId).then(res => {
value.value = res.data.positionIds.split(",");
console.log("res", res);
});
});
const tabList = ref([ const tabList = ref([
{ id: 213213, name: "选择已有岗位", type: 1 }, { id: 213213, name: "选择已有岗位", type: 1 },
{ id: 1651651, name: "新增岗位", type: 2 } { id: 1651651, name: "新增岗位", type: 2 }
]); ]);
const getEnumCertificatesLevel = async () => {
levelOptions.value = await getEumData("EnumCertificatesLevel");
};
getEnumCertificatesLevel();
const initPostion = async () => {
identityPostion.value = await getEumData("EnumIdentityRequirement");
educationPostion.value = await getEumData("EnumEducationRequirement");
};
initPostion();
function handleClose() {
if (salaryValue.value[1] < salaryValue.value[0]) {
xma.showToast({
title: "最高薪资不能小于最低薪资",
icon: "none"
});
return;
}
salaryShow.value = false;
}
const initageColumns = () => {
const temp = [
{
value: "不限",
label: "不限",
next: false
}
];
for (let i = 16; i < 81; i++) {
temp.push({
value: i,
label: i + "岁",
next: true
});
}
ageColumns.value.push(temp);
};
initageColumns();
const getEnumWorkMode = async () => { const getEnumWorkMode = async () => {
EnumWorkMode.value = await getEumData("EnumWorkMode"); EnumWorkMode.value = await getEumData("EnumWorkMode");
console.log("EnumWorkMode.value", EnumWorkMode.value);
}; };
getTreeListApi({ provinceName: "贵州省" }).then(res => {
cityOpstion.value.push(res.data[0].children);
});
getEnumWorkMode(); getEnumWorkMode();
positionList({}).then(res => { positionList({}).then(res => {
res.data = res.data.map(item => { res.data = res.data.map(item => {
item.workDic = EnumWorkMode.value.find(v => v.code == item.workMode).text; item.workDic = EnumWorkMode.value.find(v => v.code == item.workMode).text;
return item; return item;
}); });
// res.data = res.data.filter(item => {
// return !item.articleId;
// });
gwList.value = res.data; gwList.value = res.data;
}); });
const getJobType = () => {
dictJobTypeApi({}).then(res => {
columns.value.push(res.data);
});
};
getJobType();
const initRadioOpstion = async () => {
radioOpstion.value = await getEumData("EnumAccommodation");
};
initRadioOpstion();
// 职业类型
const columnChange = ({ selectedItem, resolve, finish }) => {
if (selectedItem.children?.length > 0) {
resolve(selectedItem.children);
} else {
finish();
}
};
const handleConfirm = (params, item) => {
const { selectedItems, value } = params;
item.jobTypeName = selectedItems[1].name;
item.jobTypeId = selectedItems[1].id;
item.jobTypePid = selectedItems[0].id;
console.log("selectedItems", item.jobTypeName, item.jobTypeId, item.jobTypePid);
};
// 职业类型
// 地址
const columnChangeCity = ({ selectedItem, resolve, finish }) => {
if (selectedItem.children) {
resolve(selectedItem.children);
} else {
// 选择街道
if (selectedItem.children === null && town[selectedItem.code]) {
resolve(town[selectedItem.code].map((v, i) => ({ ...v, code: i })));
} else {
finish();
}
}
};
const handleConfirmCity = (params, item) => {
const { selectedItems } = params;
item.cityText = selectedItems.map(v => v.name || "").join("-");
citySelectedItems = selectedItems;
const [city, district, street] = selectedItems;
item.address = selectedItems.map(v => v.name || "").join("");
item.provinceCode = 520000;
item.cityName = city.name;
item.cityCode = city.code;
item.districtCode = district.code;
item.street = street ? street.name : "";
console.log("item.cityName", item.cityName);
};
// 地址
// 薪资-fun
const activeIndex = ref(0);
const initSalaryColumns = () => {
salaryColumns.value = [];
let index = activeIndex.value;
let multiple = 1;
// 确定 settlementType
jobForm.value[index].settlementType = jobForm.value[index].workMode === 2 ? 1 : 4;
// 设置基准值
multiple = jobForm.value[index].settlementType === 1 ? 50 : 1000;
const temp = [];
const maxSalary = jobForm.value[index].settlementType == 1 ? 1000 : 50 * multiple;
if (jobForm.value[index].settlementType == 1) {
temp.push({
value: 10,
label: "10",
next: true
});
}
// 生成序列
for (let i = 1; i * multiple <= maxSalary; i++) {
const currentValue = i * multiple;
temp.push({
value: currentValue,
label: jobForm.value[index].settlementType == 1 ? currentValue : `${currentValue / 1000}k`,
next: true
});
}
// 确保 columns.value 是一个数组
if (!Array.isArray(salaryColumns.value)) {
salaryColumns.value = [];
}
// 清空原来的数组,以确保只包含新的数据
salaryColumns.value.length = 0;
// 将 temp 复制两次,推入 columns.value
salaryColumns.value.push([...temp], [...temp]);
};
initSalaryColumns();
function onChecked(item) {
item.negotiableSalary = item.negotiableSalary == 1 ? 0 : 1;
// 如果勾选了面议
if (item.negotiableSalary == 1) {
salaryText.value = "";
item.maxSalary = 0;
item.minSalary = 0;
item.negotiableSalary = 1;
} else {
item.negotiableSalary = 0;
}
}
function onOpen(item, index) {
salaryValue.value = [];
activeIndex.value = index;
initSalaryColumns();
if (item.negotiableSalary == 1) return;
salaryShow.value = true;
}
const salaryHandleConfirm = (params, item) => {
let multiple = 1;
multiple = jobForm.value[activeIndex.value].settlementType === 1 ? 50 : 1000;
const { selectedItems, value } = params;
if (value[1] < value[0]) {
xma.showToast({
title: "最高薪资不能小于最低薪资",
icon: "none"
});
return;
}
jobForm.value[activeIndex.value].negotiableSalary = 0;
if (jobForm.value[activeIndex.value].settlementType === 1) {
jobForm.value[activeIndex.value].salaryText = value.join("~");
} else {
jobForm.value[activeIndex.value].salaryText = value.map(num => `${num / multiple}k`).join("~");
}
const [min, max] = value;
if (max) {
jobForm.value[activeIndex.value].maxSalary = max;
jobForm.value[activeIndex.value].minSalary = min;
jobForm.value[activeIndex.value].negotiableSalary = 0;
} else {
jobForm.value[activeIndex.value].maxSalary = 0;
jobForm.value[activeIndex.value].minSalary = 0;
jobForm.value[activeIndex.value].negotiableSalary = 1;
}
};
const onChangeBenefits = (el, item) => {
el.active = !el.active;
item.benefits = item.myBenefits
.filter(benefit => benefit.active) // 只保留选中的
.map(benefit => benefit.text) // 获取文本
.join(", ");
};
// 选择身份
const handleConfirmIdentity = (params, item) => {
const { selectedItems, value } = params;
item.identityText = selectedItems.text;
};
const ageColumnChange = ({ selectedItem, resolve, finish }) => {
console.log(selectedItem);
if (selectedItem.next) {
const temp = [];
for (let i = 1; i < 50; i++) {
temp.push({
value: i + selectedItem.value,
label: i + selectedItem.value + "岁",
next: false
});
resolve(temp);
}
} else {
finish();
}
};
const ageHandleConfirm = (params, item) => {
const { selectedItems, value } = params;
item.ageText = value.join("~");
const [min, max] = value;
if (max) {
// 没有选择不限
item.maxAgeRequirement = max;
item.minAgeRequirement = min;
} else {
item.maxAgeRequirement = 0;
item.minAgeRequirement = 0;
}
};
// 选择学历
const handleConfirmEducation = (params, item) => {
const { selectedItems, value } = params;
item.educationText = selectedItems.text;
};
const inputLeve = (e, item) => {
const { value } = e.detail;
item.certificateInputValue = value;
item.professionalCertificates = value + "-" + certificateSelectValue.value;
};
const handlelevelation = (params, item) => {
const { selectedItems, value } = params;
item.professionalCertificates = certificateInputValue.value + "-" + value;
};
const inputMajor = (e, item) => {
const { value } = e.detail;
item.majorInputValue = value;
item.positionalTitle = value + "-" + majorSelectValue.value;
};
const handMajoration = (params, item) => {
const { selectedItems, value } = params;
item.positionalTitle = majorInputValue.value + "-" + value;
};
const selectedJobs = ref([]);
const submitFrom = () => {
if (pageType.value == "update") {
let updateArr = gwList.value.filter(item => value.value.includes(String(item.id)));
updateArr = updateArr.map(item => {
return item.id;
});
if (updateArr.length > 0) {
xma.showLoading({
title: "提交中...",
mask: true
});
jobFairRegisterApi({ positionIdList: updateArr, articleId: articleIds.value }).then(res => {
xma.hideLoading();
if (res.code == 200) {
xma.navigateBack({
delta: 1
});
}
});
} else {
xma.showToast({
title: "请选择职位",
icon: "none"
});
}
} else {
console.log("jobForm.value", jobForm.value);
const allValid =
jobForm.value.length > 0 &&
jobForm.value.every(item => {
return (
item &&
validateForm(item, [
"jobTypeId",
"jobTypeName",
"name",
"positionDesc",
"address",
"identityRequirement",
"educationRequirement",
"contactPhone",
"contactPerson"
])
);
});
if (allValid) {
xma.showLoading({
title: "提交中...",
mask: true
});
positionAddList(jobForm.value).then(res => {
xma.hideLoading();
if (res.code == 200) {
xma.navigateBack({
delta: 1
});
}
});
} else {
xma.showToast({
title: "请填写完整",
icon: "none"
});
}
}
};
function openMask() {
tab.value = 1;
}
function addPost() {
jobForm.value.push({
workMode: 1,
name: "",
jobTypeId: null,
jobTypePid: "",
jobTypeName: "",
postitDesc: "",
negotiableSalary: 0,
settlementType: 4,
minSalary: null,
maxSalary: null,
benefits: "",
identityRequirement: 1,
educationRequirement: null,
minAgeRequirement: null,
maxAgeRequirement: null,
recruitmentNumber: 1,
accommodation: 0,
provinceCode: "",
cityCode: "",
districtCode: "",
street: "",
address: "",
contactPerson: "",
contactPhone: "",
positionalTitle: "",
professionalCertificates: "",
specialCertificates: "",
articleId: articleIds.value,
salaryText: "", //显示
myBenefits: [
{
text: "年底双薪",
active: false
},
{
text: "节假日福利",
active: false
},
{
text: "旅游团建",
active: false
},
{
text: "生日福利",
active: false
},
{
text: "五险一金",
active: false
},
{
text: "三险一金",
active: false
}
]
});
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
page {
}
.page { .page {
width: 100%; width: 100%;
.title-box {
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: space-between;
padding: 32rpx;
}
.from-1 { .from-1 {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
...@@ -99,6 +834,70 @@ positionList({}).then(res => { ...@@ -99,6 +834,70 @@ positionList({}).then(res => {
} }
} }
} }
.from-2 {
width: 100%;
box-sizing: border-box;
display: flex;
flex-direction: column;
padding: 32rpx;
margin-top: 32rpx;
.title {
font-size: 48rpx;
font-weight: 500;
color: #1b2026;
margin-bottom: 32rpx;
}
textarea {
box-sizing: border-box;
width: 100%;
padding: 32rpx;
background: #f2f5fb;
border-radius: 8rpx;
}
.placeholder {
width: 50%;
text-wrap: nowrap;
}
.checkbox {
white-space: nowrap;
flex-shrink: 0;
}
.transverse {
display: flex;
align-items: baseline;
justify-content: space-between;
:deep(.uni-checkbox-input) {
border-radius: 50% !important;
margin-left: 20rpx;
flex-shrink: 0;
}
}
.welfare {
display: flex;
flex-wrap: wrap;
gap: 24rpx;
view {
gap: 12rpx;
padding: 12rpx 20rpx;
font-size: 24rpx;
line-height: 36rpx;
color: #1f86ff;
background: rgb(31 134 255 / 10%);
border-radius: 8rpx;
&.active {
color: #ffffff;
background-color: #1f86ff;
}
}
}
.text-single {
width: 100%;
margin-left: 20rpx;
white-space: wrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
.footer { .footer {
display: flex; display: flex;
align-items: center; align-items: center;
......
...@@ -38,14 +38,16 @@ import { getCompanyInfoApi } from "@/api/user"; ...@@ -38,14 +38,16 @@ import { getCompanyInfoApi } from "@/api/user";
import { useStore } from "./store"; import { useStore } from "./store";
const pinias = useStore(); const pinias = useStore();
const enterpriseInformation = ref({}); const enterpriseInformation = ref({});
onLoad(options => { const articleIds = ref("");
onLoad(({ articleId }) => {
articleIds.value = articleId;
getCompanyInfoApi().then(res => { getCompanyInfoApi().then(res => {
enterpriseInformation.value = res.data; enterpriseInformation.value = res.data;
}); });
}); });
const next = () => { const next = () => {
uni.navigateTo({ uni.navigateTo({
url: "/pages/signUp/addPost" url: `/pages/signUp/addPost?articleId=${articleIds.value}`
}); });
}; };
</script> </script>
......
...@@ -178,13 +178,6 @@ const nextStep = () => { ...@@ -178,13 +178,6 @@ const nextStep = () => {
default: default:
break; break;
} }
if (flag) {
uni.showToast({
title: "请先完成操作",
icon: "none"
});
return;
}
}; };
/* 选择图片 */ /* 选择图片 */
const chooseImage = sourceType => { const chooseImage = sourceType => {
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
<wd-overlay :show="displayExpired"> <wd-overlay :show="displayExpired">
<view class="popup-display-expired"> <view class="popup-display-expired">
<view class="sumbit-error"> <view class="sumbit-error">
<image src="@/static/image/user/displayExpired.png"></image> <view class="title">企业信息已失效</view> <image class="a" src="@/static/image/user/displayExpired.png"></image> <view class="title">企业信息已失效</view>
<view class="txt" <view class="txt"
>由于您超过 <text style="color: #1f86ff">1</text> 月未登录 现已将您的账号禁用 您可完成申述后继续使用</view >由于您超过 <text style="color: #1f86ff">1</text> 月未登录 现已将您的账号禁用 您可完成申述后继续使用</view
> >
...@@ -40,6 +40,17 @@ ...@@ -40,6 +40,17 @@
> >
</view> </view>
</wd-overlay> </wd-overlay>
<wd-overlay :show="showOut">
<view class="popup-display-expired">
<view class="sumbit-error">
<image class="u" src="@/static/image/user/user-out.png"></image> <view class="title"></view>
<view class="txt">您的大堂经理职位 匹配的人员已超过7天未处理</view>
<view class="btn-box1">
<view class="tz-btn btn" @tap="goToHome('/pages/recommend/index')">去看看</view>
</view></view
>
</view>
</wd-overlay>
<div class="user-container"> <div class="user-container">
<view class="bg"></view> <view class="bg"></view>
<!-- 用户信息 --> <!-- 用户信息 -->
...@@ -81,6 +92,7 @@ import { getEnumText } from "@/utils/utils"; ...@@ -81,6 +92,7 @@ import { getEnumText } from "@/utils/utils";
import { ref, reactive } from "vue"; import { ref, reactive } from "vue";
import evn from "@/utils/config.js"; import evn from "@/utils/config.js";
const show = ref(false); const show = ref(false);
const showOut = ref(false);
const displayExpired = ref(false); const displayExpired = ref(false);
let name = ref(""); let name = ref("");
let id = ref(""); let id = ref("");
...@@ -95,6 +107,16 @@ const navigateTo = (url, fn) => { ...@@ -95,6 +107,16 @@ const navigateTo = (url, fn) => {
url url
}); });
}; };
const goToHome = (url, fn) => {
showOut.value = false;
if (fn) {
fn();
}
url &&
xma.switchTab({
url
});
};
const navList = reactive([ const navList = reactive([
{ {
icon: new URL("@/static/image/user/history.png", import.meta.url).href, icon: new URL("@/static/image/user/history.png", import.meta.url).href,
...@@ -104,14 +126,14 @@ const navList = reactive([ ...@@ -104,14 +126,14 @@ const navList = reactive([
auditStatus: "" auditStatus: ""
}, },
{ {
icon: new URL("@/static/image/user/history.png", import.meta.url).href, icon: new URL("@/static/image/user/post.png", import.meta.url).href,
url: "/pages/user/positionManagement/index", url: "/pages/user/positionManagement/index",
text: "职位管理", text: "职位管理",
subText: "", subText: "",
auditStatus: "" auditStatus: ""
}, },
{ {
icon: new URL("@/static/image/user/history.png", import.meta.url).href, icon: new URL("@/static/image/user/position.png", import.meta.url).href,
url: "/pages/recommend/releasePostion/step1", url: "/pages/recommend/releasePostion/step1",
text: "岗位发布", text: "岗位发布",
subText: "", subText: "",
...@@ -129,20 +151,20 @@ const navList = reactive([ ...@@ -129,20 +151,20 @@ const navList = reactive([
removeToken(); removeToken();
}, },
text: "退出登录" text: "退出登录"
},
{
icon: new URL("@/static/image/user/loginout.png", import.meta.url).href,
url: "/pages/login/test",
fn: () => {
removeToken();
},
text: "退出登录(去测试登录)"
},
{
icon: new URL("@/static/image/user/loginout.png", import.meta.url).href,
url: "/pages/user/businessLicense/fillIn",
text: "企业认证"
} }
// {
// icon: new URL("@/static/image/user/loginout.png", import.meta.url).href,
// url: "/pages/login/test",
// fn: () => {
// removeToken();
// },
// text: "退出登录(去测试登录)"
// },
// {
// icon: new URL("@/static/image/user/loginout.png", import.meta.url).href,
// url: "/pages/user/businessLicense/fillIn",
// text: "企业认证"
// }
]); ]);
/* 个人信息 */ /* 个人信息 */
const userInfo = ref({}); const userInfo = ref({});
...@@ -246,6 +268,13 @@ onShow(() => { ...@@ -246,6 +268,13 @@ onShow(() => {
width: 30rpx; width: 30rpx;
height: 30rpx; height: 30rpx;
} }
.u {
width: 274rpx;
height: 192rpx;
position: absolute;
top: 20rpx;
right: 20rpx;
}
.title { .title {
padding: 32rpx 0; padding: 32rpx 0;
font-size: 36rpx; font-size: 36rpx;
...@@ -303,11 +332,18 @@ onShow(() => { ...@@ -303,11 +332,18 @@ onShow(() => {
padding: 0 32rpx 32rpx; padding: 0 32rpx 32rpx;
background-color: #ffffff; background-color: #ffffff;
border-radius: 10rpx; border-radius: 10rpx;
image {
.a {
position: absolute; position: absolute;
width: 448rpx; width: 448rpx;
height: 448rpx; height: 448rpx;
} }
.u {
width: 274rpx;
height: 192rpx;
position: absolute;
top: 120rpx;
}
.title { .title {
padding: 32rpx 0; padding: 32rpx 0;
margin-top: 300rpx; margin-top: 300rpx;
...@@ -342,6 +378,25 @@ onShow(() => { ...@@ -342,6 +378,25 @@ onShow(() => {
background: #1f86ff; background: #1f86ff;
} }
} }
.btn-box1 {
display: flex;
align-items: center;
margin-top: 40rpx;
justify-content: center;
.btn {
box-sizing: border-box;
padding: 14rpx 34rpx;
border-radius: 12rpx;
}
.cancel-button {
color: #1f86ff;
background: rgb(31 134 255 / 10%);
}
.tz-btn {
color: #ffffff;
background: #1f86ff;
}
}
} }
} }
.nav-bar { .nav-bar {
......
src/static/image/user/history.png

1.02 KB | W: | H:

src/static/image/user/history.png

1.14 KB | W: | H:

src/static/image/user/history.png
src/static/image/user/history.png
src/static/image/user/history.png
src/static/image/user/history.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -71,6 +71,7 @@ export const formatTimestamp = (timestamp, formatString = "YYYY-MM-DD hh:mm:ss") ...@@ -71,6 +71,7 @@ export const formatTimestamp = (timestamp, formatString = "YYYY-MM-DD hh:mm:ss")
export const validateForm = (formData, requiredFields) => { export const validateForm = (formData, requiredFields) => {
const phoneRegex = /^1[3-9]\d{9}$/; // 正则表达式匹配中国大陆手机号码 const phoneRegex = /^1[3-9]\d{9}$/; // 正则表达式匹配中国大陆手机号码
for (const field of requiredFields) { for (const field of requiredFields) {
const fieldValue = formData[field];
if (field === "contactPhone" || field === "phone") { if (field === "contactPhone" || field === "phone") {
if (!formData[field] || !phoneRegex.test(formData[field])) { if (!formData[field] || !phoneRegex.test(formData[field])) {
uni.showToast({ uni.showToast({
...@@ -80,7 +81,7 @@ export const validateForm = (formData, requiredFields) => { ...@@ -80,7 +81,7 @@ export const validateForm = (formData, requiredFields) => {
}); });
return false; return false;
} }
} else if (!formData[field]) { } else if (fieldValue === null || fieldValue === undefined || fieldValue === "") {
console.log(field); console.log(field);
uni.showToast({ uni.showToast({
......
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