/** * 用户中心管理模块 */ // 获取用户信息 async function getUserInfo() { try { // 先检查是否已登录 const sessionResponse = await fetch('/api/check-session'); const sessionData = await sessionResponse.json(); if (!sessionData.authenticated) { // 用户未登录,不显示错误,静默返回 // console.log('用户未登录或会话无效,跳过获取用户信息'); return; } // 用户已登录,获取用户信息 // console.log('会话有效,尝试获取用户信息...'); const response = await fetch('/api/user-info'); if (!response.ok) { // 检查是否是认证问题 if (response.status === 401) { // console.log('会话已过期,需要重新登录'); return; } throw new Error('获取用户信息失败'); } const data = await response.json(); // console.log('获取到用户信息:', data); // 更新顶部导航栏的用户名 const currentUsername = document.getElementById('currentUsername'); if (currentUsername) { currentUsername.textContent = data.username || '未知用户'; } // 更新统计卡片数据 const loginCountElement = document.getElementById('loginCount'); if (loginCountElement) { loginCountElement.textContent = data.loginCount || '0'; } const accountAgeElement = document.getElementById('accountAge'); if (accountAgeElement) { accountAgeElement.textContent = data.accountAge ? `${data.accountAge}天` : '0天'; } const lastLoginElement = document.getElementById('lastLogin'); if (lastLoginElement) { let lastLogin = data.lastLogin || '未知'; // 检查是否包含 "今天" 字样,添加样式 if (lastLogin.includes('今天')) { lastLoginElement.innerHTML = `${lastLogin}`; } else { lastLoginElement.textContent = lastLogin; } } } catch (error) { // console.error('获取用户信息失败:', error); // 不显示错误通知,只在控制台记录错误 } } // 修改密码 async function changePassword(event) { if (event) { event.preventDefault(); } const form = document.getElementById('changePasswordForm'); const currentPassword = form.querySelector('#ucCurrentPassword').value; const newPassword = form.querySelector('#ucNewPassword').value; const confirmPassword = form.querySelector('#ucConfirmPassword').value; // 验证表单 if (!currentPassword || !newPassword || !confirmPassword) { return core.showAlert('所有字段都不能为空', 'error'); } if (newPassword !== confirmPassword) { return core.showAlert('两次输入的新密码不一致', 'error'); } // 密码复杂度检查 if (!isPasswordComplex(newPassword)) { return core.showAlert('密码必须包含至少1个字母、1个数字和1个特殊字符,长度在8-16位之间', 'error'); } // 显示加载状态 const submitButton = form.querySelector('button[type="submit"]'); const originalButtonText = submitButton.innerHTML; submitButton.disabled = true; submitButton.innerHTML = ' 提交中...'; try { const response = await fetch('/api/change-password', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ currentPassword, newPassword }) }); // 无论成功与否,去除加载状态 submitButton.disabled = false; submitButton.innerHTML = originalButtonText; if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || '修改密码失败'); } // 清空表单 form.reset(); // 设置倒计时并显示 let countDown = 5; Swal.fire({ title: '密码修改成功', html: `您的密码已成功修改,系统将在 ${countDown} 秒后自动退出,请使用新密码重新登录。`, icon: 'success', timer: countDown * 1000, timerProgressBar: true, didOpen: () => { const content = Swal.getHtmlContainer(); const timerInterval = setInterval(() => { countDown--; if (content) { const b = content.querySelector('b'); if (b) { b.textContent = countDown > 0 ? countDown : 0; } } if (countDown <= 0) clearInterval(timerInterval); }, 1000); }, allowOutsideClick: false, // 禁止外部点击关闭 showConfirmButton: true, // 重新显示确认按钮 confirmButtonText: '确定' // 设置按钮文本 }).then((result) => { // 当计时器结束或弹窗被关闭时 (包括点击确定按钮) if (result.dismiss === Swal.DismissReason.timer || result.isConfirmed) { // console.log('计时器结束或手动确认,执行登出'); auth.logout(); } }); } catch (error) { // console.error('修改密码失败:', error); core.showAlert('修改密码失败: ' + error.message, 'error'); } } // 验证密码复杂度 function isPasswordComplex(password) { // 至少包含1个字母、1个数字和1个特殊字符,长度在8-16位之间 const passwordRegex = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[.,\-_+=()[\]{}|\\;:'"<>?/@$!%*#?&])[A-Za-z\d.,\-_+=()[\]{}|\\;:'"<>?/@$!%*#?&]{8,16}$/; return passwordRegex.test(password); } // 检查密码强度 function checkUcPasswordStrength() { const password = document.getElementById('ucNewPassword').value; const strengthSpan = document.getElementById('ucPasswordStrength'); const strengthBar = document.getElementById('strengthBar'); if (!password) { strengthSpan.textContent = ''; if (strengthBar) strengthBar.style.width = '0%'; return; } let strength = 0; let strengthText = ''; let strengthColor = ''; let strengthWidth = '0%'; // 长度检查 if (password.length >= 8) strength++; if (password.length >= 12) strength++; // 包含字母 if (/[A-Za-z]/.test(password)) strength++; // 包含数字 if (/\d/.test(password)) strength++; // 包含特殊字符 if (/[.,\-_+=()[\]{}|\\;:'"<>?/@$!%*#?&]/.test(password)) strength++; // 根据强度设置文本和颜色 switch(strength) { case 0: case 1: strengthText = '密码强度:非常弱'; strengthColor = '#FF4136'; strengthWidth = '20%'; break; case 2: strengthText = '密码强度:弱'; strengthColor = '#FF851B'; strengthWidth = '40%'; break; case 3: strengthText = '密码强度:中'; strengthColor = '#FFDC00'; strengthWidth = '60%'; break; case 4: strengthText = '密码强度:强'; strengthColor = '#2ECC40'; strengthWidth = '80%'; break; case 5: strengthText = '密码强度:非常强'; strengthColor = '#3D9970'; strengthWidth = '100%'; break; } // 用span元素包裹文本,并设置为不换行 strengthSpan.innerHTML = `${strengthText}`; strengthSpan.style.color = strengthColor; if (strengthBar) { strengthBar.style.width = strengthWidth; strengthBar.style.backgroundColor = strengthColor; } } // 切换密码可见性 function togglePasswordVisibility(inputId) { const passwordInput = document.getElementById(inputId); const toggleBtn = passwordInput.nextElementSibling.querySelector('i'); if (passwordInput.type === 'password') { passwordInput.type = 'text'; toggleBtn.classList.remove('fa-eye'); toggleBtn.classList.add('fa-eye-slash'); } else { passwordInput.type = 'password'; toggleBtn.classList.remove('fa-eye-slash'); toggleBtn.classList.add('fa-eye'); } } // 刷新用户信息 function refreshUserInfo() { // 显示刷新动画 Swal.fire({ title: '刷新中...', html: ' 正在刷新用户信息', showConfirmButton: false, allowOutsideClick: false, timer: 1500 }); // 调用获取用户信息 getUserInfo().then(() => { // 更新页面上的用户名称 const usernameElement = document.getElementById('profileUsername'); const currentUsername = document.getElementById('currentUsername'); if (usernameElement && currentUsername) { usernameElement.textContent = currentUsername.textContent || '管理员'; } // 显示成功消息 Swal.fire({ title: '刷新成功', icon: 'success', timer: 1500, showConfirmButton: false }); }).catch(error => { Swal.fire({ title: '刷新失败', text: error.message || '无法获取最新用户信息', icon: 'error', timer: 2000, showConfirmButton: false }); }); } // 初始化用户中心 function initUserCenter() { // console.log('初始化用户中心'); // 获取用户信息 getUserInfo(); // 为用户中心按钮添加事件 const userCenterBtn = document.getElementById('userCenterBtn'); if (userCenterBtn) { userCenterBtn.addEventListener('click', () => { core.showSection('user-center'); }); } } // 加载用户统计信息 function loadUserStats() { getUserInfo(); } // 导出模块 const userCenter = { init: function() { // console.log('初始化用户中心模块...'); // 可以在这里调用初始化逻辑,也可以延迟到需要时调用 return Promise.resolve(); // 返回一个已解决的 Promise,保持与其他模块一致 }, getUserInfo, changePassword, checkUcPasswordStrength, initUserCenter, loadUserStats, isPasswordComplex, togglePasswordVisibility, refreshUserInfo }; // 页面加载完成后初始化 document.addEventListener('DOMContentLoaded', initUserCenter); // 全局公开用户中心模块 window.userCenter = userCenter;