+
@@ -461,7 +449,7 @@
} else {
localStorage.removeItem(STORAGE.token);
}
- const email = $("login-email").value.trim() || $("reg-email").value.trim();
+ const email = $("auth-email").value.trim();
if (email) {
localStorage.setItem(STORAGE.email, email);
}
@@ -470,8 +458,7 @@
function restoreSession() {
state.accessToken = localStorage.getItem(STORAGE.token) || "";
const rememberedEmail = localStorage.getItem(STORAGE.email) || "";
- $("login-email").value = rememberedEmail;
- $("reg-email").value = rememberedEmail;
+ $("auth-email").value = rememberedEmail;
$("access-token").value = state.accessToken;
}
@@ -485,8 +472,7 @@
localStorage.removeItem(STORAGE.token);
$("access-token").value = "";
$("api-key").value = "";
- setStatus("login-status", "", "未执行");
- setStatus("register-status", "", "未执行");
+ setStatus("auth-status", "", "未执行");
setStatus("key-status", "", "未执行");
renderAll();
}
@@ -1127,7 +1113,7 @@
state.portalLogicalGroups = Array.isArray(payload.logical_groups) ? payload.logical_groups : [];
} catch (err) {
state.portalLogicalGroups = [];
- setStatus("login-status", "bad", "逻辑分组目录拉取失败: " + err.message);
+ setStatus("auth-status", "bad", "逻辑分组目录拉取失败: " + err.message);
}
if (!state.accessToken) {
@@ -1154,7 +1140,7 @@
} catch (err) {
clearSession();
statusPill("bad", "登录失效");
- setStatus("login-status", "bad", "会话已失效,请重新登录:" + err.message);
+ setStatus("auth-status", "bad", "会话已失效,请重新登录:" + err.message);
}
}
@@ -1164,53 +1150,40 @@
saveSession();
}
- async function handleRegister() {
- const email = $("reg-email").value.trim();
- const password = $("reg-password").value;
- setBusy("register-btn", true);
- try {
- const data = await requestJSON("/auth/register", "POST", {
- email,
- password,
- verify_code: "",
- turnstile_token: "",
- promo_code: "",
- invitation_code: "",
- aff_code: ""
- }, false);
- rememberAuth(data);
- $("login-email").value = email;
- $("login-password").value = password;
- setStatus("register-status", "ok", "注册成功,已自动登录。正在同步你的账号状态与申请资格。");
- setStatus("login-status", "ok", "已自动登录。");
- await refreshUserState();
- } catch (err) {
- setStatus("register-status", "bad", "注册失败: " + err.message);
- } finally {
- saveSession();
- setBusy("register-btn", false);
+ async function handleAuth() {
+ const email = $("auth-email").value.trim();
+ const password = $("auth-password").value;
+ if (!email || !password) {
+ setStatus("auth-status", "bad", "邮箱和密码都不能为空。");
+ return;
}
- }
-
- async function handleLogin() {
- const email = $("login-email").value.trim();
- const password = $("login-password").value;
- setBusy("login-btn", true);
+ setBusy("auth-btn", true);
+ setStatus("auth-status", "", "正在验证账号…");
try {
+ // 先尝试登录
const data = await requestJSON("/auth/login", "POST", {
- email,
- password,
- turnstile_token: ""
+ email, password, turnstile_token: ""
}, false);
rememberAuth(data);
- $("reg-email").value = email;
- setStatus("login-status", "ok", "登录成功,正在同步你的账号状态与申请资格。");
+ setStatus("auth-status", "ok", "登录成功,正在同步你的账号状态与申请资格。");
await refreshUserState();
- } catch (err) {
- setStatus("login-status", "bad", "登录失败: " + err.message);
+ } catch (loginErr) {
+ // 登录失败,尝试注册(可能是新用户)
+ try {
+ const regData = await requestJSON("/auth/register", "POST", {
+ email, password,
+ verify_code: "", turnstile_token: "",
+ promo_code: "", invitation_code: "", aff_code: ""
+ }, false);
+ rememberAuth(regData);
+ setStatus("auth-status", "ok", "新账号注册成功,已自动登录。正在同步…");
+ await refreshUserState();
+ } catch (regErr) {
+ setStatus("auth-status", "bad", "登录或注册均失败:" + regErr.message);
+ }
} finally {
saveSession();
- setBusy("login-btn", false);
+ setBusy("auth-btn", false);
}
}
@@ -1253,15 +1226,18 @@
await copyText(value, statusID, label, button);
}
- $("register-btn").addEventListener("click", handleRegister);
- $("login-btn").addEventListener("click", handleLogin);
+
+
$("create-key-btn").addEventListener("click", handleCreateKey);
$("refresh-session-btn").addEventListener("click", refreshUserState);
$("logout-btn").addEventListener("click", () => {
clearSession();
statusPill("warn", "已退出");
});
- $("copy-token-btn").addEventListener("click", (event) => copyField("access-token", "login-status", "Access Token", event.currentTarget));
+ $("auth-btn").addEventListener("click", handleAuth);
+ $("auth-email").addEventListener("keydown", (e) => { if (e.key === "Enter") $("auth-btn").click(); });
+ $("auth-password").addEventListener("keydown", (e) => { if (e.key === "Enter") $("auth-btn").click(); });
+ $("copy-token-btn").addEventListener("click", (event) => copyField("access-token", "auth-status", "Access Token", event.currentTarget));
$("copy-key-btn").addEventListener("click", (event) => copyField("api-key", "key-status", "API Key", event.currentTarget));
$("keys-list").addEventListener("click", async (event) => {
const button = event.target.closest(".copy-existing-key-btn");