미출석: {stats.absent}명
명단 리스트 ({filteredStudents.length}명 대기 중)
| ID | 학생 이름 | 학년/반 | 출석 여부 | 상태 |
|---|---|---|---|---|
| {student.id} | {student.name} | {student.class}반 | {isPresent ? ( 출석완료 ) : ( 미출석 )} | |
| 해당 요일에 신청한 학생이 없습니다. | ||||
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 (
미출석: {stats.absent}명
| ID | 학생 이름 | 학년/반 | 출석 여부 | 상태 |
|---|---|---|---|---|
| {student.id} | {student.name} | {student.class}반 | {isPresent ? ( 출석완료 ) : ( 미출석 )} | |
| 해당 요일에 신청한 학생이 없습니다. | ||||