From 1ffe62133ceee08fc7d53825b7b7672209a6c979 Mon Sep 17 00:00:00 2001 From: fontvielle Date: Thu, 14 May 2026 16:44:24 +0300 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=D0=B1=D0=B0=D0=BD=D0=BD=D0=B5?= =?UTF-8?q?=D1=80=20=C2=AB=F0=9F=9F=A1=20=D0=A0=D0=95=D0=96=D0=98=D0=9C=20?= =?UTF-8?q?=D0=AD=D0=9C=D0=A3=D0=9B=D0=AF=D0=A6=D0=98=D0=98=C2=BB=20=D1=81?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=85=D1=83=20=D1=81=D1=82=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=86=20=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=20mock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Когда ИШ НРД не настроен (NSD.IGWBaseURL пустой) или провайдер СКЗИ = stub — рисуем жёлтую плашку сверху каждой страницы админки с явной надписью «РЕЖИМ ЭМУЛЯЦИИ — реального обмена с НРД нет» и ссылкой «Настроить →» на /admin/wizard. Это нужно чтобы пользователь видя быстро-подтверждённую заявку не думал что это настоящий обмен. Реализация: добавлено поле IsMockMode/MockReason в page struct, nowPage() читает globalRC.Snapshot() и заполняет их. globalRC — пакетная переменная (заполняется один раз в RegisterAdmin), чтобы не таскать *RuntimeConfig через все renderXxx-вызовы. Сам баннер — в layout.html перед
, поэтому виден везде включая карточку заявки. --- internal/lkgateway/admin.go | 28 +++++++++++++++++--- internal/lkgateway/web/templates/layout.html | 10 +++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/internal/lkgateway/admin.go b/internal/lkgateway/admin.go index 5342346..08be921 100644 --- a/internal/lkgateway/admin.go +++ b/internal/lkgateway/admin.go @@ -140,11 +140,18 @@ func newAdmin() (*admin, error) { // page — общий "конверт" данных для всех шаблонов. type page struct { - Title string - Active string - Now string + Title string + Active string + Now string + IsMockMode bool // true если ИШ не настроен — bj-server в режиме эмуляции + MockReason string // короткое описание почему mock } +// globalRC — ссылка на runtime-конфиг для template-funcs/page helpers. +// Заполняется один раз в RegisterAdmin. Альтернатива — таскать rc через +// все renderXxx-функции, что шумно при широком фан-ауте. +var globalRC *RuntimeConfig + // homeData — данные дашборда. type homeData struct { page @@ -186,6 +193,7 @@ func RegisterAdmin(mux *http.ServeMux, svc *Service, rc *RuntimeConfig, getOpts if err != nil { return nil, err } + globalRC = rc mux.HandleFunc("/admin/", func(w http.ResponseWriter, r *http.Request) { p := strings.TrimPrefix(r.URL.Path, "/admin/") @@ -284,7 +292,19 @@ func render(w http.ResponseWriter, t *template.Template, data any) { } func nowPage(title, active string) page { - return page{Title: title, Active: active, Now: time.Now().Format("02.01.2006 15:04:05")} + p := page{Title: title, Active: active, Now: time.Now().Format("02.01.2006 15:04:05")} + if globalRC != nil { + s := globalRC.Snapshot() + switch { + case s.NSD.IGWBaseURL == "": + p.IsMockMode = true + p.MockReason = "ИШ НРД не настроен — заявки идут через внутренний mock (Decision эмитируется через 3 сек)" + case s.Crypto.Provider == "" || s.Crypto.Provider == "stub": + p.IsMockMode = true + p.MockReason = "Провайдер СКЗИ = stub — подпись не делается, реальный обмен с НРД невозможен" + } + } + return p } // topNews отбирает максимум N новостей: сначала те, что активны прямо сейчас diff --git a/internal/lkgateway/web/templates/layout.html b/internal/lkgateway/web/templates/layout.html index d3adf18..c15038b 100644 --- a/internal/lkgateway/web/templates/layout.html +++ b/internal/lkgateway/web/templates/layout.html @@ -54,6 +54,16 @@ button:hover, .btn:hover { opacity: .9; } {{.Now}} +{{if .IsMockMode}} +
+ 🟡 +
+ РЕЖИМ ЭМУЛЯЦИИ — реального обмена с НРД нет. + {{.MockReason}} +
+ Настроить → +
+{{end}}
{{template "content" .}}