using HoneyBox.Admin.Data; using HoneyBox.Admin.Entities; using HoneyBox.Admin.Models.Common; using HoneyBox.Admin.Models.OperationLog; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace HoneyBox.Admin.Services; /// /// 操作日志服务实现 /// public class OperationLogService : IOperationLogService { private readonly AdminDbContext _dbContext; private readonly ILogger _logger; public OperationLogService(AdminDbContext dbContext, ILogger logger) { _dbContext = dbContext; _logger = logger; } /// public async Task LogAsync(OperationLogRequest request) { var log = new Entities.OperationLog { AdminUserId = request.AdminUserId, Username = request.Username, Module = request.Module, Action = request.Action, Method = request.Method, Url = request.Url, Ip = request.Ip, RequestData = request.RequestData, ResponseData = request.ResponseData, Status = request.Status, ErrorMsg = request.ErrorMsg, Duration = request.Duration, CreatedAt = DateTime.Now }; _dbContext.OperationLogs.Add(log); await _dbContext.SaveChangesAsync(); } /// public async Task> GetListAsync(OperationLogQueryRequest request) { var query = _dbContext.OperationLogs.AsQueryable(); // 管理员ID筛选 if (request.AdminUserId.HasValue) { query = query.Where(l => l.AdminUserId == request.AdminUserId.Value); } // 用户名筛选 if (!string.IsNullOrWhiteSpace(request.Username)) { query = query.Where(l => l.Username != null && l.Username.Contains(request.Username)); } // 模块筛选 if (!string.IsNullOrWhiteSpace(request.Module)) { query = query.Where(l => l.Module == request.Module); } // 操作筛选 if (!string.IsNullOrWhiteSpace(request.Action)) { query = query.Where(l => l.Action == request.Action); } // 状态筛选 if (request.Status.HasValue) { query = query.Where(l => l.Status == request.Status.Value); } // 日期范围筛选 if (request.StartDate.HasValue) { query = query.Where(l => l.CreatedAt >= request.StartDate.Value); } if (request.EndDate.HasValue) { var endDate = request.EndDate.Value.AddDays(1); query = query.Where(l => l.CreatedAt < endDate); } var total = await query.CountAsync(); var list = await query .OrderByDescending(l => l.CreatedAt) .Skip((request.Page - 1) * request.PageSize) .Take(request.PageSize) .Select(l => new OperationLogDto { Id = l.Id, AdminUserId = l.AdminUserId, Username = l.Username, Module = l.Module, Action = l.Action, Method = l.Method, Url = l.Url, Ip = l.Ip, Status = l.Status, Duration = l.Duration, CreatedAt = l.CreatedAt }) .ToListAsync(); return new PagedResult { List = list, Total = total, Page = request.Page, PageSize = request.PageSize }; } /// public async Task GetByIdAsync(long id) { var log = await _dbContext.OperationLogs.FindAsync(id); if (log == null) { throw new AdminException(AdminErrorCodes.InvalidParameter, "日志不存在"); } return new OperationLogDto { Id = log.Id, AdminUserId = log.AdminUserId, Username = log.Username, Module = log.Module, Action = log.Action, Method = log.Method, Url = log.Url, Ip = log.Ip, RequestData = log.RequestData, ResponseData = log.ResponseData, Status = log.Status, ErrorMsg = log.ErrorMsg, Duration = log.Duration, CreatedAt = log.CreatedAt }; } }