/** * 班级操行分管理系统 - 公共JS * * 开发者: Canglan * 联系方式: admin@sea-studio.top * 版权归属: Sea Network Technology Studio * 许可证: MIT License * * 版权所有 © Sea Network Technology Studio */ function getToken() { return localStorage.getItem(window.JWT_STORAGE_KEY || 'class_system_token'); } function getUserInfo() { const userStr = localStorage.getItem(window.USER_STORAGE_KEY || 'class_system_user'); if (!userStr) return null; try { return JSON.parse(userStr); } catch { return null; } } function setUserInfo(user) { localStorage.setItem(window.USER_STORAGE_KEY || 'class_system_user', JSON.stringify(user)); } function clearAuth() { localStorage.removeItem(window.JWT_STORAGE_KEY || 'class_system_token'); localStorage.removeItem(window.USER_STORAGE_KEY || 'class_system_user'); } async function apiRequest(url, options = {}) { const token = getToken(); const headers = { 'Content-Type': 'application/json', ...options.headers }; if (token) { headers['Authorization'] = `Bearer ${token}`; } const baseUrl = window.API_BASE_URL; const fullUrl = `${baseUrl}${url}`; try { const response = await fetch(fullUrl, { ...options, headers }); const data = await response.json(); if (response.status === 401) { clearAuth(); window.location.href = '/index.php'; return null; } return data; } catch (error) { console.error('API请求错误:', error); showToast('网络错误,请稍后重试', 'error'); return null; } } function apiGet(url, params = {}) { const queryString = new URLSearchParams(params).toString(); const fullUrl = queryString ? `${url}?${queryString}` : url; return apiRequest(fullUrl, { method: 'GET' }); } function apiPost(url, data = {}) { return apiRequest(url, { method: 'POST', body: JSON.stringify(data) }); } function apiPut(url, data = {}) { return apiRequest(url, { method: 'PUT', body: JSON.stringify(data) }); } function apiDelete(url) { return apiRequest(url, { method: 'DELETE' }); } function showToast(message, type = 'success') { const toast = document.createElement('div'); toast.className = `toast toast-${type}`; toast.textContent = message; document.body.appendChild(toast); setTimeout(() => toast.remove(), 3000); } function formatDate(dateStr) { if (!dateStr) return '-'; const date = new Date(dateStr); return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`; } function formatDateTime(dateStr) { if (!dateStr) return '-'; const date = new Date(dateStr); return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}`; } function getStatusBadge(status, type = 'homework') { const statusMap = { homework: { 'submitted': '已提交', 'not_submitted': '未提交', 'late': '迟交' }, attendance: { 'present': '出勤', 'absent': '缺勤', 'late': '迟到', 'leave': '请假' } }; const texts = statusMap[type] || statusMap.homework; const text = texts[status] || status; let className = 'status-badge '; switch (status) { case 'submitted': case 'present': className += 'status-submitted'; break; case 'not_submitted': case 'absent': className += 'status-not_submitted'; break; case 'late': className += 'status-late'; break; case 'leave': className += 'status-leave'; break; default: className += 'status-not_submitted'; } return `${text}`; } async function logout() { await apiPost('/api/auth/logout'); clearAuth(); window.location.href = '/index.php'; } function escapeHtml(str) { if (!str) return ''; return str.replace(/[&<>]/g, function(m) { if (m === '&') return '&'; if (m === '<') return '<'; if (m === '>') return '>'; return m; }); } document.addEventListener('DOMContentLoaded', () => { const user = getUserInfo(); const userNameSpan = document.getElementById('userName'); if (userNameSpan && user) { userNameSpan.textContent = user.real_name || user.username; } const logoutBtn = document.getElementById('logoutBtn'); if (logoutBtn) { logoutBtn.addEventListener('click', logout); } });