Compare commits
10 Commits
yxl
...
5d08291ef6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d08291ef6 | ||
|
|
9ce22a7949 | ||
|
|
9a5ac849a0 | ||
|
|
d7b7f8d111 | ||
|
|
3980aecd56 | ||
|
|
805122c23f | ||
|
|
ba9e1d279d | ||
|
|
4ea7b8abb4 | ||
|
|
43eb458c6a | ||
|
|
809e57347a |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -24,3 +24,4 @@ pnpm-debug.log*
|
||||
/hs_err_pid*
|
||||
*.local
|
||||
yarn.lock
|
||||
.codegraph
|
||||
@@ -1,5 +1,14 @@
|
||||
<template>
|
||||
<view v-if="show" class="filter-container">
|
||||
<!-- 头部 -->
|
||||
<view class="filter-header">
|
||||
<view class="header-title">筛选</view>
|
||||
<view class="header-close" @click="handleClose">
|
||||
<view class="close-icon"></view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 主体内容 -->
|
||||
<view class="filter-body">
|
||||
<!-- 左侧标签页 -->
|
||||
<view class="filter-tabs">
|
||||
<view
|
||||
@@ -53,6 +62,24 @@
|
||||
</radio-group>
|
||||
</view>
|
||||
|
||||
<!-- 薪资 -->
|
||||
<view v-if="activeTab === 'salary'" class="content-section">
|
||||
<radio-group @change="(e) => handleSelect('salary', e)">
|
||||
<label
|
||||
v-for="option in salaryOptions"
|
||||
:key="option.value"
|
||||
class="radio-item"
|
||||
:class="{ checked: selectedValues['salary'] === String(option.value) }"
|
||||
>
|
||||
<radio
|
||||
:value="String(option.value)"
|
||||
:checked="selectedValues['salary'] === String(option.value)"
|
||||
/>
|
||||
<text class="option-label">{{ option.label }}</text>
|
||||
</label>
|
||||
</radio-group>
|
||||
</view>
|
||||
|
||||
<!-- 公司规模 -->
|
||||
<view v-if="activeTab === 'scale'" class="content-section">
|
||||
<radio-group @change="(e) => handleSelect('scale', e)">
|
||||
@@ -71,22 +98,22 @@
|
||||
</radio-group>
|
||||
</view>
|
||||
|
||||
<!-- 地区 -->
|
||||
<!-- 地区(多选) -->
|
||||
<view v-if="activeTab === 'area'" class="content-section">
|
||||
<radio-group @change="(e) => handleSelect('area', e)">
|
||||
<checkbox-group @change="(e) => handleCheckboxSelect('area', e)">
|
||||
<label
|
||||
v-for="option in areaOptions"
|
||||
:key="option.value"
|
||||
class="radio-item"
|
||||
:class="{ checked: selectedValues['area'] === String(option.value) }"
|
||||
:class="{ checked: isAreaSelected(String(option.value)) }"
|
||||
>
|
||||
<radio
|
||||
<checkbox
|
||||
:value="String(option.value)"
|
||||
:checked="selectedValues['area'] === String(option.value)"
|
||||
:checked="isAreaSelected(String(option.value))"
|
||||
/>
|
||||
<text class="option-label">{{ option.label }}</text>
|
||||
</label>
|
||||
</radio-group>
|
||||
</checkbox-group>
|
||||
</view>
|
||||
|
||||
<!-- 岗位类型 -->
|
||||
@@ -114,6 +141,7 @@
|
||||
<button class="footer-btn confirm-btn" @click="handleConfirm">确认</button>
|
||||
</view>
|
||||
</view>
|
||||
</view><!-- end filter-body -->
|
||||
</view>
|
||||
</template>
|
||||
|
||||
@@ -143,6 +171,7 @@ const getJobTypeData = () => {
|
||||
const tabs = [
|
||||
{ key: 'education', label: '学历要求' },
|
||||
{ key: 'experience', label: '工作经验' },
|
||||
{ key: 'salary', label: '薪资' },
|
||||
{ key: 'scale', label: '公司规模' },
|
||||
{ key: 'jobType', label: '岗位类型' },
|
||||
{ key: 'area', label: '地区' }
|
||||
@@ -155,8 +184,9 @@ const activeTab = ref('education');
|
||||
const selectedValues = reactive({
|
||||
education: '',
|
||||
experience: '',
|
||||
salary: '',
|
||||
scale: '',
|
||||
area: '',
|
||||
area: [],
|
||||
jobType: ''
|
||||
});
|
||||
|
||||
@@ -167,6 +197,16 @@ const scaleOptions = ref([]);
|
||||
const areaOptions = ref([]);
|
||||
const jobTypeOptions = ref([]);
|
||||
|
||||
// 薪资区间数据(单位:元/月),min/max 为空表示该侧不设限
|
||||
const salaryOptions = ref([
|
||||
{ label: '3K以下', value: '0-3000', min: '', max: 3000 },
|
||||
{ label: '3-5K', value: '3000-5000', min: 3000, max: 5000 },
|
||||
{ label: '5-10K', value: '5000-10000', min: 5000, max: 10000 },
|
||||
{ label: '10-20K', value: '10000-20000', min: 10000, max: 20000 },
|
||||
{ label: '20-50K', value: '20000-50000', min: 20000, max: 50000 },
|
||||
{ label: '50K以上', value: '50000-0', min: 50000, max: '' },
|
||||
]);
|
||||
|
||||
// 加载状态
|
||||
const loading = ref(true);
|
||||
|
||||
@@ -188,22 +228,76 @@ onBeforeMount(async () => {
|
||||
}
|
||||
});
|
||||
|
||||
// 处理选项选择
|
||||
// 处理单选选项选择
|
||||
const handleSelect = (key, e) => {
|
||||
selectedValues[key] = e.detail.value;
|
||||
};
|
||||
|
||||
// 处理多选选项选择(地区)
|
||||
// 兼容不同平台:H5 可能返回逗号分隔字符串,小程序返回数组
|
||||
const handleCheckboxSelect = (key, e) => {
|
||||
let val = e.detail.value;
|
||||
if (typeof val === 'string') {
|
||||
selectedValues[key] = val ? val.split(',').map((s) => s.trim()) : [];
|
||||
} else if (Array.isArray(val)) {
|
||||
selectedValues[key] = val.map((v) => String(v));
|
||||
} else {
|
||||
selectedValues[key] = [];
|
||||
}
|
||||
};
|
||||
|
||||
// 判断地区选项是否被选中(兼容数组和字符串)
|
||||
const isAreaSelected = (value) => {
|
||||
const areaVal = selectedValues.area;
|
||||
if (Array.isArray(areaVal)) {
|
||||
return areaVal.includes(value);
|
||||
}
|
||||
if (typeof areaVal === 'string' && areaVal) {
|
||||
return areaVal.split(',').includes(value);
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
// 清除所有选择
|
||||
const handleClear = () => {
|
||||
Object.keys(selectedValues).forEach((key) => {
|
||||
if (key === 'area') {
|
||||
selectedValues[key] = [];
|
||||
} else {
|
||||
selectedValues[key] = '';
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 确认筛选
|
||||
const handleConfirm = () => {
|
||||
console.log('selectedValues:', selectedValues);
|
||||
emit('confirm', selectedValues);
|
||||
const payload = { ...selectedValues };
|
||||
// 将多选的地区数组转为逗号分隔字符串(兼容各种格式)
|
||||
if (Array.isArray(payload.area) && payload.area.length > 0) {
|
||||
payload.area = payload.area.map((v) => String(v)).join(',');
|
||||
} else if (typeof payload.area === 'string' && payload.area) {
|
||||
// 如果已经是逗号分隔字符串,保持原样
|
||||
payload.area = payload.area;
|
||||
} else {
|
||||
payload.area = '';
|
||||
}
|
||||
console.log('[new-filter-page] area value to emit:', payload.area);
|
||||
// 将选中的薪资区间转换为 minSalary / maxSalary 参数
|
||||
// 始终带上 minSalary / maxSalary(含空值),便于父组件在清除时移除旧值
|
||||
let minSalary = '';
|
||||
let maxSalary = '';
|
||||
if (payload.salary) {
|
||||
const selected = salaryOptions.value.find((item) => item.value === payload.salary);
|
||||
if (selected) {
|
||||
minSalary = selected.min;
|
||||
maxSalary = selected.max;
|
||||
}
|
||||
}
|
||||
payload.minSalary = minSalary;
|
||||
payload.maxSalary = maxSalary;
|
||||
delete payload.salary;
|
||||
console.log('selectedValues:', payload);
|
||||
emit('confirm', payload);
|
||||
handleClose();
|
||||
};
|
||||
|
||||
@@ -224,22 +318,33 @@ const handleClose = () => {
|
||||
background-color: #fff;
|
||||
z-index: 9999;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.filter-header {
|
||||
height: 96rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
justify-content: center;
|
||||
padding: 0 32rpx;
|
||||
border-bottom: 1rpx solid #eee;
|
||||
background-color: #fff;
|
||||
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
|
||||
flex-shrink: 0;
|
||||
position: relative;
|
||||
|
||||
.back-btn {
|
||||
font-size: 36rpx;
|
||||
.header-title {
|
||||
font-size: 34rpx;
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.header-close {
|
||||
position: absolute;
|
||||
right: 32rpx;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
width: 48rpx;
|
||||
height: 48rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
@@ -250,13 +355,40 @@ const handleClose = () => {
|
||||
&:active {
|
||||
background-color: rgba(37, 107, 250, 0.1);
|
||||
}
|
||||
|
||||
.close-icon {
|
||||
position: relative;
|
||||
width: 28rpx;
|
||||
height: 28rpx;
|
||||
|
||||
&::before,
|
||||
&::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
width: 4rpx;
|
||||
height: 28rpx;
|
||||
border-radius: 2rpx;
|
||||
background: #5A5A68;
|
||||
}
|
||||
|
||||
.filter-title {
|
||||
font-size: 34rpx;
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
&::before {
|
||||
transform: translate(-50%, -50%) rotate(45deg);
|
||||
}
|
||||
|
||||
&::after {
|
||||
transform: translate(-50%, -50%) rotate(-45deg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.filter-body {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.filter-tabs {
|
||||
|
||||
@@ -21,14 +21,8 @@
|
||||
</view>
|
||||
<view class="card-bottom">
|
||||
<view>{{ job.postingDate }}</view>
|
||||
<view>
|
||||
<convert-distance
|
||||
:alat="job.latitude"
|
||||
:along="job.longitude"
|
||||
:blat="latitude"
|
||||
:blong="longitude"
|
||||
></convert-distance>
|
||||
<dict-Label class="mar_le10" dictType="area" :value="job.jobLocationAreaCode"></dict-Label>
|
||||
<view class="card-bottom-right">
|
||||
<text v-if="job.regionName">地区:{{ job.regionName }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
50
package-lock.json
generated
50
package-lock.json
generated
@@ -1,11 +1,13 @@
|
||||
{
|
||||
"name": "ks-app-employment-service",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"@dcloudio/uni-ui": "^1.5.11",
|
||||
"crypto-js": "^3.3.0",
|
||||
"dayjs": "^1.11.19",
|
||||
"mp-html": "^2.5.2",
|
||||
"sm-crypto": "^0.3.13"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -13,40 +15,36 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@dcloudio/uni-ui": {
|
||||
"lockfileVersion": 1,
|
||||
"dependencies": {
|
||||
"@dcloudio/uni-ui": {
|
||||
"version": "1.5.11",
|
||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-ui/-/uni-ui-1.5.11.tgz",
|
||||
"integrity": "sha512-DBtk046ofmeFd82zRI7d89SoEwrAxYzUN3WVPm1DIBkpLPG5F5QDNkHMnZGu2wNrMEmGBjBpUh3vqEY1L3jaMw=="
|
||||
"version": "1.5.12",
|
||||
"resolved": "https://registry.npmjs.org/@dcloudio/uni-ui/-/uni-ui-1.5.12.tgz",
|
||||
"integrity": "sha512-mGDl2OZSz7D8xcUAzJegWDHOqB4MEFBSW9Esb/oJiu2/3Gk9+P/Z4bA4JZ9jv9VWBYbMrYwaTfK1Z728kABdYg==",
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/crypto-js": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
|
||||
"integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/dayjs": {
|
||||
"crypto-js": {
|
||||
"version": "3.3.0",
|
||||
"resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-3.3.0.tgz",
|
||||
"integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q=="
|
||||
"version": "1.11.21",
|
||||
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz",
|
||||
"integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"dayjs": {
|
||||
"version": "1.11.19",
|
||||
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz",
|
||||
"integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw=="
|
||||
},
|
||||
"jsbn": {
|
||||
"node_modules/jsbn": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-1.1.0.tgz",
|
||||
"integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="
|
||||
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
|
||||
"integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"sm-crypto": {
|
||||
"version": "0.3.13",
|
||||
"resolved": "https://registry.npmmirror.com/sm-crypto/-/sm-crypto-0.3.13.tgz",
|
||||
"integrity": "sha512-ztNF+pZq6viCPMA1A6KKu3bgpkmYti5avykRHbcFIdSipFdkVmfUw2CnpM2kBJyppIalqvczLNM3wR8OQ0pT5w==",
|
||||
"requires": {
|
||||
"node_modules/sm-crypto": {
|
||||
"version": "0.3.14",
|
||||
"resolved": "https://registry.npmjs.org/sm-crypto/-/sm-crypto-0.3.14.tgz",
|
||||
"integrity": "sha512-sR7NuGAJH93Om8keAF2/rj1EqFzEiUey4aKGyDo3nQ2BiVqhgq8UkiIoIp5qhV9w4pG7qArhfqyewcG8AbhXbg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"jsbn": "^1.1.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,12 +10,7 @@
|
||||
<view class="card-content">
|
||||
<!-- 企业图标 -->
|
||||
<view class="company-icon">
|
||||
<image
|
||||
v-if="companyInfo.avatar"
|
||||
:src="companyInfo.avatar"
|
||||
class="logo-image"
|
||||
mode="aspectFit"
|
||||
/>
|
||||
<image v-if="companyInfo.avatar" :src="companyInfo.avatar" class="logo-image" mode="aspectFit" />
|
||||
<view v-else class="default-logo">
|
||||
<uni-icons type="home-filled" size="32" color="#256BFA"></uni-icons>
|
||||
</view>
|
||||
@@ -25,7 +20,9 @@
|
||||
<view class="company-info">
|
||||
<view class="company-name">{{ companyInfo.name || '企业名称' }}</view>
|
||||
<view class="company-details">
|
||||
<text class="size">企业规模: {{ getDictLabel('scale', companyInfo.scale) || '暂无规模数据' }}</text>
|
||||
<text class="size">
|
||||
企业规模: {{ getDictLabel('scale', companyInfo.scale) || '暂无规模数据' }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
@@ -41,12 +38,9 @@
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view
|
||||
class="nav-hidden hidden-animation"
|
||||
:class="{ 'hidden-height': shouldHideTop }"
|
||||
>
|
||||
<view class="nav-hidden hidden-animation" :class="{ 'hidden-height': shouldHideTop }">
|
||||
<view class="container-search" v-if="shouldShowJobSeekerContent">
|
||||
<view class="search-input button-click" @click="navTo('/pages/search/search')">
|
||||
<view class="search-input button-click" @click="navToSearch">
|
||||
<uni-icons class="iconsearch" color="#666666" type="search" size="18"></uni-icons>
|
||||
<text class="inpute">职位名称、薪资要求等</text>
|
||||
</view>
|
||||
@@ -81,7 +75,6 @@
|
||||
<view class="h5-action-btn press-button" @click="handleServiceClick('resume-creation')">
|
||||
<view class="btn-text">简历指导</view>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
<!-- #endif -->
|
||||
<!-- 服务功能网格 -->
|
||||
@@ -190,7 +183,11 @@
|
||||
<view class="service-icon service-icon-9">
|
||||
<IconfontIcon name="Graduation-simple-" :size="32" color="#FFFFFF" />
|
||||
</view>
|
||||
<view class="service-title" style="overflow:unset">高校毕业生<br/>智慧就业服务</view>
|
||||
<view class="service-title" style="overflow: unset">
|
||||
高校毕业生
|
||||
<br />
|
||||
智慧就业服务
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- #endif -->
|
||||
@@ -234,25 +231,16 @@
|
||||
<!-- 吸顶筛选区域占位 -->
|
||||
<view class="filter-placeholder" v-if="shouldStickyFilter && shouldShowJobSeekerContent"></view>
|
||||
|
||||
|
||||
<view class="nav-filter" :class="{ 'sticky-filter': shouldStickyFilter }" v-if="shouldShowJobSeekerContent">
|
||||
<view class="filter-top">
|
||||
<scroll-view :scroll-x="true" :show-scrollbar="false" class="tab-scroll">
|
||||
<view class="jobs-left">
|
||||
<view
|
||||
class="job button-click"
|
||||
:class="{ active: state.tabIndex === 'all' }"
|
||||
@click="choosePosition('all')"
|
||||
>
|
||||
<view class="job button-click" :class="{ active: state.tabIndex === 'all' }"
|
||||
@click="choosePosition('all')">
|
||||
全部
|
||||
</view>
|
||||
<view
|
||||
class="job button-click"
|
||||
:class="{ active: state.tabIndex === index }"
|
||||
v-for="(item, index) in userInfo.jobTitle"
|
||||
:key="index"
|
||||
@click="choosePosition(index)"
|
||||
>
|
||||
<view class="job button-click" :class="{ active: state.tabIndex === index }"
|
||||
v-for="(item, index) in userInfo.jobTitle" :key="index" @click="choosePosition(index)">
|
||||
{{ item }}
|
||||
</view>
|
||||
</view>
|
||||
@@ -262,64 +250,48 @@
|
||||
<uni-icons class="iconsearch" color="#666D7F" type="plusempty" size="18"></uni-icons>
|
||||
<text>添加</text>
|
||||
</view>
|
||||
<view class="jobs-add button-click" @click="navTo('/packageA/pages/city-select/index')" style="padding-right:0;">
|
||||
<view class="jobs-add button-click" @click="navTo('/packageA/pages/city-select/index')"
|
||||
style="padding-right: 0">
|
||||
<text>{{ selectedCity.name || '地区' }}</text>
|
||||
<image class="right-sx" :class="{ active: showFilter }" src="@/static/icon/shaixun.png"></image>
|
||||
</view>
|
||||
</view>
|
||||
<view class="filter-bottom">
|
||||
<view class="btm-left">
|
||||
<view
|
||||
class="button-click filterbtm"
|
||||
:class="{ active: pageState.search.order === item.value }"
|
||||
v-for="item in rangeOptions"
|
||||
@click="handelHostestSearch(item)"
|
||||
:key="item.value"
|
||||
>
|
||||
<view class="button-click filterbtm" :class="{ active: pageState.search.order === item.value }"
|
||||
v-for="item in rangeOptions" @click="handelHostestSearch(item)" :key="item.value">
|
||||
{{ item.text }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="btm-right-wrap">
|
||||
<view class="button-click clear-btn" v-if="hasFilterConditions" @click="clearFilter">
|
||||
清除筛选
|
||||
</view>
|
||||
<view class="btm-right button-click" @click="openFilter">
|
||||
筛选
|
||||
<image class="right-sx" :class="{ active: showFilter }" src="@/static/icon/shaixun.png"></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="table-list">
|
||||
<scroll-view
|
||||
:scroll-y="true"
|
||||
class="falls-scroll"
|
||||
@scroll="handleScroll"
|
||||
@scrolltolower="scrollBottom"
|
||||
:enable-back-to-top="false"
|
||||
:scroll-with-animation="false"
|
||||
>
|
||||
<scroll-view :scroll-y="true" class="falls-scroll" @scroll="handleScroll" @scrolltolower="scrollBottom"
|
||||
:enable-back-to-top="false" :scroll-with-animation="false">
|
||||
<view class="falls" v-if="list.length">
|
||||
<!-- #ifdef MP-WEIXIN -->
|
||||
<!-- 小程序使用具名插槽 -->
|
||||
<custom-waterfalls-flow
|
||||
:column="columnCount"
|
||||
:columnSpace="columnSpace"
|
||||
ref="waterfallsFlowRef"
|
||||
:value="list"
|
||||
>
|
||||
<custom-waterfalls-flow :column="columnCount" :columnSpace="columnSpace" ref="waterfallsFlowRef"
|
||||
:value="list">
|
||||
<view v-for="(job, index) in list" :key="index" :slot="`slot${index}`">
|
||||
<view class="item" v-if="!job.recommend">
|
||||
<view
|
||||
class="falls-card"
|
||||
:class="{
|
||||
'disabled-card': Number(job.isPublish) === 0
|
||||
}"
|
||||
@click="Number(job.isPublish) === 1 ? nextDetail(job) : null"
|
||||
>
|
||||
<view class="falls-card" :class="{
|
||||
'disabled-card': Number(job.isPublish) === 0,
|
||||
}" @click="Number(job.isPublish) === 1 ? nextDetail(job) : null">
|
||||
<view class="falls-card-pay">
|
||||
<view class="fl_1 falls-card-title">{{ job.jobTitle }}</view>
|
||||
<view class="fr_1 pay-text">
|
||||
<Salary-Expectation
|
||||
:max-salary="job.maxSalary"
|
||||
:min-salary="job.minSalary"
|
||||
:is-month="true"
|
||||
></Salary-Expectation>
|
||||
<Salary-Expectation :max-salary="job.maxSalary" :min-salary="job.minSalary"
|
||||
:is-month="true"></Salary-Expectation>
|
||||
</view>
|
||||
<image v-if="job.isHot" class="flame" src="/static/icon/flame.png"></image>
|
||||
</view>
|
||||
@@ -343,16 +315,11 @@
|
||||
<view class="falls-card-pepleNumber">
|
||||
<view>
|
||||
<image class="point2" src="/static/icon/pintDate.png"></image>
|
||||
<view class="fl_1">
|
||||
发布日期:{{ job.postingDate || '暂无数据' }}
|
||||
</view>
|
||||
<view class="fl_1">发布日期:{{ job.postingDate || '暂无数据' }}</view>
|
||||
</view>
|
||||
<view>
|
||||
|
||||
<image class="point3" src="/static/icon/pointpeople.png"></image>
|
||||
<view class="fl_1">
|
||||
招聘人数:{{ vacanciesTo(job.vacancies) }}
|
||||
</view>
|
||||
<view class="fl_1">招聘人数:{{ vacanciesTo(job.vacancies) }}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="falls-card-company2">
|
||||
@@ -360,19 +327,16 @@
|
||||
<view class="fl_1">
|
||||
{{ job.companyName }}
|
||||
</view>
|
||||
<view class="fr-1" v-if="job.regionName">
|
||||
地区:{{ job.regionName }}
|
||||
</view>
|
||||
<view class="fr-1" v-if="job.regionName">地区:{{ job.regionName }}</view>
|
||||
</view>
|
||||
<!-- 未通过审核状态显示 -->
|
||||
<view class="unpublished-badge" v-if="Number(job.isPublish) === 0">
|
||||
未通过审核
|
||||
</view>
|
||||
<view class="unpublished-badge" v-if="Number(job.isPublish) === 0">未通过审核</view>
|
||||
<!-- 招聘者显示上下架开关 -->
|
||||
<view class="falls-card-actions" v-if="isRecruiter && Number(job.isPublish) === 1">
|
||||
<view class="job-status-switch" @click.stop="toggleJobStatus(job)">
|
||||
<view class="switch-track" :class="{ 'active': Number(job.jobStatus) === 0 }">
|
||||
<view class="switch-thumb" :class="{ 'active': Number(job.jobStatus) === 0 }"></view>
|
||||
<view class="switch-track" :class="{ active: Number(job.jobStatus) === 0 }">
|
||||
<view class="switch-thumb"
|
||||
:class="{ active: Number(job.jobStatus) === 0 }"></view>
|
||||
</view>
|
||||
<view class="switch-label">
|
||||
{{ Number(job.jobStatus) === 0 ? '已上架' : '已下架' }}
|
||||
@@ -403,29 +367,20 @@
|
||||
<!-- #endif -->
|
||||
<!-- #ifndef MP-WEIXIN -->
|
||||
<!-- H5/App使用作用域插槽 -->
|
||||
<custom-waterfalls-flow
|
||||
:column="columnCount"
|
||||
:columnSpace="columnSpace"
|
||||
ref="waterfallsFlowRef"
|
||||
:value="list"
|
||||
>
|
||||
<custom-waterfalls-flow :column="columnCount" :columnSpace="columnSpace" ref="waterfallsFlowRef"
|
||||
:value="list">
|
||||
<template v-slot:default="job">
|
||||
<view class="item" v-if="!job.recommend">
|
||||
<view
|
||||
class="falls-card"
|
||||
:class="{
|
||||
'disabled-card': (Number(job.jobStatus) === 1 || Number(job.isPublish) === 0) && currentUserType !== 0
|
||||
}"
|
||||
@click="Number(job.isPublish) === 1 ? nextDetail(job) : null"
|
||||
>
|
||||
<view class="falls-card" :class="{
|
||||
'disabled-card':
|
||||
(Number(job.jobStatus) === 1 || Number(job.isPublish) === 0) &&
|
||||
currentUserType !== 0,
|
||||
}" @click="Number(job.isPublish) === 1 ? nextDetail(job) : null">
|
||||
<view class="falls-card-pay">
|
||||
<view class="fl_1 falls-card-title">{{ job.jobTitle }}</view>
|
||||
<view class="fr_1 pay-text">
|
||||
<Salary-Expectation
|
||||
:max-salary="job.maxSalary"
|
||||
:min-salary="job.minSalary"
|
||||
:is-month="true"
|
||||
></Salary-Expectation>
|
||||
<Salary-Expectation :max-salary="job.maxSalary" :min-salary="job.minSalary"
|
||||
:is-month="true"></Salary-Expectation>
|
||||
</view>
|
||||
<image v-if="job.isHot" class="flame" src="/static/icon/flame.png"></image>
|
||||
</view>
|
||||
@@ -446,9 +401,7 @@
|
||||
<view class="falls-card-pepleNumber">
|
||||
<view>
|
||||
<image class="point2" src="/static/icon/pintDate.png"></image>
|
||||
<view class="fl_1">
|
||||
发布日期:{{ job.postingDate || '暂无数据' }}
|
||||
</view>
|
||||
<view class="fl_1">发布日期:{{ job.postingDate || '暂无数据' }}</view>
|
||||
</view>
|
||||
<view>
|
||||
<image class="point3" src="/static/icon/pointpeople.png"></image>
|
||||
@@ -462,19 +415,16 @@
|
||||
<view class="fl_1">
|
||||
{{ job.companyName }}
|
||||
</view>
|
||||
<view class="fr-1" v-if="job.regionName">
|
||||
地区:{{ job.regionName }}
|
||||
</view>
|
||||
<view class="fr-1" v-if="job.regionName">地区:{{ job.regionName }}</view>
|
||||
</view>
|
||||
<!-- 未通过审核状态显示 -->
|
||||
<view class="unpublished-badge" v-if="Number(job.isPublish) === 0">
|
||||
未通过审核
|
||||
</view>
|
||||
<view class="unpublished-badge" v-if="Number(job.isPublish) === 0">未通过审核</view>
|
||||
<!-- 招聘者显示上下架开关 -->
|
||||
<view class="falls-card-actions" v-if="isRecruiter && Number(job.isPublish) === 1">
|
||||
<view class="job-status-switch" @click.stop="toggleJobStatus(job)">
|
||||
<view class="switch-track" :class="{ 'active': Number(job.jobStatus) === 0 }">
|
||||
<view class="switch-thumb" :class="{ 'active': Number(job.jobStatus) === 0 }"></view>
|
||||
<view class="switch-track" :class="{ active: Number(job.jobStatus) === 0 }">
|
||||
<view class="switch-thumb"
|
||||
:class="{ active: Number(job.jobStatus) === 0 }"></view>
|
||||
</view>
|
||||
<view class="switch-label">
|
||||
{{ Number(job.jobStatus) === 0 ? '已上架' : '已下架' }}
|
||||
@@ -511,14 +461,8 @@
|
||||
<!-- 筛选 -->
|
||||
<select-filter ref="selectFilterModel" />
|
||||
<!-- 新筛选页面 -->
|
||||
<new-filter-page
|
||||
:show="showNewFilter"
|
||||
@confirm="handleNewFilterConfirm"
|
||||
@close="handleNewFilterClose"
|
||||
@update:show="(value) => showNewFilter = value"
|
||||
/>
|
||||
|
||||
|
||||
<new-filter-page :show="showNewFilter" @confirm="handleNewFilterConfirm" @close="handleNewFilterClose"
|
||||
@update:show="(value) => (showNewFilter = value)" />
|
||||
|
||||
<!-- <view class="maskFristEntry" v-if="maskFristEntry">
|
||||
<view class="entry-content">
|
||||
@@ -568,7 +512,7 @@ const companyInfo = reactive({
|
||||
avatar: '',
|
||||
industry: '',
|
||||
scale: '',
|
||||
isVerified: false
|
||||
isVerified: false,
|
||||
});
|
||||
|
||||
// 计算是否显示企业卡片
|
||||
@@ -625,6 +569,12 @@ const shouldShowCompanyContent = computed(() => {
|
||||
return userType === 0;
|
||||
});
|
||||
|
||||
// 判断是否有筛选条件(用于显示/隐藏清除按钮)
|
||||
const hasFilterConditions = computed(() => {
|
||||
const searchKeys = Object.keys(pageState.search).filter((k) => k !== 'order' && pageState.search[k]);
|
||||
return searchKeys.length > 0 || Object.keys(conditionSearch.value).length > 0 || Boolean(selectedCity.value.code);
|
||||
});
|
||||
|
||||
// 判断当前用户是否为招聘者(企业用户)
|
||||
const isRecruiter = computed(() => {
|
||||
if (!hasLogin.value) {
|
||||
@@ -653,7 +603,7 @@ import { useRecommedIndexedDBStore, jobRecommender } from '@/stores/useRecommedI
|
||||
import { useScrollDirection } from '@/hook/useScrollDirection';
|
||||
import { useColumnCount } from '@/hook/useColumnCount';
|
||||
|
||||
import IconfontIcon from '@/components/IconfontIcon/IconfontIcon.vue'
|
||||
import IconfontIcon from '@/components/IconfontIcon/IconfontIcon.vue';
|
||||
// 企业卡片组件已内联到模板中
|
||||
// 滚动状态管理
|
||||
const shouldHideTop = ref(false);
|
||||
@@ -753,7 +703,7 @@ const helpClick = () => {
|
||||
};
|
||||
const helpTaskClick = () => {
|
||||
navTo('/packageB/priority/index');
|
||||
}
|
||||
};
|
||||
//招聘会模块跳转
|
||||
const handleJobFairClick = () => {
|
||||
if (checkLogin()) {
|
||||
@@ -782,7 +732,7 @@ const rangeOptions = ref([
|
||||
{ value: 1, text: '最热' },
|
||||
{ value: 2, text: '最新发布' },
|
||||
// { value: 3, text: '疆外' },
|
||||
{ value: 4, text: '零工市场' }
|
||||
{ value: 4, text: '零工岗位' },
|
||||
]);
|
||||
const isLoaded = ref(false);
|
||||
const isInitialized = ref(false); // 添加初始化标志
|
||||
@@ -833,7 +783,7 @@ const getCompanyInfo = () => {
|
||||
name: companyInfo.name,
|
||||
industry: companyInfo.industry,
|
||||
size: companyInfo.scale,
|
||||
isVerified: companyInfo.isVerified
|
||||
isVerified: companyInfo.isVerified,
|
||||
});
|
||||
} else {
|
||||
console.log('缓存中没有company字段,企业信息已重置');
|
||||
@@ -854,7 +804,6 @@ const goToCompanyInfo = () => {
|
||||
navTo('/packageA/pages/company-mine/company-info');
|
||||
};
|
||||
|
||||
|
||||
// 组件初始化时加载数据
|
||||
onMounted(() => {
|
||||
// 获取企业信息
|
||||
@@ -906,11 +855,15 @@ onShow(() => {
|
||||
});
|
||||
|
||||
// 监听用户信息变化,当登录状态改变时重新获取企业信息
|
||||
watch([hasLogin, userInfo], () => {
|
||||
watch(
|
||||
[hasLogin, userInfo],
|
||||
() => {
|
||||
if (hasLogin.value) {
|
||||
getCompanyInfo();
|
||||
}
|
||||
}, { deep: true });
|
||||
},
|
||||
{ deep: true }
|
||||
);
|
||||
|
||||
// 登录检查函数
|
||||
const checkLogin = () => {
|
||||
@@ -931,7 +884,7 @@ const handleLoginSuccess = () => {
|
||||
// 重新获取企业信息
|
||||
getCompanyInfo();
|
||||
//四级联动单点及权限
|
||||
getIsFourLevelLinkagePurview()
|
||||
getIsFourLevelLinkagePurview();
|
||||
};
|
||||
// H5环境下从URL获取token并自动登录
|
||||
// onLoad 函数已移至下方,包含筛选参数处理
|
||||
@@ -943,26 +896,22 @@ const handleNearbyClick = () => {
|
||||
const handleNoticeClick = () => {
|
||||
if (checkLogin()) {
|
||||
uni.navigateTo({
|
||||
url:'/packageB/notice/index'
|
||||
})
|
||||
}
|
||||
url: '/packageB/notice/index',
|
||||
});
|
||||
}
|
||||
};
|
||||
function handleInstitutionClick(type) {
|
||||
|
||||
if (checkLogin()) {
|
||||
if (type == 'evaluate') {
|
||||
uni.navigateTo({
|
||||
url:'/packageB/institution/evaluationAgency'
|
||||
})
|
||||
url: '/packageB/institution/evaluationAgency',
|
||||
});
|
||||
} else if (type == 'training') {
|
||||
uni.navigateTo({
|
||||
url:'/packageB/institution/trainingInstitution'
|
||||
})
|
||||
url: '/packageB/institution/trainingInstitution',
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// 处理服务功能点击
|
||||
const handleServiceClick = (serviceType) => {
|
||||
@@ -975,29 +924,29 @@ const handleServiceClick = (serviceType) => {
|
||||
// 处理直播按钮点击
|
||||
const handleLiveClick = () => {
|
||||
// #ifdef MP-WEIXIN
|
||||
const feedId = "sphKH1AEeLfTJJE";
|
||||
const feedId = 'sphKH1AEeLfTJJE';
|
||||
|
||||
// 使用微信原生 API 打开视频号主页
|
||||
if (typeof wx !== "undefined" && wx.openChannelsUserProfile) {
|
||||
if (typeof wx !== 'undefined' && wx.openChannelsUserProfile) {
|
||||
wx.openChannelsUserProfile({
|
||||
finderUserName: feedId,
|
||||
success: (res) => {
|
||||
console.log("打开视频号成功", res);
|
||||
console.log('打开视频号成功', res);
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error("打开视频号失败", err);
|
||||
$api.msg(err.errMsg || "无法打开直播,请稍后重试");
|
||||
console.error('打开视频号失败', err);
|
||||
$api.msg(err.errMsg || '无法打开直播,请稍后重试');
|
||||
},
|
||||
});
|
||||
} else {
|
||||
// 如果 API 不存在,提示用户更新微信版本
|
||||
$api.msg("请更新微信版本以使用该功能");
|
||||
$api.msg('请更新微信版本以使用该功能');
|
||||
}
|
||||
// #endif
|
||||
|
||||
// #ifndef MP-WEIXIN
|
||||
// 非微信小程序环境提示
|
||||
$api.msg("该功能仅在微信小程序中可用");
|
||||
$api.msg('该功能仅在微信小程序中可用');
|
||||
// #endif
|
||||
};
|
||||
|
||||
@@ -1007,7 +956,7 @@ const handleSalaryInfoClick = () => {
|
||||
};
|
||||
|
||||
const handleH5SalaryClick = () => {
|
||||
const salaryUrl = "https://www.mohrss.gov.cn/SYrlzyhshbzb/laodongguanxi_/fwyd/202506/t20250627_544623.html";
|
||||
const salaryUrl = 'https://www.mohrss.gov.cn/SYrlzyhshbzb/laodongguanxi_/fwyd/202506/t20250627_544623.html';
|
||||
window.location.assign(salaryUrl);
|
||||
};
|
||||
|
||||
@@ -1108,9 +1057,12 @@ function navToService(serviceType) {
|
||||
'employment-news': '/packageA/pages/service/employment-news',
|
||||
'more-services': '/packageA/pages/service/more-services',
|
||||
};
|
||||
if((serviceType=='skill-training'||serviceType=='skill-evaluation')&&!uni.getStorageSync('userInfo').idCard){
|
||||
if (
|
||||
(serviceType == 'skill-training' || serviceType == 'skill-evaluation') &&
|
||||
!uni.getStorageSync('userInfo').idCard
|
||||
) {
|
||||
$api.msg('请先完善信息');
|
||||
return
|
||||
return;
|
||||
}
|
||||
const route = serviceRoutes[serviceType];
|
||||
if (route) {
|
||||
@@ -1126,6 +1078,38 @@ function openFilter() {
|
||||
emits('onShowTabbar', false);
|
||||
}
|
||||
|
||||
// 跳转到搜索页,并携带筛选条件
|
||||
function navToSearch() {
|
||||
const query = {};
|
||||
// 携带筛选弹窗中选择的地区(确保是逗号分隔字符串)
|
||||
const areaVal = pageState.search.area;
|
||||
if (areaVal && String(areaVal)) {
|
||||
query.area = String(areaVal);
|
||||
}
|
||||
// 携带城市选择器中选择的regionCode
|
||||
if (conditionSearch.value.regionCode) {
|
||||
query.regionCode = String(conditionSearch.value.regionCode);
|
||||
}
|
||||
console.log('[navToSearch] query params:', query);
|
||||
navTo('/pages/search/search', { query });
|
||||
}
|
||||
|
||||
// 清除所有筛选条件
|
||||
function clearFilter() {
|
||||
// 保留 order 排序方式
|
||||
const currentOrder = pageState.search.order;
|
||||
pageState.search = { order: currentOrder };
|
||||
// 清除城市选择
|
||||
conditionSearch.value = {};
|
||||
selectedCity.value = { code: '', name: '' };
|
||||
// 刷新列表
|
||||
if (state.tabIndex === 'all') {
|
||||
getJobRecommend('refresh');
|
||||
} else {
|
||||
getJobList('refresh');
|
||||
}
|
||||
}
|
||||
|
||||
function handleNewFilterConfirm(values) {
|
||||
pageState.search = {
|
||||
...pageState.search,
|
||||
@@ -1144,7 +1128,9 @@ function handleNewFilterConfirm(values) {
|
||||
showNewFilter.value = false;
|
||||
getJobList('refresh');
|
||||
// 短暂延迟后解除交互锁,避免数据刷新导致顶部区域回弹
|
||||
setTimeout(() => { isInteractingWithFilter.value = false; }, 400);
|
||||
setTimeout(() => {
|
||||
isInteractingWithFilter.value = false;
|
||||
}, 400);
|
||||
emits('onShowTabbar', true);
|
||||
}
|
||||
|
||||
@@ -1180,7 +1166,9 @@ onLoad((options) => {
|
||||
function handleNewFilterClose() {
|
||||
showNewFilter.value = false;
|
||||
emits('onShowTabbar', true);
|
||||
setTimeout(() => { isInteractingWithFilter.value = false; }, 200);
|
||||
setTimeout(() => {
|
||||
isInteractingWithFilter.value = false;
|
||||
}, 200);
|
||||
}
|
||||
|
||||
function handleFilterConfirm(e) {
|
||||
@@ -1203,7 +1191,11 @@ function choosePosition(index) {
|
||||
inputText.value = '';
|
||||
getJobList('refresh');
|
||||
}
|
||||
nextTick(() => { setTimeout(() => { isInteractingWithFilter.value = false; }, 300); });
|
||||
nextTick(() => {
|
||||
setTimeout(() => {
|
||||
isInteractingWithFilter.value = false;
|
||||
}, 300);
|
||||
});
|
||||
}
|
||||
const isShowJw = ref(0);
|
||||
function handelHostestSearch(val) {
|
||||
@@ -1222,7 +1214,11 @@ function handelHostestSearch(val) {
|
||||
} else {
|
||||
getJobList('refresh');
|
||||
}
|
||||
nextTick(() => { setTimeout(() => { isInteractingWithFilter.value = false; }, 300); });
|
||||
nextTick(() => {
|
||||
setTimeout(() => {
|
||||
isInteractingWithFilter.value = false;
|
||||
}, 300);
|
||||
});
|
||||
}
|
||||
|
||||
function getJobRecommend(type = 'add') {
|
||||
@@ -1247,7 +1243,7 @@ function getJobRecommend(type = 'add') {
|
||||
const cachedUserInfo = uni.getStorageSync('userInfo') || {};
|
||||
const cachedIsCompanyUser = cachedUserInfo.isCompanyUser;
|
||||
const userType = storeIsCompanyUser !== undefined ? Number(storeIsCompanyUser) : Number(cachedIsCompanyUser);
|
||||
console.log('---------userType-----', userType)
|
||||
console.log('---------userType-----', userType);
|
||||
// 只有企业用户(isCompanyUser=0)才添加current字段
|
||||
if (userType === 0) {
|
||||
params.current = pageNull.value;
|
||||
@@ -1258,7 +1254,8 @@ function getJobRecommend(type = 'add') {
|
||||
params.isPublish = 1;
|
||||
}
|
||||
let comd = { recommend: true, jobCategory: '', tip: '确认你的兴趣,为您推荐更多合适的岗位' };
|
||||
$api.createRequest('/app/job/recommend', params).then((resData) => {
|
||||
$api.createRequest('/app/job/recommend', params)
|
||||
.then((resData) => {
|
||||
const { data, total } = resData;
|
||||
pageState.total = 0;
|
||||
if (type === 'add') {
|
||||
@@ -1305,7 +1302,8 @@ function getJobRecommend(type = 'add') {
|
||||
if (!data.length) {
|
||||
useUserStore().initSeesionId();
|
||||
}
|
||||
}).finally(() => {
|
||||
})
|
||||
.finally(() => {
|
||||
isRecommendLoading.value = false;
|
||||
});
|
||||
}
|
||||
@@ -1374,10 +1372,11 @@ const jobUp = (encryptJobId) => {
|
||||
|
||||
uni.showLoading({
|
||||
title: '处理中...',
|
||||
mask: true
|
||||
mask: true,
|
||||
});
|
||||
|
||||
$api.createRequest(`/app/job/jobUp/${encryptJobId}`, {}, 'PUT', true).then((res) => {
|
||||
$api.createRequest(`/app/job/jobUp/${encryptJobId}`, {}, 'PUT', true)
|
||||
.then((res) => {
|
||||
uni.hideLoading();
|
||||
$api.msg('上架成功');
|
||||
// 刷新数据
|
||||
@@ -1386,7 +1385,8 @@ const jobUp = (encryptJobId) => {
|
||||
} else {
|
||||
getJobList('refresh');
|
||||
}
|
||||
}).catch((err) => {
|
||||
})
|
||||
.catch((err) => {
|
||||
uni.hideLoading();
|
||||
console.error('上架失败:', err);
|
||||
$api.msg('上架失败,请重试');
|
||||
@@ -1399,10 +1399,11 @@ const jobDown = (encryptJobId) => {
|
||||
|
||||
uni.showLoading({
|
||||
title: '处理中...',
|
||||
mask: true
|
||||
mask: true,
|
||||
});
|
||||
|
||||
$api.createRequest(`/app/job/jobDown/${encryptJobId}`, {}, 'PUT', true).then((res) => {
|
||||
$api.createRequest(`/app/job/jobDown/${encryptJobId}`, {}, 'PUT', true)
|
||||
.then((res) => {
|
||||
uni.hideLoading();
|
||||
$api.msg('下架成功');
|
||||
// 刷新数据
|
||||
@@ -1411,7 +1412,8 @@ const jobDown = (encryptJobId) => {
|
||||
} else {
|
||||
getJobList('refresh');
|
||||
}
|
||||
}).catch((err) => {
|
||||
})
|
||||
.catch((err) => {
|
||||
uni.hideLoading();
|
||||
console.error('下架失败:', err);
|
||||
$api.msg('下架失败,请重试');
|
||||
@@ -1424,19 +1426,20 @@ const toggleJobStatus = (job) => {
|
||||
|
||||
uni.showLoading({
|
||||
title: '处理中...',
|
||||
mask: true
|
||||
mask: true,
|
||||
});
|
||||
|
||||
// 根据当前状态决定调用哪个接口
|
||||
const isCurrentlyUp = Number(job.jobStatus) === 0; // 0: 已上架, 1: 已下架
|
||||
const apiUrl = isCurrentlyUp ? `/app/job/jobDown/${job.encryptJobId}` : `/app/job/jobUp/${job.encryptJobId}`;
|
||||
|
||||
$api.createRequest(apiUrl, {}, 'PUT', true).then((res) => {
|
||||
$api.createRequest(apiUrl, {}, 'PUT', true)
|
||||
.then((res) => {
|
||||
uni.hideLoading();
|
||||
$api.msg(isCurrentlyUp ? '下架成功' : '上架成功');
|
||||
|
||||
// 更新本地数据状态,避免立即刷新整个列表
|
||||
const jobIndex = list.value.findIndex(item => item.encryptJobId === job.encryptJobId);
|
||||
const jobIndex = list.value.findIndex((item) => item.encryptJobId === job.encryptJobId);
|
||||
if (jobIndex !== -1) {
|
||||
// 更新状态
|
||||
list.value[jobIndex].jobStatus = isCurrentlyUp ? 1 : 0;
|
||||
@@ -1448,27 +1451,34 @@ const toggleJobStatus = (job) => {
|
||||
// } else {
|
||||
// getJobList('refresh');
|
||||
// }
|
||||
}).catch((err) => {
|
||||
})
|
||||
.catch((err) => {
|
||||
uni.hideLoading();
|
||||
console.error('操作失败:', err);
|
||||
$api.msg(isCurrentlyUp ? '下架失败,请重试' : '上架失败,请重试');
|
||||
});
|
||||
};
|
||||
const isFourLevelLinkagePurview=ref(false)
|
||||
const isFourLevelLinkagePurview = ref(false);
|
||||
const getIsFourLevelLinkagePurview = () => {
|
||||
let userInfo = uni.getStorageSync('userInfo')
|
||||
let userInfo = uni.getStorageSync('userInfo');
|
||||
if (userInfo) {
|
||||
$api.myRequest('/auth/login2/ks',{userid: userInfo.dwUserid, idcardno: userInfo.idCard},"POST",9100,{}).then(res=>{
|
||||
$api.myRequest(
|
||||
'/auth/login2/ks',
|
||||
{ userid: userInfo.dwUserid, idcardno: userInfo.idCard },
|
||||
'POST',
|
||||
9100,
|
||||
{}
|
||||
).then((res) => {
|
||||
if (res.code == 200) {
|
||||
uni.setStorageSync('fourLevelLinkage-token',res.data.access_token)
|
||||
let roleIdList= ['103','106','107']
|
||||
if(res.data.roleIdList.some(item=>roleIdList.includes(item))){
|
||||
isFourLevelLinkagePurview.value=true
|
||||
uni.setStorageSync('fourLevelLinkage-token', res.data.access_token);
|
||||
let roleIdList = ['103', '106', '107'];
|
||||
if (res.data.roleIdList.some((item) => roleIdList.includes(item))) {
|
||||
isFourLevelLinkagePurview.value = true;
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
function dataToImg(data) {
|
||||
const result = data.map((item) => ({
|
||||
...item,
|
||||
@@ -1483,11 +1493,11 @@ import storeRc from '@/utilsRc/store/index.js';
|
||||
// 跳转到高校毕业页面
|
||||
function goRc() {
|
||||
if (checkLogin()) {
|
||||
let userInfo = uni.getStorageSync('userInfo')
|
||||
let userInfo = uni.getStorageSync('userInfo');
|
||||
if (userInfo.isCompanyUser == 2) {
|
||||
storeRc.dispatch('LoginByID', userInfo.dwUserid || 2025111679160750).then(res => {
|
||||
storeRc.dispatch('LoginByID', userInfo.dwUserid || 2025111679160750).then((res) => {
|
||||
// storeRc.dispatch('LoginByID', 2025111679160750).then(res => {
|
||||
storeRc.dispatch('GetInfo').then(res => {
|
||||
storeRc.dispatch('GetInfo').then((res) => {
|
||||
navTo('/packageRc/pages/daiban/daiban');
|
||||
});
|
||||
});
|
||||
@@ -1495,9 +1505,9 @@ function goRc(){
|
||||
// test0002 202511381669113
|
||||
// test0003 2025111679160750
|
||||
} else if (userInfo.isCompanyUser == 1) {
|
||||
storeRc.dispatch('LoginByUserInfo', userInfo).then(res => {
|
||||
storeRc.dispatch('LoginByUserInfo', userInfo).then((res) => {
|
||||
navTo('/packageRc/pages/index/index');
|
||||
})
|
||||
});
|
||||
} else {
|
||||
showToast('企业账号无法查看此模块~');
|
||||
}
|
||||
@@ -1507,8 +1517,8 @@ function goRc(){
|
||||
// 跳转到素质测评
|
||||
function goCa() {
|
||||
if (checkLogin()) {
|
||||
let userInfo = uni.getStorageSync('userInfo')
|
||||
storeRc.dispatch('LoginByUserInfo', userInfo).then(res => {
|
||||
let userInfo = uni.getStorageSync('userInfo');
|
||||
storeRc.dispatch('LoginByUserInfo', userInfo).then((res) => {
|
||||
navTo(`/packageCa/search/search?name=${userInfo.name}&userId=${userInfo.idCard}`);
|
||||
});
|
||||
}
|
||||
@@ -1516,14 +1526,13 @@ function goCa(){
|
||||
// 跳转到AI面试
|
||||
function goCaAI() {
|
||||
if (checkLogin()) {
|
||||
let userInfo = uni.getStorageSync('userInfo')
|
||||
storeRc.dispatch('LoginByUserInfo', userInfo).then(res => {
|
||||
let userInfo = uni.getStorageSync('userInfo');
|
||||
storeRc.dispatch('LoginByUserInfo', userInfo).then((res) => {
|
||||
navTo(`/packageCa/search/AIAudition?name=${userInfo.name}&userId=${userInfo.idCard}`);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
defineExpose({ loadData });
|
||||
</script>
|
||||
|
||||
@@ -2027,6 +2036,16 @@ defineExpose({ loadData });
|
||||
font-weight: 500;
|
||||
font-size: 32rpx;
|
||||
color: #256BFA;
|
||||
.btm-right-wrap
|
||||
display: flex
|
||||
align-items: center
|
||||
.clear-btn
|
||||
font-family: 'PingFangSC-Regular', 'PingFang SC', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
font-weight: 400;
|
||||
font-size: 28rpx;
|
||||
color: #999;
|
||||
margin-right: 20rpx;
|
||||
white-space: nowrap;
|
||||
.btm-right
|
||||
font-family: 'PingFangSC-Regular', 'PingFang SC', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
font-weight: 400;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<template>
|
||||
<view class="container safe-area-top">
|
||||
<!-- 自定义头部搜索框 -->
|
||||
<view class="custom-header">
|
||||
<view class="custom-header" :style="{ paddingTop: statusBarHeight + 'px' }">
|
||||
<view class="top">
|
||||
<!-- <image class="btnback button-click" src="@/static/icon/back.png" @click="navBack"></image> -->
|
||||
<image class="btnback button-click" src="@/static/icon/back.png" @click="navBack"></image>
|
||||
<view class="search-box">
|
||||
<uni-icons
|
||||
class="iconsearch"
|
||||
@@ -55,6 +55,11 @@ import { storeToRefs } from 'pinia';
|
||||
import { useColumnCount } from '@/hook/useColumnCount';
|
||||
import img from '@/static/icon/filter.png';
|
||||
const { longitudeVal, latitudeVal } = storeToRefs(useLocationStore());
|
||||
const statusBarHeight = ref(0);
|
||||
// #ifdef H5
|
||||
const sysInfo = uni.getSystemInfoSync();
|
||||
statusBarHeight.value = sysInfo.statusBarHeight || 0;
|
||||
// #endif
|
||||
const searchValue = ref('');
|
||||
const historyList = ref([]);
|
||||
const searchParams = ref({});
|
||||
@@ -79,7 +84,16 @@ onLoad((query) => {
|
||||
if (arr) {
|
||||
historyList.value = uni.getStorageSync('searchList');
|
||||
}
|
||||
const {job} = query;
|
||||
const {job, area, regionCode} = query;
|
||||
// 从首页筛选条件传入的地区和区域编码
|
||||
console.log('[search-page] onLoad query:', JSON.stringify(query));
|
||||
if (area) {
|
||||
pageState.search.area = String(area);
|
||||
console.log('[search-page] set area:', pageState.search.area);
|
||||
}
|
||||
if (regionCode) {
|
||||
pageState.search.regionCode = String(regionCode);
|
||||
}
|
||||
if (job) {
|
||||
searchValue.value = job;
|
||||
searchBtn();
|
||||
@@ -161,6 +175,7 @@ function getJobList(type = 'add') {
|
||||
...pageState.search,
|
||||
jobTitle: searchValue.value,
|
||||
};
|
||||
console.log('[search-page] getJobList params:', JSON.stringify(params));
|
||||
|
||||
$api.createRequest('/app/job/list', params, 'GET', true).then((resData) => {
|
||||
const { rows, total } = resData;
|
||||
|
||||
Reference in New Issue
Block a user