Use Sina-only market K-lines and editable admin login synced to .env.

Market page uses Sina for quotes and bars with an auto-follow toggle and incremental chart updates while panning. Settings lets users change username and password, persisting to the database and .env.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-26 13:53:12 +08:00
parent 6905373401
commit 382a9a0e14
9 changed files with 324 additions and 75 deletions
+20 -1
View File
@@ -41,12 +41,16 @@
</div>
<span class="market-refresh-hint text-muted" id="market-refresh-hint"></span>
</div>
<div class="market-chart-auto-row">
<button type="button" class="chart-auto-btn is-active" id="market-auto-btn" title="开启后自动跟随最新 K 线">自动</button>
<span class="hint market-auto-hint">关闭后可自由拖动查看历史,刷新时只更新最新 K 线,不重置视图</span>
</div>
<div class="market-chart-wrap" id="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 class="market-chart-loading" id="market-chart-loading">连接中…</div>
</div>
<p class="hint">图表引擎:TradingView Lightweight Charts(红跌绿涨)。数据来源:{% if ctp_connected %}报价 CTPK 线历史新浪补齐、最新 bar 由 CTP tick 更新{% else %}CTP 未连接时回退新浪{% endif %}。滚轮缩放、拖拽平移;勾选「间隔日」可压缩夜盘空白</p>
<p class="hint">图表引擎:TradingView Lightweight Charts(红跌绿涨)。K 线与报价均使用<strong>新浪</strong>数据。滚轮缩放、拖拽平移;关闭「自动」后拖动查看历史时,推送更新不会重置画面</p>
</div>
<style>
@@ -102,6 +106,21 @@
.chart-zoom-btn:hover{border-color:var(--accent);color:var(--accent)}
.chart-zoom-reset{width:auto;padding:0 .65rem;font-size:.75rem}
.market-refresh-hint{font-size:.72rem}
.market-chart-auto-row{
display:flex;align-items:center;gap:.65rem;flex-wrap:wrap;
margin-bottom:.5rem;
}
.chart-auto-btn{
padding:.38rem .85rem;border-radius:999px;
border:1px solid var(--input-border);background:var(--toggle-bg);
color:var(--text-muted);font-size:.78rem;cursor:pointer;width:auto;
}
.chart-auto-btn:hover{border-color:var(--accent);color:var(--accent)}
.chart-auto-btn.is-active{
background:linear-gradient(135deg,var(--accent),var(--accent-2));
border-color:transparent;color:#fff;
}
.market-auto-hint{font-size:.72rem;margin:0}
.market-chart-wrap{
position:relative;border-radius:12px;border:1px solid var(--card-border);
background:var(--card-inner);
+11 -9
View File
@@ -420,28 +420,30 @@
</details>
{% endcall %}
{% call settings_card('password', '修改密码', 'settings-compact-card') %}
{% call settings_card('password', '登录账号', 'settings-compact-card') %}
<form action="{{ url_for('settings') }}" method="post" class="settings-password-form">
<input type="hidden" name="action" value="password">
<div class="field field-full">
<label>当前账号</label>
<input type="text" value="{{ username }}" disabled>
<label>用户名</label>
<input name="admin_username" type="text" value="{{ username }}" required maxlength="64"
pattern="[A-Za-z0-9_.@-]+" autocomplete="username">
</div>
<div class="field">
<div class="field field-full">
<label>原密码</label>
<input name="old_password" type="password" required>
<input name="old_password" type="password" required autocomplete="current-password">
</div>
<div class="field">
<label>新密码</label>
<input name="new_password" type="password" required minlength="6" placeholder="至少 6 位">
<input name="new_password" type="password" minlength="6" placeholder="留空则不修改" autocomplete="new-password">
</div>
<div class="field field-full">
<div class="field">
<label>确认新密码</label>
<input name="new_password2" type="password" required minlength="6">
<input name="new_password2" type="password" minlength="6" placeholder="修改密码时填写" autocomplete="new-password">
</div>
<div class="field-full">
<button type="submit" class="btn-primary">修改密码</button>
<button type="submit" class="btn-primary">保存账号</button>
</div>
<p class="hint" style="margin:.45rem 0 0;font-size:.72rem">保存后写入数据库,并同步至 <code>.env</code><code>ADMIN_USERNAME</code> / <code>ADMIN_PASSWORD</code></p>
</form>
{% endcall %}
</div>