From d481e1ae62731dd26c90fea5f1e2e3f58927709a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E4=B8=AD=E6=B4=8B?= Date: Wed, 3 Jun 2026 04:48:46 +0800 Subject: [PATCH] =?UTF-8?q?feat(log):=20=E8=AE=A1=E8=B4=B9=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E8=AE=B0=E5=BD=95=E5=9F=9F=E5=90=8D=E6=9D=A5=E6=BA=90?= =?UTF-8?q?(domain=5Fhost),=20=E4=BB=85=E7=AE=A1=E7=90=86=E5=91=98?= =?UTF-8?q?=E5=8F=AF=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 域名路由命中时把来源域名存入 ctx, 经 GenerateTextOtherInfo 写进 other.admin_info - 角色控制纯后端: admin_info 在用户日志接口被 formatUserLogs 自动剥离, 普通用户看不到 - 前端 details-dialog 在管理员区展示「域名来源」一行 --- constant/context_key.go | 4 ++++ middleware/domain_group_router.go | 1 + service/log_info_generate.go | 4 ++++ .../usage-logs/components/dialogs/details-dialog.tsx | 8 ++++++++ web/default/src/i18n/locales/en.json | 1 + web/default/src/i18n/locales/zh.json | 1 + 6 files changed, 19 insertions(+) diff --git a/constant/context_key.go b/constant/context_key.go index c28ad202..22986248 100644 --- a/constant/context_key.go +++ b/constant/context_key.go @@ -42,6 +42,10 @@ const ( ContextKeyAutoGroupIndex ContextKey = "auto_group_index" ContextKeyAutoGroupRetryIndex ContextKey = "auto_group_retry_index" + // ContextKeyDomainHost 记录命中域名路由时的来源域名(规范化后), + // 写入消费日志的 other.admin_info,仅管理员可见。 + ContextKeyDomainHost ContextKey = "domain_host" + /* user related keys */ ContextKeyUserId ContextKey = "id" ContextKeyUserSetting ContextKey = "user_setting" diff --git a/middleware/domain_group_router.go b/middleware/domain_group_router.go index 99eacfdf..cfae19d7 100644 --- a/middleware/domain_group_router.go +++ b/middleware/domain_group_router.go @@ -35,6 +35,7 @@ func DomainAutoGroupRouter() gin.HandlerFunc { if _, valid := setting.GetSecondaryAutoGroup(target); valid { common.SetContextKey(c, constant.ContextKeyUsingGroup, target) common.SetContextKey(c, constant.ContextKeyTokenGroup, target) + common.SetContextKey(c, constant.ContextKeyDomainHost, domain) logger.LogDebug(c, "domain routing: %s -> secondary auto group %s", domain, target) } } diff --git a/service/log_info_generate.go b/service/log_info_generate.go index 54448d59..940bf497 100644 --- a/service/log_info_generate.go +++ b/service/log_info_generate.go @@ -72,6 +72,10 @@ func GenerateTextOtherInfo(ctx *gin.Context, relayInfo *relaycommon.RelayInfo, m AppendChannelAffinityAdminInfo(ctx, adminInfo) + if domainHost := common.GetContextKeyString(ctx, constant.ContextKeyDomainHost); domainHost != "" { + adminInfo["domain_host"] = domainHost + } + other["admin_info"] = adminInfo appendRequestPath(ctx, relayInfo, other) appendRequestConversionChain(relayInfo, other) diff --git a/web/default/src/features/usage-logs/components/dialogs/details-dialog.tsx b/web/default/src/features/usage-logs/components/dialogs/details-dialog.tsx index 6f4adfb3..e4c08c6f 100644 --- a/web/default/src/features/usage-logs/components/dialogs/details-dialog.tsx +++ b/web/default/src/features/usage-logs/components/dialogs/details-dialog.tsx @@ -549,6 +549,14 @@ export function DetailsDialog(props: DetailsDialogProps) { )} + {other?.admin_info?.domain_host && props.isAdmin && ( + + )} + {props.log.token_name && (