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}