// System Dashboard JavaScript import { apiRequest } from './api-helper.js'; import { getCurrentUser } from './auth.js'; // 전역 변수 let systemData = { users: [], logs: [], systemStatus: {} }; // Initialize on page load document.addEventListener('DOMContentLoaded', function() { initializeSystemDashboard(); setupEventListeners(); }); // Setup event listeners function setupEventListeners() { // Add event listeners to all data-action buttons const actionButtons = document.querySelectorAll('[data-action]'); actionButtons.forEach(button => { const action = button.getAttribute('data-action'); switch(action) { case 'account-management': button.addEventListener('click', openAccountManagement); break; case 'system-logs': button.addEventListener('click', openSystemLogs); break; case 'database-management': button.addEventListener('click', openDatabaseManagement); break; case 'system-settings': button.addEventListener('click', openSystemSettings); break; case 'backup-management': button.addEventListener('click', openBackupManagement); break; case 'monitoring': button.addEventListener('click', openMonitoring); break; case 'close-modal': button.addEventListener('click', () => closeModal('account-modal')); break; } }); } // Initialize system dashboard async function initializeSystemDashboard() { try { // Load user info await loadUserInfo(); // Load system status await loadSystemStatus(); // Load user statistics await loadUserStats(); // Load recent activities await loadRecentActivities(); // Setup auto-refresh (every 30 seconds) setInterval(refreshSystemStatus, 30000); } catch (error) { console.error(' System dashboard initialization error:', error); showNotification('Error loading system dashboard', 'error'); } } // 사용자 정보 로드 async function loadUserInfo() { try { const user = getCurrentUser(); if (user && user.name) { document.getElementById('user-name').textContent = user.name; } } catch (error) { console.error('사용자 정보 로드 오류:', error); } } // 시스템 상태 로드 async function loadSystemStatus() { try { // 서버 상태 확인 const serverStatus = await checkServerStatus(); updateServerStatus(serverStatus); // 데이터베이스 상태 확인 const dbStatus = await checkDatabaseStatus(); updateDatabaseStatus(dbStatus); // 시스템 알림 확인 const alerts = await getSystemAlerts(); updateSystemAlerts(alerts); } catch (error) { console.error('시스템 상태 로드 오류:', error); } } // 서버 상태 확인 async function checkServerStatus() { try { const response = await apiRequest('/api/system/status', 'GET'); return response.success ? 'online' : 'offline'; } catch (error) { return 'offline'; } } // 데이터베이스 상태 확인 async function checkDatabaseStatus() { try { const response = await apiRequest('/api/system/db-status', 'GET'); return response; } catch (error) { return { status: 'error', connections: 0 }; } } // 시스템 알림 가져오기 async function getSystemAlerts() { try { const response = await apiRequest('/api/system/alerts', 'GET'); return response.alerts || []; } catch (error) { return []; } } // 서버 상태 업데이트 function updateServerStatus(status) { const serverCheckTime = document.getElementById('server-check-time'); const statusElements = document.querySelectorAll('.status-value'); if (serverCheckTime) { serverCheckTime.textContent = new Date().toLocaleTimeString('ko-KR'); } // 서버 상태 표시 업데이트 로직 추가 } // 데이터베이스 상태 업데이트 function updateDatabaseStatus(dbStatus) { const dbConnections = document.getElementById('db-connections'); if (dbConnections && dbStatus.connections !== undefined) { dbConnections.textContent = dbStatus.connections; } } // 시스템 알림 업데이트 function updateSystemAlerts(alerts) { const systemAlerts = document.getElementById('system-alerts'); if (systemAlerts) { systemAlerts.textContent = alerts.length; systemAlerts.className = `status-value ${alerts.length > 0 ? 'warning' : 'online'}`; } } // 사용자 통계 로드 async function loadUserStats() { try { const response = await apiRequest('/api/system/users/stats', 'GET'); if (response.success) { const activeUsers = document.getElementById('active-users'); const totalUsers = document.getElementById('total-users'); if (activeUsers) activeUsers.textContent = response.data.active || 0; if (totalUsers) totalUsers.textContent = response.data.total || 0; } } catch (error) { console.error('사용자 통계 로드 오류:', error); } } // 최근 활동 로드 async function loadRecentActivities() { try { const response = await apiRequest('/api/system/recent-activities', 'GET'); if (response.success && response.data) { displayRecentActivities(response.data); } } catch (error) { console.error('최근 활동 로드 오류:', error); displayDefaultActivities(); } } // 최근 활동 표시 function displayRecentActivities(activities) { const container = document.getElementById('recent-activities'); if (!container) return; if (!activities || activities.length === 0) { container.innerHTML = '

