Browse Source

entity change records are searchable

pull/698/head
cKey 3 years ago
parent
commit
b88a3ec5a6
  1. 13
      aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/AuditLogInfoToAuditLogConverter.cs
  2. 407
      aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchEntityChangeStore.cs
  3. 4
      aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/AuditLogManager.cs
  4. 115
      aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/EntityChangeStore.cs
  5. 2
      aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/SecurityLogManager.cs
  6. 4
      aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/EntityChange.cs
  7. 3
      aspnet-core/modules/tui-juhe/LINGYUN.Abp.TuiJuhe.SettingManagement/LINGYUN.Abp.TuiJuhe.SettingManagement.csproj
  8. 6
      aspnet-core/modules/tui-juhe/LINGYUN.Abp.TuiJuhe.SettingManagement/LINGYUN/Abp/TuiJuhe/SettingManagement/AbpTuiJuheSettingManagementModule.cs

13
aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/AuditLogInfoToAuditLogConverter.cs

@ -47,13 +47,22 @@ namespace LINGYUN.Abp.AuditLogging
var entityChanges = auditLogInfo var entityChanges = auditLogInfo
.EntityChanges? .EntityChanges?
.Select(entityChangeInfo => new EntityChange(GuidGenerator, auditLogId, entityChangeInfo, tenantId: auditLogInfo.TenantId)) .Select(entityChangeInfo => new EntityChange(
GuidGenerator,
auditLogId,
entityChangeInfo,
tenantId: auditLogInfo.TenantId,
entityTenantId: entityChangeInfo.EntityTenantId))
.ToList() .ToList()
?? new List<EntityChange>(); ?? new List<EntityChange>();
var actions = auditLogInfo var actions = auditLogInfo
.Actions? .Actions?
.Select(auditLogActionInfo => new AuditLogAction(GuidGenerator.Create(), auditLogId, auditLogActionInfo, tenantId: auditLogInfo.TenantId)) .Select(auditLogActionInfo => new AuditLogAction(
GuidGenerator.Create(),
auditLogId,
auditLogActionInfo,
tenantId: auditLogInfo.TenantId))
.ToList() .ToList()
?? new List<AuditLogAction>(); ?? new List<AuditLogAction>();

407
aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchEntityChangeStore.cs

