fix: 更新当前界面,支持多公帐号切换
This commit is contained in:
@@ -16,11 +16,45 @@ const rewriteBtn = $("rewriteBtn");
|
||||
const wechatBtn = $("wechatBtn");
|
||||
const imBtn = $("imBtn");
|
||||
const coverUploadBtn = $("coverUploadBtn");
|
||||
const logoutBtn = $("logoutBtn");
|
||||
|
||||
function countText(v) {
|
||||
return (v || "").trim().length;
|
||||
}
|
||||
|
||||
/** 多选子项用顿号拼接,可选补充用分号接在末尾 */
|
||||
function buildMultiPrompt(nameAttr, extraId) {
|
||||
const boxes = document.querySelectorAll(`input[name="${nameAttr}"]:checked`);
|
||||
const parts = Array.from(boxes).map((b) => (b.value || "").trim()).filter(Boolean);
|
||||
const extraEl = extraId ? $(extraId) : null;
|
||||
const extra = extraEl ? (extraEl.value || "").trim() : "";
|
||||
let s = parts.join("、");
|
||||
if (extra) s = s ? `${s};${extra}` : extra;
|
||||
return s;
|
||||
}
|
||||
|
||||
function updateMultiDropdownSummary(nameAttr, summaryId, emptyHint) {
|
||||
const el = $(summaryId);
|
||||
if (!el) return;
|
||||
const parts = Array.from(document.querySelectorAll(`input[name="${nameAttr}"]:checked`)).map((b) =>
|
||||
(b.value || "").trim(),
|
||||
);
|
||||
el.textContent = parts.length ? parts.join("、") : emptyHint;
|
||||
}
|
||||
|
||||
function initMultiDropdowns() {
|
||||
const pairs = [
|
||||
{ name: "audienceChip", summary: "audienceSummary", empty: "点击展开,选择目标读者…" },
|
||||
{ name: "toneChip", summary: "toneSummary", empty: "点击展开,选择语气风格…" },
|
||||
];
|
||||
pairs.forEach(({ name, summary, empty }) => {
|
||||
updateMultiDropdownSummary(name, summary, empty);
|
||||
document.querySelectorAll(`input[name="${name}"]`).forEach((cb) => {
|
||||
cb.addEventListener("change", () => updateMultiDropdownSummary(name, summary, empty));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function updateCounters() {
|
||||
$("sourceCount").textContent = `${countText($("sourceText").value)} 字`;
|
||||
$("summaryCount").textContent = `${countText($("summary").value)} 字`;
|
||||
@@ -51,6 +85,104 @@ async function postJSON(url, body) {
|
||||
return data;
|
||||
}
|
||||
|
||||
async function fetchAuthMe() {
|
||||
const res = await fetch("/api/auth/me");
|
||||
const data = await res.json();
|
||||
if (!data.ok || !data.logged_in) {
|
||||
window.location.href = "/auth?next=/";
|
||||
return null;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
function renderWechatAccountSelect(me) {
|
||||
const sel = $("wechatAccountSelect");
|
||||
const hint = $("wechatAccountStatus");
|
||||
if (!sel) return;
|
||||
const list = Array.isArray(me.wechat_accounts) ? me.wechat_accounts : [];
|
||||
const activeId =
|
||||
me.active_wechat_account && me.active_wechat_account.id
|
||||
? Number(me.active_wechat_account.id)
|
||||
: 0;
|
||||
sel.innerHTML = "";
|
||||
if (!list.length) {
|
||||
const opt = document.createElement("option");
|
||||
opt.value = "";
|
||||
opt.textContent = "暂无公众号";
|
||||
sel.appendChild(opt);
|
||||
sel.disabled = true;
|
||||
if (hint) hint.textContent = "请先在「公众号设置」绑定";
|
||||
return;
|
||||
}
|
||||
sel.disabled = false;
|
||||
list.forEach((a) => {
|
||||
const opt = document.createElement("option");
|
||||
opt.value = String(a.id);
|
||||
const name = (a.account_name || "未命名").trim();
|
||||
const appid = (a.appid || "").trim();
|
||||
opt.textContent = appid ? `${name} (${appid})` : name;
|
||||
if ((activeId && Number(a.id) === activeId) || a.active) opt.selected = true;
|
||||
sel.appendChild(opt);
|
||||
});
|
||||
}
|
||||
|
||||
function flashWechatAccountHint(msg, clearMs = 2600) {
|
||||
const hint = $("wechatAccountStatus");
|
||||
if (!hint) return;
|
||||
hint.textContent = msg;
|
||||
if (clearMs > 0) {
|
||||
window.clearTimeout(flashWechatAccountHint._t);
|
||||
flashWechatAccountHint._t = window.setTimeout(() => {
|
||||
hint.textContent = "";
|
||||
}, clearMs);
|
||||
}
|
||||
}
|
||||
|
||||
const wechatAccountSelect = $("wechatAccountSelect");
|
||||
if (wechatAccountSelect) {
|
||||
wechatAccountSelect.addEventListener("change", async () => {
|
||||
const id = Number(wechatAccountSelect.value || 0);
|
||||
if (!id) return;
|
||||
try {
|
||||
const out = await postJSON("/api/auth/wechat/switch", { account_id: id });
|
||||
if (!out.ok) {
|
||||
flashWechatAccountHint(out.detail || "切换失败", 4000);
|
||||
const me = await fetchAuthMe();
|
||||
if (me) renderWechatAccountSelect(me);
|
||||
return;
|
||||
}
|
||||
const me = await fetchAuthMe();
|
||||
if (me) renderWechatAccountSelect(me);
|
||||
flashWechatAccountHint("已切换");
|
||||
} catch (e) {
|
||||
flashWechatAccountHint(e.message || "切换失败", 4000);
|
||||
const me = await fetchAuthMe();
|
||||
if (me) renderWechatAccountSelect(me);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function initWechatAccountSwitch() {
|
||||
const me = await fetchAuthMe();
|
||||
if (me) renderWechatAccountSelect(me);
|
||||
}
|
||||
|
||||
async function logoutAndGoAuth() {
|
||||
try {
|
||||
await postJSON("/api/auth/logout", {});
|
||||
} catch {
|
||||
// 忽略退出接口异常,直接跳转认证页
|
||||
}
|
||||
window.location.href = "/auth?next=/";
|
||||
}
|
||||
|
||||
if (logoutBtn) {
|
||||
logoutBtn.addEventListener("click", async () => {
|
||||
setLoading(logoutBtn, true, "退出登录", "退出中...");
|
||||
await logoutAndGoAuth();
|
||||
});
|
||||
}
|
||||
|
||||
$("rewriteBtn").addEventListener("click", async () => {
|
||||
const sourceText = $("sourceText").value.trim();
|
||||
if (sourceText.length < 20) {
|
||||
@@ -61,11 +193,13 @@ $("rewriteBtn").addEventListener("click", async () => {
|
||||
setStatus("正在改写...");
|
||||
setLoading(rewriteBtn, true, "改写并排版", "改写中...");
|
||||
try {
|
||||
const audience = buildMultiPrompt("audienceChip", "audienceExtra") || "公众号读者";
|
||||
const tone = buildMultiPrompt("toneChip", "toneExtra") || "专业、可信、可读性强";
|
||||
const data = await postJSON("/api/rewrite", {
|
||||
source_text: sourceText,
|
||||
title_hint: $("titleHint").value,
|
||||
tone: $("tone").value,
|
||||
audience: $("audience").value,
|
||||
tone,
|
||||
audience,
|
||||
keep_points: $("keepPoints").value,
|
||||
avoid_words: $("avoidWords").value,
|
||||
});
|
||||
@@ -104,6 +238,11 @@ $("wechatBtn").addEventListener("click", async () => {
|
||||
setStatus("公众号草稿发布成功");
|
||||
} catch (e) {
|
||||
setStatus(`公众号发布失败: ${e.message}`, true);
|
||||
if ((e.message || "").includes("请先登录")) {
|
||||
window.location.href = "/auth?next=/";
|
||||
} else if ((e.message || "").includes("未绑定公众号")) {
|
||||
window.location.href = "/settings";
|
||||
}
|
||||
} finally {
|
||||
setLoading(wechatBtn, false, "发布到公众号草稿箱", "发布中...");
|
||||
}
|
||||
@@ -133,6 +272,11 @@ if (coverUploadBtn) {
|
||||
} catch (e) {
|
||||
if (hint) hint.textContent = "封面上传失败,请看状态提示。";
|
||||
setStatus(`封面上传失败: ${e.message}`, true);
|
||||
if ((e.message || "").includes("请先登录")) {
|
||||
window.location.href = "/auth?next=/";
|
||||
} else if ((e.message || "").includes("未绑定公众号")) {
|
||||
window.location.href = "/settings";
|
||||
}
|
||||
} finally {
|
||||
setLoading(coverUploadBtn, false, "上传封面并绑定", "上传中...");
|
||||
}
|
||||
@@ -161,3 +305,5 @@ $("imBtn").addEventListener("click", async () => {
|
||||
});
|
||||
|
||||
updateCounters();
|
||||
initMultiDropdowns();
|
||||
initWechatAccountSwitch();
|
||||
|
||||
Reference in New Issue
Block a user