gaokao-site/school.html

386 lines
20 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>查校对比 - 河南高考志愿助手</title>
<meta name="description" content="输入分数查询可报的院校,对比两所学校的投档分、位次、招生人数。">
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;background:#0a0a0f;color:#e0e0e0;min-height:100vh;line-height:1.7}
.header{background:rgba(20,20,30,0.95);backdrop-filter:blur(20px);border-bottom:1px solid rgba(255,255,255,0.08);padding:14px 0;position:sticky;top:0;z-index:100}
.header-inner{max-width:1100px;margin:0 auto;padding:0 20px;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px}
.logo{font-size:1.3rem;font-weight:700;color:#fff;text-decoration:none}
.logo span{color:#667eea}
.nav-links{display:flex;gap:20px;list-style:none;flex-wrap:wrap}
.nav-links a{color:#a0a0a0;text-decoration:none;font-size:0.9rem;transition:color 0.3s}
.nav-links a:hover{color:#667eea}.nav-links a.highlight{color:#667eea;font-weight:600}
.page-hero{background:linear-gradient(135deg,#0f0f1a,#12102a);padding:40px 0 36px;border-bottom:1px solid rgba(102,126,234,0.15)}
.container{max-width:1100px;margin:0 auto;padding:0 20px}
.page-hero h1{font-size:1.7rem;color:#fff;margin-bottom:6px}
.page-hero p{color:#888;font-size:0.9rem}
.search-bar{display:flex;gap:10px;margin:28px 0 20px;flex-wrap:wrap}
.search-bar input{flex:1;min-width:200px;padding:11px 16px;background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.12);border-radius:10px;color:#e0e0e0;font-size:0.95rem;outline:none}
.search-bar input:focus{border-color:#667eea}
.search-bar input::placeholder{color:#666}
.search-bar select{padding:11px 16px;background:rgba(255,255,255,0.12);border:1px solid rgba(255,255,255,0.2);border-radius:10px;color:#e0e0e0;font-size:0.9rem;outline:none;appearance:auto;-webkit-appearance:auto}
.search-bar button{padding:11px 24px;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:10px;font-size:0.9rem;font-weight:600;cursor:pointer;transition:opacity 0.2s}
.search-bar button:hover{opacity:0.88}
.compare-section{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin:24px 0}
.compare-card{background:rgba(255,255,255,0.03);border:1px solid rgba(255,255,255,0.08);border-radius:14px;padding:20px;position:relative}
.compare-card h3{color:#667eea;font-size:0.82rem;font-weight:600;margin-bottom:12px;text-transform:uppercase;letter-spacing:1px}
.compare-school{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.compare-school select{width:100%;padding:10px 14px;background:rgba(255,255,255,0.12);border:1px solid rgba(255,255,255,0.2);border-radius:8px;color:#e0e0e0;font-size:0.9rem;outline:none;appearance:auto;-webkit-appearance:auto}
.compare-school select:focus{border-color:#667eea}
.school-info{minor-top:16px;display:grid;grid-template-columns:1fr 1fr;gap:10px}
.info-item{background:rgba(255,255,255,0.04);border-radius:8px;padding:12px}
.info-item .label{color:#666;font-size:0.75rem;margin-bottom:4px}
.info-item .value{color:#e0e0e0;font-size:1rem;font-weight:600}
.info-item .value.highlight{color:#4ade80}
.info-item .value.warning{color:#fbbf24}
.info-item .value.type-tag{color:#fbbf24;font-size:0.78rem;background:rgba(251,191,36,0.1);padding:2px 8px;border-radius:4px;display:inline-block}
.info-item .value.req-tag{color:#888;font-size:0.75rem;margin-top:4px}
.vs-badge{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background:#667eea;color:#fff;font-size:0.8rem;font-weight:700;padding:6px 14px;border-radius:20px;z-index:2}
.results-table{width:100%;border-collapse:collapse;margin-top:24px}
.results-table th{text-align:left;padding:10px 14px;background:rgba(102,126,234,0.1);color:#667eea;font-size:0.8rem;font-weight:600;border-bottom:1px solid rgba(255,255,255,0.06)}
.results-table td{padding:10px 14px;border-bottom:1px solid rgba(255,255,255,0.04);font-size:0.88rem;color:#aaa}
.results-table tr:hover td{background:rgba(255,255,255,0.02)}
/* 分页 */
.pagination{margin-top:24px;display:flex;align-items:center;justify-content:center;gap:12px;flex-wrap:wrap}
.pagination button{display:inline-flex;align-items:center;gap:5px;padding:8px 18px;border-radius:8px;font-size:0.85rem;font-weight:600;cursor:pointer;border:none;transition:all 0.2s;background:rgba(255,255,255,0.06);color:#aaa}
.pagination button:hover:not(:disabled){background:rgba(102,126,234,0.15);color:#667eea}
.pagination button:disabled{opacity:0.35;cursor:not-allowed}
.pagination .page-info{color:#555;font-size:0.82rem}
.pagination .page-info span{color:#667eea;font-weight:600}
/* 移动端适配 */
@media(max-width:600px){
.compare-section{grid-template-columns:1fr!important}
.vs-badge{display:none}
.page-hero h1{font-size:1.3rem}
.results-table{font-size:0.8rem}
.results-table th,.results-table td{padding:7px 8px}
}
/* 页脚 */
.footer{background:rgba(255,255,255,0.03);border-top:1px solid rgba(255,255,255,0.06);padding:30px 0;margin-top:40px;text-align:center}
.footer-inner{max-width:1100px;margin:0 auto;padding:0 20px}
.footer-logo{font-size:1rem;font-weight:700;color:#fff;margin-bottom:6px}
.footer-logo span{color:#667eea}
.footer-desc{color:#555;font-size:0.8rem;margin-bottom:14px}
.footer-contact-title{color:#888;font-size:0.82rem;margin-bottom:10px}
.footer-qr{width:80px;height:80px;background:rgba(255,255,255,0.05);border:1px dashed rgba(255,255,255,0.15);border-radius:8px;display:inline-flex;align-items:center;justify-content:center;color:#555;font-size:0.7rem;text-align:center;padding:6px;margin-bottom:14px}
.footer-bottom{color:#444;font-size:0.78rem;border-top:1px solid rgba(255,255,255,0.05);padding-top:16px;margin-top:14px}
.results-table .school-name{color:#e0e0e0;font-weight:600}
.results-table .score{color:#4ade80;font-weight:600}
.results-table .rank{color:#fbbf24}
.results-table .add-btn{background:rgba(102,126,234,0.15);color:#667eea;border:1px solid rgba(102,126,234,0.3);padding:4px 10px;border-radius:6px;cursor:pointer;font-size:0.78rem}
.results-table .add-btn:hover{background:rgba(102,126,234,0.3)}
.section-title{font-size:1.2rem;color:#fff;margin:36px 0 16px;padding-bottom:10px;border-bottom:1px solid rgba(255,255,255,0.06)}
.tips{background:rgba(102,126,234,0.06);border:1px solid rgba(102,126,234,0.15);border-radius:10px;padding:16px 20px;margin:16px 0;color:#999;font-size:0.85rem}
.tips::before{content:"💡 ";color:#667eea}
.loading{text-align:center;padding:30px;color:#666;font-size:0.9rem}
.no-data{text-align:center;padding:30px;color:#666;font-size:0.9rem}
@media(max-width:700px){
.compare-section{grid-template-columns:1fr}
.vs-badge{display:none}
}
</style>
</head>
<body>
<header class="header">
<div class="header-inner">
<a href="/" class="logo">高考志愿<span>助手</span></a>
<ul class="nav-links">
<li><a href="/ai-chat" target="_blank" class="highlight">🤖 AI助手</a></li>
<li><a href="/plan.html">志愿草表</a></li>
<li><a href="/school.html" style="color:#667eea;font-weight:600">查校对比</a></li>
<li><a href="/#prob">录取概率估算</a></li>
<li><a href="/major.html">查历年录取分数和位次</a></li>
<li><a href="/#tools">官方查询渠道</a></li>
<li><a href="/#provinces">各省教育考试院入口</a></li>
<li><a href="/#resources">扩展工具 & 数据查询</a></li>
<li><a href="/qa.html">常见问题</a></li>
</ul>
</div>
</header>
<div class="page-hero"><div class="container">
<h1>🔍 查校对比</h1>
<p>搜索院校名称,查看 2025 年真实投档数据,支持两校对比</p>
</div></div>
<div class="container">
<!-- 搜索框 -->
<div class="search-bar">
<select id="category">
<option value="物理类">物理类(理科)</option>
<option value="历史类">历史类(文科)</option>
</select>
<input type="text" id="keyword" list="searchHistory" placeholder="输入院校名称,如:郑州大学" onkeydown="if(event.key==='Enter')searchSchool()" autocomplete="off">
<datalist id="searchHistory"></datalist>
<button onclick="searchSchool()">搜索</button>
</div>
<!-- 院校对比区 -->
<div class="compare-section" id="compareSection" style="display:none">
<div class="compare-card">
<h3>院校 A</h3>
<div class="compare-school">
<select id="schoolA"><option value="">— 选择院校 —</option></select>
</div>
<div class="school-info" id="infoA">
<div class="info-item"><div class="label">院校名称</div><div class="value" id="aName">-</div></div>
<div class="info-item"><div class="label">招生类型</div><div class="value type-tag" id="aType">-</div><div class="value req-tag" id="aReq">-</div></div>
<div class="info-item"><div class="label">2025投档分</div><div class="value highlight" id="aScore">-</div></div>
<div class="info-item"><div class="label">投档位次</div><div class="value" id="aRank">-</div></div>
<div class="info-item"><div class="label">招生人数</div><div class="value" id="aNum">-</div></div>
</div>
</div>
<div class="compare-card" style="position:relative">
<div class="vs-badge">VS</div>
<h3>院校 B</h3>
<div class="compare-school">
<select id="schoolB"><option value="">— 选择院校 —</option></select>
</div>
<div class="school-info" id="infoB">
<div class="info-item"><div class="label">院校名称</div><div class="value" id="bName">-</div></div>
<div class="info-item"><div class="label">招生类型</div><div class="value type-tag" id="bType">-</div><div class="value req-tag" id="bReq">-</div></div>
<div class="info-item"><div class="label">2025投档分</div><div class="value highlight" id="bScore">-</div></div>
<div class="info-item"><div class="label">投档位次</div><div class="value" id="bRank">-</div></div>
<div class="info-item"><div class="label">招生人数</div><div class="value" id="bNum">-</div></div>
</div>
</div>
</div>
<div class="tips">提示先在上方搜索框输入院校名称然后从下拉列表选择学校添加到对比区。数据来源为2025年河南高考真实投档分。</div>
<!-- 搜索结果 -->
<div class="section-title">搜索结果</div>
<div id="resultsArea">
<div class="no-data">输入院校名称开始搜索,可以看到历年投档分、位次和招生人数</div>
</div>
<a href="/" style="display:inline-block;margin-top:32px;color:#667eea;text-decoration:none;font-size:0.9rem">← 返回首页</a>
<br><br>
</div>
<script>
var allSchools = []; // 所有搜索过的学校,长期累积
var selectedA = null;
var selectedB = null;
var lastResults = []; // 最近一次搜索结果(用于分页)
var currentPage = 1;
var PAGE_SIZE = 20;
function loadSearchHistory(){
var list = JSON.parse(localStorage.getItem('gaokao_school_history') || '[]');
var datalist = document.getElementById('searchHistory');
if(!datalist) return;
datalist.innerHTML = list.map(function(k){
return '<option value="'+esc(k)+'">';
}).join('');
}
function saveSearchHistory(kw){
if(!kw) return;
var list = JSON.parse(localStorage.getItem('gaokao_school_history') || '[]');
list = list.filter(function(k){ return k !== kw; });
list.unshift(kw);
if(list.length > 8) list = list.slice(0, 8);
localStorage.setItem('gaokao_school_history', JSON.stringify(list));
loadSearchHistory();
}
document.addEventListener('DOMContentLoaded', loadSearchHistory);
function searchSchool(){
var kw = document.getElementById('keyword').value.trim();
var cat = document.getElementById('category').value;
if(!kw){return;}
var area = document.getElementById('resultsArea');
area.innerHTML = '<div class="loading">🔍 搜索中,请稍候...</div>';
fetch('/api/school/search?q=' + encodeURIComponent(kw) + '&subject=' + encodeURIComponent(cat))
.then(function(r){
if(!r.ok) throw new Error('网络错误 ' + r.status);
return r.json();
})
.then(function(d){
var results = d.schools || [];
if(results.length === 0){
area.innerHTML = '<div class="no-data">未找到相关院校,请尝试其他关键词</div>';
return;
}
// 合并到 allSchools避免重复按 school+score 去重)
var existKeys = {};
allSchools.forEach(function(s){ existKeys[s.school + '|' + s.score] = true; });
results.forEach(function(s){
var key = s.school + '|' + s.score;
if(!existKeys[key]){ allSchools.push(s); existKeys[key] = true; }
});
lastResults = results;
currentPage = 1;
// 写 history
addHistory('school', '查校对比', '/school.html', kw + ' · ' + cat + '类');
saveSearchHistory(kw);
renderResultsPage();
refreshDropdowns();
})
.catch(function(e){
area.innerHTML = '<div class="no-data" style="color:#ef4444">⚠️ 搜索失败:' + e.message + ',请刷新页面重试</div>';
});
}
function addCompareA(idx){
var s = allSchools[idx];
if(!s) return;
if(selectedB && selectedB.school === s.school && selectedB.score === s.score) return;
selectedA = s;
refreshDropdowns();
fillCompare();
}
function addCompareB(idx){
var s = allSchools[idx];
if(!s) return;
if(selectedA && selectedA.school === s.school && selectedA.score === s.score) return;
selectedB = s;
refreshDropdowns();
fillCompare();
}
function refreshDropdowns(){
// 每次搜索或添加后,用 allSchools 重建下拉框
var selA = document.getElementById('schoolA');
var selB = document.getElementById('schoolB');
var optA = '<option value="">— 选择院校 —</option>';
var optB = '<option value="">— 选择院校 —</option>';
allSchools.forEach(function(s,i){
var isA = selectedA && selectedA.school === s.school && selectedA.score === s.score;
var isB = selectedB && selectedB.school === s.school && selectedB.score === s.score;
var label = esc(s.school) + ' | ' + esc(s.type) + ' | ' + s.score + '分';
optA += '<option value="'+i+'"'+(isA?' selected':'')+'>'+label+'</option>';
optB += '<option value="'+i+'"'+(isB?' selected':'')+'>'+label+'</option>';
});
selA.innerHTML = optA;
selB.innerHTML = optB;
}
function fillCompare(){
function fill(t, src){
document.getElementById(t+'Name').textContent = src ? src.school : '-';
document.getElementById(t+'Score').textContent = src ? src.score : '-';
document.getElementById(t+'Rank').textContent = src ? src.rank.toLocaleString() : '-';
document.getElementById(t+'Num').textContent = src ? (src.num||'-') : '-';
document.getElementById(t+'Type').textContent = src ? src.type : '-';
document.getElementById(t+'Req').textContent = src ? src.req : '-';
}
fill('a', selectedA);
fill('b', selectedB);
var sec = document.getElementById('compareSection');
sec.style.display = (selectedA || selectedB) ? 'grid' : 'none';
}
// 手动切换下拉框时同步
document.addEventListener('DOMContentLoaded', function(){
document.getElementById('schoolA').addEventListener('change', function(){
var idx = parseInt(this.value);
selectedA = (idx >= 0 && allSchools[idx]) ? allSchools[idx] : null;
fillCompare();
});
document.getElementById('schoolB').addEventListener('change', function(){
var idx = parseInt(this.value);
selectedB = (idx >= 0 && allSchools[idx]) ? allSchools[idx] : null;
fillCompare();
});
});
function esc(s){return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');}
function renderResultsPage(){
var area = document.getElementById('resultsArea');
var total = lastResults.length;
var totalPages = Math.max(1, Math.ceil(total / PAGE_SIZE));
if(currentPage < 1) currentPage = 1;
if(currentPage > totalPages) currentPage = totalPages;
var start = (currentPage - 1) * PAGE_SIZE;
var page = lastResults.slice(start, start + PAGE_SIZE);
var html = '<table class="results-table"><thead><tr><th>院校名称</th><th>招生类型</th><th>选科要求</th><th>2025投档分</th><th>投档位次</th><th>招生人数</th><th>操作</th></tr></thead><tbody>';
page.forEach(function(s){
var realIdx = allSchools.indexOf(s);
var selA = selectedA && selectedA.school === s.school && selectedA.score === s.score ? 'disabled' : '';
var selB = selectedB && selectedB.school === s.school && selectedB.score === s.score ? 'disabled' : '';
var groupLabel = s.group ? '<span style="color:#60a5fa;font-size:0.72rem">'+s.group+'</span>' : '';
var typeLabel = s.type + (s.group ? ' <span style="color:#60a5fa;font-size:0.72rem">'+s.group+'</span>' : '');
var tuitionLabel = s.tuition_annual
? '<span class="tuition-tag" style="background:rgba(102,126,234,0.18);color:#a5b4fc;border:1px solid rgba(102,126,234,0.3);border-radius:20px;padding:1px 8px;font-size:0.72rem;margin-left:6px;font-weight:600">' + s.tuition_annual.toLocaleString() + '元/年</span>'
: '';
html += '<tr>' +
'<td class="school-name">'+esc(s.school)+tuitionLabel+'</td>' +
'<td style="color:#fbbf24;font-size:0.82rem">'+typeLabel+'</td>' +
'<td style="color:#888;font-size:0.78rem">'+esc(s.req)+'</td>' +
'<td class="score">'+s.score+'</td>' +
'<td class="rank">'+s.rank.toLocaleString()+'</td>' +
'<td>'+(s.num||'-')+'</td>' +
'<td>' +
'<button class="add-btn" onclick="addCompareA('+realIdx+')" '+selA+'>→ A校</button> ' +
'<button class="add-btn" onclick="addCompareB('+realIdx+')" '+selB+'>→ B校</button>' +
'</td>' +
'</tr>';
});
html += '</tbody></table>';
// 分页控件
if(total > PAGE_SIZE){
html += '<div class="pagination">' +
'<button onclick="goPage(' + (currentPage-1) + ')" ' + (currentPage<=1?'disabled':'') + '>← 上一页</button>' +
'<span class="page-info">第 <span>' + currentPage + '</span> / ' + totalPages + ' 页,共 <span>' + total + '</span> 条</span>' +
'<button onclick="goPage(' + (currentPage+1) + ')" ' + (currentPage>=totalPages?'disabled':'') + '>下一页 →</button>' +
'</div>';
}
area.innerHTML = html;
}
function goPage(p){
currentPage = p;
renderResultsPage();
window.scrollTo({top: 0, behavior: 'smooth'});
}
// ===== 历史记录 =====
function addHistory(type, label, url, meta) {
var key = 'gaokao_history';
var list = JSON.parse(localStorage.getItem(key) || '[]');
list = list.filter(function(item){ return !(item.type === type && item.url === url); });
list.unshift({ type: type, label: label, url: url, meta: meta, time: Date.now() });
if(list.length > 6) list = list.slice(0, 6);
localStorage.setItem(key, JSON.stringify(list));
}
</script>
<div class="footer">
<div class="footer-inner">
<p class="footer-logo">高考志愿<span>助手</span></p>
<p class="footer-desc">数据来源:河南省教育考试院,仅供参考,不作为正式依据</p>
<p class="footer-contact-title">遇到问题?</p>
<div class="footer-qr">📷 微信二维码<br><span style="font-size:0.65rem;color:#666">待添加</span></div>
<div class="footer-bottom">© 2026 河南高考志愿助手 · 仅供辅助参考,不构成正式志愿填报依据</div>
</div>
</div>
</body>
</html>