6f3ac3deb6
扩展新浪K线拉取与合成逻辑,提供 ECharts 交互图表及实时报价 API。 Co-authored-by: Cursor <cursoragent@cursor.com>
84 lines
4.1 KiB
HTML
84 lines
4.1 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}行情K线 - 国内期货监控系统{% endblock %}
|
|
{% block content %}
|
|
|
|
<div class="card market-card">
|
|
<h2>行情 K 线</h2>
|
|
<form class="market-toolbar" id="market-form" onsubmit="return false;">
|
|
<div class="symbol-wrap market-symbol-wrap">
|
|
<input type="text" class="symbol-input" id="market-symbol-input" placeholder="输入品种或合约,如 ag2608" autocomplete="off" value="{{ symbol }}">
|
|
<input type="hidden" name="symbol" id="market-symbol-hidden" value="{{ symbol }}">
|
|
<input type="hidden" name="symbol_name" id="market-symbol-name">
|
|
<input type="hidden" name="market_code" id="market-market-code">
|
|
<input type="hidden" name="sina_code" id="market-sina-code">
|
|
<div class="symbol-dropdown"></div>
|
|
<div class="symbol-selected" id="market-symbol-selected"></div>
|
|
</div>
|
|
<div class="market-period-tabs" id="market-period-tabs">
|
|
{% for p in market_periods %}
|
|
<button type="button" class="period-tab{% if p.key == period %} active{% endif %}" data-period="{{ p.key }}">{{ p.label }}</button>
|
|
{% endfor %}
|
|
</div>
|
|
<button type="button" class="btn-primary" id="market-load-btn">查看</button>
|
|
</form>
|
|
<div class="market-quote" id="market-quote">
|
|
<span class="market-quote-name" id="market-quote-name">—</span>
|
|
<span class="market-quote-price" id="market-quote-price">—</span>
|
|
<span class="market-quote-meta text-muted" id="market-quote-meta"></span>
|
|
</div>
|
|
<div class="market-chart-wrap">
|
|
<div id="market-chart" class="market-chart" aria-label="K线图"></div>
|
|
<div class="market-chart-empty" id="market-chart-empty">请选择合约并点击「查看」</div>
|
|
</div>
|
|
<p class="hint">数据来源:新浪财经。分时图为当日分钟走势;2分/2小时/周线由基础周期合成。</p>
|
|
</div>
|
|
|
|
<style>
|
|
.market-card h2{margin-bottom:.75rem}
|
|
.market-toolbar{display:flex;flex-wrap:wrap;gap:.65rem;align-items:flex-end;margin-bottom:.75rem}
|
|
.market-symbol-wrap{flex:1;min-width:200px;max-width:360px}
|
|
.market-period-tabs{display:flex;flex-wrap:wrap;gap:.35rem;align-items:center}
|
|
.period-tab{
|
|
padding:.4rem .65rem;border-radius:999px;
|
|
border:1px solid var(--input-border);
|
|
background:var(--toggle-bg);color:var(--text-muted);
|
|
font-size:.78rem;cursor:pointer;width:auto;white-space:nowrap;
|
|
}
|
|
.period-tab:hover{border-color:var(--accent);color:var(--accent)}
|
|
.period-tab.active{
|
|
background:linear-gradient(135deg,var(--accent),var(--accent-2));
|
|
border-color:transparent;color:#fff;
|
|
}
|
|
#market-load-btn{width:auto;padding:.55rem 1.25rem;font-size:.85rem}
|
|
.market-quote{
|
|
display:flex;flex-wrap:wrap;align-items:baseline;gap:.5rem 1rem;
|
|
margin-bottom:.75rem;padding:.65rem .85rem;
|
|
background:var(--card-inner);border-radius:10px;border:1px solid var(--card-border);
|
|
}
|
|
.market-quote-name{font-weight:600;color:var(--text-title)}
|
|
.market-quote-price{font-size:1.35rem;font-weight:700;color:var(--accent);font-variant-numeric:tabular-nums}
|
|
.market-chart-wrap{
|
|
position:relative;border-radius:12px;border:1px solid var(--card-border);
|
|
background:var(--card-inner);min-height:420px;
|
|
}
|
|
.market-chart{width:100%;height:min(62vh,520px);min-height:360px}
|
|
.market-chart-empty{
|
|
position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
|
|
color:var(--text-muted);font-size:.9rem;pointer-events:none;
|
|
}
|
|
.market-chart-wrap.has-data .market-chart-empty{display:none}
|
|
@media(max-width:767px){
|
|
.market-toolbar{align-items:stretch}
|
|
.market-symbol-wrap{max-width:none}
|
|
.market-period-tabs{order:3;width:100%}
|
|
#market-load-btn{order:4;width:100%}
|
|
.market-chart{min-height:300px;height:50vh}
|
|
}
|
|
</style>
|
|
{% endblock %}
|
|
|
|
{% block extra_js %}
|
|
<script src="https://cdn.jsdelivr.net/npm/echarts@5.5.1/dist/echarts.min.js"></script>
|
|
<script src="{{ url_for('static', filename='js/market.js') }}"></script>
|
|
{% endblock %}
|