diff --git a/crypto_monitor_binance/app.py b/crypto_monitor_binance/app.py index 217f197..970e0a5 100644 --- a/crypto_monitor_binance/app.py +++ b/crypto_monitor_binance/app.py @@ -7385,6 +7385,12 @@ def stats_page(): return render_main_page("stats") +@app.route("/risk_policy") +@login_required +def risk_policy_page(): + return render_main_page("risk_policy") + + @app.route("/settings") @login_required def settings_page(): diff --git a/crypto_monitor_gate/app.py b/crypto_monitor_gate/app.py index 6a7f8b6..3d0d116 100644 --- a/crypto_monitor_gate/app.py +++ b/crypto_monitor_gate/app.py @@ -7200,6 +7200,12 @@ def stats_page(): return render_main_page("stats") +@app.route("/risk_policy") +@login_required +def risk_policy_page(): + return render_main_page("risk_policy") + + @app.route("/settings") @login_required def settings_page(): diff --git a/crypto_monitor_okx/app.py b/crypto_monitor_okx/app.py index 28b8815..7cc4b99 100644 --- a/crypto_monitor_okx/app.py +++ b/crypto_monitor_okx/app.py @@ -6819,6 +6819,15 @@ def stats_page(): return render_main_page("stats") +@app.route("/risk_policy") +@login_required +def risk_policy_page(): + redir = redirect_to_embed_shell_if_enabled("risk_policy") + if redir is not None: + return redir + return render_main_page("risk_policy") + + @app.route("/settings") @login_required def settings_page(): diff --git a/lib/common/static/instance_embed.js b/lib/common/static/instance_embed.js index 7d00bad..b33659b 100644 --- a/lib/common/static/instance_embed.js +++ b/lib/common/static/instance_embed.js @@ -11,6 +11,7 @@ options: "/options", records: "/records", stats: "/stats", + risk_policy: "/risk_policy", settings: "/settings", }; @@ -242,9 +243,9 @@ } function syncShellChrome(tab) { - const onSettings = tab === "settings"; + const hideTopBar = tab === "settings" || tab === "risk_policy"; document.querySelectorAll(".instance-top-bar").forEach((el) => { - el.hidden = onSettings; + el.hidden = hideTopBar; }); } diff --git a/lib/common/static/instance_theme.css b/lib/common/static/instance_theme.css index 86a6459..7a32a71 100644 --- a/lib/common/static/instance_theme.css +++ b/lib/common/static/instance_theme.css @@ -2181,6 +2181,19 @@ html[data-theme="light"] .journal-detail-img-thumb { background: #eef2f7; } +/* ── 风控说明页 ── */ +.risk-policy-page { + margin-top: 12px; +} + +.settings-page--ops { + max-width: 720px; +} + +.settings-page--ops .settings-card--side-panel { + height: auto; +} + /* ── 系统设置页 ── */ .settings-page { margin-top: 12px; diff --git a/lib/instance/instance_embed_context_lib.py b/lib/instance/instance_embed_context_lib.py index 3178a5f..f7d7463 100644 --- a/lib/instance/instance_embed_context_lib.py +++ b/lib/instance/instance_embed_context_lib.py @@ -38,11 +38,11 @@ def embed_render_plan(page: str, embed_mode: str | None) -> EmbedRenderPlan: ) is_shell = embed_mode == "shell" is_strategy = page in EMBED_STRATEGY_PAGES - is_settings = page == "settings" + is_settings_like = page in ("settings", "risk_policy") return EmbedRenderPlan( exchange_capitals=is_shell, records_rows=page == "records", - records_summary=is_shell and page != "records" and not is_settings, + records_summary=is_shell and page != "records" and not is_settings_like, key_history=page == "key_monitor", key_list=page in ("key_monitor", "trade") or is_strategy, orders=page == "trade" or is_strategy, diff --git a/lib/instance/instance_embed_lib.py b/lib/instance/instance_embed_lib.py index f3e1c19..29fe341 100644 --- a/lib/instance/instance_embed_lib.py +++ b/lib/instance/instance_embed_lib.py @@ -18,6 +18,7 @@ EMBED_TABS: tuple[str, ...] = ( "options", "records", "stats", + "risk_policy", "settings", ) @@ -32,6 +33,7 @@ PATH_TO_EMBED_TAB: dict[str, str] = { "/options": "options", "/records": "records", "/stats": "stats", + "/risk_policy": "risk_policy", "/settings": "settings", } diff --git a/lib/instance/instance_settings_lib.py b/lib/instance/instance_settings_lib.py index 7d94826..c784887 100644 --- a/lib/instance/instance_settings_lib.py +++ b/lib/instance/instance_settings_lib.py @@ -184,6 +184,6 @@ def build_instance_settings_view( def settings_page_context(page: str, **kwargs: Any) -> dict[str, Any]: - if (page or "").strip() != "settings": + if (page or "").strip() not in ("settings", "risk_policy"): return {} return {"instance_settings": build_instance_settings_view(**kwargs)} diff --git a/lib/instance/templates/embed_page_fragment.html b/lib/instance/templates/embed_page_fragment.html index 7efb1d2..5d5624b 100644 --- a/lib/instance/templates/embed_page_fragment.html +++ b/lib/instance/templates/embed_page_fragment.html @@ -396,6 +396,9 @@ {% endif %} + {% if page == 'risk_policy' %} + {% include 'risk_policy_panel.html' %} + {% endif %} {% if page == 'settings' %} {% include 'settings_panel.html' %} {% endif %} diff --git a/lib/instance/templates/embed_shell.html b/lib/instance/templates/embed_shell.html index 8d1c860..21a2c71 100644 --- a/lib/instance/templates/embed_shell.html +++ b/lib/instance/templates/embed_shell.html @@ -39,12 +39,13 @@ {% if options_nav_visible %} 期权 {% endif %} + 风控说明 系统设置 {% include 'instance_header_panel.html' %} - {% if initial_tab != 'settings' and include_transfer_block %} + {% if initial_tab not in ('settings', 'risk_policy') and include_transfer_block %} {% include 'instance_top_bar.html' %} {% endif %} @@ -89,6 +90,6 @@ const ORDER_ENTRY_MODEL_CODE_TO_CATEGORY = {{ entry_model_code_to_category | toj {% include 'embed_boot_scripts.html' %} - + diff --git a/lib/instance/templates/index.html b/lib/instance/templates/index.html index bf2874a..1428715 100644 --- a/lib/instance/templates/index.html +++ b/lib/instance/templates/index.html @@ -64,12 +64,13 @@ {% if options_nav_visible %} 期权 {% endif %} + 风控说明 系统设置 {% with msg=get_flashed_messages() %}{% if msg %}
{{ msg[0] }}
{% endif %}{% endwith %} {% include 'instance_header_panel.html' %} - {% if page != 'settings' and page != 'options' %} + {% if page not in ('settings', 'risk_policy', 'options') %} {% include 'instance_top_bar.html' %} {% endif %} @@ -467,6 +468,10 @@ {% endif %} + {% if page == 'risk_policy' %} + {% include 'risk_policy_panel.html' %} + {% endif %} + {% if page == 'settings' %} {% include 'settings_panel.html' %} {% endif %} diff --git a/lib/instance/templates/risk_policy_panel.html b/lib/instance/templates/risk_policy_panel.html new file mode 100644 index 0000000..f57617a --- /dev/null +++ b/lib/instance/templates/risk_policy_panel.html @@ -0,0 +1,39 @@ +{# 风控说明:只读展示 .env 风控参数与当前账户状态 #} +
+
+

风控说明

+

+ 当前账户状态: + + {{ instance_settings.risk_status_label }} + + {% if instance_settings.risk_status_reason %} + {{ instance_settings.risk_status_reason }} + {% endif %} +

+ {% if instance_settings.trade_policy_note %} +

账户限制:{{ instance_settings.trade_policy_note }}

+ {% endif %} +

以下参数读取自本实例 .env,修改后需重启进程生效。

+
+ {% for section in instance_settings.sections %} +
+

{{ section.title }}

+
+ {% for row in section.rows %} +
+
{{ row.label }}
+
+ {{ row.value }} + {% if row.note %} + {{ row.note }} + {% endif %} +
+
+ {% endfor %} +
+
+ {% endfor %} +
+
+
diff --git a/lib/instance/templates/settings_panel.html b/lib/instance/templates/settings_panel.html index 9a43a39..0982c98 100644 --- a/lib/instance/templates/settings_panel.html +++ b/lib/instance/templates/settings_panel.html @@ -1,77 +1,36 @@ -{# 系统设置:左风控说明 · 右资金划转 + 数据导出(顶栏资金与统计见 instance_header_panel) #} -
-
-
-

风控说明

-

- 当前账户状态: - - {{ instance_settings.risk_status_label }} - - {% if instance_settings.risk_status_reason %} - {{ instance_settings.risk_status_reason }} - {% endif %} -

- {% if instance_settings.trade_policy_note %} -

账户限制:{{ instance_settings.trade_policy_note }}

- {% endif %} -

以下参数读取自本实例 .env,修改后需重启进程生效。

-
- {% for section in instance_settings.sections %} -
-

{{ section.title }}

-
- {% for row in section.rows %} -
-
{{ row.label }}
-
- {{ row.value }} - {% if row.note %} - {{ row.note }} - {% endif %} -
-
- {% endfor %} -
-
- {% endfor %} +{# 系统设置:资金划转 + 数据导出(顶栏资金与统计见 instance_header_panel) #} +
+
+
+ {% if instance_settings.options_settings_enabled %} +
+

币种兑换

+ {% include 'options_settings_swap.html' %}
-
+
+

期权资金划转

+ {% include 'options_settings_transfer.html' %} +
+ {% include 'options_settings_panel.html' %} + {% endif %} + {% if instance_settings.show_transfer %} +
+

永续资金划转

+

子账户永续:资金账户与交易账户之间划转 USDT。

+ {% include 'instance_transfer_panel.html' %} +
+ {% endif %} -
-
-
- {% if instance_settings.options_settings_enabled %} -
-

币种兑换

- {% include 'options_settings_swap.html' %} -
-
-

期权资金划转

- {% include 'options_settings_transfer.html' %} -
- {% include 'options_settings_panel.html' %} - {% endif %} - {% if instance_settings.show_transfer %} -
-

永续资金划转

-

子账户永续:资金账户与交易账户之间划转 USDT。

- {% include 'instance_transfer_panel.html' %} -
- {% endif %} - -
-
- 数据导出 - CSV · v{{ instance_settings.data_export_version }} -
- -
+
+
+ 数据导出 + CSV · v{{ instance_settings.data_export_version }} +
+
diff --git a/tests/test_instance_embed_lib.py b/tests/test_instance_embed_lib.py index 9072ec7..ef6b4af 100644 --- a/tests/test_instance_embed_lib.py +++ b/tests/test_instance_embed_lib.py @@ -28,7 +28,9 @@ def test_embed_tabs_cover_main_nav(): assert "trade" in EMBED_TABS assert "key_monitor" in EMBED_TABS assert "records" in EMBED_TABS + assert "risk_policy" in EMBED_TABS assert "settings" in EMBED_TABS + assert path_to_embed_tab("/risk_policy") == "risk_policy" assert path_to_embed_tab("/settings") == "settings"