340 lines
14 KiB
JavaScript
340 lines
14 KiB
JavaScript
// 主JS文件 - 包含登录和注册功能
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
// 主题切换
|
|
const themeToggle = document.getElementById('theme-toggle');
|
|
if (themeToggle) {
|
|
const body = document.body;
|
|
|
|
themeToggle.addEventListener('click', function() {
|
|
body.classList.toggle('dark-mode');
|
|
const isDarkMode = body.classList.contains('dark-mode');
|
|
localStorage.setItem('dark-mode', isDarkMode);
|
|
themeToggle.innerHTML = isDarkMode ? '🌙' : '☀️';
|
|
});
|
|
|
|
// 从本地存储中加载主题首选项
|
|
const savedDarkMode = localStorage.getItem('dark-mode') === 'true';
|
|
if (savedDarkMode) {
|
|
body.classList.add('dark-mode');
|
|
themeToggle.innerHTML = '🌙';
|
|
}
|
|
}
|
|
|
|
// 密码可见性切换
|
|
const passwordToggle = document.getElementById('password-toggle');
|
|
if (passwordToggle) {
|
|
const passwordInput = document.getElementById('password');
|
|
passwordToggle.addEventListener('click', function() {
|
|
const type = passwordInput.getAttribute('type') === 'password' ? 'text' : 'password';
|
|
passwordInput.setAttribute('type', type);
|
|
passwordToggle.innerHTML = type === 'password' ? '👁️' : '👁️🗨️';
|
|
});
|
|
}
|
|
|
|
// 登录表单验证
|
|
const loginForm = document.getElementById('login-form');
|
|
if (loginForm) {
|
|
const usernameInput = document.getElementById('username');
|
|
const passwordInput = document.getElementById('password');
|
|
const usernameError = document.getElementById('username-error');
|
|
const passwordError = document.getElementById('password-error');
|
|
const loginButton = document.getElementById('login-button');
|
|
|
|
if (usernameInput && usernameError) {
|
|
usernameInput.addEventListener('input', function() {
|
|
if (usernameInput.value.trim() === '') {
|
|
usernameError.textContent = '用户名不能为空';
|
|
usernameError.classList.add('show');
|
|
} else {
|
|
usernameError.classList.remove('show');
|
|
}
|
|
});
|
|
}
|
|
|
|
if (passwordInput && passwordError) {
|
|
passwordInput.addEventListener('input', function() {
|
|
if (passwordInput.value.trim() === '') {
|
|
passwordError.textContent = '密码不能为空';
|
|
passwordError.classList.add('show');
|
|
} else if (passwordInput.value.length < 6) {
|
|
passwordError.textContent = '密码长度至少6位';
|
|
passwordError.classList.add('show');
|
|
} else {
|
|
passwordError.classList.remove('show');
|
|
}
|
|
});
|
|
}
|
|
|
|
loginForm.addEventListener('submit', function(e) {
|
|
let isValid = true;
|
|
|
|
// 验证用户名
|
|
if (usernameInput.value.trim() === '') {
|
|
usernameError.textContent = '用户名不能为空';
|
|
usernameError.classList.add('show');
|
|
isValid = false;
|
|
}
|
|
|
|
// 验证密码
|
|
if (passwordInput.value.trim() === '') {
|
|
passwordError.textContent = '密码不能为空';
|
|
passwordError.classList.add('show');
|
|
isValid = false;
|
|
} else if (passwordInput.value.length < 6) {
|
|
passwordError.textContent = '密码长度至少6位';
|
|
passwordError.classList.add('show');
|
|
isValid = false;
|
|
}
|
|
|
|
if (!isValid) {
|
|
e.preventDefault();
|
|
} else if (loginButton) {
|
|
loginButton.classList.add('loading-state');
|
|
}
|
|
});
|
|
}
|
|
// 注册表单验证
|
|
const registerForm = document.getElementById('register-form');
|
|
if (registerForm) {
|
|
const usernameInput = document.getElementById('username');
|
|
const emailInput = document.getElementById('email');
|
|
const passwordInput = document.getElementById('password');
|
|
const confirmPasswordInput = document.getElementById('confirm_password');
|
|
const verificationCodeInput = document.getElementById('verification_code');
|
|
|
|
const usernameError = document.getElementById('username-error');
|
|
const emailError = document.getElementById('email-error');
|
|
const passwordError = document.getElementById('password-error');
|
|
const confirmPasswordError = document.getElementById('confirm-password-error');
|
|
const verificationCodeError = document.getElementById('verification-code-error');
|
|
|
|
const registerButton = document.getElementById('register-button');
|
|
const sendCodeBtn = document.getElementById('send-code-btn');
|
|
|
|
// 用户名验证
|
|
if (usernameInput && usernameError) {
|
|
usernameInput.addEventListener('input', function() {
|
|
if (usernameInput.value.trim() === '') {
|
|
usernameError.textContent = '用户名不能为空';
|
|
usernameError.classList.add('show');
|
|
} else if (usernameInput.value.length < 3) {
|
|
usernameError.textContent = '用户名至少3个字符';
|
|
usernameError.classList.add('show');
|
|
} else {
|
|
usernameError.classList.remove('show');
|
|
}
|
|
});
|
|
}
|
|
|
|
// 邮箱验证
|
|
if (emailInput && emailError) {
|
|
emailInput.addEventListener('input', function() {
|
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
if (emailInput.value.trim() === '') {
|
|
emailError.textContent = '邮箱不能为空';
|
|
emailError.classList.add('show');
|
|
} else if (!emailRegex.test(emailInput.value)) {
|
|
emailError.textContent = '请输入有效的邮箱地址';
|
|
emailError.classList.add('show');
|
|
} else {
|
|
emailError.classList.remove('show');
|
|
}
|
|
});
|
|
}
|
|
|
|
// 密码验证
|
|
if (passwordInput && passwordError) {
|
|
passwordInput.addEventListener('input', function() {
|
|
if (passwordInput.value.trim() === '') {
|
|
passwordError.textContent = '密码不能为空';
|
|
passwordError.classList.add('show');
|
|
} else if (passwordInput.value.length < 6) {
|
|
passwordError.textContent = '密码长度至少6位';
|
|
passwordError.classList.add('show');
|
|
} else {
|
|
passwordError.classList.remove('show');
|
|
}
|
|
|
|
// 检查确认密码是否匹配
|
|
if (confirmPasswordInput && confirmPasswordInput.value) {
|
|
if (confirmPasswordInput.value !== passwordInput.value) {
|
|
confirmPasswordError.textContent = '两次输入的密码不匹配';
|
|
confirmPasswordError.classList.add('show');
|
|
} else {
|
|
confirmPasswordError.classList.remove('show');
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
// 确认密码验证
|
|
if (confirmPasswordInput && confirmPasswordError) {
|
|
confirmPasswordInput.addEventListener('input', function() {
|
|
if (confirmPasswordInput.value.trim() === '') {
|
|
confirmPasswordError.textContent = '请确认密码';
|
|
confirmPasswordError.classList.add('show');
|
|
} else if (confirmPasswordInput.value !== passwordInput.value) {
|
|
confirmPasswordError.textContent = '两次输入的密码不匹配';
|
|
confirmPasswordError.classList.add('show');
|
|
} else {
|
|
confirmPasswordError.classList.remove('show');
|
|
}
|
|
});
|
|
}
|
|
|
|
// 发送验证码按钮
|
|
if (sendCodeBtn) {
|
|
sendCodeBtn.addEventListener('click', function() {
|
|
const email = emailInput.value.trim();
|
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
|
|
if (!email) {
|
|
emailError.textContent = '请输入邮箱地址';
|
|
emailError.classList.add('show');
|
|
return;
|
|
} else if (!emailRegex.test(email)) {
|
|
emailError.textContent = '请输入有效的邮箱地址';
|
|
emailError.classList.add('show');
|
|
return;
|
|
}
|
|
|
|
// 禁用按钮并显示倒计时
|
|
let countdown = 60;
|
|
sendCodeBtn.disabled = true;
|
|
const originalText = sendCodeBtn.textContent;
|
|
sendCodeBtn.textContent = `${countdown}秒后重试`;
|
|
|
|
const timer = setInterval(() => {
|
|
countdown--;
|
|
sendCodeBtn.textContent = `${countdown}秒后重试`;
|
|
|
|
if (countdown <= 0) {
|
|
clearInterval(timer);
|
|
sendCodeBtn.disabled = false;
|
|
sendCodeBtn.textContent = originalText;
|
|
}
|
|
}, 1000);
|
|
|
|
// 发送请求获取验证码
|
|
fetch('/user/send_verification_code', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({ email: email }),
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
console.log("验证码发送响应:", data); // 添加调试日志
|
|
if (data.success) {
|
|
showMessage('验证码已发送', '请检查您的邮箱', 'success');
|
|
} else {
|
|
showMessage('发送失败', data.message || '请稍后重试', 'error');
|
|
clearInterval(timer);
|
|
sendCodeBtn.disabled = false;
|
|
sendCodeBtn.textContent = originalText;
|
|
}
|
|
})
|
|
.catch(error => {
|
|
console.error('Error:', error);
|
|
showMessage('发送失败', '网络错误,请稍后重试', 'error');
|
|
clearInterval(timer);
|
|
sendCodeBtn.disabled = false;
|
|
sendCodeBtn.textContent = originalText;
|
|
});
|
|
});
|
|
}
|
|
|
|
// 表单提交验证
|
|
registerForm.addEventListener('submit', function(e) {
|
|
let isValid = true;
|
|
|
|
// 验证用户名
|
|
if (usernameInput.value.trim() === '') {
|
|
usernameError.textContent = '用户名不能为空';
|
|
usernameError.classList.add('show');
|
|
isValid = false;
|
|
} else if (usernameInput.value.length < 3) {
|
|
usernameError.textContent = '用户名至少3个字符';
|
|
usernameError.classList.add('show');
|
|
isValid = false;
|
|
}
|
|
|
|
// 验证邮箱
|
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
if (emailInput.value.trim() === '') {
|
|
emailError.textContent = '邮箱不能为空';
|
|
emailError.classList.add('show');
|
|
isValid = false;
|
|
} else if (!emailRegex.test(emailInput.value)) {
|
|
emailError.textContent = '请输入有效的邮箱地址';
|
|
emailError.classList.add('show');
|
|
isValid = false;
|
|
}
|
|
|
|
// 验证密码
|
|
if (passwordInput.value.trim() === '') {
|
|
passwordError.textContent = '密码不能为空';
|
|
passwordError.classList.add('show');
|
|
isValid = false;
|
|
} else if (passwordInput.value.length < 6) {
|
|
passwordError.textContent = '密码长度至少6位';
|
|
passwordError.classList.add('show');
|
|
isValid = false;
|
|
}
|
|
|
|
// 验证确认密码
|
|
if (confirmPasswordInput.value.trim() === '') {
|
|
confirmPasswordError.textContent = '请确认密码';
|
|
confirmPasswordError.classList.add('show');
|
|
isValid = false;
|
|
} else if (confirmPasswordInput.value !== passwordInput.value) {
|
|
confirmPasswordError.textContent = '两次输入的密码不匹配';
|
|
confirmPasswordError.classList.add('show');
|
|
isValid = false;
|
|
}
|
|
|
|
// 验证验证码
|
|
if (verificationCodeInput.value.trim() === '') {
|
|
verificationCodeError.textContent = '请输入验证码';
|
|
verificationCodeError.classList.add('show');
|
|
isValid = false;
|
|
}
|
|
|
|
if (!isValid) {
|
|
e.preventDefault();
|
|
} else if (registerButton) {
|
|
registerButton.classList.add('loading-state');
|
|
}
|
|
});
|
|
}
|
|
|
|
// 通知消息显示函数
|
|
function showMessage(title, message, type) {
|
|
const notification = document.createElement('div');
|
|
notification.className = `notification ${type}`;
|
|
|
|
const icon = type === 'success' ? '✓' : '✗';
|
|
|
|
notification.innerHTML = `
|
|
<div class="notification-icon">${icon}</div>
|
|
<div class="notification-content">
|
|
<h3>${title}</h3>
|
|
<p>${message}</p>
|
|
</div>
|
|
`;
|
|
|
|
document.body.appendChild(notification);
|
|
|
|
setTimeout(() => {
|
|
notification.classList.add('show');
|
|
}, 10);
|
|
|
|
setTimeout(() => {
|
|
notification.classList.remove('show');
|
|
setTimeout(() => {
|
|
document.body.removeChild(notification);
|
|
}, 300);
|
|
}, 3000);
|
|
}
|
|
}); |