diff --git a/mini-program/src/pages/main/ScriptDetailView.vue b/mini-program/src/pages/main/ScriptDetailView.vue
index d030ae3..20374b7 100644
--- a/mini-program/src/pages/main/ScriptDetailView.vue
+++ b/mini-program/src/pages/main/ScriptDetailView.vue
@@ -14,6 +14,10 @@
PARALLEL LIFE
{{ script?.title || '未命名剧本' }}
{{ script?.summary || '命运正在整理章节。' }}
+
+ 💭 用户心愿
+ {{ userWish }}
+
{{ script?.style || '爽文' }}
@@ -39,8 +43,17 @@
-
-
+
+
+
+ {{ index + 1 }}
+
+ {{ item.title }}
+ {{ item.text }}
+
+
+
+
{{ index + 1 }}
{{ item.title }}
@@ -83,6 +96,34 @@ const lengthText = computed(() => {
return map[script.value?.length] || script.value?.length || '中篇'
})
+/**
+ * 用户心愿原文(从 EpicScript.theme 字段读取)
+ */
+const userWish = computed(() => script.value?.theme || '')
+
+/**
+ * 大纲(从 plotJson.stages.outline 读取后端真实保存的 outline JSON)
+ * 后端 ShortNovelServiceImpl 在 novel_done 时会把 outline_created 事件累积到 metadata.stages.outline
+ */
+const outlineFromMeta = computed(() => {
+ const stages = script.value?.plotJson?.stages
+ if (!stages || !stages.outline) return []
+ const outline = stages.outline
+ const items = []
+ if (outline.title) items.push({ title: '标题', text: outline.title })
+ if (outline.logline) items.push({ title: '简介', text: outline.logline })
+ if (Array.isArray(outline.beats)) {
+ outline.beats.forEach((beat, i) => {
+ items.push({
+ title: beat.title || `章节 ${i + 1}`,
+ text: beat.text || beat.description || JSON.stringify(beat)
+ })
+ })
+ }
+ if (outline.ending) items.push({ title: '结局', text: outline.ending })
+ return items
+})
+
const detailTtsActionText = computed(() => {
if (!script.value?.id) return '播放'
if (ttsPlayer.loading.value) return '生成中'
@@ -271,6 +312,30 @@ onUnmounted(() => {
line-height: 1.62;
}
+.wish-block {
+ margin-top: 24rpx;
+ padding: 20rpx 22rpx;
+ border-radius: 22rpx;
+ background: linear-gradient(135deg, rgba(168, 85, 247, 0.16), rgba(232, 121, 249, 0.08));
+ border: 1rpx solid rgba(168, 85, 247, 0.24);
+}
+
+.wish-label {
+ display: block;
+ font-size: 22rpx;
+ color: #c186ff;
+ font-weight: 700;
+ letter-spacing: 2rpx;
+ margin-bottom: 8rpx;
+}
+
+.wish-text {
+ display: block;
+ font-size: 26rpx;
+ line-height: 1.62;
+ color: rgba(255, 255, 255, 0.92);
+}
+
.stats {
display: grid;
grid-template-columns: repeat(3, 1fr);