@ -40,29 +40,37 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
{ {
var client = _clientFactory.Create(); var client = _clientFactory.Create();
var resposne = await client.SearchAsync<EntityChange>( var sortOrder = SortOrder.Descending;
dsl => dsl.Index(CreateIndex())
.Query(query => var querys = BuildQueryDescriptor(entityChangeId: entityChangeId);
query.Bool(bo =>
bo.Must(m => static SourceFilterDescriptor<AuditLog> SourceFilter(SourceFilterDescriptor<AuditLog> selector)
m.Nested(n =>
n.InnerHits()
.Path("EntityChanges")
.Query(nq =>
nq.Term(nqt =>
nqt.Field(GetField(nameof(EntityChange.Id))).Value(entityChangeId)))))))
.Source(x => x.Excludes(f => f.Field("*")))
.Sort(entity => entity.Field("EntityChanges.ChangeTime", SortOrder.Descending))
.Size(1),
ct: cancellationToken);
if (resposne.Shards.Successful > 0)
{ {
var hits = resposne.Hits.FirstOrDefault(); selector.IncludeAll()
if (hits.InnerHits.Count > 0) .Excludes(field =>
{ field.Field(f => f.Actions)
return hits.InnerHits.First().Value.Documents<EntityChange>().FirstOrDefault(); .Field(f => f.Comments)
} .Field(f => f.Exceptions));
return selector;
}
var response = await client.SearchAsync<AuditLog>(dsl =>
dsl.Index(CreateIndex())
.Query(log => log.Bool(b => b.Must(querys.ToArray())))
.Source(SourceFilter)
.Sort(log => log.Field(GetField(nameof(EntityChange.ChangeTime)), sortOrder))
.From(0)
.Size(1),
cancellationToken);
var auditLog = response.Documents.FirstOrDefault();
if (auditLog != null)
{
return auditLog
.EntityChanges
.Select(e => e)
.FirstOrDefault();
} }
return null; return null;
@ -77,40 +85,39 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
string entityTypeFullName = null, string entityTypeFullName = null,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
await Task.CompletedTask; var client = _clientFactory.Create();
return 0;
//var client = _clientFactory.Create(); var querys = BuildQueryDescriptor(
auditLogId,
//var querys = BuildQueryDescriptor( startTime,
// auditLogId, endTime,
// startTime, changeType,
// endTime, entityId,
// changeType, entityTypeFullName);
// entityId,
// entityTypeFullName); SourceFilterDescriptor<AuditLog> SourceFilter(SourceFilterDescriptor<AuditLog> selector)
{
//Func<QueryContainerDescriptor<EntityChange>, QueryContainer> selector = q => q.MatchAll(); return selector
//if (querys.Count > 0) .Includes(field =>
//{ field.Field(f => f.UserName)
// selector = q => q.Bool(b => b.Must(querys.ToArray())); .Field(f => f.EntityChanges))
//} .Excludes(field =>
field.Field(f => f.Actions)
//var response = await client.CountAsync<EntityChange>(dsl => .Field(f => f.Comments)
// dsl.Index(CreateIndex()) .Field(f => f.Exceptions));
// .Query(q => }
// q.Bool(b =>
// b.Must(m => var response = await client.SearchAsync<AuditLog>(dsl =>
// m.Nested(n => dsl.Index(CreateIndex())
// n.InnerHits(hit => hit.Source(s => s.ExcludeAll())) .Query(log => log.Bool(b => b.Must(querys.ToArray())))
// .Path("EntityChanges") .Source(SourceFilter)
// .Query(selector) .From(0)
// ) .Size(1000),
// ) cancellationToken);
// )
// ), var auditLogs = response.Documents.ToList();
// ct: cancellationToken);
return auditLogs.Sum(log => log.EntityChanges.Count);
//return response.Count;
} }
public async virtual Task<List<EntityChange>> GetListAsync( public async virtual Task<List<EntityChange>> GetListAsync(
@ -126,72 +133,74 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
bool includeDetails = false, bool includeDetails = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
// TODO: 需要解决Nested格式数据返回方式 // TODO: 正确的索引可以避免性能损耗
//var client = _clientFactory.Create(); var result = new List<EntityChange>();
var client = _clientFactory.Create();
//var sortOrder = !sorting.IsNullOrWhiteSpace() && sorting.EndsWith("asc", StringComparison.InvariantCultureIgnoreCase)
// ? SortOrder.Ascending : SortOrder.Descending; var sortOrder = !sorting.IsNullOrWhiteSpace() && sorting.EndsWith("asc", StringComparison.InvariantCultureIgnoreCase)
//sorting = !sorting.IsNullOrWhiteSpace() ? SortOrder.Ascending : SortOrder.Descending;
// ? sorting.Split()[0] sorting = !sorting.IsNullOrWhiteSpace()
// : nameof(EntityChange.ChangeTime); ? sorting.Split()[0]
: nameof(EntityChange.ChangeTime);
//var querys = BuildQueryDescriptor(
// auditLogId, var querys = BuildQueryDescriptor(
// startTime, auditLogId,
// endTime, startTime,
// changeType, endTime,
// entityId, changeType,
// entityTypeFullName); entityId,
entityTypeFullName);
//SourceFilterDescriptor<EntityChange> SourceFilter(SourceFilterDescriptor<EntityChange> selector)
//{ SourceFilterDescriptor<AuditLog> SourceFilter(SourceFilterDescriptor<AuditLog> selector)
// selector.Includes(GetEntityChangeSources()); {
// if (!includeDetails) selector
// { .Includes(field =>
// selector.Excludes(field => field.Field(f => f.UserName)
// field.Field("EntityChanges.PropertyChanges") .Field(f => f.EntityChanges));
// .Field("EntityChanges.ExtraProperties")); if (includeDetails)
// } {
selector.Includes(field =>
// return selector; field.Field(f => f.Actions)
//} .Field(f => f.Comments)
.Field(f => f.Exceptions));
//Func<QueryContainerDescriptor<EntityChange>, QueryContainer> selector = q => q.MatchAll(); }
//if (querys.Count > 0)
//{ return selector;
// selector = q => q.Bool(b => b.Must(querys.ToArray())); }
//}
var response = await client.SearchAsync<AuditLog>(dsl =>
//var response = await client.SearchAsync<EntityChange>(dsl => dsl.Index(CreateIndex())
// dsl.Index(CreateIndex()) .Query(log => log.Bool(b => b.Must(querys.ToArray())))
// .Query(q => .Source(SourceFilter)
// q.Bool(b => .Sort(log => log.Field(GetField(nameof(EntityChange.ChangeTime)), sortOrder))
// b.Must(m => .From(0)
// m.Nested(n => .Size(1000),
// n.InnerHits(hit => hit.Source(SourceFilter)) cancellationToken);
// .Path("EntityChanges")
// .Query(selector) var auditLogs = response.Documents.ToList();
// ) if (auditLogs.Any())
// ) {
// ) var groupAuditLogs = auditLogs.GroupBy(log => log.UserName);
// ) foreach (var group in groupAuditLogs)
// .Source(x => x.Excludes(f => f.Field("*"))) {
// .Sort(entity => entity.Field(GetField(sorting), sortOrder)) var entityChangesList = group.Select(log => log.EntityChanges);
// .From(skipCount)
// .Size(maxResultCount), foreach (var entityChanges in entityChangesList)
// cancellationToken); {
foreach (var entityChange in entityChanges)
//if (response.Shards.Successful > 0) {
//{ result.Add(entityChange);
// var hits = response.Hits.FirstOrDefault(); }
// if (hits.InnerHits.Count > 0) }
// { }
// return hits.InnerHits.First().Value.Documents<EntityChange>().ToList(); }
// }
//} // TODO: 临时在内存中分页
await Task.CompletedTask; return result
return new List<EntityChange>(); .AsQueryable()
.PageBy(skipCount, maxResultCount)
.ToList();
} }
public async virtual Task<EntityChangeWithUsername> GetWithUsernameAsync( public async virtual Task<EntityChangeWithUsername> GetWithUsernameAsync(
@ -200,41 +209,43 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
{ {
var client = _clientFactory.Create(); var client = _clientFactory.Create();
var response = await client.SearchAsync<AuditLog>( var sortOrder = SortOrder.Descending;
dsl => dsl.Index(CreateIndex())
.Query(query =>
query.Bool(bo =>
bo.Must(m =>
m.Nested(n =>
n.InnerHits()
.Path("EntityChanges")
.Query(nq =>
nq.Bool(nb =>
nb.Must(nm =>
nm.Term(nt =>
nt.Field(GetField(nameof(EntityChange.Id))).Value(entityChangeId)))))))))
.Source(selector => selector.Includes(field =>
field.Field(f => f.UserName)))
.Size(1),
ct: cancellationToken);
var auditLog = response.Documents.FirstOrDefault(); var querys = BuildQueryDescriptor(entityChangeId: entityChangeId);
EntityChange entityChange = null;
if (response.Shards.Successful > 0) static SourceFilterDescriptor<AuditLog> SourceFilter(SourceFilterDescriptor<AuditLog> selector)
{ {
var hits = response.Hits.FirstOrDefault(); selector.IncludeAll()
if (hits.InnerHits.Count > 0) .Excludes(field =>
{ field.Field(f => f.Actions)
entityChange = hits.InnerHits.First().Value.Documents<EntityChange>().FirstOrDefault(); .Field(f => f.Comments)
} .Field(f => f.Exceptions));
return selector;
} }
return new EntityChangeWithUsername() var response = await client.SearchAsync<AuditLog>(dsl =>
dsl.Index(CreateIndex())
.Query(log => log.Bool(b => b.Must(querys.ToArray())))
.Source(SourceFilter)
.Sort(log => log.Field(GetField(nameof(EntityChange.ChangeTime)), sortOrder))
.From(0)
.Size(1),
cancellationToken);
var auditLog = response.Documents.FirstOrDefault();
if (auditLog != null)
{ {
EntityChange = entityChange, return auditLog.EntityChanges.Select(e =>
UserName = auditLog?.UserName new EntityChangeWithUsername
}; {
UserName = auditLog.UserName,
EntityChange = e
})
.FirstOrDefault();
}
return null;
} }
public async virtual Task<List<EntityChangeWithUsername>> GetWithUsernameAsync( public async virtual Task<List<EntityChangeWithUsername>> GetWithUsernameAsync(
@ -242,61 +253,69 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
string entityTypeFullName, string entityTypeFullName,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var result = new List<EntityChangeWithUsername>();
var client = _clientFactory.Create(); var client = _clientFactory.Create();
var response = await client.SearchAsync<AuditLog>( var sortOrder = SortOrder.Descending;
dsl => dsl.Index(CreateIndex())
.Query(query => var querys = BuildQueryDescriptor(entityId: entityId, entityTypeFullName: entityTypeFullName);
query.Bool(bo =>
bo.Must(m => static SourceFilterDescriptor<AuditLog> SourceFilter(SourceFilterDescriptor<AuditLog> selector)
m.Nested(n => {
n.InnerHits() selector.IncludeAll()
.Path("EntityChanges") .Excludes(field =>
.Query(nq => field.Field(f => f.Actions)
nq.Bool(nb => .Field(f => f.Comments)
nb.Must(nm => .Field(f => f.Exceptions));
nm.Term(nt =>
nt.Field(GetField(nameof(EntityChange.EntityId))).Value(entityId)), return selector;
nm => }
nm.Term(nt =>
nt.Field(GetField(nameof(EntityChange.EntityTypeFullName))).Value(entityTypeFullName)) var response = await client.SearchAsync<AuditLog>(dsl =>
) dsl.Index(CreateIndex())
) .Query(log => log.Bool(b => b.Must(querys.ToArray())))
) .Source(SourceFilter)
) .Sort(log => log.Field(GetField(nameof(EntityChange.ChangeTime)), sortOrder))
) .From(0)
) .Size(100),
) cancellationToken);
.Source(selector => selector.Includes(field =>
field.Field(f => f.UserName))) var auditLogs = response.Documents.ToList();
.Sort(entity => entity.Field(f => f.ExecutionTime, SortOrder.Descending)), if (auditLogs.Any())
ct: cancellationToken);
if (response.Hits.Count > 0)
{ {
return response.Hits. var groupAuditLogs = auditLogs.GroupBy(log => log.UserName);
Select(hit => new EntityChangeWithUsername foreach (var group in groupAuditLogs)
{
var entityChangesList = group.Select(log => log.EntityChanges);
foreach (var entityChanges in entityChangesList)
{ {
UserName = hit.Source.UserName, foreach (var entityChange in entityChanges.Where(e => e.EntityId.Equals(entityId) && e.EntityTypeFullName.Equals(entityTypeFullName)))
EntityChange = hit.InnerHits.Any() ? {
hit.InnerHits.First().Value.Documents<EntityChange>().FirstOrDefault() result.Add(
: null new EntityChangeWithUsername
}) {
.ToList(); UserName = group.Key,
EntityChange = entityChange
});
}
}
}
} }
return new List<EntityChangeWithUsername>(); return result;
} }
protected virtual List<Func<QueryContainerDescriptor<EntityChange>, QueryContainer>> BuildQueryDescriptor( protected virtual List<Func<QueryContainerDescriptor<AuditLog>, QueryContainer>> BuildQueryDescriptor(
Guid? auditLogId = null, Guid? auditLogId = null,
DateTime? startTime = null, DateTime? startTime = null,
DateTime? endTime = null, DateTime? endTime = null,
EntityChangeType? changeType = null, EntityChangeType? changeType = null,
string entityId = null, string entityId = null,
string entityTypeFullName = null) string entityTypeFullName = null,
Guid? entityChangeId = null)
{ {
var querys = new List<Func<QueryContainerDescriptor<EntityChange>, QueryContainer>>(); var querys = new List<Func<QueryContainerDescriptor<AuditLog>, QueryContainer>>();
if (auditLogId.HasValue) if (auditLogId.HasValue)
{ {
@ -322,6 +341,10 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
{ {
querys.Add(entity => entity.Wildcard(q => q.Field(GetField(nameof(EntityChange.EntityTypeFullName))).Value($"*{entityTypeFullName}*"))); querys.Add(entity => entity.Wildcard(q => q.Field(GetField(nameof(EntityChange.EntityTypeFullName))).Value($"*{entityTypeFullName}*")));
} }
if (entityChangeId.HasValue)
{
querys.Add(entity => entity.Term(q => q.Field(GetField(nameof(EntityChange.Id))).Value(entityChangeId)));
}
return querys; return querys;
} }

4
aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/AuditLogManager.cs

@ -15,7 +15,7 @@ using Volo.Abp.Uow;
namespace LINGYUN.Abp.AuditLogging.EntityFrameworkCore namespace LINGYUN.Abp.AuditLogging.EntityFrameworkCore
{ {
[Dependency(ReplaceServices = true)] [Dependency(ReplaceServices = true)]
public class AuditLogManager : IAuditLogManager, ISingletonDependency public class AuditLogManager : IAuditLogManager, ITransientDependency
{ {
protected IObjectMapper ObjectMapper { get; } protected IObjectMapper ObjectMapper { get; }
protected IAuditLogRepository AuditLogRepository { get; } protected IAuditLogRepository AuditLogRepository { get; }
@ -139,6 +139,8 @@ namespace LINGYUN.Abp.AuditLogging.EntityFrameworkCore
} }
} }
// 避免循环记录
[DisableAuditing]
public async virtual Task<string> SaveAsync( public async virtual Task<string> SaveAsync(
AuditLogInfo auditInfo, AuditLogInfo auditInfo,
CancellationToken cancellationToken = default(CancellationToken)) CancellationToken cancellationToken = default(CancellationToken))

115
aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/EntityChangeStore.cs

@ -0,0 +1,115 @@
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Auditing;
using Volo.Abp.AuditLogging;
using Volo.Abp.DependencyInjection;
using Volo.Abp.ObjectMapping;
namespace LINGYUN.Abp.AuditLogging.EntityFrameworkCore;
[Dependency(ReplaceServices = true)]
public class EntityChangeStore : IEntityChangeStore, ITransientDependency
{
protected IObjectMapper ObjectMapper { get; }
protected IAuditLogRepository AuditLogRepository { get; }
public ILogger<EntityChangeStore> Logger { protected get; set; }
public EntityChangeStore(
IObjectMapper objectMapper,
IAuditLogRepository auditLogRepository)
{
ObjectMapper = objectMapper;
AuditLogRepository = auditLogRepository;
Logger = NullLogger<EntityChangeStore>.Instance;
}
public async virtual Task<EntityChange> GetAsync(
Guid entityChangeId,
CancellationToken cancellationToken = default)
{
var entityChange = await AuditLogRepository.GetEntityChange(
entityChangeId,
cancellationToken);
return ObjectMapper.Map<Volo.Abp.AuditLogging.EntityChange, EntityChange>(entityChange);
}
public async virtual Task<long> GetCountAsync(
Guid? auditLogId = null,
DateTime? startTime = null,
DateTime? endTime = null,
EntityChangeType? changeType = null,
string entityId = null,
string entityTypeFullName = null,
CancellationToken cancellationToken = default)
{
return await AuditLogRepository.GetEntityChangeCountAsync(
auditLogId,
startTime,
endTime,
changeType,
entityId,
entityTypeFullName,
cancellationToken);
}
public async virtual Task<List<EntityChange>> GetListAsync(
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)
{
var entityChanges = await AuditLogRepository.GetEntityChangeListAsync(
sorting,
maxResultCount,
skipCount,
auditLogId,
startTime,
endTime,
changeType,
entityId,
entityTypeFullName,
includeDetails,
cancellationToken);
return ObjectMapper.Map<List<Volo.Abp.AuditLogging.EntityChange>, List<EntityChange>>(entityChanges);
}
public async virtual Task<EntityChangeWithUsername> GetWithUsernameAsync(
Guid entityChangeId,
CancellationToken cancellationToken = default)
{
var entityChangeWithUsername = await AuditLogRepository.GetEntityChangeWithUsernameAsync(
entityChangeId,
cancellationToken);
return ObjectMapper.Map<Volo.Abp.AuditLogging.EntityChangeWithUsername, EntityChangeWithUsername>(entityChangeWithUsername);
}
public async virtual Task<List<EntityChangeWithUsername>> GetWithUsernameAsync(
string entityId,
string entityTypeFullName,
CancellationToken cancellationToken = default)
{
var entityChangesWithUsername = await AuditLogRepository.GetEntityChangesWithUsernameAsync(
entityId,
entityTypeFullName,
cancellationToken);
return ObjectMapper.Map<List<Volo.Abp.AuditLogging.EntityChangeWithUsername>, List<EntityChangeWithUsername>>(entityChangesWithUsername);
}
}

2
aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/SecurityLogManager.cs

@ -14,7 +14,7 @@ using Volo.Abp.Uow;
namespace LINGYUN.Abp.AuditLogging.EntityFrameworkCore namespace LINGYUN.Abp.AuditLogging.EntityFrameworkCore
{ {
[Dependency(ReplaceServices = true)] [Dependency(ReplaceServices = true)]
public class SecurityLogManager : ISecurityLogManager, ISingletonDependency public class SecurityLogManager : ISecurityLogManager, ITransientDependency
{ {
public ILogger<SecurityLogManager> Logger { get; set; } public ILogger<SecurityLogManager> Logger { get; set; }

4
aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/EntityChange.cs

@ -40,11 +40,13 @@ namespace LINGYUN.Abp.AuditLogging
IGuidGenerator guidGenerator, IGuidGenerator guidGenerator,
Guid auditLogId, Guid auditLogId,
EntityChangeInfo entityChangeInfo, EntityChangeInfo entityChangeInfo,
Guid? tenantId = null) Guid? tenantId = null,
Guid? entityTenantId = null)
{ {
Id = guidGenerator.Create(); Id = guidGenerator.Create();
AuditLogId = auditLogId; AuditLogId = auditLogId;
TenantId = tenantId; TenantId = tenantId;
EntityTenantId = entityTenantId;
ChangeTime = entityChangeInfo.ChangeTime; ChangeTime = entityChangeInfo.ChangeTime;
ChangeType = entityChangeInfo.ChangeType; ChangeType = entityChangeInfo.ChangeType;
EntityId = entityChangeInfo.EntityId; EntityId = entityChangeInfo.EntityId;

3
aspnet-core/modules/tui-juhe/LINGYUN.Abp.TuiJuhe.SettingManagement/LINGYUN.Abp.TuiJuhe.SettingManagement.csproj

@ -13,8 +13,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Remove="LINGYUN\Abp\TuiJuhe\SettingManagement\Localization\Resources\en.json" /> <None Remove="LINGYUN\Abp\TuiJuhe\SettingManagement\Localization\Resources\*.json" />
<None Remove="LINGYUN\Abp\TuiJuhe\SettingManagement\Localization\Resources\zh-Hans.json" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

6
aspnet-core/modules/tui-juhe/LINGYUN.Abp.TuiJuhe.SettingManagement/LINGYUN/Abp/TuiJuhe/SettingManagement/AbpTuiJuheSettingManagementModule.cs

@ -11,13 +11,13 @@ namespace LINGYUN.Abp.TuiJuhe.SettingManagement
[DependsOn( [DependsOn(
typeof(AbpTuiJuheModule), typeof(AbpTuiJuheModule),
typeof(AbpAspNetCoreMvcModule))] typeof(AbpAspNetCoreMvcModule))]
public class AbpWxPusherSettingManagementModule : AbpModule public class AbpTuiJuheSettingManagementModule : AbpModule
{ {
public override void PreConfigureServices(ServiceConfigurationContext context) public override void PreConfigureServices(ServiceConfigurationContext context)
{ {
PreConfigure<IMvcBuilder>(mvcBuilder => PreConfigure<IMvcBuilder>(mvcBuilder =>
{ {
mvcBuilder.AddApplicationPartIfNotExists(typeof(AbpWxPusherSettingManagementModule).Assembly); mvcBuilder.AddApplicationPartIfNotExists(typeof(AbpTuiJuheSettingManagementModule).Assembly);
}); });
} }
@ -25,7 +25,7 @@ namespace LINGYUN.Abp.TuiJuhe.SettingManagement
{ {
Configure<AbpVirtualFileSystemOptions>(options => Configure<AbpVirtualFileSystemOptions>(options =>
{ {
options.FileSets.AddEmbedded<AbpWxPusherSettingManagementModule>(); options.FileSets.AddEmbedded<AbpTuiJuheSettingManagementModule>();
}); });
Configure<AbpLocalizationOptions>(options => Configure<AbpLocalizationOptions>(options =>

Loading…
Cancel
Save