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()