1<!DOCTYPE html> 2<html lang="zh-CN"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>ä¸ç»©æ¡ä¾ - äºåéªèªå·¥ç¨å¨è¯¢æéè´£ä»»å ¬å¸</title> 7 <meta name="description" content="äºåéªèªå·¥ç¨å¨è¯¢ - 1672+æåé¡¹ç®æ¡ä¾å±ç¤º"> 8 <meta name="keywords" content="ä¸ç»©æ¡ä¾,ææ ä»£ç项ç®,æ¿åºéè´é¡¹ç®,æåæ¡ä¾,项ç®å±ç¤º"> 9 <link rel="stylesheet" href="css/style.css?v=5"> 10 <!-- Favicon --> 11 <link rel="shortcut icon" href="favicon/favicon.ico"> 12 <link rel="icon" type="image/svg+xml" href="favicon/favicon.svg"> 13 <link rel="icon" type="image/png" sizes="32x32" href="favicon/favicon-32x32.png"> 14 <link rel="icon" type="image/png" sizes="16x16" href="favicon/favicon-16x16.png"> 15 <link rel="apple-touch-icon" sizes="180x180" href="favicon/apple-touch-icon.png"> 16 <link rel="manifest" href="favicon/site.webmanifest"> 17 <meta name="theme-color" content="#1a3a5c"> 18 <meta name="msapplication-TileColor" content="#1a3a5c"> 19</head> 20<body> 21 22<div id="site-header"></div> 23 24<section class="hero page-hero" style="background-color:#1a3a5c;background-image:url('https://d2xsxph8kpxj0f.cloudfront.net/310519663154348081/UJnLepBRYQLVkZKc5Z6Jsg/achievement-hero-hVMUFdcmHkW2qexrDDpLay.webp');"> 25 <div class="container"> 26 <div class="hero-tag">ACHIEVEMENTS — ä¸ç»©æ¡ä¾</div> 27 <h2>ä¸ç»©æ¡ä¾</h2> 28 <p>ç´¯è®¡å®æåç±»ææ ä»£ç项ç®1672ä½é¡¹ï¼æå¡å®¢æ·æ¶µçå¤ä¸ªè¡ä¸é¢å</p> 29 </div> 30</section> 31 32<!-- ç»è®¡ --> 33<section class="stats-bar"> 34 <div class="container"> 35 <div class="stats-grid"> 36 <div class="stat-item"> 37 <div class="stat-icon">📄</div> 38 <div> 39 <div class="stat-number">1,672+</div> 40 <div class="stat-label">é¡¹ç®æ»æ°</div> 41 </div> 42 </div> 43 <div class="stat-item"> 44 <div class="stat-icon">🏥</div> 45 <div> 46 <div class="stat-number">210+</div> 47 <div class="stat-label">æå¡å®¢æ·</div> 48 </div> 49 </div> 50 <div class="stat-item"> 51 <div class="stat-icon">🏛</div> 52 <div> 53 <div class="stat-number">6+</div> 54 <div class="stat-label">è¡ä¸é¢å</div> 55 </div> 56 </div> 57 <div class="stat-item"> 58 <div class="stat-icon">✅</div> 59 <div> 60 <div class="stat-number">100%</div> 61 <div class="stat-label">å®¢æ·æ»¡æåº¦</div> 62 </div> 63 </div> 64 </div> 65 </div> 66</section> 67 68<!-- ä¸ç»©å表 --> 69<section class="section"> 70 <div class="container"> 71 <div class="section-header fade-in"> 72 <div class="section-tag">PROJECT LIST — 项ç®å表</div> 73 <h2>代表æ§é¡¹ç®</h2> 74 <p>以ä¸ä¸ºé¨å代表æ§é¡¹ç®ï¼æ¶µçå»çå«çãæ¿æ³ç³»ç»ãæè²ç§ç ãè¡æ¿æºå ³çé¢å</p> 75 </div> 76 77 <!-- æç´¢åçé --> 78 <div class="fade-in" style="margin-bottom:2rem;"> 79 <div class="laws-search" style="margin-bottom:1rem;"> 80 <span class="search-icon">🔍</span> 81 <input type="text" id="projectSearch" placeholder="æç´¢é¡¹ç®åç§°æå§æåä½..."> 82 <button class="clear-btn" id="projectClearBtn" onclick="clearProjectSearch()">×</button> 83 </div> 84 <div class="achievements-filter" id="categoryFilter"> 85 <button class="filter-btn active" data-category="all">å ¨é¨</button> 86 <button class="filter-btn" data-category="å»çå«ç">å»çå«ç</button> 87 <button class="filter-btn" data-category="æ¿æ³ç³»ç»">æ¿æ³ç³»ç»</button> 88 <button class="filter-btn" data-category="æè²ç§ç ">æè²ç§ç </button> 89 <button class="filter-btn" data-category="è¡æ¿æºå ³">è¡æ¿æºå ³</button> 90 <button class="filter-btn" data-category="å ¶ä»">å ¶ä»</button> 91 </div> 92 <div id="resultCount" class="search-result-count"></div> 93 </div> 94 95 <!-- è¡¨æ ¼ --> 96 <div class="fade-in"> 97 <table class="achievements-table"> 98 <thead> 99 <tr> 100 <th style="width:50px;">åºå·</th> 101 <th>项ç®åç§°</th>
102 <th style="width:200px;">å§æåä½</th> 103 <th style="width:120px;">éè´æ¹å¼</th> 104 </tr> 105 </thead> 106 <tbody id="projectTableBody"> 107 </tbody> 108 </table> 109 <div class="pagination" id="pagination"></div> 110 </div> 111 </div> 112</section> 113 114<div id="site-footer"></div> 115 116<div class="modal-overlay" id="modalOverlay"> 117 <div class="modal"> 118 <div class="modal-header"> 119 <h3 id="modalTitle"></h3> 120 <button class="modal-close" onclick="closeModal()">×</button> 121 </div> 122 <div class="modal-body" id="modalBody"></div> 123 </div> 124</div> 125
126<script src="js/common.js"></script>
vendor: 2 bytes, line 126
126
127<script src="js/achievements-data.js"></script>
vendor: 2 bytes, line 127
127
128<script> 129 var currentPage = 1; 130 var pageSize = 20; 131 var currentCategory = 'all'; 132 var searchKeyword = ''; 133 134 document.addEventListener('DOMContentLoaded', function() { 135 initCommon('achievements'); 136 renderTable(); 137 138 // æç´¢ 139 var searchInput = document.getElementById('projectSearch'); 140 var clearBtn = document.getElementById('projectClearBtn'); 141 searchInput.addEventListener('input', function() { 142 searchKeyword = this.value.trim(); 143 clearBtn.classList.toggle('show', searchKeyword.length > 0); 144 currentPage = 1; 145 renderTable(); 146 }); 147 148 // åç±»çé 149 document.getElementById('categoryFilter').addEventListener('click', function(e) { 150 if (e.target.classList.contains('filter-btn')) { 151 document.querySelectorAll('.filter-btn').forEach(function(btn) { btn.classList.remove('active'); }); 152 e.target.classList.add('active'); 153 currentCategory = e.target.getAttribute('data-category'); 154 currentPage = 1; 155 renderTable(); 156 } 157 }); 158 }); 159 160 function clearProjectSearch() { 161 document.getElementById('projectSearch').value = ''; 162 document.getElementById('projectClearBtn').classList.remove('show'); 163 searchKeyword = ''; 164 currentPage = 1; 165 renderTable(); 166 } 167 168 function getFilteredData() { 169 return achievementsData.filter(function(item) { 170 var matchCategory = currentCategory === 'all' || item.category === currentCategory; 171 var matchSearch = !searchKeyword || 172 item.name.indexOf(searchKeyword) !== -1 || 173 item.client.indexOf(searchKeyword) !== -1; 174 return matchCategory && matchSearch; 175 }); 176 } 177 178 function renderTable() { 179 var filtered = getFilteredData(); 180 var total = filtered.length; 181 var totalPages = Math.ceil(total / pageSize); 182 if (currentPage > totalPages) currentPage = totalPages || 1; 183 184 var start = (currentPage - 1) * pageSize; 185 var pageData = filtered.slice(start, start + pageSize); 186 187 var tbody = document.getElementById('projectTableBody'); 188 tbody.innerHTML = ''; 189 190 if (pageData.length === 0) { 191 tbody.innerHTML = '<tr><td colspan="4" style="text-align:center;padding:3rem;color:var(--color-text-muted);">ææ å¹é çé¡¹ç®æ°æ®</td></tr>'; 192 } else { 193 pageData.forEach(function(item, i) { 194 var tr = document.createElement('tr'); 195 tr.innerHTML = '<td>' + (start + i + 1) + '</td><td>' + item.name + '</td><td>' + item.client + '</td><td>' + (item.method || 'â') + '</td>'; 196 tbody.appendChild(tr); 197 }); 198 } 199 200 document.getElementById('resultCount').textContent = 'å ± ' + total + ' 个项ç®'; 201 renderPagination(totalPages); 202 } 203 204 function renderPagination(totalPages) { 205 var container = document.getElementById('pagination'); 206 container.innerHTML = ''; 207 if (totalPages <= 1) return; 208 209 var prevBtn = document.createElement('button'); 210 prevBtn.textContent = 'ä¸ä¸é¡µ'; 211 prevBtn.disabled = currentPage === 1; 212 prevBtn.onclick = function() { currentPage--; renderTable(); window.scrollTo({top:400,behavior:'smooth'}); }; 213 container.appendChild(prevBtn); 214 215 var startPage = Math.max(1, currentPage - 2); 216 var endPage = Math.min(totalPages, startPage + 4); 217 if (endPage - startPage < 4) startPage = Math.max(1, endPage - 4); 218 219 for (var i = startPage; i <= endPage; i++) { 220 var btn = document.createElement('button'); 221 btn.textContent = i; 222 btn.className = i === currentPage ? 'active' : ''; 223 btn.onclick = (function(page) { return function() { currentPage = page; renderTable(); window.scrollTo({top:400,behavior:'smooth'}); }; })(i); 224 container.appendChild(btn); 225 } 226 227 var info = document.createElement('span'); 228 info.textContent = currentPage + ' / ' + totalPages; 229 container.appendChild(info); 230 231 var nextBtn = document.createElement('button'); 232 nextBtn.textContent = 'ä¸ä¸é¡µ'; 233 nextBtn.disabled = currentPage === totalPages; 234 nextBtn.onclick = function() { currentPage++; renderTable(); window.scrollTo({top:400,behavior:'smooth'}); }; 235 container.appendChild(nextBtn); 236 } 237</script>
237 238</body> 239</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.