From ff82bddbc66d28a469231fab1ffc16e0977a8cd8 Mon Sep 17 00:00:00 2001 From: hailin Date: Tue, 10 Mar 2026 01:27:31 -0700 Subject: [PATCH] =?UTF-8?q?fix(mining-admin):=20=E5=AE=A1=E8=AE=A1?= =?UTF-8?q?=E6=97=A5=E5=BF=97=20keyword=20=E6=90=9C=E7=B4=A2=E3=80=81?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E5=88=97=E3=80=81=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E4=B8=AD=E6=96=87=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. keyword 搜索实际生效:按 resourceId 和管理员用户名模糊匹配 2. LOGIN_FAILED 无账号时管理员列显示尝试的用户名(而非 unknown) 3. 详情列对 LOGIN_FAILED reason 做中文映射 Co-Authored-By: Claude Sonnet 4.6 --- .../src/api/controllers/audit.controller.ts | 3 ++- .../application/services/dashboard.service.ts | 7 ++++++ .../src/app/(dashboard)/audit-logs/page.tsx | 24 +++++++++++++++++-- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/backend/services/mining-admin-service/src/api/controllers/audit.controller.ts b/backend/services/mining-admin-service/src/api/controllers/audit.controller.ts index 4d897b42..d3abd533 100644 --- a/backend/services/mining-admin-service/src/api/controllers/audit.controller.ts +++ b/backend/services/mining-admin-service/src/api/controllers/audit.controller.ts @@ -28,6 +28,7 @@ export class AuditController { adminId, action, resource, + keyword, page: page ?? 1, pageSize: pageSize ?? 20, }); @@ -37,7 +38,7 @@ export class AuditController { items: result.data.map((log: any) => ({ id: log.id, adminId: log.adminId, - adminUsername: log.admin?.username || 'unknown', + adminUsername: log.admin?.username || (log.action === 'LOGIN_FAILED' ? log.resourceId : null) || 'unknown', action: log.action, resource: log.resource, resourceId: log.resourceId, diff --git a/backend/services/mining-admin-service/src/application/services/dashboard.service.ts b/backend/services/mining-admin-service/src/application/services/dashboard.service.ts index d11e4f1c..4ca48a4c 100644 --- a/backend/services/mining-admin-service/src/application/services/dashboard.service.ts +++ b/backend/services/mining-admin-service/src/application/services/dashboard.service.ts @@ -575,6 +575,7 @@ export class DashboardService { adminId?: string; action?: string; resource?: string; + keyword?: string; page?: number; pageSize?: number; }): Promise<{ data: any[]; total: number; pagination: any }> { @@ -582,6 +583,12 @@ export class DashboardService { if (options.adminId) where.adminId = options.adminId; if (options.action) where.action = options.action; if (options.resource) where.resource = options.resource; + if (options.keyword) { + where.OR = [ + { resourceId: { contains: options.keyword, mode: 'insensitive' } }, + { admin: { username: { contains: options.keyword, mode: 'insensitive' } } }, + ]; + } const page = options.page ?? 1; const pageSize = options.pageSize ?? 50; diff --git a/frontend/mining-admin-web/src/app/(dashboard)/audit-logs/page.tsx b/frontend/mining-admin-web/src/app/(dashboard)/audit-logs/page.tsx index 9f7951a0..83995818 100644 --- a/frontend/mining-admin-web/src/app/(dashboard)/audit-logs/page.tsx +++ b/frontend/mining-admin-web/src/app/(dashboard)/audit-logs/page.tsx @@ -41,6 +41,25 @@ const actionLabels: Record = { INIT: { label: '初始化', className: 'bg-slate-100 text-slate-600' }, }; +const loginFailedReasonLabels: Record = { + user_not_found: '用户名不存在', + account_disabled: '账号已禁用', + wrong_password: '密码错误', +}; + +function formatDetails(details: string | null, action: string): string { + if (!details) return '-'; + if (action === 'LOGIN_FAILED') { + try { + const parsed = JSON.parse(details); + return loginFailedReasonLabels[parsed.reason] || parsed.reason || details; + } catch { + return details; + } + } + return details; +} + const resourceLabels: Record = { AUTH: '认证', CONFIG: '系统配置', @@ -145,6 +164,7 @@ export default function AuditLogsPage() { ) : ( items.map((log) => { const actionInfo = actionLabels[log.action] || { label: log.action, className: '' }; + const detailDisplay = formatDetails(log.details, log.action); return ( {formatDateTime(log.createdAt)} @@ -158,8 +178,8 @@ export default function AuditLogsPage() { {resourceLabels[log.resource] || log.resource} {log.resourceId || '-'} - - {log.details || '-'} + + {detailDisplay} {log.ipAddress}