定制简历AI编辑撤回修改按钮展示逻辑,和消息通知显示时间

This commit is contained in:
xuxin
2026-05-28 16:28:18 +08:00
parent e34bb2a21e
commit 96071d0105
2 changed files with 52 additions and 10 deletions
+47 -9
View File
@@ -268,10 +268,19 @@
> >
<div class="job-resume-custom-dialog__ai-msg-bubble">{{ msg.content }}</div> <div class="job-resume-custom-dialog__ai-msg-bubble">{{ msg.content }}</div>
</div> </div>
<!-- 撤销修改气泡 type=updated assistant 消息显示 --> <!-- 撤销修改气泡 -->
<div v-if="msg.canRollback" class="job-resume-custom-dialog__ai-rollback"> <!-- 已撤销状态所有历史中已撤销的消息都显示 -->
<div v-if="msg.canRollback && msg.rollbackStatus === 'done'" class="job-resume-custom-dialog__ai-rollback">
<span class="job-resume-custom-dialog__ai-rollback-done">
<svg viewBox="0 0 16 16" fill="none" class="job-resume-custom-dialog__ai-rollback-icon">
<path d="M3 8.5l3 3 7-7" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
已撤销此次简历修改
</span>
</div>
<!-- 撤销按钮仅当该消息是列表最后一条且为AI修改简历的回答且未撤销时显示 -->
<div v-if="msg.canRollback && msg.rollbackStatus !== 'done' && isLastMessage(i)" class="job-resume-custom-dialog__ai-rollback">
<button <button
v-if="msg.rollbackStatus !== 'done'"
class="job-resume-custom-dialog__ai-rollback-btn" class="job-resume-custom-dialog__ai-rollback-btn"
@click="handleRollbackClick(i)" @click="handleRollbackClick(i)"
> >
@@ -280,12 +289,6 @@
</svg> </svg>
撤销修改 撤销修改
</button> </button>
<span v-else class="job-resume-custom-dialog__ai-rollback-done">
<svg viewBox="0 0 16 16" fill="none" class="job-resume-custom-dialog__ai-rollback-icon">
<path d="M3 8.5l3 3 7-7" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
已撤销此次简历修改
</span>
</div> </div>
</div> </div>
<!-- AI正在回复的加载指示器 --> <!-- AI正在回复的加载指示器 -->
@@ -430,11 +433,37 @@ const isLowMatch = computed(() => props.jobInfo.matchScore < 6)
/** 跳转到指定步骤 */ /** 跳转到指定步骤 */
function goToStep(step: number) { function goToStep(step: number) {
// 从步骤4返回步骤3时,清理步骤4的状态数据(避免下次进入被旧数据影响)
if (currentStep.value === 4 && step === 3) {
resetStep4State()
}
if (step === 3) initSkillOptions() if (step === 3) initSkillOptions()
if (step === 4) fetchAndLoadCustomResume() if (step === 4) fetchAndLoadCustomResume()
else currentStep.value = step else currentStep.value = step
} }
/** 重置步骤4(预览)的所有状态数据 */
function resetStep4State() {
aiMessages.value = []
aiInputText.value = ''
aiLoading.value = false
isShowDiff.value = false
previewTab.value = 'ai'
cachedOptimizedScore.value = 0
oldResumeTemplateData.value = {
name: '', email: '', mobileNumber: '', wechatNumber: '', summary: '',
educations: [], workExperiences: [], internships: [], projects: [],
competitions: [], skills: [], certificates: [],
}
resumeTemplateData.value = {
name: '', email: '', mobileNumber: '', wechatNumber: '', summary: '',
educations: [], workExperiences: [], internships: [], projects: [],
competitions: [], skills: [], certificates: [],
}
customResumeRawData.value = { resume: {} }
showDownloadMenu.value = false
}
/** 抽屉模式下一步 */ /** 抽屉模式下一步 */
async function handleDrawerNext() { async function handleDrawerNext() {
if (currentStep.value >= 4) return if (currentStep.value >= 4) return
@@ -914,6 +943,15 @@ const showRollbackConfirm = ref(false)
/** 当前要撤销的消息索引 */ /** 当前要撤销的消息索引 */
const rollbackMsgIndex = ref(-1) const rollbackMsgIndex = ref(-1)
/**
* 判断该消息是否为消息列表的最后一条
* 撤销按钮只在最后一条消息恰好是AI修改简历的回答时才显示
* @param msgIndex 消息在列表中的索引
*/
function isLastMessage(msgIndex: number): boolean {
return msgIndex === aiMessages.value.length - 1
}
/** /**
* 点击撤销修改按钮 — 弹出确认弹窗 * 点击撤销修改按钮 — 弹出确认弹窗
* @param msgIndex 消息在列表中的索引 * @param msgIndex 消息在列表中的索引
+5 -1
View File
@@ -64,7 +64,10 @@
<div class="side-nav__message-detail"> <div class="side-nav__message-detail">
<template v-if="currentMessage"> <template v-if="currentMessage">
<div class="side-nav__message-detail-title">{{ currentMessage.title }}</div> <div class="side-nav__message-detail-title">{{ currentMessage.title }}</div>
<div class="side-nav__message-detail-content">{{ currentMessage.content }}</div> <div class="dflex aliite-e">
<div class="side-nav__message-detail-content">{{ currentMessage.content }}</div>
<div class="fs12 color-8 w200 tar">{{timestampToLocalDateTime(currentMessage.createTime, 'returnSecond')}}</div>
</div>
</template> </template>
<div v-else class="side-nav__message-detail-empty">请选择一条消息查看</div> <div v-else class="side-nav__message-detail-empty">请选择一条消息查看</div>
</div> </div>
@@ -125,6 +128,7 @@ import { useStore } from 'vuex'
import SettingsDialog from '@/components/SettingsDialog.vue' import SettingsDialog from '@/components/SettingsDialog.vue'
import { checkLogin } from '@/api/auth' import { checkLogin } from '@/api/auth'
import { fetchMessageList, fetchUnreadCount, markMessageRead } from '@/api/message' import { fetchMessageList, fetchUnreadCount, markMessageRead } from '@/api/message'
import { timestampToLocalDateTime } from '@/utils/time'
import {userFeedback} from '@/api/setting' import {userFeedback} from '@/api/setting'
import type { MessageDto } from '@/api/message' import type { MessageDto } from '@/api/message'
import navJobsIcon from '@/assets/images/nav/nav-jobs-icon.png' import navJobsIcon from '@/assets/images/nav/nav-jobs-icon.png'