feat(risk): show live countdown on freeze status badges

Expose freeze_until_ms from risk API and tick hub/instance badges with remaining 1h/4h/daily time.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-18 17:41:04 +08:00
parent 0280b4f065
commit 97370926d6
15 changed files with 272 additions and 41 deletions
+12
View File
@@ -529,6 +529,7 @@ STATIC_DIR = DIR / "static"
_REPO_STATIC = _REPO_ROOT / "static"
_AI_REVIEW_RENDER_JS = _REPO_STATIC / "ai_review_render.js"
_ACCOUNT_RISK_BADGE_CSS = _REPO_STATIC / "account_risk_badge.css"
_ACCOUNT_RISK_BADGE_JS = _REPO_STATIC / "account_risk_badge.js"
@app.get("/assets/account_risk_badge.css")
@@ -542,6 +543,17 @@ def hub_account_risk_badge_css():
)
@app.get("/assets/account_risk_badge.js")
def hub_account_risk_badge_js():
"""与四所实例共用仓库根 static/account_risk_badge.js。"""
if not _ACCOUNT_RISK_BADGE_JS.is_file():
raise HTTPException(status_code=404, detail="account_risk_badge.js not found")
return FileResponse(
str(_ACCOUNT_RISK_BADGE_JS),
media_type="application/javascript; charset=utf-8",
)
@app.get("/assets/ai_review_render.js")
def hub_ai_review_render_js():
"""与四所实例共用仓库根 static/ai_review_render.js(须在 /assets mount 之前注册)。"""
+2
View File
@@ -514,6 +514,7 @@
function formatRiskStatusBadge(riskStatus) {
if (!riskStatus || typeof riskStatus !== "object") return "";
if (window.AccountRiskBadge) return AccountRiskBadge.formatBadgeHtml(riskStatus, esc);
const st = riskStatus.status || "normal";
const label = esc(riskStatus.status_label || "正常");
const title = esc(riskStatus.reason || "");
@@ -4469,4 +4470,5 @@
setActiveNav();
});
});
if (window.AccountRiskBadge) AccountRiskBadge.startTicker();
})();
+3 -2
View File
@@ -16,7 +16,8 @@
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Orbitron:wght@500;600;700&display=swap" rel="stylesheet" media="print" onload="this.media='all'" />
<noscript><link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Orbitron:wght@500;600;700&display=swap" rel="stylesheet" /></noscript>
<link rel="stylesheet" href="/assets/app.css?v=20260618-macro-calendar" />
<link rel="stylesheet" href="/assets/account_risk_badge.css?v=1" />
<link rel="stylesheet" href="/assets/account_risk_badge.css?v=3" />
<script src="/assets/account_risk_badge.js?v=1"></script>
<link rel="stylesheet" href="/assets/dashboard.css?v=20260612-dash-monitor-count" />
</head>
<body>
@@ -689,6 +690,6 @@
<script src="/assets/dashboard.js?v=20260612-dash-monitor-count"></script>
<script src="/assets/ai_review_render.js?v=3"></script>
<script src="/assets/time_close_ui.js?v=2"></script>
<script src="/assets/app.js?v=20260618-macro-calendar"></script>
<script src="/assets/app.js?v=20260618-risk-countdown"></script>
</body>
</html>