115 lines
3.5 KiB
JavaScript
115 lines
3.5 KiB
JavaScript
const $ = (id) => document.getElementById(id);
|
|
|
|
const statusEl = $("status");
|
|
const rewriteBtn = $("rewriteBtn");
|
|
const wechatBtn = $("wechatBtn");
|
|
const imBtn = $("imBtn");
|
|
|
|
function countText(v) {
|
|
return (v || "").trim().length;
|
|
}
|
|
|
|
function updateCounters() {
|
|
$("sourceCount").textContent = `${countText($("sourceText").value)} 字`;
|
|
$("summaryCount").textContent = `${countText($("summary").value)} 字`;
|
|
$("bodyCount").textContent = `${countText($("body").value)} 字`;
|
|
}
|
|
|
|
function setLoading(button, loading, idleText, loadingText) {
|
|
if (!button) return;
|
|
button.disabled = loading;
|
|
button.textContent = loading ? loadingText : idleText;
|
|
}
|
|
|
|
function setStatus(msg, danger = false) {
|
|
statusEl.style.color = danger ? "#b42318" : "#0f5f3d";
|
|
statusEl.textContent = msg;
|
|
}
|
|
|
|
async function postJSON(url, body) {
|
|
const res = await fetch(url, {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(body),
|
|
});
|
|
const data = await res.json();
|
|
if (!res.ok) throw new Error(data.detail || "请求失败");
|
|
return data;
|
|
}
|
|
|
|
$("rewriteBtn").addEventListener("click", async () => {
|
|
const sourceText = $("sourceText").value.trim();
|
|
if (sourceText.length < 20) {
|
|
setStatus("原始内容太短,至少 20 个字符", true);
|
|
return;
|
|
}
|
|
|
|
setStatus("AI 改写中...");
|
|
setLoading(rewriteBtn, true, "AI 改写并排版", "AI 改写中...");
|
|
try {
|
|
const data = await postJSON("/api/rewrite", {
|
|
source_text: sourceText,
|
|
title_hint: $("titleHint").value,
|
|
tone: $("tone").value,
|
|
audience: $("audience").value,
|
|
keep_points: $("keepPoints").value,
|
|
avoid_words: $("avoidWords").value,
|
|
});
|
|
$("title").value = data.title || "";
|
|
$("summary").value = data.summary || "";
|
|
$("body").value = data.body_markdown || "";
|
|
updateCounters();
|
|
if (data.mode === "fallback") {
|
|
const note = (data.quality_notes || [])[0] || "当前为保底改写稿";
|
|
setStatus(`改写完成(保底模式):${note}`, true);
|
|
} else {
|
|
setStatus("改写完成,可直接发布。");
|
|
}
|
|
} catch (e) {
|
|
setStatus(`改写失败: ${e.message}`, true);
|
|
} finally {
|
|
setLoading(rewriteBtn, false, "AI 改写并排版", "AI 改写中...");
|
|
}
|
|
});
|
|
|
|
$("wechatBtn").addEventListener("click", async () => {
|
|
setStatus("正在发布到公众号草稿箱...");
|
|
setLoading(wechatBtn, true, "发布到公众号草稿箱", "发布中...");
|
|
try {
|
|
const data = await postJSON("/api/publish/wechat", {
|
|
title: $("title").value,
|
|
summary: $("summary").value,
|
|
body_markdown: $("body").value,
|
|
});
|
|
if (!data.ok) throw new Error(data.detail);
|
|
setStatus("公众号草稿发布成功");
|
|
} catch (e) {
|
|
setStatus(`公众号发布失败: ${e.message}`, true);
|
|
} finally {
|
|
setLoading(wechatBtn, false, "发布到公众号草稿箱", "发布中...");
|
|
}
|
|
});
|
|
|
|
$("imBtn").addEventListener("click", async () => {
|
|
setStatus("正在发送到 IM...");
|
|
setLoading(imBtn, true, "发送到 IM", "发送中...");
|
|
try {
|
|
const data = await postJSON("/api/publish/im", {
|
|
title: $("title").value,
|
|
body_markdown: $("body").value,
|
|
});
|
|
if (!data.ok) throw new Error(data.detail);
|
|
setStatus("IM 发送成功");
|
|
} catch (e) {
|
|
setStatus(`IM 发送失败: ${e.message}`, true);
|
|
} finally {
|
|
setLoading(imBtn, false, "发送到 IM", "发送中...");
|
|
}
|
|
});
|
|
|
|
["sourceText", "summary", "body"].forEach((id) => {
|
|
$(id).addEventListener("input", updateCounters);
|
|
});
|
|
|
|
updateCounters();
|