From 064d91e4ce06eecd7b3128f10fbc472d4984951a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=B5=E4=BD=A0=E4=B8=AA=E6=B1=AA=E5=91=80?= Date: Wed, 20 Aug 2025 19:52:07 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8D=93=20feat(Http):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E5=90=8D=E7=A7=B0=E5=92=8C=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=8F=8F=E8=BF=B0=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Attribute/HttpRemoteApiAttribute.cs | 25 +++++++++++++++++++ Admin.NET/Admin.NET.Core/Const/CommonConst.cs | 11 ++++++++ Admin.NET/Admin.NET.Core/Entity/SysLogHttp.cs | 14 +++++++++++ .../Logging/HttpLoggingHandler.cs | 9 +++++-- .../Service/Log/Dto/LogHttpInput.cs | 10 ++++++++ .../Service/Log/SysLogHttpService.cs | 7 +++++- .../log/loghttp/component/logDetail.vue | 6 +++++ Web/src/views/system/log/loghttp/index.vue | 12 +++++++++ 8 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 Admin.NET/Admin.NET.Core/Attribute/HttpRemoteApiAttribute.cs diff --git a/Admin.NET/Admin.NET.Core/Attribute/HttpRemoteApiAttribute.cs b/Admin.NET/Admin.NET.Core/Attribute/HttpRemoteApiAttribute.cs new file mode 100644 index 00000000..d02b7aca --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Attribute/HttpRemoteApiAttribute.cs @@ -0,0 +1,25 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 远程请求接口特性 +/// +[AttributeUsage(AttributeTargets.Class)] +public class HttpRemoteApiAttribute : Attribute +{ + /// + /// 编码 + /// + [Required] + public string Code { get; set; } + + /// + /// 描述 + /// + public string Desc { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Const/CommonConst.cs b/Admin.NET/Admin.NET.Core/Const/CommonConst.cs index ef4638e9..2c52438c 100644 --- a/Admin.NET/Admin.NET.Core/Const/CommonConst.cs +++ b/Admin.NET/Admin.NET.Core/Const/CommonConst.cs @@ -36,4 +36,15 @@ public class CommonConst /// 事件-发送异常邮件 /// public const string SendErrorMail = "Send:ErrorMail"; + + /// + /// 远程请求配置客户端名称键名 + /// + public const string HttpRemoteClientName = "__HTTP_CLIENT_NAME__"; + + /// + /// 远程请求请求头接口描述键值 + /// + public const string HttpRemoteApiDescHeaderName = "__HTTP_CLIENT_API_DESC__"; + } \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysLogHttp.cs b/Admin.NET/Admin.NET.Core/Entity/SysLogHttp.cs index c6eb69be..f8218e50 100644 --- a/Admin.NET/Admin.NET.Core/Entity/SysLogHttp.cs +++ b/Admin.NET/Admin.NET.Core/Entity/SysLogHttp.cs @@ -16,6 +16,20 @@ namespace Admin.NET.Core; [LogTable] public partial class SysLogHttp : EntityBaseId { + /// + /// 客户端名称 + /// + [SugarColumn(ColumnDescription = "客户端名称", Length = 32)] + [MaxLength(32)] + public string? HttpClientName { get; set; } + + /// + /// 接口描述 + /// + [SugarColumn(ColumnDescription = "接口描述", Length = 32)] + [MaxLength(32)] + public string? HttpApiDesc { get; set; } + /// /// 请求方式 /// diff --git a/Admin.NET/Admin.NET.Core/Logging/HttpLoggingHandler.cs b/Admin.NET/Admin.NET.Core/Logging/HttpLoggingHandler.cs index c59cb126..3a7c780f 100644 --- a/Admin.NET/Admin.NET.Core/Logging/HttpLoggingHandler.cs +++ b/Admin.NET/Admin.NET.Core/Logging/HttpLoggingHandler.cs @@ -11,7 +11,6 @@ namespace Admin.NET.Core; /// public class HttpLoggingHandler : DelegatingHandler, ITransient { - private const string HttpName = "__HTTP_CLIENT_NAME__"; private readonly Dictionary _enabledLogMap; private readonly SysConfigService _sysConfigService; private readonly IEventPublisher _eventPublisher; @@ -35,11 +34,17 @@ public class HttpLoggingHandler : DelegatingHandler, ITransient if (!enabledLog) return await base.SendAsync(request, cancellationToken); // 判断当前配置日志开关 - request.Options.TryGetValue(HttpName, out var clientName); + request.Options.TryGetValue(CommonConst.HttpRemoteClientName, out var clientName); if (!string.IsNullOrWhiteSpace(clientName)) enabledLog = _enabledLogMap.GetOrDefault(clientName); if (!enabledLog) return await base.SendAsync(request, cancellationToken); var sysLogHttp = new SysLogHttp(); + sysLogHttp.HttpClientName = clientName; + + // 获取接口描述,并移除 + sysLogHttp.HttpApiDesc = request.Headers.FirstOrDefault(u => u.Key == CommonConst.HttpRemoteApiDescHeaderName).Value?.FirstOrDefault(); + request.Headers.Remove(CommonConst.HttpRemoteApiDescHeaderName); + sysLogHttp.HttpMethod = request.Method.Method; sysLogHttp.RequestUrl = request.RequestUri?.ToString(); sysLogHttp.RequestHeaders = request.Headers.ToDictionary(u => u.Key, u => u.Value.Join(";")).ToJson(); diff --git a/Admin.NET/Admin.NET.Core/Service/Log/Dto/LogHttpInput.cs b/Admin.NET/Admin.NET.Core/Service/Log/Dto/LogHttpInput.cs index d9c208b0..33c1dea7 100644 --- a/Admin.NET/Admin.NET.Core/Service/Log/Dto/LogHttpInput.cs +++ b/Admin.NET/Admin.NET.Core/Service/Log/Dto/LogHttpInput.cs @@ -87,6 +87,16 @@ public class PageLogHttpInput : BasePageInput /// public string SearchKey { get; set; } + /// + /// 客户端名称 + /// + public string HttpClientName { get; set; } + + /// + /// 请求接口描述 + /// + public string HttpApiDesc { get; set; } + /// /// 请求方式 /// diff --git a/Admin.NET/Admin.NET.Core/Service/Log/SysLogHttpService.cs b/Admin.NET/Admin.NET.Core/Service/Log/SysLogHttpService.cs index 24554c46..ca662981 100644 --- a/Admin.NET/Admin.NET.Core/Service/Log/SysLogHttpService.cs +++ b/Admin.NET/Admin.NET.Core/Service/Log/SysLogHttpService.cs @@ -32,7 +32,9 @@ public class SysLogHttpService : IDynamicApiController, ITransient { input.Keyword = input.Keyword?.Trim(); var query = _sysLogHttpRep.AsQueryable() - .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.RequestUrl.Contains(input.Keyword) || u.RequestBody.Contains(input.Keyword) || u.ResponseBody.Contains(input.Keyword) || u.Exception.Contains(input.Keyword)) + .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())) @@ -55,6 +57,9 @@ public class SysLogHttpService : IDynamicApiController, ITransient 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())) diff --git a/Web/src/views/system/log/loghttp/component/logDetail.vue b/Web/src/views/system/log/loghttp/component/logDetail.vue index 58b774b4..6e44de64 100644 --- a/Web/src/views/system/log/loghttp/component/logDetail.vue +++ b/Web/src/views/system/log/loghttp/component/logDetail.vue @@ -10,6 +10,12 @@ + + {{ data.httpClientName }} + + + {{ data.httpApiDesc }} + {{ data.requestUrl?.indexOf('?') == -1 ? data.requestUrl : data.requestUrl?.substring(0, data.requestUrl.indexOf('?')) }} diff --git a/Web/src/views/system/log/loghttp/index.vue b/Web/src/views/system/log/loghttp/index.vue index 1f70752a..62aa9590 100644 --- a/Web/src/views/system/log/loghttp/index.vue +++ b/Web/src/views/system/log/loghttp/index.vue @@ -6,6 +6,16 @@ + + + + + + + + + + @@ -144,8 +154,10 @@ const options = useVxeTable( // { type: 'checkbox', width: 40, fixed: 'left' }, { field: 'seq', type: 'seq', title: '序号', width: 60, fixed: 'left' }, { field: 'createTime', title: '创建时间', minWidth: 150, showOverflow: 'tooltip' }, + { field: 'httpClientName', title: '客户端', minWidth: 110, showOverflow: 'tooltip' }, { field: 'httpMethod', title: '请求方式', minWidth: 60, showOverflow: 'tooltip' }, { field: 'isSuccessStatusCode', title: '是否成功', minWidth: 60, showOverflow: 'tooltip', slots: { default: 'row_isSuccessStatusCode' } }, + { field: 'httpApiDesc', title: '接口描述', minWidth: 150, showOverflow: 'tooltip' }, { field: 'requestUrl', title: '请求地址', minWidth: 150, align: 'left', showOverflow: 'tooltip', slots: { default: 'row_requestUrl' } }, { field: 'requestHeaders', title: '请求头', minWidth: 150, showOverflow: 'tooltip' }, { field: 'requestBody', title: '请求体', minWidth: 150, showOverflow: 'tooltip', slots: { default: 'row_requestBody' } },