diff --git a/.editorconfig b/.editorconfig
index b4329669..5d072eb1 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,56 +1,58 @@
+# 此文件为 EditorConfig 配置文件,用于设置跨编辑器的代码格式化规则。
+# root = true 表示此文件是根配置文件。
root = true
[*]
-charset = utf-8
-end_of_line = lf
-ij_xml_attribute_wrap = off
-ij_xml_text_wrap = off
-indent_size = 4
-indent_style = space
-insert_final_newline = false
-trim_trailing_whitespace = true
+charset = utf-8 # 文件字符集为 UTF-8
+end_of_line = lf # 行结束符为 LF
+ij_xml_attribute_wrap = off # IntelliJ IDEA 中 XML 属性不换行
+ij_xml_text_wrap = off # IntelliJ IDEA 中 XML 文本不换行
+indent_size = 4 # 缩进大小为 4 个空格
+indent_style = space # 使用空格进行缩进
+insert_final_newline = false # 不在文件末尾插入空行
+trim_trailing_whitespace = true # 删除行尾的空格
[{*.json,*.yml}]
-indent_size = 2
+indent_size = 2 # 对于 JSON 和 YAML 文件,缩进大小为 2 个空格
[*.cs]
-dotnet_analyzer_diagnostic.severity = warning
+dotnet_analyzer_diagnostic.severity = warning # 设置 C# 文件中所有 dotnet_analyzer_diagnostic 的严重性级别为 warning
# ReSharper properties
-resharper_align_linq_query = true
-resharper_align_multiline_argument = true
-resharper_align_multiline_array_and_object_initializer = true
-resharper_align_multiline_binary_patterns = true
-resharper_align_multiline_calls_chain = true
-resharper_align_multiline_extends_list = true
-resharper_align_multiline_parameter = true
-resharper_align_multiline_property_pattern = true
-resharper_align_multiline_switch_expression = true
-resharper_align_multiple_declaration = true
-resharper_align_multline_type_parameter_constrains = true
-resharper_align_multline_type_parameter_list = true
-resharper_align_tuple_components = true
-resharper_allow_comment_after_lbrace = true
-resharper_blank_lines_before_single_line_comment = 1
-resharper_csharp_empty_block_style = together_same_line
-resharper_csharp_outdent_commas = true
-resharper_csharp_place_type_constraints_on_same_line = false
-resharper_csharp_stick_comment = false
-resharper_csharp_wrap_before_comma = true
-resharper_indent_nested_for_stmt = true
-resharper_indent_nested_foreach_stmt = true
-resharper_indent_nested_while_stmt = true
-resharper_indent_preprocessor_if = usual_indent
-resharper_indent_preprocessor_other = usual_indent
-resharper_int_align = true
-resharper_keep_existing_arrangement = false
-resharper_place_linq_into_on_new_line = false
-resharper_place_simple_embedded_statement_on_same_line = false
-resharper_place_simple_switch_expression_on_single_line = true
-resharper_wrap_before_eq = true
-resharper_wrap_chained_method_calls = chop_if_long
-resharper_wrap_switch_expression = chop_if_long
+resharper_align_linq_query = true # 启用对LINQ查询的对齐
+resharper_align_multiline_argument = true # 启用多行参数的对齐
+resharper_align_multiline_array_and_object_initializer = true # 启用多行数组和对象初始化器的对齐
+resharper_align_multiline_binary_patterns = true # 启用多行二元模式的对齐
+resharper_align_multiline_calls_chain = true # 启用多行调用链的对齐
+resharper_align_multiline_extends_list = true # 启用多行扩展列表的对齐
+resharper_align_multiline_parameter = true # 启用多行参数的对齐
+resharper_align_multiline_property_pattern = true # 启用多行属性模式的对齐
+resharper_align_multiline_switch_expression = true # 启用多行切换表达式的对齐
+resharper_align_multiple_declaration = true # 启用多个声明的对齐
+resharper_align_multline_type_parameter_constrains = true # 启用多行类型参数约束的对齐
+resharper_align_multline_type_parameter_list = true # 启用多行类型参数列表的对齐
+resharper_align_tuple_components = true # 启用元组组件的对齐
+resharper_allow_comment_after_lbrace = true # 允许在大括号前添加注释
+resharper_blank_lines_before_single_line_comment = 1 # 在单行注释前添加空行
+resharper_csharp_empty_block_style = together_same_line # 设置空块的样式为“在一起,在同一行”
+resharper_csharp_outdent_commas = true # 是否将逗号后的代码退缩
+resharper_csharp_place_type_constraints_on_same_line = false # 在类型约束上是否保持在同一行
+resharper_csharp_stick_comment = false # 是否将注释粘贴在代码行的末尾
+resharper_csharp_wrap_before_comma = true # 在逗号前是否添加换行
+resharper_indent_nested_for_stmt = true # 是否对嵌套的for语句进行缩进
+resharper_indent_nested_foreach_stmt = true # 是否对嵌套的foreach语句进行缩进
+resharper_indent_nested_while_stmt = true # 是否对嵌套的while语句进行缩进
+resharper_indent_preprocessor_if = usual_indent # 设置预处理器指令`if`的缩进方式
+resharper_indent_preprocessor_other = usual_indent # 设置其他预处理器指令的缩进方式
+resharper_int_align = true # 启用整数对齐
+resharper_keep_existing_arrangement = false # 在重新排列时是否保留现有的布局
+resharper_place_linq_into_on_new_line = false # 是否将LINQ表达式放在新行
+resharper_place_simple_embedded_statement_on_same_line = false # 是否将简单的嵌入式语句放在同一行
+resharper_place_simple_switch_expression_on_single_line = true # 是否将简单的切换表达式放在单行
+resharper_wrap_before_eq = true # 在等号前是否添加换行
+resharper_wrap_chained_method_calls = chop_if_long # 是否拆分链式方法调用
+resharper_wrap_switch_expression = chop_if_long # 是否拆分切换表达式
# Microsoft .NET properties
-csharp_indent_braces = false
-csharp_new_line_before_open_brace = local_functions, methods, types
\ No newline at end of file
+csharp_indent_braces = false # 设置为false表示花括号不跟随代码行缩进
+csharp_new_line_before_open_brace = local_functions, methods, types # 这里设置为local_functions, methods, types,表示在局部函数、方法和类型定义的开放花括号前应换行
\ No newline at end of file
diff --git a/Directory.Build.props b/Directory.Build.props
index 8909a44b..19a99788 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -25,7 +25,7 @@
$(AssemblyName)
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Dockerfile b/Dockerfile
index 7c41d763..bb674d9b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM mcr.microsoft.com/dotnet/aspnet:9.0.0-preview.1 AS base
+FROM mcr.microsoft.com/dotnet/aspnet:9.0.0-preview.3 AS base
WORKDIR /app
EXPOSE 8080
RUN apt update
diff --git a/NetAdmin.sln.DotSettings b/NetAdmin.sln.DotSettings
index e6e49ef0..7463056f 100644
--- a/NetAdmin.sln.DotSettings
+++ b/NetAdmin.sln.DotSettings
@@ -5,6 +5,7 @@
True
True
True
+ True
True
True
True
@@ -19,10 +20,15 @@
True
True
True
+ True
+ True
True
True
True
True
+ True
+ True
+ True
True
True
True
@@ -71,12 +77,14 @@
Required
Required
NEVER
- <Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" />
- <Policy Inspect="True" Prefix="_" Suffix="" Style="AA_BB" />
- <Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" />
-
+ NEVER
+ NEVER
+ NEVER
+ <Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static readonly fields (private)"><ElementKinds><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /></Policy>
+ <Policy><Descriptor Staticness="Any" AccessRightKinds="Private" Description="Constant fields (private)"><ElementKinds><Kind Name="CONSTANT_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="_" Suffix="" Style="AA_BB" /></Policy>
+ <Policy><Descriptor Staticness="Any" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Constant fields (not private)"><ElementKinds><Kind Name="CONSTANT_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /></Policy>
+ <Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Types and namespaces"><ElementKinds><Kind Name="NAMESPACE" /><Kind Name="CLASS" /><Kind Name="STRUCT" /><Kind Name="ENUM" /><Kind Name="DELEGATE" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /></Policy>
+ <Policy><Descriptor Staticness="Static" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Static readonly fields (not private)"><ElementKinds><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy>
<?xml version="1.0" encoding="utf-16"?>
<Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns">
diff --git a/assets/res/Enums.ln b/assets/res/Enums.ln
index 4d729f2b..c1fc3a55 100644
--- a/assets/res/Enums.ln
+++ b/assets/res/Enums.ln
@@ -84,5 +84,6 @@
閲嶈瀵嗙爜
閾炬帴
閿欒
+闅忔満鎺掑簭
椤哄簭鎺掑簭
楂樹腑
\ No newline at end of file
diff --git a/package.json b/package.json
index 33d0be0f..0e5d456a 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"version": "1.0.0",
"devDependencies": {
- "cz-git": "^1.8.0",
+ "cz-git": "^1.9.1",
"commitizen": "^4.3.0",
"prettier": "^3.2.5",
"standard-version": "^9.5.0"
diff --git a/scripts/2.git.release.ps1 b/scripts/2.git.release.ps1
index d437a134..b354d715 100644
--- a/scripts/2.git.release.ps1
+++ b/scripts/2.git.release.ps1
@@ -10,6 +10,7 @@ while ($null -eq $types[$prefix])
$prefix = Read-Host "璇烽夋嫨鐗堟湰绫诲瀷`n" $( & { param($i) $i | ForEach-Object { "$_ : $( $types[$_][0] )锛$( $types[$_][1] )锛塦n" } } $types.Keys | Sort-Object )
}
git checkout main
+git pull
git branch -D release
git checkout -b release
./node_modules/.bin/standard-version -r $types[$prefix][0]
diff --git a/scripts/switcher.freesql.json b/scripts/switcher.freesql.json
index 1218c50e..57304cfb 100644
--- a/scripts/switcher.freesql.json
+++ b/scripts/switcher.freesql.json
@@ -10,11 +10,11 @@
"packages": [
{
"packageName": "FreeSql.NS",
- "version": "3.2.802-preview20231010-ns1"
+ "version": "3.2.821-ns1"
},
{
"packageName": "FreeSql.DbContext.NS",
- "version": "3.2.802-preview20231010-ns1"
+ "version": "3.2.821-ns1"
}
]
}
diff --git a/scripts/switcher.furion.json b/scripts/switcher.furion.json
index 5fefbbf6..b550ac82 100644
--- a/scripts/switcher.furion.json
+++ b/scripts/switcher.furion.json
@@ -9,7 +9,7 @@
"packages": [
{
"packageName": "Furion.Pure.NS",
- "version": "4.9.1.31-ns2"
+ "version": "4.9.2.19-ns3"
}
]
}
diff --git a/src/backend/NetAdmin.Application/Modules/ICrudModule.cs b/src/backend/NetAdmin.Application/Modules/ICrudModule.cs
index f093de83..4879b347 100644
--- a/src/backend/NetAdmin.Application/Modules/ICrudModule.cs
+++ b/src/backend/NetAdmin.Application/Modules/ICrudModule.cs
@@ -27,6 +27,11 @@ public interface ICrudModule
Task BulkDeleteAsync(BulkReq req);
+ ///
+ /// 瀹炰綋璁℃暟
+ ///
+ Task CountAsync(QueryReq req);
+
///
/// 鍒涘缓瀹炰綋
///
diff --git a/src/backend/NetAdmin.Application/Repositories/DefaultRepository.cs b/src/backend/NetAdmin.Application/Repositories/DefaultRepository.cs
index 5448e130..ed65ea05 100644
--- a/src/backend/NetAdmin.Application/Repositories/DefaultRepository.cs
+++ b/src/backend/NetAdmin.Application/Repositories/DefaultRepository.cs
@@ -6,10 +6,7 @@ namespace NetAdmin.Application.Repositories;
///
/// 榛樿浠撳偍
///
-public sealed class DefaultRepository(
- IFreeSql fSql //
- , UnitOfWorkManager uowManger //
- , ContextUserToken userToken) //
+public sealed class DefaultRepository(IFreeSql fSql, UnitOfWorkManager uowManger, ContextUserToken userToken)
: DefaultRepository(fSql, uowManger)
where TEntity : EntityBase
{
diff --git a/src/backend/NetAdmin.BizServer.Host/Extensions/ServiceCollectionExtensions.cs b/src/backend/NetAdmin.BizServer.Host/Extensions/ServiceCollectionExtensions.cs
index 11b78fe9..0ce88ece 100644
--- a/src/backend/NetAdmin.BizServer.Host/Extensions/ServiceCollectionExtensions.cs
+++ b/src/backend/NetAdmin.BizServer.Host/Extensions/ServiceCollectionExtensions.cs
@@ -22,7 +22,7 @@ public static class ServiceCollectionExtensions
(Startup.Args.InsertSeedData ? FreeSqlInitMethods.InsertSeedData : FreeSqlInitMethods.None), freeSql => {
// 鏁版嵁鏉冮檺杩囨护鍣
_ = freeSql.GlobalFilter.ApplyOnlyIf( //
- Chars.FLG_GLOBAL_FILTER_DATA
+ Chars.FLG_FREE_SQL_GLOBAL_FILTER_DATA
, () => ContextUserInfo.Create()?.Roles.All(x => x.DataScope == DataScopes.Self) ?? false
, a => a.OwnerId == ContextUserInfo.Create().Id);
});
diff --git a/src/backend/NetAdmin.BizServer.Host/Startup.cs b/src/backend/NetAdmin.BizServer.Host/Startup.cs
index 0d48aeb9..c677f9ae 100644
--- a/src/backend/NetAdmin.BizServer.Host/Startup.cs
+++ b/src/backend/NetAdmin.BizServer.Host/Startup.cs
@@ -26,17 +26,17 @@ namespace NetAdmin.BizServer.Host
///
/// 閰嶇疆搴旂敤绋嬪簭涓棿浠
///
- public void Configure(IApplicationBuilder app)
+ public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifeTime)
{
- _ = app //
- .UseRealIp() // 浣跨敤RealIp涓棿浠讹紝鐢ㄤ簬鑾峰彇鐪熷疄瀹㈡埛绔疘P鍦板潃
- .EnableBuffering() // 鍚敤璇锋眰浣撶紦鍐诧紝鍏佽澶氭璇诲彇璇锋眰浣
- .UseMiddleware() // 浣跨敤RequestAuditMiddleware涓棿浠讹紝鎵ц璇锋眰瀹¤
+ _ = app //
+ .UseMiddleware() // 瀹夊叏鍋滄満涓棿浠
+ .EnableBuffering() // 鍚敤璇锋眰浣撶紦鍐诧紝鍏佽澶氭璇诲彇璇锋眰浣
+ .UseMiddleware() // 浣跨敤RequestAuditMiddleware涓棿浠讹紝鎵ц璇锋眰瀹¤
#if DEBUG
.UseOpenApiSkin() // 浣跨敤OpenApiSkin涓棿浠讹紙浠呭湪璋冭瘯妯″紡涓嬶級锛屾彁渚汼wagger UI鐨偆
#else
- .UseVueAdmin() // 鎵樼绠$悊鍚庡彴锛屼粎鍦ㄩ潪璋冭瘯妯″紡涓
- .UseHttpMetrics() // 浣跨敤HttpMetrics涓棿浠讹紝鍚敤HTTP鎬ц兘鐩戞帶
+ .UseVueAdmin() // 鎵樼绠$悊鍚庡彴锛屼粎鍦ㄩ潪璋冭瘯妯″紡涓
+ .UseHttpMetrics() // 浣跨敤HttpMetrics涓棿浠讹紝鍚敤HTTP鎬ц兘鐩戞帶
#endif
.UseInject(string.Empty) // 浣跨敤Inject涓棿浠讹紝Furion鑴氭墜鏋剁殑渚濊禆娉ㄥ叆鏀寔
.UseUnifyResultStatusCodes() // 浣跨敤UnifyResultStatusCodes涓棿浠讹紝鐢ㄤ簬缁熶竴澶勭悊缁撴灉鐘舵佺爜
@@ -46,6 +46,7 @@ namespace NetAdmin.BizServer.Host
.UseAuthorization() // 浣跨敤Authorization涓棿浠讹紝鍚敤鎺堟潈
.UseMiddleware() // 浣跨敤RemoveNullNodeMiddleware涓棿浠讹紝鍒犻櫎JSON涓殑绌鸿妭鐐
.UseEndpoints(); // 閰嶇疆绔偣浠ュ鐞嗚姹
+ _ = lifeTime.ApplicationStopping.Register(SafetyShopHostMiddleware.OnStopping);
}
///
diff --git a/src/backend/NetAdmin.BizServer.Tests/AllTests.cs b/src/backend/NetAdmin.BizServer.Tests/AllTests.cs
index 00e0ec5a..e7937639 100644
--- a/src/backend/NetAdmin.BizServer.Tests/AllTests.cs
+++ b/src/backend/NetAdmin.BizServer.Tests/AllTests.cs
@@ -19,8 +19,8 @@ namespace NetAdmin.BizServer.Tests;
/// 鎵鏈夋祴璇
///
[SuppressMessage("Usage", "xUnit1028:Test method must have valid return type")]
-public class AllTests(WebApplicationFactory factory, ITestOutputHelper testOutputHelper) :
- WebApiTestBase(factory, testOutputHelper), IToolsModule, ICacheModule, IApiModule, IConfigModule
+public class AllTests(WebApplicationFactory factory, ITestOutputHelper testOutputHelper)
+ : WebApiTestBase(factory, testOutputHelper), IToolsModule, ICacheModule, IApiModule, IConfigModule
{
///
@@ -38,6 +38,18 @@ public class AllTests(WebApplicationFactory factory, ITestOutputHelper
return default;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ throw new NotImplementedException();
+ }
+
///
public Task CreateAsync(CreateConfigReq req)
{
diff --git a/src/backend/NetAdmin.Cache/DistributedCache.cs b/src/backend/NetAdmin.Cache/DistributedCache.cs
index d8ef1709..14bbb27d 100644
--- a/src/backend/NetAdmin.Cache/DistributedCache.cs
+++ b/src/backend/NetAdmin.Cache/DistributedCache.cs
@@ -41,7 +41,12 @@ public abstract class DistributedCache(IDistributedCache cache, TServi
protected async Task GetAsync(string key)
{
var cacheRead = await Cache.GetStringAsync(key).ConfigureAwait(false);
- return cacheRead != null ? cacheRead.ToObject() : default;
+ try {
+ return cacheRead != null ? cacheRead.ToObject() : default;
+ }
+ catch (JsonException) {
+ return default;
+ }
}
///
diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/ChineseNameAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/ChineseNameAttribute.cs
index e9474ec3..c1609be0 100644
--- a/src/backend/NetAdmin.Domain/Attributes/DataValidation/ChineseNameAttribute.cs
+++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/ChineseNameAttribute.cs
@@ -10,7 +10,7 @@ public sealed class ChineseNameAttribute : RegexAttribute
/// Initializes a new instance of the class.
///
public ChineseNameAttribute() //
- : base(Chars.RGX_CHINESE_NAME)
+ : base(Chars.RGXL_CHINESE_NAME)
{
ErrorMessageResourceName = nameof(Ln.涓枃濮撳悕);
ErrorMessageResourceType = typeof(Ln);
diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/CronAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/CronAttribute.cs
index e59b9a9b..38d40ca5 100644
--- a/src/backend/NetAdmin.Domain/Attributes/DataValidation/CronAttribute.cs
+++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/CronAttribute.cs
@@ -10,7 +10,7 @@ public sealed class CronAttribute : RegexAttribute
/// Initializes a new instance of the class.
///
public CronAttribute() //
- : base(Chars.RGX_CRON)
+ : base(Chars.RGXL_CRON)
{
ErrorMessageResourceName = nameof(Ln.鏃堕棿琛ㄨ揪寮);
ErrorMessageResourceType = typeof(Ln);
diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/EmailAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/EmailAttribute.cs
index 6717b8f6..0573aaa2 100644
--- a/src/backend/NetAdmin.Domain/Attributes/DataValidation/EmailAttribute.cs
+++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/EmailAttribute.cs
@@ -10,7 +10,7 @@ public sealed class EmailAttribute : RegexAttribute
/// Initializes a new instance of the class.
///
public EmailAttribute() //
- : base(Chars.RGX_EMAIL)
+ : base(Chars.RGXL_EMAIL)
{
ErrorMessageResourceName = nameof(Ln.鐢靛瓙閭);
ErrorMessageResourceType = typeof(Ln);
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs
index 543f24c1..8ad0062d 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs
@@ -6,7 +6,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// Api鎺ュ彛琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_Api))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_Api))]
public record Sys_Api : ImmutableEntity, IFieldSummary
{
///
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Config.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Config.cs
index 35cc7384..a8ca3806 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Config.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Config.cs
@@ -6,7 +6,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 閰嶇疆琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_Config))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_Config))]
public record Sys_Config : VersionEntity, IFieldEnabled
{
///
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs
index 8226cef9..240dfd0a 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs
@@ -6,7 +6,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 閮ㄩ棬琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_Dept))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_Dept))]
public record Sys_Dept : VersionEntity, IFieldEnabled, IFieldSummary, IFieldSort
{
///
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicCatalog.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicCatalog.cs
index ee326b1d..3ddeb475 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicCatalog.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicCatalog.cs
@@ -5,7 +5,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 瀛楀吀鐩綍琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_DicCatalog))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_DicCatalog))]
[Index($"idx_{{tablename}}_{nameof(Code)}", nameof(Code), true)]
public record Sys_DicCatalog : VersionEntity
{
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicContent.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicContent.cs
index bfc0a2aa..bab4f2ce 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicContent.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicContent.cs
@@ -5,7 +5,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 瀛楀吀鍐呭琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_DicContent))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_DicContent))]
[Index($"idx_{{tablename}}_{nameof(CatalogId)}_{nameof(Key)}", $"{nameof(CatalogId)},{nameof(Key)}", true)]
[Index($"idx_{{tablename}}_{nameof(CatalogId)}_{nameof(Value)}", $"{nameof(CatalogId)},{nameof(Value)}", true)]
public record Sys_DicContent : VersionEntity
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs
index 8c13c89f..76c25096 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs
@@ -8,7 +8,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 璁″垝浣滀笟琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_Job))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_Job))]
public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
{
///
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_JobRecord.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_JobRecord.cs
index ebea51e3..ce21c0c3 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_JobRecord.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_JobRecord.cs
@@ -6,7 +6,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 璁″垝浣滀笟鎵ц璁板綍琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_JobRecord))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_JobRecord))]
[Index($"idx_{{tablename}}_{nameof(JobId)}_{nameof(TimeId)}", $"{nameof(JobId)},{nameof(TimeId)}", true)]
public record Sys_JobRecord : LiteImmutableEntity
{
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Menu.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Menu.cs
index 62eecdfa..a82961ec 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Menu.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Menu.cs
@@ -7,7 +7,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 鑿滃崟琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_Menu))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_Menu))]
[Index($"idx_{{tablename}}_{nameof(Name)}", nameof(Name), true)]
public record Sys_Menu : VersionEntity, IFieldSort
{
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RequestLog.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RequestLog.cs
index 86118c79..ea3ce17a 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RequestLog.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RequestLog.cs
@@ -6,7 +6,9 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 璇锋眰鏃ュ織琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_RequestLog))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_RequestLog))]
+[Index($"idx_{{tablename}}_{nameof(ApiId)}", nameof(ApiId), false)]
+[Index($"idx_{{tablename}}_{nameof(CreatedTime)}", nameof(CreatedTime), false)]
public record Sys_RequestLog : ImmutableEntity, IFieldCreatedClient
{
///
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs
index da9fd550..e88eeaad 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs
@@ -8,7 +8,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 瑙掕壊琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_Role))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_Role))]
[Index("idx_{tablename}_01", nameof(Name), true)]
public record Sys_Role : VersionEntity, IFieldSort, IFieldEnabled, IFieldSummary, IRegister
{
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleApi.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleApi.cs
index ce459f2c..7aa7be29 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleApi.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleApi.cs
@@ -5,7 +5,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 瑙掕壊-鎺ュ彛鏄犲皠琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_RoleApi))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_RoleApi))]
public record Sys_RoleApi : ImmutableEntity
{
///
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleDept.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleDept.cs
index e8492bb7..96da168a 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleDept.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleDept.cs
@@ -5,7 +5,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 瑙掕壊-閮ㄩ棬鏄犲皠琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_RoleDept))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_RoleDept))]
[Index($"idx_{{tablename}}_{nameof(RoleId)}_{nameof(DeptId)}", $"{nameof(RoleId)},{nameof(DeptId)}", true)]
public record Sys_RoleDept : ImmutableEntity
{
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleMenu.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleMenu.cs
index 8e90d6ad..a1edcb93 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleMenu.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleMenu.cs
@@ -5,7 +5,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 瑙掕壊-鑿滃崟鏄犲皠琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_RoleMenu))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_RoleMenu))]
[Index($"idx_{{tablename}}_{nameof(RoleId)}_{nameof(MenuId)}", $"{nameof(RoleId)},{nameof(MenuId)}", true)]
public record Sys_RoleMenu : ImmutableEntity
{
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs
index 6c8a455c..05dcae71 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs
@@ -8,7 +8,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 绔欏唴淇¤〃
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_SiteMsg))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_SiteMsg))]
public record Sys_SiteMsg : VersionEntity, IRegister, IFieldSummary
{
///
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgDept.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgDept.cs
index 7de03179..65940933 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgDept.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgDept.cs
@@ -5,7 +5,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 绔欏唴淇-閮ㄩ棬鏄犲皠琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_SiteMsgDept))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_SiteMsgDept))]
[Index($"idx_{{tablename}}_{nameof(DeptId)}_{nameof(SiteMsgId)}", $"{nameof(DeptId)},{nameof(SiteMsgId)}", true)]
public record Sys_SiteMsgDept : ImmutableEntity
{
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgFlag.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgFlag.cs
index 1eb710fa..a41deec6 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgFlag.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgFlag.cs
@@ -6,7 +6,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 绔欏唴淇℃爣璁拌〃
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_SiteMsgFlag))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_SiteMsgFlag))]
[Index($"idx_{{tablename}}_{nameof(SiteMsgId)}_{nameof(UserId)}", $"{nameof(SiteMsgId)},{nameof(UserId)}", true)]
public record Sys_SiteMsgFlag : MutableEntity
{
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgRole.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgRole.cs
index 797f7393..4a7f2c07 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgRole.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgRole.cs
@@ -5,7 +5,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 绔欏唴淇-瑙掕壊鏄犲皠琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_SiteMsgRole))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_SiteMsgRole))]
[Index($"idx_{{tablename}}_{nameof(RoleId)}_{nameof(SiteMsgId)}", $"{nameof(RoleId)},{nameof(SiteMsgId)}", true)]
public record Sys_SiteMsgRole : ImmutableEntity
{
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgUser.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgUser.cs
index 54bf6a8f..a714eb41 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgUser.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsgUser.cs
@@ -5,7 +5,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 绔欏唴淇-鐢ㄦ埛鏄犲皠琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_SiteMsgUser))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_SiteMsgUser))]
[Index($"idx_{{tablename}}_{nameof(UserId)}_{nameof(SiteMsgId)}", $"{nameof(UserId)},{nameof(SiteMsgId)}", true)]
public record Sys_SiteMsgUser : ImmutableEntity
{
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs
index f09abb4f..1d776c08 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs
@@ -7,7 +7,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 鐢ㄦ埛鍩烘湰淇℃伅琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_User))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_User))]
[Index($"idx_{{tablename}}_{nameof(UserName)}", nameof(UserName), true)]
[Index($"idx_{{tablename}}_{nameof(Mobile)}", nameof(Mobile), true)]
[Index($"idx_{{tablename}}_{nameof(Email)}", nameof(Email), true)]
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserProfile.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserProfile.cs
index 0afb46e4..3bab847c 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserProfile.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserProfile.cs
@@ -6,7 +6,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 鐢ㄦ埛妗f琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_UserProfile))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_UserProfile))]
public record Sys_UserProfile : VersionEntity, IRegister
{
///
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserRole.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserRole.cs
index e5d83758..1a58b4c2 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserRole.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserRole.cs
@@ -5,7 +5,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 鐢ㄦ埛-瑙掕壊鏄犲皠琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_UserRole))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_UserRole))]
public record Sys_UserRole : VersionEntity
{
///
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_VerifyCode.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_VerifyCode.cs
index bd4a864e..fa141557 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_VerifyCode.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_VerifyCode.cs
@@ -6,7 +6,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
///
/// 楠岃瘉鐮佽〃
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_VerifyCode))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_VerifyCode))]
public record Sys_VerifyCode : VersionEntity
{
///
diff --git a/src/backend/NetAdmin.Domain/DbMaps/Tpl/Tpl_Example.cs b/src/backend/NetAdmin.Domain/DbMaps/Tpl/Tpl_Example.cs
index 421c1f79..fdd06be0 100644
--- a/src/backend/NetAdmin.Domain/DbMaps/Tpl/Tpl_Example.cs
+++ b/src/backend/NetAdmin.Domain/DbMaps/Tpl/Tpl_Example.cs
@@ -5,5 +5,5 @@ namespace NetAdmin.Domain.DbMaps.Tpl;
///
/// 绀轰緥琛
///
-[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Tpl_Example))]
+[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Tpl_Example))]
public record Tpl_Example : VersionEntity;
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Domain/Dto/Dependency/BulkReq.cs b/src/backend/NetAdmin.Domain/Dto/Dependency/BulkReq.cs
index 122ea06c..85dfee3b 100644
--- a/src/backend/NetAdmin.Domain/Dto/Dependency/BulkReq.cs
+++ b/src/backend/NetAdmin.Domain/Dto/Dependency/BulkReq.cs
@@ -11,6 +11,6 @@ public sealed record BulkReq : DataAbstraction
///
[Required(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.璇锋眰瀵硅薄涓嶈兘涓虹┖))]
[MinLength(1)]
- [MaxLength(Numbers.BULK_REQ_LIMIT)]
+ [MaxLength(Numbers.MAX_LIMIT_BULK_REQ)]
public IEnumerable Items { get; init; }
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Domain/Dto/Dependency/PagedQueryReq.cs b/src/backend/NetAdmin.Domain/Dto/Dependency/PagedQueryReq.cs
index 0f4a3a4a..71e55d33 100644
--- a/src/backend/NetAdmin.Domain/Dto/Dependency/PagedQueryReq.cs
+++ b/src/backend/NetAdmin.Domain/Dto/Dependency/PagedQueryReq.cs
@@ -7,10 +7,10 @@ public sealed record PagedQueryReq : QueryReq, IPagedInfo
where T : DataAbstraction, new()
{
///
- [Range(1, Numbers.QUERY_MAX_PAGE_NO)]
+ [Range(1, Numbers.MAX_LIMIT_QUERY_PAGE_NO)]
public int Page { get; init; } = 1;
///
- [Range(1, Numbers.QUERY_MAX_PAGE_SIZE)]
- public int PageSize { get; init; } = Numbers.QUERY_DEF_PAGE_SIZE;
+ [Range(1, Numbers.MAX_LIMIT_QUERY_PAGE_SIZE)]
+ public int PageSize { get; init; } = Numbers.DEF_PAGE_SIZE_QUERY;
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Domain/Dto/Dependency/QueryReq.cs b/src/backend/NetAdmin.Domain/Dto/Dependency/QueryReq.cs
index 4bf2a645..cc06091e 100644
--- a/src/backend/NetAdmin.Domain/Dto/Dependency/QueryReq.cs
+++ b/src/backend/NetAdmin.Domain/Dto/Dependency/QueryReq.cs
@@ -9,8 +9,8 @@ public record QueryReq : DataAbstraction
///
/// 鍙栧墠n鏉
///
- [Range(1, Numbers.QUERY_LIMIT)]
- public int Count { get; init; } = Numbers.QUERY_LIMIT;
+ [Range(1, Numbers.MAX_LIMIT_QUERY)]
+ public int Count { get; init; } = Numbers.MAX_LIMIT_QUERY;
///
/// 鍔ㄦ佹煡璇㈡潯浠
diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Cache/GetAllEntriesRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Cache/GetAllEntriesRsp.cs
index fd386241..5d6e3396 100644
--- a/src/backend/NetAdmin.Domain/Dto/Sys/Cache/GetAllEntriesRsp.cs
+++ b/src/backend/NetAdmin.Domain/Dto/Sys/Cache/GetAllEntriesRsp.cs
@@ -21,6 +21,16 @@ public sealed record GetAllEntriesRsp : DataAbstraction
Data = data;
}
+ ///
+ /// 缁濆杩囨湡鏃堕棿
+ ///
+ public DateTime? AbsExpTime => AbsExp == -1 ? null : DateTime.FromBinary(AbsExp).ToLocalTime();
+
+ ///
+ /// 婊戝姩杩囨湡鏃堕棿
+ ///
+ public DateTime? SldExpTime => SldExp == -1 ? null : DateTime.FromBinary(SldExp).ToLocalTime();
+
///
/// 缁濆杩囨湡鏃堕棿
///
diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Config/QueryConfigRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Config/QueryConfigRsp.cs
index 95476be2..4d2aaf20 100644
--- a/src/backend/NetAdmin.Domain/Dto/Sys/Config/QueryConfigRsp.cs
+++ b/src/backend/NetAdmin.Domain/Dto/Sys/Config/QueryConfigRsp.cs
@@ -10,6 +10,10 @@ namespace NetAdmin.Domain.Dto.Sys.Config;
///
public sealed record QueryConfigRsp : Sys_Config
{
+ ///
+ [JsonIgnore(Condition = JsonIgnoreCondition.Never)]
+ public override DateTime CreatedTime { get; init; }
+
///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
public override bool Enabled { get; init; }
diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/SiteMsg/CreateSiteMsgReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/SiteMsg/CreateSiteMsgReq.cs
index 3c49004f..620b9275 100644
--- a/src/backend/NetAdmin.Domain/Dto/Sys/SiteMsg/CreateSiteMsgReq.cs
+++ b/src/backend/NetAdmin.Domain/Dto/Sys/SiteMsg/CreateSiteMsgReq.cs
@@ -17,7 +17,7 @@ public record CreateSiteMsgReq : Sys_SiteMsg
/// 閮ㄩ棬缂栧彿鍒楄〃
///
[MinLength(1)]
- [MaxLength(Numbers.BULK_REQ_LIMIT)]
+ [MaxLength(Numbers.MAX_LIMIT_BULK_REQ)]
public IReadOnlyCollection DeptIds { get; init; }
///
@@ -30,7 +30,7 @@ public record CreateSiteMsgReq : Sys_SiteMsg
/// 瑙掕壊缂栧彿鍒楄〃
///
[MinLength(1)]
- [MaxLength(Numbers.BULK_REQ_LIMIT)]
+ [MaxLength(Numbers.MAX_LIMIT_BULK_REQ)]
public IReadOnlyCollection RoleIds { get; init; }
///
@@ -42,6 +42,6 @@ public record CreateSiteMsgReq : Sys_SiteMsg
/// 鐢ㄦ埛缂栧彿鍒楄〃
///
[MinLength(1)]
- [MaxLength(Numbers.BULK_REQ_LIMIT)]
+ [MaxLength(Numbers.MAX_LIMIT_BULK_REQ)]
public IReadOnlyCollection UserIds { get; init; }
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/SiteMsg/QuerySiteMsgRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/SiteMsg/QuerySiteMsgRsp.cs
index 5ad9307f..073968b0 100644
--- a/src/backend/NetAdmin.Domain/Dto/Sys/SiteMsg/QuerySiteMsgRsp.cs
+++ b/src/backend/NetAdmin.Domain/Dto/Sys/SiteMsg/QuerySiteMsgRsp.cs
@@ -21,6 +21,10 @@ public sealed record QuerySiteMsgRsp : Sys_SiteMsg
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
public override DateTime CreatedTime { get; init; }
+ ///
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ public override string CreatedUserName { get; init; }
+
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public new IEnumerable Depts { get; init; }
diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/CreateUpdateUserReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/CreateUpdateUserReq.cs
index 740428bf..5cb6ae08 100644
--- a/src/backend/NetAdmin.Domain/Dto/Sys/User/CreateUpdateUserReq.cs
+++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/CreateUpdateUserReq.cs
@@ -43,7 +43,7 @@ public abstract record CreateUpdateUserReq : Sys_User
///
[Required(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.瑙掕壊缂栧彿鍒楄〃涓嶈兘涓虹┖))]
[MinLength(1)]
- [MaxLength(Numbers.BULK_REQ_LIMIT)]
+ [MaxLength(Numbers.MAX_LIMIT_BULK_REQ)]
public IReadOnlyCollection RoleIds { get; init; }
///
diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/LoginRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/LoginRsp.cs
index 6940e522..c0dec41a 100644
--- a/src/backend/NetAdmin.Domain/Dto/Sys/User/LoginRsp.cs
+++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/LoginRsp.cs
@@ -21,7 +21,7 @@ public sealed record LoginRsp : DataAbstraction
public void SetToRspHeader()
{
// 璁剧疆鍝嶅簲鎶ユ枃澶
- App.HttpContext.Response.Headers[Chars.FLG_ACCESS_TOKEN] = AccessToken;
- App.HttpContext.Response.Headers[Chars.FLG_X_ACCESS_TOKEN] = RefreshToken;
+ App.HttpContext.Response.Headers[Chars.FLG_HTTP_HEADER_VALUE_ACCESS_TOKEN] = AccessToken;
+ App.HttpContext.Response.Headers[Chars.FLG_HTTP_HEADER_KEY_X_ACCESS_TOKEN] = RefreshToken;
}
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Domain/Events/SqlCommandAfterEvent.cs b/src/backend/NetAdmin.Domain/Events/SqlCommandAfterEvent.cs
index dbf65f6a..a494807d 100644
--- a/src/backend/NetAdmin.Domain/Events/SqlCommandAfterEvent.cs
+++ b/src/backend/NetAdmin.Domain/Events/SqlCommandAfterEvent.cs
@@ -24,6 +24,7 @@ public sealed record SqlCommandAfterEvent : SqlCommandBeforeEvent
///
public override string ToString()
{
- return string.Format(CultureInfo.InvariantCulture, "SQL-{0}: {2} ms {1}", Id, Sql, ElapsedMicroseconds / 1000);
+ return string.Format(CultureInfo.InvariantCulture, "SQL-{0}: {2} ms {1}", Id
+ , Sql?.Sub(0, Numbers.MAX_LIMIT_PRINT_LEN_SQL), ElapsedMicroseconds / 1000);
}
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Host/BackgroundRunning/WorkBase.cs b/src/backend/NetAdmin.Host/BackgroundRunning/WorkBase.cs
index 0fddaeb2..4f1d8d04 100644
--- a/src/backend/NetAdmin.Host/BackgroundRunning/WorkBase.cs
+++ b/src/backend/NetAdmin.Host/BackgroundRunning/WorkBase.cs
@@ -40,9 +40,9 @@ public abstract class WorkBase
///
protected Task GetLockerAsync(string lockId)
{
- return _redLocker.RedLockFactory.CreateLockAsync(lockId, TimeSpan.FromSeconds(Numbers.RED_LOCK_EXPIRY_TIME_SECS)
- , TimeSpan.FromSeconds(Numbers.RED_LOCK_WAIT_TIME_SECS)
- , TimeSpan.FromSeconds(Numbers.RED_LOCK_RETRY_TIME_SECS));
+ return _redLocker.RedLockFactory.CreateLockAsync(lockId, TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_EXPIRY)
+ , TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_WAIT)
+ , TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_RETRY));
}
///
diff --git a/src/backend/NetAdmin.Host/Controllers/ControllerBase.cs b/src/backend/NetAdmin.Host/Controllers/ControllerBase.cs
index c32cd34a..fe7bce0e 100644
--- a/src/backend/NetAdmin.Host/Controllers/ControllerBase.cs
+++ b/src/backend/NetAdmin.Host/Controllers/ControllerBase.cs
@@ -6,7 +6,7 @@ namespace NetAdmin.Host.Controllers;
///
/// 鎺у埗鍣ㄥ熀绫
///
-public abstract class ControllerBase(TCache cache) : IDynamicApiController
+public abstract class ControllerBase(TCache cache = default) : IDynamicApiController
where TCache : ICache //
where TService : IService
{
diff --git a/src/backend/NetAdmin.Host/Controllers/HealthController.cs b/src/backend/NetAdmin.Host/Controllers/HealthController.cs
deleted file mode 100644
index 25600fa6..00000000
--- a/src/backend/NetAdmin.Host/Controllers/HealthController.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using NetAdmin.Application.Services;
-using NetAdmin.Cache;
-
-namespace NetAdmin.Host.Controllers;
-
-///
-/// 鍋ュ悍鎺у埗鍣
-///
-[ApiDescriptionSettings("Health")]
-public sealed class HealthController(ICache cache)
- : ControllerBase, IService>(cache)
-{
- ///
- /// 鍋ュ悍妫鏌
- ///
- [AllowAnonymous]
- [HttpGet]
- #pragma warning disable CA1822, S3400
- public string Check()
- #pragma warning restore S3400, CA1822
- {
- return GlobalStatic.ProductVersion;
- }
-}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Host/Controllers/ProbeController.cs b/src/backend/NetAdmin.Host/Controllers/ProbeController.cs
new file mode 100644
index 00000000..bec7ae29
--- /dev/null
+++ b/src/backend/NetAdmin.Host/Controllers/ProbeController.cs
@@ -0,0 +1,28 @@
+using NetAdmin.Application.Services;
+using NetAdmin.Cache;
+using NetAdmin.Host.Middlewares;
+
+namespace NetAdmin.Host.Controllers;
+
+///
+/// 鎺㈤拡缁勪欢
+///
+[ApiDescriptionSettings("Probe")]
+public sealed class ProbeController : ControllerBase, IService>
+{
+ ///
+ /// 鍋ュ悍妫鏌
+ ///
+ [AllowAnonymous]
+ [HttpGet]
+ #pragma warning disable CA1822, S3400
+ public object HealthCheck()
+ #pragma warning restore S3400, CA1822
+ {
+ return new {
+ HostName = Environment.MachineName
+ , CurrentConnections = SafetyShopHostMiddleware.Connections
+ , GlobalStatic.ProductVersion
+ };
+ }
+}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Host/Extensions/HttpContextExtensions.cs b/src/backend/NetAdmin.Host/Extensions/HttpContextExtensions.cs
index 7b618cbc..1cff45e1 100644
--- a/src/backend/NetAdmin.Host/Extensions/HttpContextExtensions.cs
+++ b/src/backend/NetAdmin.Host/Extensions/HttpContextExtensions.cs
@@ -13,7 +13,7 @@ public static class HttpContextExtensions
public static async Task RemoveJsonNodeWithNullValueAsync(this HttpContext me)
{
// 闈瀓son鏍煎紡锛岄鍑
- if (!(me.Response.ContentType?.Contains(Chars.FLG_APPLICATION_JSON) ?? false)) {
+ if (!(me.Response.ContentType?.Contains(Chars.FLG_HTTP_HEADER_VALUE_APPLICATION_JSON) ?? false)) {
return;
}
diff --git a/src/backend/NetAdmin.Host/Extensions/IApplicationBuilderExtensions.cs b/src/backend/NetAdmin.Host/Extensions/IApplicationBuilderExtensions.cs
index 9dd279db..133a8a46 100644
--- a/src/backend/NetAdmin.Host/Extensions/IApplicationBuilderExtensions.cs
+++ b/src/backend/NetAdmin.Host/Extensions/IApplicationBuilderExtensions.cs
@@ -1,4 +1,3 @@
-using Microsoft.AspNetCore.HttpOverrides;
#if DEBUG
using IGeekFan.AspNetCore.Knife4jUI;
@@ -42,16 +41,4 @@ public static class IApplicationBuilderExtensions
});
}
#endif
-
- ///
- /// 鑾峰彇瀹㈡埛绔湡瀹濱p
- ///
- public static IApplicationBuilder UseRealIp(this IApplicationBuilder me)
- {
- return me.UseForwardedHeaders(new ForwardedHeadersOptions //
- {
- ForwardedHeaders = ForwardedHeaders.XForwardedFor |
- ForwardedHeaders.XForwardedProto
- });
- }
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Host/Extensions/ServiceCollectionExtensions.cs b/src/backend/NetAdmin.Host/Extensions/ServiceCollectionExtensions.cs
index 1cc1f2d3..a1669723 100644
--- a/src/backend/NetAdmin.Host/Extensions/ServiceCollectionExtensions.cs
+++ b/src/backend/NetAdmin.Host/Extensions/ServiceCollectionExtensions.cs
@@ -105,8 +105,7 @@ public static class ServiceCollectionExtensions
public static IServiceCollection AddConsoleFormatter(this IServiceCollection me)
{
return me.AddConsoleFormatter(options => {
- var logLevels = Enum.GetValues()
- .ToDictionary(x => x, x => x.GetDisplay());
+ var logLevels = Enum.GetValues().ToDictionary(x => x, x => x.GetDisplay());
#if DEBUG
options.WriteHandler = (message, _, _, _, _) => {
@@ -242,11 +241,6 @@ public static class ServiceCollectionExtensions
, LogMessage message //
, Dictionary logLevels)
{
- // 鏃ュ織杩囬暱
- if (msg.Length > Numbers.CONSOLE_LINE_LEN_LIMIT) {
- msg = $"{Ln.鏃ュ織闀垮害瓒呰繃闄愬埗} {Numbers.CONSOLE_LINE_LEN_LIMIT}";
- }
-
msg = _consoleColors.Aggregate( //
msg, (current, regex) => regex.Key.Replace(current, regex.Value));
msg = msg.ReplaceLineEndings(string.Empty);
diff --git a/src/backend/NetAdmin.Host/Filters/ApiResultHandler.cs b/src/backend/NetAdmin.Host/Filters/ApiResultHandler.cs
index aecf5a99..2aa3f57c 100644
--- a/src/backend/NetAdmin.Host/Filters/ApiResultHandler.cs
+++ b/src/backend/NetAdmin.Host/Filters/ApiResultHandler.cs
@@ -23,12 +23,12 @@ public abstract class ApiResultHandler
///
public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
{
- var lineException = context.Exception switch { NetAdminException ex => ex, _ => null };
- var errorCode = lineException?.Code ?? ErrorCodes.Unhandled;
+ var naException = context.Exception switch { NetAdminException ex => ex, _ => null };
+ var errorCode = naException?.Code ?? ErrorCodes.Unhandled;
var result = RestfulResult(errorCode, metadata.Data
- , lineException is NetAdminValidateException vEx
+ , naException is NetAdminValidateException vEx
? vEx.ValidateResults
- : lineException?.Message ?? errorCode.ResDesc());
+ : naException?.Message ?? errorCode.ResDesc());
SetErrorCodeToHeader(context.HttpContext, errorCode);
diff --git a/src/backend/NetAdmin.Host/Filters/GlobalExceptionHandler.cs b/src/backend/NetAdmin.Host/Filters/GlobalExceptionHandler.cs
index 8dfff7db..4ac95f0e 100644
--- a/src/backend/NetAdmin.Host/Filters/GlobalExceptionHandler.cs
+++ b/src/backend/NetAdmin.Host/Filters/GlobalExceptionHandler.cs
@@ -8,7 +8,12 @@ public sealed class GlobalExceptionHandler(ILogger logge
///
public Task OnExceptionAsync(ExceptionContext context)
{
- logger.Error(context.Exception);
+ if (context.Exception is NetAdminException and not NetAdminUnexpectedException) {
+ logger.Warn(context.Exception);
+ }
+ else {
+ logger.Error(context.Exception);
+ }
// 灏嗗紓甯歌缃埌HttpContext.Features涓 浠ヤ究涓棿浠惰兘鑾峰彇鍒颁粬
context.HttpContext.Features.Set(
diff --git a/src/backend/NetAdmin.Host/Middlewares/RequestAuditMiddleware.cs b/src/backend/NetAdmin.Host/Middlewares/RequestAuditMiddleware.cs
index 5336be5c..67797ff6 100644
--- a/src/backend/NetAdmin.Host/Middlewares/RequestAuditMiddleware.cs
+++ b/src/backend/NetAdmin.Host/Middlewares/RequestAuditMiddleware.cs
@@ -5,9 +5,6 @@ namespace NetAdmin.Host.Middlewares;
///
/// 璇锋眰瀹¤涓棿浠
///
-///
-/// 鏀惧湪鎵鏈変腑闂翠欢鏈鍓嶉潰
-///
public sealed class RequestAuditMiddleware(
RequestDelegate next
, IOptions dynamicApiControllerSettingsOptions
@@ -17,7 +14,7 @@ public sealed class RequestAuditMiddleware(
= new($"/{dynamicApiControllerSettingsOptions.Value.DefaultRoutePrefix}");
private readonly PathString _healthCheckRoutePrefix
- = new($"/{dynamicApiControllerSettingsOptions.Value.DefaultRoutePrefix}/health/check");
+ = new($"/{dynamicApiControllerSettingsOptions.Value.DefaultRoutePrefix}/probe/health.check");
///
/// 涓诲嚱鏁
diff --git a/src/backend/NetAdmin.Host/Middlewares/SafetyShopHostMiddleware.cs b/src/backend/NetAdmin.Host/Middlewares/SafetyShopHostMiddleware.cs
new file mode 100644
index 00000000..f9b6a1b5
--- /dev/null
+++ b/src/backend/NetAdmin.Host/Middlewares/SafetyShopHostMiddleware.cs
@@ -0,0 +1,44 @@
+namespace NetAdmin.Host.Middlewares;
+
+///
+/// 瀹夊叏鍋滄満涓棿浠
+///
+///
+/// 鏀惧湪鎵鏈変腑闂翠欢鏈鍓嶉潰
+///
+public sealed class SafetyShopHostMiddleware(RequestDelegate next)
+{
+ private static long _connections;
+ private static bool _hostStopping;
+
+ ///
+ /// 褰撳墠杩炴帴鏁
+ ///
+ public static long Connections => Interlocked.Read(ref _connections);
+
+ ///
+ /// 鍋滄満澶勭悊
+ ///
+ public static void OnStopping()
+ {
+ Volatile.Write(ref _hostStopping, true);
+ while (Interlocked.Read(ref _connections) > 0) {
+ Thread.Sleep(10);
+ }
+ }
+
+ ///
+ /// 涓诲嚱鏁
+ ///
+ public async Task InvokeAsync(HttpContext context)
+ {
+ if (Volatile.Read(ref _hostStopping)) {
+ context.Response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;
+ return;
+ }
+
+ _ = Interlocked.Increment(ref _connections);
+ await next(context).ConfigureAwait(false);
+ _ = Interlocked.Decrement(ref _connections);
+ }
+}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Host/Utils/RequestLogger.cs b/src/backend/NetAdmin.Host/Utils/RequestLogger.cs
index dccb3c3b..f17b7125 100644
--- a/src/backend/NetAdmin.Host/Utils/RequestLogger.cs
+++ b/src/backend/NetAdmin.Host/Utils/RequestLogger.cs
@@ -36,10 +36,12 @@ public sealed class RequestLogger(
_textContentTypes
, x => context.Request.ContentType?.Contains(
x, StringComparison.OrdinalIgnoreCase) ?? false)
- ? await context.ReadBodyContentAsync().ConfigureAwait(false)
+ ? (await context.ReadBodyContentAsync().ConfigureAwait(false))
+ ?.Sub(0, Numbers.MAX_LIMIT_PRINT_LEN_CONTENT)
: string.Empty
, RequestUrl = context.Request.GetRequestUrlAddress()
- , ResponseBody = responseBody
+ , ResponseBody
+ = responseBody?.Sub(0, Numbers.MAX_LIMIT_PRINT_LEN_CONTENT)
, ServerIp = context.GetLocalIpAddressToIPv4()?.IpV4ToInt32()
, ApiId = context.Request.Path.Value?.TrimStart('/')
, RequestHeaders = context.Request.Headers.Json()
@@ -51,7 +53,10 @@ public sealed class RequestLogger(
, CreatedUserId = associatedUser?.UserId
, CreatedUserName = associatedUser?.UserName
, CreatedUserAgent = context.Request.Headers.UserAgent.ToString()
- , CreatedClientIp = context.GetRemoteIpAddressToIPv4()?.IpV4ToInt32()
+ , CreatedClientIp = context.GetRealIpAddress()
+ ?.MapToIPv4()
+ .ToString()
+ .IpV4ToInt32()
};
// 鎵撳嵃鏃ュ織
diff --git a/src/backend/NetAdmin.Host/Utils/SqlAuditor.cs b/src/backend/NetAdmin.Host/Utils/SqlAuditor.cs
index 0468ce47..10882051 100644
--- a/src/backend/NetAdmin.Host/Utils/SqlAuditor.cs
+++ b/src/backend/NetAdmin.Host/Utils/SqlAuditor.cs
@@ -59,7 +59,7 @@ public sealed class SqlAuditor : ISingleton
private static void SetCreatedClientIp(AuditValueEventArgs e)
{
if (e.Value is null or 0) {
- e.Value = App.HttpContext?.GetRemoteIpAddressToIPv4().IpV4ToInt32();
+ e.Value = App.HttpContext?.GetRealIpAddress()?.MapToIPv4().ToString().IpV4ToInt32();
}
}
@@ -80,7 +80,7 @@ public sealed class SqlAuditor : ISingleton
private static void SetCreatedUserAgent(AuditValueEventArgs e)
{
if (e.Value is null or "") {
- e.Value = App.HttpContext?.Request.Headers[Chars.FLG_HTTP_HEADER_USER_AGENT].ToString();
+ e.Value = App.HttpContext?.Request.Headers[Chars.FLG_HTTP_HEADER_KEY_USER_AGENT].ToString();
}
}
diff --git a/src/backend/NetAdmin.Infrastructure/Configuration/Options/CaptchaOptions.cs b/src/backend/NetAdmin.Infrastructure/Configuration/Options/CaptchaOptions.cs
index b3fe85f3..d74355e7 100644
--- a/src/backend/NetAdmin.Infrastructure/Configuration/Options/CaptchaOptions.cs
+++ b/src/backend/NetAdmin.Infrastructure/Configuration/Options/CaptchaOptions.cs
@@ -14,8 +14,8 @@ public sealed record CaptchaOptions : OptionAbstraction
{
var rtn = new char[32];
for (var i = 0; i != 32; i++) {
- rtn[i] = Chars.FLG_VISIBLE_ASCIIS[
- (int)(Math.Abs(Math.Sin(_seed * (i + 1))) * Chars.FLG_VISIBLE_ASCIIS.Length)];
+ rtn[i] = Chars.FLGL_VISIBLE_ASCIIS[
+ (int)(Math.Abs(Math.Sin(_seed * (i + 1))) * Chars.FLGL_VISIBLE_ASCIIS.Length)];
}
SecretKey = new string(rtn);
diff --git a/src/backend/NetAdmin.Infrastructure/Constant/Chars.cs b/src/backend/NetAdmin.Infrastructure/Constant/Chars.cs
index f144fa19..d73c47e8 100644
--- a/src/backend/NetAdmin.Infrastructure/Constant/Chars.cs
+++ b/src/backend/NetAdmin.Infrastructure/Constant/Chars.cs
@@ -10,80 +10,78 @@ namespace NetAdmin.Infrastructure.Constant;
///
public static class Chars
{
- public const string FLG_ACCESS_TOKEN = "ACCESS-TOKEN";
- public const string FLG_ACCESS_TOKEN_HEADER_KEY = "Authorization";
- public const string FLG_APPLICATION_JSON = "application/json";
- public const string FLG_AUTH_SCHEMA = "Bearer";
- public const string FLG_CONSUL_REG_HOSTNAME = "CONSUL_REG_HOSTNAME";
- public const string FLG_CONSUL_REG_PORT = "CONSUL_REG_PORT";
- public const string FLG_CONTEXT_MEMBER_INFO = nameof(FLG_CONTEXT_MEMBER_INFO);
- public const string FLG_CONTEXT_OWNER_DEPT_ID = nameof(FLG_CONTEXT_OWNER_DEPT_ID);
- public const string FLG_CONTEXT_USER_ID = nameof(FLG_CONTEXT_USER_ID);
- public const string FLG_CONTEXT_USER_INFO = nameof(FLG_CONTEXT_USER_INFO);
- public const string FLG_DB_FIELD_TYPE_NVARCHAR = "nvarchar";
- public const string FLG_DB_FIELD_TYPE_NVARCHAR_255 = "nvarchar(255)";
- public const string FLG_DB_FIELD_TYPE_NVARCHAR_MAX = "nvarchar(max)";
- public const string FLG_DB_FIELD_TYPE_SMALL_INT = "smallint";
- public const string FLG_DB_FIELD_TYPE_TEXT = "text";
- public const string FLG_DB_FIELD_TYPE_VARCHAR = "varchar";
- public const string FLG_DB_FIELD_TYPE_VARCHAR_1022 = "varchar(1022)";
- public const string FLG_DB_FIELD_TYPE_VARCHAR_127 = "varchar(127)";
- public const string FLG_DB_FIELD_TYPE_VARCHAR_15 = "varchar(15)";
- public const string FLG_DB_FIELD_TYPE_VARCHAR_255 = "varchar(255)";
- public const string FLG_DB_FIELD_TYPE_VARCHAR_31 = "varchar(31)";
- public const string FLG_DB_FIELD_TYPE_VARCHAR_4094 = "varchar(4094)";
- public const string FLG_DB_FIELD_TYPE_VARCHAR_510 = "varchar(510)";
- public const string FLG_DB_FIELD_TYPE_VARCHAR_63 = "varchar(63)";
- public const string FLG_DB_FIELD_TYPE_VARCHAR_7 = "varchar(7)";
- public const string FLG_DB_FIELD_TYPE_VARCHAR_MAX = "varchar(max)";
- public const string FLG_GLOBAL_FILTER_DATA = nameof(FLG_GLOBAL_FILTER_DATA);
- public const string FLG_GLOBAL_FILTER_DELETE = nameof(FLG_GLOBAL_FILTER_DELETE);
- public const string FLG_GLOBAL_FILTER_MEMBER = nameof(FLG_GLOBAL_FILTER_MEMBER);
- public const string FLG_GLOBAL_FILTER_SELF = nameof(FLG_GLOBAL_FILTER_SELF);
- public const string FLG_GLOBAL_FILTER_TENANT = nameof(FLG_GLOBAL_FILTER_TENANT);
- public const string FLG_HEALTH_CHECK_PATH_PREFIX = "health/check";
- public const string FLG_HTTP_HEADER_REFERER = "Referer";
- public const string FLG_HTTP_HEADER_USER_AGENT = "User-Agent";
- public const string FLG_HTTP_METHOD_CONNECT = "CONNECT";
- public const string FLG_HTTP_METHOD_DELETE = "DELETE";
- public const string FLG_HTTP_METHOD_GET = "GET";
- public const string FLG_HTTP_METHOD_HEAD = "HEAD";
- public const string FLG_HTTP_METHOD_OPTIONS = "OPTIONS";
- public const string FLG_HTTP_METHOD_PATCH = "PATCH";
- public const string FLG_HTTP_METHOD_POST = "POST";
- public const string FLG_HTTP_METHOD_PUT = "PUT";
- public const string FLG_HTTP_METHOD_TRACE = "TRACE";
- public const string FLG_RANDOM_UNAME_PWD = "VcXlp7WY";
- public const string FLG_REDIS_INSTANCE_DATA_CACHE = "DataCache";
- public const string FLG_SNOWFLAKE_WORK_ID = "SNOWFLAKE_WORK_ID";
- public const string FLG_SYSTEM_PREFIX = "sc_";
- public const string FLG_TABLE_NAME_PREFIX = "";
+ public const string FLG_CONTEXT_MEMBER_INFO = nameof(FLG_CONTEXT_MEMBER_INFO);
+ public const string FLG_CONTEXT_OWNER_DEPT_ID = nameof(FLG_CONTEXT_OWNER_DEPT_ID);
+ public const string FLG_CONTEXT_USER_ID = nameof(FLG_CONTEXT_USER_ID);
+ public const string FLG_CONTEXT_USER_INFO = nameof(FLG_CONTEXT_USER_INFO);
+ public const string FLG_DB_EXCEPTION_PRIVATE_KEY_CONFLICT = "PRIMARY KEY";
+ public const string FLG_DB_FIELD_TYPE_NVARCHAR = "nvarchar";
+ public const string FLG_DB_FIELD_TYPE_NVARCHAR_1022 = "nvarchar(1022)";
+ public const string FLG_DB_FIELD_TYPE_NVARCHAR_127 = "nvarchar(127)";
+ public const string FLG_DB_FIELD_TYPE_NVARCHAR_15 = "nvarchar(15)";
+ public const string FLG_DB_FIELD_TYPE_NVARCHAR_255 = "nvarchar(255)";
+ public const string FLG_DB_FIELD_TYPE_NVARCHAR_31 = "nvarchar(31)";
+ public const string FLG_DB_FIELD_TYPE_NVARCHAR_4094 = "nvarchar(4094)";
+ public const string FLG_DB_FIELD_TYPE_NVARCHAR_510 = "nvarchar(510)";
+ public const string FLG_DB_FIELD_TYPE_NVARCHAR_63 = "nvarchar(63)";
+ public const string FLG_DB_FIELD_TYPE_NVARCHAR_7 = "nvarchar(7)";
+ public const string FLG_DB_FIELD_TYPE_NVARCHAR_MAX = "nvarchar(max)";
+ public const string FLG_DB_FIELD_TYPE_SMALL_INT = "smallint";
+ public const string FLG_DB_FIELD_TYPE_TEXT = "text";
+ public const string FLG_DB_FIELD_TYPE_VARCHAR = "varchar";
+ public const string FLG_DB_FIELD_TYPE_VARCHAR_1022 = "varchar(1022)";
+ public const string FLG_DB_FIELD_TYPE_VARCHAR_127 = "varchar(127)";
+ public const string FLG_DB_FIELD_TYPE_VARCHAR_15 = "varchar(15)";
+ public const string FLG_DB_FIELD_TYPE_VARCHAR_255 = "varchar(255)";
+ public const string FLG_DB_FIELD_TYPE_VARCHAR_31 = "varchar(31)";
+ public const string FLG_DB_FIELD_TYPE_VARCHAR_4094 = "varchar(4094)";
+ public const string FLG_DB_FIELD_TYPE_VARCHAR_510 = "varchar(510)";
+ public const string FLG_DB_FIELD_TYPE_VARCHAR_63 = "varchar(63)";
+ public const string FLG_DB_FIELD_TYPE_VARCHAR_7 = "varchar(7)";
+ public const string FLG_DB_FIELD_TYPE_VARCHAR_MAX = "varchar(max)";
+ public const string FLG_DB_TABLE_NAME_PREFIX = "";
+ public const string FLG_FREE_SQL_GLOBAL_FILTER_DATA = nameof(FLG_FREE_SQL_GLOBAL_FILTER_DATA);
+ public const string FLG_FREE_SQL_GLOBAL_FILTER_DELETE = nameof(FLG_FREE_SQL_GLOBAL_FILTER_DELETE);
+ public const string FLG_FREE_SQL_GLOBAL_FILTER_MEMBER = nameof(FLG_FREE_SQL_GLOBAL_FILTER_MEMBER);
+ public const string FLG_FREE_SQL_GLOBAL_FILTER_SELF = nameof(FLG_FREE_SQL_GLOBAL_FILTER_SELF);
+ public const string FLG_FREE_SQL_GLOBAL_FILTER_TENANT = nameof(FLG_FREE_SQL_GLOBAL_FILTER_TENANT);
+ public const string FLG_HTTP_HEADER_KEY_AUTHORIZATION = "Authorization";
+ public const string FLG_HTTP_HEADER_KEY_REFERER = "Referer";
+ public const string FLG_HTTP_HEADER_KEY_USER_AGENT = "User-Agent";
+ public const string FLG_HTTP_HEADER_KEY_X_ACCESS_TOKEN = "X-ACCESS-TOKEN";
+ public const string FLG_HTTP_HEADER_KEY_X_ACCESS_TOKEN_HEADER_KEY = "X-Authorization";
+ public const string FLG_HTTP_HEADER_KEY_X_FORWARDED_FOR = "X-Forwarded-For";
+ public const string FLG_HTTP_HEADER_KEY_X_REAL_IP = "X-Real-IP";
+ public const string FLG_HTTP_HEADER_VALUE_ACCESS_TOKEN = "ACCESS-TOKEN";
+ public const string FLG_HTTP_HEADER_VALUE_APPLICATION_JSON = "application/json";
+ public const string FLG_HTTP_HEADER_VALUE_APPLICATION_URLENCODED = "application/x-www-form-urlencoded";
+ public const string FLG_HTTP_HEADER_VALUE_AUTH_SCHEMA = "Bearer";
+ public const string FLG_HTTP_METHOD_CONNECT = "CONNECT";
+ public const string FLG_HTTP_METHOD_DELETE = "DELETE";
+ public const string FLG_HTTP_METHOD_GET = "GET";
+ public const string FLG_HTTP_METHOD_HEAD = "HEAD";
+ public const string FLG_HTTP_METHOD_OPTIONS = "OPTIONS";
+ public const string FLG_HTTP_METHOD_PATCH = "PATCH";
+ public const string FLG_HTTP_METHOD_POST = "POST";
+ public const string FLG_HTTP_METHOD_PUT = "PUT";
+ public const string FLG_HTTP_METHOD_TRACE = "TRACE";
+ public const string FLG_PATH_PREFIX_HEALTH_CHECK = "probe/health.check";
+ public const string FLG_RANDOM_UNAME_PWD = "VcXlp7WY";
+ public const string FLG_REDIS_INSTANCE_DATA_CACHE = "DataCache";
+ public const string FLG_SNOWFLAKE_WORK_ID = "SNOWFLAKE_WORK_ID";
+ public const string FLG_SYSTEM_PREFIX = "sc_";
- public const string FLG_UA_MOBILE
+ public const string FLGL_HTTP_HEADER_VALUE_UA_MOBILE
= "Mozilla/5.0 (Linux; Android 9; Redmi Note 8 Pro Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.96 Mobile Safari/537.36";
- public const string FLG_UA_PC
+ public const string FLGL_HTTP_HEADER_VALUE_UA_PC
= "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36";
- public const string FLG_VISIBLE_ASCIIS
+ public const string FLGL_VISIBLE_ASCIIS
= """!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~""";
- public const string FLG_X_ACCESS_TOKEN = "X-ACCESS-TOKEN";
- public const string FLG_X_ACCESS_TOKEN_HEADER_KEY = "X-Authorization";
-
- public const string RGX_CERTIFICATE = "^[a-zA-Z0-9-_]+$";
-
- public const string RGX_CHINESE_NAME
- = """^(?:璧祙閽眧瀛檤鏉巪鍛▅鍚磡閮憒鐜媩鍐瘄闄坾瑜殀鍗珅钂媩娌坾闊﹟鏉▅鏈眧绉灏璁竱浣晐鍚晐鏂絴寮爘瀛攟鏇箌涓鍗巪閲憒榄弢闄秥濮渱鎴殀璋閭箌鍠粅鏌弢姘磡绐绔爘浜憒鑻弢娼榺钁泑濂殀鑼億褰瓅閮巪椴亅闊鏄寍椹瑋鑻梶鍑鑺眧鏂箌淇瀨浠粅琚亅鏌硘閰唡椴峾鍙瞸鍞恷璐箌寤墊宀憒钖泑闆穦璐簗鍊獆姹婊晐娈穦缃梶姣晐閮潀閭瑋瀹墊甯竱涔恷浜巪鏃秥鍌厊鐨畖鍗瀨榻恷搴穦浼峾浣檤鍏億鍗渱椤緗瀛焲骞硘榛剕鍜寍绌唡钀灏箌濮殀閭祙婀泑姹獆绁亅姣泑绂箌鐙剕绫硘璐潀鏄巪鑷璁浼弢鎴恷鎴磡璋坾瀹媩鑼厊搴瀨鐔妡绾獆鑸抾灞坾椤箌绁潀钁姊亅鏉渱闃畖钃潀闂祙甯瓅瀛楹粅寮簗璐緗璺瘄濞剕鍗眧姹焲绔棰渱閮瓅姊厊鐩泑鏋梶鍒亅閽焲寰恷閭眧楠唡楂榺澶弢钄鐢皘妯妡鑳鍑寍闇峾铏瀨涓噟鏀瘄鏌瘄鏄潀绠鍗鑾珅缁弢鎴縷瑁榺缂獆骞瞸瑙搴攟瀹梶涓亅瀹璐瞸閭搢閮亅鍗晐鏉瓅娲獆鍖厊璇竱宸鐭硘宕攟鍚墊閽畖榫殀绋媩宓噟閭婊憒瑁磡闄唡鑽缈亅鑽|缇妡鏂紎鎯爘鐢剕鏇瞸瀹秥灏亅鑺畖缇縷鍌▅闈硘姹瞸閭磡绯渱鏉緗浜晐娈祙瀵寍宸珅涔寍鐒宸磡寮搢鐗闅梶灞眧璋穦杞渚瘄瀹搢钃瑋鍏▅閮梶鐝瓅浠皘绉媩浠瞸浼妡瀹珅瀹亅浠噟鏍緗鏆磡鐢榺閽瓅鍘墊鎴巪绁東姝绗鍒榺鏅瘄瑭箌鏉焲榫檤鍙秥骞竱鍙竱闊秥閮渱榛巪钃焲钖剕鍗皘瀹縷鐧絴鎬|钂瞸閭皘浠巪閯倈绱鍜竱绫峾璧東鍗搢钄簗灞爘钂檤姹爘涔攟闃磡鑳鑳絴鑻峾鍙寍闂粅鑾榺鍏殀缈焲璋瓅璐鍔硘閫剕濮瑋鐢硘鎵秥鍫祙鍐墊瀹皘閮闆峾閮鐠﹟妗憒妗倈婵畖鐗泑瀵縷閫殀杈箌鎵坾鐕晐鍐|閮弢娴灏殀鍐渱娓﹟鍒珅搴剕鏅弢鏌磡鐬縷闃巪鍏厊鎱晐杩瀨鑼箌涔爘瀹鑹緗楸紎瀹箌鍚憒鍙鏄搢鎱巪鎴坾寤東搴緗缁坾鏆▅灞厊琛姝閮絴鑰縷婊寮榺鍖鍥絴鏂噟瀵噟骞縷绂剕闃檤涓渱娆娈硘娌億鍒﹟钄殀瓒妡澶攟闅唡甯坾宸﹟鍘峾鑱倈鏅亅鍕緗鏁東铻峾鍐穦瑷緗杈泑闃殀閭绠|楗秥绌簗鏇緗姣媩娌檤涔渱鍏粅闉爘椤粅涓皘宸鍏硘钂瘄鐩竱鏌寰寍鑽唡绾娓竱绔簗鏉億閫瘄鐩東鐩妡妗搢鍏瑋涓囦繜|鍙搁┈|涓婂畼|娆ч槼|澶忎警|璇歌憶|闂讳汉|涓滄柟|璧繛|鐨囩敨|灏夎繜|鍏緤|婢瑰彴|鍏喍|瀹楁斂|婵槼|娣充簬|鍗曚簬|澶彅|鐢冲睜|鍏瓩|浠插瓩|杞╄緯|浠ょ嫄|閽熺|瀹囨枃|闀垮瓩|鎱曞|椴滀簬|闂句笜|鍙稿緬|鍙哥┖|浜撳畼|鍙稿瘒|浠墊鐫瀛愯溅|棰涘瓩|绔湪|宸┈|鍏タ|婕嗛洉|涔愭|澹ら┓|鍏壇|鎷撹穻|澶硅胺|瀹扮埗|璋锋|鏅媩妤殀闂珅娉晐姹潀閯娑倈閽娈靛共|鐧鹃噷|涓滈儹|鍗楅棬|鍛煎欢|褰抾娴穦缇婅垖|寰敓|宀硘甯厊缂憒浜鍐祙鍚巪鏈墊鐞磡姊佷笜|宸︿笜|涓滈棬|瑗块棬|鍟唡鐗焲浣榺浣磡浼瘄璧弢鍗楀|澧▅鍝坾璋瘄绗獆骞磡鐖眧闃硘浣焲绗簲|瑷|绂)[\u4e00-\u9fa5]{1,3}$""";
-
- public const string RGX_CRON
- = "^\\s*($|#|\\w+\\s*=|(\\?|\\*|(?:[0-5]?\\d)(?:(?:-|\\/|\\,)(?:[0-5]?\\d))?(?:,(?:[0-5]?\\d)(?:(?:-|\\/|\\,)(?:[0-5]?\\d))?)*)\\s+(\\?|\\*|(?:[0-5]?\\d)(?:(?:-|\\/|\\,)(?:[0-5]?\\d))?(?:,(?:[0-5]?\\d)(?:(?:-|\\/|\\,)(?:[0-5]?\\d))?)*)\\s+(\\?|\\*|(?:[01]?\\d|2[0-3])(?:(?:-|\\/|\\,)(?:[01]?\\d|2[0-3]))?(?:,(?:[01]?\\d|2[0-3])(?:(?:-|\\/|\\,)(?:[01]?\\d|2[0-3]))?)*)\\s+(\\?|\\*|(?:0?[1-9]|[12]\\d|3[01])(?:(?:-|\\/|\\,)(?:0?[1-9]|[12]\\d|3[01]))?(?:,(?:0?[1-9]|[12]\\d|3[01])(?:(?:-|\\/|\\,)(?:0?[1-9]|[12]\\d|3[01]))?)*)\\s+(\\?|\\*|(?:[1-9]|1[012])(?:(?:-|\\/|\\,)(?:[1-9]|1[012]))?(?:L|W)?(?:,(?:[1-9]|1[012])(?:(?:-|\\/|\\,)(?:[1-9]|1[012]))?(?:L|W)?)*|\\?|\\*|(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:-)(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?(?:,(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:-)(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?)*)\\s+(\\?|\\*|(?:[0-6])(?:(?:-|\\/|\\,|#)(?:[0-6]))?(?:L)?(?:,(?:[0-6])(?:(?:-|\\/|\\,|#)(?:[0-6]))?(?:L)?)*|\\?|\\*|(?:MON|TUE|WED|THU|FRI|SAT|SUN)(?:(?:-)(?:MON|TUE|WED|THU|FRI|SAT|SUN))?(?:,(?:MON|TUE|WED|THU|FRI|SAT|SUN)(?:(?:-)(?:MON|TUE|WED|THU|FRI|SAT|SUN))?)*)(|\\s)+(\\?|\\*|(?:|\\d{4})(?:(?:-|\\/|\\,)(?:|\\d{4}))?(?:,(?:|\\d{4})(?:(?:-|\\/|\\,)(?:|\\d{4}))?)*))$";
-
- public const string RGX_EMAIL
- = """^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$""";
-
- public const string RGX_INVITE_CODE = """^\d{8}$""";
-
+ public const string RGX_CERTIFICATE = "^[a-zA-Z0-9-_]+$";
+ public const string RGX_INVITE_CODE = """^\d{8}$""";
public const string RGX_MOBILE = """^1(3\d|4[5-9]|5[0-35-9]|6[6]|7[2-8]|8\d|9[0-35-9])\d{8}$""";
public const string RGX_PASSWORD = "^(?![0-9]+$)(?![a-zA-Z]+$).{8,16}$";
public const string RGX_PAY_PASSWORD = """^\d{6}$""";
@@ -93,6 +91,18 @@ public static class Chars
public const string RGX_USERNAME = "^[a-zA-Z0-9_]{4,16}$";
public const string RGX_VERIFY_CODE = """^\d{4}$""";
+ public const string RGXL_CHINESE_NAME
+ = """^(?:璧祙閽眧瀛檤鏉巪鍛▅鍚磡閮憒鐜媩鍐瘄闄坾瑜殀鍗珅钂媩娌坾闊﹟鏉▅鏈眧绉灏璁竱浣晐鍚晐鏂絴寮爘瀛攟鏇箌涓鍗巪閲憒榄弢闄秥濮渱鎴殀璋閭箌鍠粅鏌弢姘磡绐绔爘浜憒鑻弢娼榺钁泑濂殀鑼億褰瓅閮巪椴亅闊鏄寍椹瑋鑻梶鍑鑺眧鏂箌淇瀨浠粅琚亅鏌硘閰唡椴峾鍙瞸鍞恷璐箌寤墊宀憒钖泑闆穦璐簗鍊獆姹婊晐娈穦缃梶姣晐閮潀閭瑋瀹墊甯竱涔恷浜巪鏃秥鍌厊鐨畖鍗瀨榻恷搴穦浼峾浣檤鍏億鍗渱椤緗瀛焲骞硘榛剕鍜寍绌唡钀灏箌濮殀閭祙婀泑姹獆绁亅姣泑绂箌鐙剕绫硘璐潀鏄巪鑷璁浼弢鎴恷鎴磡璋坾瀹媩鑼厊搴瀨鐔妡绾獆鑸抾灞坾椤箌绁潀钁姊亅鏉渱闃畖钃潀闂祙甯瓅瀛楹粅寮簗璐緗璺瘄濞剕鍗眧姹焲绔棰渱閮瓅姊厊鐩泑鏋梶鍒亅閽焲寰恷閭眧楠唡楂榺澶弢钄鐢皘妯妡鑳鍑寍闇峾铏瀨涓噟鏀瘄鏌瘄鏄潀绠鍗鑾珅缁弢鎴縷瑁榺缂獆骞瞸瑙搴攟瀹梶涓亅瀹璐瞸閭搢閮亅鍗晐鏉瓅娲獆鍖厊璇竱宸鐭硘宕攟鍚墊閽畖榫殀绋媩宓噟閭婊憒瑁磡闄唡鑽缈亅鑽|缇妡鏂紎鎯爘鐢剕鏇瞸瀹秥灏亅鑺畖缇縷鍌▅闈硘姹瞸閭磡绯渱鏉緗浜晐娈祙瀵寍宸珅涔寍鐒宸磡寮搢鐗闅梶灞眧璋穦杞渚瘄瀹搢钃瑋鍏▅閮梶鐝瓅浠皘绉媩浠瞸浼妡瀹珅瀹亅浠噟鏍緗鏆磡鐢榺閽瓅鍘墊鎴巪绁東姝绗鍒榺鏅瘄瑭箌鏉焲榫檤鍙秥骞竱鍙竱闊秥閮渱榛巪钃焲钖剕鍗皘瀹縷鐧絴鎬|钂瞸閭皘浠巪閯倈绱鍜竱绫峾璧東鍗搢钄簗灞爘钂檤姹爘涔攟闃磡鑳鑳絴鑻峾鍙寍闂粅鑾榺鍏殀缈焲璋瓅璐鍔硘閫剕濮瑋鐢硘鎵秥鍫祙鍐墊瀹皘閮闆峾閮鐠﹟妗憒妗倈婵畖鐗泑瀵縷閫殀杈箌鎵坾鐕晐鍐|閮弢娴灏殀鍐渱娓﹟鍒珅搴剕鏅弢鏌磡鐬縷闃巪鍏厊鎱晐杩瀨鑼箌涔爘瀹鑹緗楸紎瀹箌鍚憒鍙鏄搢鎱巪鎴坾寤東搴緗缁坾鏆▅灞厊琛姝閮絴鑰縷婊寮榺鍖鍥絴鏂噟瀵噟骞縷绂剕闃檤涓渱娆娈硘娌億鍒﹟钄殀瓒妡澶攟闅唡甯坾宸﹟鍘峾鑱倈鏅亅鍕緗鏁東铻峾鍐穦瑷緗杈泑闃殀閭绠|楗秥绌簗鏇緗姣媩娌檤涔渱鍏粅闉爘椤粅涓皘宸鍏硘钂瘄鐩竱鏌寰寍鑽唡绾娓竱绔簗鏉億閫瘄鐩東鐩妡妗搢鍏瑋涓囦繜|鍙搁┈|涓婂畼|娆ч槼|澶忎警|璇歌憶|闂讳汉|涓滄柟|璧繛|鐨囩敨|灏夎繜|鍏緤|婢瑰彴|鍏喍|瀹楁斂|婵槼|娣充簬|鍗曚簬|澶彅|鐢冲睜|鍏瓩|浠插瓩|杞╄緯|浠ょ嫄|閽熺|瀹囨枃|闀垮瓩|鎱曞|椴滀簬|闂句笜|鍙稿緬|鍙哥┖|浜撳畼|鍙稿瘒|浠墊鐫瀛愯溅|棰涘瓩|绔湪|宸┈|鍏タ|婕嗛洉|涔愭|澹ら┓|鍏壇|鎷撹穻|澶硅胺|瀹扮埗|璋锋|鏅媩妤殀闂珅娉晐姹潀閯娑倈閽娈靛共|鐧鹃噷|涓滈儹|鍗楅棬|鍛煎欢|褰抾娴穦缇婅垖|寰敓|宀硘甯厊缂憒浜鍐祙鍚巪鏈墊鐞磡姊佷笜|宸︿笜|涓滈棬|瑗块棬|鍟唡鐗焲浣榺浣磡浼瘄璧弢鍗楀|澧▅鍝坾璋瘄绗獆骞磡鐖眧闃硘浣焲绗簲|瑷|绂)[\u4e00-\u9fa5]{1,3}$""";
+
+ public const string RGXL_CRON
+ = "^\\s*($|#|\\w+\\s*=|(\\?|\\*|(?:[0-5]?\\d)(?:(?:-|\\/|\\,)(?:[0-5]?\\d))?(?:,(?:[0-5]?\\d)(?:(?:-|\\/|\\,)(?:[0-5]?\\d))?)*)\\s+(\\?|\\*|(?:[0-5]?\\d)(?:(?:-|\\/|\\,)(?:[0-5]?\\d))?(?:,(?:[0-5]?\\d)(?:(?:-|\\/|\\,)(?:[0-5]?\\d))?)*)\\s+(\\?|\\*|(?:[01]?\\d|2[0-3])(?:(?:-|\\/|\\,)(?:[01]?\\d|2[0-3]))?(?:,(?:[01]?\\d|2[0-3])(?:(?:-|\\/|\\,)(?:[01]?\\d|2[0-3]))?)*)\\s+(\\?|\\*|(?:0?[1-9]|[12]\\d|3[01])(?:(?:-|\\/|\\,)(?:0?[1-9]|[12]\\d|3[01]))?(?:,(?:0?[1-9]|[12]\\d|3[01])(?:(?:-|\\/|\\,)(?:0?[1-9]|[12]\\d|3[01]))?)*)\\s+(\\?|\\*|(?:[1-9]|1[012])(?:(?:-|\\/|\\,)(?:[1-9]|1[012]))?(?:L|W)?(?:,(?:[1-9]|1[012])(?:(?:-|\\/|\\,)(?:[1-9]|1[012]))?(?:L|W)?)*|\\?|\\*|(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:-)(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?(?:,(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:-)(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?)*)\\s+(\\?|\\*|(?:[0-6])(?:(?:-|\\/|\\,|#)(?:[0-6]))?(?:L)?(?:,(?:[0-6])(?:(?:-|\\/|\\,|#)(?:[0-6]))?(?:L)?)*|\\?|\\*|(?:MON|TUE|WED|THU|FRI|SAT|SUN)(?:(?:-)(?:MON|TUE|WED|THU|FRI|SAT|SUN))?(?:,(?:MON|TUE|WED|THU|FRI|SAT|SUN)(?:(?:-)(?:MON|TUE|WED|THU|FRI|SAT|SUN))?)*)(|\\s)+(\\?|\\*|(?:|\\d{4})(?:(?:-|\\/|\\,)(?:|\\d{4}))?(?:,(?:|\\d{4})(?:(?:-|\\/|\\,)(?:|\\d{4}))?)*))$";
+
+ public const string RGXL_EMAIL
+ = """^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$""";
+
+ public const string RGXL_IP_V4
+ = @"^(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})){3}$";
+
public const string TPL_DATE_HH_MM_SS_FFFFFF = "HH:mm:ss.ffffff";
public const string TPL_DATE_YYYY_MM_DD = "yyyy-MM-dd";
public const string TPL_DATE_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
diff --git a/src/backend/NetAdmin.Infrastructure/Constant/Numbers.cs b/src/backend/NetAdmin.Infrastructure/Constant/Numbers.cs
index 084a9788..657a0475 100644
--- a/src/backend/NetAdmin.Infrastructure/Constant/Numbers.cs
+++ b/src/backend/NetAdmin.Infrastructure/Constant/Numbers.cs
@@ -10,17 +10,22 @@ namespace NetAdmin.Infrastructure.Constant;
///
public static class Numbers
{
- public const int BULK_REQ_LIMIT = 100; // 鎵归噺璇锋眰鍏佽鐨勬渶澶ф暟閲
- public const int CONSOLE_LINE_LEN_LIMIT = 8192; // 鎺у埗鍙拌緭鍑虹殑鏈澶ч暱搴
- public const long DEF_SORT_VAL = 100; // 鎺掑簭榛樿鍊
- public const long DIC_CATALOG_ID_GEO_AREA = 379794295185413; // 瀛楀吀鐩綍缂栧彿-琛屾斂鍖哄垝瀛楀吀
- public const int HTTP_STATUS_BIZ_FAIL = 900; // Http鐘舵佺爜-涓氬姟寮傚父
- public const int QUERY_DEF_PAGE_SIZE = 20; // 鍒嗛〉鏌ヨ榛樿鐨勯〉瀹归噺
- public const int QUERY_LIMIT = 100; // 闈炲垎椤垫煡璇㈠厑璁歌繑鍥炵殑鏈澶ф潯鏁
- public const int QUERY_MAX_PAGE_NO = 1000; // 鍒嗛〉鏌ヨ鍏佽鏈澶х殑椤电爜
- public const int QUERY_MAX_PAGE_SIZE = 100; // 鍒嗛〉鏌ヨ鍏佽鏈澶х殑椤靛閲
- public const int RED_LOCK_EXPIRY_TIME_SECS = 30; // red lock锛 閿侀攣瀹氳繃鏈熸椂闂达紝閿佸尯鍩熷唴鐨勯昏緫鎵ц濡傛灉瓒呰繃杩囨湡鏃堕棿锛岄攣灏嗚閲婃斁
- public const int RED_LOCK_RETRY_TIME_SECS = 1; // red lock锛 閿佺瓑寰呮椂闂村唴锛屽涔呭皾璇曡幏鍙栦竴娆
- public const int RED_LOCK_WAIT_TIME_SECS = 10; // red lock锛 閿佺瓑寰呮椂闂,鐩稿悓鐨 resource 濡傛灉褰撳墠鐨勯攣琚叾浠栫嚎绋嬪崰鐢,鏈澶氱瓑寰呮椂闂
- public const int TIMEOUT_SECS_JOB = 600; // 瓒呮椂鏃堕棿锛氫綔涓
+ public const int DEF_PAGE_SIZE_QUERY = 20; // 鍒嗛〉鏌ヨ榛樿鐨勯〉瀹归噺
+ public const long DEF_SORT_VAL = 100; // 鎺掑簭榛樿鍊
+
+ public const int HTTP_STATUS_BIZ_FAIL = 900; // Http鐘舵佺爜-涓氬姟寮傚父
+ public const long ID_DIC_CATALOG_GEO_AREA = 379794295185413; // 鍞竴缂栧彿锛氬瓧鍏哥洰褰-琛屾斂鍖哄垝瀛楀吀
+
+ public const int MAX_LIMIT_BULK_REQ = 100; // 鏈澶ч檺鍒讹細鎵归噺璇锋眰鏁
+ public const int MAX_LIMIT_PRINT_LEN_CONTENT = 4096; // 鏈澶ч檺鍒讹細鎵撳嵃闀垮害锛圚TTP 鍐呭锛
+ public const int MAX_LIMIT_PRINT_LEN_SQL = 4096; // 鏈澶ч檺鍒讹細鎵撳嵃闀垮害锛圫QL 璇彞锛
+ public const int MAX_LIMIT_QUERY = 1000; // 鏈澶ч檺鍒讹細闈炲垎椤垫煡璇㈡潯鏁
+ public const int MAX_LIMIT_QUERY_PAGE_NO = 10000; // 鏈澶ч檺鍒讹細鍒嗛〉鏌ヨ椤电爜
+ public const int MAX_LIMIT_QUERY_PAGE_SIZE = 100; // 鏈澶ч檺鍒讹細鍒嗛〉鏌ヨ椤靛閲
+
+ public const int SECS_CACHE_DEFAULT = 60; // 绉掞細缂撳瓨鏃堕棿-榛樿
+ public const int SECS_RED_LOCK_EXPIRY = 30; // 绉掞細RedLock-閿佽繃鏈熸椂闂达紝閿佸尯鍩熷唴鐨勯昏緫鎵ц濡傛灉瓒呰繃杩囨湡鏃堕棿锛岄攣灏嗚閲婃斁
+ public const int SECS_RED_LOCK_RETRY = 1; // 绉掞細RedLock-閿佺瓑寰呮椂闂村唴锛屽涔呭皾璇曡幏鍙栦竴娆
+ public const int SECS_RED_LOCK_WAIT = 10; // 绉掞細RedLock-閿佺瓑寰呮椂闂达紝鐩稿悓鐨 resource 濡傛灉褰撳墠鐨勯攣琚叾浠栫嚎绋嬪崰鐢紝鏈澶氱瓑寰呮椂闂
+ public const int SECS_TIMEOUT_JOB = 600; // 绉掞細瓒呮椂鏃堕棿-浣滀笟
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Infrastructure/Enums/Orders.cs b/src/backend/NetAdmin.Infrastructure/Enums/Orders.cs
index 107161bd..ddf38249 100644
--- a/src/backend/NetAdmin.Infrastructure/Enums/Orders.cs
+++ b/src/backend/NetAdmin.Infrastructure/Enums/Orders.cs
@@ -19,4 +19,12 @@ public enum Orders
///
[ResourceDescription(nameof(Ln.鍊掑簭鎺掑簭))]
Descending = 2
+
+ ,
+
+ ///
+ /// 闅忔満鎺掑簭
+ ///
+ [ResourceDescription(nameof(Ln.闅忔満鎺掑簭))]
+ Random = 3
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Infrastructure/Exceptions/NetAdminGetLockerException.cs b/src/backend/NetAdmin.Infrastructure/Exceptions/NetAdminGetLockerException.cs
index 299d2775..bc97519a 100644
--- a/src/backend/NetAdmin.Infrastructure/Exceptions/NetAdminGetLockerException.cs
+++ b/src/backend/NetAdmin.Infrastructure/Exceptions/NetAdminGetLockerException.cs
@@ -4,5 +4,5 @@ namespace NetAdmin.Infrastructure.Exceptions;
/// 鍔犻攣澶辫触寮傚父
///
#pragma warning disable RCS1194
-public sealed class NetAdminGetLockerException : NetAdminUnexpectedException;
+public sealed class NetAdminGetLockerException : NetAdminException;
#pragma warning restore RCS1194
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Infrastructure/Extensions/HttpContextExtensions.cs b/src/backend/NetAdmin.Infrastructure/Extensions/HttpContextExtensions.cs
new file mode 100644
index 00000000..daad770e
--- /dev/null
+++ b/src/backend/NetAdmin.Infrastructure/Extensions/HttpContextExtensions.cs
@@ -0,0 +1,25 @@
+namespace NetAdmin.Infrastructure.Extensions;
+
+///
+/// HttpContext 鎵╁睍鏂规硶
+///
+public static class HttpContextExtensions
+{
+ ///
+ /// 鑾峰彇瀹㈡埛绔湡瀹濱P
+ ///
+ public static IPAddress GetRealIpAddress(this HttpContext me)
+ {
+ #pragma warning disable IDE0046
+ if (me.Request.Headers.TryGetValue(Chars.FLG_HTTP_HEADER_KEY_X_FORWARDED_FOR, out var ips1) &&
+ #pragma warning restore IDE0046
+ IPAddress.TryParse(ips1.FirstOrDefault()?.Split(',').FirstOrDefault(), out var ip1)) {
+ return ip1;
+ }
+
+ return me.Request.Headers.TryGetValue(Chars.FLG_HTTP_HEADER_KEY_X_REAL_IP, out var ips2) &&
+ IPAddress.TryParse(ips2.FirstOrDefault()?.Split(',').FirstOrDefault(), out var ip2)
+ ? ip2
+ : me.Connection.RemoteIpAddress;
+ }
+}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Infrastructure/Extensions/HttpRequestMessageExtensions.cs b/src/backend/NetAdmin.Infrastructure/Extensions/HttpRequestMessageExtensions.cs
index 7a2ab462..34306ad1 100644
--- a/src/backend/NetAdmin.Infrastructure/Extensions/HttpRequestMessageExtensions.cs
+++ b/src/backend/NetAdmin.Infrastructure/Extensions/HttpRequestMessageExtensions.cs
@@ -19,7 +19,8 @@ public static class HttpRequestMessageExtensions
///
public static async Task LogAsync(this HttpRequestMessage me, ILogger logger)
{
- logger.Info($"HTTP Request: {await me.BuildJsonAsync().ConfigureAwait(false)}");
+ logger.Info(
+ $"HTTP Request: {(await me.BuildJsonAsync().ConfigureAwait(false))?.Sub(0, Numbers.MAX_LIMIT_PRINT_LEN_CONTENT)}");
return me;
}
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.Infrastructure/Extensions/HttpResponseMessageExtensions.cs b/src/backend/NetAdmin.Infrastructure/Extensions/HttpResponseMessageExtensions.cs
index 2375df83..408052a3 100644
--- a/src/backend/NetAdmin.Infrastructure/Extensions/HttpResponseMessageExtensions.cs
+++ b/src/backend/NetAdmin.Infrastructure/Extensions/HttpResponseMessageExtensions.cs
@@ -11,7 +11,9 @@ public static class HttpResponseMessageExtensions
public static async Task LogAsync(this HttpResponseMessage me, ILogger logger
, Func bodyPreHandle = null)
{
- logger.Info(await me.BuildJsonAsync(bodyPreHandle).ConfigureAwait(false));
+ logger.Info(
+ (await me.BuildJsonAsync(bodyPreHandle).ConfigureAwait(false))?.Sub(
+ 0, Numbers.MAX_LIMIT_PRINT_LEN_CONTENT));
}
///
@@ -20,7 +22,8 @@ public static class HttpResponseMessageExtensions
public static async Task LogExceptionAsync(this HttpResponseMessage me, string errors, ILogger logger
, Func bodyHandle = null)
{
- logger.Warn($"{errors}: {await me.BuildJsonAsync(bodyHandle).ConfigureAwait(false)}");
+ logger.Warn(
+ $"{errors}: {(await me.BuildJsonAsync(bodyHandle).ConfigureAwait(false))?.Sub(0, Numbers.MAX_LIMIT_PRINT_LEN_CONTENT)}");
}
///
diff --git a/src/backend/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj b/src/backend/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj
index 32a60da1..0b3640c9 100644
--- a/src/backend/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj
+++ b/src/backend/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj
@@ -7,12 +7,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/src/backend/NetAdmin.Infrastructure/Utils/UserAgentParser.cs b/src/backend/NetAdmin.Infrastructure/Utils/UserAgentParser.cs
index 7d8e4965..bed3156a 100644
--- a/src/backend/NetAdmin.Infrastructure/Utils/UserAgentParser.cs
+++ b/src/backend/NetAdmin.Infrastructure/Utils/UserAgentParser.cs
@@ -315,8 +315,9 @@ public sealed class UserAgentParser
private bool SetPlatform()
{
- var kv = _platforms.First(x => //
- Regex.IsMatch(_agent, $"{Regex.Escape(x.Key)}", RegexOptions.IgnoreCase));
+ var kv = _platforms.FirstOrDefault(x => //
+ Regex.IsMatch(_agent, $"{Regex.Escape(x.Key)}"
+ , RegexOptions.IgnoreCase));
if (kv.Key == null) {
Platform = "Unknown Platform";
diff --git a/src/backend/NetAdmin.Infrastructure/commonSettings.json b/src/backend/NetAdmin.Infrastructure/commonSettings.json
index 3e0c3ef0..346aaad0 100644
--- a/src/backend/NetAdmin.Infrastructure/commonSettings.json
+++ b/src/backend/NetAdmin.Infrastructure/commonSettings.json
@@ -297,8 +297,8 @@
// 鏁版嵁缂撳瓨
{
"Name": "DataCache",
- "ConnStr": "localhost:6379",
- "Database": 0
+ "ConnStr": "localhost:6379,abortConnect=false",
+ "DataBase": 0,
}
]
},
diff --git a/src/backend/NetAdmin.ScheduledService/Startup.cs b/src/backend/NetAdmin.ScheduledService/Startup.cs
index a61503b5..5e0d2552 100644
--- a/src/backend/NetAdmin.ScheduledService/Startup.cs
+++ b/src/backend/NetAdmin.ScheduledService/Startup.cs
@@ -24,12 +24,12 @@ public sealed class Startup : Host.Startup
///
/// 閰嶇疆搴旂敤绋嬪簭涓棿浠
///
- public void Configure(IApplicationBuilder app)
+ public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifeTime)
{
- _ = app //
- .UseRealIp() // 浣跨敤RealIp涓棿浠讹紝鐢ㄤ簬鑾峰彇鐪熷疄瀹㈡埛绔疘P鍦板潃
- .EnableBuffering() // 鍚敤璇锋眰浣撶紦鍐诧紝鍏佽澶氭璇诲彇璇锋眰浣
- .UseMiddleware() // 浣跨敤RequestAuditMiddleware涓棿浠讹紝鎵ц璇锋眰瀹¤
+ _ = app //
+ .UseMiddleware() // 瀹夊叏鍋滄満涓棿浠
+ .EnableBuffering() // 鍚敤璇锋眰浣撶紦鍐诧紝鍏佽澶氭璇诲彇璇锋眰浣
+ .UseMiddleware() // 浣跨敤RequestAuditMiddleware涓棿浠讹紝鎵ц璇锋眰瀹¤
#if DEBUG
.UseOpenApiSkin() // 浣跨敤OpenApiSkin涓棿浠讹紙浠呭湪璋冭瘯妯″紡涓嬶級锛屾彁渚汼wagger UI鐨偆
#else
@@ -41,6 +41,7 @@ public sealed class Startup : Host.Startup
.UseRouting() // 浣跨敤Routing涓棿浠讹紝閰嶇疆璺敱鏄犲皠
.UseMiddleware() // 浣跨敤RemoveNullNodeMiddleware涓棿浠讹紝鍒犻櫎JSON涓殑绌鸿妭鐐
.UseEndpoints(); // 閰嶇疆绔偣浠ュ鐞嗚姹
+ _ = lifeTime.ApplicationStopping.Register(SafetyShopHostMiddleware.OnStopping);
}
///
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs
index 3a5f2efb..aa594f0f 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs
@@ -21,6 +21,13 @@ public sealed class ApiService(
throw new NotImplementedException();
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public Task CreateAsync(CreateApiReq req)
{
@@ -140,9 +147,12 @@ public sealed class ApiService(
private ISelect QueryInternal(QueryReq req)
{
- var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
- .WhereDynamic(req.Filter)
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.CreatedTime), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.CreatedTime);
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/CacheService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/CacheService.cs
index 4a562a9a..f97f1e6c 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/CacheService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/CacheService.cs
@@ -10,11 +10,21 @@ namespace NetAdmin.SysComponent.Application.Services.Sys;
public sealed class CacheService(IConnectionMultiplexer connectionMultiplexer) //
: ServiceBase, ICacheService
{
+ private readonly InstanceNode _redisInstance;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public CacheService(IConnectionMultiplexer connectionMultiplexer, IOptions redisOptions) //
+ : this(connectionMultiplexer) //
+ {
+ _redisInstance = redisOptions.Value.Instances.First(x => x.Name == Chars.FLG_REDIS_INSTANCE_DATA_CACHE);
+ }
+
///
public async Task CacheStatisticsAsync()
{
- var database = connectionMultiplexer.GetDatabase();
-
+ var database = connectionMultiplexer.GetDatabase(_redisInstance.Database);
return new CacheStatisticsRsp((string)await database.ExecuteAsync("info").ConfigureAwait(false)) {
DbSize = (long)await database.ExecuteAsync("dbSize").ConfigureAwait(false)
};
@@ -24,7 +34,7 @@ public sealed class CacheService(IConnectionMultiplexer connectionMultiplexer) /
public async Task> GetAllEntriesAsync(PagedQueryReq req)
{
req.ThrowIfInvalid();
- var database = connectionMultiplexer.GetDatabase((int?)req.Filter?.DbIndex ?? 0);
+ var database = connectionMultiplexer.GetDatabase(_redisInstance.Database);
var redisResults = (RedisResult[])await database
.ExecuteAsync("scan", (req.Page - 1) * req.PageSize, "count"
, req.PageSize)
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs
index ff5d26e8..a2df5a5d 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs
@@ -26,6 +26,13 @@ public sealed class ConfigService(DefaultRepository rpo) //
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public async Task CreateAsync(CreateConfigReq req)
{
@@ -113,8 +120,12 @@ public sealed class ConfigService(DefaultRepository rpo) //
.Include(a => a.UserRegisterRole)
.WhereDynamicFilter(req.DynamicFilter)
.WhereIf( //
- req.Filter?.Enabled.HasValue ?? false, a => a.Enabled == req.Filter.Enabled.Value)
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ req.Filter?.Enabled.HasValue ?? false, a => a.Enabled == req.Filter.Enabled.Value);
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.Id);
}
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConstantService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConstantService.cs
index 6979b22f..29a43831 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConstantService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConstantService.cs
@@ -18,17 +18,28 @@ public sealed class ConstantService : ServiceBase, IConstantSe
///
public IDictionary> GetEnums()
{
- return App.EffectiveTypes.Where(x => x.IsEnum && x.GetCustomAttribute(false) != null)
- .ToDictionary(x => x.Name, x => //
- x.GetEnumValues()
- .Cast()
- .ToDictionary( //
- y => y.ToString()
- , y => new[] {
- Convert.ToInt64(y, CultureInfo.InvariantCulture)
- .ToString(CultureInfo.InvariantCulture)
- , y.ResDesc()
- }));
+ var ret = App.EffectiveTypes.Where(x => x.IsEnum && x.GetCustomAttribute(false) != null)
+ .ToDictionary(x => x.Name, x => //
+ x.GetEnumValues()
+ .Cast()
+ .ToDictionary( //
+ y => y.ToString()
+ , y => new[] {
+ Convert.ToInt64(y, CultureInfo.InvariantCulture)
+ .ToString(CultureInfo.InvariantCulture)
+ , y.ResDesc()
+ }));
+
+ ret.Add($"{nameof(HttpStatusCode)}s", Enum.GetNames()
+ .ToDictionary( //
+ x => x, x => new[] {
+ Convert.ToInt64( //
+ Enum.Parse(x)
+ , CultureInfo.InvariantCulture)
+ .ToString(CultureInfo.InvariantCulture)
+ , x
+ }));
+ return ret;
}
///
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs
index 1b1df69b..b6ae5d54 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs
@@ -25,6 +25,13 @@ public sealed class DeptService(DefaultRepository rpo) //
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
/// Parent_department_does_not_exist
public async Task CreateAsync(CreateDeptReq req)
@@ -88,12 +95,11 @@ public sealed class DeptService(DefaultRepository rpo) //
}
///
- /// NetAdminUnexpectedException
public async Task UpdateAsync(UpdateDeptReq req)
{
req.ThrowIfInvalid();
return await Rpo.UpdateDiy.SetSource(req).ExecuteAffrowsAsync().ConfigureAwait(false) <= 0
- ? throw new NetAdminUnexpectedException()
+ ? null
: (await QueryInternal(new QueryReq { Filter = new QueryDeptReq { Id = req.Id } }, true)
.ToTreeListAsync()
.ConfigureAwait(false))[0]
@@ -118,6 +124,10 @@ public sealed class DeptService(DefaultRepository rpo) //
ret = ret.AsTreeCte();
}
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Sort), StringComparison.OrdinalIgnoreCase) ?? true) {
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs
index 98fb1298..fc5f85a5 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs
@@ -25,6 +25,13 @@ public sealed class DicCatalogService(DefaultRepository rpo) //
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
/// The_parent_node_does_not_exist
public async Task CreateAsync(CreateDicCatalogReq req)
@@ -88,7 +95,6 @@ public sealed class DicCatalogService(DefaultRepository rpo) //
///
/// The_parent_node_does_not_exist
- /// NetAdminUnexpectedException
public async Task UpdateAsync(UpdateDicCatalogReq req)
{
req.ThrowIfInvalid();
@@ -98,7 +104,7 @@ public sealed class DicCatalogService(DefaultRepository rpo) //
}
if (await Rpo.UpdateDiy.SetSource(req).ExecuteAffrowsAsync().ConfigureAwait(false) <= 0) {
- throw new NetAdminUnexpectedException();
+ return null;
}
var ret = await Rpo.Where(a => a.Id == req.Id).ToOneAsync().ConfigureAwait(false);
@@ -113,9 +119,12 @@ public sealed class DicCatalogService(DefaultRepository rpo) //
private ISelect QueryInternal(QueryReq req)
{
- var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
- .WhereDynamic(req.Filter)
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.Id);
}
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs
index bb16f0f7..e4582e98 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs
@@ -25,6 +25,13 @@ public sealed class DicContentService(DefaultRepository rpo) //
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
/// Dictionary_directory_does_not_exist
public async Task CreateAsync(CreateDicContentReq req)
@@ -90,7 +97,6 @@ public sealed class DicContentService(DefaultRepository rpo) //
///
/// Dictionary_directory_does_not_exist
- /// NetAdminUnexpectedException
public async Task UpdateAsync(UpdateDicContentReq req)
{
req.ThrowIfInvalid();
@@ -103,7 +109,7 @@ public sealed class DicContentService(DefaultRepository rpo) //
}
if (await Rpo.UpdateDiy.SetSource(req).ExecuteAffrowsAsync().ConfigureAwait(false) <= 0) {
- throw new NetAdminUnexpectedException();
+ return null;
}
var ret = await Rpo.Where(a => a.Id == req.Id).ToOneAsync().ConfigureAwait(false);
@@ -118,9 +124,12 @@ public sealed class DicContentService(DefaultRepository rpo) //
private ISelect QueryInternal(QueryReq req)
{
- var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
- .WhereDynamic(req.Filter)
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.Id);
}
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/JobRecordService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/JobRecordService.cs
index 2803d4c2..648e2845 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/JobRecordService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/JobRecordService.cs
@@ -26,6 +26,13 @@ public sealed class JobRecordService(DefaultRepository rpo) //
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public async Task CreateAsync(CreateJobRecordReq req)
{
@@ -106,8 +113,12 @@ public sealed class JobRecordService(DefaultRepository rpo) //
.WhereDynamic(req.Filter)
.WhereIf( //
req.Keywords?.Length > 0
- , a => a.JobId == req.Keywords.Int64Try(0) || a.Id == req.Keywords.Int64Try(0))
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ , a => a.JobId == req.Keywords.Int64Try(0) || a.Id == req.Keywords.Int64Try(0));
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.Id);
}
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/JobService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/JobService.cs
index a253961b..0dc70fe0 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/JobService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/JobService.cs
@@ -29,6 +29,13 @@ public sealed class JobService(DefaultRepository rpo, IJobRecordService
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public async Task CreateAsync(CreateJobReq req)
{
@@ -119,13 +126,14 @@ public sealed class JobService(DefaultRepository rpo, IJobRecordService
}
]
};
- var job = await QueryInternal(new QueryReq { DynamicFilter = df, Count = 1 }, true)
- .Where(a => !Rpo.Orm.Select()
- .As("b")
- .Where(b => b.JobId == a.Id && b.TimeId == a.NextTimeId)
- .Any())
- .ToOneAsync()
- .ConfigureAwait(false);
+ var job
+ = await QueryInternal(new QueryReq { DynamicFilter = df, Count = 1, Order = Orders.Random })
+ .Where(a => !Rpo.Orm.Select()
+ .As("b")
+ .Where(b => b.JobId == a.Id && b.TimeId == a.NextTimeId)
+ .Any())
+ .ToOneAsync()
+ .ConfigureAwait(false);
return job == null
? null
: await UpdateAsync(job.Adapt() with {
@@ -175,7 +183,7 @@ public sealed class JobService(DefaultRepository rpo, IJobRecordService
{
return Rpo.UpdateDiy.Set(a => a.Status == JobStatues.Idle)
.Where(a => a.Status == JobStatues.Running &&
- a.LastExecTime < DateTime.Now.AddSeconds(-Numbers.TIMEOUT_SECS_JOB))
+ a.LastExecTime < DateTime.Now.AddSeconds(-Numbers.SECS_TIMEOUT_JOB))
.ExecuteAffrowsAsync();
}
@@ -211,17 +219,23 @@ public sealed class JobService(DefaultRepository rpo, IJobRecordService
.GetNextOccurrence(DateTime.UtcNow, TimeZoneInfo.Utc);
}
- private ISelect QueryInternal(QueryReq req, bool orderByRandom = false)
+ private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.Include(a => a.User)
.WhereDynamicFilter(req.DynamicFilter)
.WhereDynamic(req.Filter)
.WhereIf( //
req.Keywords?.Length > 0
- , a => a.Id == req.Keywords.Int64Try(0) || a.JobName.Contains(req.Keywords))
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
- return !orderByRandom && (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true)
- ? ret.OrderByDescending(a => a.LastExecTime)
- : ret.OrderByRandom();
+ , a => a.Id == req.Keywords.Int64Try(0) || a.JobName.Contains(req.Keywords));
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ if (!req.Prop?.Equals(nameof(req.Filter.LastExecTime), StringComparison.OrdinalIgnoreCase) ?? true) {
+ ret = ret.OrderByDescending(a => a.LastExecTime);
+ }
+
+ return ret;
}
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs
index 272a1aba..46e73c68 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs
@@ -25,6 +25,13 @@ public sealed class MenuService(DefaultRepository rpo, IUserService us
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public async Task CreateAsync(CreateMenuReq req)
{
@@ -37,12 +44,12 @@ public sealed class MenuService(DefaultRepository rpo, IUserService us
public async Task DeleteAsync(DelReq req)
{
req.ThrowIfInvalid();
- var effect = await Rpo.DeleteAsync(a => a.Id == req.Id).ConfigureAwait(false);
- effect += await Rpo.Orm.Delete()
- .Where(a => a.MenuId == req.Id)
- .ExecuteAffrowsAsync()
- .ConfigureAwait(false);
- return effect;
+ var ret = await Rpo.DeleteAsync(a => a.Id == req.Id).ConfigureAwait(false);
+ _ = await Rpo.Orm.Delete()
+ .Where(a => a.MenuId == req.Id)
+ .ExecuteAffrowsAsync()
+ .ConfigureAwait(false);
+ return ret;
}
///
@@ -76,12 +83,11 @@ public sealed class MenuService(DefaultRepository rpo, IUserService us
}
///
- /// NetAdminUnexpectedException
public async Task UpdateAsync(UpdateMenuReq req)
{
req.ThrowIfInvalid();
if (await Rpo.UpdateDiy.SetSource(req).ExecuteAffrowsAsync().ConfigureAwait(false) <= 0) {
- throw new NetAdminUnexpectedException();
+ return null;
}
var ret = await Rpo.Where(a => a.Id == req.Id).ToOneAsync().ConfigureAwait(false);
@@ -124,11 +130,12 @@ public sealed class MenuService(DefaultRepository rpo, IUserService us
private ISelect QueryInternal(QueryReq req)
{
- return Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
- .WhereDynamic(req.Filter)
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending)
- .OrderByDescending(a => a.Sort)
- .OrderBy(a => a.Name)
- .OrderBy(a => a.Id);
+ var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
+ return req.Order == Orders.Random
+ ? ret.OrderByRandom()
+ : ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending)
+ .OrderByDescending(a => a.Sort)
+ .OrderBy(a => a.Name)
+ .OrderBy(a => a.Id);
}
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs
index 77a138b4..f4244f5d 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs
@@ -25,6 +25,13 @@ public sealed class RequestLogService(DefaultRepository rpo) //
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public async Task CreateAsync(CreateRequestLogReq req)
{
@@ -106,10 +113,12 @@ public sealed class RequestLogService(DefaultRepository rpo) //
private ISelect QueryInternal(QueryReq req)
{
- var ret = Rpo.Select.Include(a => a.Api)
- .WhereDynamicFilter(req.DynamicFilter)
- .WhereDynamic(req.Filter)
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ var ret = Rpo.Select.Include(a => a.Api).WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.CreatedTime), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.CreatedTime);
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs
index 2bd51353..4399b80d 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs
@@ -25,6 +25,13 @@ public sealed class RoleService(DefaultRepository rpo) //
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public async Task CreateAsync(CreateRoleReq req)
{
@@ -116,8 +123,12 @@ public sealed class RoleService(DefaultRepository rpo) //
.WhereIf( //
req.Keywords?.Length > 0
, a => a.Id == req.Keywords.Int64Try(0) || a.Name.Contains(req.Keywords) ||
- a.Summary.Contains(req.Keywords))
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ a.Summary.Contains(req.Keywords));
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Sort), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.Sort);
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgDeptService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgDeptService.cs
index e306ddbc..d327c196 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgDeptService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgDeptService.cs
@@ -26,6 +26,13 @@ public sealed class SiteMsgDeptService(DefaultRepository rpo) /
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public async Task CreateAsync(CreateSiteMsgDeptReq req)
{
@@ -102,9 +109,12 @@ public sealed class SiteMsgDeptService(DefaultRepository rpo) /
private ISelect QueryInternal(QueryReq req)
{
- var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
- .WhereDynamic(req.Filter)
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.Id);
}
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgFlagService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgFlagService.cs
index b21d739e..94229a36 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgFlagService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgFlagService.cs
@@ -26,6 +26,13 @@ public sealed class SiteMsgFlagService(DefaultRepository rpo) /
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public async Task CreateAsync(CreateSiteMsgFlagReq req)
{
@@ -108,9 +115,12 @@ public sealed class SiteMsgFlagService(DefaultRepository rpo) /
private ISelect QueryInternal(QueryReq req)
{
- var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
- .WhereDynamic(req.Filter)
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.Id);
}
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgRoleService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgRoleService.cs
index e77d2094..db347b54 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgRoleService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgRoleService.cs
@@ -26,6 +26,13 @@ public sealed class SiteMsgRoleService(DefaultRepository rpo) /
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public async Task CreateAsync(CreateSiteMsgRoleReq req)
{
@@ -102,9 +109,12 @@ public sealed class SiteMsgRoleService(DefaultRepository rpo) /
private ISelect QueryInternal(QueryReq req)
{
- var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
- .WhereDynamic(req.Filter)
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.Id);
}
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgService.cs
index d776ccd6..0c08a427 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgService.cs
@@ -12,8 +12,10 @@ using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
///
-public sealed class SiteMsgService(DefaultRepository rpo, ContextUserInfo contextUserInfo
- , ISiteMsgFlagService siteMsgFlagService) //
+public sealed class SiteMsgService(
+ DefaultRepository rpo
+ , ContextUserInfo contextUserInfo
+ , ISiteMsgFlagService siteMsgFlagService) //
: RepositoryService(rpo), ISiteMsgService
{
///
@@ -30,6 +32,13 @@ public sealed class SiteMsgService(DefaultRepository rpo, ContextUs
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public async Task CreateAsync(CreateSiteMsgReq req)
{
@@ -109,7 +118,7 @@ public sealed class SiteMsgService(DefaultRepository rpo, ContextUs
.Count(out var total)
.ToListAsync(a => new {
a.CreatedTime
- , a.Creator
+ , a.CreatedUserName
, a.Id
, a.MsgType
, a.Summary
@@ -275,8 +284,12 @@ public sealed class SiteMsgService(DefaultRepository rpo, ContextUs
.WhereIf( //
req.Keywords?.Length > 0
, a => a.Id == req.Keywords.Int64Try(0) || a.Title.Contains(req.Keywords) ||
- a.Summary.Contains(req.Keywords))
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ a.Summary.Contains(req.Keywords));
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.Id);
}
@@ -300,9 +313,9 @@ public sealed class SiteMsgService(DefaultRepository rpo, ContextUs
.WhereDynamicFilter(req.DynamicFilter)
.Where((a, _, c, d, e, f) =>
(SqlExt.EqualIsNull(f.UserSiteMsgStatus) ||
- f.UserSiteMsgStatus != UserSiteMsgStatues.Deleted) && (a.MsgType == SiteMsgTypes.Public ||
- c.DeptId == contextUserInfo.DeptId || roleIds.Contains(d.RoleId) ||
- e.UserId == contextUserInfo.Id))
+ f.UserSiteMsgStatus != UserSiteMsgStatues.Deleted) &&
+ (a.MsgType == SiteMsgTypes.Public || c.DeptId == contextUserInfo.DeptId ||
+ roleIds.Contains(d.RoleId) || e.UserId == contextUserInfo.Id))
.GroupBy((a, _, _, _, _, _) => a.Id);
}
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgUserService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgUserService.cs
index 8afc49b1..499cc4dd 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgUserService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgUserService.cs
@@ -26,6 +26,13 @@ public sealed class SiteMsgUserService(DefaultRepository rpo) /
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public async Task CreateAsync(CreateSiteMsgUserReq req)
{
@@ -102,9 +109,12 @@ public sealed class SiteMsgUserService(DefaultRepository rpo) /
private ISelect QueryInternal(QueryReq req)
{
- var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
- .WhereDynamic(req.Filter)
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.Id);
}
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs
index a6aa349a..72986d60 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs
@@ -27,6 +27,13 @@ public sealed class UserProfileService(DefaultRepository rpo) /
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public async Task CreateAsync(CreateUserProfileReq req)
{
@@ -146,18 +153,21 @@ public sealed class UserProfileService(DefaultRepository rpo) /
QueryReq req)
{
#pragma warning disable CA1305
- return Rpo.Orm.Select()
- .LeftJoin((a, b, _, __, ___) =>
- a.NationArea.ToString() == b.Value && b.CatalogId == Numbers.DIC_CATALOG_ID_GEO_AREA)
- .LeftJoin((a, _, c, __, ___) =>
- a.CompanyArea.ToString() == c.Value && c.CatalogId == Numbers.DIC_CATALOG_ID_GEO_AREA)
- .LeftJoin((a, _, __, d, ___) =>
- a.HomeArea.ToString() == d.Value && d.CatalogId == Numbers.DIC_CATALOG_ID_GEO_AREA)
- .LeftJoin((a, _, __, ___, e) => a.EmergencyContactArea.ToString() == e.Value &&
- e.CatalogId == Numbers.DIC_CATALOG_ID_GEO_AREA)
- .WhereDynamicFilter(req.DynamicFilter)
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending)
- .OrderByDescending((a, _, __, ___, ____) => a.Id);
+ var ret = Rpo.Orm.Select()
+ .LeftJoin((a, b, _, __, ___) =>
+ a.NationArea.ToString() == b.Value && b.CatalogId == Numbers.ID_DIC_CATALOG_GEO_AREA)
+ .LeftJoin((a, _, c, __, ___) =>
+ a.CompanyArea.ToString() == c.Value &&
+ c.CatalogId == Numbers.ID_DIC_CATALOG_GEO_AREA)
+ .LeftJoin((a, _, __, d, ___) =>
+ a.HomeArea.ToString() == d.Value && d.CatalogId == Numbers.ID_DIC_CATALOG_GEO_AREA)
+ .LeftJoin((a, _, __, ___, e) => a.EmergencyContactArea.ToString() == e.Value &&
+ e.CatalogId == Numbers.ID_DIC_CATALOG_GEO_AREA)
+ .WhereDynamicFilter(req.DynamicFilter);
+ return req.Order == Orders.Random
+ ? ret.OrderByRandom()
+ : ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending)
+ .OrderByDescending((a, _, __, ___, ____) => a.Id);
#pragma warning restore CA1305
}
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs
index ca5c3cfd..f636dbe3 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs
@@ -13,10 +13,11 @@ using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
namespace NetAdmin.SysComponent.Application.Services.Sys;
///
-public sealed class UserService(DefaultRepository rpo //
- , IUserProfileService userProfileService //
- , IVerifyCodeService verifyCodeService //
- , IEventPublisher eventPublisher) //
+public sealed class UserService(
+ DefaultRepository rpo //
+ , IUserProfileService userProfileService //
+ , IVerifyCodeService verifyCodeService //
+ , IEventPublisher eventPublisher) //
: RepositoryService(rpo), IUserService
{
private readonly Expression> _selectUserFields = a => new Sys_User {
@@ -63,6 +64,15 @@ public sealed class UserService(DefaultRepository rpo /
.ConfigureAwait(false);
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ #pragma warning disable VSTHRD103
+ return QueryInternal(req).CountAsync();
+ #pragma warning restore VSTHRD103
+ }
+
///
public async Task CreateAsync(CreateUserReq req)
{
@@ -88,20 +98,17 @@ public sealed class UserService(DefaultRepository rpo /
public async Task DeleteAsync(DelReq req)
{
req.ThrowIfInvalid();
- var effect = 0;
// 鍒犻櫎涓昏〃
- effect += await Rpo.DeleteAsync(req.Id).ConfigureAwait(false);
+ var ret = await Rpo.DeleteAsync(req.Id).ConfigureAwait(false);
// 鍒犻櫎鍒嗚〃
- effect += await Rpo.Orm.Delete(new { UserId = req.Id })
- .ExecuteAffrowsAsync()
- .ConfigureAwait(false);
+ _ = await Rpo.Orm.Delete(new { UserId = req.Id }).ExecuteAffrowsAsync().ConfigureAwait(false);
// 鍒犻櫎妗f琛
- effect += await userProfileService.DeleteAsync(req).ConfigureAwait(false);
+ _ = await userProfileService.DeleteAsync(req).ConfigureAwait(false);
- return effect;
+ return ret;
}
///
@@ -255,7 +262,7 @@ public sealed class UserService(DefaultRepository rpo /
.UpdateColumns(a => a.Avatar)
.ExecuteAffrowsAsync()
.ConfigureAwait(false) <= 0) {
- throw new NetAdminUnexpectedException();
+ return null;
}
var ret = (await QueryAsync(new QueryReq { Filter = new QueryUserReq { Id = UserToken.Id } })
@@ -289,7 +296,7 @@ public sealed class UserService(DefaultRepository rpo /
.UpdateColumns(a => a.Email)
.ExecuteAffrowsAsync()
.ConfigureAwait(false) <= 0) {
- throw new NetAdminUnexpectedException();
+ return null;
}
var ret = (await QueryAsync(new QueryReq { Filter = new QueryUserReq { Id = UserToken.Id } })
@@ -341,7 +348,7 @@ public sealed class UserService(DefaultRepository rpo /
.UpdateColumns(a => a.Mobile)
.ExecuteAffrowsAsync()
.ConfigureAwait(false) <= 0) {
- throw new NetAdminUnexpectedException();
+ return null;
}
var ret = (await QueryAsync(new QueryReq { Filter = new QueryUserReq { Id = UserToken.Id } })
@@ -370,7 +377,7 @@ public sealed class UserService(DefaultRepository rpo /
.UpdateColumns(a => a.Password)
.ExecuteAffrowsAsync()
.ConfigureAwait(false);
- return ret <= 0 ? throw new NetAdminUnexpectedException() : (uint)ret;
+ return (uint)ret;
}
///
@@ -478,9 +485,12 @@ public sealed class UserService(DefaultRepository rpo /
private ISelect QueryInternal(QueryReq req)
{
- var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
- .WhereDynamic(req.Filter)
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.Id);
}
@@ -511,8 +521,12 @@ public sealed class UserService(DefaultRepository rpo /
req.Keywords?.Length > 0
, a => a.Id == req.Keywords.Int64Try(0) || a.UserName.Contains(req.Keywords) ||
a.Mobile.Contains(req.Keywords) || a.Email.Contains(req.Keywords) ||
- a.Summary.Contains(req.Keywords))
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ a.Summary.Contains(req.Keywords));
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.CreatedTime), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.CreatedTime);
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs
index 310d0a41..af50d1f5 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs
@@ -30,6 +30,13 @@ public sealed class VerifyCodeService(DefaultRepository rpo, IEv
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public async Task CreateAsync(CreateVerifyCodeReq req)
{
@@ -180,9 +187,12 @@ public sealed class VerifyCodeService(DefaultRepository rpo, IEv
private ISelect QueryInternal(QueryReq req)
{
- var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
- .WhereDynamic(req.Filter)
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.Id);
}
diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Tpl/ExampleService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Tpl/ExampleService.cs
index a944b3d9..3ea2a791 100644
--- a/src/backend/NetAdmin.SysComponent.Application/Services/Tpl/ExampleService.cs
+++ b/src/backend/NetAdmin.SysComponent.Application/Services/Tpl/ExampleService.cs
@@ -26,6 +26,13 @@ public sealed class ExampleService(DefaultRepository rpo) //
return ret;
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req).CountAsync();
+ }
+
///
public async Task CreateAsync(CreateExampleReq req)
{
@@ -102,9 +109,12 @@ public sealed class ExampleService(DefaultRepository rpo) //
private ISelect QueryInternal(QueryReq req)
{
- var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
- .WhereDynamic(req.Filter)
- .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
+ var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
+ if (req.Order == Orders.Random) {
+ return ret.OrderByRandom();
+ }
+
+ ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.Id);
}
diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs
index 941e330e..6f87ea6b 100644
--- a/src/backend/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs
+++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs
@@ -16,6 +16,12 @@ public sealed class ApiCache(IDistributedCache cache, IApiService service) //
return Service.BulkDeleteAsync(req);
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ return Service.CountAsync(req);
+ }
+
///
public Task CreateAsync(CreateApiReq req)
{
diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/CacheCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/CacheCache.cs
index 10ebc7b7..767de483 100644
--- a/src/backend/NetAdmin.SysComponent.Cache/Sys/CacheCache.cs
+++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/CacheCache.cs
@@ -15,7 +15,7 @@ public sealed class CacheCache(IDistributedCache cache, ICacheService service) /
{
#if !DEBUG
return GetOrCreateAsync( //
- GetCacheKey(string.Empty), Service.CacheStatisticsAsync, TimeSpan.FromMinutes(1));
+ GetCacheKey(string.Empty), Service.CacheStatisticsAsync, TimeSpan.FromSeconds(Numbers.CACHE_SECS_DEFAULT));
#else
return Service.CacheStatisticsAsync();
#endif
diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/CaptchaCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/CaptchaCache.cs
index 07fd42ef..a671aa90 100644
--- a/src/backend/NetAdmin.SysComponent.Cache/Sys/CaptchaCache.cs
+++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/CaptchaCache.cs
@@ -14,7 +14,7 @@ public sealed class CaptchaCache(IDistributedCache cache, ICaptchaService servic
{
var captchaRsp = await Service.GetCaptchaImageAsync().ConfigureAwait(false);
await CreateAsync(GetCacheKey(captchaRsp.Id, nameof(CaptchaCache)), captchaRsp.SawOffsetX
-, TimeSpan.FromMinutes(1))
+ , TimeSpan.FromSeconds(Numbers.SECS_CACHE_DEFAULT))
.ConfigureAwait(false);
return captchaRsp;
}
diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs
index e4604a9f..21a2760b 100644
--- a/src/backend/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs
+++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs
@@ -16,6 +16,12 @@ public sealed class ConfigCache(IDistributedCache cache, IConfigService service)
return Service.BulkDeleteAsync(req);
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ return Service.CountAsync(req);
+ }
+
///
public Task CreateAsync(CreateConfigReq req)
{
diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs
index 14198619..96ccb347 100644
--- a/src/backend/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs
+++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs
@@ -16,6 +16,12 @@ public sealed class DeptCache(IDistributedCache cache, IDeptService service) //
return Service.BulkDeleteAsync(req);
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ return Service.CountAsync(req);
+ }
+
///
public Task CreateAsync(CreateDeptReq req)
{
diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/DicCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/DicCache.cs
index e3db5eb9..bcd5bd62 100644
--- a/src/backend/NetAdmin.SysComponent.Cache/Sys/DicCache.cs
+++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/DicCache.cs
@@ -65,7 +65,7 @@ public sealed class DicCache(IDistributedCache cache, IDicService service) //
#if !DEBUG
return GetOrCreateAsync( //
GetCacheKey(req.GetHashCode().ToString(CultureInfo.InvariantCulture)) //
- , () => Service.GetDicValueAsync(req), TimeSpan.FromMinutes(1));
+ , () => Service.GetDicValueAsync(req), TimeSpan.FromSeconds(Numbers.CACHE_SECS_DEFAULT));
#else
return Service.GetDicValueAsync(req);
#endif
diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs
index a18e8f40..f61cf800 100644
--- a/src/backend/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs
+++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs
@@ -16,6 +16,12 @@ public sealed class DicCatalogCache(IDistributedCache cache, IDicCatalogService
return Service.BulkDeleteAsync(req);
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ return Service.CountAsync(req);
+ }
+
///
public Task CreateAsync(CreateDicCatalogReq req)
{
diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs
index 42660519..ee0f096c 100644
--- a/src/backend/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs
+++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs
@@ -16,6 +16,12 @@ public sealed class DicContentCache(IDistributedCache cache, IDicContentService
return Service.BulkDeleteAsync(req);
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ return Service.CountAsync(req);
+ }
+
///
public Task CreateAsync(CreateDicContentReq req)
{
diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/JobCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/JobCache.cs
index 72871077..43dae216 100644
--- a/src/backend/NetAdmin.SysComponent.Cache/Sys/JobCache.cs
+++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/JobCache.cs
@@ -17,6 +17,12 @@ public sealed class JobCache(IDistributedCache cache, IJobService service)
return Service.BulkDeleteAsync(req);
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ return Service.CountAsync(req);
+ }
+
///
public Task CreateAsync(CreateJobReq req)
{
diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/JobRecordCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/JobRecordCache.cs
index e3cbfc1e..415c0922 100644
--- a/src/backend/NetAdmin.SysComponent.Cache/Sys/JobRecordCache.cs
+++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/JobRecordCache.cs
@@ -16,6 +16,12 @@ public sealed class JobRecordCache(IDistributedCache cache, IJobRecordService se
return Service.BulkDeleteAsync(req);
}
+ ///
+ public Task CountAsync(QueryReq req)
+ {
+ return Service.CountAsync(req);
+ }
+
///
public Task CreateAsync(CreateJobRecordReq req)
{
diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs
index a4e7aeca..15310602 100644
--- a/src/backend/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs
+++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs
@@ -16,6 +16,12 @@ public sealed class MenuCache(IDistributedCache cache, IMenuService service) //
return Service.BulkDeleteAsync(req);
}
+ ///