- server/:node:http+node:sqlite 零依赖后端(users/sessions/user_stats/codex_unlocks/runs 五表) - 安全:scrypt密码哈希/服务端session/全prepared statement/输入白名单/限流/CSP等安全头/静态白名单防穿越 - 前端:o-auth登陆注册 + o-home飞行员大厅(排行榜Top100三排序+图鉴展柜背景:随机3主3副2僚机+刷怪巡游) - 图鉴改为收集点亮制(未收集=剪影+???),服务端codex_unlocks与本地并集同步 - 修复:回标题/大厅后背景卡在上场残影——render按battleUI门控+离场G=null;空闲=星空 - 结算上报:endRun/rush胜利两处submitRun,Boss击杀计数入排行榜 - playwright全流程验证通过(注册/登陆/游戏/结算/图鉴/安全注入/限流);游戏视觉未验收(用户亲自)
64 lines
2.1 KiB
JavaScript
64 lines
2.1 KiB
JavaScript
"use strict";
|
||
/* ================= 认证流程:登陆/注册/登出 + 启动引导 ================= */
|
||
(function () {
|
||
const err = (t) => { $("auth-err").textContent = t || " "; };
|
||
|
||
function tab(login) {
|
||
$("tab-login").classList.toggle("primary", login);
|
||
$("tab-reg").classList.toggle("primary", !login);
|
||
$("f-login").classList.toggle("hide", !login);
|
||
$("f-reg").classList.toggle("hide", login);
|
||
err();
|
||
}
|
||
|
||
$("tab-login").onclick = () => tab(true);
|
||
$("tab-reg").onclick = () => tab(false);
|
||
|
||
$("f-login").addEventListener("submit", async (e) => {
|
||
e.preventDefault();
|
||
err("登陆中...");
|
||
const msg = await NET.login($("li-id").value.trim(), $("li-pw").value);
|
||
if (msg) { err(msg); SFX.hurt(); return; }
|
||
err(); SFX.level(); enterHome();
|
||
});
|
||
|
||
$("f-reg").addEventListener("submit", async (e) => {
|
||
e.preventDefault();
|
||
const name = $("rg-name").value.trim(), email = $("rg-email").value.trim();
|
||
const pw = $("rg-pw").value, pw2 = $("rg-pw2").value;
|
||
if (pw !== pw2) { err("两次输入的密码不一致"); SFX.hurt(); return; }
|
||
err("注册中...");
|
||
const msg = await NET.register(name, email, pw);
|
||
if (msg) { err(msg); SFX.hurt(); return; }
|
||
err(); SFX.level(); enterHome();
|
||
});
|
||
|
||
$("b-logout").onclick = async () => {
|
||
SFX.pick();
|
||
await NET.logout();
|
||
G = null; UI = "auth";
|
||
$("li-pw").value = "";
|
||
show("o-auth");
|
||
};
|
||
|
||
/* 进入基地(游戏主菜单) */
|
||
$("b-base").onclick = () => {
|
||
SFX.pick();
|
||
$("pilot-line").textContent = NET.user ? ("飞行员 " + NET.user.username) : " ";
|
||
bestLine(); UI = "title"; show("o-title");
|
||
};
|
||
$("b-lobby").onclick = () => { SFX.pick(); enterHome(); };
|
||
|
||
/* 启动引导:恢复会话 → 大厅;否则登陆页(网络故障给出提示) */
|
||
(async function boot() {
|
||
UI = "auth";
|
||
show("o-auth");
|
||
const r = await NET.api("/api/me", "GET");
|
||
if (r.ok) { NET._apply(r.data); enterHome(); }
|
||
else {
|
||
if (r.status === 0) err("无法连接服务器,请稍后刷新重试");
|
||
show("o-auth");
|
||
}
|
||
})();
|
||
})();
|