From 480000e1959c7585bf381c4ca469bfebfa838310 Mon Sep 17 00:00:00 2001 From: dekun Date: Thu, 25 Jun 2026 17:09:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=B3=BB=E7=BB=9F=E8=AE=BE=E7=BD=AE=20?= =?UTF-8?q?CTP=20=E8=BF=9E=E6=8E=A5=E6=8B=86=E5=88=86=E4=B8=BA=20SimNow/?= =?UTF-8?q?=E5=AE=9E=E7=9B=98=E5=8F=AF=E6=8A=98=E5=8F=A0=E5=8D=A1=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- templates/settings.html | 256 ++++++++++++++++++++++++++-------------- 1 file changed, 165 insertions(+), 91 deletions(-) diff --git a/templates/settings.html b/templates/settings.html index fd27add..5e886be 100644 --- a/templates/settings.html +++ b/templates/settings.html @@ -16,11 +16,29 @@ .settings-tips li::before{content:"";position:absolute;left:0;top:.55em;width:5px;height:5px;border-radius:50%;background:var(--accent)} .settings-ctp-grid{display:grid;grid-template-columns:1fr 1fr;gap:.65rem .75rem} .settings-ctp-grid .field-full{grid-column:1/-1} -.settings-ctp-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--border)} -.settings-ctp-section:last-of-type{border-bottom:none;margin-bottom:0;padding-bottom:0} -.settings-ctp-section h3{font-size:.9rem;margin:0 0 .65rem;color:var(--text-title)} +.settings-ctp-wrap .card-body{padding-top:0} +.settings-ctp-fold.card{ + margin-bottom:.75rem;padding:0;overflow:hidden; + border:1px solid var(--border);border-radius:8px;background:var(--card-inner); +} +.settings-ctp-fold.card:last-of-type{margin-bottom:0} +.settings-ctp-fold-head{ + width:100%;display:flex;align-items:center;justify-content:space-between;gap:.75rem; + padding:.7rem 1rem;margin:0;border:none;background:transparent;cursor:pointer; + font-size:.92rem;font-weight:600;color:var(--text-title);text-align:left; +} +.settings-ctp-fold-head:hover{color:var(--accent)} +.settings-ctp-fold-title{display:flex;align-items:center;gap:.5rem} +.settings-ctp-fold-chevron{ + flex-shrink:0;font-size:.72rem;color:var(--text-muted); + transition:transform .2s ease; +} +.settings-ctp-fold.is-collapsed .settings-ctp-fold-chevron{transform:rotate(-90deg)} +.settings-ctp-fold-body{padding:0 1rem .85rem} +.settings-ctp-fold.is-collapsed .settings-ctp-fold-body{display:none} .settings-ctp-status{font-size:.82rem;color:var(--text-muted);margin-top:.75rem;line-height:1.5} @media(max-width:900px){ + .settings-password-form{grid-template-columns:1fr} .settings-ctp-grid{grid-template-columns:1fr} } @@ -90,10 +108,9 @@ -
+

CTP 连接

-
- +

投资者代码、密码、前置地址在此维护(优先于 .env)。保存后请在持仓监控页点击「重连 CTP」。 {% if ctp_status.connected %} @@ -105,97 +122,117 @@ {% endif %}

-
-

SimNow 模拟盘

-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - + + + +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
-
-
-

期货公司实盘(后期)

-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
-
- -

- 官方第一套:180.168.146.187:10201/10211; - 7×24:182.254.243.31:40001/40011(新账号可能需满 3 个交易日)。 - 详见 docs/SIMNOW.md。 -

- + +

+ 官方第一套:180.168.146.187:10201/10211; + 7×24:182.254.243.31:40001/40011(新账号可能需满 3 个交易日)。 + 详见 docs/SIMNOW.md。 +

+ +
@@ -278,6 +315,43 @@ } if (sel) sel.addEventListener('change', syncSizingFields); syncSizingFields(); + + var CTP_FOLD_KEY = 'qihuo_ctp_fold'; + function setCtpFold(el, collapsed) { + if (!el) return; + el.classList.toggle('is-collapsed', collapsed); + var head = el.querySelector('.settings-ctp-fold-head'); + if (head) head.setAttribute('aria-expanded', collapsed ? 'false' : 'true'); + } + function saveCtpFoldState() { + var state = {}; + document.querySelectorAll('[data-ctp-fold]').forEach(function (el) { + state[el.getAttribute('data-ctp-fold')] = el.classList.contains('is-collapsed'); + }); + try { localStorage.setItem(CTP_FOLD_KEY, JSON.stringify(state)); } catch (e) { /* ignore */ } + } + function loadCtpFoldState() { + try { + var raw = localStorage.getItem(CTP_FOLD_KEY); + if (!raw) return; + var state = JSON.parse(raw); + document.querySelectorAll('[data-ctp-fold]').forEach(function (el) { + var key = el.getAttribute('data-ctp-fold'); + if (Object.prototype.hasOwnProperty.call(state, key)) { + setCtpFold(el, !!state[key]); + } + }); + } catch (e) { /* ignore */ } + } + document.querySelectorAll('.settings-ctp-fold-head').forEach(function (btn) { + btn.addEventListener('click', function () { + var panel = btn.closest('[data-ctp-fold]'); + if (!panel) return; + setCtpFold(panel, !panel.classList.contains('is-collapsed')); + saveCtpFoldState(); + }); + }); + loadCtpFoldState(); })(); {% endblock %}