refactor: ♻️ 框架代码同步 (#181)

Co-authored-by: tk <fiyne1a@dingtalk.com>
This commit is contained in:
2024-10-30 14:40:52 +08:00
committed by GitHub
parent f0c3ec109f
commit bac4a39544
54 changed files with 256 additions and 111 deletions

View File

@ -74,7 +74,7 @@ global using NetAdmin.Domain.DbMaps.Sys;
global using CsvIgnore = CsvHelper.Configuration.Attributes.IgnoreAttribute;
global using CsvIndex = CsvHelper.Configuration.Attributes.IndexAttribute;
global using CsvName = CsvHelper.Configuration.Attributes.NameAttribute;
global using DynamicFilterInfo = NetAdmin.Domain.Dto.Dependency.DynamicFilterInfo;
global using DynamicFilterInfo = NetAdmin.Domain.Dto.DynamicFilterInfo;
global using DynamicFilterOperators = NetAdmin.Domain.Enums.DynamicFilterOperators;
global using SqlIndex = FreeSql.DataAnnotations.IndexAttribute;
#endif

View File

@ -22,12 +22,7 @@
*/
using NetAdmin.AdmServer.Host;
using NetAdmin.AdmServer.Host.Extensions;
using NetAdmin.Host.Extensions;
using NetAdmin.Host.Middlewares;
using NetAdmin.SysComponent.Host.Extensions;
using NetAdmin.SysComponent.Host.Middlewares;
using Spectre.Console.Cli;
using ValidationResult = Spectre.Console.ValidationResult;
NetAdmin.Host.Startup.Entry<Startup>(args);
@ -51,6 +46,8 @@ namespace NetAdmin.AdmServer.Host
public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifeTime)
#pragma warning restore S2325
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
_ = app //
.UseMiddleware<SafetyShopHostMiddleware>() // 安全停机中间件
.EnableBuffering() // 启用请求体缓冲,允许多次读取请求体

View File

@ -1,4 +1,4 @@
namespace NetAdmin.Host.Extensions;
namespace NetAdmin.Application.Extensions;
/// <summary>
/// 工作单元管理器扩展方法

View File

@ -32,7 +32,7 @@ public record Sys_DicContent : VersionEntity, IFieldEnabled, IFieldSummary
/// <summary>
/// 键名称
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
public virtual string Key { get; init; }

View File

@ -0,0 +1,17 @@
using NetAdmin.Domain.Enums;
namespace NetAdmin.Domain.Dto;
/// <summary>
/// 动态过滤条件生成器
/// </summary>
public sealed record DfBuilder
{
/// <summary>
/// 构建生成器
/// </summary>
public static DynamicFilterInfo New(DynamicFilterLogics logic)
{
return new DynamicFilterInfo { Logic = logic, Filters = [] };
}
}

View File

