个人资料,简历
This commit is contained in:
+177
-43
@@ -80,38 +80,40 @@
|
||||
<!-- 简历主体内容 -->
|
||||
<div class="resume-detail__body">
|
||||
|
||||
<!-- 简历评分区域(不滚动) -->
|
||||
<div class="resume-detail__fixed-top">
|
||||
|
||||
<!-- 简历评分区域 -->
|
||||
<div class="resume-detail__score-bar" :class="scoreBarClass">
|
||||
<div class="resume-detail__score-left">
|
||||
<!-- 星星+底座组合 -->
|
||||
<div class="resume-detail__star-wrapper">
|
||||
<!-- SVG 五角星(胖型,短角) -->
|
||||
<svg class="resume-detail__star-svg" viewBox="0 0 54 53" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M24.9956 1.45584C25.7174 0.181609 27.553 0.181662 28.2749 1.45584L35.4253 14.0769C35.8275 14.7869 36.5116 15.2941 37.3081 15.4715L51.2944 18.5847C52.6882 18.8952 53.2438 20.5831 52.3071 21.6609L42.7036 32.7117C42.1833 33.3104 41.9326 34.0971 42.0103 34.8865L43.4556 49.5652C43.5975 51.0087 42.1235 52.0649 40.8022 51.4666L27.8257 45.5867C27.0692 45.2441 26.2013 45.244 25.4448 45.5867L12.4692 51.4666C11.1479 52.0653 9.67395 51.0089 9.81592 49.5652L11.2612 34.8865C11.3389 34.0971 11.0882 33.3104 10.5679 32.7117L0.964355 21.6609C0.0276138 20.583 0.583121 18.8951 1.97705 18.5847L15.9624 15.4715C16.759 15.2941 17.444 14.787 17.8462 14.0769L24.9956 1.45584Z"
|
||||
:fill="starFillColor"
|
||||
:stroke="starStrokeColor"
|
||||
stroke-width="1.3"
|
||||
stroke-linejoin="round"
|
||||
/>
|
||||
<!-- 星星中间的文字(等级字母或问号) -->
|
||||
<text x="26" y="37" text-anchor="middle" :fill="starStrokeColor" font-size="24" font-weight="500">
|
||||
{{ hasDiagnosis ? diagnosisReport.grade : '?' }}
|
||||
</text>
|
||||
</svg>
|
||||
<!-- 底座长方形(遮住星星下方两角) -->
|
||||
<div class="resume-detail__star-base" :style="{ borderColor: starStrokeColor }">
|
||||
<span :style="{ color: starStrokeColor }">{{ hasDiagnosis ? gradeLabel : '未知' }}</span>
|
||||
|
||||
|
||||
<div class="w40 tac h40 lh38 border-ra50p " :style="{ background: starStrokeColor }">
|
||||
<span class="color-f fs18 fw600 dib">{{ hasDiagnosis ? diagnosisReport.grade : '?' }}</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- 右侧操作按钮区 -->
|
||||
<div class="resume-detail__score-actions">
|
||||
<template v-if="hasDiagnosis">
|
||||
<button class="resume-detail__score-link" @click="handleViewReport">查看评估报告</button>
|
||||
<button class="resume-detail__score-link" @click="handleDiagnose">重新诊断</button>
|
||||
<div class="hp100">
|
||||
<!-- 底座长方形(遮住星星下方两角) -->
|
||||
<div class="resume-detail__star-base ">
|
||||
<span :style="{ color: starStrokeColor }">{{ hasDiagnosis ? gradeLabel : '未知' }}</span>
|
||||
</div>
|
||||
<div class="mt0 resume-detail__score-links">
|
||||
<button class="resume-detail__score-link" @click="handleViewReport">查看评估报告</button>
|
||||
<button class="resume-detail__score-link" @click="handleDiagnose">重新诊断</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<span class="resume-detail__score-hint">暂无等级,点击开始诊断简历</span>
|
||||
<div>
|
||||
<span class="resume-detail__score-hint">暂无等级,点击开始诊断简历</span>
|
||||
<div class="fs12 color-light mt4">AI 诊断将深度分析您的简历,给出评分和优化建议</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
@@ -121,24 +123,60 @@
|
||||
<div class="resume-detail__score-item">
|
||||
<span class="resume-detail__score-num" :style="{ color: starStrokeColor }">{{ issuesUrgentTotal+issuesImportantTotal+issuesExpressionTotal }}</span>
|
||||
<span class="resume-detail__score-label" :style="{ color: starStrokeColor }">项待修复</span>
|
||||
<button class="resume-detail__diagnose-btn" :style="{ background: starStrokeColor }" @click="handleFixAll">一键修复</button>
|
||||
<button class="resume-detail__diagnose-btn" :style="{ background: starStrokeColor }" @click="handleFixAll"><svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_76_1547)">
|
||||
<path d="M5.93736 4.4335L3.9582 5.54183L5.06653 3.56266L3.9582 1.5835L5.93736 2.69183L7.91653 1.5835L6.8082 3.56266L7.91653 5.54183L5.93736 4.4335ZM15.4374 12.1918L17.4165 11.0835L16.3082 13.0627L17.4165 15.0418L15.4374 13.9335L13.4582 15.0418L14.5665 13.0627L13.4582 11.0835L15.4374 12.1918ZM17.4165 1.5835L16.3082 3.56266L17.4165 5.54183L15.4374 4.4335L13.4582 5.54183L14.5665 3.56266L13.4582 1.5835L15.4374 2.69183L17.4165 1.5835ZM10.5607 10.1177L12.4924 8.186L10.814 6.50766L8.88236 8.43933L10.5607 10.1177ZM11.3761 5.77141L13.2286 7.62391C13.5374 7.91683 13.5374 8.43141 13.2286 8.74016L3.98986 17.9789C3.68111 18.2877 3.16653 18.2877 2.87361 17.9789L1.02111 16.1264C0.712363 15.8335 0.712363 15.3189 1.02111 15.0102L10.2599 5.77141C10.5686 5.46266 11.0832 5.46266 11.3761 5.77141Z" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_76_1547">
|
||||
<rect width="19" height="19" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
<span class="verali-su fw600 ml5">一键修复</span></button>
|
||||
</div>
|
||||
</template>
|
||||
<!-- 没有诊断报告时显示开始诊断按钮 -->
|
||||
<template v-else>
|
||||
<button class="resume-detail__diagnose-btn" @click="handleDiagnose">开始诊断</button>
|
||||
<button class="resume-detail__diagnose-btn dflex-center aliite-c" @click="handleDiagnose">
|
||||
<svg width="20" height="20" viewBox="0 0 19 21" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_76_1376)">
|
||||
<path d="M16.753 15.5746L13.4589 12.2793C14.4466 10.9923 14.9077 9.37781 14.7488 7.76335C14.5898 6.14889 13.8226 4.65534 12.6029 3.58569C11.3832 2.51603 9.80222 1.95036 8.18074 2.00342C6.55927 2.05649 5.01869 2.72431 3.87152 3.87143C2.72435 5.01855 2.05649 6.55906 2.00342 8.18046C1.95036 9.80186 2.51605 11.3827 3.58576 12.6024C4.65547 13.8221 6.14908 14.5892 7.76362 14.7482C9.37816 14.9071 10.9927 14.446 12.2798 13.4584L15.5766 16.7558C15.654 16.8332 15.746 16.8946 15.8471 16.9365C15.9483 16.9784 16.0567 17 16.1662 17C16.2757 17 16.3841 16.9784 16.4853 16.9365C16.5864 16.8946 16.6784 16.8332 16.7558 16.7558C16.8332 16.6784 16.8946 16.5865 16.9365 16.4853C16.9784 16.3841 17 16.2757 17 16.1662C17 16.0567 16.9784 15.9483 16.9365 15.8472C16.8946 15.746 16.8332 15.6541 16.7558 15.5767L16.753 15.5746ZM3.67871 8.39513C3.67871 7.46229 3.95534 6.55041 4.47362 5.77478C4.9919 4.99916 5.72855 4.39464 6.59042 4.03766C7.45228 3.68068 8.40065 3.58728 9.31561 3.76926C10.2306 3.95125 11.071 4.40045 11.7306 5.06006C12.3903 5.71968 12.8395 6.56008 13.0215 7.47498C13.2035 8.38989 13.1101 9.33822 12.7531 10.2C12.3961 11.0619 11.7915 11.7985 11.0159 12.3167C10.2402 12.835 9.3283 13.1116 8.39542 13.1116C7.14487 13.1103 5.9459 12.613 5.06163 11.7288C4.17735 10.8445 3.68 9.64562 3.67871 8.39513Z" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_76_1376">
|
||||
<rect width="19" height="19" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
<span class=" fs14 fw600 ml3">开始诊断</span></button>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Tab 导航栏(固定不动) -->
|
||||
<div class="resume-detail__tabs">
|
||||
<span
|
||||
v-for="tab in resumeTabList"
|
||||
:key="tab.key"
|
||||
class="resume-detail__tab-item"
|
||||
:class="{ 'resume-detail__tab-item--active': resumeActiveTab === tab.key }"
|
||||
@click="scrollToResumeSection(tab.key)"
|
||||
>{{ tab.label }}</span>
|
||||
</div>
|
||||
|
||||
</div><!-- 固定顶部区域结束 -->
|
||||
|
||||
<!-- 可滚动内容区域 -->
|
||||
<div ref="resumeScrollRef" class="resume-detail__scroll-body">
|
||||
|
||||
<!-- 个人信息卡片 -->
|
||||
<div class="resume-detail__card" :class="{ 'resume-detail__card-hover': editModule !== 'info' || !showEditDrawer }">
|
||||
<div ref="resumeSectionInfoRef" class="resume-detail__card" :class="{ 'resume-detail__card-hover': editModule !== 'info' || !showEditDrawer }">
|
||||
<!-- 展示模式 -->
|
||||
<template v-if="editModule !== 'info' || !showEditDrawer">
|
||||
<div class="resume-detail__card-header color-6">
|
||||
<div class="dflex-start aliite-c">
|
||||
<h3 class="resume-detail__user-name">{{ resumeMain.name || '未填写姓名' }}</h3>
|
||||
<p class="resume-detail__user-title">{{ resumeMain.targetPosition || '' }}</p>
|
||||
<span v-if="resumeMain.city" class="ml10 dflex-start aliite-c fs13">
|
||||
<svg viewBox="0 0 16 16" fill="none" class="resume-detail__contact-icon">
|
||||
<circle cx="8" cy="6.5" r="2.5" stroke="currentColor" stroke-width="1.2"/>
|
||||
@@ -200,7 +238,7 @@
|
||||
</div>
|
||||
|
||||
<!-- 个人概述 -->
|
||||
<div class="resume-detail__card" :class="{ 'resume-detail__card-hover': editModule !== 'summary' || !showEditDrawer }">
|
||||
<div ref="resumeSectionSummaryRef" class="resume-detail__card" :class="{ 'resume-detail__card-hover': editModule !== 'summary' || !showEditDrawer }">
|
||||
<!-- 展示模式 -->
|
||||
<template v-if="editModule !== 'summary' || !showEditDrawer">
|
||||
<div class="resume-detail__section-header pl0">
|
||||
@@ -233,7 +271,7 @@
|
||||
</div>
|
||||
|
||||
<!-- 教育背景经历 -->
|
||||
<div class="resume-detail__card">
|
||||
<div ref="resumeSectionEducationRef" class="resume-detail__card">
|
||||
<div class="resume-detail__section-header">
|
||||
<h3 class="resume-detail__section-title resume-detail__section-title--underline">教育背景</h3>
|
||||
<!-- 添加按钮 — hover模块时显示 -->
|
||||
@@ -257,7 +295,7 @@
|
||||
<span v-if="edu.major || edu.degree" class="resume-detail__exp-role">{{ edu.major }}{{ edu.degree ? '·' + edu.degree : '' }}</span>
|
||||
<span v-if="hasDiagnosis && getIssueByRecord('education', edu.id!) && getIssueByRecord('education', edu.id!)!.status === 0" class="resume-detail__fix-tag">
|
||||
<svg viewBox="0 0 16 16" class="resume-detail__fix-tag-icon"><circle cx="8" cy="8" r="7" fill="#FF8D0B"/><text x="8" y="12" text-anchor="middle" font-size="11" fill="#fff" font-weight="bold">!</text></svg>
|
||||
建议使用AI润色修复 >>
|
||||
建议使用AI润色修复
|
||||
<span class="resume-detail__fix-tooltip">{{ getIssueByRecord('education', edu.id!)!.finding }}</span>
|
||||
</span>
|
||||
<div class="mlauto dflex-end">
|
||||
@@ -291,7 +329,7 @@
|
||||
</div>
|
||||
|
||||
<!-- 工作经历 -->
|
||||
<div class="resume-detail__card">
|
||||
<div ref="resumeSectionWorkRef" class="resume-detail__card">
|
||||
<div class="resume-detail__section-header">
|
||||
<h3 class="resume-detail__section-title resume-detail__section-title--underline">工作经历</h3>
|
||||
<button class="resume-detail__edit-btn-inline" @click="startAddExp('work')" aria-label="添加工作经历">
|
||||
@@ -307,7 +345,7 @@
|
||||
<span v-if="exp.position" class="resume-detail__exp-role">{{ exp.position }}</span>
|
||||
<span v-if="hasDiagnosis && getIssueByRecord('work', exp.id!) && getIssueByRecord('work', exp.id!)!.status === 0" class="resume-detail__fix-tag">
|
||||
<svg viewBox="0 0 16 16" class="resume-detail__fix-tag-icon"><circle cx="8" cy="8" r="7" fill="#FF8D0B"/><text x="8" y="12" text-anchor="middle" font-size="11" fill="#fff" font-weight="bold">!</text></svg>
|
||||
建议使用AI润色修复 >>
|
||||
建议使用AI润色修复
|
||||
<span class="resume-detail__fix-tooltip">{{ getIssueByRecord('work', exp.id!)!.finding }}</span>
|
||||
</span>
|
||||
<div class="mlauto dflex-end">
|
||||
@@ -330,7 +368,7 @@
|
||||
</div>
|
||||
|
||||
<!-- 实习经历 -->
|
||||
<div class="resume-detail__card">
|
||||
<div ref="resumeSectionInternshipRef" class="resume-detail__card">
|
||||
<div class="resume-detail__section-header">
|
||||
<h3 class="resume-detail__section-title resume-detail__section-title--underline">实习经历</h3>
|
||||
<button class="resume-detail__edit-btn-inline" @click="startAddExp('internship')" aria-label="添加实习经历">
|
||||
@@ -345,7 +383,7 @@
|
||||
<span v-if="intern.position" class="resume-detail__exp-role">{{ intern.position }}</span>
|
||||
<span v-if="hasDiagnosis && getIssueByRecord('internship', intern.id!) && getIssueByRecord('internship', intern.id!)!.status === 0" class="resume-detail__fix-tag">
|
||||
<svg viewBox="0 0 16 16" class="resume-detail__fix-tag-icon"><circle cx="8" cy="8" r="7" fill="#FF8D0B"/><text x="8" y="12" text-anchor="middle" font-size="11" fill="#fff" font-weight="bold">!</text></svg>
|
||||
建议使用AI润色修复 >>
|
||||
建议使用AI润色修复
|
||||
<span class="resume-detail__fix-tooltip">{{ getIssueByRecord('internship', intern.id!)!.finding }}</span>
|
||||
</span>
|
||||
<div class="mlauto dflex-end">
|
||||
@@ -368,7 +406,7 @@
|
||||
</div>
|
||||
|
||||
<!-- 项目经历 -->
|
||||
<div class="resume-detail__card">
|
||||
<div ref="resumeSectionProjectRef" class="resume-detail__card">
|
||||
<div class="resume-detail__section-header">
|
||||
<h3 class="resume-detail__section-title resume-detail__section-title--underline">项目经历</h3>
|
||||
<button class="resume-detail__edit-btn-inline" @click="startAddExp('project')" aria-label="添加项目经历">
|
||||
@@ -383,7 +421,7 @@
|
||||
<span v-if="proj.role" class="resume-detail__exp-role">{{ proj.role }}</span>
|
||||
<span v-if="hasDiagnosis && getIssueByRecord('project', proj.id!) && getIssueByRecord('project', proj.id!)!.status === 0" class="resume-detail__fix-tag">
|
||||
<svg viewBox="0 0 16 16" class="resume-detail__fix-tag-icon"><circle cx="8" cy="8" r="7" fill="#FF8D0B"/><text x="8" y="12" text-anchor="middle" font-size="11" fill="#fff" font-weight="bold">!</text></svg>
|
||||
建议使用AI润色修复 >>
|
||||
建议使用AI润色修复
|
||||
<span class="resume-detail__fix-tooltip">{{ getIssueByRecord('project', proj.id!)!.finding }}</span>
|
||||
</span>
|
||||
<div class="mlauto dflex-end">
|
||||
@@ -406,7 +444,7 @@
|
||||
</div>
|
||||
|
||||
<!-- 竞赛经历 -->
|
||||
<div class="resume-detail__card">
|
||||
<div ref="resumeSectionCompetitionRef" class="resume-detail__card">
|
||||
<div class="resume-detail__section-header">
|
||||
<h3 class="resume-detail__section-title resume-detail__section-title--underline">竞赛经历</h3>
|
||||
<button class="resume-detail__edit-btn-inline" @click="startAddExp('competition')" aria-label="添加竞赛经历">
|
||||
@@ -421,7 +459,7 @@
|
||||
<span v-if="comp.award" class="resume-detail__exp-role">{{ comp.award }}</span>
|
||||
<span v-if="hasDiagnosis && getIssueByRecord('competition', comp.id!) && getIssueByRecord('competition', comp.id!)!.status === 0" class="resume-detail__fix-tag">
|
||||
<svg viewBox="0 0 16 16" class="resume-detail__fix-tag-icon"><circle cx="8" cy="8" r="7" fill="#FF8D0B"/><text x="8" y="12" text-anchor="middle" font-size="11" fill="#fff" font-weight="bold">!</text></svg>
|
||||
建议使用AI润色修复 >>
|
||||
建议使用AI润色修复
|
||||
<span class="resume-detail__fix-tooltip">{{ getIssueByRecord('competition', comp.id!)!.finding }}</span>
|
||||
</span>
|
||||
<div class="mlauto dflex-end">
|
||||
@@ -444,7 +482,7 @@
|
||||
</div>
|
||||
|
||||
<!-- 技能 -->
|
||||
<div class="resume-detail__card" :class="{ 'resume-detail__card-hover': editModule !== 'skills' || !showEditDrawer }">
|
||||
<div ref="resumeSectionSkillsRef" class="resume-detail__card" :class="{ 'resume-detail__card-hover': editModule !== 'skills' || !showEditDrawer }">
|
||||
<template v-if="editModule !== 'skills' || !showEditDrawer">
|
||||
<div class="resume-detail__section-header">
|
||||
<h3 class="resume-detail__section-title">技能</h3>
|
||||
@@ -473,7 +511,7 @@
|
||||
</div>
|
||||
|
||||
<!-- 证书 -->
|
||||
<div class="resume-detail__card" :class="{ 'resume-detail__card-hover': editModule !== 'certificate' || !showEditDrawer }">
|
||||
<div ref="resumeSectionCertificateRef" class="resume-detail__card" :class="{ 'resume-detail__card-hover': editModule !== 'certificate' || !showEditDrawer }">
|
||||
<template v-if="editModule !== 'certificate' || !showEditDrawer">
|
||||
<div class="resume-detail__section-header">
|
||||
<h3 class="resume-detail__section-title">证书</h3>
|
||||
@@ -500,6 +538,7 @@
|
||||
@cancel="showEditDrawer = false"
|
||||
/>
|
||||
</div>
|
||||
</div><!-- 可滚动内容区域结束 -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -509,6 +548,17 @@
|
||||
<MemberDialog v-model="showMemberDialog" />
|
||||
<!-- 全屏加载遮罩 -->
|
||||
<FullscreenLoading :visible="fullLoading" :text="fullLoadingText" title="Nova 正在帮您努力处理~" />
|
||||
<!-- 简历诊断步骤进度遮罩 -->
|
||||
<StepProgressOverlay
|
||||
v-if="showDiagnoseProgress"
|
||||
:title="diagnoseProgressTitle"
|
||||
:subtitle="diagnoseProgressSubtitle"
|
||||
:steps="diagnoseProgressSteps"
|
||||
:durations="diagnoseProgressDurations"
|
||||
:done="diagnoseProgressDone"
|
||||
@finished="handleDiagnoseProgressFinished"
|
||||
@close="handleDiagnoseProgressClose"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -568,10 +618,67 @@ import {
|
||||
import {ArrowLeft, EditPen, Plus, DeleteFilled, ChatLineRound} from "@element-plus/icons-vue";
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import FullscreenLoading from '@/components/FullscreenLoading.vue'
|
||||
import StepProgressOverlay from '@/components/StepProgressOverlay.vue'
|
||||
|
||||
// ==================== Store 实例 ====================
|
||||
const store = useStore()
|
||||
|
||||
// ==================== Tab 导航栏相关 ====================
|
||||
|
||||
/** 简历详情 Tab 导航列表 */
|
||||
const resumeTabList = [
|
||||
{ key: 'info', label: '个人信息' },
|
||||
{ key: 'summary', label: '个人概述' },
|
||||
{ key: 'education', label: '教育背景' },
|
||||
{ key: 'work', label: '工作经历' },
|
||||
{ key: 'internship', label: '实习经历' },
|
||||
{ key: 'project', label: '项目经历' },
|
||||
{ key: 'competition', label: '竞赛经历' },
|
||||
{ key: 'skills', label: '技能' },
|
||||
{ key: 'certificate', label: '证书' },
|
||||
]
|
||||
|
||||
/** 当前激活的 Tab */
|
||||
const resumeActiveTab = ref('info')
|
||||
|
||||
/** 可滚动区域的 DOM 引用 */
|
||||
const resumeScrollRef = ref<HTMLElement | null>(null)
|
||||
|
||||
/** 各模块的 DOM 引用 */
|
||||
const resumeSectionInfoRef = ref<HTMLElement | null>(null)
|
||||
const resumeSectionSummaryRef = ref<HTMLElement | null>(null)
|
||||
const resumeSectionEducationRef = ref<HTMLElement | null>(null)
|
||||
const resumeSectionWorkRef = ref<HTMLElement | null>(null)
|
||||
const resumeSectionInternshipRef = ref<HTMLElement | null>(null)
|
||||
const resumeSectionProjectRef = ref<HTMLElement | null>(null)
|
||||
const resumeSectionCompetitionRef = ref<HTMLElement | null>(null)
|
||||
const resumeSectionSkillsRef = ref<HTMLElement | null>(null)
|
||||
const resumeSectionCertificateRef = ref<HTMLElement | null>(null)
|
||||
|
||||
/** 模块 key 与 ref 的映射 */
|
||||
const resumeSectionRefMap: Record<string, typeof resumeSectionInfoRef> = {
|
||||
info: resumeSectionInfoRef,
|
||||
summary: resumeSectionSummaryRef,
|
||||
education: resumeSectionEducationRef,
|
||||
work: resumeSectionWorkRef,
|
||||
internship: resumeSectionInternshipRef,
|
||||
project: resumeSectionProjectRef,
|
||||
competition: resumeSectionCompetitionRef,
|
||||
skills: resumeSectionSkillsRef,
|
||||
certificate: resumeSectionCertificateRef,
|
||||
}
|
||||
|
||||
/** 点击 Tab 滚动到对应模块 */
|
||||
function scrollToResumeSection(key: string) {
|
||||
resumeActiveTab.value = key
|
||||
const targetRef = resumeSectionRefMap[key]
|
||||
const container = resumeScrollRef.value
|
||||
if (targetRef?.value && container) {
|
||||
const offsetTop = targetRef.value.offsetTop - container.offsetTop
|
||||
container.scrollTo({ top: offsetTop, behavior: 'smooth' })
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 全屏加载状态 ====================
|
||||
/** 全屏加载是否显示 */
|
||||
const fullLoading = ref(false)
|
||||
@@ -951,25 +1058,52 @@ async function handleDiagnose() {
|
||||
// 接口异常时不阻断(可能是网络问题),继续执行诊断
|
||||
}
|
||||
|
||||
// 全屏加载提示,AI 接口响应较慢
|
||||
fullLoadingText.value = '简历诊断中,请耐心等待…'
|
||||
fullLoading.value = true
|
||||
// 显示步骤进度遮罩
|
||||
showDiagnoseProgress.value = true
|
||||
diagnoseProgressDone.value = false
|
||||
try {
|
||||
const res = await triggerResumeDiagnosis(resumeId)
|
||||
if (res.code === 0) {
|
||||
// 诊断完成,重新拉取诊断报告数据
|
||||
await loadDiagnosis()
|
||||
ElMessage.success('诊断完成')
|
||||
// 通知进度组件接口已完成
|
||||
diagnoseProgressDone.value = true
|
||||
} else {
|
||||
showDiagnoseProgress.value = false
|
||||
ElMessage.error(res.msg || '诊断失败,请稍后重试')
|
||||
}
|
||||
} catch {
|
||||
showDiagnoseProgress.value = false
|
||||
ElMessage.error('诊断请求失败,请稍后重试')
|
||||
} finally {
|
||||
fullLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 简历诊断步骤进度遮罩 ====================
|
||||
|
||||
/** 诊断步骤进度遮罩是否显示 */
|
||||
const showDiagnoseProgress = ref(false)
|
||||
/** 诊断接口是否已完成 */
|
||||
const diagnoseProgressDone = ref(false)
|
||||
/** 诊断大标题 */
|
||||
const diagnoseProgressTitle = '简历诊断中,请耐心等待'
|
||||
/** 诊断副标题 */
|
||||
const diagnoseProgressSubtitle = '根据STAR法则,快速校验你的简历缺失部分并且评分'
|
||||
/** 诊断4个步骤名称 */
|
||||
const diagnoseProgressSteps = ['教育背景解析...', '工作经历解析...', '技能特长解析...', '评分结果最终确认...']
|
||||
/** 每步时长6000毫秒 */
|
||||
const diagnoseProgressDurations = [6000, 6000, 6000, 6000]
|
||||
|
||||
/** 诊断进度走完后提示成功 */
|
||||
function handleDiagnoseProgressFinished() {
|
||||
showDiagnoseProgress.value = false
|
||||
ElMessage.success('诊断完成')
|
||||
}
|
||||
|
||||
/** 关闭诊断进度遮罩 */
|
||||
function handleDiagnoseProgressClose() {
|
||||
showDiagnoseProgress.value = false
|
||||
}
|
||||
|
||||
/** 修复指定模块的问题 */
|
||||
function handleFixIssue(moduleType: string, recordId?: string) {
|
||||
fixModuleType.value = moduleType
|
||||
|
||||
Reference in New Issue
Block a user