/* 财经新闻 */ let page = 1, total = 0; async function load(p) { if (p) page = p; const q = new URLSearchParams({ keyword: $('#kw').value.trim(), category: $('#cat').value, page }); try { const d = await api('/api/news?' + q.toString()); total = d.total; render(d.items); $('#pageInfo').textContent = `第 ${page} / ${Math.max(1, Math.ceil(total / 15))} 页`; $('#count').textContent = `共 ${total} 条`; $('#prevBtn').disabled = page <= 1; $('#nextBtn').disabled = page * 15 >= total; } catch (e) { $('#listBox').innerHTML = '
加载失败
'; } } function render(items) { if (!items.length) { $('#listBox').innerHTML = '
无匹配新闻
'; return; } $('#listBox').innerHTML = items.map(n => `
${escapeHtml(n.title)}
${n.category} ${n.sentiment > 0 ? '利好' : n.sentiment < 0 ? '利空' : '中性'} ${escapeHtml(n.source)}${n.publish_date}
${escapeHtml(n.content)}
`).join(''); } async function showDetail(id) { try { const d = await api('/api/news/' + id); const n = d.news; const stocks = (d.stocks || []).map(s => `${s.name}(${s.code})`).join(' · ') || '无'; openModal(`

${escapeHtml(n.title)}

${n.category} ${n.sentiment > 0 ? '利好' : n.sentiment < 0 ? '利空' : '中性'}(${Number(n.sentiment).toFixed(2)}) ${escapeHtml(n.source)}${n.publish_date}
${escapeHtml(n.content)}
关联股票:${stocks}
`); } catch (e) { toast('加载失败'); } } $('#kw').addEventListener('keydown', e => { if (e.key === 'Enter') load(1); }); $('#kw').addEventListener('input', debounce(() => load(1), 400)); $('#cat').onchange = () => load(1); load(1);