@ -1,6 +1,6 @@
using NetAdmin.Domain.Enums;
namespace NetAdmin.Domain.Dto.Dependency;
namespace NetAdmin.Domain.Dto;
/// <summary>
/// 动态过滤条件
@ -42,6 +42,43 @@ public sealed record DynamicFilterInfo : DataAbstraction
return ret;
}
/// <summary>
/// 添加子过滤条件
/// </summary>
public DynamicFilterInfo Add(DynamicFilterInfo df)
{
if (Filters == null) {
return this with { Filters = [df] };
}
Filters.Add(df);
return this;
}
/// <summary>
/// 添加过滤条件
/// </summary>
public DynamicFilterInfo Add(string field, DynamicFilterOperators opt, object val)
{
return Add(new DynamicFilterInfo { Field = field, Operator = opt, Value = val });
}
/// <summary>
/// 添加过滤条件
/// </summary>
public DynamicFilterInfo AddIf(bool condition, string field, DynamicFilterOperators opt, object val)
{
return !condition ? this : Add(field, opt, val);
}
/// <summary>
/// 添加过滤条件
/// </summary>
public DynamicFilterInfo AddIf(bool condition, DynamicFilterInfo df)
{
return !condition ? this : Add(df);
}
private static void ParseDateExp(FreeSql.Internal.Model.DynamicFilterInfo d)
{
var values = ((JsonElement)d.Value).Deserialize<string[]>();

View File

@ -0,0 +1,40 @@
using NetAdmin.Domain.Dto.Sys.User;
namespace NetAdmin.Domain.Events.Sys;
/// <summary>
/// 用户被创建事件
/// </summary>
public sealed record UserCreatedEvent : DataAbstraction, IEventSourceGeneric<UserInfoRsp>
{
/// <summary>
/// Initializes a new instance of the <see cref="UserCreatedEvent" /> class.
/// </summary>
public UserCreatedEvent(UserInfoRsp data, DateTime createdTime = default, bool isConsumOnce = false, object payload = default
, CancellationToken cancellationToken = default)
{
Data = data;
CancellationToken = cancellationToken;
CreatedTime = createdTime;
IsConsumOnce = isConsumOnce;
Payload = payload;
}
/// <inheritdoc />
public CancellationToken CancellationToken { get; }
/// <inheritdoc />
public DateTime CreatedTime { get; }
/// <inheritdoc />
public UserInfoRsp Data { get; }
/// <inheritdoc />
public string EventId => nameof(UserCreatedEvent);
/// <inheritdoc />
public bool IsConsumOnce { get; }
/// <inheritdoc />
public object Payload { get; }
}

View File

@ -1,5 +1,4 @@
using NetAdmin.Host.Attributes;
using NetAdmin.Host.Extensions;
namespace NetAdmin.Host.Filters;

View File

@ -1,8 +1,3 @@
using NetAdmin.Domain.Contexts;
using NetAdmin.Domain.Dto.Sys.RequestLog;
using NetAdmin.Domain.Dto.Sys.RequestLogDetail;
using NetAdmin.Domain.Events.Sys;
using Yitter.IdGenerator;
using HttpMethods = NetAdmin.Domain.Enums.HttpMethods;
namespace NetAdmin.Host.Utils;
@ -44,6 +39,7 @@ public sealed class RequestLogger(ILogger<RequestLogger> logger, IEventPublisher
, ResponseContentType = context.Response.ContentType
, ResponseHeaders = context.Response.Headers.Json()
, ServerIp = context.GetLocalIpAddressToIPv4()?.IpV4ToInt32()
, CreatedTime = DateTime.Now
}
, Duration = (int)duration
, HttpMethod = Enum.Parse<HttpMethods>(context.Request.Method, true)
@ -54,6 +50,7 @@ public sealed class RequestLogger(ILogger<RequestLogger> logger, IEventPublisher
, OwnerDeptId = associatedUser?.DeptId
, Id = id
, TraceId = context.GetTraceId()
, CreatedTime = DateTime.Now
};
// ReSharper disable once InvertIf

View File

@ -77,7 +77,6 @@ public static class Chars
public const string FLG_PATH_API_RPOBE = "api/probe";
public const string FLG_PATH_API_SYS_USER_LOGIN_BY_PWD = "api/sys/user/login.by.pwd";
public const string FLG_PATH_PREFIX_HEALTH_CHECK = "probe/health.check";
public const string FLG_PATH_WEBSOCKET_PREFIX = "ws";
public const string FLG_RANDOM_UNAME_PWD = "VcXlp7WY";
public const string FLG_REDIS_INSTANCE_DATA_CACHE = "DataCache";

View File

@ -28,7 +28,22 @@ public static class HttpResponseMessageExtensions
private static async Task<string> BuildJsonAsync( //
this HttpResponseMessage me, Func<string, string> bodyHandle = null)
{
var body = me?.Content is null ? null : await me.Content!.ReadAsStringAsync().ConfigureAwait(false);
var body = string.Empty;
try {
body = me?.Content is null ? null : await me.Content!.ReadAsStringAsync().ConfigureAwait(false);
}
catch (Exception ex) when (ex.Message.Contains("The character set provided in ContentType is invalid") &&
ex.InnerException?.Message.Contains("is not a supported encoding name") == true) {
#pragma warning disable S2589
var sr = me?.Content is null ? null : await me.Content!.ReadAsStreamAsync().ConfigureAwait(false);
if (sr != null) {
#pragma warning restore S2589
await using var ms = new MemoryStream();
await sr.CopyToAsync(ms).ConfigureAwait(false);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
return new { Header = me?.ToString(), RequestHeader = me?.RequestMessage?.Headers, Body = bodyHandle is null ? body : bodyHandle(body) }
.Json();
}

View File

@ -16,6 +16,7 @@
<PackageReference Include="Minio" Version="6.0.3"/>
<PackageReference Include="NSExt" Version="2.2.0"/>
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="2.1.4"/>
<PackageReference Include="System.Drawing.Common" Version="9.0.0-rc.2.24474.1"/>
</ItemGroup>
<ItemGroup>
<None Update="*.json">

View File

@ -1,9 +1,6 @@
using System.Collections.Concurrent;
using NetAdmin.Application.Services;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.Cache;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
using StackExchange.Redis;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@ -82,6 +79,7 @@ public sealed class CacheService(IConnectionMultiplexer connectionMultiplexer) /
/// <inheritdoc />
public async Task<GetEntryRsp> GetEntryAsync(GetEntriesReq req)
{
req.ThrowIfInvalid();
var database = connectionMultiplexer.GetDatabase(_redisInstance.Database);
var ret = new GetEntryRsp {

View File

@ -1,7 +1,5 @@
using NetAdmin.Application.Repositories;
using NetAdmin.Application.Services;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.Config;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@ -53,6 +51,7 @@ public sealed class ConfigService(BasicRepository<Sys_Config, long> rpo) //
/// <inheritdoc />
public async Task<QueryConfigRsp> EditAsync(EditConfigReq req)
{
req.ThrowIfInvalid();
#if DBTYPE_SQLSERVER
return (await UpdateReturnListAsync(req, null).ConfigureAwait(false)).FirstOrDefault()?.Adapt<QueryConfigRsp>();
#else

View File

@ -1,7 +1,5 @@
using NetAdmin.Application.Repositories;
using NetAdmin.Application.Services;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.Dept;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@ -71,6 +69,7 @@ public sealed class DeptService(BasicRepository<Sys_Dept, long> rpo) //
/// <inheritdoc />
public async Task<QueryDeptRsp> EditAsync(EditDeptReq req)
{
req.ThrowIfInvalid();
#if DBTYPE_SQLSERVER
return (await UpdateReturnListAsync(req, null).ConfigureAwait(false)).FirstOrDefault()?.Adapt<QueryDeptRsp>();
#else

View File

@ -1,7 +1,5 @@
using NetAdmin.Application.Repositories;
using NetAdmin.Application.Services;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.Dic.Catalog;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@ -90,6 +88,7 @@ public sealed class DicCatalogService(BasicRepository<Sys_DicCatalog, long> rpo)
/// <inheritdoc />
public Task<IActionResult> ExportAsync(QueryReq<QueryDicCatalogReq> req)
{
req.ThrowIfInvalid();
throw new NotImplementedException();
}

View File

@ -1,7 +1,5 @@
using NetAdmin.Application.Repositories;
using NetAdmin.Application.Services;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.Menu;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@ -55,6 +53,7 @@ public sealed class MenuService(BasicRepository<Sys_Menu, long> rpo, IUserServic
/// <inheritdoc />
public async Task<QueryMenuRsp> EditAsync(EditMenuReq req)
{
req.ThrowIfInvalid();
#if DBTYPE_SQLSERVER
return (await UpdateReturnListAsync(req, null).ConfigureAwait(false)).FirstOrDefault()?.Adapt<QueryMenuRsp>();
#else
@ -76,6 +75,7 @@ public sealed class MenuService(BasicRepository<Sys_Menu, long> rpo, IUserServic
/// <inheritdoc />
public Task<IActionResult> ExportAsync(QueryReq<QueryMenuReq> req)
{
req.ThrowIfInvalid();
throw new NotImplementedException();
}

View File

@ -1,7 +1,5 @@
using NetAdmin.Application.Repositories;
using NetAdmin.Application.Services;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.RequestLogDetail;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@ -64,6 +62,7 @@ public sealed class RequestLogDetailService(BasicRepository<Sys_RequestLogDetail
/// <inheritdoc />
public Task<IActionResult> ExportAsync(QueryReq<QueryRequestLogDetailReq> req)
{
req.ThrowIfInvalid();
throw new NotImplementedException();
}

View File

@ -1,7 +1,5 @@
using NetAdmin.Application.Repositories;
using NetAdmin.Application.Services;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.SiteMsgDept;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@ -64,6 +62,7 @@ public sealed class SiteMsgDeptService(BasicRepository<Sys_SiteMsgDept, long> rp
/// <inheritdoc />
public Task<IActionResult> ExportAsync(QueryReq<QuerySiteMsgDeptReq> req)
{
req.ThrowIfInvalid();
throw new NotImplementedException();
}

View File

@ -1,7 +1,5 @@
using NetAdmin.Application.Repositories;
using NetAdmin.Application.Services;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.SiteMsgFlag;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@ -64,6 +62,7 @@ public sealed class SiteMsgFlagService(BasicRepository<Sys_SiteMsgFlag, long> rp
/// <inheritdoc />
public Task<IActionResult> ExportAsync(QueryReq<QuerySiteMsgFlagReq> req)
{
req.ThrowIfInvalid();
throw new NotImplementedException();
}

View File

@ -1,7 +1,5 @@
using NetAdmin.Application.Repositories;
using NetAdmin.Application.Services;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.SiteMsgRole;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@ -64,6 +62,7 @@ public sealed class SiteMsgRoleService(BasicRepository<Sys_SiteMsgRole, long> rp
/// <inheritdoc />
public Task<IActionResult> ExportAsync(QueryReq<QuerySiteMsgRoleReq> req)
{
req.ThrowIfInvalid();
throw new NotImplementedException();
}

View File

@ -1,7 +1,5 @@
using NetAdmin.Application.Repositories;
using NetAdmin.Application.Services;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.SiteMsgUser;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@ -64,6 +62,7 @@ public sealed class SiteMsgUserService(BasicRepository<Sys_SiteMsgUser, long> rp
/// <inheritdoc />
public Task<IActionResult> ExportAsync(QueryReq<QuerySiteMsgUserReq> req)
{
req.ThrowIfInvalid();
throw new NotImplementedException();
}

View File

@ -1,5 +1,4 @@
using NetAdmin.Application.Services;
using NetAdmin.Domain.Dto.Sys.Tool;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@ -17,6 +16,7 @@ public sealed class ToolsService : ServiceBase<IToolsService>, IToolsService
/// <inheritdoc />
public Task<object[][]> ExecuteSqlAsync(ExecuteSqlReq req)
{
req.ThrowIfInvalid();
return App.GetService<IFreeSql>().Ado.CommandFluent(req.Sql).CommandTimeout(req.TimeoutSecs).ExecuteArrayAsync();
}

View File

@ -1,9 +1,5 @@
using NetAdmin.Application.Repositories;
using NetAdmin.Application.Services;
using NetAdmin.Domain.Contexts;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.Dic.Content;
using NetAdmin.Domain.Dto.Sys.UserProfile;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@ -73,6 +69,7 @@ public sealed class UserProfileService(BasicRepository<Sys_UserProfile, long> rp
/// <inheritdoc />
public Task<int> EditAsync(EditUserProfileReq req)
{
req.ThrowIfInvalid();
return UpdateAsync(req.Adapt<Sys_UserProfile>(), null);
}
@ -90,6 +87,7 @@ public sealed class UserProfileService(BasicRepository<Sys_UserProfile, long> rp
/// <inheritdoc />
public Task<IActionResult> ExportAsync(QueryReq<QueryUserProfileReq> req)
{
req.ThrowIfInvalid();
throw new NotImplementedException();
}

View File

@ -1,11 +1,5 @@
using NetAdmin.Application.Repositories;
using NetAdmin.Application.Services;
using NetAdmin.Domain.Contexts;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.User;
using NetAdmin.Domain.Dto.Sys.UserProfile;
using NetAdmin.Domain.Dto.Sys.VerifyCode;
using NetAdmin.Domain.Events.Sys;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@ -100,8 +94,12 @@ public sealed class UserService(
, AppConfig = appConfig
})
.ConfigureAwait(false);
var ret = await QueryAsync(new QueryReq<QueryUserReq> { Filter = new QueryUserReq { Id = dbUser.Id } }).ConfigureAwait(false);
return ret.First();
var userList = await QueryAsync(new QueryReq<QueryUserReq> { Filter = new QueryUserReq { Id = dbUser.Id } }).ConfigureAwait(false);
// 发布用户创建事件
var ret = userList.First();
await eventPublisher.PublishAsync(new UserCreatedEvent(ret.Adapt<UserInfoRsp>())).ConfigureAwait(false);
return ret;
}
/// <inheritdoc />

View File

@ -1,9 +1,5 @@
using NetAdmin.Application.Repositories;
using NetAdmin.Application.Services;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.VerifyCode;
using NetAdmin.Domain.Enums.Sys;
using NetAdmin.Domain.Events.Sys;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@ -74,6 +70,7 @@ public sealed class VerifyCodeService(BasicRepository<Sys_VerifyCode, long> rpo,
/// <inheritdoc />
public Task<IActionResult> ExportAsync(QueryReq<QueryVerifyCodeReq> req)
{
req.ThrowIfInvalid();
throw new NotImplementedException();
}
@ -144,6 +141,7 @@ public sealed class VerifyCodeService(BasicRepository<Sys_VerifyCode, long> rpo,
/// <inheritdoc />
public Task<int> SetVerifyCodeStatusAsync(SetVerifyCodeStatusReq req)
{
req.ThrowIfInvalid();
return UpdateAsync(req, [nameof(req.Status)]);
}

View File

@ -1,6 +1,4 @@
using NetAdmin.Cache;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.Dic.Content;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
using NetAdmin.SysComponent.Cache.Sys.Dependency;
@ -69,8 +67,7 @@ public sealed class DicContentCache(IDistributedCache cache, IDicContentService
{
#if !DEBUG
return GetOrCreateAsync( //
GetCacheKey(catalogCode), () => Service.QueryByCatalogCodeAsync(catalogCode)
, TimeSpan.FromSeconds(Numbers.SECS_CACHE_DIC_CATALOG_CODE));
GetCacheKey(catalogCode), () => Service.QueryByCatalogCodeAsync(catalogCode), TimeSpan.FromSeconds(Numbers.SECS_CACHE_DIC_CATALOG_CODE));
#else
return Service.QueryByCatalogCodeAsync(catalogCode);
#endif

View File

@ -1,13 +1,5 @@
using FreeSql.Internal;
using Furion.RemoteRequest;
using Furion.RemoteRequest.Extensions;
using Furion.Schedule;
using NetAdmin.Domain.Dto.Sys.Job;
using NetAdmin.Domain.Dto.Sys.JobRecord;
using NetAdmin.Host.BackgroundRunning;
using NetAdmin.Host.Extensions;
using NetAdmin.Host.Middlewares;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Host.Jobs;