diff --git a/src/pages/activity-outline/index.vue b/src/pages/activity-outline/index.vue
index 56b7fa6..72e7a72 100644
--- a/src/pages/activity-outline/index.vue
+++ b/src/pages/activity-outline/index.vue
@@ -4,10 +4,7 @@
AI EVENT PLANNING OUTLINE
活动策划大纲生成
-
- 输入活动主题、受众、时间和资金等信息,系统会调用 `/ai/activityOutlineGen`
- 生成结构化活动策划大纲,适合方案初稿、汇报材料和执行拆解场景。
-
+ 填写活动主题、受众、时间和预算,AI 给出一份结构完整的策划大纲。
志愿服务
主题沙龙
@@ -96,13 +93,6 @@
{{ loading ? '生成中' : '生成大纲' }}
-
-
- 提交说明
-
- 必填字段会直接作为 `inputs` 透传给 AI,后端固定触发“活动策划大纲生成”指令,并返回整理后的正文结果。
-
-
@@ -114,20 +104,12 @@
- OUTLINE GENERATING
- AI 正在整理活动策划结构
-
- 正在综合活动主题、受众、时间与经费信息,生成可直接二次编辑的策划大纲。
-
+ 正在生成活动策划大纲…
- AI 正在生成正文内容,请稍候...
-
-
-
- {{ resultSummary }}
+ 正在生成正文…
@@ -135,7 +117,7 @@
-
- 提交说明
-
- 自由模式只提交一段内容(`docType` 留空),由后端转「AI 创意助手」;选了模板才提交 `docType`、活动类型、时间地点等结构化条件。
- 两种都会先 `POST /ai/manuscriptGen`,再通过 WebSocket 流式接收生成结果;如果后端直接返回正文,也会自动兼容显示。
-
-
@@ -191,15 +176,10 @@
{{ markdownContent || 'AI 正在生成内容...' }}
- 填写左侧创作条件后开始生成
+ 填写创作条件后开始生成
-
- 接口摘要
- {{ responseSummary }}
-
-
复制正文
复制标题
@@ -258,7 +238,6 @@
wsConnected: false,
generatedTitle: '',
generatedContent: '',
- responseSummary: '',
uploadedFiles: [],
activeConversationId: '',
socketTask: null,
@@ -415,16 +394,14 @@
// 序列化报文,其中的字段取不出来,按原文展示,不做失败推断。
return {
title: String(this.form.theme || '').trim(),
- content: payload,
- summary: '接口直接返回文本内容'
+ content: payload
}
}
if (isFailedPayload(payload)) {
return {
title: String(this.form.theme || '').trim(),
- content: resolveDisplayText({ payload, scope: 'manuscript' }),
- summary: '工作流执行失败'
+ content: resolveDisplayText({ payload, scope: 'manuscript' })
}
}
@@ -458,8 +435,7 @@
const resolved = content || resolveDisplayText({ payload, scope: 'manuscript' })
return {
title: title || String(this.form.theme || '').trim(),
- content: resolved,
- summary: content ? '已解析返回字段' : '接口已返回,但未解析到可展示的内容'
+ content: resolved
}
},
parseSerializedResult(payload) {
@@ -479,11 +455,10 @@
}
return payload
},
- applyParsedResult(payload, defaultSummary) {
+ applyParsedResult(payload) {
const parsed = this.parseResult(payload)
this.generatedTitle = parsed.title || this.generatedTitle || String(this.form.theme || '').trim()
this.generatedContent = parsed.content
- this.responseSummary = parsed.summary || defaultSummary
},
shouldTreatAsDirectResult(payload) {
if (!payload) {
@@ -558,14 +533,13 @@
this.streamFailed = true
}
this.generatedContent += chunk
- this.responseSummary = '正在通过 WebSocket 接收流式内容'
},
finishStream(conversationId) {
if (conversationId) {
this.activeConversationId = conversationId
}
const payload = this.parseSerializedResult(this.generatedContent)
- this.applyParsedResult(payload, '已通过 WebSocket 接收生成结果')
+ this.applyParsedResult(payload)
this.loading = false
this.resolveStream()
this.disconnectWebSocket()
@@ -682,7 +656,6 @@
clearGenerated() {
this.generatedTitle = ''
this.generatedContent = ''
- this.responseSummary = ''
},
resetForm() {
this.form = createDefaultForm()
@@ -793,16 +766,12 @@
this.loading = true
this.clearGenerated()
this.generatedTitle = String(this.form.theme || '').trim()
- this.responseSummary = '正在提交生成任务...'
try {
// 一律走 HTTP 流式(/stream),不再先连 WebSocket:
// 触发生成的那个 POST 在整段生成期间是零字节的,会被链路上的
// 60s 空闲超时掐成 504 Gateway Time-out(自由创作、不选文体时最先撞上)。
// /stream 每 15s 有后端心跳续命,帧内容与 WS 完全一致。
const payload = this.buildPayload()
- this.responseSummary = this.freeMode
- ? '自由创作已提交给 AI 创意助手,生成完成后一次性返回...'
- : '已提交生成任务,等待流式返回...'
const waitStream = this.createStreamWaiter()
await streamManuscriptGen(payload, {
onMessage: (raw) => this.handleStreamFrame(raw)
@@ -842,8 +811,7 @@
const result = frame.result
if (result && Number(result.code) === 0 && result.data) {
this.applyParsedResult(
- typeof result.data === 'string' ? this.parseSerializedResult(result.data) : result.data,
- '接口直接返回生成结果'
+ typeof result.data === 'string' ? this.parseSerializedResult(result.data) : result.data
)
return
}
@@ -999,21 +967,6 @@
min-height: 300rpx;
}
- .field-tip,
- .free-tip {
- margin-top: 10rpx;
- font-size: 22rpx;
- line-height: 1.7;
- color: #8f959e;
- }
-
- .free-tip {
- padding: 18rpx 22rpx;
- border-radius: 18rpx;
- background: rgba(20, 150, 242, 0.06);
- color: #6b7d8f;
- }
-
.field-value {
color: #303133;
}
@@ -1052,12 +1005,6 @@
font-weight: 600;
}
- .upload-tip {
- font-size: 22rpx;
- line-height: 1.7;
- color: #8b817c;
- }
-
.file-list {
display: flex;
flex-direction: column;
@@ -1158,30 +1105,6 @@
color: #0f7dd1;
}
- .hint-block,
- .response-meta {
- margin-top: 22rpx;
- padding: 22rpx 24rpx;
- border-radius: 24rpx;
- background: #f4faff;
- border: 1rpx solid rgba(20, 150, 242, 0.08);
- }
-
- .hint-title,
- .response-label {
- font-size: 24rpx;
- font-weight: 700;
- color: #8b4a12;
- }
-
- .hint-text,
- .response-value {
- margin-top: 10rpx;
- font-size: 22rpx;
- line-height: 1.75;
- color: #7b6d64;
- }
-
.result-card {
margin-bottom: 20rpx;
}