import React, { useState, useEffect, useMemo } from 'react'; import { User, CheckCircle, XCircle, Settings, Users, Calendar, Clock, LogOut, ShieldCheck } from 'lucide-react'; // 초기 더미 데이터 생성 (50명) const generateInitialStudents = () => { const days = ['월', '화', '수', '목']; return Array.from({ length: 50 }, (_, i) => ({ id: i + 1, name: `학생${String(i + 1).padStart(2, '0')}`, class: Math.floor(i / 10) + 1, selectedDays: days.filter(() => Math.random() > 0.3), // 무작위 요일 선택 })); }; const App = () => { // 상태 관리 const [userRole, setUserRole] = useState('viewer'); // 'viewer' (선생님), 'admin' (관리자) const [students, setStudents] = useState(generateInitialStudents()); const [attendance, setAttendance] = useState({}); // { '2023-10-23-1-1': status } 형식 const [currentDay, setCurrentDay] = useState('월'); const [currentPeriod, setCurrentPeriod] = useState(1); // 1교시 또는 2교시 const [searchTerm, setSearchTerm] = useState(''); // 시간 및 날짜 설정 const periods = [ { id: 1, time: "18:30 ~ 20:20", label: "1교시" }, { id: 2, time: "20:30 ~ 21:30", label: "2교시" } ]; // 출석 체크 핸들러 const toggleAttendance = (studentId) => { if (userRole !== 'admin') return; // 관리자만 수정 가능 const key = `${currentDay}-${currentPeriod}-${studentId}`; setAttendance(prev => ({ ...prev, [key]: prev[key] === 'present' ? 'absent' : 'present' })); }; // 필터링된 학생 목록 const filteredStudents = useMemo(() => { return students.filter(s => s.selectedDays.includes(currentDay) && s.name.includes(searchTerm) ); }, [students, currentDay, searchTerm]); // 통계 계산 const stats = useMemo(() => { const relevant = filteredStudents.length; const present = filteredStudents.filter(s => attendance[`${currentDay}-${currentPeriod}-${s.id}`] === 'present' ).length; return { total: relevant, present, absent: relevant - present }; }, [filteredStudents, attendance, currentDay, currentPeriod]); return (
{/* 상단 네비게이션 */}
{/* 필터 및 설정 섹션 */}
{/* 요일 선택 */}
요일 선택
{['월', '화', '수', '목'].map(day => ( ))}
{/* 교시 선택 */}
교시 선택
{periods.map(p => ( ))}
{/* 현황 요약 */}
현재 출석 현황 ({currentDay}) {currentPeriod}교시
{stats.present} / {stats.total}명

미출석: {stats.absent}명

{/* 학생 리스트 섹션 */}

명단 리스트 ({filteredStudents.length}명 대기 중)

setSearchTerm(e.target.value)} />
{filteredStudents.length > 0 ? ( filteredStudents.map(student => { const isPresent = attendance[`${currentDay}-${currentPeriod}-${student.id}`] === 'present'; return ( ); }) ) : ( )}
ID 학생 이름 학년/반 출석 여부 상태
{student.id} {student.name} {student.class}반 {isPresent ? ( 출석완료 ) : ( 미출석 )}
해당 요일에 신청한 학생이 없습니다.
); }; export default App;