feat: v3.1 대시보드 추가 (React + FastAPI)

Media Engine Control Panel — 6탭 웹 대시보드

[백엔드] FastAPI (dashboard/backend/)
- server.py: 포트 8080, CORS, React SPA 서빙
- api_overview.py: KPI 카드 + 파이프라인 상태 + 활동 로그
- api_content.py: 칸반 보드 + 승인/거부 + 수동 트리거
- api_analytics.py: 방문자 추이 + 플랫폼/코너별 성과
- api_novels.py: 소설 목록/생성/에피소드 관리
- api_settings.py: engine.json CRUD
- api_connections.py: AI 서비스 연결 관리 + 키 저장
- api_tools.py: 기능별 AI 도구 선택
- api_cost.py: 구독 현황 + API 사용량 추적
- api_logs.py: 시스템 로그 필터/검색

[프론트엔드] React + Vite + Tailwind + Recharts (dashboard/frontend/)
- Overview: KPI 카드 + 파이프라인 + 코너별 바차트 + 활동 로그
- Content: 4열 칸반 보드 + 상세 모달 + 승인/거부
- Analytics: LineChart 방문자 추이 + 플랫폼별 성과
- Novel: 소설 목록 + 에피소드 테이블 + 새 소설 생성 폼
- Settings: 5개 서브탭 (AI연결/도구선택/배포채널/품질/비용관리)
- Logs: 필터/검색 시스템 로그 뷰어

[디자인] CNN 다크+골드 테마
- 배경 #0a0a0d + 액센트 #c8a84e
- 모바일 반응형 (Tailscale 외부 접속 대응)

[실행]
- dashboard/start.bat 더블클릭 → http://localhost:8080

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sinmb79
2026-03-26 13:17:53 +09:00
parent 8a7a122bb3
commit 213f57b52d
35 changed files with 3971 additions and 0 deletions
+90
View File
@@ -0,0 +1,90 @@
/* CNN 다크 + 골드 테마 */
@tailwind base;
@tailwind components;
@tailwind utilities;
:root {
--bg: #0a0a0d;
--card: #111116;
--border: #222228;
--text: #e0e0d8;
--subtext: #888880;
--accent: #c8a84e;
--success: #3a7d5c;
--warning: #c8a84e;
--error: #bf3a3a;
--info: #4a5abf;
}
* {
box-sizing: border-box;
}
html, body, #root {
height: 100%;
background-color: var(--bg);
color: var(--text);
font-family: 'Noto Sans KR', 'Apple SD Gothic Neo', -apple-system, sans-serif;
-webkit-font-smoothing: antialiased;
}
/* 스크롤바 */
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: var(--bg);
}
::-webkit-scrollbar-thumb {
background: var(--border);
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--subtext);
}
/* 골드 액센트 버튼 */
.btn-accent {
background-color: var(--accent);
color: #0a0a0d;
font-weight: 600;
padding: 0.5rem 1rem;
border-radius: 0.375rem;
transition: opacity 0.2s;
}
.btn-accent:hover {
opacity: 0.85;
}
/* 카드 기본 */
.card {
background-color: var(--card);
border: 1px solid var(--border);
border-radius: 0.5rem;
}
/* 태그 */
.tag {
font-size: 0.7rem;
padding: 0.15rem 0.5rem;
border-radius: 9999px;
font-weight: 500;
}
/* 상태 뱃지 */
.badge-done { background: #1a3d2c; color: #4ade80; }
.badge-running { background: #1a2a4d; color: #60a5fa; }
.badge-waiting { background: #1a1a22; color: #888880; }
.badge-error { background: #3d1a1a; color: #f87171; }
/* 칸반 드래그 영역 */
.kanban-col {
min-height: 400px;
}
/* 로그 레벨 */
.log-error { color: #f87171; }
.log-warning { color: #fbbf24; }
.log-info { color: #60a5fa; }
.log-debug { color: #888880; }