Compare commits
7 Commits
yxl
...
d7b7f8d111
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d7b7f8d111 | ||
|
|
3980aecd56 | ||
|
|
805122c23f | ||
|
|
ba9e1d279d | ||
|
|
4ea7b8abb4 | ||
|
|
43eb458c6a | ||
|
|
809e57347a |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -23,4 +23,5 @@ pnpm-debug.log*
|
||||
/output/
|
||||
/hs_err_pid*
|
||||
*.local
|
||||
yarn.lock
|
||||
yarn.lock
|
||||
.codegraph
|
||||
@@ -1,127 +1,135 @@
|
||||
<template>
|
||||
<view v-if="show" class="filter-container">
|
||||
<!-- 左侧标签页 -->
|
||||
<view class="filter-tabs">
|
||||
<view
|
||||
v-for="(tab, index) in tabs"
|
||||
:key="index"
|
||||
class="tab-item"
|
||||
:class="{ active: activeTab === tab.key }"
|
||||
@click="activeTab = tab.key"
|
||||
>
|
||||
{{ tab.label }}
|
||||
<!-- 头部 -->
|
||||
<view class="filter-header">
|
||||
<text class="header-title">筛选</text>
|
||||
<view class="header-close-btn btn-feel" @click="handleClose">
|
||||
<uni-icons type="closeempty" size="18" color="#666"></uni-icons>
|
||||
<text class="close-text">关闭</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 右侧内容区域 -->
|
||||
<view class="filter-right">
|
||||
<!-- 内容区域 -->
|
||||
<view class="filter-content">
|
||||
<!-- 学历要求 -->
|
||||
<view v-if="activeTab === 'education'" class="content-section">
|
||||
<radio-group @change="(e) => handleSelect('education', e)">
|
||||
<label
|
||||
v-for="option in educationOptions"
|
||||
:key="option.value"
|
||||
class="radio-item"
|
||||
:class="{ checked: selectedValues['education'] === String(option.value) }"
|
||||
>
|
||||
<radio
|
||||
:value="String(option.value)"
|
||||
:checked="selectedValues['education'] === String(option.value)"
|
||||
/>
|
||||
<text class="option-label">{{ option.label }}</text>
|
||||
</label>
|
||||
</radio-group>
|
||||
</view>
|
||||
|
||||
<!-- 工作经验 -->
|
||||
<view v-if="activeTab === 'experience'" class="content-section">
|
||||
<radio-group @change="(e) => handleSelect('experience', e)">
|
||||
<label
|
||||
v-for="option in experienceOptions"
|
||||
:key="option.value"
|
||||
class="radio-item"
|
||||
:class="{ checked: selectedValues['experience'] === String(option.value) }"
|
||||
>
|
||||
<radio
|
||||
:value="String(option.value)"
|
||||
:checked="selectedValues['experience'] === 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)">
|
||||
<label
|
||||
v-for="option in scaleOptions"
|
||||
:key="option.value"
|
||||
class="radio-item"
|
||||
:class="{ checked: selectedValues['scale'] === String(option.value) }"
|
||||
>
|
||||
<radio
|
||||
:value="String(option.value)"
|
||||
:checked="selectedValues['scale'] === String(option.value)"
|
||||
/>
|
||||
<text class="option-label">{{ option.label }}</text>
|
||||
</label>
|
||||
</radio-group>
|
||||
</view>
|
||||
|
||||
<!-- 地区 -->
|
||||
<view v-if="activeTab === 'area'" class="content-section">
|
||||
<radio-group @change="(e) => handleSelect('area', e)">
|
||||
<label
|
||||
v-for="option in areaOptions"
|
||||
:key="option.value"
|
||||
class="radio-item"
|
||||
:class="{ checked: selectedValues['area'] === String(option.value) }"
|
||||
>
|
||||
<radio
|
||||
:value="String(option.value)"
|
||||
:checked="selectedValues['area'] === String(option.value)"
|
||||
/>
|
||||
<text class="option-label">{{ option.label }}</text>
|
||||
</label>
|
||||
</radio-group>
|
||||
</view>
|
||||
|
||||
<!-- 岗位类型 -->
|
||||
<view v-if="activeTab === 'jobType'" class="content-section">
|
||||
<radio-group @change="(e) => handleSelect('jobType', e)">
|
||||
<label
|
||||
v-for="option in jobTypeOptions"
|
||||
:key="option.value"
|
||||
class="radio-item"
|
||||
:class="{ checked: selectedValues['jobType'] === String(option.value) }"
|
||||
>
|
||||
<radio
|
||||
:value="String(option.value)"
|
||||
:checked="selectedValues['jobType'] === String(option.value)"
|
||||
/>
|
||||
<text class="option-label">{{ option.label }}</text>
|
||||
</label>
|
||||
</radio-group>
|
||||
<!-- 标签页和内容区域 -->
|
||||
<view class="filter-body">
|
||||
<view class="filter-tabs">
|
||||
<view
|
||||
v-for="(tab, index) in tabs"
|
||||
:key="index"
|
||||
class="tab-item"
|
||||
:class="{ active: activeTab === tab.key }"
|
||||
@click="activeTab = tab.key"
|
||||
>
|
||||
{{ tab.label }}
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 内容区域 -->
|
||||
<view class="filter-content">
|
||||
<!-- 学历要求 -->
|
||||
<view v-if="activeTab === 'education'" class="content-section">
|
||||
<radio-group @change="(e) => handleSelect('education', e)">
|
||||
<label
|
||||
v-for="option in educationOptions"
|
||||
:key="option.value"
|
||||
class="radio-item"
|
||||
:class="{ checked: selectedValues['education'] === String(option.value) }"
|
||||
>
|
||||
<radio
|
||||
:value="String(option.value)"
|
||||
:checked="selectedValues['education'] === String(option.value)"
|
||||
/>
|
||||
<text class="option-label">{{ option.label }}</text>
|
||||
</label>
|
||||
</radio-group>
|
||||
</view>
|
||||
|
||||
<!-- 工作经验 -->
|
||||
<view v-if="activeTab === 'experience'" class="content-section">
|
||||
<radio-group @change="(e) => handleSelect('experience', e)">
|
||||
<label
|
||||
v-for="option in experienceOptions"
|
||||
:key="option.value"
|
||||
class="radio-item"
|
||||
:class="{ checked: selectedValues['experience'] === String(option.value) }"
|
||||
>
|
||||
<radio
|
||||
:value="String(option.value)"
|
||||
:checked="selectedValues['experience'] === 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)">
|
||||
<label
|
||||
v-for="option in scaleOptions"
|
||||
:key="option.value"
|
||||
class="radio-item"
|
||||
:class="{ checked: selectedValues['scale'] === String(option.value) }"
|
||||
>
|
||||
<radio
|
||||
:value="String(option.value)"
|
||||
:checked="selectedValues['scale'] === String(option.value)"
|
||||
/>
|
||||
<text class="option-label">{{ option.label }}</text>
|
||||
</label>
|
||||
</radio-group>
|
||||
</view>
|
||||
|
||||
<!-- 岗位类型 -->
|
||||
<view v-if="activeTab === 'jobType'" class="content-section">
|
||||
<radio-group @change="(e) => handleSelect('jobType', e)">
|
||||
<label
|
||||
v-for="option in jobTypeOptions"
|
||||
:key="option.value"
|
||||
class="radio-item"
|
||||
:class="{ checked: selectedValues['jobType'] === String(option.value) }"
|
||||
>
|
||||
<radio
|
||||
:value="String(option.value)"
|
||||
:checked="selectedValues['jobType'] === String(option.value)"
|
||||
/>
|
||||
<text class="option-label">{{ option.label }}</text>
|
||||
</label>
|
||||
</radio-group>
|
||||
</view>
|
||||
|
||||
<!-- 地区(多选) -->
|
||||
<view v-if="activeTab === 'area'" class="content-section">
|
||||
<checkbox-group @change="(e) => handleAreaSelect(e)">
|
||||
<label
|
||||
v-for="option in areaOptions"
|
||||
:key="option.value"
|
||||
class="radio-item"
|
||||
:class="{ checked: selectedValues['area'].includes(String(option.value)) }"
|
||||
>
|
||||
<checkbox
|
||||
:value="String(option.value)"
|
||||
:checked="selectedValues['area'].includes(String(option.value))"
|
||||
/>
|
||||
<text class="option-label">{{ option.label }}</text>
|
||||
</label>
|
||||
</checkbox-group>
|
||||
</view>
|
||||
<!-- 底部按钮 -->
|
||||
<view class="filter-footer">
|
||||
<button class="footer-btn clear-btn" @click="handleClear">清除</button>
|
||||
<button class="footer-btn confirm-btn" @click="handleConfirm">确认</button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onBeforeMount } from 'vue';
|
||||
import { ref, reactive, onBeforeMount, watch } from 'vue';
|
||||
import useDictStore from '@/stores/useDictStore';
|
||||
const dictStore = useDictStore();
|
||||
const { getTransformChildren } = dictStore;
|
||||
const { getTransformChildren } = useDictStore();
|
||||
|
||||
const props = defineProps({
|
||||
show: Boolean,
|
||||
@@ -156,47 +164,56 @@ const selectedValues = reactive({
|
||||
education: '',
|
||||
experience: '',
|
||||
scale: '',
|
||||
area: '',
|
||||
jobType: ''
|
||||
jobType: '',
|
||||
area: []
|
||||
});
|
||||
|
||||
// 从字典获取的选项数据
|
||||
const educationOptions = ref([]);
|
||||
const experienceOptions = ref([]);
|
||||
const scaleOptions = ref([]);
|
||||
const areaOptions = ref([]);
|
||||
const jobTypeOptions = ref([]);
|
||||
|
||||
// 加载状态
|
||||
const loading = ref(true);
|
||||
const areaOptions = ref([]);
|
||||
|
||||
// 初始化获取数据
|
||||
onBeforeMount(async () => {
|
||||
try {
|
||||
// 先获取字典数据
|
||||
await dictStore.getDictData();
|
||||
// 再初始化选项数据
|
||||
educationOptions.value = getTransformChildren('education', '学历要求').options || [];
|
||||
experienceOptions.value = getTransformChildren('experience', '工作经验').options || [];
|
||||
scaleOptions.value = getTransformChildren('scale', '公司规模').options || [];
|
||||
areaOptions.value = getTransformChildren('area', '地区').options || [];
|
||||
jobTypeOptions.value = getJobTypeData();
|
||||
} catch (error) {
|
||||
console.error('获取字典数据失败:', error);
|
||||
} finally {
|
||||
loading.value = false;
|
||||
const initData = () => {
|
||||
educationOptions.value = getTransformChildren('education', '学历要求').options || [];
|
||||
experienceOptions.value = getTransformChildren('experience', '工作经验').options || [];
|
||||
scaleOptions.value = getTransformChildren('scale', '公司规模').options || [];
|
||||
jobTypeOptions.value = getJobTypeData();
|
||||
areaOptions.value = getTransformChildren('area', '地区').options || [];
|
||||
};
|
||||
|
||||
// 组件挂载时初始化数据
|
||||
onBeforeMount(() => {
|
||||
initData();
|
||||
});
|
||||
|
||||
// 监听组件显示状态,当显示时重新初始化数据
|
||||
watch(() => props.show, (newVal) => {
|
||||
if (newVal) {
|
||||
initData();
|
||||
}
|
||||
});
|
||||
|
||||
// 处理选项选择
|
||||
// 处理选项选择(单选)
|
||||
const handleSelect = (key, e) => {
|
||||
selectedValues[key] = e.detail.value;
|
||||
};
|
||||
|
||||
// 处理地区多选
|
||||
const handleAreaSelect = (e) => {
|
||||
selectedValues.area = e.detail.value;
|
||||
};
|
||||
|
||||
// 清除所有选择
|
||||
const handleClear = () => {
|
||||
Object.keys(selectedValues).forEach((key) => {
|
||||
selectedValues[key] = '';
|
||||
if (key === 'area') {
|
||||
selectedValues[key] = [];
|
||||
} else {
|
||||
selectedValues[key] = '';
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
@@ -224,71 +241,89 @@ const handleClose = () => {
|
||||
background-color: #fff;
|
||||
z-index: 9999;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-direction: column;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.filter-header {
|
||||
height: 96rpx;
|
||||
height: 88rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 0 32rpx;
|
||||
padding: 24rpx 32rpx;
|
||||
border-bottom: 1rpx solid #eee;
|
||||
background-color: #fff;
|
||||
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
|
||||
flex-shrink: 0;
|
||||
|
||||
.back-btn {
|
||||
font-size: 36rpx;
|
||||
width: 48rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 10rpx;
|
||||
border-radius: 50%;
|
||||
transition: all 0.3s ease;
|
||||
|
||||
&:active {
|
||||
background-color: rgba(37, 107, 250, 0.1);
|
||||
}
|
||||
}
|
||||
|
||||
.filter-title {
|
||||
font-size: 34rpx;
|
||||
.header-title {
|
||||
font-size: 48rpx;
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.header-close-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8rpx;
|
||||
padding: 12rpx 24rpx;
|
||||
border-radius: 8rpx;
|
||||
border: 1rpx solid #256BFA;
|
||||
background: rgba(37, 107, 250, 0.08);
|
||||
|
||||
.close-text {
|
||||
font-size: 39rpx;
|
||||
color: #256BFA;
|
||||
}
|
||||
|
||||
&:active {
|
||||
background: rgba(37, 107, 250, 0.18);
|
||||
transform: scale(0.96);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.filter-body {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.filter-tabs {
|
||||
width: 200rpx;
|
||||
border-right: 1rpx solid #eee;
|
||||
background-color: #f8f8f8;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 250rpx;
|
||||
border-right: 1rpx solid #eee;
|
||||
background-color: #f9f9f9;
|
||||
box-shadow: 3rpx 0 15rpx rgba(0, 0, 0, 0.05);
|
||||
height: 100%;
|
||||
box-sizing: border-box;
|
||||
|
||||
.tab-item {
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
height: 130rpx;
|
||||
line-height: 130rpx;
|
||||
text-align: center;
|
||||
font-size: 28rpx;
|
||||
font-size: 42rpx;
|
||||
color: #666;
|
||||
position: relative;
|
||||
transition: all 0.3s ease;
|
||||
border-bottom: 1rpx solid #f0f0f0;
|
||||
|
||||
&.active {
|
||||
color: #256BFA;
|
||||
font-weight: 600;
|
||||
background-color: #fff;
|
||||
box-shadow: 3rpx 0 10rpx rgba(37, 107, 250, 0.1);
|
||||
|
||||
&::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 25%;
|
||||
width: 4rpx;
|
||||
width: 6rpx;
|
||||
height: 50%;
|
||||
background-color: #256BFA;
|
||||
border-radius: 2rpx;
|
||||
border-radius: 3rpx 0 0 3rpx;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -298,24 +333,23 @@ const handleClose = () => {
|
||||
}
|
||||
}
|
||||
|
||||
.filter-right {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.filter-content {
|
||||
flex: 1;
|
||||
padding: 40rpx 32rpx;
|
||||
overflow-y: auto;
|
||||
padding: 30rpx 0rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding-bottom: 160rpx;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.content-section {
|
||||
padding: 0 4%;
|
||||
overflow-y: auto;
|
||||
flex: 12;
|
||||
.radio-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 30rpx 0;
|
||||
padding: 45rpx 0;
|
||||
border-bottom: 1rpx solid #f0f0f0;
|
||||
transition: all 0.3s ease;
|
||||
position: relative;
|
||||
@@ -329,9 +363,9 @@ const handleClose = () => {
|
||||
}
|
||||
|
||||
radio {
|
||||
width: 28rpx;
|
||||
height: 28rpx;
|
||||
margin-right: 24rpx;
|
||||
width: 42rpx;
|
||||
height: 42rpx;
|
||||
margin-right: 36rpx;
|
||||
transform: scale(1);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -339,10 +373,10 @@ const handleClose = () => {
|
||||
}
|
||||
|
||||
radio .wx-radio-input {
|
||||
width: 28rpx;
|
||||
height: 28rpx;
|
||||
width: 42rpx;
|
||||
height: 42rpx;
|
||||
border-radius: 50%;
|
||||
border: 2rpx solid #ccc;
|
||||
border: 3rpx solid #ccc;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
@@ -352,11 +386,11 @@ const handleClose = () => {
|
||||
}
|
||||
|
||||
radio .wx-radio-input::before {
|
||||
width: 16rpx;
|
||||
height: 16rpx;
|
||||
line-height: 16rpx;
|
||||
width: 24rpx;
|
||||
height: 24rpx;
|
||||
line-height: 24rpx;
|
||||
text-align: center;
|
||||
font-size: 12rpx;
|
||||
font-size: 18rpx;
|
||||
color: #fff;
|
||||
background: transparent;
|
||||
transform: translate(-50%, -50%) scale(0);
|
||||
@@ -369,38 +403,40 @@ const handleClose = () => {
|
||||
}
|
||||
|
||||
.option-label {
|
||||
font-size: 30rpx;
|
||||
font-size: 45rpx;
|
||||
color: #333;
|
||||
flex: 1;
|
||||
font-weight: 400;
|
||||
line-height: 40rpx;
|
||||
line-height: 60rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.filter-footer {
|
||||
height: 160rpx;
|
||||
height: 200rpx;
|
||||
flex: 1;
|
||||
display: flex;
|
||||
border-top: 1rpx solid #eee;
|
||||
background-color: #fff;
|
||||
box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
|
||||
padding: 20rpx 32rpx 100rpx;
|
||||
box-shadow: 0 -3rpx 15rpx rgba(0, 0, 0, 0.05);
|
||||
padding: 30rpx 0;
|
||||
flex-shrink: 0;
|
||||
position: relative;
|
||||
z-index: 10;
|
||||
margin-top: auto;
|
||||
box-sizing: border-box;
|
||||
|
||||
.footer-btn {
|
||||
flex: 1;
|
||||
margin: 0;
|
||||
border-radius: 16rpx;
|
||||
height: 80rpx;
|
||||
line-height: 80rpx;
|
||||
font-size: 32rpx;
|
||||
margin: 0 40rpx;
|
||||
border-radius: 24rpx;
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
font-size: 45rpx;
|
||||
transition: all 0.3s ease;
|
||||
font-weight: 500;
|
||||
|
||||
&:first-child {
|
||||
margin-right: 20rpx;
|
||||
margin-right: 30rpx;
|
||||
background-color: #f5f5f5;
|
||||
color: #666;
|
||||
border: 1rpx solid #e0e0e0;
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
:blat="latitude"
|
||||
:blong="longitude"
|
||||
></convert-distance>
|
||||
<dict-Label class="mar_le10" dictType="area" :value="job.jobLocationAreaCode"></dict-Label>
|
||||
{{ job.regionName || config.appInfo.areaName }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -40,6 +40,7 @@
|
||||
|
||||
<script setup>
|
||||
import { inject, computed, toRaw } from 'vue';
|
||||
import config from '@/config.js';
|
||||
const { insertSortData, navTo, vacanciesTo } = inject('globalFunction');
|
||||
import { useRecommedIndexedDBStore } from '@/stores/useRecommedIndexedDBStore.js';
|
||||
const recommedIndexDb = useRecommedIndexedDBStore();
|
||||
|
||||
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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
: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="goToSearch">
|
||||
<uni-icons class="iconsearch" color="#666666" type="search" size="18"></uni-icons>
|
||||
<text class="inpute">职位名称、薪资要求等</text>
|
||||
</view>
|
||||
@@ -78,7 +78,7 @@
|
||||
<!-- <view class="h5-action-btn press-button" @click="handleH5SalaryClick">
|
||||
<view class="btn-text">薪酬信息</view>
|
||||
</view> -->
|
||||
<view class="h5-action-btn press-button" @click="handleServiceClick('resume-creation')">
|
||||
<view class="h5-action-btn press-button" @click="handelGoResumeGuide()">
|
||||
<view class="btn-text">简历指导</view>
|
||||
</view>
|
||||
|
||||
@@ -161,12 +161,12 @@
|
||||
</view>
|
||||
<view class="service-title">帮扶</view>
|
||||
</view>
|
||||
<!-- <view class="service-item press-button" v-if="isFourLevelLinkagePurview" @click="helpTaskClick">
|
||||
<view class="service-item press-button" v-if="isFourLevelLinkagePurview" @click="helpTaskClick">
|
||||
<view class="service-icon service-icon-1">
|
||||
<uni-icons type="shop" size="32" color="#FFFFFF"></uni-icons>
|
||||
</view>
|
||||
<view class="service-title">帮扶任务</view>
|
||||
</view> -->
|
||||
</view>
|
||||
<view class="service-item press-button" @click="handleNoticeClick">
|
||||
<view class="service-icon service-icon-10">
|
||||
<uni-icons type="sound" size="32" color="#FFFFFF"></uni-icons>
|
||||
@@ -279,9 +279,15 @@
|
||||
{{ item.text }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="btm-right button-click" @click="openFilter">
|
||||
筛选
|
||||
<image class="right-sx" :class="{ active: showFilter }" src="@/static/icon/shaixun.png"></image>
|
||||
<view class="btm-right-group">
|
||||
<view class="btm-right button-click" @click="openFilter">
|
||||
筛选
|
||||
<image class="right-sx" :class="{ active: showFilter }" src="@/static/icon/shaixun.png"></image>
|
||||
</view>
|
||||
<view class="btm-clear button-click" v-if="hasActiveFilters" @click="clearFilters">
|
||||
<uni-icons type="trash" size="18" color="#256BFA"></uni-icons>
|
||||
<text>清除</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -304,17 +310,10 @@
|
||||
: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="item btn-feel" v-if="!job.recommend">
|
||||
<view class="falls-card" :class="{ 'disabled-card': Number(job.jobStatus) === 1 }" @click="nextDetail(job)">
|
||||
<view class="falls-card-pay">
|
||||
<view class="fl_1 falls-card-title">{{ job.jobTitle }}</view>
|
||||
<view class="fr_1 pay-text">
|
||||
<view class="pay-text">
|
||||
<Salary-Expectation
|
||||
:max-salary="job.maxSalary"
|
||||
:min-salary="job.minSalary"
|
||||
@@ -323,53 +322,39 @@
|
||||
</view>
|
||||
<image v-if="job.isHot" class="flame" src="/static/icon/flame.png"></image>
|
||||
</view>
|
||||
<view>
|
||||
<!-- <view class="fl_1 falls-card-title">{{ job.jobTitle }}</view> -->
|
||||
|
||||
<view class="fr_1 fl_box fl_warp">
|
||||
<view class="falls-card-education mar_ri10" v-if="job.education">
|
||||
<dict-Label dictType="education" :value="job.education"></dict-Label>
|
||||
</view>
|
||||
<view class="falls-card-experience" v-if="job.experience">
|
||||
<dict-Label dictType="experience" :value="job.experience"></dict-Label>
|
||||
</view>
|
||||
<view class="falls-card-title">{{ job.jobTitle }}</view>
|
||||
<view class="fl_box fl_warp">
|
||||
<view class="falls-card-education mar_ri10" v-if="job.education">
|
||||
<dict-Label dictType="education" :value="job.education"></dict-Label>
|
||||
</view>
|
||||
<view class="falls-card-experience" v-if="job.experience">
|
||||
<dict-Label dictType="experience" :value="job.experience"></dict-Label>
|
||||
</view>
|
||||
</view>
|
||||
<!-- <view class="falls-card-company" v-show="isShowJw !== 3">
|
||||
<view class="falls-card-company" v-show="isShowJw !== 3">
|
||||
{{ config.appInfo.areaName }}
|
||||
{{ job.jobLocation }}
|
||||
<!-- {{ job.jobLocation }} -->
|
||||
<dict-Label dictType="jobLocationAreaCode" :value="job.jobLocationAreaCode"></dict-Label>
|
||||
</view> -->
|
||||
</view>
|
||||
<view class="falls-card-pepleNumber">
|
||||
<view>
|
||||
<image class="point2" src="/static/icon/pintDate.png"></image>
|
||||
<image class="point2" src="/static/icon/pintDate.png"></image>
|
||||
<view class="fl_1">
|
||||
发布日期:{{ job.postingDate || '暂无数据' }}
|
||||
{{ job.postingDate || '发布日期' }}
|
||||
</view>
|
||||
</view>
|
||||
<view>
|
||||
|
||||
<image class="point3" src="/static/icon/pointpeople.png"></image>
|
||||
<view class="fl_1">
|
||||
招聘人数:{{ vacanciesTo(job.vacancies) }}
|
||||
{{ vacanciesTo(job.vacancies) }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="falls-card-company2">
|
||||
<image class="point3" src="/static/icon/point3.png"></image>
|
||||
<view class="fl_1">
|
||||
{{ job.companyName }}
|
||||
</view>
|
||||
<view class="fr-1" v-if="job.regionName">
|
||||
地区:{{ job.regionName }}
|
||||
</view>
|
||||
</view>
|
||||
<!-- 未通过审核状态显示 -->
|
||||
<view class="unpublished-badge" v-if="Number(job.isPublish) === 0">
|
||||
未通过审核
|
||||
{{ job.companyName }}
|
||||
</view>
|
||||
<!-- 招聘者显示上下架开关 -->
|
||||
<view class="falls-card-actions" v-if="isRecruiter && Number(job.isPublish) === 1">
|
||||
<view class="falls-card-actions" v-if="isRecruiter">
|
||||
<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>
|
||||
@@ -410,17 +395,10 @@
|
||||
: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="item btn-feel" v-if="!job.recommend">
|
||||
<view class="falls-card" :class="{ 'disabled-card': Number(job.jobStatus) === 1 }" @click="nextDetail(job)">
|
||||
<view class="falls-card-pay">
|
||||
<view class="fl_1 falls-card-title">{{ job.jobTitle }}</view>
|
||||
<view class="fr_1 pay-text">
|
||||
<view class="pay-text">
|
||||
<Salary-Expectation
|
||||
:max-salary="job.maxSalary"
|
||||
:min-salary="job.minSalary"
|
||||
@@ -429,7 +407,7 @@
|
||||
</view>
|
||||
<image v-if="job.isHot" class="flame" src="/static/icon/flame.png"></image>
|
||||
</view>
|
||||
|
||||
<view class="falls-card-title">{{ job.jobTitle }}</view>
|
||||
<view class="fl_box fl_warp">
|
||||
<view class="falls-card-education mar_ri10" v-if="job.education">
|
||||
<dict-Label dictType="education" :value="job.education"></dict-Label>
|
||||
@@ -438,16 +416,16 @@
|
||||
<dict-Label dictType="experience" :value="job.experience"></dict-Label>
|
||||
</view>
|
||||
</view>
|
||||
<!-- <view class="falls-card-company" v-show="isShowJw !== 3">
|
||||
地区:{{ config.appInfo.areaName }}
|
||||
地址:{{ job.jobLocation }}
|
||||
<view class="falls-card-company" v-show="isShowJw !== 3">
|
||||
{{ job.regionName }}
|
||||
<!-- {{ job.jobLocation }} -->
|
||||
<dict-Label dictType="jobLocationAreaCode" :value="job.jobLocationAreaCode"></dict-Label>
|
||||
</view> -->
|
||||
</view>
|
||||
<view class="falls-card-pepleNumber">
|
||||
<view>
|
||||
<image class="point2" src="/static/icon/pintDate.png"></image>
|
||||
<view class="fl_1">
|
||||
发布日期:{{ job.postingDate || '暂无数据' }}
|
||||
{{ job.postingDate || '发布日期' }}
|
||||
</view>
|
||||
</view>
|
||||
<view>
|
||||
@@ -458,20 +436,10 @@
|
||||
</view>
|
||||
</view>
|
||||
<view class="falls-card-company2">
|
||||
<image class="point3" src="/static/icon/point3.png"></image>
|
||||
<view class="fl_1">
|
||||
{{ job.companyName }}
|
||||
</view>
|
||||
<view class="fr-1" v-if="job.regionName">
|
||||
地区:{{ job.regionName }}
|
||||
</view>
|
||||
</view>
|
||||
<!-- 未通过审核状态显示 -->
|
||||
<view class="unpublished-badge" v-if="Number(job.isPublish) === 0">
|
||||
未通过审核
|
||||
{{ job.companyName }}
|
||||
</view>
|
||||
<!-- 招聘者显示上下架开关 -->
|
||||
<view class="falls-card-actions" v-if="isRecruiter && Number(job.isPublish) === 1">
|
||||
<view class="falls-card-actions" v-if="isRecruiter">
|
||||
<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>
|
||||
@@ -518,7 +486,8 @@
|
||||
@update:show="(value) => showNewFilter = value"
|
||||
/>
|
||||
|
||||
|
||||
<!-- 微信授权登录弹窗 -->
|
||||
<WxAuthLogin ref="wxAuthLoginRef" @success="handleLoginSuccess" />
|
||||
|
||||
<!-- <view class="maskFristEntry" v-if="maskFristEntry">
|
||||
<view class="entry-content">
|
||||
@@ -596,15 +565,6 @@ const shouldShowCompanyCard = computed(() => {
|
||||
return companyInfo.name && companyInfo.name.trim() !== '';
|
||||
});
|
||||
|
||||
// 计算当前用户类型
|
||||
const currentUserType = computed(() => {
|
||||
// 优先从store获取,如果为空则从缓存获取
|
||||
const storeIsCompanyUser = userInfo.value?.isCompanyUser;
|
||||
const cachedUserInfo = uni.getStorageSync('userInfo') || {};
|
||||
const cachedIsCompanyUser = cachedUserInfo.isCompanyUser;
|
||||
return storeIsCompanyUser !== undefined ? Number(storeIsCompanyUser) : Number(cachedIsCompanyUser);
|
||||
});
|
||||
|
||||
// 计算是否显示企业用户内容
|
||||
const shouldShowCompanyContent = computed(() => {
|
||||
// 未登录时不显示企业内容
|
||||
@@ -652,7 +612,7 @@ import newFilterPage from '@/components/new-filter-page/new-filter-page.vue';
|
||||
import { useRecommedIndexedDBStore, jobRecommender } from '@/stores/useRecommedIndexedDBStore.js';
|
||||
import { useScrollDirection } from '@/hook/useScrollDirection';
|
||||
import { useColumnCount } from '@/hook/useColumnCount';
|
||||
|
||||
import WxAuthLogin from '@/components/WxAuthLogin/WxAuthLogin.vue';
|
||||
import IconfontIcon from '@/components/IconfontIcon/IconfontIcon.vue'
|
||||
// 企业卡片组件已内联到模板中
|
||||
// 滚动状态管理
|
||||
@@ -743,7 +703,7 @@ const loadmoreRef = ref(null);
|
||||
const conditionSearch = ref({});
|
||||
const waterfallcolumn = ref(2);
|
||||
const maskFristEntry = ref(false);
|
||||
|
||||
const wxAuthLoginRef = ref(null);
|
||||
const state = reactive({
|
||||
tabIndex: 'all',
|
||||
});
|
||||
@@ -756,9 +716,7 @@ const helpTaskClick = () =>{
|
||||
}
|
||||
//招聘会模块跳转
|
||||
const handleJobFairClick = () => {
|
||||
if (checkLogin()) {
|
||||
navTo('/packageA/pages/careerfair/careerfair');
|
||||
}
|
||||
navTo('/pages/careerfair/careerfair');
|
||||
};
|
||||
const list = ref([]);
|
||||
const pageState = reactive({
|
||||
@@ -775,6 +733,15 @@ const showFilter = ref(false);
|
||||
const selectFilterModel = ref(null);
|
||||
const showModel = ref(false);
|
||||
const showNewFilter = ref(false);
|
||||
// 判断是否有活跃的筛选条件
|
||||
const hasActiveFilters = computed(() => {
|
||||
// 城市选择
|
||||
if (selectedCity.value.code) return true;
|
||||
// 筛选弹窗的条件(除了 order 之外还有其他字段)
|
||||
const searchKeys = Object.keys(pageState.search).filter(k => k !== 'order');
|
||||
if (searchKeys.length > 0) return true;
|
||||
return false;
|
||||
});
|
||||
// 选中的城市
|
||||
const selectedCity = ref({ code: '', name: '' });
|
||||
const rangeOptions = ref([
|
||||
@@ -782,11 +749,10 @@ 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); // 添加初始化标志
|
||||
const isRecommendLoading = ref(false); // 请求锁,防止重复调用
|
||||
|
||||
const { columnCount, columnSpace } = useColumnCount(() => {
|
||||
pageState.pageSize = 10 * (columnCount.value - 1) + 10;
|
||||
@@ -807,7 +773,7 @@ const { columnCount, columnSpace } = useColumnCount(() => {
|
||||
const getCompanyInfo = () => {
|
||||
try {
|
||||
const cachedUserInfo = uni.getStorageSync('userInfo') || {};
|
||||
// console.log('缓存中的userInfo:', cachedUserInfo);
|
||||
console.log('缓存中的userInfo:', cachedUserInfo);
|
||||
|
||||
// 重置企业信息
|
||||
companyInfo.name = '';
|
||||
@@ -851,7 +817,7 @@ const getCompanyInfo = () => {
|
||||
|
||||
// 跳转到企业信息详情页面
|
||||
const goToCompanyInfo = () => {
|
||||
navTo('/packageA/pages/company-mine/company-info');
|
||||
navTo('/pages/mine/company-info');
|
||||
};
|
||||
|
||||
|
||||
@@ -861,7 +827,7 @@ onMounted(() => {
|
||||
getCompanyInfo();
|
||||
// pageNull.value = 0;
|
||||
uni.$on('showLoginModal', () => {
|
||||
uni.navigateTo({ url: '/packageA/pages/login/wx-login' });
|
||||
wxAuthLoginRef.value?.open();
|
||||
pageNull.value = 0;
|
||||
});
|
||||
});
|
||||
@@ -875,7 +841,7 @@ onMounted(() => {
|
||||
// 绑定新的监听
|
||||
uni.$on('showLoginModal', () => {
|
||||
console.log('收到showLoginModal事件,打开登录弹窗');
|
||||
uni.navigateTo({ url: '/packageA/pages/login/wx-login' });
|
||||
wxAuthLoginRef.value?.open();
|
||||
pageNull.value = 0;
|
||||
});
|
||||
|
||||
@@ -936,42 +902,66 @@ const handleLoginSuccess = () => {
|
||||
// H5环境下从URL获取token并自动登录
|
||||
// onLoad 函数已移至下方,包含筛选参数处理
|
||||
|
||||
// 跳转到搜索页面,筛选弹窗的地区用 area,添加旁地区的城市用 regionCode
|
||||
const goToSearch = () => {
|
||||
const query = {
|
||||
regionCode: selectedCity.value.code,
|
||||
regionName: selectedCity.value.name,
|
||||
};
|
||||
// area 只有在筛选弹窗选了地区时才传
|
||||
if (pageState.search.area) {
|
||||
query.area = pageState.search.area;
|
||||
}
|
||||
navTo('/pages/search/search', { query });
|
||||
};
|
||||
|
||||
// 处理附近工作点击
|
||||
const handleNearbyClick = () => {
|
||||
navTo('/packageA/pages/nearby/nearby');
|
||||
const handleNearbyClick = (options ) => {
|
||||
// #ifdef MP-WEIXIN
|
||||
if (checkLogin()) {
|
||||
navTo('/packageA/pages/nearby/nearby');
|
||||
}
|
||||
// #endif
|
||||
// #ifdef H5
|
||||
const token = options.token || uni.getStorageSync('zkr-token');
|
||||
if (token) {
|
||||
navTo('/packageA/pages/nearby/nearby');
|
||||
}
|
||||
// #endif
|
||||
};
|
||||
const handleNoticeClick = () =>{
|
||||
if (checkLogin()) {
|
||||
uni.navigateTo({
|
||||
url:'/packageB/notice/index'
|
||||
})
|
||||
}
|
||||
function handleInstitutionClick(type){
|
||||
if(type=='evaluate'){
|
||||
uni.navigateTo({
|
||||
url:'/packageB/notice/index'
|
||||
url:'/packageB/institution/evaluationAgency'
|
||||
})
|
||||
}else if (type=='training'){
|
||||
uni.navigateTo({
|
||||
url:'/packageB/institution/trainingInstitution'
|
||||
})
|
||||
}
|
||||
}
|
||||
function handleInstitutionClick(type){
|
||||
|
||||
if (checkLogin()) {
|
||||
if(type=='evaluate'){
|
||||
uni.navigateTo({
|
||||
url:'/packageB/institution/evaluationAgency'
|
||||
})
|
||||
}else if (type=='training'){
|
||||
uni.navigateTo({
|
||||
url:'/packageB/institution/trainingInstitution'
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// 处理服务功能点击
|
||||
const handleServiceClick = (serviceType) => {
|
||||
const noLoginRequired = ['resume-creation'];
|
||||
if (noLoginRequired.includes(serviceType) || checkLogin()) {
|
||||
if (checkLogin()) {
|
||||
navToService(serviceType);
|
||||
}
|
||||
};
|
||||
|
||||
// H5的简历指导跳转
|
||||
const handelGoResumeGuide = () => {
|
||||
const token = uni.getStorageSync('zkr-token');
|
||||
// myToken.value = token;
|
||||
if (token) {
|
||||
// navTo()
|
||||
navTo('/pages/resume-guide/resume-guide');
|
||||
}
|
||||
|
||||
}
|
||||
// 处理直播按钮点击
|
||||
const handleLiveClick = () => {
|
||||
// #ifdef MP-WEIXIN
|
||||
@@ -1003,7 +993,7 @@ const handleLiveClick = () => {
|
||||
|
||||
// 处理薪酬信息点击
|
||||
const handleSalaryInfoClick = () => {
|
||||
navTo('/packageA/pages/service/salary-info');
|
||||
navTo('/pages/service/salary-info');
|
||||
};
|
||||
|
||||
const handleH5SalaryClick = () => {
|
||||
@@ -1084,29 +1074,29 @@ function clearfindJob(job) {
|
||||
}
|
||||
|
||||
function nextDetail(job) {
|
||||
navTo(`/packageA/pages/post/post?encryptJobId=${encodeURIComponent(job.encryptJobId)}`);
|
||||
navTo(`/packageA/pages/post/post?jobId=${encodeURIComponent(job.jobId)}`);
|
||||
}
|
||||
|
||||
function navToService(serviceType) {
|
||||
// 根据服务类型跳转到不同页面
|
||||
const serviceRoutes = {
|
||||
'service-guidance': '/packageA/pages/service/guidance',
|
||||
'public-recruitment': '/packageA/pages/service/public-recruitment',
|
||||
'resume-creation': '/packageA/pages/resume-guide/resume-guide',
|
||||
'service-guidance': '/pages/service/guidance',
|
||||
'public-recruitment': '/pages/service/public-recruitment',
|
||||
'resume-creation': '/pages/resume-guide/resume-guide',
|
||||
'labor-policy': '/packageRc/pages/policy/policyList',
|
||||
'skill-training': '/packageB/train/video/videoList',
|
||||
'skill-evaluation': '/packageB/train/index',
|
||||
// 'skill-evaluation': '/packageA/pages/service/skill-evaluation',
|
||||
'question-bank': '/packageA/pages/service/question-bank',
|
||||
// 'skill-evaluation': '/pages/service/skill-evaluation',
|
||||
'question-bank': '/pages/service/question-bank',
|
||||
// 'quality-assessment': '/packageCa/search/search',
|
||||
// 'ai-interview': '/packageA/pages/chat/chat',
|
||||
'job-search': '/pages/search/search',
|
||||
'career-planning': '/packageA/pages/service/career-planning',
|
||||
'salary-query': '/packageA/pages/service/salary-query',
|
||||
'company-info': '/packageA/pages/service/company-info',
|
||||
'interview-tips': '/packageA/pages/service/interview-tips',
|
||||
'employment-news': '/packageA/pages/service/employment-news',
|
||||
'more-services': '/packageA/pages/service/more-services',
|
||||
'career-planning': '/pages/service/career-planning',
|
||||
'salary-query': '/pages/service/salary-query',
|
||||
'company-info': '/pages/service/company-info',
|
||||
'interview-tips': '/pages/service/interview-tips',
|
||||
'employment-news': '/pages/service/employment-news',
|
||||
'more-services': '/pages/service/more-services',
|
||||
};
|
||||
if((serviceType=='skill-training'||serviceType=='skill-evaluation')&&!uni.getStorageSync('userInfo').idCard){
|
||||
$api.msg('请先完善信息');
|
||||
@@ -1126,6 +1116,16 @@ function openFilter() {
|
||||
emits('onShowTabbar', false);
|
||||
}
|
||||
|
||||
function clearFilters() {
|
||||
// 清除筛选弹窗条件,保留 order
|
||||
pageState.search = { order: pageState.search.order };
|
||||
// 清除城市选择
|
||||
selectedCity.value = { code: '', name: '' };
|
||||
conditionSearch.value = {};
|
||||
// 刷新列表
|
||||
getJobRecommend('refresh');
|
||||
}
|
||||
|
||||
function handleNewFilterConfirm(values) {
|
||||
pageState.search = {
|
||||
...pageState.search,
|
||||
@@ -1134,6 +1134,9 @@ function handleNewFilterConfirm(values) {
|
||||
// 特殊处理岗位类型,直接传递数字值
|
||||
if (key === 'jobType') {
|
||||
pageState.search.type = value;
|
||||
} else if (key === 'area' && Array.isArray(value) && value.length > 0) {
|
||||
// 地区多选,转为逗号分隔字符串
|
||||
pageState.search[key] = value.join(',');
|
||||
} else if (value) {
|
||||
pageState.search[key] = value;
|
||||
} else {
|
||||
@@ -1226,17 +1229,16 @@ function handelHostestSearch(val) {
|
||||
}
|
||||
|
||||
function getJobRecommend(type = 'add') {
|
||||
if (isRecommendLoading.value) return;
|
||||
if (type === 'refresh') {
|
||||
list.value = [];
|
||||
if (waterfallsFlowRef.value) waterfallsFlowRef.value.refresh();
|
||||
}
|
||||
isRecommendLoading.value = true;
|
||||
let params = {
|
||||
pageSize: pageState.pageSize + 10,
|
||||
sessionId: useUserStore().seesionId,
|
||||
...pageState.search,
|
||||
...conditionSearch.value,
|
||||
isPublish: 1,
|
||||
};
|
||||
// 当选中零工市场(4)或疆外(3)时,order参数传递0
|
||||
if (pageState.search.order === 3 || pageState.search.order === 4) {
|
||||
@@ -1251,14 +1253,14 @@ function getJobRecommend(type = 'add') {
|
||||
// 只有企业用户(isCompanyUser=0)才添加current字段
|
||||
if (userType === 0) {
|
||||
params.current = pageNull.value;
|
||||
// 企业用户不传递isPublish字段
|
||||
} else {
|
||||
// 求职者只显示已上架且通过审核的岗位(jobStatus=0, isPublish=1)
|
||||
// 求职者只显示已上架的岗位(jobStatus=0)
|
||||
params.jobStatus = 0;
|
||||
params.isPublish = 1;
|
||||
}
|
||||
let comd = { recommend: true, jobCategory: '', tip: '确认你的兴趣,为您推荐更多合适的岗位' };
|
||||
$api.createRequest('/app/job/recommend', params).then((resData) => {
|
||||
console.log('=== /app/job/recommend 解密后的数据 ===', resData);
|
||||
console.log('=== 岗位列表 data ===', resData.data);
|
||||
const { data, total } = resData;
|
||||
pageState.total = 0;
|
||||
if (type === 'add') {
|
||||
@@ -1305,8 +1307,6 @@ function getJobRecommend(type = 'add') {
|
||||
if (!data.length) {
|
||||
useUserStore().initSeesionId();
|
||||
}
|
||||
}).finally(() => {
|
||||
isRecommendLoading.value = false;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1339,10 +1339,9 @@ function getJobList(type = 'add') {
|
||||
const cachedIsCompanyUser = cachedUserInfo.isCompanyUser;
|
||||
const userType = storeIsCompanyUser !== undefined ? Number(storeIsCompanyUser) : Number(cachedIsCompanyUser);
|
||||
|
||||
// 如果不是企业用户(求职者),只显示已上架且通过审核的岗位
|
||||
// 如果不是企业用户(求职者),只显示已上架的岗位
|
||||
if (userType !== 0) {
|
||||
params.jobStatus = 0;
|
||||
params.isPublish = 1;
|
||||
}
|
||||
|
||||
$api.createRequest('/app/job/list', params).then((resData) => {
|
||||
@@ -1369,7 +1368,7 @@ function getJobList(type = 'add') {
|
||||
}
|
||||
|
||||
// 上架岗位
|
||||
const jobUp = (encryptJobId) => {
|
||||
const jobUp = (jobId) => {
|
||||
if (!checkLogin()) return;
|
||||
|
||||
uni.showLoading({
|
||||
@@ -1377,7 +1376,7 @@ const jobUp = (encryptJobId) => {
|
||||
mask: true
|
||||
});
|
||||
|
||||
$api.createRequest(`/app/job/jobUp/${encryptJobId}`, {}, 'PUT', true).then((res) => {
|
||||
$api.createRequest(`/app/job/jobUp/${jobId}`, {}, 'PUT', true).then((res) => {
|
||||
uni.hideLoading();
|
||||
$api.msg('上架成功');
|
||||
// 刷新数据
|
||||
@@ -1394,7 +1393,7 @@ const jobUp = (encryptJobId) => {
|
||||
};
|
||||
|
||||
// 下架岗位
|
||||
const jobDown = (encryptJobId) => {
|
||||
const jobDown = (jobId) => {
|
||||
if (!checkLogin()) return;
|
||||
|
||||
uni.showLoading({
|
||||
@@ -1402,7 +1401,7 @@ const jobDown = (encryptJobId) => {
|
||||
mask: true
|
||||
});
|
||||
|
||||
$api.createRequest(`/app/job/jobDown/${encryptJobId}`, {}, 'PUT', true).then((res) => {
|
||||
$api.createRequest(`/app/job/jobDown/${jobId}`, {}, 'PUT', true).then((res) => {
|
||||
uni.hideLoading();
|
||||
$api.msg('下架成功');
|
||||
// 刷新数据
|
||||
@@ -1429,14 +1428,14 @@ const toggleJobStatus = (job) => {
|
||||
|
||||
// 根据当前状态决定调用哪个接口
|
||||
const isCurrentlyUp = Number(job.jobStatus) === 0; // 0: 已上架, 1: 已下架
|
||||
const apiUrl = isCurrentlyUp ? `/app/job/jobDown/${job.encryptJobId}` : `/app/job/jobUp/${job.encryptJobId}`;
|
||||
const apiUrl = isCurrentlyUp ? `/app/job/jobDown/${job.jobId}` : `/app/job/jobUp/${job.jobId}`;
|
||||
|
||||
$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.jobId === job.jobId);
|
||||
if (jobIndex !== -1) {
|
||||
// 更新状态
|
||||
list.value[jobIndex].jobStatus = isCurrentlyUp ? 1 : 0;
|
||||
@@ -1668,9 +1667,9 @@ defineExpose({ loadData });
|
||||
.iconsearch
|
||||
padding-left: 36rpx
|
||||
.inpute
|
||||
margin-left: 20rpx
|
||||
margin-left: 30rpx
|
||||
font-weight: 400;
|
||||
font-size: 28rpx;
|
||||
font-size: 63rpx;
|
||||
color: #B5B5B5;
|
||||
width: 100%
|
||||
.live-button
|
||||
@@ -1698,7 +1697,7 @@ defineExpose({ loadData });
|
||||
.live-text
|
||||
font-family: 'PingFangSC-Medium', 'PingFang SC', 'Helvetica Neue', Helvetica, Arial, 'Microsoft YaHei', sans-serif
|
||||
font-weight: 500
|
||||
font-size: 24rpx
|
||||
font-size: 36rpx
|
||||
color: #FFFFFF
|
||||
text-align: center
|
||||
white-space: nowrap
|
||||
@@ -1711,8 +1710,8 @@ defineExpose({ loadData });
|
||||
border: 2rpx solid #FFFFFF;
|
||||
text-align: center
|
||||
font-weight: 500;
|
||||
font-size: 28rpx;
|
||||
height: 36rpx;
|
||||
font-size: 42rpx;
|
||||
height: 54rpx;
|
||||
color: #000000;
|
||||
padding: 20rpx 30rpx
|
||||
.cards
|
||||
@@ -1721,7 +1720,6 @@ defineExpose({ loadData });
|
||||
grid-gap: 38rpx;
|
||||
grid-template-columns: 1fr;
|
||||
.card
|
||||
height: calc(158rpx - 40rpx);
|
||||
padding: 22rpx 26rpx
|
||||
box-shadow: 0rpx 8rpx 40rpx 0rpx rgba(210,210,210,0.14);
|
||||
border-radius: 16rpx 16rpx 16rpx 16rpx;
|
||||
@@ -1729,11 +1727,11 @@ defineExpose({ loadData });
|
||||
.card-title
|
||||
font-family: 'PingFangSC-Medium', 'PingFang SC', 'Helvetica Neue', Helvetica, Arial, 'Microsoft YaHei', sans-serif;
|
||||
font-weight: 600;
|
||||
font-size: 32rpx;
|
||||
font-size: 96rpx;
|
||||
color: #000000;
|
||||
.card-text
|
||||
font-weight: 400;
|
||||
font-size: 24rpx;
|
||||
font-size: 48rpx;
|
||||
color: #9E9E9E;
|
||||
margin-top: 4rpx
|
||||
.card:first-child
|
||||
@@ -1754,7 +1752,7 @@ defineExpose({ loadData });
|
||||
gap: 16rpx
|
||||
.h5-action-btn
|
||||
flex: 1
|
||||
height: 60rpx
|
||||
height: 90rpx
|
||||
background:#FFFFFF
|
||||
border-radius: 8rpx
|
||||
display: flex
|
||||
@@ -1768,7 +1766,7 @@ defineExpose({ loadData });
|
||||
.btn-text
|
||||
font-family: 'PingFangSC-Regular', 'PingFang SC', 'Helvetica Neue', Helvetica, Arial, 'Microsoft YaHei', sans-serif
|
||||
font-weight: 400
|
||||
font-size: 26rpx
|
||||
font-size: 66rpx
|
||||
color: #256BFA
|
||||
// 服务功能网格样式
|
||||
.service-grid
|
||||
@@ -1911,7 +1909,7 @@ defineExpose({ loadData });
|
||||
.service-title
|
||||
font-family: 'PingFangSC-Medium', 'PingFang SC', 'Helvetica Neue', Helvetica, Arial, 'Microsoft YaHei', sans-serif
|
||||
font-weight: 500
|
||||
font-size: 24rpx
|
||||
font-size: 36rpx
|
||||
color: #333333
|
||||
text-align: center
|
||||
line-height: 1.2
|
||||
@@ -1987,13 +1985,13 @@ defineExpose({ loadData });
|
||||
flex-wrap: nowrap
|
||||
.job
|
||||
font-weight: 400;
|
||||
font-size: 36rpx;
|
||||
font-size: 66rpx;
|
||||
color: #666D7F;
|
||||
margin-right: 32rpx;
|
||||
white-space: nowrap
|
||||
.active
|
||||
font-weight: 500;
|
||||
font-size: 36rpx;
|
||||
font-size: 66rpx;
|
||||
color: #000000;
|
||||
.jobs-add
|
||||
font-family: 'PingFangSC-Regular', 'PingFang SC', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
@@ -2001,9 +1999,9 @@ defineExpose({ loadData });
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-weight: 400;
|
||||
font-size: 32rpx;
|
||||
font-size: 66rpx;
|
||||
color: #666D7F;
|
||||
line-height: 38rpx;
|
||||
line-height: 57rpx;
|
||||
min-width: 80rpx;
|
||||
padding: 8rpx 12rpx;
|
||||
white-space: nowrap;
|
||||
@@ -2019,24 +2017,39 @@ defineExpose({ loadData });
|
||||
font-family: 'PingFangSC-Regular', 'PingFang SC', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
.filterbtm
|
||||
font-weight: 400;
|
||||
font-size: 32rpx;
|
||||
font-size: 66rpx;
|
||||
color: #666D7F;
|
||||
margin-right: 8rpx
|
||||
padding: 0rpx 6rpx
|
||||
.active
|
||||
font-weight: 500;
|
||||
font-size: 32rpx;
|
||||
font-size: 66rpx;
|
||||
color: #256BFA;
|
||||
.btm-right-group
|
||||
display: flex
|
||||
align-items: center
|
||||
.btm-right
|
||||
font-family: 'PingFangSC-Regular', 'PingFang SC', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
font-weight: 400;
|
||||
font-size: 32rpx;
|
||||
font-size: 66rpx;
|
||||
color: #6C7282;
|
||||
.right-sx
|
||||
width: 26rpx;
|
||||
height: 26rpx;
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
.active
|
||||
transform: rotate(180deg)
|
||||
.btm-clear
|
||||
display: flex
|
||||
align-items: center
|
||||
gap: 4rpx
|
||||
padding: 10rpx 16rpx
|
||||
margin-left: 12rpx
|
||||
background: #EBF0FF
|
||||
border: 1rpx solid #B3C6FF
|
||||
border-radius: 10rpx
|
||||
font-size: 36rpx
|
||||
color: #256BFA
|
||||
white-space: nowrap
|
||||
.table-list
|
||||
background: #F4F4F4
|
||||
flex: 1
|
||||
@@ -2072,7 +2085,7 @@ defineExpose({ loadData });
|
||||
text-align: left;
|
||||
word-break:break-all
|
||||
font-weight: 500;
|
||||
font-size: 32rpx;
|
||||
font-size: 57rpx;
|
||||
color: #333333;
|
||||
margin-top: 10rpx
|
||||
.falls-card-pay
|
||||
@@ -2088,9 +2101,9 @@ defineExpose({ loadData });
|
||||
color: #4C6EFB;
|
||||
padding-right: 10rpx
|
||||
font-weight: 500;
|
||||
font-size: 28rpx;
|
||||
font-size: 66rpx;
|
||||
color: #4C6EFB;
|
||||
line-height: 45rpx;
|
||||
line-height: 67.5rpx;
|
||||
text-align: left;
|
||||
.flame
|
||||
position: absolute
|
||||
@@ -2101,13 +2114,13 @@ defineExpose({ loadData });
|
||||
height: 31rpx
|
||||
.falls-card-education,.falls-card-experience
|
||||
width: fit-content;
|
||||
height: 30rpx;
|
||||
height: 45rpx;
|
||||
background: #F4F4F4;
|
||||
border-radius: 4rpx;
|
||||
padding: 6rpx 20rpx;
|
||||
line-height: 30rpx;
|
||||
padding: 12rpx 20rpx;
|
||||
line-height: 45rpx;
|
||||
font-weight: 400;
|
||||
font-size: 24rpx;
|
||||
font-size: 48rpx;
|
||||
color: #6C7282;
|
||||
text-align: center;
|
||||
margin-top: 20rpx;
|
||||
@@ -2115,9 +2128,9 @@ defineExpose({ loadData });
|
||||
|
||||
.falls-card-company,.falls-card-pepleNumber
|
||||
margin-top: 20rpx;
|
||||
font-size: 24rpx;
|
||||
font-size: 48rpx;
|
||||
color: #999999;
|
||||
line-height: 25rpx;
|
||||
line-height: 37.5rpx;
|
||||
text-align: left;
|
||||
.falls-card-pepleNumber
|
||||
display: flex;
|
||||
@@ -2125,9 +2138,9 @@ defineExpose({ loadData });
|
||||
flex-wrap: wrap
|
||||
margin-top: 10rpx;
|
||||
font-weight: 400;
|
||||
font-size: 24rpx;
|
||||
font-size: 48rpx;
|
||||
color: #999999;
|
||||
line-height: 46rpx
|
||||
line-height: 69rpx
|
||||
view
|
||||
display:flex
|
||||
align-items: center
|
||||
@@ -2145,30 +2158,19 @@ defineExpose({ loadData });
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-size: 21rpx;
|
||||
font-size: 48rpx;
|
||||
color: #4778EC;
|
||||
text-align: left;
|
||||
.falls-card-company2
|
||||
margin-top: 4rpx;
|
||||
font-size: 24rpx;
|
||||
font-size: 48rpx;
|
||||
color: #999999;
|
||||
text-align: left;
|
||||
display: flex
|
||||
.point3
|
||||
margin: 4rpx 4rpx 0 0
|
||||
margin: 16rpx 4rpx 0 0
|
||||
height: 26rpx
|
||||
width: 26rpx
|
||||
// 未通过审核状态样式
|
||||
.unpublished-badge
|
||||
position: absolute
|
||||
top: 0
|
||||
right: 0
|
||||
background-color: #FF4D4F
|
||||
color: #FFFFFF
|
||||
font-size: 20rpx
|
||||
padding: 6rpx 12rpx
|
||||
border-bottom-left-radius: 16rpx
|
||||
z-index: 10
|
||||
// 推荐卡片
|
||||
.recommend-card::before
|
||||
position: absolute
|
||||
@@ -2207,14 +2209,14 @@ defineExpose({ loadData });
|
||||
margin-bottom: 40rpx
|
||||
|
||||
.company-title
|
||||
font-size: 36rpx
|
||||
font-size: 54rpx
|
||||
font-weight: bold
|
||||
color: #333333
|
||||
display: block
|
||||
margin-bottom: 10rpx
|
||||
|
||||
.company-subtitle
|
||||
font-size: 24rpx
|
||||
font-size: 36rpx
|
||||
color: #666666
|
||||
display: block
|
||||
|
||||
@@ -2255,7 +2257,7 @@ defineExpose({ loadData });
|
||||
background: #eb2f96
|
||||
|
||||
.company-title
|
||||
font-size: 24rpx
|
||||
font-size: 36rpx
|
||||
color: #333333
|
||||
font-weight: 500
|
||||
|
||||
@@ -2270,11 +2272,11 @@ defineExpose({ loadData });
|
||||
z-index: 2;
|
||||
.recommend-card-title
|
||||
font-weight: 500;
|
||||
font-size: 28rpx;
|
||||
font-size: 42rpx;
|
||||
color: #333333;
|
||||
.recommend-card-tip
|
||||
font-weight: 400;
|
||||
font-size: 28rpx;
|
||||
font-size: 42rpx;
|
||||
color: #6C7282;
|
||||
margin-top: 28rpx
|
||||
.recommend-card-line
|
||||
@@ -2318,6 +2320,8 @@ defineExpose({ loadData });
|
||||
text-align: center;
|
||||
line-height: 60rpx
|
||||
color: #256BFA
|
||||
font-weight: 400;
|
||||
font-size: 42rpx;
|
||||
.controll-no
|
||||
width: 124rpx;
|
||||
height: 56rpx;
|
||||
@@ -2325,7 +2329,7 @@ defineExpose({ loadData });
|
||||
border-radius: 12rpx 12rpx 12rpx 12rpx;
|
||||
border: 2rpx solid #DEDEDE;
|
||||
font-weight: 400;
|
||||
font-size: 28rpx;
|
||||
font-size: 42rpx;
|
||||
color: #333333;
|
||||
text-align: center;
|
||||
.controll-yes:active, .controll-no:active
|
||||
@@ -2437,7 +2441,7 @@ defineExpose({ loadData });
|
||||
position: relative
|
||||
|
||||
.company-name
|
||||
font-size: 34rpx
|
||||
font-size: 51rpx
|
||||
font-weight: 600
|
||||
color: #000000
|
||||
line-height: 1.3
|
||||
@@ -2450,7 +2454,7 @@ defineExpose({ loadData });
|
||||
.company-details
|
||||
display: flex
|
||||
align-items: center
|
||||
font-size: 26rpx
|
||||
font-size: 39rpx
|
||||
color: #666666
|
||||
line-height: 1.2
|
||||
|
||||
@@ -2494,7 +2498,7 @@ defineExpose({ loadData });
|
||||
.live-text
|
||||
font-family: 'PingFangSC-Medium', 'PingFang SC', 'Helvetica Neue', Helvetica, Arial, 'Microsoft YaHei', sans-serif
|
||||
font-weight: 500
|
||||
font-size: 24rpx
|
||||
font-size: 36rpx
|
||||
color: #FFFFFF
|
||||
text-align: center
|
||||
white-space: nowrap
|
||||
|
||||
@@ -79,7 +79,13 @@ onLoad((query) => {
|
||||
if (arr) {
|
||||
historyList.value = uni.getStorageSync('searchList');
|
||||
}
|
||||
const {job} = query;
|
||||
const {job, area, regionCode} = query;
|
||||
if (area) {
|
||||
pageState.search.area = area;
|
||||
}
|
||||
if (regionCode) {
|
||||
pageState.search.regionCode = regionCode;
|
||||
}
|
||||
if (job) {
|
||||
searchValue.value = job;
|
||||
searchBtn();
|
||||
|
||||
Reference in New Issue
Block a user