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 (

접근 권한이 없습니다

시스템 설정은 관리자만 접근할 수 있습니다.

); } return (
{/* 헤더 */}

⚙️ 시스템 설정

사용자 계정 관리 및 시스템 로그 모니터링

{/* 탭 네비게이션 */}
{error && (
{error}
)} {/* 사용자 관리 섹션 */}

👥 사용자 관리

{/* 사용자 생성 폼 */} {showCreateForm && (

새 사용자 생성

setNewUser({...newUser, username: e.target.value})} style={{ width: '100%', padding: '8px 12px', border: '1px solid #d1d5db', borderRadius: '4px', fontSize: '14px' }} required />
setNewUser({...newUser, email: e.target.value})} style={{ width: '100%', padding: '8px 12px', border: '1px solid #d1d5db', borderRadius: '4px', fontSize: '14px' }} required />
setNewUser({...newUser, password: e.target.value})} style={{ width: '100%', padding: '8px 12px', border: '1px solid #d1d5db', borderRadius: '4px', fontSize: '14px' }} required />
setNewUser({...newUser, full_name: e.target.value})} style={{ width: '100%', padding: '8px 12px', border: '1px solid #d1d5db', borderRadius: '4px', fontSize: '14px' }} />
)} {/* 탭별 콘텐츠 */} {loading ? (
로딩 중...
) : activeTab === 'users' ? ( // 사용자 관리 탭
{users.map((userItem) => ( ))}
사용자명 이메일 전체 이름 권한 상태 작업
{userItem.username} {userItem.email} {userItem.full_name || '-'} {getRoleDisplay(userItem.role)} {userItem.is_active ? '활성' : '비활성'} {userItem.id !== user?.id && ( )}
) : activeTab === 'login-logs' ? ( // 로그인 로그 탭

🔐 로그인 로그

{loginLogs.map((log, index) => ( ))}
사용자명 IP 주소 상태 로그인 시간
{log.username} {log.ip_address} {log.status === 'success' ? '성공' : '실패'} {new Date(log.login_time).toLocaleString('ko-KR')}
) : activeTab === 'activity-logs' ? ( // 활동 로그 탭

📊 활동 로그

{activityLogs.map((log, index) => ( ))}
사용자명 활동 유형 상세 내용 시간
{log.username} {log.activity_type} {log.activity_description} {new Date(log.created_at).toLocaleString('ko-KR')}
) : null}
); }; export default SystemSettingsPage;