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