공개페이지
This commit is contained in:
@@ -672,3 +672,104 @@ void main() {
|
||||
### 진행 현황 업데이트 (2025-08-25T08:37:56+09:00)
|
||||
- __플랜 갱신__: 오늘 작업 계획 수립 및 체크리스트/Current Goal 날짜 갱신.
|
||||
- __테스트 전략 유지__: 전체 스위트 반복 실행으로 플래키 재발 방지 계획 확정.
|
||||
|
||||
{{ ... }}
|
||||
- [ ] 품질: 전체 테스트/린트 실행 및 그린 유지
|
||||
- [ ] 품질: 전체 스위트 2~3회 반복 실행으로 플래키 재발 여부 점검(`flutter test -r expanded` 비교 실행 포함)
|
||||
- [ ] 품질: 남은 린트 경고 정리 PR 분리 제출
|
||||
|
||||
### 진행 현황 업데이트 (2025-08-25T08:37:56+09:00)
|
||||
- __플랜 갱신__: 오늘 작업 계획 수립 및 체크리스트/Current Goal 날짜 673→- __테스트 전략 유지__: 전체 스위트 반복 실행으로 플래키 재발 방지 계획 확정.
|
||||
674→
|
||||
675→
|
||||
### 진행 현황 업데이트 (2025-10-27T13:49:00+09:00)
|
||||
- __결정__: Vue 공개 이벤트 페이지(EventPublicPage.vue)를 Flutter Web로 이전한다.
|
||||
- __백엔드 확인__: 공개 API 엔드포인트 정리 완료(`backend/routes/publicEventRoutes.js` 기준)
|
||||
- POST `/api/public/:publicHash` (최초 진입/비밀번호 또는 저장 토큰 인증)
|
||||
- POST `/api/public/:publicHash/participant` (공개 참가자 등록/수정)
|
||||
- POST `/api/public/:publicHash/guest` (공개 게스트 추가)
|
||||
- PUT `/api/public/:publicHash/score` (공개 점수 수정)
|
||||
- __웹 전역 레이아웃__: `mobile/lib/main.dart`에 전역 maxWidth(1200) 제한 및 ThemeMode.light 고정 적용 완료.
|
||||
|
||||
## Current Goal (as of 2025-10-27)
|
||||
공개 이벤트 페이지 Flutter 이전(웹 우선) — 인증/참가자/게스트/점수 기능을 MVP로 이전하고, 반응형 레이아웃과 접근성, 테스트를 포함해 안정적인 배포가 가능하도록 한다.
|
||||
|
||||
## 통합 작업 체크리스트 (as of 2025-10-27T13:49:00+09:00)
|
||||
- [ ] 라우팅 구성: `/p/:publicHash` 경로 처리(딥링크/새로고침 대응)
|
||||
- [ ] 서비스 신설: `PublicEventService`(enter/addOrUpdateParticipant/addGuest/updateScore)
|
||||
- [ ] 모델 정의: `PublicEvent`/`PublicParticipant`/`PublicScore`
|
||||
- [ ] 진입 화면: `PublicEventEntryScreen` (비번 입력/토큰 저장/자동 인증)
|
||||
- [ ] 상세 화면: `PublicEventScreen` (헤더/참가자/미배정/점수 그리드/저장)
|
||||
- [ ] 참가자 등록/수정 모달 구현(필수값/유효성/저장 후 갱신)
|
||||
- [ ] 게스트 추가 모달 구현(기본값: status=registered, payment=unpaid)
|
||||
- [ ] 점수 입력/검증/저장(0~300, gameCount 동기화)
|
||||
- [ ] 로딩/빈/에러 상태 분기(스낵바/리트라이)
|
||||
- [ ] 토큰 스토리지 래퍼(web: localStorage) 도입 및 보안 가이드 적용
|
||||
- [ ] 반응형 레이아웃(테이블 가로 스크롤/카드 전환) 점검
|
||||
- [ ] 접근성/로컬라이징(ko_KR) 적용 및 날짜 포맷 통일
|
||||
- [ ] 위젯 테스트(Entry/Screen/모달/점수) 추가 및 그린 확보
|
||||
- [ ] 서비스 테스트(각 API 성공/실패/예외) 추가 및 그린 확보
|
||||
- [ ] 통합 시나리오(인증→로드→참가자/게스트→점수 저장) 수동/E2E 검증
|
||||
|
||||
## 공개 이벤트 페이지 Flutter 이전: 기능명세서
|
||||
- **[페이지 진입/인증]**
|
||||
- 비밀번호 입력 → POST `/api/public/:publicHash` → 토큰 저장 후 이벤트 데이터 로드
|
||||
- 저장된 토큰 자동 인증, 실패(401/403) 시 토큰 삭제 및 재시도 유도
|
||||
- **[이벤트 정보]**
|
||||
- 제목/설명/유형/상태/일정/장소/게임 수/정원 등 표시, 날짜 포맷 `YYYY-MM-DD 오전/오후 hh:mm`
|
||||
- **[참가자/미배정]**
|
||||
- 참가자 목록(이름/성별/유형/상태/결제/핸디캡/평균/게임)
|
||||
- 미배정 인원 목록 표시(응답 그대로)
|
||||
- 참가자 등록/수정, 게스트 추가 폼 및 저장 후 갱신
|
||||
- **[점수 관리]**
|
||||
- `gameCount` 기반 총점 입력 그리드, 0~300 검증, 저장(put `/score`)
|
||||
- 저장 중 로딩/성공/오류 피드백
|
||||
- **[상태/오류]**
|
||||
- 로딩/빈/에러 분기, 스낵바/리트라이, 인증 만료 시 재인증 유도
|
||||
- **[보안/네트워크]**
|
||||
- HTTPS, 동일 오리진(`/api`) 호출, 민감정보 미노출
|
||||
|
||||
## 공개 이벤트 페이지 Flutter 이전: 화면설계서
|
||||
- **[PublicEventEntryScreen]**
|
||||
- 요소: 비밀번호 입력, 접속 버튼, 로딩/오류 메시지
|
||||
- 동작: 저장 토큰 자동 인증 → 성공 시 상세 이동
|
||||
- **[PublicEventScreen]**
|
||||
- 헤더: 제목, 일정, 장소, `gameCount` 배지
|
||||
- 섹션: 참가자 리스트, 미배정 리스트, 점수 입력(그리드) + 저장 버튼
|
||||
- 모달: 참가자 등록/수정, 게스트 추가
|
||||
- 반응형: 최대폭 1200, 모바일 카드형 전환/가로 스크롤 허용
|
||||
|
||||
## 공개 이벤트 페이지 Flutter 이전: 테스트 계획
|
||||
- **[서비스 테스트]** `PublicEventService`
|
||||
- 진입 API: 200(토큰 저장)/401·403(토큰 삭제)·타임아웃
|
||||
- 참가자/게스트/점수: 성공/실패/예외 전파, 상태 복구 검증
|
||||
- **[위젯 테스트]**
|
||||
- Entry: 비번 입력→제출→성공 라우팅, 실패 메시지
|
||||
- Screen: 헤더 렌더, 참가자/미배정 렌더, 모달(열기/저장/유효성), 점수 입력(범위/저장 성공/실패)
|
||||
- **[통합/회귀]**
|
||||
- 인증→로드→참가자 추가→점수 저장→재로딩 시 반영 확인, 새로고침/딥링크 동작
|
||||
|
||||
## 공개 이벤트 페이지 Flutter 이전: 누락 기능 보강 목록 (EventPublicPage.vue 기준 → Flutter 매핑)
|
||||
- **[인증/스토리지]** 저장 토큰(localStorage) 래퍼 구현, 401/403 시 토큰 삭제·재인증 유도.
|
||||
- **[권한 로직]** `isReady/isActive/isFinished` 및 `canJoin/canEditParticipant/canInputScore` 계산자 도입.
|
||||
- **[참가 신청]** `availableMembers` 활용한 참가 신청/수정 UI(JoinDialog 동등) 및 성공 후 `reload()` 처리.
|
||||
- **[점수 입력 UX]** 200ms 디바운스 저장, 입력 3자리 시 자동 저장(onScoreInput), blur/enter 저장, 상태 아이콘(`idle/saving/saved/error`).
|
||||
- **[점수 색상 규칙]** 핸디캡 포함 점수 기준 200이상 빨강, 그 외 검정/회색.
|
||||
- **[점수 한도]** 핸디캡 포함 점수 300 상한 적용.
|
||||
- **[순위 계산]** 개인 총점/게임별/팀별 순위(공동 순위 처리) 유틸 포팅 및 `memberRankMap/gameRanks` 반영.
|
||||
- **[팀/미배정]** `getAllTeamsWithUnassigned()` 로직 반영, 팀 카드 요약(게임별/총점/등수) 포함.
|
||||
- **[최종 순위표]** 완료 상태에서 테이블 렌더(정렬/페이지네이션 유사 UX), 평균 소수 1자리.
|
||||
- **[데이터 보정]** `sortedParticipants`에서 점수 배열 길이 `gameCount`로 보정, 이름 정렬(ko).
|
||||
- **[상태 분기]** 로딩/에러/빈 상태 UI와 404 문구, 재시도 버튼.
|
||||
- **[날짜/통화]** `YYYY-MM-DD 오전/오후 hh:mm` 포맷 및 참가비 통화 포맷 ko-KR.
|
||||
- **[반응형]** 큰 화면 DataTable은 가로 스크롤, 모바일은 카드 전환. 전역 `maxWidth=1200` 유지.
|
||||
- **[메타/분석]** GA pageview(웹 한정), SEO 메타는 서버 템플릿에서 대응(Flutter Web 한계 안내).
|
||||
|
||||
### 다음 작업 (TDD 우선)
|
||||
- **[서비스]** `PublicEventService` 스텁/테스트 생성 → 진입(200/401/403/404)·참가자·게스트·점수 저장 성공/실패/예외.
|
||||
- **[모델]** `PublicEvent/PublicParticipant/Team/Score` 파서 테스트(누락 키/타입 견고성).
|
||||
- **[유틸]** 랭킹/합산 유틸 테스트(동점자 처리/300 상한/게임별·팀별 순위).
|
||||
- **[스토리지]** web localStorage 래퍼 테스트(세트/겟/삭제, 네임스페이스 event_token_<hash>).
|
||||
- **[라우팅]** `/p/:publicHash` 경로 파라미터 테스트(새로고침/딥링크).
|
||||
- **[위젯]** EntryScreen(비번 제출 성공/실패), EventScreen(헤더/참가자/팀/미배정/점수/저장/에러), 모달(유효성/저장/갱신) 테스트.
|
||||
- **[회귀]** 저장 후 순위/색상/상태 아이콘 업데이트, `reload()` 재로딩 반영.
|
||||
|
||||
Reference in New Issue
Block a user