Files
aiData/static/js/haibao.js

145 lines
4.8 KiB
JavaScript
Raw Normal View History

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');