javaweb课程运动会报名项目前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

155 lines
5.5 KiB

6 days ago
document.addEventListener('DOMContentLoaded', function () {
1 month ago
appUtils.redirectIfLoggedIn();
var form = document.getElementById('loginForm');
var message = document.getElementById('loginMessage');
var goRegister = document.getElementById('goRegister');
6 days ago
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;
}
1 month ago
goRegister.addEventListener('click', function () {
window.location.href = './register.html';
});
6 days ago
refreshCaptchaBtn.addEventListener('click', function () {
drawCaptcha();
});
captchaCanvas.addEventListener('click', function () {
drawCaptcha();
});
1 month ago
form.addEventListener('submit', function (event) {
event.preventDefault();
var formData = new FormData(form);
6 days ago
if (!validateCaptcha(formData.get('captcha'))) {
appUtils.showMessage(message, '图像验证码错误,请重新输入', false);
drawCaptcha();
return;
}
1 month ago
appUtils.ajax({
method: 'POST',
url: '/api/auth/login',
data: {
6 days ago
loginId: String(formData.get('loginId') || '').trim(),
1 month ago
password: String(formData.get('password') || '').trim()
},
success: function (response) {
if (!response.success) {
appUtils.showMessage(message, response.message || '登录失败', false);
6 days ago
drawCaptcha();
1 month ago
return;
}
6 days ago
// 记住账号:登录成功时再次确认保存
if (rememberCheckbox.checked) {
localStorage.setItem('rememberedAccount', String(formData.get('loginId') || '').trim());
}
1 month ago
appUtils.showMessage(message, '登录成功,正在进入系统...', true);
setTimeout(function () {
window.location.href = './app.html';
}, 400);
},
error: function (xhr, response) {
6 days ago
appUtils.showMessage(message, (response && response.message) || '网络异常,请检查后端服务', false);
drawCaptcha();
1 month ago
}
});
});
6 days ago
drawCaptcha();
1 month ago
});