최근 활동이 없습니다.

'; return; } const html = activities.map(activity => `

${activity.title}

${activity.description}

${formatTimeAgo(activity.created_at)}
`).join(''); container.innerHTML = html; } // 기본 활동 표시 (데이터 로드 실패 시) function displayDefaultActivities() { const container = document.getElementById('recent-activities'); if (!container) return; const defaultActivities = [ { type: 'system', title: '시스템 시작', description: '시스템이 정상적으로 시작되었습니다.', created_at: new Date().toISOString() } ]; displayRecentActivities(defaultActivities); } // 활동 타입에 따른 아이콘 반환 function getActivityIcon(type) { const icons = { 'login': 'fa-sign-in-alt', 'user_create': 'fa-user-plus', 'user_update': 'fa-user-edit', 'user_delete': 'fa-user-minus', 'system': 'fa-cog', 'database': 'fa-database', 'backup': 'fa-download', 'error': 'fa-exclamation-triangle' }; return icons[type] || 'fa-info-circle'; } // 시간 포맷팅 (몇 분 전, 몇 시간 전 등) function formatTimeAgo(dateString) { const now = new Date(); const date = new Date(dateString); const diffInSeconds = Math.floor((now - date) / 1000); if (diffInSeconds < 60) { return '방금 전'; } else if (diffInSeconds < 3600) { return `${Math.floor(diffInSeconds / 60)}분 전`; } else if (diffInSeconds < 86400) { return `${Math.floor(diffInSeconds / 3600)}시간 전`; } else { return `${Math.floor(diffInSeconds / 86400)}일 전`; } } // 시스템 상태 새로고침 async function refreshSystemStatus() { try { await loadSystemStatus(); await loadUserStats(); } catch (error) { console.error('시스템 상태 새로고침 오류:', error); } } // Open account management function openAccountManagement() { const modal = document.getElementById('account-modal'); const content = document.getElementById('account-management-content'); console.log('Modal element:', modal); console.log('Content element:', content); if (modal && content) { // Load account management content loadAccountManagementContent(content); modal.style.display = 'block'; } else { console.error(' Modal or content element not found'); } } // 계정 관리 컨텐츠 로드 async function loadAccountManagementContent(container) { try { container.innerHTML = `
로딩 중...
`; // 사용자 목록 로드 const response = await apiRequest('/api/system/users', 'GET'); if (response.success) { displayAccountManagement(container, response.data); } else { throw new Error(response.error || '사용자 목록을 불러올 수 없습니다.'); } } catch (error) { console.error('계정 관리 컨텐츠 로드 오류:', error); container.innerHTML = `

계정 정보를 불러오는 중 오류가 발생했습니다.

`; } } // 계정 관리 화면 표시 function displayAccountManagement(container, users) { const html = `

사용자 계정 관리

${generateUsersTableRows(users)}
ID 사용자명 이름 권한 상태 마지막 로그인 작업
`; container.innerHTML = html; systemData.users = users; } // 사용자 테이블 행 생성 function generateUsersTableRows(users) { if (!users || users.length === 0) { return '등록된 사용자가 없습니다.'; } return users.map(user => ` ${user.user_id} ${user.username} ${user.name || '-'} ${getRoleDisplayName(user.role)} ${user.is_active ? '활성' : '비활성'} ${user.last_login_at ? formatDate(user.last_login_at) : '없음'} `).join(''); } // 권한 표시명 반환 function getRoleDisplayName(role) { const roleNames = { 'system': '시스템', 'admin': '관리자', 'leader': '그룹장', 'user': '사용자' }; return roleNames[role] || role; } // 날짜 포맷팅 function formatDate(dateString) { if (!dateString) return '-'; const date = new Date(dateString); return date.toLocaleString('ko-KR'); } // 시스템 로그 열기 function openSystemLogs() { console.log('시스템 로그 버튼 클릭됨'); const modal = document.getElementById('account-modal'); const content = document.getElementById('account-management-content'); if (modal && content) { loadSystemLogsContent(content); modal.style.display = 'block'; } } // 시스템 로그 컨텐츠 로드 async function loadSystemLogsContent(container) { try { container.innerHTML = `

