Spaces:
Running
Running
<html lang="ko"> | |
<head> | |
<meta charset="UTF-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<title>AI SAAS Build Calculator</title> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.min.js"></script> | |
<style> | |
* { | |
margin: 0; | |
padding: 0; | |
box-sizing: border-box; | |
} | |
body { | |
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; | |
background: linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%); | |
color: #ffffff; | |
min-height: 100vh; | |
overflow-x: hidden; | |
} | |
.container { | |
max-width: 1400px; | |
margin: 0 auto; | |
padding: 2rem; | |
} | |
header { | |
text-align: center; | |
margin-bottom: 3rem; | |
animation: fadeInDown 0.8s ease-out; | |
} | |
h1 { | |
font-size: 3rem; | |
margin-bottom: 1rem; | |
background: linear-gradient(45deg, #00d2ff, #3a7bd5, #00d2ff); | |
background-size: 200% auto; | |
-webkit-background-clip: text; | |
-webkit-text-fill-color: transparent; | |
animation: gradient 3s ease infinite; | |
} | |
@keyframes gradient { | |
0% { background-position: 0% 50%; } | |
50% { background-position: 100% 50%; } | |
100% { background-position: 0% 50%; } | |
} | |
.subtitle { | |
font-size: 1.2rem; | |
color: #a8a8b3; | |
} | |
.tabs { | |
display: flex; | |
justify-content: center; | |
margin-bottom: 3rem; | |
background: rgba(255, 255, 255, 0.05); | |
backdrop-filter: blur(10px); | |
border-radius: 15px; | |
padding: 0.5rem; | |
gap: 0.5rem; | |
} | |
.tab { | |
padding: 1rem 2rem; | |
background: transparent; | |
border: none; | |
color: #a8a8b3; | |
cursor: pointer; | |
border-radius: 10px; | |
transition: all 0.3s ease; | |
font-size: 1.1rem; | |
font-weight: 500; | |
} | |
.tab.active { | |
background: linear-gradient(45deg, #00d2ff, #3a7bd5); | |
color: #ffffff; | |
transform: scale(1.05); | |
} | |
.tab:hover:not(.active) { | |
background: rgba(255, 255, 255, 0.1); | |
color: #ffffff; | |
} | |
.tab-content { | |
display: none; | |
} | |
.tab-content.active { | |
display: block; | |
animation: fadeIn 0.5s ease; | |
} | |
@keyframes fadeIn { | |
from { opacity: 0; } | |
to { opacity: 1; } | |
} | |
.methods-grid { | |
display: grid; | |
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); | |
gap: 2rem; | |
margin-bottom: 3rem; | |
} | |
.method-card { | |
background: rgba(255, 255, 255, 0.05); | |
backdrop-filter: blur(10px); | |
border: 1px solid rgba(255, 255, 255, 0.1); | |
border-radius: 20px; | |
padding: 2rem; | |
transition: all 0.3s ease; | |
animation: fadeInUp 0.8s ease-out; | |
position: relative; | |
overflow: hidden; | |
} | |
.method-card::before { | |
content: ''; | |
position: absolute; | |
top: -50%; | |
left: -50%; | |
width: 200%; | |
height: 200%; | |
background: radial-gradient(circle, rgba(58, 123, 213, 0.1) 0%, transparent 70%); | |
opacity: 0; | |
transition: opacity 0.3s ease; | |
} | |
.method-card:hover::before { | |
opacity: 1; | |
} | |
.method-card:hover { | |
transform: translateY(-10px); | |
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3); | |
border-color: rgba(58, 123, 213, 0.5); | |
} | |
.method-header { | |
display: flex; | |
align-items: center; | |
margin-bottom: 1.5rem; | |
} | |
.method-icon { | |
width: 60px; | |
height: 60px; | |
margin-right: 1rem; | |
display: flex; | |
align-items: center; | |
justify-content: center; | |
border-radius: 15px; | |
font-size: 2rem; | |
} | |
.outsource-icon { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); } | |
.inhouse-icon { background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); } | |
.platform-icon { background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); } | |
.method-title { | |
font-size: 1.5rem; | |
font-weight: 700; | |
} | |
.method-description { | |
color: #a8a8b3; | |
margin-bottom: 1.5rem; | |
line-height: 1.6; | |
} | |
.cost-breakdown { | |
background: rgba(0, 0, 0, 0.2); | |
border-radius: 10px; | |
padding: 1rem; | |
margin-bottom: 1.5rem; | |
} | |
.cost-item { | |
display: flex; | |
justify-content: space-between; | |
margin-bottom: 0.5rem; | |
padding: 0.5rem 0; | |
border-bottom: 1px solid rgba(255, 255, 255, 0.05); | |
} | |
.cost-item:last-child { | |
border-bottom: none; | |
} | |
.pros-cons { | |
display: grid; | |
grid-template-columns: 1fr 1fr; | |
gap: 1rem; | |
margin-top: 1.5rem; | |
} | |
.pros, .cons { | |
padding: 1rem; | |
border-radius: 10px; | |
font-size: 0.9rem; | |
} | |
.pros { | |
background: rgba(46, 213, 115, 0.1); | |
border: 1px solid rgba(46, 213, 115, 0.3); | |
} | |
.cons { | |
background: rgba(255, 71, 87, 0.1); | |
border: 1px solid rgba(255, 71, 87, 0.3); | |
} | |
.pros h4, .cons h4 { | |
margin-bottom: 0.5rem; | |
font-size: 1rem; | |
} | |
.pros ul, .cons ul { | |
list-style: none; | |
padding-left: 0; | |
} | |
.pros li::before { | |
content: "โ "; | |
color: #2ed573; | |
font-weight: bold; | |
} | |
.cons li::before { | |
content: "โ "; | |
color: #ff4757; | |
font-weight: bold; | |
} | |
.calculator-section { | |
background: rgba(255, 255, 255, 0.05); | |
backdrop-filter: blur(10px); | |
border: 1px solid rgba(255, 255, 255, 0.1); | |
border-radius: 20px; | |
padding: 2rem; | |
margin-bottom: 3rem; | |
animation: fadeInUp 1s ease-out; | |
} | |
.calculator-title { | |
font-size: 2rem; | |
margin-bottom: 2rem; | |
text-align: center; | |
} | |
.input-group { | |
display: grid; | |
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); | |
gap: 1.5rem; | |
margin-bottom: 2rem; | |
} | |
.input-field { | |
display: flex; | |
flex-direction: column; | |
} | |
.input-field label { | |
margin-bottom: 0.5rem; | |
color: #a8a8b3; | |
font-size: 0.9rem; | |
} | |
.input-field input, .input-field select { | |
background: rgba(255, 255, 255, 0.1); | |
border: 1px solid rgba(255, 255, 255, 0.2); | |
border-radius: 10px; | |
padding: 0.75rem 1rem; | |
color: #ffffff; | |
font-size: 1rem; | |
transition: all 0.3s ease; | |
} | |
.input-field input:focus, .input-field select:focus { | |
outline: none; | |
border-color: #3a7bd5; | |
background: rgba(255, 255, 255, 0.15); | |
} | |
.input-field select option { | |
background: #24243e; | |
} | |
.calculate-btn { | |
background: linear-gradient(45deg, #00d2ff, #3a7bd5); | |
border: none; | |
border-radius: 10px; | |
padding: 1rem 2rem; | |
font-size: 1.1rem; | |
font-weight: 600; | |
color: #ffffff; | |
cursor: pointer; | |
transition: all 0.3s ease; | |
display: block; | |
margin: 0 auto; | |
} | |
.calculate-btn:hover { | |
transform: translateY(-2px); | |
box-shadow: 0 10px 20px rgba(58, 123, 213, 0.3); | |
} | |
.results-section { | |
margin-top: 3rem; | |
display: none; | |
} | |
.results-grid { | |
display: grid; | |
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); | |
gap: 2rem; | |
margin-bottom: 2rem; | |
} | |
.result-card { | |
background: rgba(0, 0, 0, 0.3); | |
border-radius: 15px; | |
padding: 1.5rem; | |
text-align: center; | |
} | |
.result-value { | |
font-size: 2.5rem; | |
font-weight: 700; | |
margin: 1rem 0; | |
background: linear-gradient(45deg, #00d2ff, #3a7bd5); | |
-webkit-background-clip: text; | |
-webkit-text-fill-color: transparent; | |
} | |
.chart-container { | |
position: relative; | |
height: 400px; | |
background: rgba(0, 0, 0, 0.3); | |
border-radius: 15px; | |
padding: 1.5rem; | |
margin-top: 2rem; | |
} | |
/* ๋ง์ถค ์ค๊ณ ์คํ์ผ */ | |
.custom-design-container { | |
background: rgba(255, 255, 255, 0.05); | |
backdrop-filter: blur(10px); | |
border: 1px solid rgba(255, 255, 255, 0.1); | |
border-radius: 20px; | |
padding: 2rem; | |
} | |
.component-section { | |
margin-bottom: 2.5rem; | |
} | |
.component-title { | |
font-size: 1.3rem; | |
margin-bottom: 1rem; | |
display: flex; | |
align-items: center; | |
gap: 0.5rem; | |
} | |
.component-icon { | |
width: 30px; | |
height: 30px; | |
background: linear-gradient(45deg, #00d2ff, #3a7bd5); | |
border-radius: 8px; | |
display: flex; | |
align-items: center; | |
justify-content: center; | |
font-size: 1.2rem; | |
} | |
.component-options { | |
display: grid; | |
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); | |
gap: 1rem; | |
} | |
.option-card { | |
background: rgba(255, 255, 255, 0.05); | |
border: 2px solid rgba(255, 255, 255, 0.2); | |
border-radius: 10px; | |
padding: 1rem; | |
cursor: pointer; | |
transition: all 0.3s ease; | |
position: relative; | |
overflow: hidden; | |
} | |
.option-card.selected { | |
background: rgba(58, 123, 213, 0.3); | |
border-color: #3a7bd5; | |
transform: scale(1.05); | |
box-shadow: 0 5px 20px rgba(58, 123, 213, 0.3); | |
} | |
.option-card.selected::after { | |
content: 'โ'; | |
position: absolute; | |
top: 0.5rem; | |
right: 0.5rem; | |
background: #3a7bd5; | |
color: white; | |
width: 25px; | |
height: 25px; | |
border-radius: 50%; | |
display: flex; | |
align-items: center; | |
justify-content: center; | |
font-weight: bold; | |
} | |
.option-card:hover { | |
border-color: #00d2ff; | |
background: rgba(255, 255, 255, 0.1); | |
transform: translateY(-2px); | |
} | |
.option-name { | |
font-weight: 600; | |
margin-bottom: 0.5rem; | |
} | |
.option-details { | |
display: flex; | |
justify-content: space-between; | |
font-size: 0.9rem; | |
color: #a8a8b3; | |
} | |
.custom-result { | |
background: rgba(0, 0, 0, 0.3); | |
border-radius: 15px; | |
padding: 2rem; | |
margin-top: 2rem; | |
display: none; | |
} | |
.result-header { | |
text-align: center; | |
margin-bottom: 2rem; | |
} | |
.result-header h3 { | |
font-size: 1.8rem; | |
margin-bottom: 0.5rem; | |
color: #00d2ff; | |
} | |
.period-tabs { | |
display: flex; | |
justify-content: center; | |
gap: 1rem; | |
margin-bottom: 2rem; | |
} | |
.period-tab { | |
padding: 0.5rem 1.5rem; | |
background: rgba(255, 255, 255, 0.1); | |
border: 1px solid rgba(255, 255, 255, 0.2); | |
border-radius: 20px; | |
cursor: pointer; | |
transition: all 0.3s ease; | |
} | |
.period-tab.active { | |
background: linear-gradient(45deg, #00d2ff, #3a7bd5); | |
border-color: transparent; | |
} | |
.custom-summary { | |
display: grid; | |
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); | |
gap: 2rem; | |
margin-bottom: 2rem; | |
} | |
.summary-item { | |
text-align: center; | |
} | |
.summary-label { | |
color: #a8a8b3; | |
margin-bottom: 0.5rem; | |
} | |
.summary-value { | |
font-size: 2rem; | |
font-weight: 700; | |
background: linear-gradient(45deg, #00d2ff, #3a7bd5); | |
-webkit-background-clip: text; | |
-webkit-text-fill-color: transparent; | |
} | |
.selected-components { | |
background: rgba(255, 255, 255, 0.05); | |
border-radius: 10px; | |
padding: 1.5rem; | |
margin-bottom: 1.5rem; | |
} | |
.selected-components h4 { | |
margin-bottom: 1rem; | |
font-size: 1.2rem; | |
} | |
.component-list { | |
display: grid; | |
gap: 0.5rem; | |
} | |
.component-list-item { | |
display: flex; | |
justify-content: space-between; | |
padding: 0.75rem; | |
border-bottom: 1px solid rgba(255, 255, 255, 0.1); | |
background: rgba(255, 255, 255, 0.02); | |
border-radius: 5px; | |
} | |
.component-list-item:last-child { | |
border-bottom: none; | |
} | |
.monthly-breakdown { | |
display: grid; | |
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); | |
gap: 1rem; | |
margin-top: 1rem; | |
} | |
.monthly-item { | |
background: rgba(255, 255, 255, 0.05); | |
padding: 1rem; | |
border-radius: 10px; | |
text-align: center; | |
} | |
.monthly-label { | |
font-size: 0.9rem; | |
color: #a8a8b3; | |
margin-bottom: 0.5rem; | |
} | |
.monthly-value { | |
font-size: 1.2rem; | |
font-weight: 600; | |
color: #00d2ff; | |
} | |
.build-method-comparison { | |
margin-top: 2rem; | |
} | |
.comparison-grid { | |
display: grid; | |
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); | |
gap: 1.5rem; | |
} | |
.comparison-card { | |
background: rgba(118, 75, 162, 0.1); | |
border: 1px solid rgba(118, 75, 162, 0.3); | |
padding: 1.5rem; | |
border-radius: 10px; | |
} | |
.comparison-card h5 { | |
color: #764ba2; | |
margin-bottom: 1rem; | |
} | |
.comparison-item { | |
display: flex; | |
justify-content: space-between; | |
margin-bottom: 0.5rem; | |
} | |
.periodDisplay { | |
color: #00d2ff; | |
} | |
@keyframes fadeInDown { | |
from { | |
opacity: 0; | |
transform: translateY(-30px); | |
} | |
to { | |
opacity: 1; | |
transform: translateY(0); | |
} | |
} | |
@keyframes fadeInUp { | |
from { | |
opacity: 0; | |
transform: translateY(30px); | |
} | |
to { | |
opacity: 1; | |
transform: translateY(0); | |
} | |
} | |
@media (max-width: 768px) { | |
h1 { | |
font-size: 2rem; | |
} | |
.methods-grid { | |
grid-template-columns: 1fr; | |
} | |
.pros-cons { | |
grid-template-columns: 1fr; | |
} | |
.tabs { | |
flex-direction: column; | |
} | |
.tab { | |
width: 100%; | |
} | |
} | |
</style> | |
</head> | |
<body> | |
<div class="container"> | |
<header> | |
<h1>AI SAAS Build Calculator</h1> | |
<p class="subtitle">์ต์ ์ AI ์๋น์ค ๊ตฌ์ถ ๋ฐฉ์์ ์ฐพ์๋๋ฆฝ๋๋ค</p> | |
</header> | |
<div class="tabs"> | |
<button class="tab active" onclick="switchTab('custom')">AI SaaS ๋ง์ถค ์ค๊ณ ๊ณ์ฐ๊ธฐ</button> | |
</div> | |
<!-- AI SaaS ๋ง์ถค ์ค๊ณ ํญ --> | |
<div id="custom" class="tab-content active"> | |
<div class="custom-design-container"> | |
<h2 class="calculator-title">๋๋ง์ AI SaaS ๋ง์ถค ์ค๊ณ</h2> | |
<!-- ํ๊น ์๋น์ค ์ ํ --> | |
<div class="component-section"> | |
<div class="component-title"> | |
<div class="component-icon">๐ฏ</div> | |
<span>ํ๊น ์๋น์ค ์ ํ (ํ์, ๋ณต์ ์ ํ ๊ฐ๋ฅ)</span> | |
</div> | |
<!-- AI ์ด๋ฏธ์ง ๊ด๋ จ --> | |
<h4 style="color: #00d2ff; margin: 1.5rem 0 1rem 0;">๐ผ๏ธ AI ์ด๋ฏธ์ง ๊ด๋ จ</h4> | |
<div class="component-options" style="margin-bottom: 2rem;"> | |
<div class="option-card" data-category="service" data-id="image-gen" data-cost="5" data-time="1" data-resource="0.7"> | |
<div class="option-name">AI ์ด๋ฏธ์ง ์์ฑ</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="book-cover" data-cost="7" data-time="1" data-resource="0.7"> | |
<div class="option-name">์ฑ ํ์ง AI ์์ฑ</div> | |
<div class="option-details"> | |
<span>$7K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="bg-removal" data-cost="7" data-time="1" data-resource="0.7"> | |
<div class="option-name">๋ฐฐ๊ฒฝ ์ ๊ฑฐ ๋ฐ ์์ฑ</div> | |
<div class="option-details"> | |
<span>$7K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="image-enhance" data-cost="7" data-time="1" data-resource="1.4"> | |
<div class="option-name">AI ์ด๋ฏธ์ง ํธ์ง/ํฅ์</div> | |
<div class="option-details"> | |
<span>$7K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="image-upscale" data-cost="7" data-time="1" data-resource="1.4"> | |
<div class="option-name">์ด๋ฏธ์ง ์ ์ค์ผ์ผ๋ง</div> | |
<div class="option-details"> | |
<span>$7K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="image-custom" data-cost="50" data-time="1" data-resource="20"> | |
<div class="option-name">์ด๋ฏธ์ง ์ํฐํ๋ผ์ด์ฆ ์ปค์คํ </div> | |
<div class="option-details"> | |
<span>$50K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
<!-- AI ๋น๋์ค ๊ด๋ จ --> | |
<h4 style="color: #00d2ff; margin: 1.5rem 0 1rem 0;">๐ฅ AI ๋น๋์ค ๊ด๋ จ</h4> | |
<div class="component-options" style="margin-bottom: 2rem;"> | |
<div class="option-card" data-category="service" data-id="video-gen" data-cost="20" data-time="1" data-resource="10"> | |
<div class="option-name">AI ๋น๋์ค ์์ฑ</div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="video-edit" data-cost="20" data-time="1" data-resource="10"> | |
<div class="option-name">AI ๋น๋์ค ํธ์ง</div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="avatar-video" data-cost="20" data-time="1" data-resource="10"> | |
<div class="option-name">AI ์๋ฐํ ๋น๋์ค</div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="auto-subtitle" data-cost="7" data-time="1" data-resource="0.7"> | |
<div class="option-name">์๋ ์๋ง ์์ฑ</div> | |
<div class="option-details"> | |
<span>$7K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="shortform" data-cost="20" data-time="1" data-resource="100"> | |
<div class="option-name">AI ์ํผ ๋น๋์ค</div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="video-custom" data-cost="50" data-time="1" data-resource="20"> | |
<div class="option-name">๋น๋์ค ์ํฐํ๋ผ์ด์ฆ ์ปค์คํ </div> | |
<div class="option-details"> | |
<span>$50K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
<!-- AI ์ค๋์ค ๊ด๋ จ --> | |
<h4 style="color: #00d2ff; margin: 1.5rem 0 1rem 0;">๐ต AI ์ค๋์ค ๊ด๋ จ</h4> | |
<div class="component-options" style="margin-bottom: 2rem;"> | |
<div class="option-card" data-category="service" data-id="sound-gen" data-cost="5" data-time="1" data-resource="0.7"> | |
<div class="option-name">AI ์ํฅ ์์ฑ</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="music-gen" data-cost="5" data-time="1" data-resource="1.4"> | |
<div class="option-name">AI ์์ ์์ฑ</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="song-gen" data-cost="5" data-time="1" data-resource="1.5"> | |
<div class="option-name">AI ๋ ธ๋ ์์ฑ (์์ +๊ฐ์ฌ+๋ณด์ปฌ)</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="music-video" data-cost="5" data-time="1" data-resource="12"> | |
<div class="option-name">AI ๋ฎค์ง๋น๋์ค ์์ฑ</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="ai-singer" data-cost="30" data-time="1" data-resource="20"> | |
<div class="option-name">AI ๊ฐ์ ์์ฑ (ํํจํค์ง)</div> | |
<div class="option-details"> | |
<span>$30K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="voice-clone" data-cost="5" data-time="1" data-resource="2.5"> | |
<div class="option-name">์์ฑ ๋ณต์ /ํฉ์ฑ</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="tts" data-cost="5" data-time="1" data-resource="1.4"> | |
<div class="option-name">ํ ์คํธ TO ์์ฑ ๋ณํ</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="stt" data-cost="5" data-time="1" data-resource="3"> | |
<div class="option-name">์์ฑ TO ํ ์คํธ ๋ณํ</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="podcast" data-cost="5" data-time="1" data-resource="3"> | |
<div class="option-name">AI ํ์บ์คํธ ์ ์</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="audio-custom" data-cost="50" data-time="1" data-resource="20"> | |
<div class="option-name">์ค๋์ค ์ํฐํ๋ผ์ด์ฆ ์ปค์คํ </div> | |
<div class="option-details"> | |
<span>$50K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
<!-- AI ํ ์คํธ ๊ด๋ จ --> | |
<h4 style="color: #00d2ff; margin: 1.5rem 0 1rem 0;">๐ฌ AI ํ ์คํธ ๊ด๋ จ</h4> | |
<div class="component-options" style="margin-bottom: 2rem;"> | |
<div class="option-card" data-category="service" data-id="chatbot-text" data-cost="5" data-time="1" data-resource="0.7"> | |
<div class="option-name">AI ์ฑ๋ด (ํ ์คํธ)</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="chatbot-rag" data-cost="5" data-time="1" data-resource="1.4"> | |
<div class="option-name">AI ์ฑ๋ด (ํ ์คํธ+RAG)</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="chatbot-voice" data-cost="5" data-time="1" data-resource="1.5"> | |
<div class="option-name">AI ์ฑ๋ด (ํ ์คํธ+์์ฑ)</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="chatbot-full" data-cost="5" data-time="1" data-resource="3"> | |
<div class="option-name">AI ์ฑ๋ด (ํ ์คํธ+์์ฑ+RAG)</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="translation" data-cost="5" data-time="1" data-resource="0.7"> | |
<div class="option-name">AI ๋ฒ์ญ ์๋น์ค</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="email-writing" data-cost="5" data-time="1" data-resource="0.7"> | |
<div class="option-name">AI ์ด๋ฉ์ผ/๋ฌธ์ ์์ฑ</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="code-assistant" data-cost="5" data-time="1" data-resource="0.7"> | |
<div class="option-name">AI ์ฝ๋ ์ด์์คํดํธ</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="text-custom" data-cost="50" data-time="1" data-resource="20"> | |
<div class="option-name">ํ ์คํธ ์ํฐํ๋ผ์ด์ฆ ์ปค์คํ </div> | |
<div class="option-details"> | |
<span>$50K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
<!-- AI ๋ถ์ ๋๊ตฌ --> | |
<h4 style="color: #00d2ff; margin: 1.5rem 0 1rem 0;">๐ AI ๋ถ์ ๋๊ตฌ</h4> | |
<div class="component-options" style="margin-bottom: 2rem;"> | |
<div class="option-card" data-category="service" data-id="data-analysis" data-cost="5" data-time="1" data-resource="0.7"> | |
<div class="option-name">AI ๋ฐ์ดํฐ ๋ถ์</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="ocr" data-cost="5" data-time="1" data-resource="2"> | |
<div class="option-name">AI OCR ์๋น์ค</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="computer-vision" data-cost="5" data-time="1" data-resource="1.4"> | |
<div class="option-name">์ปดํจํฐ ๋น์ </div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="sentiment-analysis" data-cost="5" data-time="1" data-resource="0.7"> | |
<div class="option-name">๊ฐ์ ๋ถ์ AI</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="analysis-custom" data-cost="50" data-time="1" data-resource="20"> | |
<div class="option-name">๋ถ์ ์ํฐํ๋ผ์ด์ฆ ์ปค์คํ </div> | |
<div class="option-details"> | |
<span>$50K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
<!-- AI ์ฝํ ์ธ ์์ฑ --> | |
<h4 style="color: #00d2ff; margin: 1.5rem 0 1rem 0;">๐ AI ์ฝํ ์ธ ์์ฑ</h4> | |
<div class="component-options" style="margin-bottom: 2rem;"> | |
<div class="option-card" data-category="service" data-id="novel" data-cost="20" data-time="1" data-resource="20"> | |
<div class="option-name">AI ์์ค ์์ฑ</div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="webnovel" data-cost="20" data-time="1" data-resource="20"> | |
<div class="option-name">AI ์น์์ค ์์ฑ</div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="webtoon" data-cost="20" data-time="1" data-resource="20"> | |
<div class="option-name">AI ์นํฐ ์์ฑ</div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="ai-book" data-cost="20" data-time="1" data-resource="2"> | |
<div class="option-name">AI BOOK ์ ์</div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="ecommerce" data-cost="20" data-time="1" data-resource="20"> | |
<div class="option-name">์ด์ปค๋จธ์ค AI (์ํ์ค๋ช )</div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
<!-- AI ์ ๋ฌธ ์๋น์ค --> | |
<h4 style="color: #00d2ff; margin: 1.5rem 0 1rem 0;">โ๏ธ AI ์ ๋ฌธ ์๋น์ค</h4> | |
<div class="component-options" style="margin-bottom: 2rem;"> | |
<div class="option-card" data-category="service" data-id="medical" data-cost="20" data-time="1" data-resource="5"> | |
<div class="option-name">AI ์๋ฃ ์ด์์คํดํธ</div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="legal" data-cost="20" data-time="1" data-resource="5"> | |
<div class="option-name">AI ๋ฒ๋ฅ ์ด์์คํดํธ</div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="education" data-cost="20" data-time="1" data-resource="5"> | |
<div class="option-name">AI ๊ต์ก/ํํฐ๋ง</div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
<!-- AI ์๋ฎฌ๋ ์ด์ --> | |
<h4 style="color: #00d2ff; margin: 1.5rem 0 1rem 0;">๐ญ AI ์๋ฎฌ๋ ์ด์ </h4> | |
<div class="component-options" style="margin-bottom: 2rem;"> | |
<div class="option-card" data-category="service" data-id="hairstyle" data-cost="20" data-time="1" data-resource="1.2"> | |
<div class="option-name">ํค์ด์คํ์ผ AI ์๋ฎฌ๋ ์ด์ </div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="fashion" data-cost="7" data-time="1" data-resource="0.7"> | |
<div class="option-name">ํจ์ ๊ฐ์ ํผํ AI</div> | |
<div class="option-details"> | |
<span>$7K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="3d-model" data-cost="20" data-time="1" data-resource="2"> | |
<div class="option-name">AI 3D ๋ชจ๋ธ ์์ฑ</div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="nsfw" data-cost="20" data-time="1" data-resource="0.7"> | |
<div class="option-name">NSFW ์ด๋ฏธ์ง ์์ฑ</div> | |
<div class="option-details"> | |
<span>$20K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
<!-- ์ปค์คํ ๋ชจ๋ธ --> | |
<h4 style="color: #00d2ff; margin: 1.5rem 0 1rem 0;">๐ง ์ปค์คํ ๋ชจ๋ธ</h4> | |
<div class="component-options" style="margin-bottom: 2rem;"> | |
<div class="option-card" data-category="service" data-id="llm-finetune" data-cost="200" data-time="1" data-resource="20"> | |
<div class="option-name">๋ชจ๋ธ: LLM(ํ์ธํ๋)</div> | |
<div class="option-details"> | |
<span>$200K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="image-lora" data-cost="50" data-time="1" data-resource="20"> | |
<div class="option-name">๋ชจ๋ธ: ์ด๋ฏธ์ง ์์ฑ(LoRA)</div> | |
<div class="option-details"> | |
<span>$50K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="gen-lora" data-cost="50" data-time="1" data-resource="20"> | |
<div class="option-name">๋ชจ๋ธ: ์์ฑ(LoRA)</div> | |
<div class="option-details"> | |
<span>$50K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="vision-model" data-cost="50" data-time="1" data-resource="20"> | |
<div class="option-name">๋ชจ๋ธ: ๋น์ ์ธ์</div> | |
<div class="option-details"> | |
<span>$50K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="service" data-id="custom-model" data-cost="50" data-time="1" data-resource="20"> | |
<div class="option-name">๋ง์ถค ์ฃผ๋ฌธํ ๋ชจ๋ธ</div> | |
<div class="option-details"> | |
<span>$50K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- DB ๊ด๋ฆฌ --> | |
<div class="component-section"> | |
<div class="component-title"> | |
<div class="component-icon">๐พ</div> | |
<span>DB ๊ด๋ฆฌ</span> | |
</div> | |
<div class="component-options"> | |
<div class="option-card" data-category="db" data-id="basic-db" data-cost="3" data-time="0.5"> | |
<div class="option-name">๊ธฐ๋ณธ DB</div> | |
<div class="option-details"> | |
<span>$3K</span> | |
<span>0.5๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="db" data-id="advanced-db" data-cost="8" data-time="1"> | |
<div class="option-name">๊ณ ๊ธ DB + ๋ฐฑ์ </div> | |
<div class="option-details"> | |
<span>$8K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="db" data-id="enterprise-db" data-cost="12" data-time="1.5"> | |
<div class="option-name">์ํฐํ๋ผ์ด์ฆ DB</div> | |
<div class="option-details"> | |
<span>$12K</span> | |
<span>1.5๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ --> | |
<div class="component-section"> | |
<div class="component-title"> | |
<div class="component-icon">๐</div> | |
<span>ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ</span> | |
</div> | |
<div class="component-options"> | |
<div class="option-card" data-category="auth" data-id="gmail-only" data-cost="2" data-time="0.3"> | |
<div class="option-name">Gmail ์ฐ๋</div> | |
<div class="option-details"> | |
<span>$2K</span> | |
<span>0.3๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="auth" data-id="multi-auth" data-cost="4" data-time="0.5"> | |
<div class="option-name">๋ค์ค ์์ ๋ก๊ทธ์ธ</div> | |
<div class="option-details"> | |
<span>$4K</span> | |
<span>0.5๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="auth" data-id="custom-auth" data-cost="6" data-time="1"> | |
<div class="option-name">์ปค์คํ ์ธ์ฆ ์์คํ </div> | |
<div class="option-details"> | |
<span>$6K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- ํฌ๋ ๋ง ๊ด๋ฆฌ --> | |
<div class="component-section"> | |
<div class="component-title"> | |
<div class="component-icon">๐ฐ</div> | |
<span>ํฌ๋ ๋ง ๊ด๋ฆฌ</span> | |
</div> | |
<div class="component-options"> | |
<div class="option-card" data-category="credit" data-id="basic-credit" data-cost="3" data-time="0.5"> | |
<div class="option-name">๊ธฐ๋ณธ ํฌ๋ ๋ง ์์คํ </div> | |
<div class="option-details"> | |
<span>$3K</span> | |
<span>0.5๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="credit" data-id="advanced-credit" data-cost="6" data-time="1"> | |
<div class="option-name">๊ณ ๊ธ ํฌ๋ ๋ง + ๊ตฌ๋ </div> | |
<div class="option-details"> | |
<span>$6K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- ํ์ด๋จผํธ ์ง์ --> | |
<div class="component-section"> | |
<div class="component-title"> | |
<div class="component-icon">๐ณ</div> | |
<span>ํ์ด๋จผํธ ์ง์</span> | |
</div> | |
<div class="component-options"> | |
<div class="option-card" data-category="payment" data-id="basic-payment" data-cost="4" data-time="0.5"> | |
<div class="option-name">๊ธฐ๋ณธ ๊ฒฐ์ (์นด๋)</div> | |
<div class="option-details"> | |
<span>$4K</span> | |
<span>0.5๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="payment" data-id="multi-payment" data-cost="8" data-time="1"> | |
<div class="option-name">๋ค์ค ๊ฒฐ์ ์๋จ</div> | |
<div class="option-details"> | |
<span>$8K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="payment" data-id="global-payment" data-cost="10" data-time="1.5"> | |
<div class="option-name">๊ธ๋ก๋ฒ ๊ฒฐ์ ์์คํ </div> | |
<div class="option-details"> | |
<span>$10K</span> | |
<span>1.5๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- ๋ง์ผํ ์ง์ --> | |
<div class="component-section"> | |
<div class="component-title"> | |
<div class="component-icon">๐ข</div> | |
<span>๋ง์ผํ ์ง์</span> | |
</div> | |
<div class="component-options"> | |
<div class="option-card" data-category="marketing" data-id="basic-marketing" data-cost="5" data-time="1"> | |
<div class="option-name">๊ธฐ๋ณธ ๋ง์ผํ ๋๊ตฌ</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="marketing" data-id="advanced-marketing" data-cost="10" data-time="1.5"> | |
<div class="option-name">๊ณ ๊ธ ๋ง์ผํ ์๋ํ</div> | |
<div class="option-details"> | |
<span>$10K</span> | |
<span>1.5๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- ๊ฐ๋ฐ ๋ฐ ๊ธฐ์ ์ธ๋ ฅ ์ง์ --> | |
<div class="component-section"> | |
<div class="component-title"> | |
<div class="component-icon">๐จโ๐ป</div> | |
<span>๊ฐ๋ฐ ๋ฐ ๊ธฐ์ ์ธ๋ ฅ ์ง์</span> | |
</div> | |
<div class="component-options"> | |
<div class="option-card" data-category="support" data-id="basic-support" data-cost="3" data-time="0"> | |
<div class="option-name">๊ธฐ๋ณธ ๊ธฐ์ ์ง์</div> | |
<div class="option-details"> | |
<span>์ $3K</span> | |
<span>์ฆ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="support" data-id="dedicated-support" data-cost="8" data-time="0"> | |
<div class="option-name">์ ๋ด ๊ฐ๋ฐ์ ์ง์</div> | |
<div class="option-details"> | |
<span>์ $8K</span> | |
<span>์ฆ์</span> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- ์๊ฒฉ ๋ชจ๋ํฐ๋ง ์ง์ --> | |
<div class="component-section"> | |
<div class="component-title"> | |
<div class="component-icon">๐</div> | |
<span>์๊ฒฉ ๋ชจ๋ํฐ๋ง ์ง์</span> | |
</div> | |
<div class="component-options"> | |
<div class="option-card" data-category="monitoring" data-id="basic-monitor" data-cost="2" data-time="0.3"> | |
<div class="option-name">๊ธฐ๋ณธ ๋ชจ๋ํฐ๋ง</div> | |
<div class="option-details"> | |
<span>$2K</span> | |
<span>0.3๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="monitoring" data-id="advanced-monitor" data-cost="4" data-time="0.5"> | |
<div class="option-name">๊ณ ๊ธ ๋ถ์ + ์๋ฆผ</div> | |
<div class="option-details"> | |
<span>$4K</span> | |
<span>0.5๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- ์ถ๊ฐ ๊ตฌ์ฑ ์์ --> | |
<div class="component-section"> | |
<div class="component-title"> | |
<div class="component-icon">๐ง</div> | |
<span>์ถ๊ฐ ๊ธฐ๋ฅ (๋ณต์ ์ ํ ๊ฐ๋ฅ)</span> | |
</div> | |
<div class="component-options"> | |
<div class="option-card" data-category="additional" data-id="admin-panel" data-cost="5" data-time="0.5"> | |
<div class="option-name">๊ด๋ฆฌ์ ๋์๋ณด๋</div> | |
<div class="option-details"> | |
<span>$5K</span> | |
<span>0.5๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="additional" data-id="api-system" data-cost="8" data-time="1"> | |
<div class="option-name">API ์์คํ </div> | |
<div class="option-details"> | |
<span>$8K</span> | |
<span>1๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="additional" data-id="analytics" data-cost="6" data-time="0.5"> | |
<div class="option-name">๋ถ์ ๋๊ตฌ</div> | |
<div class="option-details"> | |
<span>$6K</span> | |
<span>0.5๊ฐ์</span> | |
</div> | |
</div> | |
<div class="option-card" data-category="additional" data-id="multi-language" data-cost="4" data-time="0.5"> | |
<div class="option-name">๋ค๊ตญ์ด ์ง์</div> | |
<div class="option-details"> | |
<span>$4K</span> | |
<span>0.5๊ฐ์</span> | |
</div> | |
</div> | |
</div> | |
</div> | |
<button class="calculate-btn" onclick="calculateCustomCost()">๋ง์ถค ๊ฒฌ์ ๊ณ์ฐํ๊ธฐ</button> | |
<div class="custom-result" id="customResult"> | |
<div class="result-header"> | |
<h3>๋ง์ถค AI SaaS ๊ฒฌ์ ์</h3> | |
<p>์ ํํ์ ๊ตฌ์ฑ์ผ๋ก ์ฐ์ถ๋ ์์ธ ๊ฒฌ์ ์ ๋๋ค</p> | |
</div> | |
<div class="custom-summary"> | |
<div class="summary-item"> | |
<div class="summary-label">์ด๊ธฐ ๊ฐ๋ฐ ๋น์ฉ</div> | |
<div class="summary-value" id="initialCost">$0K</div> | |
</div> | |
<div class="summary-item"> | |
<div class="summary-label">์์ ๊ฐ๋ฐ ๊ธฐ๊ฐ</div> | |
<div class="summary-value" id="devTime">0๊ฐ์</div> | |
</div> | |
<div class="summary-item"> | |
<div class="summary-label">์ด ๋น์ฉ (<span id="periodText">3</span>๊ฐ์)</div> | |
<div class="summary-value" id="totalCost">$0K</div> | |
</div> | |
</div> | |
<div class="selected-components"> | |
<h4>์ ํํ ๊ตฌ์ฑ ์์ ์์ธ</h4> | |
<div class="component-list" id="componentList"></div> | |
</div> | |
<div class="monthly-breakdown"> | |
<div class="monthly-item"> | |
<div class="monthly-label">์ ์๋ฒ ๋น์ฉ</div> | |
<div class="monthly-value" id="serverCost">$0K</div> | |
</div> | |
<div class="monthly-item"> | |
<div class="monthly-label">์ ๋ฆฌ์์ค ๋น์ฉ (GPU/API)</div> | |
<div class="monthly-value" id="resourceCost">$0K</div> | |
</div> | |
<div class="monthly-item"> | |
<div class="monthly-label">์ ์ ์ง๋ณด์</div> | |
<div class="monthly-value" id="maintenanceCost">$0K</div> | |
</div> | |
<div class="monthly-item"> | |
<div class="monthly-label">์ ์ด ์ด์๋น</div> | |
<div class="monthly-value" id="totalMonthlyCost">$0K</div> | |
</div> | |
</div> | |
<!-- ๊ตฌ์ถ ๋ฐฉ์๋ณ ๋น๊ต --> | |
<div class="build-method-comparison" style="margin-top: 2rem;"> | |
<h4 style="margin-bottom: 1.5rem; color: #00d2ff;">๊ตฌ์ถ ๋ฐฉ์๋ณ ๋น๊ต</h4> | |
<div class="comparison-grid" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1.5rem;"> | |
<div class="comparison-card" style="background: rgba(118, 75, 162, 0.1); border: 1px solid rgba(118, 75, 162, 0.3); padding: 1.5rem; border-radius: 10px;"> | |
<h5 style="color: #764ba2; margin-bottom: 1rem;">์ธ์ฃผ ์ฉ์ญ ๊ฐ๋ฐ</h5> | |
<div class="comparison-item" style="display: flex; justify-content: space-between; margin-bottom: 0.5rem;"> | |
<span>์ด๊ธฐ ๋น์ฉ</span> | |
<span id="outsourceInitial">$0K</span> | |
</div> | |
<div class="comparison-item" style="display: flex; justify-content: space-between; margin-bottom: 0.5rem;"> | |
<span>์ ์ด์ ๋น์ฉ</span> | |
<span id="outsourceMonthly">$0K</span> | |
</div> | |
<div class="comparison-item" style="display: flex; justify-content: space-between; margin-bottom: 0.5rem;"> | |
<span><span class="periodDisplay">3</span>๊ฐ์ ์ด ๋น์ฉ</span> | |
<span id="outsourceTotal">$0K</span> | |
</div> | |
</div> | |
<div class="comparison-card" style="background: rgba(245, 87, 108, 0.1); border: 1px solid rgba(245, 87, 108, 0.3); padding: 1.5rem; border-radius: 10px;"> | |
<h5 style="color: #f5576c; margin-bottom: 1rem;">์์ฒด ์ธ๋ ฅ ๊ฐ๋ฐ</h5> | |
<div class="comparison-item" style="display: flex; justify-content: space-between; margin-bottom: 0.5rem;"> | |
<span>์ด๊ธฐ ๋น์ฉ</span> | |
<span id="inhouseInitial">$0K</span> | |
</div> | |
<div class="comparison-item" style="display: flex; justify-content: space-between; margin-bottom: 0.5rem;"> | |
<span>์ ์ด์ ๋น์ฉ</span> | |
<span id="inhouseMonthly">$0K</span> | |
</div> | |
<div class="comparison-item" style="display: flex; justify-content: space-between; margin-bottom: 0.5rem;"> | |
<span><span class="periodDisplay">3</span>๊ฐ์ ์ด ๋น์ฉ</span> | |
<span id="inhouseTotal">$0K</span> | |
</div> | |
</div> | |
<div class="comparison-card" style="background: rgba(79, 172, 254, 0.1); border: 1px solid rgba(79, 172, 254, 0.3); padding: 1.5rem; border-radius: 10px;"> | |
<h5 style="color: #4facfe; margin-bottom: 1rem;">ํ๋ซํผ ๋์ฌ</h5> | |
<div class="comparison-item" style="display: flex; justify-content: space-between; margin-bottom: 0.5rem;"> | |
<span>์ด๊ธฐ ๋น์ฉ</span> | |
<span id="platformInitial">$0K</span> | |
</div> | |
<div class="comparison-item" style="display: flex; justify-content: space-between; margin-bottom: 0.5rem;"> | |
<span>์ ์ด์ ๋น์ฉ</span> | |
<span id="platformMonthly">$0K</span> | |
</div> | |
<div class="comparison-item" style="display: flex; justify-content: space-between; margin-bottom: 0.5rem;"> | |
<span><span class="periodDisplay">3</span>๊ฐ์ ์ด ๋น์ฉ</span> | |
<span id="platformTotal">$0K</span> | |
</div> | |
</div> | |
```html | |
</div> | |
</div> | |
<!-- ๊ธฐ๊ฐ๋ณ ๋น์ฉ ์ฐจํธ --> | |
<div class="chart-container"> | |
<canvas id="customChart"></canvas> | |
</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
<script> | |
// ์ ์ญ ๋ณ์ | |
let selectedComponents = { | |
service: [], | |
db: null, | |
auth: null, | |
credit: null, | |
payment: null, | |
marketing: null, | |
support: null, | |
monitoring: null, | |
additional: [] | |
}; | |
let customChart = null; | |
let currentPeriod = 3; | |
// ์ต์ ์นด๋ ํด๋ฆญ ์ด๋ฒคํธ | |
document.querySelectorAll('.option-card').forEach(card => { | |
card.addEventListener('click', function() { | |
const category = this.dataset.category; | |
const id = this.dataset.id; | |
if (category === 'service' || category === 'additional') { | |
// ๋ณต์ ์ ํ ๊ฐ๋ฅ | |
this.classList.toggle('selected'); | |
if (this.classList.contains('selected')) { | |
if (!selectedComponents[category].includes(id)) { | |
selectedComponents[category].push(id); | |
} | |
} else { | |
const index = selectedComponents[category].indexOf(id); | |
if (index > -1) { | |
selectedComponents[category].splice(index, 1); | |
} | |
} | |
} else { | |
// ๋จ์ผ ์ ํ | |
document.querySelectorAll(`[data-category="${category}"]`).forEach(c => { | |
c.classList.remove('selected'); | |
}); | |
this.classList.add('selected'); | |
selectedComponents[category] = id; | |
} | |
}); | |
}); | |
// ํญ ์ ํ ํจ์ | |
function switchTab(tabId) { | |
document.querySelectorAll('.tab').forEach(tab => { | |
tab.classList.remove('active'); | |
}); | |
document.querySelectorAll('.tab-content').forEach(content => { | |
content.classList.remove('active'); | |
}); | |
event.target.classList.add('active'); | |
document.getElementById(tabId).classList.add('active'); | |
} | |
// ์ปค์คํ ๋น์ฉ ๊ณ์ฐ ํจ์ | |
function calculateCustomCost() { | |
let totalInitialCost = 0; | |
let totalResourceCost = 0; | |
let maxTime = 0; | |
let componentDetails = []; | |
// ์๋น์ค ๋น์ฉ ๊ณ์ฐ | |
selectedComponents.service.forEach(serviceId => { | |
const card = document.querySelector(`[data-id="${serviceId}"]`); | |
const cost = parseFloat(card.dataset.cost); | |
const time = parseFloat(card.dataset.time); | |
const resource = parseFloat(card.dataset.resource) || 0; | |
const name = card.querySelector('.option-name').textContent; | |
totalInitialCost += cost; | |
totalResourceCost += resource; | |
maxTime = Math.max(maxTime, time); | |
componentDetails.push({ | |
name: name, | |
cost: cost, | |
type: 'service' | |
}); | |
}); | |
// ๊ธฐํ ๊ตฌ์ฑ ์์ ๋น์ฉ ๊ณ์ฐ | |
['db', 'auth', 'credit', 'payment', 'marketing', 'monitoring'].forEach(category => { | |
if (selectedComponents[category]) { | |
const card = document.querySelector(`[data-category="${category}"][data-id="${selectedComponents[category]}"]`); | |
const cost = parseFloat(card.dataset.cost); | |
const time = parseFloat(card.dataset.time); | |
const name = card.querySelector('.option-name').textContent; | |
totalInitialCost += cost; | |
maxTime = Math.max(maxTime, time); | |
componentDetails.push({ | |
name: name, | |
cost: cost, | |
type: category | |
}); | |
} | |
}); | |
// ์ง์ ์๋น์ค (์๊ฐ ๋น์ฉ) | |
let monthlySupport = 0; | |
if (selectedComponents.support) { | |
const card = document.querySelector(`[data-category="support"][data-id="${selectedComponents.support]}"]`); | |
monthlySupport = parseFloat(card.dataset.cost); | |
const name = card.querySelector('.option-name').textContent; | |
componentDetails.push({ | |
name: name, | |
cost: monthlySupport, | |
type: 'monthly' | |
}); | |
} | |
// ์ถ๊ฐ ๊ธฐ๋ฅ ๋น์ฉ ๊ณ์ฐ | |
selectedComponents.additional.forEach(additionalId => { | |
const card = document.querySelector(`[data-category="additional"][data-id="${additionalId}"]`); | |
const cost = parseFloat(card.dataset.cost); | |
const time = parseFloat(card.dataset.time); | |
const name = card.querySelector('.option-name').textContent; | |
totalInitialCost += cost; | |
maxTime = Math.max(maxTime, time); | |
componentDetails.push({ | |
name: name, | |
cost: cost, | |
type: 'additional' | |
}); | |
}); | |
// ์๊ฐ ์ด์ ๋น์ฉ ๊ณ์ฐ | |
const serverCost = totalInitialCost > 100 ? 5 : totalInitialCost > 50 ? 3 : totalInitialCost > 20 ? 2 : 1; | |
const resourceCost = totalResourceCost; | |
const maintenanceCost = totalInitialCost * 0.05; // ์ด๊ธฐ ๋น์ฉ์ 5% | |
const totalMonthlyCost = serverCost + resourceCost + maintenanceCost + monthlySupport; | |
// ๊ฒฐ๊ณผ ํ์ | |
document.getElementById('initialCost').textContent = `$${totalInitialCost}K`; | |
document.getElementById('devTime').textContent = `${maxTime}๊ฐ์`; | |
document.getElementById('serverCost').textContent = `$${serverCost}K`; | |
document.getElementById('resourceCost').textContent = `$${resourceCost.toFixed(1)}K`; | |
document.getElementById('maintenanceCost').textContent = `$${maintenanceCost.toFixed(1)}K`; | |
document.getElementById('totalMonthlyCost').textContent = `$${totalMonthlyCost.toFixed(1)}K`; | |
// ์ด ๋น์ฉ ๊ณ์ฐ (๊ธฐ๊ฐ๋ณ) | |
updateTotalCost(totalInitialCost, totalMonthlyCost); | |
// ์ ํํ ๊ตฌ์ฑ ์์ ๋ชฉ๋ก ํ์ | |
displayComponentList(componentDetails); | |
// ๊ตฌ์ถ ๋ฐฉ์๋ณ ๋น๊ต | |
compareBuilderMethods(totalInitialCost, totalMonthlyCost, maxTime); | |
// ์ฐจํธ ์ ๋ฐ์ดํธ | |
updateCustomChart(totalInitialCost, totalMonthlyCost); | |
// ๊ฒฐ๊ณผ ์น์ ํ์ | |
document.getElementById('customResult').style.display = 'block'; | |
} | |
// ์ด ๋น์ฉ ์ ๋ฐ์ดํธ | |
function updateTotalCost(initialCost, monthlyCost) { | |
const totalCost = initialCost + (monthlyCost * currentPeriod); | |
document.getElementById('totalCost').textContent = `$${totalCost.toFixed(1)}K`; | |
} | |
// ๊ตฌ์ฑ ์์ ๋ชฉ๋ก ํ์ | |
function displayComponentList(components) { | |
const listContainer = document.getElementById('componentList'); | |
listContainer.innerHTML = ''; | |
components.forEach(component => { | |
const item = document.createElement('div'); | |
item.className = 'component-list-item'; | |
let costDisplay = component.type === 'monthly' | |
? `์ $${component.cost}K` | |
: `$${component.cost}K`; | |
item.innerHTML = ` | |
<span>${component.name}</span> | |
<span style="color: #00d2ff;">${costDisplay}</span> | |
`; | |
listContainer.appendChild(item); | |
}); | |
} | |
// ๊ตฌ์ถ ๋ฐฉ์๋ณ ๋น๊ต | |
function compareBuilderMethods(initialCost, monthlyCost, devTime) { | |
// ์ธ์ฃผ ์ฉ์ญ ๊ฐ๋ฐ | |
const outsourceInitial = initialCost; | |
const outsourceMonthly = monthlyCost; | |
const outsourceTotal = outsourceInitial + (outsourceMonthly * currentPeriod); | |
// ์์ฒด ์ธ๋ ฅ ๊ฐ๋ฐ | |
const developerSalary = 10; // ์ $10K | |
const teamSize = Math.ceil(initialCost / 50); // $50K๋น 1๋ช | |
const inhouseDevTime = Math.max(devTime * 1.5, 3); // ์ต์ 3๊ฐ์ | |
const inhouseInitial = developerSalary * teamSize * inhouseDevTime; | |
const inhouseMonthly = monthlyCost + (developerSalary * Math.ceil(teamSize / 2)); // ์ ์ง๋ณด์ ์ธ๋ ฅ | |
const inhouseTotal = inhouseInitial + (inhouseMonthly * currentPeriod); | |
// ํ๋ซํผ ๋์ฌ | |
const platformInitial = 1; // ์ค์ ๋น์ฉ | |
const platformMonthly = monthlyCost * 2 + 5; // ํ๋ซํผ ์์๋ฃ ํฌํจ | |
const platformTotal = platformInitial + (platformMonthly * currentPeriod); | |
// ๊ฒฐ๊ณผ ํ์ | |
document.getElementById('outsourceInitial').textContent = `$${outsourceInitial}K`; | |
document.getElementById('outsourceMonthly').textContent = `$${outsourceMonthly.toFixed(1)}K`; | |
document.getElementById('outsourceTotal').textContent = `$${outsourceTotal.toFixed(1)}K`; | |
document.getElementById('inhouseInitial').textContent = `$${inhouseInitial}K`; | |
document.getElementById('inhouseMonthly').textContent = `$${inhouseMonthly.toFixed(1)}K`; | |
document.getElementById('inhouseTotal').textContent = `$${inhouseTotal.toFixed(1)}K`; | |
document.getElementById('platformInitial').textContent = `$${platformInitial}K`; | |
document.getElementById('platformMonthly').textContent = `$${platformMonthly.toFixed(1)}K`; | |
document.getElementById('platformTotal').textContent = `$${platformTotal.toFixed(1)}K`; | |
} | |
// ์ฐจํธ ์ ๋ฐ์ดํธ | |
function updateCustomChart(initialCost, monthlyCost) { | |
const ctx = document.getElementById('customChart').getContext('2d'); | |
if (customChart) { | |
customChart.destroy(); | |
} | |
const months = Array.from({length: 12}, (_, i) => `${i + 1}๊ฐ์`); | |
const outsourceData = months.map((_, i) => initialCost + (monthlyCost * (i + 1))); | |
const inhouseData = months.map((_, i) => { | |
const teamSize = Math.ceil(initialCost / 50); | |
const inhouseInitial = 10 * teamSize * 3; | |
const inhouseMonthly = monthlyCost + (10 * Math.ceil(teamSize / 2)); | |
return inhouseInitial + (inhouseMonthly * (i + 1)); | |
}); | |
const platformData = months.map((_, i) => 1 + ((monthlyCost * 2 + 5) * (i + 1))); | |
customChart = new Chart(ctx, { | |
type: 'line', | |
data: { | |
labels: months, | |
datasets: [{ | |
label: '์ธ์ฃผ ์ฉ์ญ ๊ฐ๋ฐ', | |
data: outsourceData, | |
borderColor: '#764ba2', | |
backgroundColor: 'rgba(118, 75, 162, 0.1)', | |
tension: 0.4 | |
}, { | |
label: '์์ฒด ์ธ๋ ฅ ๊ฐ๋ฐ', | |
data: inhouseData, | |
borderColor: '#f5576c', | |
backgroundColor: 'rgba(245, 87, 108, 0.1)', | |
tension: 0.4 | |
}, { | |
label: 'ํ๋ซํผ ๋์ฌ', | |
data: platformData, | |
borderColor: '#4facfe', | |
backgroundColor: 'rgba(79, 172, 254, 0.1)', | |
tension: 0.4 | |
}] | |
}, | |
options: { | |
responsive: true, | |
maintainAspectRatio: false, | |
plugins: { | |
legend: { | |
labels: { | |
color: '#ffffff' | |
} | |
}, | |
tooltip: { | |
callbacks: { | |
label: function(context) { | |
return context.dataset.label + ': $' + context.parsed.y.toFixed(1) + 'K'; | |
} | |
} | |
} | |
}, | |
scales: { | |
x: { | |
grid: { | |
color: 'rgba(255, 255, 255, 0.1)' | |
}, | |
ticks: { | |
color: '#a8a8b3' | |
} | |
}, | |
y: { | |
grid: { | |
color: 'rgba(255, 255, 255, 0.1)' | |
}, | |
ticks: { | |
color: '#a8a8b3', | |
callback: function(value) { | |
return '$' + value + 'K'; | |
} | |
} | |
} | |
} | |
} | |
}); | |
} | |
</script> | |
</body> | |
</html> | |