From 92338ab006f0e23f286a0914e4456c4f3a1c1b7b Mon Sep 17 00:00:00 2001
From: hwh <332078369@qq.com>
Date: 星期五, 06 九月 2024 10:48:50 +0800
Subject: [PATCH] 日志

---
 Admin.NET/Admin.NET.Core/Service/Log/SysLogExService.cs   |   86 ++++++++++
 Admin.NET/Admin.NET.Core/Service/Log/SysLogOpService.cs   |   84 ++++++++++
 Admin.NET/Admin.NET.Core/Service/Log/Dto/ExportLogDto.cs  |   68 ++++++++
 Admin.NET/Admin.NET.Core/Service/Log/SysLogDiffService.cs |   58 +++++++
 Admin.NET/Admin.NET.Core/Service/Log/SysLogVisService.cs  |   72 +++++++++
 Admin.NET/Admin.NET.Core/Service/Log/Dto/LogVisOutput.cs  |   35 ++++
 Admin.NET/Admin.NET.Core/Service/Log/Dto/LogInput.cs      |   73 +++++++++
 7 files changed, 476 insertions(+), 0 deletions(-)

diff --git a/Admin.NET/Admin.NET.Core/Service/Log/Dto/ExportLogDto.cs b/Admin.NET/Admin.NET.Core/Service/Log/Dto/ExportLogDto.cs
new file mode 100644
index 0000000..bd99c03
--- /dev/null
+++ b/Admin.NET/Admin.NET.Core/Service/Log/Dto/ExportLogDto.cs
@@ -0,0 +1,68 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 瀵煎嚭鏃ュ織鏁版嵁
+/// </summary>
+[ExcelExporter(Name = "鏃ュ織鏁版嵁", TableStyle = OfficeOpenXml.Table.TableStyles.None, AutoFitAllColumn = true)]
+public class ExportLogDto
+{
+    /// <summary>
+    /// 璁板綍鍣ㄧ被鍒悕绉�
+    /// </summary>
+    [ExporterHeader(DisplayName = "璁板綍鍣ㄧ被鍒悕绉�", IsBold = true)]
+    public string LogName { get; set; }
+
+    /// <summary>
+    /// 鏃ュ織绾у埆
+    /// </summary>
+    [ExporterHeader(DisplayName = "鏃ュ織绾у埆", IsBold = true)]
+    public string LogLevel { get; set; }
+
+    /// <summary>
+    /// 浜嬩欢Id
+    /// </summary>
+    [ExporterHeader(DisplayName = "浜嬩欢Id", IsBold = true)]
+    public string EventId { get; set; }
+
+    /// <summary>
+    /// 鏃ュ織娑堟伅
+    /// </summary>
+    [ExporterHeader(DisplayName = "鏃ュ織娑堟伅", IsBold = true)]
+    public string Message { get; set; }
+
+    /// <summary>
+    /// 寮傚父瀵硅薄
+    /// </summary>
+    [ExporterHeader(DisplayName = "寮傚父瀵硅薄", IsBold = true)]
+    public string Exception { get; set; }
+
+    /// <summary>
+    /// 褰撳墠鐘舵�佸��
+    /// </summary>
+    [ExporterHeader(DisplayName = "褰撳墠鐘舵�佸��", IsBold = true)]
+    public string State { get; set; }
+
+    /// <summary>
+    /// 鏃ュ織璁板綍鏃堕棿
+    /// </summary>
+    [ExporterHeader(DisplayName = "鏃ュ織璁板綍鏃堕棿", IsBold = true)]
+    public DateTime LogDateTime { get; set; }
+
+    /// <summary>
+    /// 绾跨▼Id
+    /// </summary>
+    [ExporterHeader(DisplayName = "绾跨▼Id", IsBold = true)]
+    public int ThreadId { get; set; }
+
+    /// <summary>
+    /// 璇锋眰璺熻釜Id
+    /// </summary>
+    [ExporterHeader(DisplayName = "璇锋眰璺熻釜Id", IsBold = true)]
+    public string TraceId { get; set; }
+}
\ No newline at end of file
diff --git a/Admin.NET/Admin.NET.Core/Service/Log/Dto/LogInput.cs b/Admin.NET/Admin.NET.Core/Service/Log/Dto/LogInput.cs
new file mode 100644
index 0000000..c342f4b
--- /dev/null
+++ b/Admin.NET/Admin.NET.Core/Service/Log/Dto/LogInput.cs
@@ -0,0 +1,73 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace Admin.NET.Core.Service;
+
+public class PageOpLogInput : PageVisLogInput
+{
+    /// <summary>
+    /// 妯″潡鍚嶇О
+    /// </summary>
+    public string? ControllerName { get; set; }
+}
+
+public class PageExLogInput : PageOpLogInput
+{
+}
+
+public class PageVisLogInput : PageLogInput
+{
+    /// <summary>
+    /// 鏂规硶鍚嶇О
+    ///</summary>
+    public string? ActionName { get; set; }
+}
+
+public class PageLogInput : BasePageInput
+{
+    /// <summary>
+    /// 寮�濮嬫椂闂�
+    /// </summary>
+    public DateTime? StartTime { get; set; }
+
+    /// <summary>
+    /// 缁撴潫鏃堕棿
+    /// </summary>
+    public DateTime? EndTime { get; set; }
+
+    /// <summary>
+    /// 璐﹀彿
+    /// </summary>
+    public string? Account { get; set; }
+
+    /// <summary>
+    /// 鎿嶄綔鐢ㄦ椂
+    /// </summary>
+    public long? Elapsed { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    public string Status { get; set; }
+
+    /// <summary>
+    /// IP鍦板潃
+    /// </summary>
+    public string? RemoteIp { get; set; }
+}
+
+public class LogInput
+{
+    /// <summary>
+    /// 寮�濮嬫椂闂�
+    /// </summary>
+    public DateTime? StartTime { get; set; }
+
+    /// <summary>
+    /// 缁撴潫鏃堕棿
+    /// </summary>
+    public DateTime? EndTime { get; set; }
+}
\ No newline at end of file
diff --git a/Admin.NET/Admin.NET.Core/Service/Log/Dto/LogVisOutput.cs b/Admin.NET/Admin.NET.Core/Service/Log/Dto/LogVisOutput.cs
new file mode 100644
index 0000000..8e69aaf
--- /dev/null
+++ b/Admin.NET/Admin.NET.Core/Service/Log/Dto/LogVisOutput.cs
@@ -0,0 +1,35 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace Admin.NET.Core.Service;
+
+public class LogVisOutput
+{
+    /// <summary>
+    /// 鐧诲綍鍦扮偣
+    /// </summary>
+    public string Location { get; set; }
+
+    /// <summary>
+    /// 缁忓害
+    /// </summary>
+    public double? Longitude { get; set; }
+
+    /// <summary>
+    /// 缁村害
+    /// </summary>
+    public double? Latitude { get; set; }
+
+    /// <summary>
+    /// 鐪熷疄濮撳悕
+    /// </summary>
+    public string RealName { get; set; }
+
+    /// <summary>
+    /// 鏃ュ織鏃堕棿
+    /// </summary>
+    public DateTime? LogDateTime { get; set; }
+}
\ No newline at end of file
diff --git a/Admin.NET/Admin.NET.Core/Service/Log/SysLogDiffService.cs b/Admin.NET/Admin.NET.Core/Service/Log/SysLogDiffService.cs
new file mode 100644
index 0000000..8db3141
--- /dev/null
+++ b/Admin.NET/Admin.NET.Core/Service/Log/SysLogDiffService.cs
@@ -0,0 +1,58 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace Admin.NET.Core.Service;
+
+/// <summary>
+/// 绯荤粺宸紓鏃ュ織鏈嶅姟 馃З
+/// </summary>
+[ApiDescriptionSettings(Order = 330)]
+public class SysLogDiffService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<SysLogDiff> _sysLogDiffRep;
+
+    public SysLogDiffService(SqlSugarRepository<SysLogDiff> sysLogDiffRep)
+    {
+        _sysLogDiffRep = sysLogDiffRep;
+    }
+
+    /// <summary>
+    /// 鑾峰彇宸紓鏃ュ織鍒嗛〉鍒楄〃 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [SuppressMonitor]
+    [DisplayName("鑾峰彇宸紓鏃ュ織鍒嗛〉鍒楄〃")]
+    public async Task<SqlSugarPagedList<SysLogDiff>> Page(PageLogInput input)
+    {
+        return await _sysLogDiffRep.AsQueryable()
+            .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()), u => u.CreateTime >= input.StartTime)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.EndTime.ToString()), u => u.CreateTime <= input.EndTime)
+            .OrderBy(u => u.CreateTime, OrderByType.Desc)
+            .ToPagedListAsync(input.Page, input.PageSize);
+    }
+
+    /// <summary>
+    /// 鑾峰彇宸紓鏃ュ織璇︽儏 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [SuppressMonitor]
+    [DisplayName("鑾峰彇宸紓鏃ュ織璇︽儏")]
+    public async Task<SysLogDiff> GetDetail(long id)
+    {
+        return await _sysLogDiffRep.GetFirstAsync(u => u.Id == id);
+    }
+
+    /// <summary>
+    /// 娓呯┖宸紓鏃ュ織 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [ApiDescriptionSettings(Name = "Clear"), HttpPost]
+    [DisplayName("娓呯┖宸紓鏃ュ織")]
+    public void Clear()
+    {
+        _sysLogDiffRep.AsSugarClient().DbMaintenance.TruncateTable<SysLogDiff>();
+    }
+}
\ No newline at end of file
diff --git a/Admin.NET/Admin.NET.Core/Service/Log/SysLogExService.cs b/Admin.NET/Admin.NET.Core/Service/Log/SysLogExService.cs
new file mode 100644
index 0000000..2519a26
--- /dev/null
+++ b/Admin.NET/Admin.NET.Core/Service/Log/SysLogExService.cs
@@ -0,0 +1,86 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace Admin.NET.Core.Service;
+
+/// <summary>
+/// 绯荤粺寮傚父鏃ュ織鏈嶅姟 馃З
+/// </summary>
+[ApiDescriptionSettings(Order = 350)]
+public class SysLogExService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<SysLogEx> _sysLogExRep;
+
+    public SysLogExService(SqlSugarRepository<SysLogEx> sysLogExRep)
+    {
+        _sysLogExRep = sysLogExRep;
+    }
+
+    /// <summary>
+    /// 鑾峰彇寮傚父鏃ュ織鍒嗛〉鍒楄〃 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [SuppressMonitor]
+    [DisplayName("鑾峰彇寮傚父鏃ュ織鍒嗛〉鍒楄〃")]
+    public async Task<SqlSugarPagedList<SysLogEx>> Page(PageExLogInput input)
+    {
+        return await _sysLogExRep.AsQueryable()
+            .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()), u => u.CreateTime >= input.StartTime)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.EndTime.ToString()), u => u.CreateTime <= input.EndTime)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Account), u => u.Account == input.Account)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.ControllerName), u => u.ControllerName == input.ControllerName)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.ActionName), u => u.ActionName == input.ActionName)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.RemoteIp), u => u.RemoteIp == input.RemoteIp)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Elapsed.ToString()), u => u.Elapsed >= input.Elapsed)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Status) && input.Status == "200", u => u.Status == input.Status)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Status) && input.Status != "200", u => u.Status != input.Status)
+            //.OrderBy(u => u.CreateTime, OrderByType.Desc)
+            .IgnoreColumns(u => new { u.RequestParam, u.ReturnResult, u.Message })
+            .OrderBuilder(input)
+            .ToPagedListAsync(input.Page, input.PageSize);
+    }
+
+    /// <summary>
+    /// 鑾峰彇寮傚父鏃ュ織璇︽儏 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [SuppressMonitor]
+    [DisplayName("鑾峰彇寮傚父鏃ュ織璇︽儏")]
+    public async Task<SysLogEx> GetDetail(long id)
+    {
+        return await _sysLogExRep.GetFirstAsync(u => u.Id == id);
+    }
+
+    /// <summary>
+    /// 娓呯┖寮傚父鏃ュ織 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [ApiDescriptionSettings(Name = "Clear"), HttpPost]
+    [DisplayName("娓呯┖寮傚父鏃ュ織")]
+    public void Clear()
+    {
+        _sysLogExRep.AsSugarClient().DbMaintenance.TruncateTable<SysLogEx>();
+    }
+
+    /// <summary>
+    /// 瀵煎嚭寮傚父鏃ュ織 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [ApiDescriptionSettings(Name = "Export"), NonUnify]
+    [DisplayName("瀵煎嚭寮傚父鏃ュ織")]
+    public async Task<IActionResult> ExportLogEx(LogInput input)
+    {
+        var logExList = await _sysLogExRep.AsQueryable()
+            .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()),
+                    u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
+            .OrderBy(u => u.CreateTime, OrderByType.Desc)
+            .Select<ExportLogDto>().ToListAsync();
+
+        IExcelExporter excelExporter = new ExcelExporter();
+        var res = await excelExporter.ExportAsByteArray(logExList);
+        return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "寮傚父鏃ュ織.xlsx" };
+    }
+}
\ No newline at end of file
diff --git a/Admin.NET/Admin.NET.Core/Service/Log/SysLogOpService.cs b/Admin.NET/Admin.NET.Core/Service/Log/SysLogOpService.cs
new file mode 100644
index 0000000..7d3d2d2
--- /dev/null
+++ b/Admin.NET/Admin.NET.Core/Service/Log/SysLogOpService.cs
@@ -0,0 +1,84 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace Admin.NET.Core.Service;
+
+/// <summary>
+/// 绯荤粺鎿嶄綔鏃ュ織鏈嶅姟 馃З
+/// </summary>
+[ApiDescriptionSettings(Order = 360)]
+public class SysLogOpService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<SysLogOp> _sysLogOpRep;
+
+    public SysLogOpService(SqlSugarRepository<SysLogOp> sysLogOpRep)
+    {
+        _sysLogOpRep = sysLogOpRep;
+    }
+
+    /// <summary>
+    /// 鑾峰彇鎿嶄綔鏃ュ織鍒嗛〉鍒楄〃 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [SuppressMonitor]
+    [DisplayName("鑾峰彇鎿嶄綔鏃ュ織鍒嗛〉鍒楄〃")]
+    public async Task<SqlSugarPagedList<SysLogOp>> Page(PageOpLogInput input)
+    {
+        return await _sysLogOpRep.AsQueryable()
+            .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()), u => u.CreateTime >= input.StartTime)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.EndTime.ToString()), u => u.CreateTime <= input.EndTime)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Account), u => u.Account == input.Account)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.RemoteIp), u => u.RemoteIp == input.RemoteIp)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.ControllerName), u => u.ControllerName == input.ControllerName)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.ActionName), u => u.ActionName == input.ActionName)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Elapsed.ToString()), u => u.Elapsed >= input.Elapsed)
+            //.OrderBy(u => u.CreateTime, OrderByType.Desc)
+            .IgnoreColumns(u => new { u.RequestParam, u.ReturnResult, u.Message })
+            .OrderBuilder(input)
+            .ToPagedListAsync(input.Page, input.PageSize);
+    }
+
+    /// <summary>
+    /// 鑾峰彇鎿嶄綔鏃ュ織璇︽儏 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [SuppressMonitor]
+    [DisplayName("鑾峰彇鎿嶄綔鏃ュ織璇︽儏")]
+    public async Task<SysLogOp> GetDetail(long id)
+    {
+        return await _sysLogOpRep.GetFirstAsync(u => u.Id == id);
+    }
+
+    /// <summary>
+    /// 娓呯┖鎿嶄綔鏃ュ織 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [ApiDescriptionSettings(Name = "Clear"), HttpPost]
+    [DisplayName("娓呯┖鎿嶄綔鏃ュ織")]
+    public void Clear()
+    {
+        _sysLogOpRep.AsSugarClient().DbMaintenance.TruncateTable<SysLogOp>();
+    }
+
+    /// <summary>
+    /// 瀵煎嚭鎿嶄綔鏃ュ織 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [ApiDescriptionSettings(Name = "Export"), NonUnify]
+    [DisplayName("瀵煎嚭鎿嶄綔鏃ュ織")]
+    public async Task<IActionResult> ExportLogOp(LogInput input)
+    {
+        var logOpList = await _sysLogOpRep.AsQueryable()
+            .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()),
+                    u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
+            .OrderBy(u => u.CreateTime, OrderByType.Desc)
+            .Select<ExportLogDto>().ToListAsync();
+
+        IExcelExporter excelExporter = new ExcelExporter();
+        var res = await excelExporter.ExportAsByteArray(logOpList);
+        return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "鎿嶄綔鏃ュ織.xlsx" };
+    }
+}
\ No newline at end of file
diff --git a/Admin.NET/Admin.NET.Core/Service/Log/SysLogVisService.cs b/Admin.NET/Admin.NET.Core/Service/Log/SysLogVisService.cs
new file mode 100644
index 0000000..9c681fd
--- /dev/null
+++ b/Admin.NET/Admin.NET.Core/Service/Log/SysLogVisService.cs
@@ -0,0 +1,72 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace Admin.NET.Core.Service;
+
+/// <summary>
+/// 绯荤粺璁块棶鏃ュ織鏈嶅姟 馃З
+/// </summary>
+[ApiDescriptionSettings(Order = 340)]
+public class SysLogVisService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<SysLogVis> _sysLogVisRep;
+
+    public SysLogVisService(SqlSugarRepository<SysLogVis> sysLogVisRep)
+    {
+        _sysLogVisRep = sysLogVisRep;
+    }
+
+    /// <summary>
+    /// 鑾峰彇璁块棶鏃ュ織鍒嗛〉鍒楄〃 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [SuppressMonitor]
+    [DisplayName("鑾峰彇璁块棶鏃ュ織鍒嗛〉鍒楄〃")]
+    public async Task<SqlSugarPagedList<SysLogVis>> Page(PageVisLogInput input)
+    {
+        return await _sysLogVisRep.AsQueryable()
+            .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()), u => u.CreateTime >= input.StartTime)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.EndTime.ToString()), u => u.CreateTime <= input.EndTime)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Account), u => u.Account == input.Account)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.ActionName), u => u.ActionName == input.ActionName)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.RemoteIp), u => u.RemoteIp == input.RemoteIp)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Elapsed.ToString()), u => u.Elapsed >= input.Elapsed)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Status) && input.Status == "200", u => u.Status == input.Status)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Status) && input.Status != "200", u => u.Status != input.Status)
+            .OrderBy(u => u.CreateTime, OrderByType.Desc)
+            .ToPagedListAsync(input.Page, input.PageSize);
+    }
+
+    /// <summary>
+    /// 娓呯┖璁块棶鏃ュ織 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [ApiDescriptionSettings(Name = "Clear"), HttpPost]
+    [DisplayName("娓呯┖璁块棶鏃ュ織")]
+    public void Clear()
+    {
+        _sysLogVisRep.AsSugarClient().DbMaintenance.TruncateTable<SysLogVis>();
+    }
+
+    /// <summary>
+    /// 鑾峰彇璁块棶鏃ュ織鍒楄〃 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [DisplayName("鑾峰彇璁块棶鏃ュ織鍒楄〃")]
+    public async Task<List<LogVisOutput>> GetList()
+    {
+        return await _sysLogVisRep.AsQueryable()
+            .Where(u => u.Longitude > 0 && u.Longitude > 0)
+            .Select(u => new LogVisOutput
+            {
+                Location = u.Location,
+                Longitude = u.Longitude,
+                Latitude = u.Latitude,
+                RealName = u.RealName,
+                LogDateTime = u.LogDateTime
+            }).ToListAsync();
+    }
+}
\ No newline at end of file

--
Gitblit v1.8.0