시스템 로그

로그 로딩 중...
`; // 로그 데이터 로드 await loadLogsData(); } catch (error) { console.error('시스템 로그 로드 오류:', error); container.innerHTML = `

시스템 로그를 불러오는 중 오류가 발생했습니다.

`; } } // 로그 데이터 로드 async function loadLogsData() { try { const response = await apiRequest('/api/system/logs/activity', 'GET'); const logsContainer = document.querySelector('.logs-container'); if (response.success && response.data) { displayLogs(response.data, logsContainer); } else { logsContainer.innerHTML = '

로그 데이터가 없습니다.

'; } } catch (error) { console.error('로그 데이터 로드 오류:', error); document.querySelector('.logs-container').innerHTML = '

로그 데이터를 불러올 수 없습니다.

'; } } // 로그 표시 function displayLogs(logs, container) { if (!logs || logs.length === 0) { container.innerHTML = '

표시할 로그가 없습니다.

'; return; } const html = ` ${logs.map(log => ` `).join('')}
시간 유형 사용자 내용
${formatDate(log.created_at)} ${log.type} ${log.username || '-'} ${log.description}
`; container.innerHTML = html; } // 로그 필터링 function filterLogs() { console.log('로그 필터링 실행'); // 실제 구현은 추후 추가 showNotification('로그 필터링 기능은 개발 중입니다.', 'info'); } // 데이터베이스 관리 열기 function openDatabaseManagement() { console.log('데이터베이스 관리 버튼 클릭됨'); showNotification('데이터베이스 관리 기능은 개발 중입니다.', 'info'); } // 시스템 설정 열기 function openSystemSettings() { console.log('시스템 설정 버튼 클릭됨'); showNotification('시스템 설정 기능은 개발 중입니다.', 'info'); } // 백업 관리 열기 function openBackupManagement() { console.log('백업 관리 버튼 클릭됨'); showNotification('백업 관리 기능은 개발 중입니다.', 'info'); } // 모니터링 열기 function openMonitoring() { console.log('모니터링 버튼 클릭됨'); showNotification('모니터링 기능은 개발 중입니다.', 'info'); } // 모달 닫기 function closeModal(modalId) { const modal = document.getElementById(modalId); if (modal) { modal.style.display = 'none'; } } // 로그아웃 function logout() { if (confirm('로그아웃 하시겠습니까?')) { localStorage.removeItem('sso_token'); localStorage.removeItem('sso_user'); window.location.href = '/'; } } // 알림 표시 function showNotification(message, type = 'info') { // 간단한 알림 표시 (나중에 토스트 라이브러리로 교체 가능) const notification = document.createElement('div'); notification.className = `notification notification-${type}`; notification.textContent = message; document.body.appendChild(notification); setTimeout(() => { notification.remove(); }, 5000); } // 사용자 편집 async function editUser(userId) { try { // 사용자 정보 가져오기 const response = await apiRequest(`/api/system/users`, 'GET'); if (!response.success) { throw new Error('사용자 정보를 가져올 수 없습니다.'); } const user = response.data.find(u => u.user_id === userId); if (!user) { throw new Error('해당 사용자를 찾을 수 없습니다.'); } // 편집 폼 표시 showUserEditForm(user); } catch (error) { console.error('사용자 편집 오류:', error); showNotification('사용자 정보를 불러오는 중 오류가 발생했습니다.', 'error'); } } // 사용자 편집 폼 표시 function showUserEditForm(user) { const formHtml = `

사용자 정보 수정

