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' %} - +