feat: 搭建完成审计日志模块
This commit is contained in:
@@ -1,27 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Volo.Abp.Auditing;
|
|
||||||
using Volo.Abp.DependencyInjection;
|
|
||||||
using Yi.Framework.Core.Helper;
|
|
||||||
using Yi.Framework.SqlSugarCore.Abstractions;
|
|
||||||
|
|
||||||
namespace Yi.Framework.SqlSugarCore
|
|
||||||
{
|
|
||||||
public class SqlSugarLogAuditingStore : IAuditingStore, ISingletonDependency
|
|
||||||
{
|
|
||||||
private readonly ILogger<SqlSugarLogAuditingStore> _logger;
|
|
||||||
public SqlSugarLogAuditingStore(ILogger<SqlSugarLogAuditingStore> logger, ISqlSugarDbContext sqlSugarDbContext)
|
|
||||||
{
|
|
||||||
_logger= logger;
|
|
||||||
}
|
|
||||||
public Task SaveAsync(AuditLogInfo auditInfo)
|
|
||||||
{
|
|
||||||
_logger.LogDebug("Yi-请求追踪:"+JsonHelper.ObjToStr(auditInfo, "yyyy-MM-dd HH:mm:ss"));
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using Volo.Abp.AspNetCore.ExceptionHandling;
|
||||||
|
using Volo.Abp.Auditing;
|
||||||
|
using Volo.Abp.Data;
|
||||||
|
using Volo.Abp.DependencyInjection;
|
||||||
|
using Volo.Abp.Guids;
|
||||||
|
using Volo.Abp.Http;
|
||||||
|
using Volo.Abp.Json;
|
||||||
|
using Yi.Framework.AuditLogging.Domain.Entities;
|
||||||
|
|
||||||
|
namespace Yi.Framework.AuditLogging.Domain;
|
||||||
|
|
||||||
|
public class AuditLogInfoToAuditLogConverter : IAuditLogInfoToAuditLogConverter, ITransientDependency
|
||||||
|
{
|
||||||
|
protected IGuidGenerator GuidGenerator { get; }
|
||||||
|
protected IExceptionToErrorInfoConverter ExceptionToErrorInfoConverter { get; }
|
||||||
|
protected IJsonSerializer JsonSerializer { get; }
|
||||||
|
protected AbpExceptionHandlingOptions ExceptionHandlingOptions { get; }
|
||||||
|
|
||||||
|
public AuditLogInfoToAuditLogConverter(IGuidGenerator guidGenerator, IExceptionToErrorInfoConverter exceptionToErrorInfoConverter, IJsonSerializer jsonSerializer, IOptions<AbpExceptionHandlingOptions> exceptionHandlingOptions)
|
||||||
|
{
|
||||||
|
GuidGenerator = guidGenerator;
|
||||||
|
ExceptionToErrorInfoConverter = exceptionToErrorInfoConverter;
|
||||||
|
JsonSerializer = jsonSerializer;
|
||||||
|
ExceptionHandlingOptions = exceptionHandlingOptions.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual Task<AuditLogAggregateRoot> ConvertAsync(AuditLogInfo auditLogInfo)
|
||||||
|
{
|
||||||
|
var auditLogId = GuidGenerator.Create();
|
||||||
|
|
||||||
|
var extraProperties = new ExtraPropertyDictionary();
|
||||||
|
if (auditLogInfo.ExtraProperties != null)
|
||||||
|
{
|
||||||
|
foreach (var pair in auditLogInfo.ExtraProperties)
|
||||||
|
{
|
||||||
|
extraProperties.Add(pair.Key, pair.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var entityChanges = auditLogInfo
|
||||||
|
.EntityChanges?
|
||||||
|
.Select(entityChangeInfo => new EntityChangeEntity(GuidGenerator, auditLogId, entityChangeInfo, tenantId: auditLogInfo.TenantId))
|
||||||
|
.ToList()
|
||||||
|
?? new List<EntityChangeEntity>();
|
||||||
|
|
||||||
|
var actions = auditLogInfo
|
||||||
|
.Actions?
|
||||||
|
.Select(auditLogActionInfo => new AuditLogActionEntity(GuidGenerator.Create(), auditLogId, auditLogActionInfo, tenantId: auditLogInfo.TenantId))
|
||||||
|
.ToList()
|
||||||
|
?? new List<AuditLogActionEntity>();
|
||||||
|
|
||||||
|
var remoteServiceErrorInfos = auditLogInfo.Exceptions?.Select(exception => ExceptionToErrorInfoConverter.Convert(exception, options =>
|
||||||
|
{
|
||||||
|
options.SendExceptionsDetailsToClients = ExceptionHandlingOptions.SendExceptionsDetailsToClients;
|
||||||
|
options.SendStackTraceToClients = ExceptionHandlingOptions.SendStackTraceToClients;
|
||||||
|
}))
|
||||||
|
?? new List<RemoteServiceErrorInfo>();
|
||||||
|
|
||||||
|
var exceptions = remoteServiceErrorInfos.Any()
|
||||||
|
? JsonSerializer.Serialize(remoteServiceErrorInfos, indented: true)
|
||||||
|
: null;
|
||||||
|
|
||||||
|
var comments = auditLogInfo
|
||||||
|
.Comments?
|
||||||
|
.JoinAsString(Environment.NewLine);
|
||||||
|
|
||||||
|
var auditLog = new AuditLogAggregateRoot(
|
||||||
|
auditLogId,
|
||||||
|
auditLogInfo.ApplicationName,
|
||||||
|
auditLogInfo.TenantId,
|
||||||
|
auditLogInfo.TenantName,
|
||||||
|
auditLogInfo.UserId,
|
||||||
|
auditLogInfo.UserName,
|
||||||
|
auditLogInfo.ExecutionTime,
|
||||||
|
auditLogInfo.ExecutionDuration,
|
||||||
|
auditLogInfo.ClientIpAddress,
|
||||||
|
auditLogInfo.ClientName,
|
||||||
|
auditLogInfo.ClientId,
|
||||||
|
auditLogInfo.CorrelationId,
|
||||||
|
auditLogInfo.BrowserInfo,
|
||||||
|
auditLogInfo.HttpMethod,
|
||||||
|
auditLogInfo.Url,
|
||||||
|
auditLogInfo.HttpStatusCode,
|
||||||
|
auditLogInfo.ImpersonatorUserId,
|
||||||
|
auditLogInfo.ImpersonatorUserName,
|
||||||
|
auditLogInfo.ImpersonatorTenantId,
|
||||||
|
auditLogInfo.ImpersonatorTenantName,
|
||||||
|
extraProperties,
|
||||||
|
entityChanges,
|
||||||
|
actions,
|
||||||
|
exceptions,
|
||||||
|
comments
|
||||||
|
);
|
||||||
|
|
||||||
|
return Task.FromResult(auditLog);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.Extensions.Logging.Abstractions;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using Volo.Abp.Auditing;
|
||||||
|
using Volo.Abp.DependencyInjection;
|
||||||
|
using Volo.Abp.Uow;
|
||||||
|
using Yi.Framework.AuditLogging.Domain.Repositories;
|
||||||
|
using Yi.Framework.Core.Helper;
|
||||||
|
|
||||||
|
namespace Yi.Framework.AuditLogging.Domain;
|
||||||
|
|
||||||
|
public class AuditingStore : IAuditingStore, ITransientDependency
|
||||||
|
{
|
||||||
|
public ILogger<AuditingStore> Logger { get; set; }
|
||||||
|
protected IAuditLogRepository AuditLogRepository { get; }
|
||||||
|
protected IUnitOfWorkManager UnitOfWorkManager { get; }
|
||||||
|
protected AbpAuditingOptions Options { get; }
|
||||||
|
protected IAuditLogInfoToAuditLogConverter Converter { get; }
|
||||||
|
public AuditingStore(
|
||||||
|
IAuditLogRepository auditLogRepository,
|
||||||
|
IUnitOfWorkManager unitOfWorkManager,
|
||||||
|
IOptions<AbpAuditingOptions> options,
|
||||||
|
IAuditLogInfoToAuditLogConverter converter)
|
||||||
|
{
|
||||||
|
AuditLogRepository = auditLogRepository;
|
||||||
|
UnitOfWorkManager = unitOfWorkManager;
|
||||||
|
Converter = converter;
|
||||||
|
Options = options.Value;
|
||||||
|
|
||||||
|
Logger = NullLogger<AuditingStore>.Instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task SaveAsync(AuditLogInfo auditInfo)
|
||||||
|
{
|
||||||
|
if (!Options.HideErrors)
|
||||||
|
{
|
||||||
|
await SaveLogAsync(auditInfo);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await SaveLogAsync(auditInfo);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogWarning("Could not save the audit log object: " + Environment.NewLine + auditInfo.ToString());
|
||||||
|
Logger.LogException(ex, LogLevel.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual async Task SaveLogAsync(AuditLogInfo auditInfo)
|
||||||
|
{
|
||||||
|
Logger.LogDebug("Yi-请求追踪:" + JsonHelper.ObjToStr(auditInfo, "yyyy-MM-dd HH:mm:ss"));
|
||||||
|
using (var uow = UnitOfWorkManager.Begin(true))
|
||||||
|
{
|
||||||
|
await AuditLogRepository.InsertAsync(await Converter.ConvertAsync(auditInfo));
|
||||||
|
await uow.CompleteAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
using Yi.Framework.AuditLogging.Domain.Entities;
|
||||||
|
|
||||||
|
namespace Yi.Framework.AuditLogging.Domain;
|
||||||
|
|
||||||
|
public class EntityChangeWithUsername
|
||||||
|
{
|
||||||
|
public EntityChangeEntity EntityChange { get; set; }
|
||||||
|
|
||||||
|
public string UserName { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
using System.Threading.Tasks;
|
||||||
|
using Volo.Abp.Auditing;
|
||||||
|
using Yi.Framework.AuditLogging.Domain.Entities;
|
||||||
|
|
||||||
|
namespace Yi.Framework.AuditLogging.Domain;
|
||||||
|
|
||||||
|
public interface IAuditLogInfoToAuditLogConverter
|
||||||
|
{
|
||||||
|
Task<AuditLogAggregateRoot> ConvertAsync(AuditLogInfo auditLogInfo);
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
using System.Net;
|
||||||
|
using Volo.Abp.Auditing;
|
||||||
|
using Yi.Framework.AuditLogging.Domain.Entities;
|
||||||
|
using Yi.Framework.SqlSugarCore.Abstractions;
|
||||||
|
|
||||||
|
namespace Yi.Framework.AuditLogging.Domain.Repositories
|
||||||
|
{
|
||||||
|
public interface IAuditLogRepository : ISqlSugarRepository<AuditLogAggregateRoot, Guid>
|
||||||
|
{
|
||||||
|
Task<Dictionary<DateTime, double>> GetAverageExecutionDurationPerDayAsync(DateTime startDate, DateTime endDate, CancellationToken cancellationToken = default);
|
||||||
|
Task<long> GetCountAsync(DateTime? startTime = null, DateTime? endTime = null, string httpMethod = null, string url = null, Guid? userId = null, string userName = null, string applicationName = null, string clientIpAddress = null, string correlationId = null, int? maxExecutionDuration = null, int? minExecutionDuration = null, bool? hasException = null, HttpStatusCode? httpStatusCode = null, CancellationToken cancellationToken = default);
|
||||||
|
Task<EntityChangeEntity> GetEntityChange(Guid entityChangeId, CancellationToken cancellationToken = default);
|
||||||
|
Task<long> GetEntityChangeCountAsync(Guid? auditLogId = null, DateTime? startTime = null, DateTime? endTime = null, EntityChangeType? changeType = null, string entityId = null, string entityTypeFullName = null, CancellationToken cancellationToken = default);
|
||||||
|
Task<List<EntityChangeEntity>> GetEntityChangeListAsync(string sorting = null, int maxResultCount = 50, int skipCount = 0, Guid? auditLogId = null, DateTime? startTime = null, DateTime? endTime = null, EntityChangeType? changeType = null, string entityId = null, string entityTypeFullName = null, bool includeDetails = false, CancellationToken cancellationToken = default);
|
||||||
|
Task<List<EntityChangeWithUsername>> GetEntityChangesWithUsernameAsync(string entityId, string entityTypeFullName, CancellationToken cancellationToken = default);
|
||||||
|
Task<EntityChangeWithUsername> GetEntityChangeWithUsernameAsync(Guid entityChangeId);
|
||||||
|
Task<List<AuditLogAggregateRoot>> GetListAsync(string sorting = null, int maxResultCount = 50, int skipCount = 0, DateTime? startTime = null, DateTime? endTime = null, string httpMethod = null, string url = null, Guid? userId = null, string userName = null, string applicationName = null, string clientIpAddress = null, string correlationId = null, int? maxExecutionDuration = null, int? minExecutionDuration = null, bool? hasException = null, HttpStatusCode? httpStatusCode = null, bool includeDetails = false);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\framework\Yi.Framework.SqlSugarCore.Abstractions\Yi.Framework.SqlSugarCore.Abstractions.csproj" />
|
||||||
<ProjectReference Include="..\Yi.Framework.AuditLogging.Domain.Shared\Yi.Framework.AuditLogging.Domain.Shared.csproj" />
|
<ProjectReference Include="..\Yi.Framework.AuditLogging.Domain.Shared\Yi.Framework.AuditLogging.Domain.Shared.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,13 @@
|
|||||||
namespace Yi.Framework.AuditLogging.Domain
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
{
|
using Volo.Abp.Modularity;
|
||||||
public class YiFrameworkAuditLoggingDomainModule
|
|
||||||
{
|
|
||||||
|
|
||||||
|
namespace Yi.Framework.AuditLogging.Domain
|
||||||
|
{
|
||||||
|
public class YiFrameworkAuditLoggingDomainModule:AbpModule
|
||||||
|
{
|
||||||
|
public override void ConfigureServices(ServiceConfigurationContext context)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Volo.Abp.AuditLogging;
|
|
||||||
|
|
||||||
namespace Yi.AuditLogging.SqlSugarCore.Entities
|
|
||||||
{
|
|
||||||
public class AuditLogEntity : AuditLog
|
|
||||||
{
|
|
||||||
public AuditLogEntity() { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +1,22 @@
|
|||||||
using System.Linq.Dynamic.Core;
|
using System.Linq.Dynamic.Core;
|
||||||
using System.Linq.Expressions;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using Mapster;
|
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
using Volo.Abp.Auditing;
|
using Volo.Abp.Auditing;
|
||||||
using Volo.Abp.AuditLogging;
|
|
||||||
using Volo.Abp.DependencyInjection;
|
|
||||||
using Volo.Abp.Domain.Entities;
|
using Volo.Abp.Domain.Entities;
|
||||||
using Volo.Abp.Domain.Repositories;
|
using Yi.Framework.AuditLogging.Domain;
|
||||||
using Yi.AuditLogging.SqlSugarCore.Entities;
|
using Yi.Framework.AuditLogging.Domain.Entities;
|
||||||
|
using Yi.Framework.AuditLogging.Domain.Repositories;
|
||||||
|
using Yi.Framework.SqlSugarCore.Abstractions;
|
||||||
using Yi.Framework.SqlSugarCore.Repositories;
|
using Yi.Framework.SqlSugarCore.Repositories;
|
||||||
|
|
||||||
namespace Yi.AuditLogging.SqlSugarCore;
|
namespace Yi.Framework.AuditLogging.SqlSugarCore.Repositories;
|
||||||
|
|
||||||
public class SqlSugarCoreAuditLogRepository : SqlSugarObjectRepository<AuditLog, Guid>, IAuditLogRepository
|
public class SqlSugarCoreAuditLogRepository : SqlSugarRepository<AuditLogAggregateRoot, Guid>, IAuditLogRepository
|
||||||
{
|
{
|
||||||
public virtual async Task<List<AuditLog>> GetListAsync(
|
public SqlSugarCoreAuditLogRepository(ISugarDbContextProvider<ISqlSugarDbContext> sugarDbContextProvider) : base(sugarDbContextProvider)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public virtual async Task<List<AuditLogAggregateRoot>> GetListAsync(
|
||||||
string sorting = null,
|
string sorting = null,
|
||||||
int maxResultCount = 50,
|
int maxResultCount = 50,
|
||||||
int skipCount = 0,
|
int skipCount = 0,
|
||||||
@@ -32,8 +33,7 @@ public class SqlSugarCoreAuditLogRepository : SqlSugarObjectRepository<AuditLog,
|
|||||||
int? minExecutionDuration = null,
|
int? minExecutionDuration = null,
|
||||||
bool? hasException = null,
|
bool? hasException = null,
|
||||||
HttpStatusCode? httpStatusCode = null,
|
HttpStatusCode? httpStatusCode = null,
|
||||||
bool includeDetails = false,
|
bool includeDetails = false)
|
||||||
CancellationToken cancellationToken = default)
|
|
||||||
{
|
{
|
||||||
var query = await GetListQueryAsync(
|
var query = await GetListQueryAsync(
|
||||||
startTime,
|
startTime,
|
||||||
@@ -53,10 +53,10 @@ public class SqlSugarCoreAuditLogRepository : SqlSugarObjectRepository<AuditLog,
|
|||||||
);
|
);
|
||||||
|
|
||||||
var auditLogs = await query
|
var auditLogs = await query
|
||||||
.OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(AuditLog.ExecutionTime) + " DESC" : sorting)
|
.OrderBy(sorting.IsNullOrWhiteSpace() ? (nameof(AuditLogAggregateRoot.ExecutionTime) + " DESC") : sorting)
|
||||||
.ToPageListAsync(skipCount, maxResultCount, cancellationToken);
|
.ToPageListAsync(skipCount, maxResultCount);
|
||||||
|
|
||||||
return auditLogs.Adapt<List<AuditLog>>();
|
return auditLogs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual async Task<long> GetCountAsync(
|
public virtual async Task<long> GetCountAsync(
|
||||||
@@ -91,12 +91,12 @@ public class SqlSugarCoreAuditLogRepository : SqlSugarObjectRepository<AuditLog,
|
|||||||
httpStatusCode
|
httpStatusCode
|
||||||
);
|
);
|
||||||
|
|
||||||
var totalCount = await query.CountAsync(cancellationToken);
|
var totalCount = await query.CountAsync();
|
||||||
|
|
||||||
return totalCount;
|
return totalCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual async Task<ISugarQueryable<AuditLogEntity>> GetListQueryAsync(
|
protected virtual async Task<ISugarQueryable<AuditLogAggregateRoot>> GetListQueryAsync(
|
||||||
DateTime? startTime = null,
|
DateTime? startTime = null,
|
||||||
DateTime? endTime = null,
|
DateTime? endTime = null,
|
||||||
string httpMethod = null,
|
string httpMethod = null,
|
||||||
@@ -113,7 +113,7 @@ public class SqlSugarCoreAuditLogRepository : SqlSugarObjectRepository<AuditLog,
|
|||||||
bool includeDetails = false)
|
bool includeDetails = false)
|
||||||
{
|
{
|
||||||
var nHttpStatusCode = (int?)httpStatusCode;
|
var nHttpStatusCode = (int?)httpStatusCode;
|
||||||
return (await GetDbContextAsync()).Queryable<AuditLogEntity>()
|
return _DbQueryable
|
||||||
.WhereIF(startTime.HasValue, auditLog => auditLog.ExecutionTime >= startTime)
|
.WhereIF(startTime.HasValue, auditLog => auditLog.ExecutionTime >= startTime)
|
||||||
.WhereIF(endTime.HasValue, auditLog => auditLog.ExecutionTime <= endTime)
|
.WhereIF(endTime.HasValue, auditLog => auditLog.ExecutionTime <= endTime)
|
||||||
.WhereIF(hasException.HasValue && hasException.Value, auditLog => auditLog.Exceptions != null && auditLog.Exceptions != "")
|
.WhereIF(hasException.HasValue && hasException.Value, auditLog => auditLog.Exceptions != null && auditLog.Exceptions != "")
|
||||||
@@ -135,34 +135,35 @@ public class SqlSugarCoreAuditLogRepository : SqlSugarObjectRepository<AuditLog,
|
|||||||
DateTime endDate,
|
DateTime endDate,
|
||||||
CancellationToken cancellationToken = default)
|
CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
var result = await (await GetDbContextAsync()).Queryable<AuditLogEntity>()
|
var result = await _DbQueryable
|
||||||
.Where(a => a.ExecutionTime < endDate.AddDays(1) && a.ExecutionTime > startDate)
|
.Where(a => a.ExecutionTime < endDate.AddDays(1) && a.ExecutionTime > startDate)
|
||||||
.OrderBy(t => t.ExecutionTime)
|
.OrderBy(t => t.ExecutionTime)
|
||||||
.GroupBy(t => new { t.ExecutionTime.Date })
|
.GroupBy(t => new { t.ExecutionTime.Date })
|
||||||
.Select(g => new { Day = SqlFunc.AggregateMin(g.ExecutionTime), avgExecutionTime = SqlFunc.AggregateAvg(g.ExecutionDuration) })
|
.Select(g => new { Day = SqlFunc.AggregateMin(g.ExecutionTime), avgExecutionTime = SqlFunc.AggregateAvg(g.ExecutionDuration) })
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync();
|
||||||
|
|
||||||
return result.ToDictionary(element => element.Day.ClearTime(), element => (double)element.avgExecutionTime);
|
return result.ToDictionary(element => element.Day.ClearTime(), element => (double)element.avgExecutionTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual async Task<EntityChange> GetEntityChange(
|
|
||||||
|
public virtual async Task<EntityChangeEntity> GetEntityChange(
|
||||||
Guid entityChangeId,
|
Guid entityChangeId,
|
||||||
CancellationToken cancellationToken = default)
|
CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
var entityChange = await (await GetDbContextAsync()).Queryable<EntityChange>()
|
var entityChange = await (await GetDbContextAsync()).Queryable<EntityChangeEntity>()
|
||||||
.Where(x => x.Id == entityChangeId)
|
.Where(x => x.Id == entityChangeId)
|
||||||
.OrderBy(x => x.Id)
|
.OrderBy(x => x.Id)
|
||||||
.FirstAsync(cancellationToken);
|
.FirstAsync();
|
||||||
|
|
||||||
if (entityChange == null)
|
if (entityChange == null)
|
||||||
{
|
{
|
||||||
throw new EntityNotFoundException(typeof(EntityChange));
|
throw new EntityNotFoundException(typeof(EntityChangeEntity));
|
||||||
}
|
}
|
||||||
|
|
||||||
return entityChange;
|
return entityChange;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual async Task<List<EntityChange>> GetEntityChangeListAsync(
|
public virtual async Task<List<EntityChangeEntity>> GetEntityChangeListAsync(
|
||||||
string sorting = null,
|
string sorting = null,
|
||||||
int maxResultCount = 50,
|
int maxResultCount = 50,
|
||||||
int skipCount = 0,
|
int skipCount = 0,
|
||||||
@@ -177,8 +178,8 @@ public class SqlSugarCoreAuditLogRepository : SqlSugarObjectRepository<AuditLog,
|
|||||||
{
|
{
|
||||||
var query = await GetEntityChangeListQueryAsync(auditLogId, startTime, endTime, changeType, entityId, entityTypeFullName, includeDetails);
|
var query = await GetEntityChangeListQueryAsync(auditLogId, startTime, endTime, changeType, entityId, entityTypeFullName, includeDetails);
|
||||||
|
|
||||||
return await query.OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(EntityChange.ChangeTime) + " DESC" : sorting)
|
return await query.OrderBy(sorting.IsNullOrWhiteSpace() ? (nameof(EntityChangeEntity.ChangeTime) + " DESC") : sorting)
|
||||||
.ToPageListAsync(skipCount, maxResultCount, cancellationToken);
|
.ToPageListAsync(skipCount, maxResultCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual async Task<long> GetEntityChangeCountAsync(
|
public virtual async Task<long> GetEntityChangeCountAsync(
|
||||||
@@ -192,17 +193,16 @@ public class SqlSugarCoreAuditLogRepository : SqlSugarObjectRepository<AuditLog,
|
|||||||
{
|
{
|
||||||
var query = await GetEntityChangeListQueryAsync(auditLogId, startTime, endTime, changeType, entityId, entityTypeFullName);
|
var query = await GetEntityChangeListQueryAsync(auditLogId, startTime, endTime, changeType, entityId, entityTypeFullName);
|
||||||
|
|
||||||
var totalCount = await query.CountAsync(cancellationToken);
|
var totalCount = await query.CountAsync();
|
||||||
|
|
||||||
return totalCount;
|
return totalCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual async Task<EntityChangeWithUsername> GetEntityChangeWithUsernameAsync(
|
public virtual async Task<EntityChangeWithUsername> GetEntityChangeWithUsernameAsync(
|
||||||
Guid entityChangeId,
|
Guid entityChangeId)
|
||||||
CancellationToken cancellationToken = default)
|
|
||||||
{
|
{
|
||||||
var auditLog = await (await GetDbContextAsync()).Queryable<AuditLogEntity>()
|
var auditLog = await _DbQueryable
|
||||||
.Where(x => x.EntityChanges.Any(y => y.Id == entityChangeId)).FirstAsync(cancellationToken);
|
.Where(x => x.EntityChanges.Any(y => y.Id == entityChangeId)).FirstAsync();
|
||||||
|
|
||||||
return new EntityChangeWithUsername()
|
return new EntityChangeWithUsername()
|
||||||
{
|
{
|
||||||
@@ -218,15 +218,14 @@ public class SqlSugarCoreAuditLogRepository : SqlSugarObjectRepository<AuditLog,
|
|||||||
{
|
{
|
||||||
var dbContext = await GetDbContextAsync();
|
var dbContext = await GetDbContextAsync();
|
||||||
|
|
||||||
var query = dbContext.Queryable<EntityChange>()
|
var query = dbContext.Queryable<EntityChangeEntity>()
|
||||||
.Where(x => x.EntityId == entityId && x.EntityTypeFullName == entityTypeFullName);
|
.Where(x => x.EntityId == entityId && x.EntityTypeFullName == entityTypeFullName);
|
||||||
return await query.LeftJoin<AuditLogEntity>((change, audit) => change.AuditLogId == audit.Id)
|
return await query.LeftJoin<AuditLogAggregateRoot>((x, audit) => x.AuditLogId == audit.Id)
|
||||||
.Select((change, audit) => new EntityChangeWithUsername { EntityChange = change, UserName = audit.UserName }, true)
|
.Select((x, audit) => new EntityChangeWithUsername { EntityChange = x, UserName = audit.UserName })
|
||||||
.OrderByDescending(x => x.EntityChange.ChangeTime).ToListAsync(cancellationToken);
|
.OrderByDescending(x => x.EntityChange.ChangeTime).ToListAsync();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual async Task<ISugarQueryable<EntityChange>> GetEntityChangeListQueryAsync(
|
protected virtual async Task<ISugarQueryable<EntityChangeEntity>> GetEntityChangeListQueryAsync(
|
||||||
Guid? auditLogId = null,
|
Guid? auditLogId = null,
|
||||||
DateTime? startTime = null,
|
DateTime? startTime = null,
|
||||||
DateTime? endTime = null,
|
DateTime? endTime = null,
|
||||||
@@ -236,7 +235,7 @@ public class SqlSugarCoreAuditLogRepository : SqlSugarObjectRepository<AuditLog,
|
|||||||
bool includeDetails = false)
|
bool includeDetails = false)
|
||||||
{
|
{
|
||||||
return (await GetDbContextAsync())
|
return (await GetDbContextAsync())
|
||||||
.Queryable<EntityChange>()
|
.Queryable<EntityChangeEntity>()
|
||||||
.WhereIF(auditLogId.HasValue, e => e.AuditLogId == auditLogId)
|
.WhereIF(auditLogId.HasValue, e => e.AuditLogId == auditLogId)
|
||||||
.WhereIF(startTime.HasValue, e => e.ChangeTime >= startTime)
|
.WhereIF(startTime.HasValue, e => e.ChangeTime >= startTime)
|
||||||
.WhereIF(endTime.HasValue, e => e.ChangeTime <= endTime)
|
.WhereIF(endTime.HasValue, e => e.ChangeTime <= endTime)
|
||||||
@@ -244,106 +243,4 @@ public class SqlSugarCoreAuditLogRepository : SqlSugarObjectRepository<AuditLog,
|
|||||||
.WhereIF(!string.IsNullOrWhiteSpace(entityId), e => e.EntityId == entityId)
|
.WhereIF(!string.IsNullOrWhiteSpace(entityId), e => e.EntityId == entityId)
|
||||||
.WhereIF(!string.IsNullOrWhiteSpace(entityTypeFullName), e => e.EntityTypeFullName.Contains(entityTypeFullName));
|
.WhereIF(!string.IsNullOrWhiteSpace(entityTypeFullName), e => e.EntityTypeFullName.Contains(entityTypeFullName));
|
||||||
}
|
}
|
||||||
|
|
||||||
Task<List<AuditLog>> IAuditLogRepository.GetListAsync(string sorting, int maxResultCount, int skipCount, DateTime? startTime, DateTime? endTime, string httpMethod, string url, Guid? userId, string userName, string applicationName, string clientIpAddress, string correlationId, int? maxExecutionDuration, int? minExecutionDuration, bool? hasException, HttpStatusCode? httpStatusCode, bool includeDetails, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public Task<AuditLog> GetAsync(Expression<Func<AuditLog, bool>> predicate, bool includeDetails = true, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task DeleteAsync(Expression<Func<AuditLog, bool>> predicate, bool autoSave = false, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task DeleteDirectAsync(Expression<Func<AuditLog, bool>> predicate, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
IQueryable<AuditLog> IReadOnlyRepository<AuditLog>.WithDetails()
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public IQueryable<AuditLog> WithDetails(params Expression<Func<AuditLog, object>>[] propertySelectors)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
Task<IQueryable<AuditLog>> IReadOnlyRepository<AuditLog>.WithDetailsAsync()
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<IQueryable<AuditLog>> WithDetailsAsync(params Expression<Func<AuditLog, object>>[] propertySelectors)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
Task<IQueryable<AuditLog>> IReadOnlyRepository<AuditLog>.GetQueryableAsync()
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<List<AuditLog>> GetListAsync(Expression<Func<AuditLog, bool>> predicate, bool includeDetails = false, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<AuditLog> InsertAsync(AuditLog entity, bool autoSave = false, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task InsertManyAsync(IEnumerable<AuditLog> entities, bool autoSave = false, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<AuditLog> UpdateAsync(AuditLog entity, bool autoSave = false, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task UpdateManyAsync(IEnumerable<AuditLog> entities, bool autoSave = false, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task DeleteAsync(AuditLog entity, bool autoSave = false, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task DeleteManyAsync(IEnumerable<AuditLog> entities, bool autoSave = false, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
Task<AuditLog> IReadOnlyBasicRepository<AuditLog, Guid>.GetAsync(Guid id, bool includeDetails, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
Task<AuditLog?> IReadOnlyBasicRepository<AuditLog, Guid>.FindAsync(Guid id, bool includeDetails, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
Task<List<AuditLog>> IReadOnlyBasicRepository<AuditLog>.GetListAsync(bool includeDetails, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
Task<List<AuditLog>> IReadOnlyBasicRepository<AuditLog>.GetPagedListAsync(int skipCount, int maxResultCount, string sorting, bool includeDetails, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -6,13 +6,10 @@
|
|||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Volo.Abp.AuditLogging.Domain" Version="8.0.0" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\..\framework\Yi.Framework.Mapster\Yi.Framework.Mapster.csproj" />
|
<ProjectReference Include="..\..\..\framework\Yi.Framework.Mapster\Yi.Framework.Mapster.csproj" />
|
||||||
<ProjectReference Include="..\..\..\framework\Yi.Framework.SqlSugarCore\Yi.Framework.SqlSugarCore.csproj" />
|
<ProjectReference Include="..\..\..\framework\Yi.Framework.SqlSugarCore\Yi.Framework.SqlSugarCore.csproj" />
|
||||||
|
<ProjectReference Include="..\Yi.Framework.AuditLogging.Domain\Yi.Framework.AuditLogging.Domain.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,130 +0,0 @@
|
|||||||
using System.Reflection;
|
|
||||||
using SqlSugar;
|
|
||||||
using Volo.Abp.AuditLogging;
|
|
||||||
using Volo.Abp.DependencyInjection;
|
|
||||||
using Yi.Framework.SqlSugarCore;
|
|
||||||
|
|
||||||
namespace Yi.AuditLogging.SqlSugarCore
|
|
||||||
{
|
|
||||||
public class YiAuditLoggingDbContext : SqlSugarDbContext
|
|
||||||
{
|
|
||||||
public YiAuditLoggingDbContext(IAbpLazyServiceProvider lazyServiceProvider) : base(lazyServiceProvider)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void EntityService(PropertyInfo property, EntityColumnInfo column)
|
|
||||||
{
|
|
||||||
base.EntityService(property, column);
|
|
||||||
column.DbTableName = AbpAuditLoggingDbProperties.DbTablePrefix + "AuditLogs";
|
|
||||||
|
|
||||||
column.IfTable<AuditLog>()
|
|
||||||
|
|
||||||
.UpdateProperty(x => x.Id,
|
|
||||||
x =>
|
|
||||||
{
|
|
||||||
x.IsPrimarykey = true;
|
|
||||||
})
|
|
||||||
|
|
||||||
.UpdateProperty(x => x.ApplicationName,
|
|
||||||
x =>
|
|
||||||
{
|
|
||||||
x.Length = AuditLogConsts.MaxApplicationNameLength;
|
|
||||||
x.DbColumnName = nameof(AuditLog.ApplicationName);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// builder.Entity<AuditLog>(b =>
|
|
||||||
// {
|
|
||||||
// b.ToTable(AbpAuditLoggingDbProperties.DbTablePrefix + "AuditLogs", AbpAuditLoggingDbProperties.DbSchema);
|
|
||||||
|
|
||||||
// b.ConfigureByConvention();
|
|
||||||
|
|
||||||
// b.Property(x => x.ApplicationName).HasMaxLength(AuditLogConsts.MaxApplicationNameLength).HasColumnName(nameof(AuditLog.ApplicationName));
|
|
||||||
// b.Property(x => x.ClientIpAddress).HasMaxLength(AuditLogConsts.MaxClientIpAddressLength).HasColumnName(nameof(AuditLog.ClientIpAddress));
|
|
||||||
// b.Property(x => x.ClientName).HasMaxLength(AuditLogConsts.MaxClientNameLength).HasColumnName(nameof(AuditLog.ClientName));
|
|
||||||
// b.Property(x => x.ClientId).HasMaxLength(AuditLogConsts.MaxClientIdLength).HasColumnName(nameof(AuditLog.ClientId));
|
|
||||||
// b.Property(x => x.CorrelationId).HasMaxLength(AuditLogConsts.MaxCorrelationIdLength).HasColumnName(nameof(AuditLog.CorrelationId));
|
|
||||||
// b.Property(x => x.BrowserInfo).HasMaxLength(AuditLogConsts.MaxBrowserInfoLength).HasColumnName(nameof(AuditLog.BrowserInfo));
|
|
||||||
// b.Property(x => x.HttpMethod).HasMaxLength(AuditLogConsts.MaxHttpMethodLength).HasColumnName(nameof(AuditLog.HttpMethod));
|
|
||||||
// b.Property(x => x.Url).HasMaxLength(AuditLogConsts.MaxUrlLength).HasColumnName(nameof(AuditLog.Url));
|
|
||||||
// b.Property(x => x.HttpStatusCode).HasColumnName(nameof(AuditLog.HttpStatusCode));
|
|
||||||
|
|
||||||
// b.Property(x => x.Comments).HasMaxLength(AuditLogConsts.MaxCommentsLength).HasColumnName(nameof(AuditLog.Comments));
|
|
||||||
// b.Property(x => x.ExecutionDuration).HasColumnName(nameof(AuditLog.ExecutionDuration));
|
|
||||||
// b.Property(x => x.ImpersonatorTenantId).HasColumnName(nameof(AuditLog.ImpersonatorTenantId));
|
|
||||||
// b.Property(x => x.ImpersonatorUserId).HasColumnName(nameof(AuditLog.ImpersonatorUserId));
|
|
||||||
// b.Property(x => x.ImpersonatorTenantName).HasMaxLength(AuditLogConsts.MaxTenantNameLength).HasColumnName(nameof(AuditLog.ImpersonatorTenantName));
|
|
||||||
// b.Property(x => x.ImpersonatorUserName).HasMaxLength(AuditLogConsts.MaxUserNameLength).HasColumnName(nameof(AuditLog.ImpersonatorUserName));
|
|
||||||
// b.Property(x => x.UserId).HasColumnName(nameof(AuditLog.UserId));
|
|
||||||
// b.Property(x => x.UserName).HasMaxLength(AuditLogConsts.MaxUserNameLength).HasColumnName(nameof(AuditLog.UserName));
|
|
||||||
// b.Property(x => x.TenantId).HasColumnName(nameof(AuditLog.TenantId));
|
|
||||||
// b.Property(x => x.TenantName).HasMaxLength(AuditLogConsts.MaxTenantNameLength).HasColumnName(nameof(AuditLog.TenantName));
|
|
||||||
|
|
||||||
// b.HasMany(a => a.Actions).WithOne().HasForeignKey(x => x.AuditLogId).IsRequired();
|
|
||||||
// b.HasMany(a => a.EntityChanges).WithOne().HasForeignKey(x => x.AuditLogId).IsRequired();
|
|
||||||
|
|
||||||
// b.HasIndex(x => new { x.TenantId, x.ExecutionTime });
|
|
||||||
// b.HasIndex(x => new { x.TenantId, x.UserId, x.ExecutionTime });
|
|
||||||
|
|
||||||
// b.ApplyObjectExtensionMappings();
|
|
||||||
// });
|
|
||||||
|
|
||||||
// builder.Entity<AuditLogAction>(b =>
|
|
||||||
// {
|
|
||||||
// b.ToTable(AbpAuditLoggingDbProperties.DbTablePrefix + "AuditLogActions", AbpAuditLoggingDbProperties.DbSchema);
|
|
||||||
|
|
||||||
// b.ConfigureByConvention();
|
|
||||||
|
|
||||||
// b.Property(x => x.AuditLogId).HasColumnName(nameof(AuditLogAction.AuditLogId));
|
|
||||||
// b.Property(x => x.ServiceName).HasMaxLength(AuditLogActionConsts.MaxServiceNameLength).HasColumnName(nameof(AuditLogAction.ServiceName));
|
|
||||||
// b.Property(x => x.MethodName).HasMaxLength(AuditLogActionConsts.MaxMethodNameLength).HasColumnName(nameof(AuditLogAction.MethodName));
|
|
||||||
// b.Property(x => x.Parameters).HasMaxLength(AuditLogActionConsts.MaxParametersLength).HasColumnName(nameof(AuditLogAction.Parameters));
|
|
||||||
// b.Property(x => x.ExecutionTime).HasColumnName(nameof(AuditLogAction.ExecutionTime));
|
|
||||||
// b.Property(x => x.ExecutionDuration).HasColumnName(nameof(AuditLogAction.ExecutionDuration));
|
|
||||||
|
|
||||||
// b.HasIndex(x => new { x.AuditLogId });
|
|
||||||
// b.HasIndex(x => new { x.TenantId, x.ServiceName, x.MethodName, x.ExecutionTime });
|
|
||||||
|
|
||||||
// b.ApplyObjectExtensionMappings();
|
|
||||||
// });
|
|
||||||
|
|
||||||
// builder.Entity<EntityChange>(b =>
|
|
||||||
// {
|
|
||||||
// b.ToTable(AbpAuditLoggingDbProperties.DbTablePrefix + "EntityChanges", AbpAuditLoggingDbProperties.DbSchema);
|
|
||||||
|
|
||||||
// b.ConfigureByConvention();
|
|
||||||
|
|
||||||
// b.Property(x => x.EntityTypeFullName).HasMaxLength(EntityChangeConsts.MaxEntityTypeFullNameLength).IsRequired().HasColumnName(nameof(EntityChange.EntityTypeFullName));
|
|
||||||
// b.Property(x => x.EntityId).HasMaxLength(EntityChangeConsts.MaxEntityIdLength).IsRequired().HasColumnName(nameof(EntityChange.EntityId));
|
|
||||||
// b.Property(x => x.AuditLogId).IsRequired().HasColumnName(nameof(EntityChange.AuditLogId));
|
|
||||||
// b.Property(x => x.ChangeTime).IsRequired().HasColumnName(nameof(EntityChange.ChangeTime));
|
|
||||||
// b.Property(x => x.ChangeType).IsRequired().HasColumnName(nameof(EntityChange.ChangeType));
|
|
||||||
// b.Property(x => x.TenantId).HasColumnName(nameof(EntityChange.TenantId));
|
|
||||||
|
|
||||||
// b.HasMany(a => a.PropertyChanges).WithOne().HasForeignKey(x => x.EntityChangeId);
|
|
||||||
|
|
||||||
// b.HasIndex(x => new { x.AuditLogId });
|
|
||||||
// b.HasIndex(x => new { x.TenantId, x.EntityTypeFullName, x.EntityId });
|
|
||||||
|
|
||||||
// b.ApplyObjectExtensionMappings();
|
|
||||||
// });
|
|
||||||
|
|
||||||
// builder.Entity<EntityPropertyChange>(b =>
|
|
||||||
// {
|
|
||||||
// b.ToTable(AbpAuditLoggingDbProperties.DbTablePrefix + "EntityPropertyChanges", AbpAuditLoggingDbProperties.DbSchema);
|
|
||||||
|
|
||||||
// b.ConfigureByConvention();
|
|
||||||
|
|
||||||
// b.Property(x => x.NewValue).HasMaxLength(EntityPropertyChangeConsts.MaxNewValueLength).HasColumnName(nameof(EntityPropertyChange.NewValue));
|
|
||||||
// b.Property(x => x.PropertyName).HasMaxLength(EntityPropertyChangeConsts.MaxPropertyNameLength).IsRequired().HasColumnName(nameof(EntityPropertyChange.PropertyName));
|
|
||||||
// b.Property(x => x.PropertyTypeFullName).HasMaxLength(EntityPropertyChangeConsts.MaxPropertyTypeFullNameLength).IsRequired().HasColumnName(nameof(EntityPropertyChange.PropertyTypeFullName));
|
|
||||||
// b.Property(x => x.OriginalValue).HasMaxLength(EntityPropertyChangeConsts.MaxOriginalValueLength).HasColumnName(nameof(EntityPropertyChange.OriginalValue));
|
|
||||||
|
|
||||||
// b.HasIndex(x => new { x.EntityChangeId });
|
|
||||||
|
|
||||||
// b.ApplyObjectExtensionMappings();
|
|
||||||
// });
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +1,17 @@
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
|
||||||
using Volo.Abp.AuditLogging;
|
|
||||||
using Volo.Abp.Modularity;
|
using Volo.Abp.Modularity;
|
||||||
|
using Yi.Framework.AuditLogging.Domain.Repositories;
|
||||||
|
using Yi.Framework.AuditLogging.SqlSugarCore.Repositories;
|
||||||
using Yi.Framework.SqlSugarCore;
|
using Yi.Framework.SqlSugarCore;
|
||||||
|
|
||||||
namespace Yi.AuditLogging.SqlSugarCore
|
namespace Yi.AuditLogging.SqlSugarCore
|
||||||
{
|
{
|
||||||
[DependsOn(typeof(AbpAuditLoggingDomainModule))]
|
|
||||||
[DependsOn(typeof(YiFrameworkSqlSugarCoreModule))]
|
[DependsOn(typeof(YiFrameworkSqlSugarCoreModule))]
|
||||||
public class YiFrameworkAuditLoggingSqlSugarCoreModule : AbpModule
|
public class YiFrameworkAuditLoggingSqlSugarCoreModule : AbpModule
|
||||||
{
|
{
|
||||||
public override void ConfigureServices(ServiceConfigurationContext context)
|
public override void ConfigureServices(ServiceConfigurationContext context)
|
||||||
{
|
{
|
||||||
context.Services.Replace(new ServiceDescriptor(typeof(IAuditLogRepository), typeof(SqlSugarCoreAuditLogRepository), lifetime: ServiceLifetime.Transient));
|
context.Services.AddTransient<IAuditLogRepository, SqlSugarCoreAuditLogRepository>();
|
||||||
context.Services.TryAddYiDbContext<YiAuditLoggingDbContext>();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user