(function () { var form = document.querySelector("[data-register-page-form]"); var password = document.querySelector("[data-register-page-password]"); var confirm = document.querySelector("[data-register-page-password-confirm]"); var submitBtn = document.querySelector("[data-register-page-submit]") || (form && form.querySelector('button[type="submit"]')); var root = form || document; function bindToggle(key, input) { var btn = document.querySelector('[data-register-page-toggle="' + key + '"]'); var icon = document.querySelector('[data-register-page-toggle-icon="' + key + '"]'); if (!btn || !input || !icon) return; btn.addEventListener("click", function () { var show = input.getAttribute("type") === "password"; input.setAttribute("type", show ? "text" : "password"); icon.setAttribute("src", show ? "/static/images/eye-off.svg" : "/static/images/eye.svg"); btn.setAttribute("aria-label", show ? "隐藏密码" : "显示密码"); }); } bindToggle("password", password); bindToggle("confirm", confirm); function clearFieldError(name) { var field = root.querySelector('[data-field="' + name + '"]'); var err = root.querySelector('[data-field-error="' + name + '"]'); if (field) field.classList.remove("is-error"); if (err) { err.hidden = true; var text = err.querySelector("[data-field-error-text]"); if (text) text.textContent = ""; } } function clearAllErrors() { root.querySelectorAll("[data-field]").forEach(function (el) { el.classList.remove("is-error"); }); root.querySelectorAll("[data-field-error]").forEach(function (err) { err.hidden = true; var text = err.querySelector("[data-field-error-text]"); if (text) text.textContent = ""; }); } function setFieldError(name, message) { var field = root.querySelector('[data-field="' + name + '"]'); var err = root.querySelector('[data-field-error="' + name + '"]'); if (field) field.classList.add("is-error"); if (err) { err.hidden = false; var text = err.querySelector("[data-field-error-text]"); if (text) text.textContent = message || ""; } } function isAccountNo(value) { return /^[A-Za-z0-9]{6,20}$/.test(String(value || "")); } function isPassword(value) { var pwd = String(value || ""); if (pwd.length < 8) return false; return /[A-Za-z]/.test(pwd) && /[0-9]/.test(pwd); } function validateForm() { clearAllErrors(); var fd = new FormData(form); var account = String(fd.get("account") || "").trim(); var pwd = String(fd.get("password") || ""); var pwd2 = String(fd.get("passwordConfirm") || ""); var agree = form.querySelector('input[name="agree"]'); var valid = true; if (!account) { setFieldError("account", "请输入账号"); valid = false; } else if (!isAccountNo(account)) { setFieldError("account", "账号需为 6 到 20 位字母或数字"); valid = false; } if (!pwd) { setFieldError("password", "请输入密码"); valid = false; } else if (!isPassword(pwd)) { setFieldError("password", "密码需 8 位以上,且同时包含字母与数字"); valid = false; } if (!pwd2) { setFieldError("passwordConfirm", "请再次输入密码"); valid = false; } else if (pwd2 !== pwd) { setFieldError("passwordConfirm", "两次输入的密码不一致"); valid = false; } if (agree && !agree.checked) { setFieldError("agree", "请先同意用户条款与隐私政策"); valid = false; } if (!valid) return null; return { accountNo: account, password: pwd }; } function mapServerError(err) { var tip = (err && err.message) || "注册失败,请稍后重试"; var code = err && err.code; if (code === 5005 || /已存在|重复|占用/.test(tip)) { setFieldError("account", tip); return; } if (/密码|password/i.test(tip)) { setFieldError("password", tip); return; } setFieldError("account", tip); } function setSubmitting(loading) { if (!submitBtn) return; submitBtn.disabled = !!loading; submitBtn.classList.toggle("is-loading", !!loading); submitBtn.textContent = loading ? "注册中…" : "注册"; } if (form) { form.querySelectorAll("input").forEach(function (input) { input.addEventListener("input", function () { var name = input.getAttribute("name"); if (name === "agree") clearFieldError("agree"); else if (name) clearFieldError(name); }); if (input.type === "checkbox") { input.addEventListener("change", function () { clearFieldError("agree"); }); } }); form.addEventListener("submit", function (event) { event.preventDefault(); if (!window.AuthAPI || !window.HttpRequest) { setFieldError("account", "认证脚本未加载,请刷新页面"); return; } if (submitBtn && submitBtn.classList.contains("is-loading")) return; var payload = validateForm(); if (!payload) return; setSubmitting(true); AuthAPI.register(payload) .then(function (res) { AuthAPI.toast((res && res.tip) || "注册成功", "success"); window.setTimeout(function () { window.location.href = "/"; }, 400); }) .catch(function (err) { setSubmitting(false); mapServerError(err); AuthAPI.toast((err && err.message) || "注册失败", "error"); }); }); } })();