New file |
| | |
| | | // Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 |
| | | // |
| | | // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 |
| | | // |
| | | // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! |
| | | |
| | | 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; } |
| | | } |
New file |
| | |
| | | // Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 |
| | | // |
| | | // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 |
| | | // |
| | | // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! |
| | | |
| | | 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; } |
| | | } |
New file |
| | |
| | | // Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 |
| | | // |
| | | // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 |
| | | // |
| | | // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! |
| | | |
| | | 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; } |
| | | } |
New file |
| | |
| | | // Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 |
| | | // |
| | | // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 |
| | | // |
| | | // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! |
| | | |
| | | 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>(); |
| | | } |
| | | } |
New file |
| | |
| | | // Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 |
| | | // |
| | | // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 |
| | | // |
| | | // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! |
| | | |
| | | 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" }; |
| | | } |
| | | } |
New file |
| | |
| | | // Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 |
| | | // |
| | | // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 |
| | | // |
| | | // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! |
| | | |
| | | 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" }; |
| | | } |
| | | } |
New file |
| | |
| | | // Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 |
| | | // |
| | | // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 |
| | | // |
| | | // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! |
| | | |
| | | 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(); |
| | | } |
| | | } |