AI 生成: 一个基于 Flask 的 Web 应用,用户输入主题后由 AI 生成结构化的登记手册,包含封面、目录、正文与附录,并支持导出为 Markdown 文件。
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
const topicInput = document.getElementById("topic");
|
||||
const generateBtn = document.getElementById("generate-btn");
|
||||
const exportBtn = document.getElementById("export-btn");
|
||||
const statusEl = document.getElementById("status");
|
||||
const outputEl = document.getElementById("output");
|
||||
|
||||
let current = { topic: "", markdown: "" };
|
||||
|
||||
function setStatus(text, isError = false) {
|
||||
statusEl.textContent = text;
|
||||
statusEl.classList.toggle("error", isError);
|
||||
}
|
||||
|
||||
async function generate() {
|
||||
const topic = topicInput.value.trim();
|
||||
if (!topic) {
|
||||
setStatus("请先输入主题", true);
|
||||
return;
|
||||
}
|
||||
|
||||
generateBtn.disabled = true;
|
||||
exportBtn.disabled = true;
|
||||
setStatus("生成中,请稍候…");
|
||||
outputEl.textContent = "正在生成…";
|
||||
|
||||
try {
|
||||
const resp = await fetch("/api/generate", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ topic }),
|
||||
});
|
||||
const data = await resp.json();
|
||||
|
||||
if (!resp.ok) {
|
||||
throw new Error(data.error || "生成失败");
|
||||
}
|
||||
|
||||
current = { topic: data.topic, markdown: data.markdown };
|
||||
outputEl.textContent = data.markdown;
|
||||
exportBtn.disabled = false;
|
||||
setStatus("生成完成");
|
||||
} catch (err) {
|
||||
outputEl.textContent = "生成失败";
|
||||
setStatus(err.message, true);
|
||||
} finally {
|
||||
generateBtn.disabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function exportMarkdown() {
|
||||
if (!current.markdown) return;
|
||||
|
||||
try {
|
||||
const resp = await fetch("/api/export", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify(current),
|
||||
});
|
||||
|
||||
if (!resp.ok) {
|
||||
const data = await resp.json().catch(() => ({}));
|
||||
throw new Error(data.error || "导出失败");
|
||||
}
|
||||
|
||||
const blob = await resp.blob();
|
||||
const url = URL.createObjectURL(blob);
|
||||
const a = document.createElement("a");
|
||||
a.href = url;
|
||||
a.download = `${current.topic}-登记手册.md`;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
a.remove();
|
||||
URL.revokeObjectURL(url);
|
||||
setStatus("已开始下载");
|
||||
} catch (err) {
|
||||
setStatus(err.message, true);
|
||||
}
|
||||
}
|
||||
|
||||
generateBtn.addEventListener("click", generate);
|
||||
exportBtn.addEventListener("click", exportMarkdown);
|
||||
topicInput.addEventListener("keydown", (e) => {
|
||||
if (e.key === "Enter") generate();
|
||||
});
|
||||
Reference in New Issue
Block a user