2026-01-20 09:23:15 +08:00
|
|
|
const { createApp, ref, onMounted } = Vue;
|
|
|
|
|
|
|
|
|
|
const app = createApp({
|
|
|
|
|
setup() {
|
|
|
|
|
const prompt = ref('');
|
|
|
|
|
const generating = ref(false);
|
|
|
|
|
const refining = ref(false);
|
|
|
|
|
const currentImage = ref(null);
|
|
|
|
|
const historyList = ref([]);
|
|
|
|
|
const presets = ['清明节', '春节', '国庆十一', '端午节', '中秋节', '绿色出行', '低碳生活', '未来科技充电站'];
|
|
|
|
|
|
|
|
|
|
// Load history
|
|
|
|
|
const loadHistory = async () => {
|
|
|
|
|
try {
|
|
|
|
|
const res = await axios.get('/haibao/history');
|
|
|
|
|
historyList.value = res.data;
|
|
|
|
|
// If history exists, show the latest one as current
|
|
|
|
|
if (historyList.value.length > 0 && !currentImage.value) {
|
|
|
|
|
currentImage.value = historyList.value[0];
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.error('Failed to load history', e);
|
|
|
|
|
ElementPlus.ElMessage.error('加载历史记录失败');
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Refine Prompt
|
|
|
|
|
const handleRefine = async () => {
|
|
|
|
|
if (!prompt.value.trim()) {
|
|
|
|
|
ElementPlus.ElMessage.warning('请先输入一些关键词');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
refining.value = true;
|
2026-01-20 09:38:29 +08:00
|
|
|
const originalPrompt = prompt.value;
|
|
|
|
|
let isFirstChunk = true;
|
|
|
|
|
|
2026-01-20 09:23:15 +08:00
|
|
|
try {
|
2026-01-20 09:38:29 +08:00
|
|
|
const response = await fetch('/haibao/refine', {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
headers: {
|
|
|
|
|
'Content-Type': 'application/json'
|
|
|
|
|
},
|
|
|
|
|
body: JSON.stringify({ prompt: originalPrompt })
|
2026-01-20 09:23:15 +08:00
|
|
|
});
|
2026-01-20 09:38:29 +08:00
|
|
|
|
|
|
|
|
if (!response.ok) {
|
|
|
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
2026-01-20 09:23:15 +08:00
|
|
|
}
|
2026-01-20 09:38:29 +08:00
|
|
|
|
|
|
|
|
const reader = response.body.getReader();
|
|
|
|
|
const decoder = new TextDecoder();
|
|
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
|
const { value, done } = await reader.read();
|
|
|
|
|
if (done) break;
|
|
|
|
|
|
|
|
|
|
const text = decoder.decode(value, { stream: true });
|
|
|
|
|
|
|
|
|
|
if (isFirstChunk) {
|
|
|
|
|
prompt.value = '';
|
|
|
|
|
isFirstChunk = false;
|
|
|
|
|
}
|
|
|
|
|
prompt.value += text;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ElementPlus.ElMessage.success('创意扩写完成');
|
2026-01-20 09:23:15 +08:00
|
|
|
} catch (e) {
|
|
|
|
|
console.error('Refine failed', e);
|
2026-01-20 09:38:29 +08:00
|
|
|
ElementPlus.ElMessage.error('扩写失败: ' + e.message);
|
2026-01-20 09:23:15 +08:00
|
|
|
} finally {
|
|
|
|
|
refining.value = false;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Generate
|
|
|
|
|
const handleGenerate = async () => {
|
|
|
|
|
if (!prompt.value.trim()) {
|
|
|
|
|
ElementPlus.ElMessage.warning('请输入提示词');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
generating.value = true;
|
|
|
|
|
try {
|
|
|
|
|
const res = await axios.post('/haibao/generate', {
|
|
|
|
|
prompt: prompt.value
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
currentImage.value = res.data;
|
|
|
|
|
ElementPlus.ElMessage.success('生成成功');
|
|
|
|
|
// Insert new item to history locally to avoid delay
|
|
|
|
|
historyList.value.unshift(res.data);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.error('Generation failed', e);
|
|
|
|
|
ElementPlus.ElMessage.error('生成失败: ' + (e.response?.data?.detail || e.message));
|
|
|
|
|
} finally {
|
|
|
|
|
generating.value = false;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Use preset
|
|
|
|
|
const usePreset = (text) => {
|
|
|
|
|
prompt.value = text;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// View history item
|
|
|
|
|
const viewHistory = (item) => {
|
|
|
|
|
currentImage.value = item;
|
|
|
|
|
window.scrollTo({ top: 0, behavior: 'smooth' });
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Copy Scheme
|
|
|
|
|
const copyScheme = async () => {
|
|
|
|
|
if (!currentImage.value || !currentImage.value.scheme_content) return;
|
|
|
|
|
try {
|
|
|
|
|
await navigator.clipboard.writeText(currentImage.value.scheme_content);
|
|
|
|
|
ElementPlus.ElMessage.success('文案已复制到剪贴板');
|
|
|
|
|
} catch (err) {
|
|
|
|
|
console.error('Failed to copy text: ', err);
|
|
|
|
|
ElementPlus.ElMessage.error('复制失败,请手动复制');
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
loadHistory();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
prompt,
|
|
|
|
|
generating,
|
|
|
|
|
currentImage,
|
|
|
|
|
historyList,
|
|
|
|
|
presets,
|
|
|
|
|
handleGenerate,
|
|
|
|
|
handleRefine,
|
|
|
|
|
usePreset,
|
|
|
|
|
viewHistory,
|
|
|
|
|
copyScheme
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
app.use(ElementPlus);
|
|
|
|
|
app.mount('#app');
|