4个mvp补丁
|
After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 2.3 MiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 462 KiB |
|
Before Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 177 KiB |
|
Before Width: | Height: | Size: 246 KiB |
|
Before Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 221 KiB |
|
Before Width: | Height: | Size: 485 KiB |
|
Before Width: | Height: | Size: 232 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 390 KiB |
|
Before Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 408 KiB |
|
Before Width: | Height: | Size: 177 KiB |
|
Before Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 247 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 1.8 MiB |
@@ -1398,9 +1398,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
// 立即去投递按钮
|
||||
// 下载专属简历按钮
|
||||
&__submit-btn {
|
||||
flex: 1;
|
||||
width: 100%;
|
||||
height: 0.48rem;
|
||||
background: $btn-dark;
|
||||
color: $bg-white;
|
||||
@@ -1415,6 +1415,20 @@
|
||||
background: $btn-dark-hover;
|
||||
}
|
||||
}
|
||||
|
||||
// 下载专属简历按钮包裹(含下拉菜单定位)
|
||||
&__submit-wrap {
|
||||
position: relative;
|
||||
flex: 1;
|
||||
|
||||
.job-resume-custom-dialog__top-download-menu {
|
||||
top: auto;
|
||||
bottom: 100%;
|
||||
margin-top: 0;
|
||||
margin-bottom: 0.06rem;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 右侧滑入动画
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
}
|
||||
|
||||
&__item {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.04rem;
|
||||
@@ -120,6 +121,26 @@
|
||||
flex: none;
|
||||
}
|
||||
|
||||
// 公测群二维码弹出层(hover索引5时显示)
|
||||
&__qrcode-popup {
|
||||
position: absolute;
|
||||
top: calc(100% + 0.08rem);
|
||||
left: 0;
|
||||
padding: 0.08rem;
|
||||
background: #fff;
|
||||
border-radius: 0.08rem;
|
||||
box-shadow: 0 0.02rem 0.12rem rgba(0, 0, 0, 0.08);
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
&__qrcode-img {
|
||||
display: block;
|
||||
width: auto;
|
||||
height: auto;
|
||||
max-width: 1.6rem;
|
||||
border-radius: 0.04rem;
|
||||
}
|
||||
|
||||
&__footer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
@@ -168,11 +168,34 @@
|
||||
&__ai-tip-text {
|
||||
font-size: 0.12rem;
|
||||
line-height: 0.16rem;
|
||||
color: $accent;
|
||||
color: $text-light;
|
||||
vertical-align: text-top;
|
||||
margin-left: 0.03rem;
|
||||
}
|
||||
|
||||
// AI 推荐的可点击岗位/行业关键词
|
||||
&__ai-tip-keyword {
|
||||
color: $accent;
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
transition: opacity 0.2s;
|
||||
|
||||
&:hover {
|
||||
opacity: 0.75;
|
||||
}
|
||||
}
|
||||
|
||||
// 关键词之间的顿号(无下划线,text-light 色)
|
||||
&__ai-tip-comma {
|
||||
color: $text-light;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
// ";行业:" 分隔符保持 text-light 色
|
||||
&__ai-tip-separator {
|
||||
color: $text-light;
|
||||
}
|
||||
|
||||
// 筛选条件
|
||||
&__filters {
|
||||
display: flex;
|
||||
@@ -185,6 +208,7 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.08rem;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
&__filter-item {
|
||||
@@ -777,7 +801,46 @@
|
||||
// 暂无数据提示
|
||||
&__empty {
|
||||
text-align: center;
|
||||
padding: 1rem 0;
|
||||
font-size: 0.14rem;
|
||||
color: $text-light;
|
||||
}
|
||||
|
||||
// 空状态图片
|
||||
&__empty-img {
|
||||
width: 1.24rem;
|
||||
height: 1.3rem;
|
||||
display: block;
|
||||
margin: 1.6rem auto 0.2rem;
|
||||
}
|
||||
|
||||
// 空状态主标题
|
||||
&__empty-title {
|
||||
font-size: 0.14rem;
|
||||
color: $text-light;
|
||||
margin-bottom: 0.08rem;
|
||||
}
|
||||
|
||||
// 空状态副标题
|
||||
&__empty-subtitle {
|
||||
font-size: 0.14rem;
|
||||
color: $text-light;
|
||||
}
|
||||
|
||||
// "减少筛选条件" 可点击链接
|
||||
&__empty-link {
|
||||
color: $accent;
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
opacity: 0.75;
|
||||
}
|
||||
}
|
||||
|
||||
// 列表结果较少时的底部提示
|
||||
&__few-results {
|
||||
text-align: center;
|
||||
padding: 0.12rem 0;
|
||||
font-size: 0.14rem;
|
||||
color: $text-light;
|
||||
}
|
||||
|
||||
@@ -12,21 +12,7 @@
|
||||
</button>
|
||||
<h2 class="job-resume-custom-dialog__drawer-title">生成你的岗位专属简历</h2>
|
||||
</div>
|
||||
<!-- 下载简历按钮(步骤三显示,位于步骤指示器上方) -->
|
||||
<div v-if="currentStep === 4" class="job-resume-custom-dialog__top-download mt10 ml12">
|
||||
<button class="job-resume-custom-dialog__top-download-btn" @click="toggleDownloadMenu">
|
||||
<svg viewBox="0 0 16 16" fill="none" class="job-resume-custom-dialog__top-download-icon">
|
||||
<path d="M8 2v8M8 10l-3-3M8 10l3-3" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M3 12h10" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
|
||||
</svg>
|
||||
下载简历
|
||||
</button>
|
||||
<!-- 下载下拉菜单 -->
|
||||
<div v-if="showDownloadMenu" class="job-resume-custom-dialog__top-download-menu">
|
||||
<button class="job-resume-custom-dialog__top-download-option" @click="handleDownload('pdf')">下载PDF</button>
|
||||
<button class="job-resume-custom-dialog__top-download-option" @click="handleDownload('word')">下载Word</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 步骤指示器 -->
|
||||
<div class="job-resume-custom-dialog__steps pt10">
|
||||
<div class="job-resume-custom-dialog__step" :class="{ 'job-resume-custom-dialog__step--active': currentStep === 2 }">
|
||||
@@ -327,8 +313,15 @@
|
||||
<div v-if="currentStep === 4" class="job-resume-custom-dialog__preview-footer mt10 pt30">
|
||||
<!-- 左侧:上一步按钮 -->
|
||||
<button class="job-resume-custom-dialog__footer-prev-btn" @click="goToStep(3)">上一步</button>
|
||||
<!-- 右侧:立即去投递按钮 -->
|
||||
<button class="job-resume-custom-dialog__submit-btn" @click="handleSubmit">立即去投递</button>
|
||||
<!-- 右侧:下载专属简历按钮 -->
|
||||
<div class="job-resume-custom-dialog__submit-wrap">
|
||||
<button class="job-resume-custom-dialog__submit-btn" @click="toggleDownloadMenu">下载专属简历</button>
|
||||
<!-- 下载下拉菜单 -->
|
||||
<div v-if="showDownloadMenu" class="job-resume-custom-dialog__top-download-menu">
|
||||
<button class="job-resume-custom-dialog__top-download-option" @click="handleDownload('pdf')">下载PDF</button>
|
||||
<button class="job-resume-custom-dialog__top-download-option" @click="handleDownload('word')">下载Word</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -28,6 +28,13 @@
|
||||
<!-- 索引0的时候显示"全网"小标签 -->
|
||||
<span v-if="index === 0" class="side-nav__tag-quanwang mt2 ml8">全网</span>
|
||||
|
||||
<!-- 索引5的时候显示"公测群"小标签 -->
|
||||
<span v-if="index === 5" class="side-nav__tag-quanwang mt2 ml8">公测群</span>
|
||||
<!-- 索引5 hover时显示公测群二维码 -->
|
||||
<div v-if="index === 5 && hoverIndex === 5" class="side-nav__qrcode-popup">
|
||||
<img src="@/assets/images/home/mobile-qcCode.png" alt="公测群二维码" class="side-nav__qrcode-img" />
|
||||
</div>
|
||||
|
||||
<span v-if="item.badge" class="side-nav__badge">{{ item.badge }}</span>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
@@ -144,7 +144,7 @@
|
||||
<div class="jobs-page__ai-tip-content">
|
||||
<img class="jobs-page__ai-tip-logo" src="@/assets/images/logo-offerpai-2.png" alt="Nova" />
|
||||
<span class="jobs-page__ai-tip-text">
|
||||
Nova根据你的个人背景建议的<template v-if="aiCategoryNames">岗位:{{ aiCategoryNames }}</template><template v-if="aiIndustryNames">;行业:{{ aiIndustryNames }}</template>
|
||||
Nova根据你的个人背景建议的<template v-if="aiCategoryItems.length">岗位:<template v-for="(item, idx) in aiCategoryItems" :key="'cat-' + item.id"><span class="jobs-page__ai-tip-keyword" @click="handleAddCategory(item.id)">{{ item.name }}</span><span v-if="idx < aiCategoryItems.length - 1" class="jobs-page__ai-tip-comma">、</span></template></template><template v-if="aiIndustryItems.length"><span class="jobs-page__ai-tip-separator">;行业:</span><template v-for="(item, idx) in aiIndustryItems" :key="'ind-' + item.id"><span class="jobs-page__ai-tip-keyword" @click="handleAddIndustry(item.id)">{{ item.name }}</span><span v-if="idx < aiIndustryItems.length - 1" class="jobs-page__ai-tip-comma">、</span></template></template>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -292,7 +292,16 @@
|
||||
<span>加载中...</span>
|
||||
</div>
|
||||
<!-- 暂无数据提示 -->
|
||||
<div v-if="!loading && jobList.length === 0" class="jobs-page__empty">暂无数据</div>
|
||||
<div v-if="!loading && jobList.length === 0" class="jobs-page__empty">
|
||||
<img class="jobs-page__empty-img" src="@/assets/images/list-empty.png" alt="暂无数据" />
|
||||
<p class="jobs-page__empty-title">符合条件的岗位较少</p>
|
||||
<p class="jobs-page__empty-subtitle">试试 <span class="jobs-page__empty-link" @click="clearAllFilters">减少筛选条件</span> 或调整您意向的关键词哦~</p>
|
||||
</div>
|
||||
<!-- 列表结果少于5条时的提示 -->
|
||||
<div v-if="!loading && jobList.length > 0 && jobList.length < 5 && hasActiveFilters" class="jobs-page__few-results">
|
||||
<p class="jobs-page__empty-title">符合条件的岗位较少</p>
|
||||
<p class="jobs-page__empty-subtitle">试试 <span class="jobs-page__empty-link" @click="clearAllFilters">减少筛选条件</span> 或调整您意向的关键词哦~</p>
|
||||
</div>
|
||||
<!-- 加载更多提示 -->
|
||||
<div v-if="loadingMore" class="jobs-page__loading-box">
|
||||
<div class="jobs-page__loading-spinner"></div>
|
||||
@@ -700,11 +709,11 @@ function resolveFullCategoryName(id: string): string {
|
||||
return ''
|
||||
}
|
||||
|
||||
/** AI 推荐的行业名称(ID 转文字,基于完整行业树) */
|
||||
const aiIndustryNames = computed<string>(() => {
|
||||
if (!aiIndustryIds.value.length || !fullIndustryTree.value.length) return ''
|
||||
/** AI 推荐的行业列表(ID + 名称,用于提示条展示和点击) */
|
||||
const aiIndustryItems = computed<{ id: string; name: string }[]>(() => {
|
||||
if (!aiIndustryIds.value.length || !fullIndustryTree.value.length) return []
|
||||
const idSet = new Set(aiIndustryIds.value.map(String))
|
||||
const names: string[] = []
|
||||
const items: { id: string; name: string }[] = []
|
||||
for (const id of aiIndustryIds.value) {
|
||||
// 如果该 ID 是一级父节点且子节点也在列表中,跳过父级避免重复
|
||||
const parent = fullIndustryTree.value.find(p => String(p.id) === id)
|
||||
@@ -712,16 +721,16 @@ const aiIndustryNames = computed<string>(() => {
|
||||
continue
|
||||
}
|
||||
const name = resolveFullIndustryName(id)
|
||||
if (name) names.push(name)
|
||||
if (name) items.push({ id, name })
|
||||
}
|
||||
return names.join('、')
|
||||
return items
|
||||
})
|
||||
|
||||
/** AI 推荐的岗位名称(ID 转文字,基于完整岗位树) */
|
||||
const aiCategoryNames = computed<string>(() => {
|
||||
if (!aiCategoryIds.value.length || !fullJobCategoryTree.value.length) return ''
|
||||
/** AI 推荐的岗位列表(ID + 名称,用于提示条展示和点击) */
|
||||
const aiCategoryItems = computed<{ id: string; name: string }[]>(() => {
|
||||
if (!aiCategoryIds.value.length || !fullJobCategoryTree.value.length) return []
|
||||
const idSet = new Set(aiCategoryIds.value.map(String))
|
||||
const names: string[] = []
|
||||
const items: { id: string; name: string }[] = []
|
||||
for (const id of aiCategoryIds.value) {
|
||||
// 如果该 ID 是一级父节点且下级子节点也在列表中,跳过
|
||||
const lv1 = fullJobCategoryTree.value.find(p => String(p.id) === id)
|
||||
@@ -739,11 +748,17 @@ const aiCategoryNames = computed<string>(() => {
|
||||
}
|
||||
if (isParentWithChild) continue
|
||||
const name = resolveFullCategoryName(id)
|
||||
if (name) names.push(name)
|
||||
if (name) items.push({ id, name })
|
||||
}
|
||||
return names.join('、')
|
||||
return items
|
||||
})
|
||||
|
||||
/** AI 推荐的行业名称(兼容旧逻辑,拼接字符串用于条件判断) */
|
||||
const aiIndustryNames = computed<string>(() => aiIndustryItems.value.map(i => i.name).join('、'))
|
||||
|
||||
/** AI 推荐的岗位名称(兼容旧逻辑,拼接字符串用于条件判断) */
|
||||
const aiCategoryNames = computed<string>(() => aiCategoryItems.value.map(i => i.name).join('、'))
|
||||
|
||||
/** 是否显示 AI 推荐提示条 */
|
||||
const showAiRecommendTip = computed(() => {
|
||||
return isRecommendTab.value && (aiIndustryNames.value || aiCategoryNames.value)
|
||||
@@ -765,6 +780,36 @@ function onCategoryChange(ids: number[]) {
|
||||
})
|
||||
}
|
||||
|
||||
/** 点击 AI 推荐岗位词 — 将该岗位 ID 添加到筛选器(去重,最多3个) */
|
||||
function handleAddCategory(id: string) {
|
||||
const numId = Number(id)
|
||||
const current = selectedCategoryIds.value
|
||||
if (current.includes(numId)) return // 已存在,不重复添加
|
||||
if (current.length >= 3) {
|
||||
ElMessage.warning('最多选择3个分类,请先去掉一个再添加')
|
||||
return
|
||||
}
|
||||
store.dispatch('saveJobIntention', {
|
||||
...store.state.jobIntention,
|
||||
categoryIds: [...current, numId],
|
||||
})
|
||||
}
|
||||
|
||||
/** 点击 AI 推荐行业词 — 将该行业 ID 添加到筛选器(去重,最多3个) */
|
||||
function handleAddIndustry(id: string) {
|
||||
const numId = Number(id)
|
||||
const current = selectedIndustryIds.value
|
||||
if (current.includes(numId)) return // 已存在,不重复添加
|
||||
if (current.length >= 3) {
|
||||
ElMessage.warning('最多选择3个分类,请先去掉一个再添加')
|
||||
return
|
||||
}
|
||||
store.dispatch('saveJobIntention', {
|
||||
...store.state.jobIntention,
|
||||
industryIds: [...current, numId],
|
||||
})
|
||||
}
|
||||
|
||||
/** 地区选择变更回调 */
|
||||
function onRegionChange(codes: string[]) {
|
||||
store.dispatch('saveJobIntention', {
|
||||
@@ -1192,6 +1237,35 @@ function reloadFirstPage() {
|
||||
loadCurrentTab()
|
||||
}
|
||||
|
||||
/** 是否有任何筛选条件或搜索关键词处于激活状态 */
|
||||
const hasActiveFilters = computed(() => {
|
||||
return selectedCategoryIds.value.length > 0
|
||||
|| selectedIndustryIds.value.length > 0
|
||||
|| selectedRegionCodes.value.length > 0
|
||||
|| selectedEmploymentType.value !== null
|
||||
|| selectedCompanyTypes.value.length > 0
|
||||
|| keyword.value.trim() !== ''
|
||||
})
|
||||
|
||||
/** 清空所有筛选条件和搜索关键词,重新查询 */
|
||||
function clearAllFilters() {
|
||||
// 清空搜索关键词
|
||||
keyword.value = ''
|
||||
// 清空公司类型(本地状态 + 缓存)
|
||||
selectedCompanyTypes.value = []
|
||||
saveCachedCompanyTypes([])
|
||||
// 清空筛选按钮的显示文字
|
||||
filters.value.forEach(f => { f.selected = '' })
|
||||
// 清空 store 中的分类筛选条件
|
||||
store.dispatch('saveJobIntention', {
|
||||
...store.state.jobIntention,
|
||||
categoryIds: [],
|
||||
industryIds: [],
|
||||
regionCodes: [],
|
||||
recruitCategory: null,
|
||||
})
|
||||
}
|
||||
|
||||
/** 根据当前 Tab 加载对应列表 */
|
||||
function loadCurrentTab() {
|
||||
if (isRecommendTab.value) {
|
||||
|
||||