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' } },