企业端bug

parent 8c37f24e
......@@ -35,6 +35,10 @@ export const jobReleaseApi = id => instance.post(`/company/job/release/${id}`);
// 职位下线
export const jobOfflineApi = id => instance.post(`/company/job/offline/${id}`);
// 职位置顶
export const jobOfftopApi = id => instance.post(`/company/job/top/${id}`);
// 职位置顶
export const jobOffuntopApi = id => instance.post(`/company/job/untop/${id}`);
// 拒绝申请
export const rejectApplicationApi = id => instance.post(`/company/job/rejectApplication/${id}`);
......@@ -37,6 +37,8 @@ export const feedbackAdd = params => instance.post("/feedback/add/business", par
//我的反馈列表
export const feedbackList = params => instance.post("/feedback/list", params);
//获取公司申诉信息
export const appealInfo = params => instance.post("/company/appeal/info", params);
//根据id获取反馈信息
export const feedbackById = params => instance.post(`/feedback/${params}`);
<template>
<NavBar :showIcon="false" :showTitle="true" title="动态"></NavBar>
<div class="policy">
<div class="tab-name" :enable-flex="true" :scroll-x="true">
<div class="tab-name" :style="{ position: sticky, top: contentHeight }" :enable-flex="true" :scroll-x="true">
<view :class="{ item: 1, active: active == v.id }" v-for="v in typeList" :key="v.id" @click="changeType(v)">{{
v.name
}}</view>
</div>
<scroll-view :scroll-y="true" class="content" @scrolltolower="feedbackListFn()">
<wd-status-tip v-if="list.length == 0" image="../.././static/image/enmpty-dt.png" tip="暂无动态" />
<article-list :list="list"></article-list>
</scroll-view>
</div>
......@@ -16,6 +17,7 @@
import articleList from "@/components/articleList/index.vue";
import { getArticleListApi, getArticleTypesApi } from "@/api/article.js";
import { reactive, ref } from "vue";
const contentHeight = ref("100rpx");
const active = ref("");
const typeList = ref([{ id: "", name: "全部" }]);
getArticleTypesApi(2).then(res => {
......@@ -23,21 +25,30 @@ getArticleTypesApi(2).then(res => {
});
const changeType = type => {
active.value = type.id;
pageNo = 1;
list.value.splice(0, list.length);
flag = false;
feedbackListFn();
refresh().then(res => {
feedbackListFn();
});
};
onLoad(() => {
xma.xh.getSystemInfo({
success(res) {
// console.log('设备信息', res); // 设备信息
}
});
xma.xh.getMenuButtonBoundingClientRect({
success(res) {
contentHeight.value = (res.top + res.bottom) / 2 + 25 + "px";
}
});
});
/* 文章 */
// 判断是否还有数据
let pageNo = 1;
let flag = false;
const list = ref([]);
const params = ref({
pageNo: 1,
pageSize: 10,
isEnd: false,
type: 1,
type: 2,
categoryId: active.value
});
onShow(() => {
......@@ -68,6 +79,8 @@ const refresh = () => {
list.value = [];
params.value.pageNo = 1;
params.value.isEnd = false;
params.value.categoryId = active.value;
resolve();
});
};
......
......@@ -36,10 +36,8 @@ const login = () => {
});
}
setToken(data.data.token);
console.log("data", data);
getLoginUserApi().then(el => {
if (el.data && el.data.companyId) {
if (el.data && el.data.status !== 0) {
uni.switchTab({
url: "/pages/user/index"
});
......
......@@ -23,7 +23,8 @@ const login = async () => {
setToken(loginRes.data.token);
const userInfoRes = await getLoginUserApi();
// 已经判断是否注册过企业
if (userInfoRes.data?.companyId) {
if (userInfoRes.data.status !== 0) {
uni.switchTab({
url: "/pages/user/index"
});
......
......@@ -37,9 +37,15 @@ const params = ref({
isEnd: false
});
const goToDetail = item => {
xma.navigateTo({
url: `/pages/user/feedbackDetails/index?id=${item.id}`
});
if (item.type == 3 || item.type == 4) {
xma.navigateTo({
url: `/pages/user/myCompany/licenseInfo?id=${item.id}`
});
} else if (item.type == 2) {
xma.navigateTo({
url: `/pages/user/feedbackDetails/index?id=${item.id}`
});
}
};
const refresh = () => {
......
......@@ -7,6 +7,7 @@
}}</view>
</div>
<scroll-view :scroll-y="true" class="content" @scrolltolower="feedbackListFn">
<wd-status-tip v-if="list.length == 0" image="../.././static/image/enmpty-dt.png" tip="暂无更多" />
<article-list :list="list"></article-list>
</scroll-view>
</div>
......
<template>
<NavBar :showIcon="true" :showTitle="true" title="投递管理" backgroundBox="#FFFFFF"></NavBar>
<div class="page">
<div class="filter-bar flex-between">
<p
......
......@@ -113,15 +113,19 @@
</view>
</view>
<view class="btn-list flex-between">
<view class="flex-center">
<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">
<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.id, v.status)">
<view class="flex-center" @click="switchJobStatus(v)">
<image :class="{ rotate: v.status != 3 }" src="@/static/image/icon/download.png" mode="" />
{{ v.status == 3 ? "下线" : "上线" }}
</view>
......@@ -158,18 +162,22 @@ import {
getListStatisticsApi,
jobReleaseApi,
jobOfflineApi,
getJobByIdApi
getJobByIdApi,
jobOfftopApi,
jobOffuntopApi
} 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";
const { setForm, setFormDataKey } = useReleasePostionStore();
/* tab */
const pinias = useReleasePostionStore();
const activeTab = ref("求职推荐");
const changeActiveTab = tab => {
activeTab.value = tab;
getTopFilter();
getJobList(activeTopFilter.value);
};
/* 获取职位列表 */
......@@ -191,6 +199,20 @@ getJobListApi().then(res => {
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);
}
});
}
/* 获取推荐 */
const applicationList = ref([]);
const getApplicationListParams = ref({
......@@ -298,6 +320,8 @@ const confirmFilter = () => {
};
/* 跳转到发布职位 */
const releasePostion = () => {
console.log("useReleasePostionStore", useReleasePostionStore);
uni.navigateTo({
url: "/pages/recommend/releasePostion/step1"
});
......@@ -320,8 +344,12 @@ const getTopFilter = async () => {
topFilter.value = data;
};
const getJobList = (status = "") => {
xma.showLoading({
title: "加载中..."
});
getListStatisticsApi({ status }).then(res => {
console.log("resresres", res);
xma.hideLoading();
res.data.forEach(v => {
const { data: workModeText } = useAsync(getEnumText("EnumWorkMode", v.workMode));
const { data: statusText } = useAsync(getEnumText("EnumJobStatus", v.status));
......@@ -331,15 +359,19 @@ const getJobList = (status = "") => {
jobList.value = res.data;
});
};
getTopFilter();
getJobList();
onShow(() => {
getTopFilter();
getJobList();
});
/* 职位上下线 */
const switchJobStatus = async (id, status) => {
const switchJobStatus = async v => {
let res = null;
if (status == 3) {
res = await jobOfflineApi(id);
} else if (status == 4 || status == 1) {
res = await jobReleaseApi(id);
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: "该状态不能操作",
......@@ -403,7 +435,7 @@ const editJob = ({ id, status }) => {
contactPerson,
contactPhone
} = res.data;
setForm({
pinias.setForm({
workMode,
jobName,
jobType,
......@@ -431,7 +463,7 @@ const editJob = ({ id, status }) => {
contactPerson,
contactPhone
});
setFormDataKey("id", id);
pinias.setFormDataKey("id", id);
uni.navigateTo({
url: `/pages/recommend/releasePostion/step1?id=${id}`
});
......@@ -752,6 +784,12 @@ const editJob = ({ id, status }) => {
width: 28rpx;
height: 28rpx;
}
.top {
width: 20rpx;
height: 20rpx;
margin-right: 3rpx;
}
view {
flex: 1;
font-size: 24rpx;
......
<template>
<div class="page">
<navBar>
<template #left>
<div class="arrow" @click="back"></div>
</template>
<template #title>我的</template>
</navBar>
<NavBar
:showIcon="true"
:showTitle="true"
backIcon="#fff"
textColor="#fff"
title="邀请面试"
backgroundBox="transparent"
></NavBar>
<view class="bg"></view>
<view class="card">
......
......@@ -11,7 +11,7 @@
<view>兼职</view> -->
<view
v-for="(item, index) in EnumWorkMode"
:class="item.code == formData.workMode ? 'active' : ''"
:class="item.code == pinias.formData.workMode ? 'active' : ''"
@tap="changeWorkMode(item.code)"
:key="index"
>{{ item.text }}
......@@ -28,8 +28,8 @@
value-key="id"
use-default-slot
>
<view :class="`inner flex-between ${formData.jobTypeText ? '' : 'placeholder'}`">
{{ formData.jobTypeText || "请选择职位类型" }}
<view :class="`inner flex-between ${pinias.formData.jobTypeText ? '' : 'placeholder'}`">
{{ pinias.formData.jobTypeText || "请选择职位类型" }}
<view class="arrow"></view>
</view>
</wd-col-picker>
......@@ -37,12 +37,17 @@
<view class="form-item">
<view class="form-item-title">职位标题</view>
<view class="inner flex-between">
<input v-model="formData.jobName" type="text" placeholder-class="placeholder" placeholder="请输入职业标题" />
<input
v-model="pinias.formData.jobName"
type="text"
placeholder-class="placeholder"
placeholder="请输入职业标题"
/>
</view>
</view>
<view class="form-item describe" style="border: 0">
<view class="form-item-title">职位描述</view>
<textarea v-model="formData.jobDesc" placeholder="请输入你的职位描述" />
<textarea maxlength="500" v-model="pinias.formData.jobDesc" placeholder="请输入你的职位描述" />
</view>
</view>
......@@ -51,7 +56,7 @@
</view> -->
<wd-tabbar
@tap="next"
custom-style="display: flex;justify-content: center !important;"
custom-style="display: flex;justify-content: center !important;z-index:1;"
fixed
placeholder
safeAreaInsetBottom
......@@ -64,12 +69,20 @@
<script setup>
import { getEumData } from "@/utils/utils";
import { ref } from "vue";
import { useReleasePostionStore } from "./store";
import { dictJobTypeApi } from "@/api/common";
import { getJobByIdApi } from "@/api/postion";
import { validateForm } from "@/utils/utils";
import _ from "lodash";
const { formData, setFormDataKey, setForm } = useReleasePostionStore();
import { useReleasePostionStore } from "./store";
const pinias = useReleasePostionStore();
onLoad(option => {
const { id } = option;
if (!id) {
pinias.resetForm();
}
});
/* 兼职全职枚举 */
const EnumWorkMode = ref([]);
const getEnumWorkMode = async () => {
......@@ -78,15 +91,15 @@ const getEnumWorkMode = async () => {
getEnumWorkMode();
const changeWorkMode = mode => {
setFormDataKey("workMode", mode);
setFormDataKey("minSalary", 0);
setFormDataKey("maxSalary", 0);
pinias.setFormDataKey("workMode", mode);
pinias.setFormDataKey("minSalary", 0);
pinias.setFormDataKey("maxSalary", 0);
if (mode == 2) {
// 小时
setFormDataKey("settlementType", 1);
pinias.setFormDataKey("settlementType", 1);
} else {
// 月
setFormDataKey("settlementType", 4);
pinias.setFormDataKey("settlementType", 4);
}
};
/* 职业类型 */
......@@ -107,13 +120,15 @@ const columnChange = ({ selectedItem, resolve, finish }) => {
};
const handleConfirm = ({ selectedItems, value }) => {
const taget = _.last(selectedItems);
setFormDataKey("jobTypeText", taget.name);
setFormDataKey("jobType", taget.id);
pinias.setFormDataKey("jobTypeText", taget.name);
pinias.setFormDataKey("jobType", taget.id);
};
const next = () => {
uni.navigateTo({
url: "/pages/recommend/releasePostion/step2"
});
if (validateForm(pinias.formData, ["jobType", "jobTypeText", "jobName", "jobDesc"])) {
uni.navigateTo({
url: "/pages/recommend/releasePostion/step2"
});
}
};
</script>
......
......@@ -8,28 +8,47 @@
<view class="content">
<view class="form-item">
<view class="form-item-title">职位薪资</view>
<wd-col-picker
v-model="value"
:columns="columns"
:column-change="columnChange"
@confirm="handleConfirm"
use-default-slot
<view
v-if="pinias.formData.settlementType == 4"
:class="`inner flex-between ${salaryText ? '' : 'placeholder'}`"
@click="onOpen"
>
<view :class="`inner flex-between ${salaryText ? '' : 'placeholder'}`" bind:tap="onOpen">
{{ salaryText || "请选择(全职为月薪兼职为时薪)" }}
{{ salaryText || "请选择月薪范围" }}
<view class="arrow"></view>
<!-- <view class="arrow"></view> -->
<checkbox class="checkbox" @click="onChecked" :checked="my">面议</checkbox>
</view>
<view v-else :class="`inner flex-between ${salaryText ? '' : 'placeholder'}`" @click="onOpen">
{{ salaryText || "请选择时薪范围" }}
<!-- <view class="arrow"></view> -->
<checkbox class="checkbox" @click="onChecked" :checked="my">面议</checkbox>
</view>
<wd-popup
v-model="show"
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 name="close" size="30rpx"></wd-icon>
</view>
</wd-col-picker>
<wd-picker-view
@change="handleConfirm"
use-default-slot
:columns="columns"
v-model="value"
@close="handleClose"
></wd-picker-view>
</wd-popup>
</view>
<view class="form-item">
<view class="form-item-title">是否提供食宿</view>
<view class="inner flex-between">
<!-- <van-radio-group model:value="{{ accommodation }}">
<van-radio name="{{item.code}}" wx:for="{{EnumAccommodation}}" wx:key="index">{{ item.text }}</van-radio>
</van-radio-group> -->
<wd-radio-group v-model="formData.accommodation" inline shape="dot">
<wd-radio v-for="v in radioOpstion" :value="v.code">{{ v.text }}</wd-radio>
<wd-radio-group v-model="pinias.formData.accommodation" inline shape="dot">
<wd-radio v-for="(v, n) in radioOpstion" :value="v.code" :key="n">{{ v.text }}</wd-radio>
</wd-radio-group>
</view>
</view>
......@@ -59,71 +78,106 @@
</template>
<script setup>
import { useReleasePostionStore } from "./store";
import { getEumData } from "@/utils/utils";
const { formData, setFormDataKey } = useReleasePostionStore();
import { useReleasePostionStore } from "./store";
/* tab */
const pinias = useReleasePostionStore();
/* 薪资选择 */
const salaryText = ref("");
let salaryText = ref("");
const value = ref([]);
const columns = ref([]);
console.log(formData.settlementType);
let my = ref(pinias.formData.negotiableSalary == 1);
console.log(pinias.formData.settlementType, "pinias.formData.settlementType");
const show = ref(false);
let multiple = 1;
/* 兼职薪资基准 */
if (formData.settlementType == 1) {
multiple = 10;
if (pinias.formData.settlementType == 1) {
multiple = 50;
} else {
multiple = 1000;
}
const initSalaryColumns = () => {
const temp = [
{
value: "面议",
label: "面议",
next: false
}
];
for (let i = 1; i < 50; i++) {
const temp = [];
const maxSalary = pinias.formData.settlementType === 1 ? 1000 : 50 * multiple;
// 生成序列
for (let i = 1; i * multiple <= maxSalary; i++) {
const currentValue = i * multiple;
temp.push({
value: i * multiple,
label: i * multiple,
value: currentValue,
label: pinias.formData.settlementType === 1 ? currentValue : `${currentValue / 1000}k`,
next: true
});
}
columns.value.push(temp);
// 确保 columns.value 是一个数组
if (!Array.isArray(columns.value)) {
columns.value = [];
}
// 清空原来的数组,以确保只包含新的数据
columns.value.length = 0;
// 将 temp 复制两次,推入 columns.value
columns.value.push([...temp], [...temp]);
};
initSalaryColumns();
const columnChange = ({ selectedItem, resolve, finish }) => {
console.log(selectedItem);
if (selectedItem.next) {
const temp = [];
for (let i = 1; i < 50; i++) {
temp.push({
value: i * multiple + selectedItem.value,
label: i * multiple + selectedItem.value,
next: false
});
resolve(temp);
}
function onChecked() {
my.value = !my.value;
// 如果勾选了面议
if (my.value) {
salaryText.value = "";
pinias.setFormDataKey("maxSalary", 0);
pinias.setFormDataKey("minSalary", 0);
pinias.setFormDataKey("negotiableSalary", 1);
} else {
finish();
pinias.setFormDataKey("negotiableSalary", 0);
}
};
}
onShow(() => {
// setFormDataKey("negotiableSalary", 0);
// setFormDataKey("maxSalary", 0);
// setFormDataKey("minSalary", 0);
});
const handleConfirm = ({ value, selectedItem }) => {
salaryText.value = value.join("~");
console.log("value", value);
if (value[1] < value[0]) {
xma.showToast({
title: "最高薪资不能小于最低薪资",
icon: "none"
});
return;
}
my.value = false;
if (pinias.formData.settlementType === 1) {
salaryText.value = value.join("~");
} else {
salaryText.value = value.map(num => `${num / multiple}k`).join("~");
}
const [min, max] = value;
if (max) {
setFormDataKey("maxSalary", max);
setFormDataKey("minSalary", min);
setFormDataKey("negotiableSalary", 0);
pinias.setFormDataKey("maxSalary", max);
pinias.setFormDataKey("minSalary", min);
pinias.setFormDataKey("negotiableSalary", 0);
} else {
setFormDataKey("maxSalary", 0);
setFormDataKey("minSalary", 0);
setFormDataKey("negotiableSalary", 1);
pinias.setFormDataKey("maxSalary", 0);
pinias.setFormDataKey("minSalary", 0);
pinias.setFormDataKey("negotiableSalary", 1);
}
};
function onOpen() {
if (my.value) return;
show.value = true;
}
function handleClose() {
show.value = false;
}
/* 是否提供住宿 */
const radioOpstion = ref([]);
const initRadioOpstion = async () => {
......@@ -154,14 +208,22 @@ const onChangeBenefits = e => {
};
// 下一页
const next = () => {
setFormDataKey(
pinias.setFormDataKey(
"benefits",
benefits.value
.filter(v => v.active)
.map(v => v.text)
.join(",")
);
if (pinias.formData.negotiableSalary == 0) {
if (pinias.formData.maxSalary == 0 || pinias.formData.minSalary == 0) {
xma.showToast({
title: "请输入薪资",
icon: "none"
});
return;
}
}
uni.navigateTo({
url: "/pages/recommend/releasePostion/step3"
});
......@@ -169,15 +231,17 @@ const next = () => {
/* 初始化 */
const initViewData = () => {
console.log(formData);
if (formData.id) {
console.log(pinias.formData);
if (pinias.formData.id) {
// 福利
if (formData.benefits) {
if (pinias.formData.benefits) {
benefits.value.forEach(v => {
v.active = formData.benefits.indexOf(v.text) !== -1;
v.active = pinias.formData.benefits.indexOf(v.text) !== -1;
});
}
salaryText.value = formData.negotiableSalary ? "面议" : `${formData.minSalary}~${formData.maxSalary}`;
salaryText.value = pinias.formData.negotiableSalary
? "面议"
: `${pinias.formData.minSalary}~${pinias.formData.maxSalary}`;
}
};
initViewData();
......@@ -197,6 +261,19 @@ initViewData();
margin-bottom: 24rpx;
}
}
:deep(.uni-checkbox-input) {
border-radius: 50% !important;
}
.title-box {
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding: 0 32rpx;
.title {
font-weight: bold;
}
}
.welfare {
display: flex;
flex-wrap: wrap;
......
......@@ -11,7 +11,7 @@
<view :class="`inner flex-between ${address ? '' : 'placeholder'}`" @tap="getLocaltion">
<view class="flex-align-center">
<image src="@/static/image/icon/position.png" />
{{ address || "请选择工作地址" }}
{{ address || pinias.formData.address || "请选择工作地址" }}
</view>
<view class="arrow"></view>
</view>
......@@ -31,10 +31,13 @@
<script setup>
import { ref } from "vue";
import { useReleasePostionStore } from "./store";
/* tab */
const pinias = useReleasePostionStore();
const showTab = ref(true);
const address = ref("");
const { formData, setFormDataKey } = useReleasePostionStore();
import { validateForm } from "@/utils/utils";
const getLocaltion = () => {
showTab.value = false;
......@@ -44,10 +47,9 @@ const getLocaltion = () => {
if (res.errMsg == "chooseLocation:ok") {
address.value = res.name;
}
setFormDataKey("locationLongitude", res.longitude || 106.647169);
setFormDataKey("locationLatitude", res.latitude || 26.615808);
setFormDataKey("address", res.name || "华贵保险大厦");
setTimeout(() => {}, 1000);
pinias.setFormDataKey("locationLongitude", res.longitude || 106.647169);
pinias.setFormDataKey("locationLatitude", res.latitude || 26.615808);
pinias.setFormDataKey("address", res.name || "华贵保险大厦");
showTab.value = true;
/*
address: "长岭南路178号"
......@@ -62,9 +64,11 @@ const getLocaltion = () => {
};
const next = () => {
uni.navigateTo({
url: "/pages/recommend/releasePostion/step4"
});
if (validateForm(pinias.formData, ["address"])) {
uni.navigateTo({
url: "/pages/recommend/releasePostion/step4"
});
}
};
</script>
......
......@@ -12,7 +12,7 @@
:columns="identityPostion"
value-key="code"
label-key="text"
v-model="formData.identityRequirement"
v-model="pinias.formData.identityRequirement"
@confirm="handleConfirmIdentity"
use-default-slot
>
......@@ -30,7 +30,7 @@
:columns="educationPostion"
value-key="code"
label-key="text"
v-model="formData.educationRequirement"
v-model="pinias.formData.educationRequirement"
@confirm="handleConfirmEducation"
use-default-slot
>
......@@ -61,7 +61,7 @@
</view>
<wd-tabbar
@tap="next"
custom-style="display: flex;justify-content: center !important;"
custom-style="display: flex;justify-content: center !important;z-index:1;"
fixed
placeholder
safeAreaInsetBottom
......@@ -75,7 +75,8 @@
import { ref } from "vue";
import { getEumData, getEnumText } from "@/utils/utils";
import { useReleasePostionStore } from "./store";
const { formData, setFormDataKey } = useReleasePostionStore();
/* tab */
const pinias = useReleasePostionStore();
const identityText = ref("");
const educationText = ref("");
const identityPostion = ref([]);
......@@ -106,7 +107,7 @@ const initSalaryColumns = () => {
next: false
}
];
for (let i = 1; i < 50; i++) {
for (let i = 16; i < 81; i++) {
temp.push({
value: i,
label: i + "岁",
......@@ -139,16 +140,16 @@ const handleConfirm = ({ value, selectedItem }) => {
console.log([min, max]);
if (max) {
// 没有选择不限
setFormDataKey("maxAgeRequirement", max);
setFormDataKey("minAgeRequirement", min);
pinias.setFormDataKey("maxAgeRequirement", max);
pinias.setFormDataKey("minAgeRequirement", min);
} else {
setFormDataKey("maxAgeRequirement", 0);
setFormDataKey("minAgeRequirement", 0);
pinias.setFormDataKey("maxAgeRequirement", 0);
pinias.setFormDataKey("minAgeRequirement", 0);
}
};
const next = () => {
console.log(formData);
console.log(pinias.formData);
uni.navigateTo({
url: "/pages/recommend/releasePostion/step5"
});
......@@ -156,13 +157,13 @@ const next = () => {
/* 初始化页面数据 */
const initViewData = async () => {
if (formData.id) {
console.log(formData);
if (pinias.formData.id) {
console.log(pinias.formData);
identityText.value = await getEnumText("EnumIdentityRequirement", formData.identityRequirement);
educationText.value = await getEnumText("EnumEducationRequirement", formData.educationRequirement);
if (formData.maxAgeRequirement) {
ageText.value = `${formData.minAgeRequirement}~${formData.maxAgeRequirement}`;
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}`;
}
}
};
......
......@@ -9,19 +9,19 @@
<view class="form-item">
<view class="form-item-title">招聘人数</view>
<view class="inner felx-between">
<input type="number" v-model="formData.recruitmentNumber" placeholder="请输入招聘人数" />
<input type="number" v-model="pinias.formData.recruitmentNumber" placeholder="请输入招聘人数" />
</view>
</view>
<view class="form-item">
<view class="form-item-title">联系电话</view>
<view class="inner felx-between">
<input type="number" v-model="formData.contactPhone" placeholder="请输入联系电话" />
<input type="number" v-model="pinias.formData.contactPhone" placeholder="请输入联系电话" />
</view>
</view>
<view class="form-item">
<view class="form-item-title">联系人</view>
<view class="inner felx-between">
<input type="text" v-model="formData.contactPerson" placeholder="请输入联系人" />
<input type="text" v-model="pinias.formData.contactPerson" placeholder="请输入联系人" />
</view>
</view>
</view>
......@@ -40,16 +40,17 @@
<script setup>
import { createJobApi, updateJobApi } from "@/api/postion";
import { useReleasePostionStore } from "./store";
const { formData, resetForm } = useReleasePostionStore();
console.log(resetForm);
/* tab */
const pinias = useReleasePostionStore();
import { validateForm } from "@/utils/utils";
const submit = () => {
console.log("submit", formData);
if (formData.id) {
if (pinias.formData.id) {
// 更新
updateJobApi(formData).then(res => {
updateJobApi(pinias.formData).then(res => {
if (res.code == 200) {
resetForm();
pinias.resetForm();
uni.showToast({
title: "更新成功",
icon: "none",
......@@ -69,28 +70,30 @@ const submit = () => {
}
});
} else {
// 提交
createJobApi(formData).then(res => {
if (res.code == 200) {
resetForm();
uni.showToast({
title: "发布成功",
icon: "none",
duration: 2000,
success: () => {
uni.switchTab({
url: "/pages/recommend/index"
});
}
});
} else {
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000
});
}
});
if (validateForm(pinias.formData, ["contactPhone", "contactPerson"])) {
// 提交
createJobApi(pinias.formData).then(res => {
if (res.code == 200) {
pinias.resetForm();
uni.showToast({
title: "发布成功",
icon: "none",
duration: 2000,
success: () => {
uni.switchTab({
url: "/pages/recommend/index"
});
}
});
} else {
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000
});
}
});
}
}
};
</script>
......
import { defineStore } from "pinia";
import { reactive } from "vue";
import { reactive,ref } from "vue";
export const useReleasePostionStore = defineStore("releasePostion", {
state: () => ({
formData: {
export const useReleasePostionStore = defineStore("useReleasePostionStore", ()=>{
let formData = ref( {
workMode: 1,
jobName: "",
jobType: 1,
jobTypeText: "",
jobDesc: "",
negotiableSalary: 1,
settlementType: 1,
negotiableSalary: 0,
settlementType: 4,
minSalary: 0,
maxSalary: 0,
benefits: "",
identityRequirement: 1,
educationRequirement: 1,
minAgeRequirement: 1,
maxAgeRequirement: 1,
minAgeRequirement: 16,
maxAgeRequirement: 60,
recruitmentNumber: 1,
accommodation: 1,
provinceCode: "",
......@@ -30,28 +29,27 @@ export const useReleasePostionStore = defineStore("releasePostion", {
locationLatitude: 0,
contactPerson: "",
contactPhone: ""
})
function setFormDataKey(key, data) {
formData.value[key] = data;
}
}),
actions: {
setFormDataKey(key, data) {
this.formData[key] = data;
},
resetForm() {
this.formData = {
function resetForm() {
formData.value = {
workMode: 1,
jobName: "",
jobType: 1,
jobTypeText: "",
jobDesc: "",
negotiableSalary: 1,
negotiableSalary: 0,
settlementType: 1,
minSalary: 0,
maxSalary: 0,
benefits: "",
identityRequirement: 1,
educationRequirement: 1,
minAgeRequirement: 1,
maxAgeRequirement: 1,
minAgeRequirement: 16,
maxAgeRequirement: 60,
recruitmentNumber: 1,
accommodation: 1,
provinceCode: "",
......@@ -65,10 +63,17 @@ export const useReleasePostionStore = defineStore("releasePostion", {
contactPerson: "",
contactPhone: ""
};
},
setForm(data) {
this.formData = reactive(data);
console.log("this.formData", this.formData);
console.log('this.formthis.formDatathis.formDatathis.formDatathis.formDataData',formData.value);
}
}
function setForm(data) {
formData.value = data;
console.log("this.formData",formData.value );
}
return {
formData,
setFormDataKey,
resetForm,
setForm
}
});
<template>
<div class="page">
<NavBar :showIcon="true" :showTitle="true" title="企业申诉"></NavBar>
<view class="appealing-name"> 申诉企业:{{ name }} </view>
<view class="appealing-user-name">
<view>申述人姓名</view>
......@@ -29,7 +30,7 @@
<view class="t1"> (注:图片大小不超过10M) </view>
</view>
<view class="btn-wrap">
<view class="btn-wrap" v-if="status == 2">
<button class="bottom-btn" @tap="submit">提交</button>
</view>
</div>
......@@ -39,7 +40,7 @@
import { ref, reactive } from "vue";
import { uploadFiles } from "@/utils/fileUpload";
import evn from "@/utils/config";
import { companyAppealApi } from "@/api/user";
import { companyAppealApi, appealInfo } from "@/api/user";
import _ from "lodash";
const name = ref("");
const params = reactive({
......@@ -49,9 +50,11 @@ const params = reactive({
content: "",
companyId: 1
});
let status = ref(2);
onLoad(data => {
name.value = data.name;
params.companyId = data.id;
appealInfoFn();
});
/* 选择图片 */
const chooseImage = type => {
......@@ -70,6 +73,20 @@ const chooseImage = type => {
});
};
const appealInfoFn = () => {
appealInfo().then(res => {
if (res.data) {
params.companyId = res.data.companyId;
name.value = res.data.companyName;
params.realName = res.data.realName;
params.content = res.data.content;
params.licensePath = res.data.licensePath;
params.idCardPath = res.data.idCardPath;
status.value = res.data.status;
}
});
};
const submit = () => {
let flag = true;
_.mapValues(params, value => {
......
<template>
<NavBar :showIcon="true" :showTitle="true" title="个人信息"></NavBar>
<div class="page">
<div class="content">
<div class="item flex-between">
......
<template>
<NavBar :showIcon="false" :showTitle="true" title="我的" textColor="#ffffff"></NavBar>
<wd-overlay :show="show">
<view class="popup-wrapper">
<view class="block" @click.stop="">
<view class="sumbit-error">
<view class="title">企业已存在</view>
<view class="info">
您在注册的<text>{{ name }}</text>已在乐业观山湖认证,请核对企业名称是否正确
</view>
<view class="btn flex-between" @tap="navigateTo('/pages/user/businessLicense/fillIn')">
<view class="text">
<view class="t1">注册新公司</view>
<view class="t2">注册新公司</view>
</view>
<view class="arrow"></view>
</view>
<view class="btn flex-between" @tap="navigateTo(`/pages/user/businessLicense/appeal?name=${name}&id=${id}`)">
<view class="text">
<view class="t1">申述资质被冒用</view>
<view class="t2">确定没有注册过乐业观山湖</view>
</view>
<view class="arrow"></view>
</view>
</view>
</view>
</view>
</wd-overlay>
<div class="user-container">
<view class="bg"></view>
<!-- 用户信息 -->
......@@ -34,10 +60,13 @@
<script setup>
import navBar from "@/components/navBar/index.vue";
import { getLoginUserApi, getCompanyInfoApi } from "@/api/user";
import { getLoginUserApi, getCompanyInfoApi, appealInfo } from "@/api/user";
import { getEnumText } from "@/utils/utils";
import { ref, reactive } from "vue";
import evn from "@/utils/config.js";
const show = ref(false);
let name = ref("");
let id = ref("");
import { removeToken } from "@/utils/token";
const navigateTo = (url, fn) => {
if (fn) {
......@@ -69,41 +98,91 @@ const navList = reactive([
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: "企业认证"
// },
// {
// icon: new URL("@/static/image/user/loginout.png", import.meta.url).href,
// url: "/pages/login/test",
// fn: () => {
// removeToken();
// },
// text: "退出登录(去测试登录)"
// }
]);
/* 个人信息 */
const userInfo = ref({});
const appealInfoFn = () => {
appealInfo().then(res => {
show.value = false;
if (res.data.status == 2) {
navList[0].url = "/pages/user/businessLicense/appeal";
navList[0].subText = "申诉不通过";
} else if (res.data.status == 0) {
navList[0].subText = "申诉中";
navList[0].url = "/pages/user/businessLicense/appeal";
}
});
};
/* 获取用户信息 */
const getUserInfo = async () => {
const userRes = await getLoginUserApi();
if (userRes.code == 200) {
userInfo.value = userRes.data || {};
navList[0].subText = userRes.data.companyName;
name.value = userRes.data.companyName;
id.value = userRes.data.companyId;
}
const { status } = userRes.data;
if (status !== 1) {
uni.hideTabBar();
if (status == 2) {
// 代表添加了申述信息,需要查看申述状态,调用申诉信息接口
appealInfoFn();
} else if (status == 3) {
show.value = true;
// 代表账号所关联的企业被申述解除关联
}
}
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 (status == 1 || status == 4) {
show.value = false;
const companyRes = await getCompanyInfoApi();
if (companyRes.code == 200) {
let type = companyRes.data.companyAudit.status;
if (type != 1) {
navList[0].subText = await getEnumText("EnumAuditStatus", type);
navList[0].auditStatus = type;
uni.hideTabBar();
} else {
uni.showTabBar();
}
}
}
// 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();
......@@ -114,6 +193,66 @@ onShow(() => {
.user-container {
padding-top: 1rpx;
}
.popup-wrapper {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
.sumbit-error {
position: relative;
box-sizing: border-box;
width: 600rpx;
padding: 0 32rpx 32rpx;
background-color: #ffffff;
border-radius: 10rpx;
image {
position: absolute;
top: 20rpx;
right: 20rpx;
width: 30rpx;
height: 30rpx;
}
.title {
padding: 32rpx 0;
font-size: 36rpx;
font-weight: 600;
line-height: 54rpx;
color: #1b2026;
text-align: center;
}
.info {
font-family: "PingFang SC";
font-size: 24rpx;
line-height: 48rpx;
text {
color: #1f86ff;
}
}
.btn {
padding: 24rpx;
padding-right: 36rpx;
margin-top: 32rpx;
border: 2rpx solid #dfe1e5;
border-radius: 8rpx;
.t1 {
font-size: 28rpx;
font-weight: 500;
line-height: 36rpx;
color: #1b2026;
}
.t2 {
margin-top: 8rpx;
font-size: 24rpx;
line-height: 36rpx;
color: #a3a7b3;
}
.arrow {
border-color: #77818f;
}
}
}
}
.nav-bar {
.text {
margin: 0 auto;
......
......@@ -2,22 +2,17 @@
<NavBar :showIcon="true" :showTitle="true" title="营业执照认证" backgroundBox="#FFFFFF"></NavBar>
<div class="page">
<div class="audit-message">
<p class="title" :style="{ background: companyInfo.companyAudit.status == 2 ? '#ff5113' : '#1F86FF' }">
{{ companyInfo.companyAudit.status == 2 ? "审核拒绝" : "通过审核" }}
<p class="title" :style="{ background: status == 2 ? '#ff5113' : '#1F86FF' }">
{{ status == 2 ? "审核拒绝" : status == 0 ? "待审核" : "通过审核" }}
</p>
<div class="message" :style="{ background: '#FFEDE7' }" v-if="companyInfo.companyAudit.status == 2">
<div class="message" :style="{ background: '#FFEDE7' }" v-if="status == 2">
<p>拒绝原因</p>
{{ companyInfo.companyAudit.auditMessage }}
</div>
</div>
<view class="image-wrap">
<div class="title" v-if="companyInfo.companyAudit.status == 2">重新提交</div>
<image
@click="chooseImage"
v-if="companyInfo.companyAudit.licensePath"
:src="evn.APP_IMAGE_BASE_API + companyInfo.companyAudit.licensePath"
mode=""
/>
<div class="title" v-if="status == 2">重新提交</div>
<image @click="chooseImage" v-if="myLicensePath" :src="evn.APP_IMAGE_BASE_API + myLicensePath" mode="" />
<view>注:接受拍摄复印件,黑白复印需要加盖公章,大小不超过10M</view>
</view>
<view class="content-wrap">
......@@ -25,8 +20,8 @@
<wd-input
type="text"
size="small"
:disabled="companyInfo.companyAudit.status != 2"
v-model="companyInfo.companyAudit.companyName"
:disabled="status != 2"
v-model="companyName"
placeholder="请输入企业全称"
:use-label-slot="true"
@input="handleChange($event, 'companyName')"
......@@ -40,11 +35,11 @@
<wd-input
type="text"
size="small"
:disabled="companyInfo.companyAudit.status != 2"
v-model="companyInfo.companyAudit.creditCode"
:disabled="status != 2"
v-model="myCode"
placeholder="请输入信用代码"
:use-label-slot="true"
@input="handleChange($event, 'creditCode')"
@input="handleChange($event, 'myCode')"
>
<template #label>
<view class="label">信用代码</view>
......@@ -54,7 +49,7 @@
<view class="item">
<view class="label"> 有效期 </view>
<view class="content">
<wd-radio-group v-model="radio" shape="dot" inline :disabled="companyInfo.companyAudit.status != 2">
<wd-radio-group v-model="radio" shape="dot" inline :disabled="status != 2">
<wd-radio :value="1">长期</wd-radio>
<wd-radio :value="2">具体时间</wd-radio>
</wd-radio-group>
......@@ -63,58 +58,65 @@
<view class="item">
<view class="label"> 日期 </view>
<wd-calendar
v-model="companyInfo.licenseValidityPeriod"
:disabled="radio == 1 && companyInfo.companyAudit.status != 2"
v-model="myLicenseValidityPeriod"
:disabled="radio == 1 && status != 2"
:min-date="new Date().getTime()"
:max-date="new Date('2059/01/01').getTime()"
use-default-slot
>
<view :class="`content ${radio == 1 ? 'disabled' : ''}`">
{{
(companyInfo.licenseValidityPeriod &&
dayjs(companyInfo.licenseValidityPeriod).format("YYYY-MM-DD")) ||
"请选择"
}}
{{ (myLicenseValidityPeriod && dayjs(myLicenseValidityPeriod).format("YYYY-MM-DD")) || "请选择" }}
</view>
</wd-calendar>
</view>
</view>
<view class="btn-wrap" v-if="companyInfo.companyAudit.status == 2">
<view class="btn-wrap" v-if="status == 2">
<button class="bottom-btn" @tap="submit">提交</button>
</view>
</div>
</template>
<script setup>
import { useCompanyInfoStore } from "./companyInfo";
import evn from "@/utils/config";
import { uploadFiles } from "@/utils/fileUpload";
import { getCompanyInfoApi, resubmitCompanyApi } from "@/api/user";
import { ref } from "vue";
import dayjs from "dayjs";
import { resubmitCompanyApi } from "@/api/user";
const { companyInfo } = useCompanyInfoStore();
const radio = ref(1);
const myCompanyName = ref("");
const myCreditCode = ref("");
if (companyInfo.licenseValidityPeriod == 4102329600000) {
radio.value = 1;
} else {
radio.value = 2;
}
onMounted(() => {
myCompanyName.value = companyInfo.companyAudit.companyName;
myCreditCode.value = companyInfo.companyAudit.creditCode;
const companyName = ref("");
const myCode = ref("");
const myLicensePath = ref("");
let status = ref(1);
let myLicenseValidityPeriod = ref(4102329600000);
let companyInfo = reactive({});
onReady(() => {
getCompanyInfoApiFn();
});
function getCompanyInfoApiFn() {
getCompanyInfoApi().then(res => {
companyInfo = res.data;
status.value = res.data.companyAudit.status;
myLicensePath.value = res.data.companyAudit.licensePath;
companyName.value = res.data.companyAudit.companyName;
myCode.value = res.data.companyAudit.creditCode;
myLicenseValidityPeriod.value = res.data.licenseValidityPeriod;
if (res.data.licenseValidityPeriod == 4102329600000) {
radio.value = 1;
} else {
radio.value = 2;
}
});
}
/* 选择图片 */
const chooseImage = () => {
if (companyInfo.companyAudit.status == 2) {
if (status.value == 2) {
uni.chooseImage({
count: 1,
success: async ({ tempFiles }) => {
const res = await uploadFiles(tempFiles);
companyInfo.companyAudit.licensePath = res[0].key;
myLicensePath.value = res[0].key;
}
});
}
......@@ -122,31 +124,21 @@ const chooseImage = () => {
const handleChange = (event, type) => {
if (type == "companyName") {
myCompanyName.value = event.value;
companyName.value = event.value;
} else {
myCreditCode.value = event.value;
console.log("event", myCreditCode.value);
myCode.value = event.value;
}
};
const submit = () => {
console.log(companyInfo);
let { companyName: name, creditCode, licenseValidityPeriod, licensePath } = companyInfo.companyAudit;
creditCode = myCreditCode.value;
name = myCompanyName.value;
console.log("event", creditCode, name);
name = companyName.value;
if (radio.value == 1) {
licenseValidityPeriod = "2099-12-31";
} else {
licenseValidityPeriod = myLicenseValidityPeriod.value;
}
console.log("{ name, creditCode, licenseValidityPeriod, licensePath }", {
name,
creditCode,
licenseValidityPeriod,
licensePath
});
resubmitCompanyApi({ name, creditCode, licenseValidityPeriod, licensePath }).then(res => {
resubmitCompanyApi({ name, creditCode: myCode.value, licenseValidityPeriod, licensePath: myLicensePath.value }).then(res => {
if (res.code == 200) {
uni.showToast({
title: "提交成功",
......
<template>
<NavBar :showIcon="true" :showTitle="true" title="简历详情" backgroundBox="transparent"></NavBar>
<div class="resume-page">
<!-- 个人信息 -->
<view class="user-info flex-between">
......
import axios from "axios";
import { getToken } from "@/utils/token";
const baseURL = "https://lygsh-api.wjzpgz.com/";
// const baseURL = "https://lygsh-api.wjzpgz.com/";
const baseURL = "http://192.168.11.179:8080/";
// 创建一个 axios 实例
const instance = axios.create({
baseURL, // 设置基础 URL
......
......@@ -67,3 +67,47 @@ export const formatTimestamp = (timestamp, formatString = "YYYY-MM-DD hh:mm:ss")
.replace(/mm/g, minute)
.replace(/ss/g, second);
}
export const validateForm=(formData,requiredFields) =>{
const phoneRegex = /^1[3-9]\d{9}$/; // 正则表达式匹配中国大陆手机号码
for (const field of requiredFields) {
if(field === "contactPhone") {
if (!formData[field] || !phoneRegex.test(formData[field])) {
uni.showToast({
title: `请填写正确电话号码!`,
icon: "none",
duration: 2000
});
return false;
}
} else if (!formData[field]) {
uni.showToast({
title: `请填写${
field === "jobTypeText"
? "职位类型"
: field === "jobDesc"
? "职位描述"
: field === "jobName"
? "职位名称"
:field==='address'
?'工作地址'
:field==='identityRequirement'
?'身份要求'
:field==='educationRequirement'
?'学历要求'
:field==='maxAgeRequirement'
?'年龄要求'
:field==='contactPerson'
?'联系人'
:field==='jobType'
?'职位类型'
:""
}!`,
icon: "none",
duration: 2000
});
return false;
}
}
return true;
}
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