- 마스터 + 인원/장비/자재/공사량/작업사진 6테이블 마이그레이션 - 6개 탭: 작업내용, 인원, 장비, 자재, 공사량, 작업사진 - 작업내용: 금일/명일 텍스트 + 날씨/기온/강수/미세먼지 메타 - 전일누계 + 금일 + 총계 누적 패턴 (인원/장비/자재/공사량) - 작업사진: 파일 업로드 + 사진목록/사진정보 2단 레이아웃 - 상태별 버튼 제어 (작성중→저장/삭제, 검토중→읽기전용) - 양식보기: 3페이지 전체화면 뷰어 (작업일보/인원장비/자재) - 검토자 지정 모달, 캘린더 스트립, 번개 랜덤데이터
953 lines
29 KiB
HTML
953 lines
29 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="ko">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
|
|
<style>
|
|
|
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
body {
|
|
width: 720pt;
|
|
height: 405pt;
|
|
font-family: 'Pretendard', 'Malgun Gothic', sans-serif;
|
|
background: #ffffff;
|
|
}
|
|
p, h1, h2, h3 { margin: 0; }
|
|
|
|
|
|
/* Header Table */
|
|
.header-table {
|
|
display: flex;
|
|
flex-direction: column;
|
|
border: 0.5pt solid #64748b;
|
|
margin: 4pt 8pt;
|
|
}
|
|
.header-row {
|
|
display: flex;
|
|
border-bottom: 0.5pt solid #64748b;
|
|
}
|
|
.header-row:last-child {
|
|
border-bottom: none;
|
|
}
|
|
.header-cell {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
border-right: 0.5pt solid #64748b;
|
|
background: #f1f5f9;
|
|
padding: 4pt 6pt;
|
|
height: 18pt;
|
|
}
|
|
.header-cell:last-child { border-right: none; }
|
|
.header-cell.label {
|
|
width: 55pt;
|
|
background: #e2e8f0;
|
|
}
|
|
.header-cell.value { flex: 1; }
|
|
.header-cell.small { width: 45pt; }
|
|
.header-cell.medium { width: 70pt; }
|
|
.header-cell p {
|
|
font-size: 6pt;
|
|
color: #1e293b;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
/* Main Content */
|
|
.main-content {
|
|
display: flex;
|
|
flex: 1;
|
|
padding: 0 8pt 8pt 8pt;
|
|
gap: 8pt;
|
|
}
|
|
|
|
/* Wireframe Area */
|
|
.wireframe-area {
|
|
flex: 1;
|
|
background: #f8fafc;
|
|
border: 0.5pt solid #e2e8f0;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
flex-direction: column;
|
|
overflow: hidden;
|
|
}
|
|
.wireframe-header {
|
|
background: #1e293b;
|
|
padding: 5pt 10pt;
|
|
}
|
|
.wireframe-header p {
|
|
font-size: 8pt;
|
|
font-weight: 600;
|
|
color: #ffffff;
|
|
}
|
|
.wireframe-body {
|
|
flex: 1;
|
|
display: flex;
|
|
padding: 8pt;
|
|
gap: 8pt;
|
|
}
|
|
|
|
/* Sidebar */
|
|
.sidebar {
|
|
width: 65pt;
|
|
background: #f1f5f9;
|
|
border-radius: 2pt;
|
|
padding: 5pt;
|
|
}
|
|
.sidebar-item {
|
|
padding: 4pt 5pt;
|
|
margin-bottom: 2pt;
|
|
border-radius: 2pt;
|
|
background: #ffffff;
|
|
}
|
|
.sidebar-item.active {
|
|
background: #0d9488;
|
|
}
|
|
.sidebar-item p {
|
|
font-size: 5pt;
|
|
color: #1e293b;
|
|
}
|
|
.sidebar-item.active p {
|
|
color: #ffffff;
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* Content Area */
|
|
.content-area {
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 6pt;
|
|
}
|
|
.section-title p {
|
|
font-size: 8pt;
|
|
font-weight: 700;
|
|
color: #1e293b;
|
|
}
|
|
|
|
/* Cards */
|
|
.cards-row {
|
|
display: flex;
|
|
gap: 6pt;
|
|
}
|
|
.card {
|
|
flex: 1;
|
|
background: #f1f5f9;
|
|
border: 0.5pt solid #e2e8f0;
|
|
border-radius: 2pt;
|
|
overflow: hidden;
|
|
}
|
|
.card.selected {
|
|
border-color: #0d9488;
|
|
border-width: 1pt;
|
|
}
|
|
.card-header {
|
|
background: #1e293b;
|
|
padding: 3pt 5pt;
|
|
}
|
|
.card-header.primary {
|
|
background: #0d9488;
|
|
}
|
|
.card-header p {
|
|
font-size: 5pt;
|
|
color: #ffffff;
|
|
font-weight: 600;
|
|
}
|
|
.card-body {
|
|
padding: 5pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
min-height: 25pt;
|
|
}
|
|
.card-body p {
|
|
font-size: 7pt;
|
|
color: #1e293b;
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* Data Table */
|
|
.data-table {
|
|
background: #1e293b;
|
|
border-radius: 2pt;
|
|
overflow: hidden;
|
|
}
|
|
.table-row {
|
|
display: flex;
|
|
border-bottom: 0.5pt solid #334155;
|
|
}
|
|
.table-row:last-child { border-bottom: none; }
|
|
.table-cell {
|
|
flex: 1;
|
|
padding: 4pt 8pt;
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
.table-cell.label { flex: 0 0 100pt; }
|
|
.table-cell p {
|
|
font-size: 6pt;
|
|
color: #94a3b8;
|
|
}
|
|
.table-cell.value p { color: #ffffff; }
|
|
.table-cell.highlight p {
|
|
font-size: 10pt;
|
|
font-weight: 700;
|
|
color: #ffffff;
|
|
}
|
|
.table-cell.accent p {
|
|
color: #0d9488;
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* Warning Box */
|
|
.warning-box {
|
|
background: #dc2626;
|
|
border-radius: 2pt;
|
|
padding: 4pt 6pt;
|
|
}
|
|
.warning-box p {
|
|
font-size: 5pt;
|
|
color: #ffffff;
|
|
}
|
|
|
|
/* Button */
|
|
.button {
|
|
background: #0d9488;
|
|
border-radius: 2pt;
|
|
padding: 5pt 12pt;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
.button p {
|
|
font-size: 7pt;
|
|
color: #ffffff;
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* Description Panel - 흰색 배경, 투명한 항목 */
|
|
.description-panel {
|
|
width: 145pt;
|
|
background: #ffffff;
|
|
border: 0.5pt solid #e2e8f0;
|
|
border-radius: 2pt;
|
|
padding: 8pt;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
.description-header {
|
|
background: #95C11F;
|
|
padding: 4pt 8pt;
|
|
border-radius: 2pt;
|
|
margin-bottom: 10pt;
|
|
}
|
|
.description-header p {
|
|
font-size: 7pt;
|
|
font-weight: 600;
|
|
color: #ffffff;
|
|
text-align: center;
|
|
}
|
|
.description-item {
|
|
margin-bottom: 10pt;
|
|
/* 배경 없음 - 투명 */
|
|
}
|
|
.description-item-header {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 5pt;
|
|
margin-bottom: 3pt;
|
|
}
|
|
.description-number {
|
|
width: 14pt;
|
|
height: 14pt;
|
|
background: #dc2626;
|
|
border-radius: 50%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
flex-shrink: 0;
|
|
}
|
|
.description-number p {
|
|
font-size: 6pt;
|
|
font-weight: 700;
|
|
color: #ffffff;
|
|
}
|
|
.description-title p {
|
|
font-size: 6pt;
|
|
font-weight: 700;
|
|
color: #1e293b;
|
|
}
|
|
.description-content {
|
|
padding-left: 17pt;
|
|
}
|
|
.description-content p {
|
|
font-size: 5pt;
|
|
color: #64748b;
|
|
line-height: 1.4;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<!-- Header Table -->
|
|
<div class="header-table">
|
|
<div class="header-row">
|
|
<div class="header-cell label"><p>Task Name</p></div>
|
|
<div class="header-cell value"><p>설정</p></div>
|
|
<div class="header-cell label"><p>Ver.</p></div>
|
|
<div class="header-cell small"><p>D1.0</p></div>
|
|
<div class="header-cell label"><p>Page</p></div>
|
|
<div class="header-cell small"><p>11</p></div>
|
|
</div>
|
|
<div class="header-row">
|
|
<div class="header-cell label"><p>Route</p></div>
|
|
<div class="header-cell value"><p>/tutorial-video/architecture</p></div>
|
|
<div class="header-cell label"><p>Screen Name</p></div>
|
|
<div class="header-cell value"><p>시스템 아키텍처</p></div>
|
|
<div class="header-cell label"><p>Screen ID</p></div>
|
|
<div class="header-cell medium"><p>TUT_006</p></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Main Content -->
|
|
<div class="main-content">
|
|
<!-- Wireframe Area -->
|
|
<div class="wireframe-area">
|
|
<div class="wireframe-header">
|
|
<p>SAM 사용법 영상 자동 생성 시스템</p>
|
|
</div>
|
|
<div class="wireframe-body">
|
|
<div class="sidebar">
|
|
|
|
<div class="sidebar-item ">
|
|
<p>영상 생성</p>
|
|
</div>
|
|
|
|
<div class="sidebar-item ">
|
|
<p>생성 이력</p>
|
|
</div>
|
|
|
|
<div class="sidebar-item active">
|
|
<p>설정</p>
|
|
</div>
|
|
|
|
</div>
|
|
<div class="content-area">
|
|
|
|
<div style="position: relative; flex: 1; min-height: 200pt;">
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 5.200000000000005pt;
|
|
top: -2.6000000000000023pt;
|
|
width: 275.59999999999997pt;
|
|
height: 18.2pt;
|
|
background: #1e293b;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 7.699999999999999pt;
|
|
color: #FFFFFF;
|
|
font-weight: 700;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">시스템 아키텍처</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 5.200000000000005pt;
|
|
top: 23.4pt;
|
|
width: 223.6pt;
|
|
height: 13pt;
|
|
background: #0d9488;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 5.6pt;
|
|
color: #FFFFFF;
|
|
font-weight: 700;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">MNG (Laravel) - 서비스 레이어</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 10.399999999999999pt;
|
|
top: 41.599999999999994pt;
|
|
width: 67.60000000000001pt;
|
|
height: 26pt;
|
|
background: #f1f5f9;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 4.8999999999999995pt;
|
|
color: #1e293b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">Tutorial<br>VideoController</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 83.2pt;
|
|
top: 46.8pt;
|
|
width: 10.4pt;
|
|
height: 15.6pt;
|
|
background: transparent;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 7pt;
|
|
color: #64748b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">→</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 98.8pt;
|
|
top: 41.599999999999994pt;
|
|
width: 62.4pt;
|
|
height: 26pt;
|
|
background: #f1f5f9;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 4.8999999999999995pt;
|
|
color: #1e293b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">Screen<br>AnalysisService</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 166.4pt;
|
|
top: 46.8pt;
|
|
width: 10.4pt;
|
|
height: 15.6pt;
|
|
background: transparent;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 7pt;
|
|
color: #64748b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">→</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 182pt;
|
|
top: 41.599999999999994pt;
|
|
width: 62.4pt;
|
|
height: 26pt;
|
|
background: #f1f5f9;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 4.8999999999999995pt;
|
|
color: #1e293b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">SlideImage<br>Service (GD)</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 10.399999999999999pt;
|
|
top: 75.4pt;
|
|
width: 67.60000000000001pt;
|
|
height: 26pt;
|
|
background: #f59e0b;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 4.8999999999999995pt;
|
|
color: #FFFFFF;
|
|
font-weight: 700;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">Tutorial<br>VideoJob</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 83.2pt;
|
|
top: 80.6pt;
|
|
width: 10.4pt;
|
|
height: 15.6pt;
|
|
background: transparent;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 7pt;
|
|
color: #64748b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">→</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 98.8pt;
|
|
top: 75.4pt;
|
|
width: 62.4pt;
|
|
height: 26pt;
|
|
background: #f1f5f9;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 4.8999999999999995pt;
|
|
color: #1e293b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">TTS Service<br>(기존 재사용)</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 166.4pt;
|
|
top: 80.6pt;
|
|
width: 10.4pt;
|
|
height: 15.6pt;
|
|
background: transparent;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 7pt;
|
|
color: #64748b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">→</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 182pt;
|
|
top: 75.4pt;
|
|
width: 62.4pt;
|
|
height: 26pt;
|
|
background: #f1f5f9;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 4.8999999999999995pt;
|
|
color: #1e293b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">Tutorial<br>Assembly (FFmpeg)</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 10.399999999999999pt;
|
|
top: 109.2pt;
|
|
width: 67.60000000000001pt;
|
|
height: 26pt;
|
|
background: #f1f5f9;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 4.8999999999999995pt;
|
|
color: #1e293b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">Pptx<br>Generator</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 98.8pt;
|
|
top: 109.2pt;
|
|
width: 62.4pt;
|
|
height: 26pt;
|
|
background: #f1f5f9;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 4.8999999999999995pt;
|
|
color: #1e293b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">BGM Service<br>(기존 재사용)</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 182pt;
|
|
top: 109.2pt;
|
|
width: 98.8pt;
|
|
height: 13pt;
|
|
background: #0d9488;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 5.6pt;
|
|
color: #FFFFFF;
|
|
font-weight: 700;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">Google Cloud APIs</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 182pt;
|
|
top: 124.8pt;
|
|
width: 46.800000000000004pt;
|
|
height: 18.2pt;
|
|
background: #f1f5f9;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 4.199999999999999pt;
|
|
color: #1e293b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">Gemini<br>3.0 Flash</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 231.4pt;
|
|
top: 124.8pt;
|
|
width: 46.800000000000004pt;
|
|
height: 18.2pt;
|
|
background: #f1f5f9;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 4.199999999999999pt;
|
|
color: #1e293b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">Cloud<br>TTS</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 182pt;
|
|
top: 145.6pt;
|
|
width: 46.800000000000004pt;
|
|
height: 18.2pt;
|
|
background: #f1f5f9;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 4.199999999999999pt;
|
|
color: #1e293b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">Lyria<br>BGM</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 231.4pt;
|
|
top: 145.6pt;
|
|
width: 46.800000000000004pt;
|
|
height: 18.2pt;
|
|
background: #f1f5f9;
|
|
border-radius: 2pt;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2pt 4pt;
|
|
box-sizing: border-box;
|
|
">
|
|
<p style="
|
|
font-size: 4.199999999999999pt;
|
|
color: #1e293b;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
line-height: 1.3;
|
|
margin: 0;
|
|
">GCS<br>저장소</p>
|
|
</div>
|
|
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 78pt;
|
|
top: 28.6pt;
|
|
width: 14pt;
|
|
height: 14pt;
|
|
background: #dc2626;
|
|
border-radius: 50%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
z-index: 100;
|
|
box-shadow: 0 1pt 3pt rgba(0,0,0,0.3);
|
|
">
|
|
<p style="
|
|
font-size: 7pt;
|
|
font-weight: 700;
|
|
color: white;
|
|
margin: 0;
|
|
">1</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 26pt;
|
|
top: 80.6pt;
|
|
width: 14pt;
|
|
height: 14pt;
|
|
background: #dc2626;
|
|
border-radius: 50%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
z-index: 100;
|
|
box-shadow: 0 1pt 3pt rgba(0,0,0,0.3);
|
|
">
|
|
<p style="
|
|
font-size: 7pt;
|
|
font-weight: 700;
|
|
color: white;
|
|
margin: 0;
|
|
">2</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 208pt;
|
|
top: 101.4pt;
|
|
width: 14pt;
|
|
height: 14pt;
|
|
background: #dc2626;
|
|
border-radius: 50%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
z-index: 100;
|
|
box-shadow: 0 1pt 3pt rgba(0,0,0,0.3);
|
|
">
|
|
<p style="
|
|
font-size: 7pt;
|
|
font-weight: 700;
|
|
color: white;
|
|
margin: 0;
|
|
">3</p>
|
|
</div>
|
|
|
|
<div style="
|
|
position: absolute;
|
|
left: 208pt;
|
|
top: 143pt;
|
|
width: 14pt;
|
|
height: 14pt;
|
|
background: #dc2626;
|
|
border-radius: 50%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
z-index: 100;
|
|
box-shadow: 0 1pt 3pt rgba(0,0,0,0.3);
|
|
">
|
|
<p style="
|
|
font-size: 7pt;
|
|
font-weight: 700;
|
|
color: white;
|
|
margin: 0;
|
|
">4</p>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Description Panel -->
|
|
<div class="description-panel">
|
|
<div class="description-header">
|
|
<p>Description</p>
|
|
</div>
|
|
|
|
<div class="description-item">
|
|
<div class="description-item-header">
|
|
<div class="description-number">
|
|
<p>1</p>
|
|
</div>
|
|
<div class="description-title">
|
|
<p>MNG (Laravel) 서비스</p>
|
|
</div>
|
|
</div>
|
|
<div class="description-content">
|
|
<p>TutorialVideoController → ScreenAnalysisService(Gemini) → SlideImageService(PHP GD) → TutorialAssemblyService(FFmpeg) 순서로 처리됩니다.</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="description-item">
|
|
<div class="description-item-header">
|
|
<div class="description-number">
|
|
<p>2</p>
|
|
</div>
|
|
<div class="description-title">
|
|
<p>Queue Job 비동기 처리</p>
|
|
</div>
|
|
</div>
|
|
<div class="description-content">
|
|
<p>영상 생성은 TutorialVideoJob으로 Queue에 등록되어 비동기로 처리됩니다. 진행률을 실시간 조회 가능합니다.</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="description-item">
|
|
<div class="description-item-header">
|
|
<div class="description-number">
|
|
<p>3</p>
|
|
</div>
|
|
<div class="description-title">
|
|
<p>Google Cloud APIs</p>
|
|
</div>
|
|
</div>
|
|
<div class="description-content">
|
|
<p>Gemini 3.0 Flash(스크린샷 분석), Cloud TTS(나레이션), Lyria(BGM), GCS(영상 저장)를 활용합니다.</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="description-item">
|
|
<div class="description-item-header">
|
|
<div class="description-number">
|
|
<p>4</p>
|
|
</div>
|
|
<div class="description-title">
|
|
<p>기존 코드 재사용</p>
|
|
</div>
|
|
</div>
|
|
<div class="description-content">
|
|
<p>TtsService, BgmService, GCS 서비스 등 Veo3 Shorts에서 이미 구현된 서비스를 재사용합니다.</p>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html> |