✨ 新增差异日志记录到库
This commit is contained in:
parent
1ba31c17cf
commit
95b0178dd4
@ -5,6 +5,8 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Options;
|
||||
using System;
|
||||
using System.Security.Claims;
|
||||
using System.Security.Principal;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace Infrastructure
|
||||
{
|
||||
@ -28,6 +30,10 @@ namespace Infrastructure
|
||||
/// </summary>
|
||||
public static ClaimsPrincipal User => HttpContext?.User;
|
||||
/// <summary>
|
||||
/// 获取用户名
|
||||
/// </summary>
|
||||
public static string UserName => User?.Identity?.Name;
|
||||
/// <summary>
|
||||
/// 获取Web主机环境
|
||||
/// </summary>
|
||||
public static IWebHostEnvironment WebHostEnvironment => InternalApp.WebHostEnvironment;
|
||||
|
||||
@ -2,6 +2,7 @@ using Infrastructure;
|
||||
using Infrastructure.Extensions;
|
||||
using SqlSugar;
|
||||
using SqlSugar.IOC;
|
||||
using System.Security.Principal;
|
||||
using ZR.Model;
|
||||
using ZR.Model.System;
|
||||
|
||||
@ -13,7 +14,7 @@ namespace ZR.Admin.WebApi.Extensions
|
||||
public static class DbExtension
|
||||
{
|
||||
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化db
|
||||
/// </summary>
|
||||
@ -93,7 +94,7 @@ namespace ZR.Admin.WebApi.Extensions
|
||||
};
|
||||
db.GetConnectionScope(configId).Aop.OnError = (ex) =>
|
||||
{
|
||||
var pars = db.Utilities.SerializeObject(((SugarParameter[])ex.Parametres).ToDictionary(it => it.ParameterName, it => it.Value));
|
||||
//var pars = db.Utilities.SerializeObject(((SugarParameter[])ex.Parametres).ToDictionary(it => it.ParameterName, it => it.Value));
|
||||
|
||||
string sql = "【错误SQL】" + UtilMethods.GetSqlString(config.DbType, ex.Sql, (SugarParameter[])ex.Parametres) + "\r\n";
|
||||
logger.Error(ex, $"{sql}\r\n{ex.Message}\r\n{ex.StackTrace}");
|
||||
@ -101,7 +102,44 @@ namespace ZR.Admin.WebApi.Extensions
|
||||
db.GetConnectionScope(configId).Aop.DataExecuting = (oldValue, entiyInfo) =>
|
||||
{
|
||||
};
|
||||
//差异日志功能
|
||||
db.GetConnectionScope(configId).Aop.OnDiffLogEvent = it =>
|
||||
{
|
||||
//操作前记录 包含: 字段描述 列名 值 表名 表描述
|
||||
var editBeforeData = it.BeforeData;//插入Before为null,之前还没进库
|
||||
//操作后记录 包含: 字段描述 列名 值 表名 表描述
|
||||
var editAfterData = it.AfterData;
|
||||
var sql = it.Sql;
|
||||
var parameter = it.Parameters;
|
||||
var data = it.BusinessData;//这边会显示你传进来的对象
|
||||
var time = it.Time;
|
||||
var diffType = it.DiffType;//enum insert 、update and delete
|
||||
|
||||
if (diffType == DiffType.delete)
|
||||
{
|
||||
string name = App.UserName;
|
||||
|
||||
foreach (var item in editBeforeData)
|
||||
{
|
||||
var pars = db.Utilities.SerializeObject(item.Columns.ToDictionary(it => it.ColumnName, it => it.Value));
|
||||
|
||||
SqlDiffLog log = new()
|
||||
{
|
||||
AfterData = pars,
|
||||
BusinessData = data,
|
||||
DiffType = diffType.ToString(),
|
||||
Sql = sql,
|
||||
TableName = item.TableName,
|
||||
UserName = name,
|
||||
AddTime = DateTime.Now
|
||||
};
|
||||
//logger.WithProperty("title", data).Info(pars);
|
||||
db.GetConnectionScope(configId).Insertable(log).ExecuteReturnSnowflakeId();
|
||||
}
|
||||
}
|
||||
|
||||
//Write logic
|
||||
};
|
||||
db.GetConnectionScope(configId).CurrentConnectionConfig.MoreSettings = new ConnMoreSettings()
|
||||
{
|
||||
IsAutoRemoveDataCache = true
|
||||
|
||||
@ -164,6 +164,36 @@ namespace ZR.Admin.WebApi.Extensions
|
||||
{
|
||||
return context != null ? context.Request.QueryString.Value : "";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取body请求参数
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
/// <returns></returns>
|
||||
public static string GetBody(this HttpContext context)
|
||||
{
|
||||
context.Request.EnableBuffering();
|
||||
//context.Request.Body.Seek(0, SeekOrigin.Begin);
|
||||
//using var reader = new StreamReader(context.Request.Body, Encoding.UTF8);
|
||||
////需要使用异步方式才能获取
|
||||
//return reader.ReadToEndAsync().Result;
|
||||
string body = string.Empty;
|
||||
var buffer = new MemoryStream();
|
||||
context.Request.Body.Seek(0, SeekOrigin.Begin);
|
||||
context.Request.Body.CopyToAsync(buffer);
|
||||
buffer.Position = 0;
|
||||
try
|
||||
{
|
||||
using StreamReader streamReader = new(buffer, Encoding.UTF8);
|
||||
body = streamReader.ReadToEndAsync().Result;
|
||||
}
|
||||
finally
|
||||
{
|
||||
buffer?.Dispose();
|
||||
}
|
||||
return body;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置请求参数
|
||||
/// </summary>
|
||||
@ -172,21 +202,14 @@ namespace ZR.Admin.WebApi.Extensions
|
||||
public static void GetRequestValue(this HttpContext context, SysOperLog operLog)
|
||||
{
|
||||
string reqMethod = operLog.RequestMethod;
|
||||
string param;
|
||||
string param= string.Empty;
|
||||
|
||||
if (HttpMethods.IsPost(reqMethod) || HttpMethods.IsPut(reqMethod) || HttpMethods.IsDelete(reqMethod))
|
||||
{
|
||||
context.Request.Body.Seek(0, SeekOrigin.Begin);
|
||||
using var reader = new StreamReader(context.Request.Body, Encoding.UTF8);
|
||||
//需要使用异步方式才能获取
|
||||
param = reader.ReadToEndAsync().Result;
|
||||
if (param.IsEmpty())
|
||||
{
|
||||
param = context.GetQueryString();
|
||||
}
|
||||
param = context.GetBody();
|
||||
param = PwdRep().Replace(param, "***");
|
||||
}
|
||||
else
|
||||
if (param.IsEmpty())
|
||||
{
|
||||
param = context.GetQueryString();
|
||||
}
|
||||
|
||||
@ -24,6 +24,7 @@ namespace ZR.Admin.WebApi.Extensions
|
||||
//db.CodeFirst.InitTables(entityes);
|
||||
|
||||
//23个表,建议先使用下面方法初始化表,方便排查问题
|
||||
db.CodeFirst.InitTables(typeof(SqlDiffLog));
|
||||
db.CodeFirst.InitTables(typeof(SysUser));
|
||||
db.CodeFirst.InitTables(typeof(SysRole));
|
||||
db.CodeFirst.InitTables(typeof(SysDept));
|
||||
|
||||
@ -99,9 +99,9 @@ builder.Services.AddDb(builder.Configuration, app.Environment);
|
||||
//使用全局异常中间件
|
||||
app.UseMiddleware<GlobalExceptionMiddleware>();
|
||||
|
||||
//使可以多次多去body内容
|
||||
app.Use((context, next) =>
|
||||
{
|
||||
//设置可以多次获取body内容
|
||||
context.Request.EnableBuffering();
|
||||
if (context.Request.Query.TryGetValue("access_token", out var token))
|
||||
{
|
||||
|
||||
@ -29,7 +29,6 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Controllers\" />
|
||||
<Folder Include="Properties\PublishProfiles\" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
21
ZR.Model/System/SqlDiffLog.cs
Normal file
21
ZR.Model/System/SqlDiffLog.cs
Normal file
@ -0,0 +1,21 @@
|
||||
namespace ZR.Model.System
|
||||
{
|
||||
[SugarTable("SqlDiffLog")]
|
||||
public class SqlDiffLog
|
||||
{
|
||||
[SugarColumn(IsPrimaryKey = true)]
|
||||
public long PId { get; set; }
|
||||
public string TableName { get; set; }
|
||||
[SugarColumn(Length = 4000)]
|
||||
public object BusinessData { get; set; }
|
||||
public string DiffType { get; set; }
|
||||
[SugarColumn(ColumnDataType = StaticConfig.CodeFirst_BigString)]
|
||||
public string Sql { get; set; }
|
||||
[SugarColumn(ColumnDataType = StaticConfig.CodeFirst_BigString)]
|
||||
public string BeforeData { get; set; }
|
||||
[SugarColumn(ColumnDataType = StaticConfig.CodeFirst_BigString)]
|
||||
public string AfterData { get; set; }
|
||||
public string UserName { get; set; }
|
||||
public DateTime AddTime { get; set; }
|
||||
}
|
||||
}
|
||||
@ -56,7 +56,7 @@ namespace ZR.Repository
|
||||
}
|
||||
public IInsertable<T> Insertable(T t)
|
||||
{
|
||||
return Context.Insertable<T>(t);
|
||||
return Context.Insertable(t);
|
||||
}
|
||||
#endregion add
|
||||
|
||||
@ -212,13 +212,13 @@ namespace ZR.Repository
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
/// <returns></returns>
|
||||
public int Delete(object[] obj)
|
||||
public int Delete(object[] obj, string title = "")
|
||||
{
|
||||
return Context.Deleteable<T>().In(obj).ExecuteCommand();
|
||||
return Context.Deleteable<T>().In(obj).EnableDiffLogEventIF(title.IsNotEmpty(), title).ExecuteCommand();
|
||||
}
|
||||
public int Delete(object id)
|
||||
public int Delete(object id, string title = "")
|
||||
{
|
||||
return Context.Deleteable<T>(id).ExecuteCommand();
|
||||
return Context.Deleteable<T>(id).EnableDiffLogEventIF(title.IsNotEmpty(), title).ExecuteCommand();
|
||||
}
|
||||
public int DeleteTable()
|
||||
{
|
||||
@ -376,7 +376,7 @@ namespace ZR.Repository
|
||||
var result = source
|
||||
.OrderByIF(parm.Sort.IsNotEmpty(), $"{parm.Sort.ToSqlFilter()} {(!string.IsNullOrWhiteSpace(parm.SortType) && parm.SortType.Contains("desc") ? "desc" : "asc")}")
|
||||
.ToPageList(parm.PageNum, parm.PageSize, ref total);
|
||||
|
||||
|
||||
page.TotalNum = total;
|
||||
page.Result = result.Adapt<List<T2>>();
|
||||
return page;
|
||||
|
||||
@ -47,8 +47,8 @@ namespace ZR.Repository
|
||||
|
||||
#region delete
|
||||
IDeleteable<T> Deleteable();
|
||||
int Delete(object[] obj);
|
||||
int Delete(object id);
|
||||
int Delete(object[] obj, string title = "");
|
||||
int Delete(object id, string title = "");
|
||||
int DeleteTable();
|
||||
bool Truncate();
|
||||
|
||||
|
||||
@ -70,7 +70,7 @@ namespace ZR.Service.System
|
||||
/// <returns>结果</returns>
|
||||
public int DeleteOperLogByIds(long[] operIds)
|
||||
{
|
||||
return Context.Deleteable<SysOperLog>().In(operIds).ExecuteCommand();
|
||||
return Delete(operIds);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user