This commit is contained in:
Daniel
2026-04-28 11:50:55 +08:00
parent 1bbabc2a78
commit 2724e69b4f
20 changed files with 3881 additions and 554 deletions

View File

@@ -43,7 +43,7 @@ function renderAccounts(me) {
if (!list.length) {
const opt = document.createElement("option");
opt.value = "";
opt.textContent = "暂无公众号,请先绑定";
opt.textContent = "未绑定公众号";
sel.appendChild(opt);
return;
}
@@ -56,16 +56,44 @@ function renderAccounts(me) {
});
}
function renderModels(me) {
const sel = $("modelSelect");
if (!sel) return;
const list = Array.isArray(me.ai_models) ? me.ai_models : [];
const active = me.active_ai_model && me.active_ai_model.id ? Number(me.active_ai_model.id) : 0;
sel.innerHTML = "";
if (!list.length) {
const opt = document.createElement("option");
opt.value = "";
opt.textContent = "暂无模型配置,请先新增";
sel.appendChild(opt);
return;
}
list.forEach((m) => {
const opt = document.createElement("option");
opt.value = String(m.id);
opt.textContent = `${m.model_name} (${m.model})`;
if ((active && m.id === active) || m.active) opt.selected = true;
sel.appendChild(opt);
});
}
async function refresh() {
const me = await authMe();
if (!me) return;
renderAccounts(me);
renderModels(me);
}
const accountSelect = $("accountSelect");
const bindBtn = $("bindBtn");
const deleteWechatBtn = $("deleteWechatBtn");
const logoutBtn = $("logoutBtn");
const changePwdBtn = $("changePwdBtn");
const deleteAccountBtn = $("deleteAccountBtn");
const modelSelect = $("modelSelect");
const saveModelBtn = $("saveModelBtn");
const deleteModelBtn = $("deleteModelBtn");
if (accountSelect) {
accountSelect.addEventListener("change", async () => {
@@ -85,6 +113,32 @@ if (accountSelect) {
});
}
if (deleteWechatBtn) {
deleteWechatBtn.addEventListener("click", async () => {
const id = Number((accountSelect && accountSelect.value) || 0);
if (!id) {
setStatus("请先选择要删除的公众号", true);
return;
}
const sure = window.confirm("确定删除当前公众号绑定吗?删除后不可恢复。");
if (!sure) return;
setLoading(deleteWechatBtn, true, "删除当前公众号", "删除中...");
try {
const out = await postJSON("/api/auth/wechat/delete", { account_id: id });
if (!out.ok) {
setStatus(out.detail || "删除失败", true);
return;
}
setStatus("公众号账号已删除。");
await refresh();
} catch (e) {
setStatus(e.message || "删除失败", true);
} finally {
setLoading(deleteWechatBtn, false, "删除当前公众号", "删除中...");
}
});
}
if (bindBtn) {
bindBtn.addEventListener("click", async () => {
setLoading(bindBtn, true, "绑定并设为当前账号", "绑定中...");
@@ -113,6 +167,79 @@ if (bindBtn) {
});
}
if (modelSelect) {
modelSelect.addEventListener("change", async () => {
const id = Number(modelSelect.value || 0);
if (!id) return;
try {
const out = await postJSON("/api/auth/ai-models/switch", { model_id: id });
if (!out.ok) {
setStatus(out.detail || "模型切换失败", true);
return;
}
setStatus("已切换当前模型。");
await refresh();
} catch (e) {
setStatus(e.message || "模型切换失败", true);
}
});
}
if (saveModelBtn) {
saveModelBtn.addEventListener("click", async () => {
setLoading(saveModelBtn, true, "保存并设为当前模型", "保存中...");
try {
const out = await postJSON("/api/auth/ai-models/add", {
model_name: ($("modelName") && $("modelName").value.trim()) || "",
api_key: ($("apiKey") && $("apiKey").value.trim()) || "",
base_url: ($("baseUrl") && $("baseUrl").value.trim()) || "",
model: ($("modelValue") && $("modelValue").value.trim()) || "",
timeout_sec: Number((($("timeoutSec") && $("timeoutSec").value) || "120").trim()),
max_output_tokens: Number((($("maxOutputTokens") && $("maxOutputTokens").value) || "8192").trim()),
max_retries: Number((($("maxRetries") && $("maxRetries").value) || "0").trim()),
});
if (!out.ok) {
setStatus(out.detail || "模型保存失败", true);
return;
}
setStatus("模型配置已保存并设为当前。");
if ($("apiKey")) $("apiKey").value = "";
if ($("modelName")) $("modelName").value = "";
await refresh();
} catch (e) {
setStatus(e.message || "模型保存失败", true);
} finally {
setLoading(saveModelBtn, false, "保存并设为当前模型", "保存中...");
}
});
}
if (deleteModelBtn) {
deleteModelBtn.addEventListener("click", async () => {
const id = Number((modelSelect && modelSelect.value) || 0);
if (!id) {
setStatus("请先选择要删除的模型", true);
return;
}
const sure = window.confirm("确定删除当前模型配置吗?删除后不可恢复。");
if (!sure) return;
setLoading(deleteModelBtn, true, "删除当前模型", "删除中...");
try {
const out = await postJSON("/api/auth/ai-models/delete", { model_id: id });
if (!out.ok) {
setStatus(out.detail || "模型删除失败", true);
return;
}
setStatus("模型配置已删除。");
await refresh();
} catch (e) {
setStatus(e.message || "模型删除失败", true);
} finally {
setLoading(deleteModelBtn, false, "删除当前模型", "删除中...");
}
});
}
if (logoutBtn) {
logoutBtn.addEventListener("click", async () => {
setLoading(logoutBtn, true, "退出登录", "退出中...");
@@ -150,4 +277,45 @@ if (changePwdBtn) {
});
}
if (deleteAccountBtn) {
deleteAccountBtn.addEventListener("click", async () => {
const pwd = ($("deletePassword") && $("deletePassword").value) || "";
const rkey = ($("deleteResetKey") && $("deleteResetKey").value.trim()) || "";
if (!pwd) {
setStatus("请输入注销校验密码", true);
return;
}
if (!rkey) {
setStatus("请输入注销校验重置码", true);
return;
}
const sure = window.confirm("确定注销账户吗?将清空此账号所有业务数据,操作不可恢复。");
if (!sure) return;
const confirmText = window.prompt("为防止误删,请输入「注销账户」后确认:", "");
if ((confirmText || "").trim() !== "注销账户") {
setStatus("二次确认未通过,已取消注销。", true);
return;
}
setLoading(deleteAccountBtn, true, "注销账户", "注销中...");
try {
const out = await postJSON("/api/auth/account/delete", {
password: pwd,
reset_key: rkey,
});
if (!out.ok) {
setStatus(out.detail || "注销失败", true);
return;
}
setStatus("账号已注销,正在返回登录页。");
window.setTimeout(() => {
window.location.href = "/auth?next=/";
}, 900);
} catch (e) {
setStatus(e.message || "注销失败", true);
} finally {
setLoading(deleteAccountBtn, false, "注销账户", "注销中...");
}
});
}
refresh();