Files
stock-advisor/static/js/stocks.js
T

73 lines
2.7 KiB
JavaScript

/* 股票池 */
let page = 1, total = 0, industries = [];
async function loadIndustries() {
try {
const d = await api('/api/overview');
industries = d.heat.map(h => h.industry);
const sel = $('#industry');
industries.forEach(i => {
const o = document.createElement('option');
o.textContent = i;
sel.appendChild(o);
});
} catch (e) {}
}
async function load(p) {
if (p) page = p;
const q = new URLSearchParams({
keyword: $('#kw').value.trim(),
industry: $('#industry').value,
board: $('#board').value,
rating: $('#rating').value,
sort: $('#sort').value,
order: $('#sort').value === 'score' ? 'desc' : 'desc',
page: page, per: 20
});
try {
const d = await api('/api/stocks?' + q.toString());
total = d.total;
render(d.items);
$('#pageInfo').textContent = `第 ${page} / ${Math.max(1, Math.ceil(total / 20))} 页 · 共 ${total} 只`;
$('#stCount').textContent = `共 ${total} 只`;
$('#prevBtn').disabled = page <= 1;
$('#nextBtn').disabled = page * 20 >= total;
} catch (e) {
$('#tb').innerHTML = '<tr><td colspan="12" class="empty">加载失败</td></tr>';
}
}
function render(items) {
if (!items.length) { $('#tb').innerHTML = '<tr><td colspan="12" class="empty">无匹配股票</td></tr>'; return; }
$('#tb').innerHTML = items.map(it => `<tr class="row-link" onclick="location.href='/stock/${it.code}'">
<td><b>${it.name}</b><div style="color:var(--muted);font-size:12px">${it.code}</div></td>
<td>${escapeHtml(it.industry)}</td>
<td style="color:var(--text2)">${it.board}</td>
<td class="num">${it.close}</td>
<td class="num ${pctClass(it.change_pct)}">${fmtPct(it.change_pct)}</td>
<td class="num ${pctClass(it.chg_5d)}">${fmtPct(it.chg_5d)}</td>
<td class="num">${it.vol_ratio}</td>
<td class="num">${fmtAmountYi(it.amount)}</td>
<td class="num">${Number(it.market_cap).toFixed(0)}亿</td>
<td class="num"><b style="color:${it.score >= 68 ? '#f59e0b' : it.score >= 55 ? '#3b82f6' : '#9da7b3'}">${it.score}</b></td>
<td><span class="tag tag-${it.rating}">${it.rating}</span></td>
<td><button class="btn" onclick="event.stopPropagation();addWatch('${it.code}')">⭐自选</button></td>
</tr>`).join('');
}
async function addWatch(code) {
try { await api('/api/watchlist/' + code, { method: 'POST' }); toast('已加入自选'); }
catch (e) { toast('操作失败'); }
}
$('#kw').addEventListener('keydown', e => { if (e.key === 'Enter') load(1); });
$('#kw').addEventListener('input', debounce(() => load(1), 400));
$('#industry').onchange = () => load(1);
$('#board').onchange = () => load(1);
$('#rating').onchange = () => load(1);
$('#sort').onchange = () => load(1);
loadIndustries();
load(1);