고등학교 교사가 수업 시간에 쓰는 "수업 응답판" 웹앱을 만들어줘. 교사가 질문을 띄우면 학생들이 각자 기기로 답을 쓰고, 답은 교사만 본다. 학생 장난을 구조로 막는 게 핵심이야.
[학생 입장 — 이름은 고르기만, 자유 입력 금지]
- 교사가 출석부("번호 이름" 줄 붙여넣기)를 넣으면 학생마다 4자리 PIN 을 자동 생성한다.
- 학생: 입장 코드 6자리(또는 QR) → 출석부 목록에서 자기 이름 선택 → PIN 입력.
- 한 이름은 한 기기만: 이미 접속한 이름을 다른 기기가 고르면 막고 교사 화면에 경고. 기기 해제는 교사만.
- 학생 화면에 항상 "선생님은 누가 쓴 답인지 볼 수 있어요" 표시.
[학생 화면 — 교사가 정한 화면만]
- 대기/답 쓰기/모이기/종료를 교사 상태에 따라 자동 전환. 새로고침해도 현재 상태로 돌아온다.
- 열린 질문에 답 작성. 질문별 최소 글자 수 미만이면 제출 불가. 마감 전까지 수정 가능, 마감 후 잠김.
- 다른 학생의 답은 화면에서도 API 에서도 볼 수 없다.
- 교사가 "다시 쓰기"를 요청하면 입력 칸이 다시 열린다. 숨겨진 답엔 "숨겨짐" 표시.
[교사 — 아이디/비밀번호 로그인]
- 반 여러 개(1~8반 등)와 반별 출석부, PIN 재발급, 기기 해제, PIN 카드 인쇄(학생별: 반·번호·이름·PIN·입장 주소).
- 질문 세트를 미리 만들어 여러 반에서 재사용. 수업 열기(반 + 질문 세트) → 입장 코드·QR.
- 수업 진행판:
- 현재 질문 크게, 질문 열기·마감·다음 질문
- 번호순 출석 타일(미접속 회색·접속 흰색·제출 초록·숨김/다시 쓰기 빨강), "제출 18 / 접속 24 / 전체 26", 미제출자 이름 목록
- 현재 질문의 모든 답을 번호순 카드로 한꺼번에, 새 답은 실시간 추가. 카드마다 숨기기(내용 접힘)·다시 쓰기 요청, 이름 가리기 토글
- 욕설·비하어 기본 목록에 걸린 답은 경고 표시만(자동 차단 X)
- [모두 모이기]: 모든 학생 화면을 즉시 "모이기 화면"(교사가 쓴 한 줄, 기본 "선생님 화면을 봐 주세요")으로 바꾸고 입력 잠금. 다시 누르면 복귀
- [수업 끝내기]: 모든 학생 화면을 종료 화면으로
- 수업 기록: 수업·질문별 답, 학생별 학기 답 모아 보기(세특 근거), CSV. 반을 삭제하면 학생·답도 함께 삭제.
[실시간] 교사 조작과 학생 제출은 WebSocket 으로 1초 안에 서로의 화면에 반영.
[데이터] teachers, classrooms, students(classroom_id, number, name, pin, device_token, last_seen_at), question_sets, questions(set_id, position, text, min_chars), lessons(classroom_id, set_id, join_code, state: waiting|question|gather|ended, current_question_id, gather_message), answers(lesson_id, question_id, student_id, text, status: submitted|hidden|returned, flagged — 학생·질문당 1개).
[시드] 교사 demo / demo1234. "1학년 3반" 26명(가상 이름), PIN 은 번호 4자리(1번 0001), 입장 화면에 "체험: 코드 DEMO01, 아무 이름, PIN = 번호 4자리" 안내. 통합사회 질문 세트 "사회 정의와 불평등" 3문항(정의로운 사회란? / 능력 분배와 필요 분배 중 하나와 근거 / 학교에서 본 불평등과 개선안), 진행 중 수업 1개(제출 18명·숨김 1건).
[제외] 학생 회원가입, 학부모, 점수·채점, 학생끼리 답 공유, 객관식, AI 분석.
[톤] 단정하고 차분한 교실 분위기. 배경 #f7f5ef, 주 색 #2f6f5e, 글자 #2b2b2b, 제출 #22a06b, 경고 #d14343. 학생 화면은 모바일 우선·큰 글자·큰 버튼, 교사 진행판은 교실 화면에서 한눈에.