diff --git a/mini-program/src/pages/main/ScriptView.vue b/mini-program/src/pages/main/ScriptView.vue index f1887ac..198cf63 100644 --- a/mini-program/src/pages/main/ScriptView.vue +++ b/mini-program/src/pages/main/ScriptView.vue @@ -221,18 +221,28 @@ > {{ message.content }} @@ -719,6 +729,66 @@ const initializeFirstAIMessage = async () => { } } +/** + * 格式化版本标签,显示在 MessageCard 上 + */ +const formatVersionLabel = (message) => { + if (message.type !== 'script') return '' + const versionNum = message.versionNumber || 1 + const isCurrent = message.id === currentVersionMessageId.value + return isCurrent ? `V${versionNum} (当前)` : `V${versionNum}` +} + +/** + * 判断消息是否有子版本 + */ +const messageHasChildren = (message) => { + if (!message || message.type !== 'script') return false + // 通过 versions 列表判断是否有子版本 + return versions.value.some(v => v.parentMessageId === message.id) +} + +/** + * 查看消息的版本历史 + */ +const viewMessageVersions = async (message) => { + try { + const res = await listMessageVersions(message.id) + const versionList = res.data || [] + if (versionList.length === 0) { + uni.showToast({ title: '暂无历史版本', icon: 'none' }) + return + } + + const items = versionList.map(v => { + const isCurrent = v.id === currentVersionMessageId.value + return `${isCurrent ? '★ ' : ''}V${v.versionNumber || '-'}` + }) + + uni.showActionSheet({ + itemList: items, + success: async (actionRes) => { + const selected = versionList[actionRes.tapIndex] + if (!selected) return + if (selected.id === currentVersionMessageId.value) { + uni.showToast({ title: '已是当前版本', icon: 'none' }) + return + } + try { + await switchVersion({ scriptId: scriptId.value, messageId: selected.id }) + currentVersionMessageId.value = selected.id + await loadMessages() + uni.showToast({ title: `已切换到 V${selected.versionNumber}`, icon: 'success' }) + } catch (switchErr) { + uni.showToast({ title: switchErr.message || '切换失败', icon: 'none' }) + } + } + }) + } catch (error) { + uni.showToast({ title: error.message || '加载版本失败', icon: 'none' }) + } +} + const sendChat = async () => { if (!chatInput.value.trim() || generating.value) return const content = chatInput.value.trim()