// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
using System.Net;
namespace Admin.NET.Core.Service;
///
/// 请求日志服务 🧩
///
[ApiDescriptionSettings(Order = 330, Description = "请求日志")]
public class SysLogHttpService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository _sysLogHttpRep;
public SysLogHttpService(SqlSugarRepository sysLogHttpRep, SysDictTypeService sysDictTypeService, ISqlSugarClient sqlSugarClient)
{
_sysLogHttpRep = sysLogHttpRep;
}
///
/// 分页查询请求日志 🔖
///
///
///
[DisplayName("分页查询请求日志")]
[ApiDescriptionSettings(Name = "Page"), HttpPost]
public async Task> Page(PageLogHttpInput input)
{
input.Keyword = input.Keyword?.Trim();
var query = _sysLogHttpRep.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.HttpClientName.Contains(input.Keyword) || u.HttpApiDesc.Contains(input.Keyword) || u.RequestUrl.Contains(input.Keyword) || u.RequestBody.Contains(input.Keyword) || u.ResponseBody.Contains(input.Keyword) || u.Exception.Contains(input.Keyword))
.WhereIF(!string.IsNullOrWhiteSpace(input.HttpClientName), u => u.HttpClientName.Contains(input.HttpClientName.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.HttpApiDesc), u => u.HttpApiDesc.Contains(input.HttpApiDesc.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.RequestUrl), u => u.RequestUrl.Contains(input.RequestUrl.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.RequestBody), u => u.RequestBody.Contains(input.RequestBody.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.ResponseBody), u => u.ResponseBody.Contains(input.ResponseBody.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.Exception), u => u.Exception.Contains(input.Exception.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.HttpMethod), u => u.HttpMethod == input.HttpMethod)
.WhereIF(input.IsSuccessStatusCode != null, u => u.IsSuccessStatusCode == input.IsSuccessStatusCode)
.WhereIF(input.StatusCode != null, u => u.StatusCode == (HttpStatusCode)input.StatusCode)
.WhereIF(input.CreateTimeRange?.Length == 2, u => u.CreateTime >= input.CreateTimeRange[0] && u.CreateTime <= input.CreateTimeRange[1])
.Select();
query = query.MergeTable();
return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
}
///
/// 获取请求日志列表 🔖
///
///
[DisplayName("获取请求日志列表")]
[ApiDescriptionSettings(Name = "List"), HttpGet]
public async Task> GetList([FromQuery] PageLogHttpInput input)
{
return await _sysLogHttpRep.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.HttpClientName.Contains(input.Keyword) || u.HttpApiDesc.Contains(input.Keyword) || u.RequestUrl.Contains(input.Keyword) || u.RequestBody.Contains(input.Keyword) || u.ResponseBody.Contains(input.Keyword) || u.Exception.Contains(input.Keyword))
.WhereIF(!string.IsNullOrWhiteSpace(input.HttpClientName), u => u.HttpClientName.Contains(input.HttpClientName.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.HttpApiDesc), u => u.HttpApiDesc.Contains(input.HttpApiDesc.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.RequestUrl?.Trim()), u => u.RequestUrl.Contains(input.RequestUrl.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.RequestBody?.Trim()), u => u.RequestBody.Contains(input.RequestBody.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.ResponseBody?.Trim()), u => u.ResponseBody.Contains(input.ResponseBody.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.Exception?.Trim()), u => u.Exception.Contains(input.Exception.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.HttpMethod?.Trim()), u => u.HttpMethod == input.HttpMethod)
.WhereIF(input.IsSuccessStatusCode != null, u => u.IsSuccessStatusCode == input.IsSuccessStatusCode)
.WhereIF(input.StatusCode != null, u => u.StatusCode == (HttpStatusCode)input.StatusCode)
.WhereIF(input.CreateTimeRange?.Length == 2, u => u.CreateTime >= input.CreateTimeRange[0] && u.CreateTime <= input.CreateTimeRange[1])
.ToListAsync();
}
///
/// 获取请求日志详情 ℹ️
///
///
///
[DisplayName("获取请求日志详情")]
[ApiDescriptionSettings(Name = "Detail"), HttpGet]
public async Task Detail([FromQuery] BaseIdInput input)
{
return await _sysLogHttpRep.GetFirstAsync(u => u.Id == input.Id);
}
///
/// 按年按天数统计消息日志 🔖
///
///
[DisplayName("按年按天数统计消息日志")]
public async Task> GetYearDayStats()
{
var _db = _sysLogHttpRep.AsSugarClient();
var now = DateTime.Now;
var days = (now - now.AddYears(-1)).Days + 1;
var day365 = Enumerable.Range(0, days).Select(u => now.AddDays(-u)).ToList();
var queryableLeft = _db.Reportable(day365).ToQueryable();
var queryableRight = _db.Queryable(); //.SplitTable(tab => tab);
var list = await _db.Queryable(queryableLeft, queryableRight, JoinType.Left,
(x1, x2) => x1.ColumnName.Date == x2.CreateTime.Date)
.GroupBy((x1, x2) => x1.ColumnName)
.Select((x1, x2) => new StatLogOutput
{
Count = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Id > 0, 1, 0)),
Date = x1.ColumnName.ToString("yyyy-MM-dd")
})
.MergeTable()
.OrderBy(x => x.Date)
.ToListAsync();
return list;
}
///
/// 导出请求日志记录 🔖
///
///
///
[DisplayName("导出请求日志记录")]
[ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify]
public async Task Export(ExportLogHttpInput input)
{
var list = (await Page(input)).Items?.Adapt>() ?? new();
if (input.SelectKeyList?.Count > 0) list = list.Where(x => input.SelectKeyList.Contains(x.Id)).ToList();
return ExcelHelper.ExportTemplate(list, "请求日志导出记录");
}
}