diff --git a/deploy/tksea-portal/index.html b/deploy/tksea-portal/index.html index 7d52d489..f5b8a8b0 100644 --- a/deploy/tksea-portal/index.html +++ b/deploy/tksea-portal/index.html @@ -161,35 +161,23 @@
-

注册与登录

-

刷新页面或稍后回来,都可以直接登录恢复会话。首次注册成功后会自动登录,并回填邮箱。

+

登录

+

刷新页面或稍后回来都可以直接恢复会话。系统自动判断新老用户,新邮箱自动创建账号并登录,已有账号则直接登录。

-
+
-

注册

-

当前无需邮箱验证码、邀请码或 Turnstile。

- - - - +

登录或注册

+

输入邮箱和密码。如果是新邮箱会自动创建账号并登录,已有账号则直接登录。无需验证码、邀请码或 Turnstile。

+ + + +
- + + 新邮箱将自动创建
-
未执行
-
- -
-

登录

-

如果你已经有账号,可以直接登录并同步当前用户状态。

- - - - -
- -
-
未执行
+
未执行
@@ -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");