|
|
@@ -135,7 +135,7 @@
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
import { ref, computed } from 'vue';
|
|
|
-import { post } from '../../utils/request';
|
|
|
+import { post, get } from '../../utils/request';
|
|
|
|
|
|
const currentStep = ref(0);
|
|
|
const prompt = ref('');
|
|
|
@@ -145,6 +145,8 @@ const targetLength = ref(1000);
|
|
|
const generating = ref(false);
|
|
|
const generatingProgress = ref('');
|
|
|
const generatedContent = ref('');
|
|
|
+const currentTaskId = ref('');
|
|
|
+let pollTimer: ReturnType<typeof setInterval> | null = null;
|
|
|
|
|
|
// UI状态
|
|
|
const showHelp = ref(false);
|
|
|
@@ -163,6 +165,11 @@ const canGenerate = computed(() => {
|
|
|
});
|
|
|
|
|
|
function goBack() {
|
|
|
+ // 清理定时器
|
|
|
+ if (pollTimer) {
|
|
|
+ clearInterval(pollTimer);
|
|
|
+ pollTimer = null;
|
|
|
+ }
|
|
|
uni.navigateBack();
|
|
|
}
|
|
|
|
|
|
@@ -170,28 +177,99 @@ function useTemplate(tpl: { label: string; text: string }) {
|
|
|
prompt.value = tpl.text;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * 轮询任务状态
|
|
|
+ */
|
|
|
+async function pollTaskStatus(taskId: string) {
|
|
|
+ try {
|
|
|
+ const res = await get<any>(`/ai-content/task/${taskId}`);
|
|
|
+ const task = res;
|
|
|
+
|
|
|
+ // 更新进度显示
|
|
|
+ if (task.message) {
|
|
|
+ generatingProgress.value = task.message;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查任务状态
|
|
|
+ if (task.status === 'completed') {
|
|
|
+ // 任务完成
|
|
|
+ stopPolling();
|
|
|
+ generatedContent.value = task.result?.content || task.result?.text || '生成内容为空';
|
|
|
+ generatingProgress.value = '生成完成';
|
|
|
+ generating.value = false;
|
|
|
+ uni.hideLoading();
|
|
|
+ currentStep.value = 1; // 切换到结果显示
|
|
|
+ uni.showToast({ title: '生成完成', icon: 'success' });
|
|
|
+ } else if (task.status === 'failed') {
|
|
|
+ // 任务失败
|
|
|
+ stopPolling();
|
|
|
+ generating.value = false;
|
|
|
+ uni.hideLoading();
|
|
|
+ uni.showToast({ title: '生成失败: ' + (task.error || '未知错误'), icon: 'none' });
|
|
|
+ }
|
|
|
+ // pending 和 generating 状态继续轮询
|
|
|
+ } catch (e: any) {
|
|
|
+ console.error('轮询任务状态失败:', e);
|
|
|
+ // 轮询失败,继续尝试
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 停止轮询
|
|
|
+ */
|
|
|
+function stopPolling() {
|
|
|
+ if (pollTimer) {
|
|
|
+ clearInterval(pollTimer);
|
|
|
+ pollTimer = null;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
async function startGenerate() {
|
|
|
if (!canGenerate.value) return;
|
|
|
|
|
|
generating.value = true;
|
|
|
- generatingProgress.value = 'AI正在分析需求并生成内容...';
|
|
|
+ generatingProgress.value = '正在创建生成任务...';
|
|
|
generatedContent.value = '';
|
|
|
- uni.showLoading({ title: '内容生成中...' });
|
|
|
+ currentStep.value = 1; // 先切换到结果显示页面
|
|
|
+ uni.showLoading({ title: '创建任务...' });
|
|
|
|
|
|
try {
|
|
|
- const result = await post<any>('/ai-content/generate', {
|
|
|
+ // 1. 创建异步生成任务
|
|
|
+ // post 函数返回 result.data,所以 createRes 是 { taskId, status }
|
|
|
+ const createRes = await post<any>('/ai-content/generate-async', {
|
|
|
prompt: prompt.value,
|
|
|
targetLength: targetLength.value,
|
|
|
});
|
|
|
|
|
|
- generatedContent.value = result.content || result.text || '生成内容为空';
|
|
|
- generatingProgress.value = '生成完成';
|
|
|
- currentStep.value = 1; // 切换到结果显示
|
|
|
+ // createRes 已经是 { taskId, status }
|
|
|
+ if (!createRes.taskId) {
|
|
|
+ throw new Error('创建任务失败:未获取到任务ID');
|
|
|
+ }
|
|
|
+
|
|
|
+ currentTaskId.value = createRes.taskId;
|
|
|
+ generatingProgress.value = '任务已创建,正在等待AI响应...';
|
|
|
+
|
|
|
+ // 2. 开始轮询任务状态
|
|
|
+ // 初始延迟,确保服务器有时间开始处理
|
|
|
+ await new Promise(resolve => setTimeout(resolve, 500));
|
|
|
+
|
|
|
+ // 立即查询一次
|
|
|
+ await pollTaskStatus(currentTaskId.value);
|
|
|
+
|
|
|
+ // 如果还没完成,开始定时轮询
|
|
|
+ if (generating.value) {
|
|
|
+ pollTimer = setInterval(() => {
|
|
|
+ if (currentTaskId.value && generating.value) {
|
|
|
+ pollTaskStatus(currentTaskId.value);
|
|
|
+ }
|
|
|
+ }, 2000); // 每2秒轮询一次
|
|
|
+ }
|
|
|
+
|
|
|
} catch (e: any) {
|
|
|
- uni.showToast({ title: '生成失败: ' + (e.message || '未知错误'), icon: 'none' });
|
|
|
- } finally {
|
|
|
generating.value = false;
|
|
|
uni.hideLoading();
|
|
|
+ currentStep.value = 0; // 失败时回到输入页面
|
|
|
+ uni.showToast({ title: '创建任务失败: ' + (e.message || '未知错误'), icon: 'none' });
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -210,6 +288,9 @@ function useContent() {
|
|
|
}
|
|
|
|
|
|
function reset() {
|
|
|
+ // 清理定时器
|
|
|
+ stopPolling();
|
|
|
+ currentTaskId.value = '';
|
|
|
currentStep.value = 0;
|
|
|
generatedContent.value = '';
|
|
|
generatingProgress.value = '';
|