170 lines
5.5 KiB
JavaScript
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");
|
|
});
|
|
});
|
|
}
|
|
})();
|