Initial commit

This commit is contained in:
kihong.kim
2026-01-24 19:41:19 +09:00
commit 807df3d678
90 changed files with 6411 additions and 0 deletions

291
docs/project-plan.md Normal file
View File

@@ -0,0 +1,291 @@
# Google TV Family Dashboard App - Project Plan
Google TV용 가족 대시보드 앱 구현 계획입니다. TV 화면에서 일일 정보(달력, 날씨, 할일, 성경 말씀)를 표시하고, Flutter 앱을 통해 데이터를 입력/관리할 수 있는 시스템입니다.
---
## System Architecture
```
┌─────────────────────────────────────────────────────────────────┐
│ Google TV │
│ Flutter TV App (APK) │
└──────────────────────────┬──────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ Backend Server │
│ Node.js + Express API │
│ MongoDB │
└──────────────────────────┬──────────────────────────────────────┘
┌──────────────┼──────────────┐
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ Weather │ │ Bible │ │ Flutter │
│ API │ │ API │ │ Mobile │
└───────────┘ └───────────┘ └───────────┘
```
---
## Key Decisions
| 항목 | 선택 | 비고 |
|------|------|------|
| **TV App** | Flutter for Android TV | 모바일 앱과 코드 공유, APK로 TV 설치 |
| **DB** | MongoDB | 확장성, 유연한 스키마 |
| **Weather API** | OpenWeatherMap | 무료 1000 calls/day, 환경변수로 변경 가능 |
| **Bible API** | bible-api.com | 영어+한글 동시 표시, 환경변수로 변경 가능 |
| **가족 구성원** | Admin 기능으로 관리 | Flutter 앱 내 설정에서 추가/수정/삭제 |
| **사진 갤러리** | Admin에서 업로드 | TV 화면에 랜덤 슬라이드쇼로 표시 |
---
## TV Screen Specifications (43인치 기준)
| 항목 | 값 | 설명 |
|------|-----|------|
| **해상도** | 1920 x 1080 px | Full HD 기준 (4K TV도 호환) |
| **화면 비율** | 16:9 | 표준 와이드스크린 |
| **실제 크기** | 95.3cm x 53.6cm | 43인치 대각선 기준 |
| **Safe Zone** | 90% 영역 사용 | 가장자리 5% 여백 권장 |
### UI 레이아웃 가이드
```
┌────────────────────────────────────────────────────────────────────────┐
│ 1920px (16:9 @ 1080p) │
├────────────────────────────────────────────────────────────────────────┤
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ Safe Zone (90%) │ │
│ │ ┌─────────────────────────────┬──────────────────────────┐ │ │
│ │ │ │ │ │ │
│ │ │ 메인 영역 (65%) │ 사이드바 (35%) │ │ │
│ │ │ 1248px │ 672px │ │ │
│ │ │ │ │ │ │
│ │ │ - 날씨 │ - 월간 달력 │ │ │
│ │ │ - 오늘의 할일 │ - 주간 일정 │ │ │
│ │ │ - 오늘의 말씀 │ - 공지사항 │ │ │
│ │ │ │ │ │ │
│ │ └─────────────────────────────┴──────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │ 1080px
└────────────────────────────────────────────────────────────────────────┘
```
### 폰트 크기 권장 (시청 거리 2~3m 기준)
| 요소 | 크기 | 용도 |
|------|------|------|
| 헤더/시간 | 48-64px | 날짜, 현재 시간 |
| 제목 | 32-40px | 섹션 제목 |
| 본문 | 24-28px | 할일, 일정 내용 |
| 보조 텍스트 | 18-20px | 부가 정보 |
---
## TV Display Layout (Single Usage Dashboard)
모든 정보와 기능을 한 화면에서 볼 수 있는 통합 대시보드 레이아웃입니다.
```
┌────────────────────────────────────────────────────────────────────────┐
│ 📅 2026.01.24 (금) 15:43:36 🌤️ 서울 12°C 맑음 │
├──────────────────────┬─────────────────────────┬───────────────────────┤
│ [📅 월간 달력] │ [🖼️ 가족 사진 앨범] │ [✅ 오늘의 할일] │
│ │ │ │
│ 1 2 3 4 5 6 7 │ (랜덤 슬라이드쇼) │ 👨 아빠: 마트, 운동 │
│ 8 9 10 11 12 13 14 │ (30초 간격 전환) │ 👩 엄마: 회의 │
│ 15 16 17 18 19 20 21 │ │ 👦 아들: 수학 숙제 │
│ 22 23 24 25 26 27 28 │ │ 👧 딸: 피아노 가기 │
│ 29 30 31 │ │ │
├──────────────────────┤ ├───────────────────────┤
│ [📋 주간 일정] │ │ [📖 오늘의 말씀] │
│ │ │ │
│ 금: 가족 모임 │ │ "The fear of the LORD │
│ 토: 결혼식 참석 │ │ is the beginning..." │
│ 일: 교회 예배 │ │ │
│ │ │ "여호와를 경외하는..." │
├──────────────────────┤ │ - 잠언 1:7 │
│ [📢 공지사항] │ │ │
│ • 다음 주 여행 계획 │ │ │
└──────────────────────┴─────────────────────────┴───────────────────────┘
```
### 위젯 구성
1. **Header**: 날짜, 시간, 실시간 날씨 (Top Bar)
2. **Left Column (Plan)**:
- 월간 달력 (이번 달 전체 뷰)
- 주간 주요 일정 (리스트)
- 공지사항 (텍스트 롤링)
3. **Center Column (Memory)**:
- **가족 사진 위젯**: Admin에서 업로드한 사진들을 랜덤하게 표시 (디지털 액자 기능)
4. **Right Column (Focus)**:
- 가족별 오늘의 할일 (아바타와 함께 표시)
- 오늘의 말씀 (한글/영어 병기)
---
## MongoDB Collections (Updated)
### photos
```javascript
{
_id: ObjectId,
url: "https://.../photo.jpg", // 또는 base64 (저장 용량 고려 필요)
caption: "2025 여름 휴가",
active: true,
createdAt: Date
}
```
### family_members (기존 동일)
...
---
## API Endpoints (Updated)
| Method | Endpoint | Description |
|--------|----------|-------------|
| GET/POST | `/api/photos` | 사진 목록 조회/업로드 |
| DELETE | `/api/photos/:id` | 사진 삭제 |
| ... | ... | (기존 API 동일) |
```
bini-google-tv/
├── docs/
│ └── project-plan.md
├── backend/
│ ├── server.js
│ ├── config/
│ │ ├── db.js
│ │ └── api.js
│ ├── models/
│ │ ├── FamilyMember.js
│ │ ├── Todo.js
│ │ ├── Schedule.js
│ │ ├── Announcement.js
│ │ └── Setting.js
│ ├── routes/
│ │ ├── family.js
│ │ ├── todos.js
│ │ ├── schedules.js
│ │ ├── announcements.js
│ │ ├── weather.js
│ │ └── bible.js
│ ├── .env.example
│ └── package.json
└── flutter_app/
├── lib/
│ ├── main.dart
│ ├── config/
│ ├── models/
│ ├── services/
│ ├── screens/
│ │ ├── tv/
│ │ ├── mobile/
│ │ └── admin/
│ └── widgets/
└── pubspec.yaml
```
---
## MongoDB Collections
### family_members
```javascript
{
_id: ObjectId,
name: "아빠",
emoji: "👨",
color: "#3498db",
order: 1,
createdAt: Date
}
```
### todos
```javascript
{
_id: ObjectId,
familyMemberId: ObjectId,
title: "마트 장보기",
completed: false,
dueDate: Date,
createdAt: Date
}
```
### schedules
```javascript
{
_id: ObjectId,
title: "가족 모임",
description: "할머니 댁 방문",
startDate: Date,
endDate: Date,
familyMemberId: ObjectId,
isAllDay: true,
createdAt: Date
}
```
### announcements
```javascript
{
_id: ObjectId,
title: "이번 주 외식",
content: "금요일 저녁 외식 예정",
priority: 1,
active: true,
createdAt: Date
}
```
---
## API Endpoints
| Method | Endpoint | Description |
|--------|----------|-------------|
| GET/POST | `/api/family` | 가족 구성원 조회/추가 |
| GET/PUT/DELETE | `/api/family/:id` | 특정 구성원 조회/수정/삭제 |
| GET/POST | `/api/todos` | 할일 조회/추가 |
| GET/PUT/DELETE | `/api/todos/:id` | 특정 할일 조회/수정/삭제 |
| GET | `/api/todos/today` | 오늘의 할일 조회 |
| GET/POST | `/api/schedules` | 일정 조회/추가 |
| GET | `/api/schedules/week` | 주간 일정 조회 |
| GET | `/api/schedules/month` | 월간 일정 조회 |
| GET/POST | `/api/announcements` | 공지사항 조회/추가 |
| GET | `/api/weather` | 현재 날씨 조회 |
| GET | `/api/bible/today` | 오늘의 말씀 조회 |
---
## Development Phases
| Phase | 내용 | 예상 시간 |
|-------|------|----------|
| 1 | Backend + MongoDB 설정 | 2-3시간 |
| 2 | REST API 구현 | 3-4시간 |
| 3 | Flutter 공통 구조 + 모델 | 2시간 |
| 4 | TV Display 화면 | 3-4시간 |
| 5 | Mobile 입력 화면 | 4-5시간 |
| 6 | Admin (가족구성원/설정) | 2시간 |
| 7 | 통합 + TV APK 빌드 | 2-3시간 |
**총 예상 시간: 18-23시간**
---
## TV App Installation
1. **Flutter 빌드**: `flutter build apk --release`
2. **TV에 설치**:
- USB로 APK 전송 후 파일 관리자에서 설치
- 또는 ADB 사용: `adb install app-release.apk`
3. **TV 홈에서 앱 실행**