| <!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> |