fix: 修复

This commit is contained in:
2025-11-12 19:31:46 +08:00
parent 1468002fe2
commit 967317367c
17 changed files with 1002 additions and 560 deletions

View File

@@ -27,7 +27,6 @@
<!-- 相似推荐职位 -->
<view class="section-title">
相似推荐职位
<text v-if="recommendRecordCount > 0" class="recommend-count">{{ recommendRecordCount }}条记录</text>
</view>
<view v-if="!isLoadingRecommend && recommendedJobs.length === 0" class="empty-text">暂无推荐职位</view>
<view
@@ -54,9 +53,9 @@
</template>
<script setup>
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, onMounted } from 'vue';
import { recommendJob } from '@/apiRc/jobRecommend.js';
import { getJobSkillDetail } from '@/apiRc/jobSkill.js';
import { recommendJob, countJobRecommendRecords, getJobRecommendRecords } from '@/apiRc/jobRecommend.js';
const props = defineProps({
currentJobId: {
@@ -69,127 +68,167 @@ const props = defineProps({
}
});
const emit = defineEmits(['job-card-click']);
const emit = defineEmits(['job-card-click', 'skills-updated']);
// 数据状态
const skillTags = ref([]);
const recommendedJobs = ref([]);
const recommendRecordCount = ref(0);
const recommendRecords = ref([]);
const isLoadingSkillTags = ref(false);
const isLoadingRecommend = ref(false);
const isLoadingRecords = ref(false);
const currentJobDisplay = computed(() => props.currentJobName || '前端开发工程师');
// 计算属性
const currentJobDisplay = computed(() => props.currentJobName || '市场专员');
function normalizeSkillListForDisplay(skillList = []) {
// 从技能列表中提取技能名称用于显示
function extractSkillNames(skillList = []) {
return (Array.isArray(skillList) ? skillList : [])
.map(item => item?.skillName)
.filter(name => !!name);
.map(item => item?.skillName || '')
.filter(name => !!name && name.trim().length > 0);
}
// 获取当前职位的技能标签
async function fetchCurrentJobSkills() {
if (!props.currentJobId && !props.currentJobName) {
skillTags.value = [];
// 如果没有职位名称,从缓存中获取技能标签
if (!props.currentJobName || props.currentJobName === '市场专员') {
const cachedUserInfo = uni.getStorageSync('userInfo') || {};
const cachedSkills = cachedUserInfo?.resume?.skillList ??
cachedUserInfo?.skillList ??
cachedUserInfo?.appSkillsList ??
[];
// 如果缓存中有技能数据,使用缓存的数据
if (Array.isArray(cachedSkills) && cachedSkills.length > 0) {
skillTags.value = extractSkillNames(cachedSkills);
} else {
skillTags.value = [];
}
// 通知父组件技能数据已更新
emit('skills-updated', {
currentJobSkills: skillTags.value,
recommendedJobs: recommendedJobs.value
});
return;
}
// 优先调用接口获取技能数据
isLoadingSkillTags.value = true;
try {
const params = {};
if (props.currentJobId !== null && props.currentJobId !== undefined && props.currentJobId !== '') {
params.jobId = props.currentJobId;
const response = await getJobSkillDetail({
jobName: props.currentJobName
});
const skillList = Array.isArray(response?.data) ? response.data : [];
const apiSkills = extractSkillNames(skillList);
// 如果接口返回了技能数据,使用接口数据
if (apiSkills.length > 0) {
skillTags.value = apiSkills;
} else {
// 如果接口没有返回技能数据,从缓存中读取
const cachedUserInfo = uni.getStorageSync('userInfo') || {};
const cachedSkills = cachedUserInfo?.resume?.skillList ??
cachedUserInfo?.skillList ??
cachedUserInfo?.appSkillsList ??
[];
if (Array.isArray(cachedSkills) && cachedSkills.length > 0) {
skillTags.value = extractSkillNames(cachedSkills);
} else {
skillTags.value = [];
}
}
if (props.currentJobName) {
params.jobName = props.currentJobName;
}
const response = await getJobSkillDetail(params);
const list = Array.isArray(response?.data) ? response.data : [];
skillTags.value = normalizeSkillListForDisplay(list);
// 通知父组件技能数据已更新
emit('skills-updated', {
currentJobSkills: skillTags.value,
recommendedJobs: recommendedJobs.value
});
} catch (error) {
console.error('获取当前职位技能失败:', error);
skillTags.value = [];
// 接口调用失败时,从缓存中读取
const cachedUserInfo = uni.getStorageSync('userInfo') || {};
const cachedSkills = cachedUserInfo?.resume?.skillList ??
cachedUserInfo?.skillList ??
cachedUserInfo?.appSkillsList ??
[];
if (Array.isArray(cachedSkills) && cachedSkills.length > 0) {
skillTags.value = extractSkillNames(cachedSkills);
} else {
skillTags.value = [];
}
emit('skills-updated', {
currentJobSkills: skillTags.value,
recommendedJobs: recommendedJobs.value
});
} finally {
isLoadingSkillTags.value = false;
}
}
// 获取推荐职位列表
async function fetchRecommendedJobs() {
const hasJobId = props.currentJobId !== null && props.currentJobId !== undefined && props.currentJobId !== '';
if (!hasJobId) {
recommendedJobs.value = [];
return;
}
isLoadingRecommend.value = true;
try {
const response = await recommendJob({
jobId: props.currentJobId
jobName: props.currentJobName
});
const list = Array.isArray(response?.data) ? response.data : [];
recommendedJobs.value = list.map((item, index) => {
const rawSkills = Array.isArray(item?.skillList) ? item.skillList : [];
const skillList = Array.isArray(item?.skillList) ? item.skillList : [];
const skillNames = extractSkillNames(skillList);
return {
id: item?.jobId ?? index,
jobId: item?.jobId ?? null,
title: item?.jobName || `推荐职位${index + 1}`,
jobName: item?.jobName || '',
skills: normalizeSkillListForDisplay(rawSkills),
rawSkills
skills: skillNames,
rawSkills: skillList
};
});
// 通知父组件推荐职位数据已更新
emit('skills-updated', {
currentJobSkills: skillTags.value,
recommendedJobs: recommendedJobs.value
});
} catch (error) {
console.error('获取推荐职位失败:', error);
recommendedJobs.value = [];
emit('skills-updated', {
currentJobSkills: skillTags.value,
recommendedJobs: []
});
} finally {
isLoadingRecommend.value = false;
}
}
async function fetchRecommendRecordInfo() {
const hasJobId = props.currentJobId !== null && props.currentJobId !== undefined && props.currentJobId !== '';
const hasJobName = !!props.currentJobName;
if (!hasJobId && !hasJobName) {
recommendRecordCount.value = 0;
recommendRecords.value = [];
return;
}
isLoadingRecords.value = true;
try {
const [countRes, listRes] = await Promise.all([
countJobRecommendRecords({
jobId: hasJobId ? props.currentJobId : undefined,
jobName: props.currentJobName
}),
getJobRecommendRecords({
jobName: props.currentJobName || '',
pageNo: 1,
pageSize: 10
})
]);
recommendRecordCount.value = Number(countRes?.data) || 0;
recommendRecords.value = Array.isArray(listRes?.data?.list) ? listRes.data.list : [];
} catch (error) {
console.error('获取推荐记录失败:', error);
recommendRecordCount.value = 0;
recommendRecords.value = [];
} finally {
isLoadingRecords.value = false;
}
}
// 组件挂载时检查并调用
onMounted(() => {
setTimeout(() => {
if (props.currentJobName) {
fetchCurrentJobSkills();
fetchRecommendedJobs();
}
}, 100);
});
// 监听 props 变化,自动获取推荐职位和技能标签
watch(
() => [props.currentJobId, props.currentJobName],
() => {
fetchCurrentJobSkills();
fetchRecommendedJobs();
fetchRecommendRecordInfo();
},
{ immediate: true }
);
// 事件处理
function handleJobSearch(job) {
console.log('搜索职位:', job.title);
// TODO: 实现职位搜索跳转
}