From 3847d6fdbbd27efb53921bcc8374157f0da47155 Mon Sep 17 00:00:00 2001 From: nsnail Date: Mon, 22 Apr 2024 21:16:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=20=E5=89=8D=E7=AB=AF=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E9=AB=98=E7=BA=A7=E7=AD=9B=E9=80=89=20(#100)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: 🔨 css 基础单位 [skip ci] * fix: 🐛 ca2263 System.Enum.GetValues() [skip ci] * feat: ✨ 前端表格高级筛选 [skip ci] --- .editorconfig | 92 ++--- Directory.Build.props | 2 +- Dockerfile | 2 +- NetAdmin.sln.DotSettings | 20 +- assets/res/Enums.ln | 1 + package.json | 2 +- scripts/2.git.release.ps1 | 1 + scripts/switcher.freesql.json | 4 +- scripts/switcher.furion.json | 2 +- .../Modules/ICrudModule.cs | 5 + .../Repositories/DefaultRepository.cs | 5 +- .../Extensions/ServiceCollectionExtensions.cs | 2 +- .../NetAdmin.BizServer.Host/Startup.cs | 15 +- .../NetAdmin.BizServer.Tests/AllTests.cs | 16 +- .../NetAdmin.Cache/DistributedCache.cs | 7 +- .../DataValidation/ChineseNameAttribute.cs | 2 +- .../DataValidation/CronAttribute.cs | 2 +- .../DataValidation/EmailAttribute.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_Config.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs | 2 +- .../DbMaps/Sys/Sys_DicCatalog.cs | 2 +- .../DbMaps/Sys/Sys_DicContent.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs | 2 +- .../DbMaps/Sys/Sys_JobRecord.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_Menu.cs | 2 +- .../DbMaps/Sys/Sys_RequestLog.cs | 4 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_RoleApi.cs | 2 +- .../DbMaps/Sys/Sys_RoleDept.cs | 2 +- .../DbMaps/Sys/Sys_RoleMenu.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs | 2 +- .../DbMaps/Sys/Sys_SiteMsgDept.cs | 2 +- .../DbMaps/Sys/Sys_SiteMsgFlag.cs | 2 +- .../DbMaps/Sys/Sys_SiteMsgRole.cs | 2 +- .../DbMaps/Sys/Sys_SiteMsgUser.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_User.cs | 2 +- .../DbMaps/Sys/Sys_UserProfile.cs | 2 +- .../DbMaps/Sys/Sys_UserRole.cs | 2 +- .../DbMaps/Sys/Sys_VerifyCode.cs | 2 +- .../NetAdmin.Domain/DbMaps/Tpl/Tpl_Example.cs | 2 +- .../NetAdmin.Domain/Dto/Dependency/BulkReq.cs | 2 +- .../Dto/Dependency/PagedQueryReq.cs | 6 +- .../Dto/Dependency/QueryReq.cs | 4 +- .../Dto/Sys/Cache/GetAllEntriesRsp.cs | 10 + .../Dto/Sys/Config/QueryConfigRsp.cs | 4 + .../Dto/Sys/SiteMsg/CreateSiteMsgReq.cs | 6 +- .../Dto/Sys/SiteMsg/QuerySiteMsgRsp.cs | 4 + .../Dto/Sys/User/CreateUpdateUserReq.cs | 2 +- .../NetAdmin.Domain/Dto/Sys/User/LoginRsp.cs | 4 +- .../Events/SqlCommandAfterEvent.cs | 3 +- .../BackgroundRunning/WorkBase.cs | 6 +- .../Controllers/ControllerBase.cs | 2 +- .../Controllers/HealthController.cs | 24 -- .../Controllers/ProbeController.cs | 28 ++ .../Extensions/HttpContextExtensions.cs | 2 +- .../IApplicationBuilderExtensions.cs | 13 - .../Extensions/ServiceCollectionExtensions.cs | 8 +- .../NetAdmin.Host/Filters/ApiResultHandler.cs | 8 +- .../Filters/GlobalExceptionHandler.cs | 7 +- .../Middlewares/RequestAuditMiddleware.cs | 5 +- .../Middlewares/SafetyShopHostMiddleware.cs | 44 +++ .../NetAdmin.Host/Utils/RequestLogger.cs | 11 +- src/backend/NetAdmin.Host/Utils/SqlAuditor.cs | 4 +- .../Configuration/Options/CaptchaOptions.cs | 4 +- .../NetAdmin.Infrastructure/Constant/Chars.cs | 144 ++++---- .../Constant/Numbers.cs | 31 +- .../NetAdmin.Infrastructure/Enums/Orders.cs | 8 + .../Exceptions/NetAdminGetLockerException.cs | 2 +- .../Extensions/HttpContextExtensions.cs | 25 ++ .../HttpRequestMessageExtensions.cs | 3 +- .../HttpResponseMessageExtensions.cs | 7 +- .../NetAdmin.Infrastructure.csproj | 12 +- .../Utils/UserAgentParser.cs | 5 +- .../commonSettings.json | 4 +- .../NetAdmin.ScheduledService/Startup.cs | 11 +- .../Services/Sys/ApiService.cs | 16 +- .../Services/Sys/CacheService.cs | 16 +- .../Services/Sys/ConfigService.cs | 15 +- .../Services/Sys/ConstantService.cs | 33 +- .../Services/Sys/DeptService.cs | 14 +- .../Services/Sys/DicCatalogService.cs | 19 +- .../Services/Sys/DicContentService.cs | 19 +- .../Services/Sys/JobRecordService.cs | 15 +- .../Services/Sys/JobService.cs | 42 ++- .../Services/Sys/MenuService.cs | 35 +- .../Services/Sys/RequestLogService.cs | 17 +- .../Services/Sys/RoleService.cs | 15 +- .../Services/Sys/SiteMsgDeptService.cs | 16 +- .../Services/Sys/SiteMsgFlagService.cs | 16 +- .../Services/Sys/SiteMsgRoleService.cs | 16 +- .../Services/Sys/SiteMsgService.cs | 29 +- .../Services/Sys/SiteMsgUserService.cs | 16 +- .../Services/Sys/UserProfileService.cs | 34 +- .../Services/Sys/UserService.cs | 54 ++- .../Services/Sys/VerifyCodeService.cs | 16 +- .../Services/Tpl/ExampleService.cs | 16 +- .../Sys/ApiCache.cs | 6 + .../Sys/CacheCache.cs | 2 +- .../Sys/CaptchaCache.cs | 2 +- .../Sys/ConfigCache.cs | 6 + .../Sys/DeptCache.cs | 6 + .../Sys/DicCache.cs | 2 +- .../Sys/DicCatalogCache.cs | 6 + .../Sys/DicContentCache.cs | 6 + .../Sys/JobCache.cs | 6 + .../Sys/JobRecordCache.cs | 6 + .../Sys/MenuCache.cs | 6 + .../Sys/RequestLogCache.cs | 6 + .../Sys/RoleCache.cs | 6 + .../Sys/SiteMsgCache.cs | 6 + .../Sys/SiteMsgDeptCache.cs | 6 + .../Sys/SiteMsgFlagCache.cs | 6 + .../Sys/SiteMsgRoleCache.cs | 6 + .../Sys/SiteMsgUserCache.cs | 6 + .../Sys/UserCache.cs | 10 +- .../Sys/UserProfileCache.cs | 6 + .../Sys/VerifyCodeCache.cs | 6 + .../Tpl/ExampleCache.cs | 6 + .../Controllers/Sys/ApiController.cs | 8 + .../Controllers/Sys/ConfigController.cs | 8 + .../Controllers/Sys/DeptController.cs | 8 + .../Controllers/Sys/JobController.cs | 8 + .../Controllers/Sys/LogController.cs | 8 + .../Controllers/Sys/MenuController.cs | 8 + .../Controllers/Sys/RoleController.cs | 8 + .../Controllers/Sys/SiteMsgController.cs | 8 + .../Controllers/Sys/UserController.cs | 8 + .../Controllers/Sys/VerifyCodeController.cs | 40 +- .../Controllers/Tpl/ExampleController.cs | 8 + .../Jobs/ScheduledJob.cs | 7 +- .../Subscribers/OperationLogger.cs | 2 +- .../NetAdmin.Tests/NetAdmin.Tests.csproj | 6 +- src/frontend/admin/package.json | 27 +- src/frontend/admin/src/App.vue | 16 +- .../admin/src/api/controllers/probe.js | 18 + src/frontend/admin/src/api/sys/api.js | 11 + src/frontend/admin/src/api/sys/config.js | 11 + src/frontend/admin/src/api/sys/dept.js | 11 + src/frontend/admin/src/api/sys/job.js | 11 + src/frontend/admin/src/api/sys/log.js | 11 + src/frontend/admin/src/api/sys/menu.js | 11 + src/frontend/admin/src/api/sys/role.js | 11 + src/frontend/admin/src/api/sys/sitemsg.js | 11 + src/frontend/admin/src/api/sys/user.js | 11 + src/frontend/admin/src/api/sys/verifycode.js | 11 + src/frontend/admin/src/api/tpl/example.js | 11 + src/frontend/admin/src/assets/icons/Error.vue | 6 +- .../admin/src/assets/icons/FreeSql.vue | 7 + .../admin/src/assets/icons/Performance.vue | 7 + src/frontend/admin/src/assets/icons/Proxy.vue | 7 + src/frontend/admin/src/assets/icons/index.js | 5 +- .../src/components/naColIndicator/index.vue | 8 - .../src/components/naColOperation/index.vue | 4 +- .../admin/src/components/naColUser/index.vue | 18 +- .../admin/src/components/naSearch/index.vue | 349 ++++++++++++++---- .../admin/src/components/scTable/index.vue | 116 ++++++ src/frontend/admin/src/config/iconSelect.js | 2 +- src/frontend/admin/src/config/table.js | 2 +- src/frontend/admin/src/global.js | 11 + src/frontend/admin/src/style/app.scss | 10 + .../admin/src/views/sys/api/index.vue | 11 +- .../admin/src/views/sys/cache/index.vue | 41 +- .../admin/src/views/sys/config/index.vue | 73 +++- .../admin/src/views/sys/dept/index.vue | 8 +- .../admin/src/views/sys/dic/list/index.vue | 6 +- .../admin/src/views/sys/job/index.vue | 63 +++- src/frontend/admin/src/views/sys/job/save.vue | 12 +- .../admin/src/views/sys/log/login/index.vue | 29 +- .../src/views/sys/log/operation/index.vue | 75 ++-- .../admin/src/views/sys/menu/save.vue | 4 +- .../admin/src/views/sys/msg/index.vue | 14 +- .../admin/src/views/sys/role/index.vue | 25 +- .../admin/src/views/sys/user/index.vue | 10 +- .../admin/src/views/sys/user/save.vue | 5 +- 175 files changed, 1901 insertions(+), 630 deletions(-) delete mode 100644 src/backend/NetAdmin.Host/Controllers/HealthController.cs create mode 100644 src/backend/NetAdmin.Host/Controllers/ProbeController.cs create mode 100644 src/backend/NetAdmin.Host/Middlewares/SafetyShopHostMiddleware.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Extensions/HttpContextExtensions.cs create mode 100644 src/frontend/admin/src/api/controllers/probe.js create mode 100644 src/frontend/admin/src/assets/icons/FreeSql.vue create mode 100644 src/frontend/admin/src/assets/icons/Performance.vue create mode 100644 src/frontend/admin/src/assets/icons/Proxy.vue 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 # ʱǷеIJ +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中间件,用于获取真实客户端IP地址 - .EnableBuffering() // 启用请求体缓冲,允许多次读取请求体 - .UseMiddleware() // 使用RequestAuditMiddleware中间件,执行请求审计 + _ = app // + .UseMiddleware() // 安全停机中间件 + .EnableBuffering() // 启用请求体缓冲,允许多次读取请求体 + .UseMiddleware() // 使用RequestAuditMiddleware中间件,执行请求审计 #if DEBUG .UseOpenApiSkin() // 使用OpenApiSkin中间件(仅在调试模式下),提供Swagger 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; /// /// 用户档案表 /// -[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) { // 非json格式,退出 - 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 - - /// - /// 获取客户端真实Ip - /// - 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; // 最大限制:打印长度(HTTP 内容) + public const int MAX_LIMIT_PRINT_LEN_SQL = 4096; // 最大限制:打印长度(SQL 语句) + 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 +{ + /// + /// 获取客户端真实IP + /// + 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中间件,用于获取真实客户端IP地址 - .EnableBuffering() // 启用请求体缓冲,允许多次读取请求体 - .UseMiddleware() // 使用RequestAuditMiddleware中间件,执行请求审计 + _ = app // + .UseMiddleware() // 安全停机中间件 + .EnableBuffering() // 启用请求体缓冲,允许多次读取请求体 + .UseMiddleware() // 使用RequestAuditMiddleware中间件,执行请求审计 #if DEBUG .UseOpenApiSkin() // 使用OpenApiSkin中间件(仅在调试模式下),提供Swagger 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); // 删除档案表 - 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); } + /// + public Task CountAsync(QueryReq req) + { + return Service.CountAsync(req); + } + /// public Task CreateAsync(CreateMenuReq req) { diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs index 5b9e6b78..4b24b10c 100644 --- a/src/backend/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs @@ -16,6 +16,12 @@ public sealed class RequestLogCache(IDistributedCache cache, IRequestLogService return Service.BulkDeleteAsync(req); } + /// + public Task CountAsync(QueryReq req) + { + return Service.CountAsync(req); + } + /// public Task CreateAsync(CreateRequestLogReq req) { diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs index c9361b9d..d3119f97 100644 --- a/src/backend/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs @@ -16,6 +16,12 @@ public sealed class RoleCache(IDistributedCache cache, IRoleService service) // return Service.BulkDeleteAsync(req); } + /// + public Task CountAsync(QueryReq req) + { + return Service.CountAsync(req); + } + /// public Task CreateAsync(CreateRoleReq req) { diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgCache.cs index e631d045..17366674 100644 --- a/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgCache.cs +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgCache.cs @@ -17,6 +17,12 @@ public sealed class SiteMsgCache(IDistributedCache cache, ISiteMsgService servic return Service.BulkDeleteAsync(req); } + /// + public Task CountAsync(QueryReq req) + { + return Service.CountAsync(req); + } + /// public Task CreateAsync(CreateSiteMsgReq req) { diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgDeptCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgDeptCache.cs index 4b7f9089..05d4981f 100644 --- a/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgDeptCache.cs +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgDeptCache.cs @@ -16,6 +16,12 @@ public sealed class SiteMsgDeptCache(IDistributedCache cache, ISiteMsgDeptServic return Service.BulkDeleteAsync(req); } + /// + public Task CountAsync(QueryReq req) + { + return Service.CountAsync(req); + } + /// public Task CreateAsync(CreateSiteMsgDeptReq req) { diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgFlagCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgFlagCache.cs index 5f2b5b11..7ffd75e2 100644 --- a/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgFlagCache.cs +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgFlagCache.cs @@ -16,6 +16,12 @@ public sealed class SiteMsgFlagCache(IDistributedCache cache, ISiteMsgFlagServic return Service.BulkDeleteAsync(req); } + /// + public Task CountAsync(QueryReq req) + { + return Service.CountAsync(req); + } + /// public Task CreateAsync(CreateSiteMsgFlagReq req) { diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgRoleCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgRoleCache.cs index 9c362a46..5f591c6d 100644 --- a/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgRoleCache.cs +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgRoleCache.cs @@ -16,6 +16,12 @@ public sealed class SiteMsgRoleCache(IDistributedCache cache, ISiteMsgRoleServic return Service.BulkDeleteAsync(req); } + /// + public Task CountAsync(QueryReq req) + { + return Service.CountAsync(req); + } + /// public Task CreateAsync(CreateSiteMsgRoleReq req) { diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgUserCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgUserCache.cs index 3c90e0ec..8c60aef4 100644 --- a/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgUserCache.cs +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/SiteMsgUserCache.cs @@ -16,6 +16,12 @@ public sealed class SiteMsgUserCache(IDistributedCache cache, ISiteMsgUserServic return Service.BulkDeleteAsync(req); } + /// + public Task CountAsync(QueryReq req) + { + return Service.CountAsync(req); + } + /// public Task CreateAsync(CreateSiteMsgUserReq req) { diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/UserCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/UserCache.cs index 76a27958..8f258967 100644 --- a/src/backend/NetAdmin.SysComponent.Cache/Sys/UserCache.cs +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/UserCache.cs @@ -29,6 +29,12 @@ public sealed class UserCache(IDistributedCache cache, IUserService service, IVe return Service.CheckUserNameAvailableAsync(req); } + /// + public Task CountAsync(QueryReq req) + { + return Service.CountAsync(req); + } + /// public Task CreateAsync(CreateUserReq req) { @@ -77,7 +83,7 @@ public sealed class UserCache(IDistributedCache cache, IUserService service, IVe #if !DEBUG return GetOrCreateAsync( // GetCacheKey(req.GetHashCode().ToString(CultureInfo.InvariantCulture)) // - , () => Service.QueryAsync(req), TimeSpan.FromMinutes(1)); + , () => Service.QueryAsync(req), TimeSpan.FromSeconds(Numbers.CACHE_SECS_DEFAULT)); #else return Service.QueryAsync(req); #endif @@ -194,7 +200,7 @@ public sealed class UserCache(IDistributedCache cache, IUserService service, IVe #if !DEBUG return GetOrCreateAsync( // GetCacheKey(Service.UserToken.Id.ToString(CultureInfo.InvariantCulture)), Service.UserInfoAsync -, TimeSpan.FromMinutes(1)); + , TimeSpan.FromSeconds(Numbers.CACHE_SECS_DEFAULT)); #else return Service.UserInfoAsync(); #endif diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs index 15e5e30b..c13aac4f 100644 --- a/src/backend/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs @@ -16,6 +16,12 @@ public sealed class UserProfileCache(IDistributedCache cache, IUserProfileServic return Service.BulkDeleteAsync(req); } + /// + public Task CountAsync(QueryReq req) + { + return Service.CountAsync(req); + } + /// public Task CreateAsync(CreateUserProfileReq req) { diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs index 5fcc820f..9bd7106a 100644 --- a/src/backend/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs @@ -17,6 +17,12 @@ public sealed class VerifyCodeCache(IDistributedCache cache, IVerifyCodeService return Service.BulkDeleteAsync(req); } + /// + public Task CountAsync(QueryReq req) + { + return Service.CountAsync(req); + } + /// public Task CreateAsync(CreateVerifyCodeReq req) { diff --git a/src/backend/NetAdmin.SysComponent.Cache/Tpl/ExampleCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Tpl/ExampleCache.cs index 394ee721..3063a01b 100644 --- a/src/backend/NetAdmin.SysComponent.Cache/Tpl/ExampleCache.cs +++ b/src/backend/NetAdmin.SysComponent.Cache/Tpl/ExampleCache.cs @@ -16,6 +16,12 @@ public sealed class ExampleCache(IDistributedCache cache, IExampleService servic return Service.BulkDeleteAsync(req); } + /// + public Task CountAsync(QueryReq req) + { + return Service.CountAsync(req); + } + /// public Task CreateAsync(CreateExampleReq req) { diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs index 8e77a338..21a56e6a 100644 --- a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs @@ -24,6 +24,14 @@ public sealed class ApiController(IApiCache cache) : ControllerBase + /// 接口计数 + /// + public Task CountAsync(QueryReq req) + { + return Cache.CountAsync(req); + } + /// /// 创建接口 /// diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs index 66187c10..821046b3 100644 --- a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs @@ -24,6 +24,14 @@ public sealed class ConfigController(IConfigCache cache) : ControllerBase + /// 配置计数 + /// + public Task CountAsync(QueryReq req) + { + return Cache.CountAsync(req); + } + /// /// 创建配置 /// diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs index bf305cb1..8d79c6db 100644 --- a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs @@ -23,6 +23,14 @@ public sealed class DeptController(IDeptCache cache) : ControllerBase + /// 部门计数 + /// + public Task CountAsync(QueryReq req) + { + return Cache.CountAsync(req); + } + /// /// 创建部门 /// diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/JobController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/JobController.cs index da24ccad..e851f046 100644 --- a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/JobController.cs +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/JobController.cs @@ -24,6 +24,14 @@ public sealed class JobController(IJobCache cache) : ControllerBase + /// 计划作业计数 + /// + public Task CountAsync(QueryReq req) + { + return Cache.CountAsync(req); + } + /// /// 创建计划作业 /// diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/LogController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/LogController.cs index 3c589837..1abccf5a 100644 --- a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/LogController.cs +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/LogController.cs @@ -25,6 +25,14 @@ public sealed class LogController(IRequestLogCache cache) : ControllerBase + /// 请求日志计数 + /// + public Task CountAsync(QueryReq req) + { + return Cache.CountAsync(req); + } + /// /// 创建请求日志 /// diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs index a5c3e0a2..ef84718f 100644 --- a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs @@ -23,6 +23,14 @@ public sealed class MenuController(IMenuCache cache) : ControllerBase + /// 菜单计数 + /// + public Task CountAsync(QueryReq req) + { + return Cache.CountAsync(req); + } + /// /// 创建菜单 /// diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs index ff09d7b1..c984662c 100644 --- a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs @@ -23,6 +23,14 @@ public sealed class RoleController(IRoleCache cache) : ControllerBase + /// 角色计数 + /// + public Task CountAsync(QueryReq req) + { + return Cache.CountAsync(req); + } + /// /// 创建角色 /// diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/SiteMsgController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/SiteMsgController.cs index 7cc18156..56455af2 100644 --- a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/SiteMsgController.cs +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/SiteMsgController.cs @@ -25,6 +25,14 @@ public sealed class SiteMsgController(ISiteMsgCache cache) : ControllerBase + /// 站内信计数 + /// + public Task CountAsync(QueryReq req) + { + return Cache.CountAsync(req); + } + /// /// 创建站内信 /// diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs index b24fbafe..56292c6d 100644 --- a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs @@ -44,6 +44,14 @@ public sealed class UserController(IUserCache cache, IConfigCache configCache) return Cache.CheckUserNameAvailableAsync(req); } + /// + /// 用户计数 + /// + public Task CountAsync(QueryReq req) + { + return Cache.CountAsync(req); + } + /// /// 创建用户 /// diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs index 4ab462c9..d9734eb6 100644 --- a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs @@ -15,49 +15,71 @@ namespace NetAdmin.SysComponent.Host.Controllers.Sys; public sealed class VerifyCodeController(IVerifyCodeCache cache, ICaptchaCache captchaCache) : ControllerBase(cache), IVerifyCodeModule { - /// + /// + /// 批量删除验证码 + /// [NonAction] public Task BulkDeleteAsync(BulkReq req) { return Cache.BulkDeleteAsync(req); } - /// + /// + /// 验证码计数 + /// + public Task CountAsync(QueryReq req) + { + return Cache.CountAsync(req); + } + + /// + /// 创建验证码 + /// [NonAction] public Task CreateAsync(CreateVerifyCodeReq req) { return Cache.CreateAsync(req); } - /// + /// + /// 删除验证码 + /// [NonAction] public Task DeleteAsync(DelReq req) { return Cache.DeleteAsync(req); } - /// + /// + /// 判断验证码是否存在 + /// [NonAction] public Task ExistAsync(QueryReq req) { return Cache.ExistAsync(req); } - /// + /// + /// 获取单个验证码 + /// [NonAction] public Task GetAsync(QueryVerifyCodeReq req) { return Cache.GetAsync(req); } - /// + /// + /// 分页查询验证码 + /// [NonAction] public Task> PagedQueryAsync(PagedQueryReq req) { return Cache.PagedQueryAsync(req); } - /// + /// + /// 查询验证码 + /// [NonAction] public Task> QueryAsync(QueryReq req) { @@ -75,7 +97,9 @@ public sealed class VerifyCodeController(IVerifyCodeCache cache, ICaptchaCache c return await Cache.SendVerifyCodeAsync(req).ConfigureAwait(false); } - /// + /// + /// 更新验证码 + /// [NonAction] public Task UpdateAsync(UpdateVerifyCodeReq req) { diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Tpl/ExampleController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Tpl/ExampleController.cs index a32c35f2..f25c7f82 100644 --- a/src/backend/NetAdmin.SysComponent.Host/Controllers/Tpl/ExampleController.cs +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Tpl/ExampleController.cs @@ -24,6 +24,14 @@ public sealed class ExampleController(IExampleCache cache) : ControllerBase + /// 示例计数 + /// + public Task CountAsync(QueryReq req) + { + return Cache.CountAsync(req); + } + /// /// 创建示例 /// diff --git a/src/backend/NetAdmin.SysComponent.Host/Jobs/ScheduledJob.cs b/src/backend/NetAdmin.SysComponent.Host/Jobs/ScheduledJob.cs index 0c031105..9f0e2217 100644 --- a/src/backend/NetAdmin.SysComponent.Host/Jobs/ScheduledJob.cs +++ b/src/backend/NetAdmin.SysComponent.Host/Jobs/ScheduledJob.cs @@ -109,11 +109,14 @@ public sealed class ScheduledJob : WorkBase, IJob var headers = new Dictionary(); if (!_accessToken.NullOrEmpty()) { - headers.Add(Chars.FLG_ACCESS_TOKEN_HEADER_KEY, $"{Chars.FLG_AUTH_SCHEMA} {_accessToken}"); + headers.Add( // + Chars.FLG_HTTP_HEADER_KEY_AUTHORIZATION, $"{Chars.FLG_HTTP_HEADER_VALUE_AUTH_SCHEMA} {_accessToken}"); } if (!_refreshToken.NullOrEmpty()) { - headers.Add(Chars.FLG_X_ACCESS_TOKEN_HEADER_KEY, $"{Chars.FLG_AUTH_SCHEMA} {_refreshToken}"); + headers.Add( // + Chars.FLG_HTTP_HEADER_KEY_X_ACCESS_TOKEN_HEADER_KEY + , $"{Chars.FLG_HTTP_HEADER_VALUE_AUTH_SCHEMA} {_refreshToken}"); } if (!job.RequestHeader.NullOrEmpty()) { diff --git a/src/backend/NetAdmin.SysComponent.Host/Subscribers/OperationLogger.cs b/src/backend/NetAdmin.SysComponent.Host/Subscribers/OperationLogger.cs index e3515c2a..1bcac7db 100644 --- a/src/backend/NetAdmin.SysComponent.Host/Subscribers/OperationLogger.cs +++ b/src/backend/NetAdmin.SysComponent.Host/Subscribers/OperationLogger.cs @@ -21,7 +21,7 @@ public sealed class OperationLogger : IEventSubscriber } // 跳过心跳请求 - if (operationEvent.Data.ApiId.Equals("api/health/check", StringComparison.OrdinalIgnoreCase)) { + if (operationEvent.Data.ApiId.Equals("api/probe/health.check", StringComparison.OrdinalIgnoreCase)) { return; } diff --git a/src/backend/NetAdmin.Tests/NetAdmin.Tests.csproj b/src/backend/NetAdmin.Tests/NetAdmin.Tests.csproj index 658bc2b7..46ca9ecf 100644 --- a/src/backend/NetAdmin.Tests/NetAdmin.Tests.csproj +++ b/src/backend/NetAdmin.Tests/NetAdmin.Tests.csproj @@ -3,9 +3,9 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/frontend/admin/package.json b/src/frontend/admin/package.json index 67b9b0ba..cecfaaa5 100644 --- a/src/frontend/admin/package.json +++ b/src/frontend/admin/package.json @@ -11,38 +11,41 @@ "dependencies": { "@element-plus/icons-vue": "^2.3.1", "@tinymce/tinymce-vue": "^5.1.1", - "axios": "^1.6.7", + "ace-builds": "^1.33.0", + "axios": "^1.6.8", "clipboard": "^2.0.11", - "core-js": "^3.36.0", + "core-js": "^3.37.0", "cropperjs": "^1.6.1", "crypto-js": "^4.2.0", "echarts": "^5.5.0", - "element-plus": "^2.6.1", + "element-plus": "^2.7.0", "json-bigint": "^1.0.0", "json5-to-table": "^0.1.8", - "markdown-it": "^14.0.0", + "markdown-it": "^14.1.0", "markdown-it-emoji": "^3.0.0", "nprogress": "^0.2.0", "pinyin-match": "^1.2.5", "qrcodejs2": "^0.0.2", "sortablejs": "^1.15.2", "tinymce": "^6.8.3", - "vue": "^3.4.21", - "vue-i18n": "^9.10.1", - "vue-router": "^4.3.0", + "vkbeautify": "^0.99.3", + "vue": "^3.4.23", + "vue-i18n": "^9.12.1", + "vue-router": "^4.3.1", + "vue3-ace-editor": "^2.2.4", "vue3-json-viewer": "^2.2.2", "vuedraggable": "^4.0.3", "vuex": "^4.1.0", - "xgplayer": "^3.0.14", - "xgplayer-hls": "^3.0.14" + "xgplayer": "^3.0.16", + "xgplayer-hls": "^3.0.16" }, "devDependencies": { "@vitejs/plugin-vue": "^5.0.4", "prettier": "^3.2.5", "prettier-plugin-organize-attributes": "^1.0.0", - "sass": "^1.71.1", - "terser": "^5.29.1", - "vite": "^5.1.5" + "sass": "^1.75.0", + "terser": "^5.30.3", + "vite": "^5.2.9" }, "browserslist": [ "> 1%", diff --git a/src/frontend/admin/src/App.vue b/src/frontend/admin/src/App.vue index 19a78225..b56b1718 100644 --- a/src/frontend/admin/src/App.vue +++ b/src/frontend/admin/src/App.vue @@ -1,6 +1,6 @@ @@ -9,8 +9,14 @@ import colorTool from '@/utils/color' export default { name: 'App', + provide() { + return { + reload: this.reload, + } + }, data() { return { + isRouterAlive: true, config: { size: 'default', zIndex: 2000, @@ -25,6 +31,14 @@ export default { return this.$i18n.messages[this.$i18n.locale].el }, }, + methods: { + reload() { + this.isRouterAlive = false + this.$nextTick(function () { + this.isRouterAlive = true + }) + }, + }, async created() { //设置主题颜色 const app_color = this.$TOOL.data.get('APP_COLOR') ?? this.$CONFIG.COLOR diff --git a/src/frontend/admin/src/api/controllers/probe.js b/src/frontend/admin/src/api/controllers/probe.js new file mode 100644 index 00000000..6fbe3ff1 --- /dev/null +++ b/src/frontend/admin/src/api/controllers/probe.js @@ -0,0 +1,18 @@ +/** + * 探针组件 + * @module @/api/probe + */ +import config from '@/config' +import http from '@/utils/request' +export default { + /** + * 健康检查 + */ + healthCheck: { + url: `${config.API_URL}/api/probe/health.check`, + name: `健康检查`, + get: async function (data = {}, config = {}) { + return await http.get(this.url, data, config) + }, + }, +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/api.js b/src/frontend/admin/src/api/sys/api.js index 780b9d95..012848d9 100644 --- a/src/frontend/admin/src/api/sys/api.js +++ b/src/frontend/admin/src/api/sys/api.js @@ -5,6 +5,17 @@ import config from '@/config' import http from '@/utils/request' export default { + /** + * 接口计数 + */ + count: { + url: `${config.API_URL}/api/sys/api/count`, + name: `接口计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 查询接口 */ diff --git a/src/frontend/admin/src/api/sys/config.js b/src/frontend/admin/src/api/sys/config.js index 8fcf1185..4802fdf3 100644 --- a/src/frontend/admin/src/api/sys/config.js +++ b/src/frontend/admin/src/api/sys/config.js @@ -16,6 +16,17 @@ export default { }, }, + /** + * 配置计数 + */ + count: { + url: `${config.API_URL}/api/sys/config/count`, + name: `配置计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建配置 */ diff --git a/src/frontend/admin/src/api/sys/dept.js b/src/frontend/admin/src/api/sys/dept.js index ee3bb168..2db052a3 100644 --- a/src/frontend/admin/src/api/sys/dept.js +++ b/src/frontend/admin/src/api/sys/dept.js @@ -16,6 +16,17 @@ export default { }, }, + /** + * 部门计数 + */ + count: { + url: `${config.API_URL}/api/sys/dept/count`, + name: `部门计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建部门 */ diff --git a/src/frontend/admin/src/api/sys/job.js b/src/frontend/admin/src/api/sys/job.js index a637ec35..ad13e43a 100644 --- a/src/frontend/admin/src/api/sys/job.js +++ b/src/frontend/admin/src/api/sys/job.js @@ -16,6 +16,17 @@ export default { }, }, + /** + * 计划作业计数 + */ + count: { + url: `${config.API_URL}/api/sys/job/count`, + name: `计划作业计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建计划作业 */ diff --git a/src/frontend/admin/src/api/sys/log.js b/src/frontend/admin/src/api/sys/log.js index 06422b0f..f7b21462 100644 --- a/src/frontend/admin/src/api/sys/log.js +++ b/src/frontend/admin/src/api/sys/log.js @@ -5,6 +5,17 @@ import config from '@/config' import http from '@/utils/request' export default { + /** + * 请求日志计数 + */ + count: { + url: `${config.API_URL}/api/sys/log/count`, + name: `请求日志计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 获取单个请求日志 */ diff --git a/src/frontend/admin/src/api/sys/menu.js b/src/frontend/admin/src/api/sys/menu.js index f370f3e5..4e701004 100644 --- a/src/frontend/admin/src/api/sys/menu.js +++ b/src/frontend/admin/src/api/sys/menu.js @@ -16,6 +16,17 @@ export default { }, }, + /** + * 菜单计数 + */ + count: { + url: `${config.API_URL}/api/sys/menu/count`, + name: `菜单计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建菜单 */ diff --git a/src/frontend/admin/src/api/sys/role.js b/src/frontend/admin/src/api/sys/role.js index f97e6586..ba9ad366 100644 --- a/src/frontend/admin/src/api/sys/role.js +++ b/src/frontend/admin/src/api/sys/role.js @@ -16,6 +16,17 @@ export default { }, }, + /** + * 角色计数 + */ + count: { + url: `${config.API_URL}/api/sys/role/count`, + name: `角色计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建角色 */ diff --git a/src/frontend/admin/src/api/sys/sitemsg.js b/src/frontend/admin/src/api/sys/sitemsg.js index 7f1078cb..07ccee08 100644 --- a/src/frontend/admin/src/api/sys/sitemsg.js +++ b/src/frontend/admin/src/api/sys/sitemsg.js @@ -16,6 +16,17 @@ export default { }, }, + /** + * 站内信计数 + */ + count: { + url: `${config.API_URL}/api/sys/site.msg/count`, + name: `站内信计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建站内信 */ diff --git a/src/frontend/admin/src/api/sys/user.js b/src/frontend/admin/src/api/sys/user.js index aa933e51..df6e25ef 100644 --- a/src/frontend/admin/src/api/sys/user.js +++ b/src/frontend/admin/src/api/sys/user.js @@ -27,6 +27,17 @@ export default { }, }, + /** + * 用户计数 + */ + count: { + url: `${config.API_URL}/api/sys/user/count`, + name: `用户计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建用户 */ diff --git a/src/frontend/admin/src/api/sys/verifycode.js b/src/frontend/admin/src/api/sys/verifycode.js index ac4dc62e..c17714d5 100644 --- a/src/frontend/admin/src/api/sys/verifycode.js +++ b/src/frontend/admin/src/api/sys/verifycode.js @@ -5,6 +5,17 @@ import config from '@/config' import http from '@/utils/request' export default { + /** + * 验证码计数 + */ + count: { + url: `${config.API_URL}/api/sys/verify.code/count`, + name: `验证码计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 发送验证码 */ diff --git a/src/frontend/admin/src/api/tpl/example.js b/src/frontend/admin/src/api/tpl/example.js index ef708100..2b7add3d 100644 --- a/src/frontend/admin/src/api/tpl/example.js +++ b/src/frontend/admin/src/api/tpl/example.js @@ -16,6 +16,17 @@ export default { }, }, + /** + * 示例计数 + */ + count: { + url: `${config.API_URL}/api/tpl/example/count`, + name: `示例计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建示例 */ diff --git a/src/frontend/admin/src/assets/icons/Error.vue b/src/frontend/admin/src/assets/icons/Error.vue index 0f4d7147..f2ea8e31 100644 --- a/src/frontend/admin/src/assets/icons/Error.vue +++ b/src/frontend/admin/src/assets/icons/Error.vue @@ -1,7 +1,7 @@ \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/FreeSql.vue b/src/frontend/admin/src/assets/icons/FreeSql.vue new file mode 100644 index 00000000..aafe1ca2 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/FreeSql.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Performance.vue b/src/frontend/admin/src/assets/icons/Performance.vue new file mode 100644 index 00000000..fd2a90c9 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Performance.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Proxy.vue b/src/frontend/admin/src/assets/icons/Proxy.vue new file mode 100644 index 00000000..83bec2dc --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Proxy.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/index.js b/src/frontend/admin/src/assets/icons/index.js index 00d521fe..e4c178e3 100644 --- a/src/frontend/admin/src/assets/icons/index.js +++ b/src/frontend/admin/src/assets/icons/index.js @@ -63,4 +63,7 @@ export { default as Help } from './Help.vue' export { default as Version } from './Version.vue' export { default as Home } from './Home.vue' export { default as Exception } from './Exception.vue' -export { default as Collect } from './Collect.vue' \ No newline at end of file +export { default as Collect } from './Collect.vue' +export { default as FreeSql } from './FreeSql.vue' +export { default as Performance } from './Performance.vue' +export { default as Proxy } from './Proxy.vue' \ No newline at end of file diff --git a/src/frontend/admin/src/components/naColIndicator/index.vue b/src/frontend/admin/src/components/naColIndicator/index.vue index fe61085a..6a121cf7 100644 --- a/src/frontend/admin/src/components/naColIndicator/index.vue +++ b/src/frontend/admin/src/components/naColIndicator/index.vue @@ -15,14 +15,6 @@ -