Files
web_huangguo2_h5/app/static/js/pages/register.js
T
谢宇宁andClaude Opus 5.5 0fbdba5ccf Initial commit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 11:47:47 +07:00

170 lines
5.5 KiB
JavaScript

(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");
});
});
}
})();