25_ITS_1 / index.html
yoon2566's picture
Update index.html
d19e59d verified
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>์Šค๋งˆํŠธ ๊ตํ†ต ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ถ„์„</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
padding: 20px;
}
.container {
max-width: 1200px;
margin: 0 auto;
background: white;
border-radius: 15px;
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
overflow: hidden;
}
.header {
background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%);
color: white;
padding: 30px;
text-align: center;
}
.header h1 {
font-size: 2.5em;
margin-bottom: 10px;
font-weight: 300;
}
.header p {
font-size: 1.1em;
opacity: 0.9;
}
.content {
padding: 40px;
}
.data-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(500px, 1fr));
gap: 30px;
margin-bottom: 30px;
}
.data-card {
background: #f8f9fa;
border-radius: 12px;
padding: 25px;
border-left: 5px solid;
transition: all 0.3s ease;
cursor: pointer;
}
.data-card:hover {
transform: translateY(-5px);
box-shadow: 0 15px 30px rgba(0,0,0,0.1);
}
.data-card.parking { border-left-color: #3498db; }
.data-card.parking-info { border-left-color: #2ecc71; }
.data-card.smart-intersection { border-left-color: #e74c3c; }
.data-card.right-turn { border-left-color: #f39c12; }
.data-card.signal-support { border-left-color: #9b59b6; }
.data-card.signal-phase { border-left-color: #1abc9c; }
.card-header {
display: flex;
align-items: center;
margin-bottom: 20px;
}
.card-icon {
width: 50px;
height: 50px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-right: 15px;
font-size: 1.5em;
color: white;
}
.parking .card-icon { background: #3498db; }
.parking-info .card-icon { background: #2ecc71; }
.smart-intersection .card-icon { background: #e74c3c; }
.right-turn .card-icon { background: #f39c12; }
.signal-support .card-icon { background: #9b59b6; }
.signal-phase .card-icon { background: #1abc9c; }
.card-title {
font-size: 1.4em;
font-weight: 600;
color: #2c3e50;
}
.card-subtitle {
font-size: 0.9em;
color: #7f8c8d;
margin-top: 5px;
}
.field-list {
list-style: none;
}
.field-item {
background: white;
margin: 8px 0;
padding: 12px 15px;
border-radius: 8px;
border-left: 3px solid #ecf0f1;
transition: all 0.2s ease;
}
.field-item:hover {
border-left-color: #3498db;
transform: translateX(5px);
}
.field-name {
font-weight: 600;
color: #2c3e50;
display: inline-block;
min-width: 120px;
}
.field-desc {
color: #7f8c8d;
margin-left: 10px;
}
.stats-bar {
background: #2c3e50;
color: white;
padding: 20px;
display: flex;
justify-content: space-around;
text-align: center;
}
.stat-item h3 {
font-size: 2em;
margin-bottom: 5px;
}
.stat-item p {
opacity: 0.8;
}
.toggle-btn {
background: #3498db;
color: white;
border: none;
padding: 8px 15px;
border-radius: 20px;
cursor: pointer;
font-size: 0.9em;
transition: all 0.3s ease;
margin-top: 10px;
}
.toggle-btn:hover {
background: #2980b9;
}
.field-list.collapsed {
display: none;
}
@media (max-width: 768px) {
.data-grid {
grid-template-columns: 1fr;
}
.header h1 {
font-size: 2em;
}
.content {
padding: 20px;
}
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>๐Ÿšฆ ์Šค๋งˆํŠธ ๊ตํ†ต ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ</h1>
<p>์‹ค์‹œ๊ฐ„ ๊ตํ†ต ๋ฐ ์ฃผ์ฐจ ๋ฐ์ดํ„ฐ ํ•„๋“œ ๋ถ„์„</p>
</div>
<div class="stats-bar">
<div class="stat-item">
<h3>6</h3>
<p>๋ฐ์ดํ„ฐ ์œ ํ˜•</p>
</div>
<div class="stat-item">
<h3>35+</h3>
<p>๋ฐ์ดํ„ฐ ํ•„๋“œ</p>
</div>
<div class="stat-item">
<h3>์‹ค์‹œ๊ฐ„</h3>
<p>๋ฐ์ดํ„ฐ ์ˆ˜์ง‘</p>
</div>
</div>
<div class="content">
<div class="data-grid">
<div class="data-card parking" onclick="toggleFields(this)">
<div class="card-header">
<div class="card-icon">๐Ÿ…ฟ๏ธ</div>
<div>
<div class="card-title">์ฃผ์ฐจ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ</div>
<div class="card-subtitle">์‹ค์‹œ๊ฐ„ ์ฃผ์ฐจ ํ˜„ํ™ฉ ์ •๋ณด</div>
</div>
</div>
<button class="toggle-btn">ํ•„๋“œ ๋ณด๊ธฐ</button>
<ul class="field-list collapsed">
<li class="field-item">
<span class="field-name">prkName</span>
<span class="field-desc">์ฃผ์ฐจ์žฅ ์ด๋ฆ„</span>
</li>
<li class="field-item">
<span class="field-name">totalLots</span>
<span class="field-desc">์ด ์ฃผ์ฐจ ๊ฐ€๋Šฅ ๋ฉด์ˆ˜</span>
</li>
<li class="field-item">
<span class="field-name">availLots</span>
<span class="field-desc">ํ˜„์žฌ ์ฃผ์ฐจ ๋ฉด์ˆ˜ (์ ์œ ํ•œ ๊ณต๊ฐ„)</span>
</li>
<li class="field-item">
<span class="field-name">prkId</span>
<span class="field-desc">์ฃผ์ฐจ์žฅ ๊ณ ์œ  ID</span>
</li>
</ul>
</div>
<div class="data-card parking-info" onclick="toggleFields(this)">
<div class="card-header">
<div class="card-icon">โ„น๏ธ</div>
<div>
<div class="card-title">์ฃผ์ฐจ์žฅ ์ •๋ณด ๋ฐ์ดํ„ฐ</div>
<div class="card-subtitle">์ฃผ์ฐจ์žฅ ๊ธฐ๋ณธ ์ •๋ณด ๋ฐ ์šด์˜์‹œ๊ฐ„</div>
</div>
</div>
<button class="toggle-btn">ํ•„๋“œ ๋ณด๊ธฐ</button>
<ul class="field-list collapsed">
<li class="field-item">
<span class="field-name">prkName</span>
<span class="field-desc">์ฃผ์ฐจ์žฅ ์ด๋ฆ„</span>
</li>
<li class="field-item">
<span class="field-name">prkAddr</span>
<span class="field-desc">์ฃผ์ฐจ์žฅ ์ฃผ์†Œ</span>
</li>
<li class="field-item">
<span class="field-name">prkType</span>
<span class="field-desc">์ฃผ์ฐจ์žฅ ์œ ํ˜• (์˜ˆ: ๊ณต์˜)</span>
</li>
<li class="field-item">
<span class="field-name">weekOpenTime</span>
<span class="field-desc">ํ‰์ผ ์šด์˜ ์‹œ์ž‘ ์‹œ๊ฐ„</span>
</li>
<li class="field-item">
<span class="field-name">weekEndTime</span>
<span class="field-desc">ํ‰์ผ ์šด์˜ ์ข…๋ฃŒ ์‹œ๊ฐ„</span>
</li>
<li class="field-item">
<span class="field-name">satOpenTime</span>
<span class="field-desc">ํ† ์š”์ผ ์šด์˜ ์‹œ์ž‘ ์‹œ๊ฐ„</span>
</li>
<li class="field-item">
<span class="field-name">satEndTime</span>
<span class="field-desc">ํ† ์š”์ผ ์šด์˜ ์ข…๋ฃŒ ์‹œ๊ฐ„</span>
</li>
<li class="field-item">
<span class="field-name">holiOpenTime</span>
<span class="field-desc">๊ณตํœด์ผ ์šด์˜ ์‹œ์ž‘ ์‹œ๊ฐ„</span>
</li>
<li class="field-item">
<span class="field-name">holiEndTime</span>
<span class="field-desc">๊ณตํœด์ผ ์šด์˜ ์ข…๋ฃŒ ์‹œ๊ฐ„</span>
</li>
<li class="field-item">
<span class="field-name">xCrdn, yCrdn</span>
<span class="field-desc">์ฃผ์ฐจ์žฅ ์œ„์น˜ (๊ฒฝ์œ„๋„)</span>
</li>
</ul>
</div>
<div class="data-card smart-intersection" onclick="toggleFields(this)">
<div class="card-header">
<div class="card-icon">๐Ÿšฆ</div>
<div>
<div class="card-title">์Šค๋งˆํŠธ ๊ต์ฐจ๋กœ ์ •๋ณด</div>
<div class="card-subtitle">10๋ถ„๋งˆ๋‹ค ์ˆ˜์ง‘๋˜๋Š” ๊ต์ฐจ๋กœ ๋ฐ์ดํ„ฐ</div>
</div>
</div>
<button class="toggle-btn">ํ•„๋“œ ๋ณด๊ธฐ</button>
<ul class="field-list collapsed">
<li class="field-item">
<span class="field-name">crossName</span>
<span class="field-desc">๊ต์ฐจ๋กœ ์ด๋ฆ„</span>
</li>
<li class="field-item">
<span class="field-name">colDate</span>
<span class="field-desc">๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์ผ์‹œ (YYYYMMDDHHMM)</span>
</li>
<li class="field-item">
<span class="field-name">volume</span>
<span class="field-desc">๊ตํ†ต๋Ÿ‰ (์ฐจ๋Ÿ‰ ์ˆ˜)</span>
</li>
<li class="field-item">
<span class="field-name">los</span>
<span class="field-desc">์„œ๋น„์Šค ์ˆ˜์ค€ (Level Of Service, ๊ตํ†ต ํ˜ผ์žก๋„ ๋“ฑ๊ธ‰: A~F)</span>
</li>
<li class="field-item">
<span class="field-name">delay</span>
<span class="field-desc">์ง€์ฒด ์‹œ๊ฐ„ (์ดˆ)</span>
</li>
<li class="field-item">
<span class="field-name">walker</span>
<span class="field-desc">๋ณดํ–‰์ž ์ˆ˜</span>
</li>
<li class="field-item">
<span class="field-name">crash</span>
<span class="field-desc">์‚ฌ๊ณ  ๋ฐœ์ƒ ์—ฌ๋ถ€ (0: ์—†์Œ, 1: ๋ฐœ์ƒ)</span>
</li>
</ul>
</div>
<div class="data-card right-turn" onclick="toggleFields(this)">
<div class="card-header">
<div class="card-icon">โ†ช๏ธ</div>
<div>
<div class="card-title">์šฐํšŒ์ „ ์•ˆ์ „ ์šดํ–‰ ์ง€์›</div>
<div class="card-subtitle">์šฐํšŒ์ „ ์‹œ ๋ณดํ–‰์ž/์ž์ „๊ฑฐ ๊ฐ์ง€ ๋ฐ์ดํ„ฐ</div>
</div>
</div>
<button class="toggle-btn">ํ•„๋“œ ๋ณด๊ธฐ</button>
<ul class="field-list collapsed">
<li class="field-item">
<span class="field-name">crossName</span>
<span class="field-desc">๊ฐ์ง€๋œ ๊ต์ฐจ๋กœ ์ด๋ฆ„</span>
</li>
<li class="field-item">
<span class="field-name">colDate</span>
<span class="field-desc">๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์ผ์‹œ (YYYYMMDDHHMMSS)</span>
</li>
<li class="field-item">
<span class="field-name">objectType</span>
<span class="field-desc">๊ฐ์ง€๋œ ๊ฐ์ฒด ์œ ํ˜• (์˜ˆ: ๋ณดํ–‰์ž, ์ž์ „๊ฑฐ, ๋ฐ์ดํ„ฐ์—†์Œ)</span>
</li>
<li class="field-item">
<span class="field-name">objectPos</span>
<span class="field-desc">๊ฐ์ฒด ์œ„์น˜/์ƒํƒœ (์˜ˆ: ๋Œ€๊ธฐ์ž, ํšก๋‹จ์ž, ๋ฌด๋‹จํšก๋‹จ์ž)</span>
</li>
<li class="field-item">
<span class="field-name">signalPhase</span>
<span class="field-desc">ํ•ด๋‹น ์ง€์ ์˜ ์‹ ํ˜ธ ์ƒํƒœ</span>
</li>
<li class="field-item">
<span class="field-name">xCrdn, yCrdn</span>
<span class="field-desc">๊ฐ์ฒด ๊ฐ์ง€ ์œ„์น˜</span>
</li>
</ul>
</div>
<div class="data-card signal-support" onclick="toggleFields(this)">
<div class="card-header">
<div class="card-icon">๐Ÿ”ง</div>
<div>
<div class="card-title">์‹ ํ˜ธ ๊ต์ฐจ๋กœ ์ง€์›</div>
<div class="card-subtitle">๊ต์ฐจ๋กœ ์‹ ํ˜ธ ์ œ์–ด ๊ธฐ๋ณธ ์ •๋ณด</div>
</div>
</div>
<button class="toggle-btn">ํ•„๋“œ ๋ณด๊ธฐ</button>
<ul class="field-list collapsed">
<li class="field-item">
<span class="field-name">lcName</span>
<span class="field-desc">๊ต์ฐจ๋กœ ์ด๋ฆ„</span>
</li>
<li class="field-item">
<span class="field-name">lcNo</span>
<span class="field-desc">๊ต์ฐจ๋กœ ๋ฒˆํ˜ธ</span>
</li>
<li class="field-item">
<span class="field-name">genMain</span>
<span class="field-desc">์‹ ํ˜ธ ์ œ์–ด ๊ด€๋ จ ์ฝ”๋“œ (์ƒ์„ธ ์ •์˜๋Š” API ๋ฌธ์„œ ํ™•์ธ ํ•„์š”)</span>
</li>
<li class="field-item">
<span class="field-name">ringType</span>
<span class="field-desc">์‹ ํ˜ธ ์ œ์–ด ๊ด€๋ จ ์ฝ”๋“œ (์ƒ์„ธ ์ •์˜๋Š” API ๋ฌธ์„œ ํ™•์ธ ํ•„์š”)</span>
</li>
<li class="field-item">
<span class="field-name">intType</span>
<span class="field-desc">์‹ ํ˜ธ ์ œ์–ด ๊ด€๋ จ ์ฝ”๋“œ (์ƒ์„ธ ์ •์˜๋Š” API ๋ฌธ์„œ ํ™•์ธ ํ•„์š”)</span>
</li>
</ul>
</div>
<div class="data-card signal-phase" onclick="toggleFields(this)">
<div class="card-header">
<div class="card-icon">โฑ๏ธ</div>
<div>
<div class="card-title">์‹ ํ˜ธ-๊ต์ฐจ๋กœ ํ˜„์‹œ์ •๋ณด</div>
<div class="card-subtitle">์‹ ํ˜ธ๋“ฑ ํƒ€์ด๋ฐ ๋ฐ ํ˜„์‹œ ์ •๋ณด</div>
</div>
</div>
<button class="toggle-btn">ํ•„๋“œ ๋ณด๊ธฐ</button>
<ul class="field-list collapsed">
<li class="field-item">
<span class="field-name">lcNo</span>
<span class="field-desc">๊ต์ฐจ๋กœ ๋ฒˆํ˜ธ</span>
</li>
<li class="field-item">
<span class="field-name">ringNo</span>
<span class="field-desc">๋ง ๋ฒˆํ˜ธ (์‹ ํ˜ธ๋“ฑ ์ œ์–ด ์ฒด๊ณ„)</span>
</li>
<li class="field-item">
<span class="field-name">phaseNo</span>
<span class="field-desc">ํ˜„์‹œ ๋ฒˆํ˜ธ (์‹ ํ˜ธ๋“ฑ ๋‹จ๊ณ„)</span>
</li>
<li class="field-item">
<span class="field-name">minSplit</span>
<span class="field-desc">์ตœ์†Œ ํ˜„์‹œ ์‹œ๊ฐ„</span>
</li>
<li class="field-item">
<span class="field-name">maxSplit</span>
<span class="field-desc">์ตœ๋Œ€ ํ˜„์‹œ ์‹œ๊ฐ„</span>
</li>
<li class="field-item">
<span class="field-name">yellow</span>
<span class="field-desc">ํ™ฉ์ƒ‰๋“ฑ ์‹œ๊ฐ„</span>
</li>
</ul>
</div>
</div>
</div>
</div>
<script>
function toggleFields(card) {
const fieldList = card.querySelector('.field-list');
const toggleBtn = card.querySelector('.toggle-btn');
if (fieldList.classList.contains('collapsed')) {
fieldList.classList.remove('collapsed');
toggleBtn.textContent = 'ํ•„๋“œ ์ˆจ๊ธฐ๊ธฐ';
card.style.transform = 'scale(1.02)';
} else {
fieldList.classList.add('collapsed');
toggleBtn.textContent = 'ํ•„๋“œ ๋ณด๊ธฐ';
card.style.transform = 'scale(1)';
}
}
// ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ
document.addEventListener('DOMContentLoaded', function() {
const cards = document.querySelectorAll('.data-card');
cards.forEach((card, index) => {
card.style.opacity = '0';
card.style.transform = 'translateY(30px)';
setTimeout(() => {
card.style.transition = 'all 0.6s ease';
card.style.opacity = '1';
card.style.transform = 'translateY(0)';
}, index * 100);
});
});
// ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ (ํ–ฅํ›„ ํ™•์žฅ ๊ฐ€๋Šฅ)
function searchFields(query) {
const cards = document.querySelectorAll('.data-card');
cards.forEach(card => {
const text = card.textContent.toLowerCase();
if (text.includes(query.toLowerCase())) {
card.style.display = 'block';
} else {
card.style.display = 'none';
}
});
}
</script>
</body>
</html>