document.addEventListener('DOMContentLoaded', function () { appUtils.redirectIfLoggedIn(); var form = document.getElementById('loginForm'); var message = document.getElementById('loginMessage'); var goRegister = document.getElementById('goRegister'); var refreshCaptchaBtn = document.getElementById('refreshCaptcha'); var captchaCanvas = document.getElementById('captchaCanvas'); var captchaCtx = captchaCanvas.getContext('2d'); var captchaCode = ''; var rememberCheckbox = document.getElementById('rememberAccount'); var loginIdInput = form.querySelector('[name="loginId"]'); // 记住账号:页面加载时填充 var remembered = localStorage.getItem('rememberedAccount'); if (remembered) { loginIdInput.value = remembered; rememberCheckbox.checked = true; } // 勾选时立即保存 rememberCheckbox.addEventListener('change', function () { if (rememberCheckbox.checked) { var currentValue = String(loginIdInput.value || '').trim(); if (currentValue) { localStorage.setItem('rememberedAccount', currentValue); } } else { localStorage.removeItem('rememberedAccount'); } }); // 输入时更新(如果已勾选记住账号) loginIdInput.addEventListener('input', function () { if (rememberCheckbox.checked) { var val = String(loginIdInput.value || '').trim(); if (val) { localStorage.setItem('rememberedAccount', val); } else { localStorage.removeItem('rememberedAccount'); } } }); function randomChar() { var chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; return chars.charAt(Math.floor(Math.random() * chars.length)); } function randomColor(min, max) { var r = Math.floor(Math.random() * (max - min) + min); var g = Math.floor(Math.random() * (max - min) + min); var b = Math.floor(Math.random() * (max - min) + min); return 'rgb(' + r + ',' + g + ',' + b + ')'; } function drawCaptcha() { captchaCode = ''; for (var i = 0; i < 4; i += 1) { captchaCode += randomChar(); } captchaCtx.clearRect(0, 0, captchaCanvas.width, captchaCanvas.height); captchaCtx.fillStyle = '#f8fbff'; captchaCtx.fillRect(0, 0, captchaCanvas.width, captchaCanvas.height); for (var i = 0; i < 6; i += 1) { captchaCtx.strokeStyle = randomColor(160, 220); captchaCtx.beginPath(); captchaCtx.moveTo(Math.random() * 140, Math.random() * 48); captchaCtx.lineTo(Math.random() * 140, Math.random() * 48); captchaCtx.stroke(); } captchaCtx.font = 'bold 28px Arial'; captchaCtx.textBaseline = 'middle'; for (var j = 0; j < captchaCode.length; j += 1) { var char = captchaCode.charAt(j); var x = 18 + j * 30; var y = 24 + (Math.random() * 6 - 3); var angle = (Math.random() * 30 - 15) * Math.PI / 180; captchaCtx.save(); captchaCtx.translate(x, y); captchaCtx.rotate(angle); captchaCtx.fillStyle = randomColor(40, 120); captchaCtx.fillText(char, 0, 0); captchaCtx.restore(); } for (var k = 0; k < 20; k += 1) { captchaCtx.fillStyle = randomColor(120, 220); captchaCtx.fillRect(Math.random() * 140, Math.random() * 48, 2, 2); } } function validateCaptcha(value) { return String(value || '').trim().toUpperCase() === captchaCode; } goRegister.addEventListener('click', function () { window.location.href = './register.html'; }); refreshCaptchaBtn.addEventListener('click', function () { drawCaptcha(); }); captchaCanvas.addEventListener('click', function () { drawCaptcha(); }); form.addEventListener('submit', function (event) { event.preventDefault(); var formData = new FormData(form); if (!validateCaptcha(formData.get('captcha'))) { appUtils.showMessage(message, '图像验证码错误,请重新输入', false); drawCaptcha(); return; } appUtils.ajax({ method: 'POST', url: '/api/auth/login', data: { loginId: String(formData.get('loginId') || '').trim(), password: String(formData.get('password') || '').trim() }, success: function (response) { if (!response.success) { appUtils.showMessage(message, response.message || '登录失败', false); drawCaptcha(); return; } // 记住账号:登录成功时再次确认保存 if (rememberCheckbox.checked) { localStorage.setItem('rememberedAccount', String(formData.get('loginId') || '').trim()); } appUtils.showMessage(message, '登录成功,正在进入系统...', true); setTimeout(function () { window.location.href = './app.html'; }, 400); }, error: function (xhr, response) { appUtils.showMessage(message, (response && response.message) || '网络异常,请检查后端服务', false); drawCaptcha(); } }); }); drawCaptcha(); });