`; const container = document.getElementById('account-management-content'); container.innerHTML = formHtml; // 폼 제출 이벤트 리스너 document.getElementById('edit-user-form').addEventListener('submit', async (e) => { e.preventDefault(); await updateUser(user.user_id); }); } // 사용자 정보 업데이트 async function updateUser(userId) { try { const formData = { name: document.getElementById('edit-name').value, email: document.getElementById('edit-email').value || null, role: document.getElementById('edit-role').value, access_level: document.getElementById('edit-role').value, is_active: parseInt(document.getElementById('edit-is-active').value), user_id: document.getElementById('edit-worker-id').value || null }; const response = await apiRequest(`/api/system/users/${userId}`, 'PUT', formData); if (response.success) { showNotification('사용자 정보가 성공적으로 업데이트되었습니다.', 'success'); closeModal('account-modal'); // 계정 관리 다시 로드 setTimeout(() => openAccountManagement(), 500); } else { throw new Error(response.error || '업데이트에 실패했습니다.'); } } catch (error) { console.error('사용자 업데이트 오류:', error); showNotification('사용자 정보 업데이트 중 오류가 발생했습니다.', 'error'); } } // 사용자 삭제 async function deleteUser(userId) { try { // 사용자 정보 가져오기 const response = await apiRequest(`/api/system/users`, 'GET'); if (!response.success) { throw new Error('사용자 정보를 가져올 수 없습니다.'); } const user = response.data.find(u => u.user_id === userId); if (!user) { throw new Error('해당 사용자를 찾을 수 없습니다.'); } // 삭제 확인 if (!confirm(`정말로 사용자 '${user.username}'를 삭제하시겠습니까?\n\n이 작업은 되돌릴 수 없습니다.`)) { return; } // 사용자 삭제 요청 const deleteResponse = await apiRequest(`/api/system/users/${userId}`, 'DELETE'); if (deleteResponse.success) { showNotification('사용자가 성공적으로 삭제되었습니다.', 'success'); // 계정 관리 다시 로드 setTimeout(() => { const container = document.getElementById('account-management-content'); if (container) { loadAccountManagementContent(container); } }, 500); } else { throw new Error(deleteResponse.error || '삭제에 실패했습니다.'); } } catch (error) { console.error('사용자 삭제 오류:', error); showNotification('사용자 삭제 중 오류가 발생했습니다.', 'error'); } } // 새 사용자 생성 폼 열기 function openCreateUserForm() { const formHtml = `

새 사용자 생성

`; const container = document.getElementById('account-management-content'); container.innerHTML = formHtml; // 폼 제출 이벤트 리스너 document.getElementById('create-user-form').addEventListener('submit', async (e) => { e.preventDefault(); await createUser(); }); } // 새 사용자 생성 async function createUser() { try { const formData = { username: document.getElementById('create-username').value, password: document.getElementById('create-password').value, name: document.getElementById('create-name').value, email: document.getElementById('create-email').value || null, role: document.getElementById('create-role').value, access_level: document.getElementById('create-role').value, user_id: document.getElementById('create-worker-id').value || null }; const response = await apiRequest('/api/system/users', 'POST', formData); if (response.success) { showNotification('새 사용자가 성공적으로 생성되었습니다.', 'success'); // 계정 관리 목록으로 돌아가기 setTimeout(() => { const container = document.getElementById('account-management-content'); loadAccountManagementContent(container); }, 500); } else { throw new Error(response.error || '사용자 생성에 실패했습니다.'); } } catch (error) { console.error('사용자 생성 오류:', error); showNotification('사용자 생성 중 오류가 발생했습니다.', 'error'); } } // 사용자 필터링 function filterUsers() { const searchTerm = document.getElementById('user-search').value.toLowerCase(); const roleFilter = document.getElementById('role-filter').value; const rows = document.querySelectorAll('#users-tbody tr'); rows.forEach(row => { const username = row.cells[1].textContent.toLowerCase(); const name = row.cells[2].textContent.toLowerCase(); const role = row.querySelector('.role-badge').textContent.toLowerCase(); const matchesSearch = username.includes(searchTerm) || name.includes(searchTerm); const matchesRole = !roleFilter || role.includes(roleFilter); row.style.display = matchesSearch && matchesRole ? '' : 'none'; }); } // 모달 관련 함수들만 전역으로 노출 (동적으로 생성되는 HTML에서 사용) window.closeModal = closeModal; window.editUser = editUser; window.deleteUser = deleteUser; window.openCreateUserForm = openCreateUserForm; window.filterUsers = filterUsers; window.filterLogs = filterLogs; // 테스트용 전역 함수 window.testFunction = function() { alert('테스트 함수가 정상적으로 작동합니다!'); }; // 모달 외부 클릭 시 닫기 window.onclick = function(event) { const modals = document.querySelectorAll('.modal'); modals.forEach(modal => { if (event.target === modal) { modal.style.display = 'none'; } }); };