From 35ee91530b0d475eb09774aacbc47bdc984d21f5 Mon Sep 17 00:00:00 2001 From: lkddi Date: Sat, 25 Apr 2026 13:46:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E9=82=AE=E7=AE=B1=E6=89=BE?= =?UTF-8?q?=E5=9B=9E=E5=AF=86=E7=A0=81=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/js/password-forgot.js | 103 ++++++++++++++++++++++ resources/views/password-forgot.blade.php | 65 +------------- vite.config.js | 1 + 3 files changed, 106 insertions(+), 63 deletions(-) create mode 100644 resources/js/password-forgot.js diff --git a/resources/js/password-forgot.js b/resources/js/password-forgot.js new file mode 100644 index 0000000..c5727c7 --- /dev/null +++ b/resources/js/password-forgot.js @@ -0,0 +1,103 @@ +// 邮箱找回密码页交互入口,负责 AJAX 发送重置链接和页面提示。 + +let passwordForgotControlsBound = false; + +/** + * 读取 CSRF 令牌,供找回密码请求使用。 + * + * @returns {string} + */ +function getCsrfToken() { + return document.querySelector('meta[name="csrf-token"]')?.getAttribute("content") ?? ""; +} + +/** + * 展示找回密码页面提示。 + * + * @param {string} message + * @param {string} type + * @returns {void} + */ +function showAlert(message, type) { + const alertBox = document.getElementById("alert-box"); + if (!alertBox) { + return; + } + + alertBox.textContent = message; + alertBox.className = type === "success" ? "alert alert-success" : "alert alert-error"; + alertBox.style.display = "block"; +} + +/** + * 提交邮箱找回密码请求。 + * + * @param {SubmitEvent} event + * @returns {Promise} + */ +async function submitPasswordRecovery(event) { + event.preventDefault(); + + const form = event.target; + const submitButton = document.getElementById("submit-btn"); + const alertBox = document.getElementById("alert-box"); + if (!(form instanceof HTMLFormElement)) { + return; + } + + if (submitButton instanceof HTMLButtonElement) { + submitButton.disabled = true; + submitButton.innerText = "发送中..."; + } + if (alertBox) { + alertBox.style.display = "none"; + } + + try { + const response = await fetch(form.getAttribute("data-password-email-url") ?? form.action, { + method: "POST", + credentials: "same-origin", + headers: { + "Content-Type": "application/json", + "X-CSRF-TOKEN": getCsrfToken(), + Accept: "application/json", + }, + body: JSON.stringify(Object.fromEntries(new FormData(form).entries())), + }); + const body = await response.json(); + + if (response.status === 200 && body.status === "success") { + showAlert(body.message, "success"); + form.reset(); + return; + } + + const errorMessage = body.message || (body.errors ? Object.values(body.errors)[0][0] : "邮件发送失败,请稍后重试。"); + showAlert(errorMessage, "error"); + } catch { + showAlert("网络或服务器异常,请稍后再试。", "error"); + } finally { + if (submitButton instanceof HTMLButtonElement) { + submitButton.disabled = false; + submitButton.innerText = "发送重置邮件"; + } + } +} + +/** + * 绑定邮箱找回密码页提交事件。 + * + * @returns {void} + */ +function bindPasswordForgotControls() { + if (passwordForgotControlsBound || typeof document === "undefined") { + return; + } + + passwordForgotControlsBound = true; + document.getElementById("password-recovery-form")?.addEventListener("submit", (event) => { + void submitPasswordRecovery(event); + }); +} + +bindPasswordForgotControls(); diff --git a/resources/views/password-forgot.blade.php b/resources/views/password-forgot.blade.php index 29131c1..ddac50b 100644 --- a/resources/views/password-forgot.blade.php +++ b/resources/views/password-forgot.blade.php @@ -13,6 +13,7 @@ + @vite('resources/js/password-forgot.js')