import React, { useState, useEffect } from 'react'; import api from '../api'; const SystemSettingsPage = ({ onNavigate, user }) => { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const [showCreateForm, setShowCreateForm] = useState(false); const [activeTab, setActiveTab] = useState('users'); // 'users', 'login-logs', 'activity-logs' const [loginLogs, setLoginLogs] = useState([]); const [activityLogs, setActivityLogs] = useState([]); const [newUser, setNewUser] = useState({ username: '', email: '', password: '', full_name: '', role: 'user' }); useEffect(() => { loadUsers(); if (activeTab === 'login-logs') { loadLoginLogs(); } else if (activeTab === 'activity-logs') { loadActivityLogs(); } }, [activeTab]); const loadUsers = async () => { try { setLoading(true); const response = await api.get('/auth/users'); if (response.data.success) { setUsers(response.data.users); } } catch (err) { console.error('사용자 목록 로딩 실패:', err); setError('사용자 목록을 불러오는데 실패했습니다.'); } finally { setLoading(false); } }; const loadLoginLogs = async () => { try { setLoading(true); const response = await api.get('/auth/logs/login?limit=50'); if (response.data.success) { setLoginLogs(response.data.logs); } } catch (err) { console.error('로그인 로그 로딩 실패:', err); setError('로그인 로그를 불러오는데 실패했습니다.'); } finally { setLoading(false); } }; const loadActivityLogs = async () => { try { setLoading(true); const response = await api.get('/auth/logs/system?limit=50'); if (response.data.success) { setActivityLogs(response.data.logs); } } catch (err) { console.error('활동 로그 로딩 실패:', err); setError('활동 로그를 불러오는데 실패했습니다.'); } finally { setLoading(false); } }; const handleCreateUser = async (e) => { e.preventDefault(); if (!newUser.username || !newUser.email || !newUser.password) { setError('모든 필수 필드를 입력해주세요.'); return; } try { setLoading(true); const response = await api.post('/auth/register', newUser); if (response.data.success) { alert('사용자가 성공적으로 생성되었습니다.'); setNewUser({ username: '', email: '', password: '', full_name: '', role: 'user' }); setShowCreateForm(false); loadUsers(); } } catch (err) { console.error('사용자 생성 실패:', err); setError(err.response?.data?.detail || '사용자 생성에 실패했습니다.'); } finally { setLoading(false); } }; const handleDeleteUser = async (userId) => { if (!confirm('정말로 이 사용자를 삭제하시겠습니까?')) { return; } try { setLoading(true); const response = await api.delete(`/auth/users/${userId}`); if (response.data.success) { alert('사용자가 삭제되었습니다.'); loadUsers(); } } catch (err) { console.error('사용자 삭제 실패:', err); setError('사용자 삭제에 실패했습니다.'); } finally { setLoading(false); } }; const getRoleDisplay = (role) => { switch (role) { case 'admin': return '관리자'; case 'manager': return '매니저'; case 'user': return '사용자'; default: return role; } }; const getRoleBadgeColor = (role) => { switch (role) { case 'admin': return '#dc2626'; case 'manager': return '#ea580c'; case 'user': return '#059669'; default: return '#6b7280'; } }; const getActivityTypeColor = (activityType) => { switch (activityType) { case 'FILE_UPLOAD': return '#10b981'; // 초록색 case '파일 정보 수정': return '#f59e0b'; // 주황색 case '엑셀 내보내기': return '#3b82f6'; // 파란색 case '자재 목록 조회': return '#8b5cf6'; // 보라색 case 'LOGIN': return '#6b7280'; // 회색 default: return '#6b7280'; } }; // 관리자 권한 확인 (system이 최고 권한) if (user?.role !== 'admin' && user?.role !== 'system') { return (
시스템 설정은 관리자만 접근할 수 있습니다.
사용자 계정 관리 및 시스템 로그 모니터링
| 사용자명 | 이메일 | 전체 이름 | 권한 | 상태 | 작업 |
|---|---|---|---|---|---|
| {userItem.username} | {userItem.email} | {userItem.full_name || '-'} | {getRoleDisplay(userItem.role)} | {userItem.is_active ? '활성' : '비활성'} | {userItem.id !== user?.id && ( )} |
| 사용자명 | IP 주소 | 상태 | 로그인 시간 |
|---|---|---|---|
| {log.username} | {log.ip_address} | {log.status === 'success' ? '성공' : '실패'} | {new Date(log.login_time).toLocaleString('ko-KR')} |
| 사용자명 | 활동 유형 | 상세 내용 | 시간 |
|---|---|---|---|
| {log.username} | {log.activity_type} | {log.activity_description} | {new Date(log.created_at).toLocaleString('ko-KR')} |