From 4967e3827d6744d58fe36ef6aa169d8e597edb37 Mon Sep 17 00:00:00 2001 From: Roc Date: Fri, 27 May 2022 10:51:25 +0800 Subject: [PATCH 001/362] use AnsiConsoleTheme.Sixteen --- framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj | 2 +- framework/src/Volo.Abp.Cli/Volo/Abp/Cli/Program.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj index f30216a407..cb892d5bd8 100644 --- a/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj +++ b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj @@ -17,7 +17,7 @@ - + diff --git a/framework/src/Volo.Abp.Cli/Volo/Abp/Cli/Program.cs b/framework/src/Volo.Abp.Cli/Volo/Abp/Cli/Program.cs index 44c809e697..dc4bcedc61 100644 --- a/framework/src/Volo.Abp.Cli/Volo/Abp/Cli/Program.cs +++ b/framework/src/Volo.Abp.Cli/Volo/Abp/Cli/Program.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.DependencyInjection; using Serilog; using Serilog.Events; +using Serilog.Sinks.SystemConsole.Themes; using System.IO; using System.Threading.Tasks; @@ -26,7 +27,7 @@ public class Program #endif .Enrich.FromLogContext() .WriteTo.File(Path.Combine(CliPaths.Log, "abp-cli-logs.txt")) - .WriteTo.Console() + .WriteTo.Console(theme: AnsiConsoleTheme.Sixteen) .CreateLogger(); using (var application = AbpApplicationFactory.Create( From 03ffe81d831977337565e44511303ff4785cd014 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 21 Jul 2022 16:09:09 +0800 Subject: [PATCH 002/362] Split JSON into `Newtonsoft` & `SystemTextJson` packages. Resolve #12124 --- framework/Volo.Abp.sln | 21 +++++++++++++ .../src/Volo.Abp.Json.Core/FodyWeavers.xml | 3 ++ .../src/Volo.Abp.Json.Core/FodyWeavers.xsd | 30 +++++++++++++++++++ .../Volo.Abp.Json.Core.csproj | 20 +++++++++++++ .../Volo/Abp/Json/AbpHybridJsonSerializer.cs | 0 .../Volo/Abp/Json/AbpJsonCoreModule.cs | 8 +++++ .../Volo/Abp/Json/AbpJsonOptions.cs | 2 -- .../Volo/Abp/Json/IJsonSerializer.cs | 0 .../Volo/Abp/Json/IJsonSerializerProvider.cs | 0 .../Volo.Abp.Json.Newtonsoft/FodyWeavers.xml | 3 ++ .../Volo.Abp.Json.Newtonsoft/FodyWeavers.xsd | 30 +++++++++++++++++++ .../Volo.Abp.Json.Newtonsoft.csproj | 23 ++++++++++++++ .../Newtonsoft/AbpJsonIsoDateTimeConverter.cs | 0 .../Newtonsoft/AbpJsonNewtonsoftModule.cs | 21 +++++++++++++ .../AbpNewtonsoftJsonSerializerOptions.cs | 0 .../AbpNewtonsoftJsonSerializerProvider.cs | 0 .../FodyWeavers.xml | 3 ++ .../FodyWeavers.xsd | 30 +++++++++++++++++++ .../Volo.Abp.Json.SystemTextJson.csproj | 22 ++++++++++++++ .../AbpJsonSystemTextJsonModule.cs | 26 ++++++++++++++++ .../AbpSystemTextJsonSerializerOptions.cs | 0 ...AbpSystemTextJsonSerializerOptionsSetup.cs | 0 .../AbpSystemTextJsonSerializerProvider.cs | 0 ...AbpSystemTextJsonUnsupportedTypeMatcher.cs | 0 .../JsonConverters/AbpDateTimeConverter.cs | 4 +-- .../AbpNullableDateTimeConverter.cs | 0 .../AbpStringToBooleanConverter.cs | 0 .../AbpStringToEnumConverter.cs | 0 .../JsonConverters/AbpStringToEnumFactory.cs | 0 .../ObjectToInferredTypesConverter.cs | 0 .../src/Volo.Abp.Json/Volo.Abp.Json.csproj | 5 ++-- .../Volo/Abp/Json/AbpJsonModule.cs | 27 ++--------------- 32 files changed, 246 insertions(+), 32 deletions(-) create mode 100644 framework/src/Volo.Abp.Json.Core/FodyWeavers.xml create mode 100644 framework/src/Volo.Abp.Json.Core/FodyWeavers.xsd create mode 100644 framework/src/Volo.Abp.Json.Core/Volo.Abp.Json.Core.csproj rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.Core}/Volo/Abp/Json/AbpHybridJsonSerializer.cs (100%) create mode 100644 framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonCoreModule.cs rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.Core}/Volo/Abp/Json/AbpJsonOptions.cs (87%) rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.Core}/Volo/Abp/Json/IJsonSerializer.cs (100%) rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.Core}/Volo/Abp/Json/IJsonSerializerProvider.cs (100%) create mode 100644 framework/src/Volo.Abp.Json.Newtonsoft/FodyWeavers.xml create mode 100644 framework/src/Volo.Abp.Json.Newtonsoft/FodyWeavers.xsd create mode 100644 framework/src/Volo.Abp.Json.Newtonsoft/Volo.Abp.Json.Newtonsoft.csproj rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.Newtonsoft}/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs (100%) create mode 100644 framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.Newtonsoft}/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerOptions.cs (100%) rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.Newtonsoft}/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs (100%) create mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/FodyWeavers.xml create mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/FodyWeavers.xsd create mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj create mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.SystemTextJson}/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptions.cs (100%) rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.SystemTextJson}/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs (100%) rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.SystemTextJson}/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs (100%) rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.SystemTextJson}/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonUnsupportedTypeMatcher.cs (100%) rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.SystemTextJson}/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs (95%) rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.SystemTextJson}/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableDateTimeConverter.cs (100%) rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.SystemTextJson}/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToBooleanConverter.cs (100%) rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.SystemTextJson}/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs (100%) rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.SystemTextJson}/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumFactory.cs (100%) rename framework/src/{Volo.Abp.Json => Volo.Abp.Json.SystemTextJson}/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs (100%) diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index fadd40bcc5..82f67fe15c 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -409,6 +409,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.RemoteServices", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.PlugIn", "test\Volo.Abp.AspNetCore.Mvc.PlugIn\Volo.Abp.AspNetCore.Mvc.PlugIn.csproj", "{C6D6D878-208A-4FD2-822E-365545D8681B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.Newtonsoft", "src\Volo.Abp.Json.Newtonsoft\Volo.Abp.Json.Newtonsoft.csproj", "{9DD41C8F-0886-483C-B98B-C55EAA7F226D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.SystemTextJson", "src\Volo.Abp.Json.SystemTextJson\Volo.Abp.Json.SystemTextJson.csproj", "{0AD06E14-CBFE-4551-8D18-9E921D8F2A87}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.Core", "src\Volo.Abp.Json.Core\Volo.Abp.Json.Core.csproj", "{08531C5D-0436-4721-986D-96446CF54316}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1219,6 +1225,18 @@ Global {C6D6D878-208A-4FD2-822E-365545D8681B}.Debug|Any CPU.Build.0 = Debug|Any CPU {C6D6D878-208A-4FD2-822E-365545D8681B}.Release|Any CPU.ActiveCfg = Release|Any CPU {C6D6D878-208A-4FD2-822E-365545D8681B}.Release|Any CPU.Build.0 = Release|Any CPU + {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Release|Any CPU.Build.0 = Release|Any CPU + {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Release|Any CPU.Build.0 = Release|Any CPU + {08531C5D-0436-4721-986D-96446CF54316}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {08531C5D-0436-4721-986D-96446CF54316}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08531C5D-0436-4721-986D-96446CF54316}.Release|Any CPU.ActiveCfg = Release|Any CPU + {08531C5D-0436-4721-986D-96446CF54316}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1425,6 +1443,9 @@ Global {3683340D-92F5-4B14-B77B-34A163333309} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {EDFFDA74-090D-439C-A58D-06CCF86D4423} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {C6D6D878-208A-4FD2-822E-365545D8681B} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {9DD41C8F-0886-483C-B98B-C55EAA7F226D} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {0AD06E14-CBFE-4551-8D18-9E921D8F2A87} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {08531C5D-0436-4721-986D-96446CF54316} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.Json.Core/FodyWeavers.xml b/framework/src/Volo.Abp.Json.Core/FodyWeavers.xml new file mode 100644 index 0000000000..bc5a74a236 --- /dev/null +++ b/framework/src/Volo.Abp.Json.Core/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + diff --git a/framework/src/Volo.Abp.Json.Core/FodyWeavers.xsd b/framework/src/Volo.Abp.Json.Core/FodyWeavers.xsd new file mode 100644 index 0000000000..3f3946e282 --- /dev/null +++ b/framework/src/Volo.Abp.Json.Core/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.Json.Core/Volo.Abp.Json.Core.csproj b/framework/src/Volo.Abp.Json.Core/Volo.Abp.Json.Core.csproj new file mode 100644 index 0000000000..b7a88c22f6 --- /dev/null +++ b/framework/src/Volo.Abp.Json.Core/Volo.Abp.Json.Core.csproj @@ -0,0 +1,20 @@ + + + + + + + netstandard2.0 + Volo.Abp.Json.Core + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpHybridJsonSerializer.cs b/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpHybridJsonSerializer.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpHybridJsonSerializer.cs rename to framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpHybridJsonSerializer.cs diff --git a/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonCoreModule.cs b/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonCoreModule.cs new file mode 100644 index 0000000000..68de7be35e --- /dev/null +++ b/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonCoreModule.cs @@ -0,0 +1,8 @@ +using Volo.Abp.Modularity; + +namespace Volo.Abp.Json; + +public class AbpJsonCoreModule : AbpModule +{ + +} diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonOptions.cs b/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonOptions.cs similarity index 87% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonOptions.cs rename to framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonOptions.cs index 74d0c0fb6a..73b1d4506d 100644 --- a/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonOptions.cs +++ b/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonOptions.cs @@ -1,5 +1,4 @@ using Volo.Abp.Collections; -using Volo.Abp.Json.SystemTextJson; namespace Volo.Abp.Json; @@ -13,7 +12,6 @@ public class AbpJsonOptions /// /// It will try to use System.Json.Text to handle JSON if it can otherwise use Newtonsoft. /// Affects both AbpJsonModule and AbpAspNetCoreMvcModule. - /// See /// public bool UseHybridSerializer { get; set; } diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/IJsonSerializer.cs b/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/IJsonSerializer.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/IJsonSerializer.cs rename to framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/IJsonSerializer.cs diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/IJsonSerializerProvider.cs b/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/IJsonSerializerProvider.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/IJsonSerializerProvider.cs rename to framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/IJsonSerializerProvider.cs diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/FodyWeavers.xml b/framework/src/Volo.Abp.Json.Newtonsoft/FodyWeavers.xml new file mode 100644 index 0000000000..bc5a74a236 --- /dev/null +++ b/framework/src/Volo.Abp.Json.Newtonsoft/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/FodyWeavers.xsd b/framework/src/Volo.Abp.Json.Newtonsoft/FodyWeavers.xsd new file mode 100644 index 0000000000..3f3946e282 --- /dev/null +++ b/framework/src/Volo.Abp.Json.Newtonsoft/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo.Abp.Json.Newtonsoft.csproj b/framework/src/Volo.Abp.Json.Newtonsoft/Volo.Abp.Json.Newtonsoft.csproj new file mode 100644 index 0000000000..d53a9e2b33 --- /dev/null +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo.Abp.Json.Newtonsoft.csproj @@ -0,0 +1,23 @@ + + + + + + + netstandard2.0 + Volo.Abp.Json.Newtonsoft + Volo.Abp.Json.Newtonsoft + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + + + diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs rename to framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs new file mode 100644 index 0000000000..afa419bba2 --- /dev/null +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs @@ -0,0 +1,21 @@ +using Volo.Abp.Modularity; +using Volo.Abp.Timing; + +namespace Volo.Abp.Json.Newtonsoft; + +[DependsOn(typeof(AbpJsonCoreModule), typeof(AbpTimingModule))] +public class AbpJsonNewtonsoftModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.Providers.Add(); + }); + + Configure(options => + { + options.Converters.Add(); + }); + } +} diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerOptions.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerOptions.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerOptions.cs rename to framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerOptions.cs diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs rename to framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/FodyWeavers.xml b/framework/src/Volo.Abp.Json.SystemTextJson/FodyWeavers.xml new file mode 100644 index 0000000000..bc5a74a236 --- /dev/null +++ b/framework/src/Volo.Abp.Json.SystemTextJson/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/FodyWeavers.xsd b/framework/src/Volo.Abp.Json.SystemTextJson/FodyWeavers.xsd new file mode 100644 index 0000000000..3f3946e282 --- /dev/null +++ b/framework/src/Volo.Abp.Json.SystemTextJson/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj b/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj new file mode 100644 index 0000000000..c9aa014c82 --- /dev/null +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj @@ -0,0 +1,22 @@ + + + + + + + netstandard2.0 + Volo.Abp.Json.SystemTextJson + Volo.Abp.Json.SystemTextJson + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + + diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs new file mode 100644 index 0000000000..4b15408b51 --- /dev/null +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs @@ -0,0 +1,26 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Options; +using Volo.Abp.Modularity; +using Volo.Abp.Timing; + +namespace Volo.Abp.Json.SystemTextJson; + +[DependsOn(typeof(AbpJsonCoreModule), typeof(AbpTimingModule))] +public class AbpJsonSystemTextJsonModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.TryAddEnumerable(ServiceDescriptor + .Transient, AbpSystemTextJsonSerializerOptionsSetup>()); + + var preActions = context.Services.GetPreConfigureActions(); + Configure(options => + { + if (preActions.Configure().UseHybridSerializer) + { + options.Providers.Add(); + } + }); + } +} diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptions.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptions.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptions.cs rename to framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptions.cs diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs rename to framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs rename to framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonUnsupportedTypeMatcher.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonUnsupportedTypeMatcher.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonUnsupportedTypeMatcher.cs rename to framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonUnsupportedTypeMatcher.cs diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs similarity index 95% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs rename to framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs index 42af711772..417037e776 100644 --- a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs @@ -37,9 +37,9 @@ public class AbpDateTimeConverter : JsonConverter, ITransientDependenc throw new JsonException("Reader's TokenType is not String!"); } - if (reader.TryGetDateTime(out var d2)) + if (reader.TryGetDateTime(out var d3)) { - return _clock.Normalize(d2); + return _clock.Normalize(d3); } throw new JsonException("Can't get datetime from the reader!"); diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableDateTimeConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableDateTimeConverter.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableDateTimeConverter.cs rename to framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableDateTimeConverter.cs diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToBooleanConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToBooleanConverter.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToBooleanConverter.cs rename to framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToBooleanConverter.cs diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs rename to framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumFactory.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumFactory.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumFactory.cs rename to framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumFactory.cs diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs similarity index 100% rename from framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs rename to framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs diff --git a/framework/src/Volo.Abp.Json/Volo.Abp.Json.csproj b/framework/src/Volo.Abp.Json/Volo.Abp.Json.csproj index 76cbe9f28f..fd0408acba 100644 --- a/framework/src/Volo.Abp.Json/Volo.Abp.Json.csproj +++ b/framework/src/Volo.Abp.Json/Volo.Abp.Json.csproj @@ -15,9 +15,8 @@ - - - + + diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonModule.cs b/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonModule.cs index 77f791cd27..ef9419a784 100644 --- a/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonModule.cs +++ b/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonModule.cs @@ -1,34 +1,11 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Options; -using Volo.Abp.Json.Newtonsoft; +using Volo.Abp.Json.Newtonsoft; using Volo.Abp.Json.SystemTextJson; using Volo.Abp.Modularity; -using Volo.Abp.Timing; namespace Volo.Abp.Json; -[DependsOn(typeof(AbpTimingModule))] +[DependsOn(typeof(AbpJsonNewtonsoftModule), typeof(AbpJsonSystemTextJsonModule))] public class AbpJsonModule : AbpModule { - public override void ConfigureServices(ServiceConfigurationContext context) - { - context.Services.TryAddEnumerable(ServiceDescriptor - .Transient, AbpSystemTextJsonSerializerOptionsSetup>()); - var preActions = context.Services.GetPreConfigureActions(); - Configure(options => - { - options.Providers.Add(); - if (preActions.Configure().UseHybridSerializer) - { - options.Providers.Add(); - } - }); - - Configure(options => - { - options.Converters.Add(); - }); - } } From 27b305d5bd44c83b43e34238151a42dd8ad9968f Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 21 Jul 2022 16:11:10 +0800 Subject: [PATCH 003/362] Update common.ps1 --- nupkg/common.ps1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index f13746aed0..b39e3b1ec2 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -191,6 +191,9 @@ $projects = ( "framework/src/Volo.Abp.Http", "framework/src/Volo.Abp.IdentityModel", "framework/src/Volo.Abp.Json", + "framework/src/Volo.Abp.Json.Core", + "framework/src/Volo.Abp.Json.Newtonsoft", + "framework/src/Volo.Abp.Json.SystemTextJson", "framework/src/Volo.Abp.Ldap", "framework/src/Volo.Abp.Localization.Abstractions", "framework/src/Volo.Abp.MailKit", From f77f92aeee54e1f75a8a77cddbd257c0fd594c9b Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 22 Jul 2022 16:53:59 +0800 Subject: [PATCH 004/362] Add `Volo.Abp.AspNetCore.Mvc.NewtonsoftJson` package. --- framework/Volo.Abp.sln | 7 ++ .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 ++++++++ ...o.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj | 28 ++++++++ .../AbpAspNetCoreMvcNewtonsoftModule.cs | 42 +++++++++++ .../AbpAspNetCoreMvcNewtonsoftOptions.cs | 11 +++ .../AbpMvcNewtonsoftJsonOptionsSetup.cs | 4 +- .../AbpNewtonsoftJsonContractResolver.cs} | 6 +- .../AbpNewtonsoftJsonFormatter.cs | 65 +++++++++++++++++ .../Volo.Abp.AspNetCore.Mvc.csproj | 1 - .../Mvc/Json/AbpHybridJsonFormatterOptions.cs | 17 +++++ .../Mvc/Json/AbpHybridJsonInputFormatter.cs | 31 ++++---- .../Mvc/Json/AbpHybridJsonOptionsSetup.cs | 72 ------------------- .../Mvc/Json/AbpHybridJsonOutputFormatter.cs | 32 ++++----- .../Mvc/Json/AbpSystemTextJsonFormatter.cs | 60 ++++++++++++++++ .../Mvc/Json/IAbpHybridJsonInputFormatter.cs | 12 ++++ .../Mvc/Json/IAbpHybridJsonOutputFormatter.cs | 12 ++++ .../Mvc/Json/MvcCoreBuilderExtensions.cs | 28 ++++---- .../Volo/Abp/Json/AbpJsonOptions.cs | 7 -- .../AbpJsonSystemTextJsonModule.cs | 9 +-- .../Volo.Abp.AspNetCore.Mvc.Tests.csproj | 2 +- .../Mvc/AbpAspNetCoreMvcTestModule.cs | 3 +- nupkg/common.ps1 | 1 + 23 files changed, 345 insertions(+), 138 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/FodyWeavers.xml create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/FodyWeavers.xsd create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftModule.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftOptions.cs rename framework/src/{Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json => Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson}/AbpMvcNewtonsoftJsonOptionsSetup.cs (83%) rename framework/src/{Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpMvcJsonContractResolver.cs => Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonContractResolver.cs} (85%) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonFormatter.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonFormatterOptions.cs delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOptionsSetup.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpSystemTextJsonFormatter.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonInputFormatter.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonOutputFormatter.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 82f67fe15c..b646c5f9e6 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -415,6 +415,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.SystemTextJso EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.Core", "src\Volo.Abp.Json.Core\Volo.Abp.Json.Core.csproj", "{08531C5D-0436-4721-986D-96446CF54316}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.NewtonsoftJson", "src\Volo.Abp.AspNetCore.Mvc.NewtonsoftJson\Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj", "{0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1237,6 +1239,10 @@ Global {08531C5D-0436-4721-986D-96446CF54316}.Debug|Any CPU.Build.0 = Debug|Any CPU {08531C5D-0436-4721-986D-96446CF54316}.Release|Any CPU.ActiveCfg = Release|Any CPU {08531C5D-0436-4721-986D-96446CF54316}.Release|Any CPU.Build.0 = Release|Any CPU + {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1446,6 +1452,7 @@ Global {9DD41C8F-0886-483C-B98B-C55EAA7F226D} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {0AD06E14-CBFE-4551-8D18-9E921D8F2A87} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {08531C5D-0436-4721-986D-96446CF54316} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/FodyWeavers.xml b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/FodyWeavers.xml new file mode 100644 index 0000000000..bc5a74a236 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/FodyWeavers.xsd b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/FodyWeavers.xsd new file mode 100644 index 0000000000..3f3946e282 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj new file mode 100644 index 0000000000..9e8b8951e3 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj @@ -0,0 +1,28 @@ + + + + + + + net6.0 + true + Volo.Abp.AspNetCore.Mvc.NewtonsoftJson + Volo.Abp.AspNetCore.Mvc.NewtonsoftJson + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + true + Library + + + + + + + + + + + + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftModule.cs new file mode 100644 index 0000000000..ccf25979db --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftModule.cs @@ -0,0 +1,42 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Formatters; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.ObjectPool; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Mvc.Json; +using Volo.Abp.Modularity; + +namespace Volo.Abp.AspNetCore.Mvc.NewtonsoftJson; + +[DependsOn(typeof(AbpAspNetCoreMvcModule))] +public class AbpAspNetCoreMvcNewtonsoftModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + var options = context.Services.ExecutePreConfiguredActions(); + + if (options.UseHybridSerializer) + { + context.Services.TryAddSingleton(); + + Configure(mvcOptions => + { + mvcOptions.InputFormatters.RemoveType(); + mvcOptions.OutputFormatters.RemoveType(); + }); + + Configure(formatterOptions => + { + formatterOptions.TextInputFormatters.Add(); + formatterOptions.TextOutputFormatters.Add(); + }); + } + else + { + context.Services.AddMvcCore().AddNewtonsoftJson(); + } + + context.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpMvcNewtonsoftJsonOptionsSetup>()); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftOptions.cs new file mode 100644 index 0000000000..63d11b00b7 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftOptions.cs @@ -0,0 +1,11 @@ +namespace Volo.Abp.AspNetCore.Mvc.NewtonsoftJson; + +public class AbpAspNetCoreMvcNewtonsoftOptions +{ + public bool UseHybridSerializer { get; set; } + + public AbpAspNetCoreMvcNewtonsoftOptions() + { + UseHybridSerializer = true; + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpMvcNewtonsoftJsonOptionsSetup.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpMvcNewtonsoftJsonOptionsSetup.cs similarity index 83% rename from framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpMvcNewtonsoftJsonOptionsSetup.cs rename to framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpMvcNewtonsoftJsonOptionsSetup.cs index c68b912372..1d1dc6a373 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpMvcNewtonsoftJsonOptionsSetup.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpMvcNewtonsoftJsonOptionsSetup.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -namespace Volo.Abp.AspNetCore.Mvc.Json; +namespace Volo.Abp.AspNetCore.Mvc.NewtonsoftJson; public class AbpMvcNewtonsoftJsonOptionsSetup : IConfigureOptions { @@ -16,6 +16,6 @@ public class AbpMvcNewtonsoftJsonOptionsSetup : IConfigureOptions(); + options.SerializerSettings.ContractResolver = ServiceProvider.GetRequiredService(); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpMvcJsonContractResolver.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonContractResolver.cs similarity index 85% rename from framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpMvcJsonContractResolver.cs rename to framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonContractResolver.cs index a6f242d59c..f33c9abbd4 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpMvcJsonContractResolver.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonContractResolver.cs @@ -8,13 +8,13 @@ using Volo.Abp.Json.Newtonsoft; using Volo.Abp.Reflection; using Volo.Abp.Timing; -namespace Volo.Abp.AspNetCore.Mvc.Json; +namespace Volo.Abp.AspNetCore.Mvc.NewtonsoftJson; -public class AbpMvcJsonContractResolver : DefaultContractResolver, ITransientDependency +public class AbpNewtonsoftJsonContractResolver : DefaultContractResolver, ITransientDependency { private readonly Lazy _dateTimeConverter; - public AbpMvcJsonContractResolver(IServiceProvider serviceProvider) + public AbpNewtonsoftJsonContractResolver(IServiceProvider serviceProvider) { _dateTimeConverter = new Lazy( serviceProvider.GetRequiredService, diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonFormatter.cs new file mode 100644 index 0000000000..aa411bfb61 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonFormatter.cs @@ -0,0 +1,65 @@ +using System; +using System.Buffers; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Formatters; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.ObjectPool; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Mvc.Json; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Mvc.NewtonsoftJson; + +public class AbpNewtonsoftJsonFormatter : IAbpHybridJsonInputFormatter, IAbpHybridJsonOutputFormatter, ITransientDependency +{ + private readonly ILoggerFactory _loggerFactory; + private readonly ArrayPool _charPool; + private readonly ObjectPoolProvider _objectPoolProvider; + private readonly IOptions _mvcOptions; + private readonly IOptions _mvcNewtonsoftJsonOptions; + + public AbpNewtonsoftJsonFormatter( + ILoggerFactory loggerFactory, + ArrayPool charPool, + ObjectPoolProvider objectPoolProvider, + IOptions mvcOptions, + IOptions mvcNewtonsoftJsonOptions) + { + _loggerFactory = loggerFactory; + _charPool = charPool; + _objectPoolProvider = objectPoolProvider; + _mvcOptions = mvcOptions; + _mvcNewtonsoftJsonOptions = mvcNewtonsoftJsonOptions; + } + + Task IAbpHybridJsonInputFormatter.CanHandleAsync(Type type) + { + return Task.FromResult(true); + } + + public Task GetTextInputFormatterAsync() + { + return Task.FromResult(new NewtonsoftJsonInputFormatter( + _loggerFactory.CreateLogger(), + _mvcNewtonsoftJsonOptions.Value.SerializerSettings, + _charPool, + _objectPoolProvider, + _mvcOptions.Value, + _mvcNewtonsoftJsonOptions.Value)); + } + + Task IAbpHybridJsonOutputFormatter.CanHandleAsync(Type type) + { + return Task.FromResult(true); + } + + public Task GetTextOutputFormatterAsync() + { + return Task.FromResult(new NewtonsoftJsonOutputFormatter( + _mvcNewtonsoftJsonOptions.Value.SerializerSettings, + _charPool, + _mvcOptions.Value, + _mvcNewtonsoftJsonOptions.Value)); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj index 9113c4529e..048c2308e7 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj @@ -29,7 +29,6 @@ - diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonFormatterOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonFormatterOptions.cs new file mode 100644 index 0000000000..066ebe4413 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonFormatterOptions.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Mvc.Formatters; +using Volo.Abp.Collections; + +namespace Volo.Abp.AspNetCore.Mvc.Json; + +public class AbpHybridJsonFormatterOptions +{ + public ITypeList TextInputFormatters { get; } + + public ITypeList TextOutputFormatters { get; } + + public AbpHybridJsonFormatterOptions() + { + TextInputFormatters = new TypeList(); + TextOutputFormatters = new TypeList(); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonInputFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonInputFormatter.cs index 69da26a317..874508ac1f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonInputFormatter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonInputFormatter.cs @@ -1,21 +1,16 @@ -using System.Text; +using System; +using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Json.SystemTextJson; +using Microsoft.Extensions.Options; namespace Volo.Abp.AspNetCore.Mvc.Json; public class AbpHybridJsonInputFormatter : TextInputFormatter, IInputFormatterExceptionPolicy { - private readonly SystemTextJsonInputFormatter _systemTextJsonInputFormatter; - private readonly NewtonsoftJsonInputFormatter _newtonsoftJsonInputFormatter; - - public AbpHybridJsonInputFormatter(SystemTextJsonInputFormatter systemTextJsonInputFormatter, NewtonsoftJsonInputFormatter newtonsoftJsonInputFormatter) + public AbpHybridJsonInputFormatter() { - _systemTextJsonInputFormatter = systemTextJsonInputFormatter; - _newtonsoftJsonInputFormatter = newtonsoftJsonInputFormatter; - SupportedEncodings.Add(UTF8EncodingWithoutBOM); SupportedEncodings.Add(UTF16EncodingLittleEndian); @@ -24,21 +19,25 @@ public class AbpHybridJsonInputFormatter : TextInputFormatter, IInputFormatterEx SupportedMediaTypes.Add(MediaTypeHeaderValues.ApplicationAnyJsonSyntax); } - public override async Task ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding) + public async override Task ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding) { - return await GetTextInputFormatter(context).ReadRequestBodyAsync(context, encoding); + return await (await GetTextInputFormatterAsync(context)).ReadRequestBodyAsync(context, encoding); } - protected virtual TextInputFormatter GetTextInputFormatter(InputFormatterContext context) + protected virtual async Task GetTextInputFormatterAsync(InputFormatterContext context) { - var typesMatcher = context.HttpContext.RequestServices.GetRequiredService(); + var options = context.HttpContext.RequestServices.GetRequiredService>().Value; - if (!typesMatcher.Match(context.ModelType)) + foreach (var inputFormatterType in options.TextInputFormatters) { - return _systemTextJsonInputFormatter; + var inputFormatter = context.HttpContext.RequestServices.GetRequiredService(inputFormatterType).As(); + if (await inputFormatter.CanHandleAsync(context.ModelType)) + { + return await inputFormatter.GetTextInputFormatterAsync(); + } } - return _newtonsoftJsonInputFormatter; + throw new AbpException($"The {nameof(AbpHybridJsonInputFormatter)} can't handle '{context.ModelType.GetFullNameWithAssemblyName()}'!"); } public virtual InputFormatterExceptionPolicy ExceptionPolicy => InputFormatterExceptionPolicy.MalformedInputExceptions; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOptionsSetup.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOptionsSetup.cs deleted file mode 100644 index 794bc79af9..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOptionsSetup.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.Buffers; -using System.Text.Encodings.Web; -using System.Text.Json; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Formatters; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.ObjectPool; -using Microsoft.Extensions.Options; - -namespace Volo.Abp.AspNetCore.Mvc.Json; - -public class AbpHybridJsonOptionsSetup : IConfigureOptions -{ - private readonly IOptions _jsonOptions; - private readonly IOptions _mvcNewtonsoftJsonOptions; - private readonly ILoggerFactory _loggerFactory; - private readonly ArrayPool _charPool; - private readonly ObjectPoolProvider _objectPoolProvider; - - public AbpHybridJsonOptionsSetup( - IOptions jsonOptions, - IOptions mvcNewtonsoftJsonOptions, - ILoggerFactory loggerFactory, - ArrayPool charPool, - ObjectPoolProvider objectPoolProvider) - { - _jsonOptions = jsonOptions; - _mvcNewtonsoftJsonOptions = mvcNewtonsoftJsonOptions; - _loggerFactory = loggerFactory; - _charPool = charPool; - _objectPoolProvider = objectPoolProvider; - } - - public void Configure(MvcOptions options) - { - var systemTextJsonInputFormatter = new SystemTextJsonInputFormatter( - _jsonOptions.Value, - _loggerFactory.CreateLogger()); - - var newtonsoftJsonInputFormatter = new NewtonsoftJsonInputFormatter( - _loggerFactory.CreateLogger(), - _mvcNewtonsoftJsonOptions.Value.SerializerSettings, - _charPool, - _objectPoolProvider, - options, - _mvcNewtonsoftJsonOptions.Value); - - options.InputFormatters.RemoveType(); - options.InputFormatters.RemoveType(); - options.InputFormatters.Add(new AbpHybridJsonInputFormatter(systemTextJsonInputFormatter, newtonsoftJsonInputFormatter)); - - var jsonSerializerOptions = _jsonOptions.Value.JsonSerializerOptions; - if (jsonSerializerOptions.Encoder is null) - { - // If the user hasn't explicitly configured the encoder, use the less strict encoder that does not encode all non-ASCII characters. - jsonSerializerOptions = new JsonSerializerOptions(jsonSerializerOptions) - { - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, - }; - } - - var systemTextJsonOutputFormatter = new SystemTextJsonOutputFormatter(jsonSerializerOptions); - var newtonsoftJsonOutputFormatter = new NewtonsoftJsonOutputFormatter( - _mvcNewtonsoftJsonOptions.Value.SerializerSettings, - _charPool, - options); - - options.OutputFormatters.RemoveType(); - options.OutputFormatters.RemoveType(); - options.OutputFormatters.Add(new AbpHybridJsonOutputFormatter(systemTextJsonOutputFormatter, newtonsoftJsonOutputFormatter)); - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOutputFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOutputFormatter.cs index f4c5df1dc9..2960ff1635 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOutputFormatter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOutputFormatter.cs @@ -1,21 +1,16 @@ -using System.Text; +using System; +using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Json.SystemTextJson; +using Microsoft.Extensions.Options; namespace Volo.Abp.AspNetCore.Mvc.Json; public class AbpHybridJsonOutputFormatter : TextOutputFormatter { - private readonly SystemTextJsonOutputFormatter _systemTextJsonOutputFormatter; - private readonly NewtonsoftJsonOutputFormatter _newtonsoftJsonOutputFormatter; - - public AbpHybridJsonOutputFormatter(SystemTextJsonOutputFormatter systemTextJsonOutputFormatter, NewtonsoftJsonOutputFormatter newtonsoftJsonOutputFormatter) + public AbpHybridJsonOutputFormatter() { - _systemTextJsonOutputFormatter = systemTextJsonOutputFormatter; - _newtonsoftJsonOutputFormatter = newtonsoftJsonOutputFormatter; - SupportedEncodings.Add(Encoding.UTF8); SupportedEncodings.Add(Encoding.Unicode); @@ -24,19 +19,24 @@ public class AbpHybridJsonOutputFormatter : TextOutputFormatter SupportedMediaTypes.Add(MediaTypeHeaderValues.ApplicationAnyJsonSyntax); } - public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding) + public async override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding) { - await GetTextInputFormatter(context).WriteResponseBodyAsync(context, selectedEncoding); + await (await GetTextInputFormatter(context)).WriteResponseBodyAsync(context, selectedEncoding); } - protected virtual TextOutputFormatter GetTextInputFormatter(OutputFormatterWriteContext context) + protected virtual async Task GetTextInputFormatter(OutputFormatterWriteContext context) { - var typesMatcher = context.HttpContext.RequestServices.GetRequiredService(); - if (!typesMatcher.Match(context.ObjectType)) + var options = context.HttpContext.RequestServices.GetRequiredService>().Value; + + foreach (var outputFormatterType in options.TextOutputFormatters) { - return _systemTextJsonOutputFormatter; + var outputFormatter = context.HttpContext.RequestServices.GetRequiredService(outputFormatterType).As(); + if (await outputFormatter.CanHandleAsync(context.ObjectType)) + { + return await outputFormatter.GetTextOutputFormatterAsync(); + } } - return _newtonsoftJsonOutputFormatter; + throw new AbpException($"The {nameof(AbpHybridJsonOutputFormatter)} can't handle '{context.ObjectType.GetFullNameWithAssemblyName()}'!"); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpSystemTextJsonFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpSystemTextJsonFormatter.cs new file mode 100644 index 0000000000..e680d54fa5 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpSystemTextJsonFormatter.cs @@ -0,0 +1,60 @@ +using System; +using System.Text.Encodings.Web; +using System.Text.Json; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Formatters; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Json.SystemTextJson; + +namespace Volo.Abp.AspNetCore.Mvc.Json; + +public class AbpSystemTextJsonFormatter : IAbpHybridJsonInputFormatter, IAbpHybridJsonOutputFormatter, ITransientDependency +{ + private readonly AbpSystemTextJsonUnsupportedTypeMatcher _unsupportedTypeMatcher; + private readonly IOptions _jsonOptions; + private readonly ILoggerFactory _loggerFactory; + + public AbpSystemTextJsonFormatter(AbpSystemTextJsonUnsupportedTypeMatcher unsupportedTypeMatcher, + IOptions jsonOptions, + ILoggerFactory loggerFactory) + { + _unsupportedTypeMatcher = unsupportedTypeMatcher; + _jsonOptions = jsonOptions; + _loggerFactory = loggerFactory; + } + + Task IAbpHybridJsonInputFormatter.CanHandleAsync(Type type) + { + return Task.FromResult(!_unsupportedTypeMatcher.Match(type)); + } + + public virtual Task GetTextInputFormatterAsync() + { + return Task.FromResult(new SystemTextJsonInputFormatter( + _jsonOptions.Value, + _loggerFactory.CreateLogger())); + } + + Task IAbpHybridJsonOutputFormatter.CanHandleAsync(Type type) + { + return Task.FromResult(!_unsupportedTypeMatcher.Match(type)); + } + + public Task GetTextOutputFormatterAsync() + { + var jsonSerializerOptions = _jsonOptions.Value.JsonSerializerOptions; + if (jsonSerializerOptions.Encoder is null) + { + // If the user hasn't explicitly configured the encoder, use the less strict encoder that does not encode all non-ASCII characters. + jsonSerializerOptions = new JsonSerializerOptions(jsonSerializerOptions) + { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }; + } + + return Task.FromResult(new SystemTextJsonOutputFormatter(jsonSerializerOptions)); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonInputFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonInputFormatter.cs new file mode 100644 index 0000000000..0a167e58d4 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonInputFormatter.cs @@ -0,0 +1,12 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.Formatters; + +namespace Volo.Abp.AspNetCore.Mvc.Json; + +public interface IAbpHybridJsonInputFormatter +{ + Task CanHandleAsync(Type type); + + Task GetTextInputFormatterAsync(); +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonOutputFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonOutputFormatter.cs new file mode 100644 index 0000000000..06418b88d4 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonOutputFormatter.cs @@ -0,0 +1,12 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.Formatters; + +namespace Volo.Abp.AspNetCore.Mvc.Json; + +public interface IAbpHybridJsonOutputFormatter +{ + Task CanHandleAsync(Type type); + + Task GetTextOutputFormatterAsync(); +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs index 2d3a834d09..39a4e0670a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs @@ -1,9 +1,8 @@ using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -using Microsoft.Extensions.ObjectPool; -using Volo.Abp.Json; namespace Volo.Abp.AspNetCore.Mvc.Json; @@ -11,18 +10,23 @@ public static class MvcCoreBuilderExtensions { public static IMvcCoreBuilder AddAbpHybridJson(this IMvcCoreBuilder builder) { - var abpJsonOptions = builder.Services.ExecutePreConfiguredActions(); - if (!abpJsonOptions.UseHybridSerializer) + builder.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpJsonOptionsSetup>()); + + builder.Services.Configure(options => { - builder.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpMvcNewtonsoftJsonOptionsSetup>()); - builder.AddNewtonsoftJson(); - return builder; - } + options.InputFormatters.RemoveType(); + options.InputFormatters.Add(new AbpHybridJsonInputFormatter()); + + options.OutputFormatters.RemoveType(); + options.OutputFormatters.Add(new AbpHybridJsonOutputFormatter()); + }); + + builder.Services.Configure(options => + { + options.TextInputFormatters.Add(); + options.TextOutputFormatters.Add(); + }); - builder.Services.TryAddTransient(); - builder.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpJsonOptionsSetup>()); - builder.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpMvcNewtonsoftJsonOptionsSetup>()); - builder.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpHybridJsonOptionsSetup>()); return builder; } } diff --git a/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonOptions.cs b/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonOptions.cs index 73b1d4506d..ffbd510b93 100644 --- a/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonOptions.cs +++ b/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonOptions.cs @@ -9,17 +9,10 @@ public class AbpJsonOptions /// public string DefaultDateTimeFormat { get; set; } - /// - /// It will try to use System.Json.Text to handle JSON if it can otherwise use Newtonsoft. - /// Affects both AbpJsonModule and AbpAspNetCoreMvcModule. - /// - public bool UseHybridSerializer { get; set; } - public ITypeList Providers { get; } public AbpJsonOptions() { Providers = new TypeList(); - UseHybridSerializer = true; } } diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs index 4b15408b51..895c9bcfe4 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs @@ -11,16 +11,11 @@ public class AbpJsonSystemTextJsonModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.TryAddEnumerable(ServiceDescriptor - .Transient, AbpSystemTextJsonSerializerOptionsSetup>()); + context.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpSystemTextJsonSerializerOptionsSetup>()); - var preActions = context.Services.GetPreConfigureActions(); Configure(options => { - if (preActions.Configure().UseHybridSerializer) - { - options.Providers.Add(); - } + options.Providers.Add(); }); } } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj index 53a9bd3747..f577746665 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj @@ -25,7 +25,7 @@ - + diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs index e303a0fb5d..76a95a09cf 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs @@ -11,6 +11,7 @@ using Volo.Abp.AspNetCore.Mvc.Authorization; using Volo.Abp.AspNetCore.Mvc.GlobalFeatures; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.Localization.Resource; +using Volo.Abp.AspNetCore.Mvc.NewtonsoftJson; using Volo.Abp.AspNetCore.Security.Claims; using Volo.Abp.AspNetCore.TestBase; using Volo.Abp.Authorization; @@ -29,7 +30,7 @@ namespace Volo.Abp.AspNetCore.Mvc; [DependsOn( typeof(AbpAspNetCoreTestBaseModule), typeof(AbpMemoryDbTestModule), - typeof(AbpAspNetCoreMvcModule), + typeof(AbpAspNetCoreMvcNewtonsoftModule), typeof(AbpAutofacModule) )] public class AbpAspNetCoreMvcTestModule : AbpModule diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index b39e3b1ec2..9f44b11c6d 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -112,6 +112,7 @@ $projects = ( "framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common", "framework/src/Volo.Abp.AspNetCore.Mvc.Contracts", "framework/src/Volo.Abp.AspNetCore.Mvc", + "framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson", "framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap", "framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions", "framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling", From 4c6eaf8e89390844e9131719ec9224bd88771740 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 22 Jul 2022 17:10:57 +0800 Subject: [PATCH 005/362] Update `StringValueJsonConverter_Tests`. --- .../NewtonsoftStringValueJsonConverter_Tests.cs | 3 ++- .../SystemTextJsonStringValueJsonConverter_Tests.cs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/NewtonsoftStringValueJsonConverter_Tests.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/NewtonsoftStringValueJsonConverter_Tests.cs index 09f3c2266d..4a8a1a36be 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/NewtonsoftStringValueJsonConverter_Tests.cs +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/NewtonsoftStringValueJsonConverter_Tests.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Json; +using Volo.Abp.Json.SystemTextJson; namespace Volo.Abp.FeatureManagement; @@ -9,7 +10,7 @@ public class NewtonsoftStringValueJsonConverter_Tests : StringValueJsonConverter { services.PreConfigure(options => { - options.UseHybridSerializer = false; + options.Providers.Remove(); }); } } diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/SystemTextJsonStringValueJsonConverter_Tests.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/SystemTextJsonStringValueJsonConverter_Tests.cs index 968055c09f..e51f9885ac 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/SystemTextJsonStringValueJsonConverter_Tests.cs +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/SystemTextJsonStringValueJsonConverter_Tests.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Json; +using Volo.Abp.Json.Newtonsoft; namespace Volo.Abp.FeatureManagement; @@ -9,7 +10,7 @@ public class SystemTextJsonStringValueJsonConverter_Tests : StringValueJsonConve { services.PreConfigure(options => { - options.UseHybridSerializer = true; + options.Providers.Remove(); }); } } From 4da3ad0b6fbc7763a9b838081fc3fa0c6f37ffbf Mon Sep 17 00:00:00 2001 From: malik masis Date: Mon, 8 Aug 2022 14:31:23 +0300 Subject: [PATCH 006/362] Added a new column to Page named `IsHomePage` --- ...ial.Designer.cs => 20220808112328_Initial.Designer.cs} | 7 +++++-- ...0220504032430_Initial.cs => 20220808112328_Initial.cs} | 1 + .../Migrations/UnifiedDbContextModelSnapshot.cs | 5 ++++- .../Volo/CmsKit/Admin/Pages/PageDto.cs | 2 ++ .../src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs | 6 +++--- .../Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs | 8 ++------ 6 files changed, 17 insertions(+), 12 deletions(-) rename modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/{20220504032430_Initial.Designer.cs => 20220808112328_Initial.Designer.cs} (99%) rename modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/{20220504032430_Initial.cs => 20220808112328_Initial.cs} (99%) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220504032430_Initial.Designer.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.Designer.cs similarity index 99% rename from modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220504032430_Initial.Designer.cs rename to modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.Designer.cs index fc428d9f31..a94401a3a4 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220504032430_Initial.Designer.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.CmsKit.EntityFrameworkCore; namespace Volo.CmsKit.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20220504032430_Initial")] + [Migration("20220808112328_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -21,7 +21,7 @@ namespace Volo.CmsKit.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "6.0.0") + .HasAnnotation("ProductVersion", "6.0.5") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1); @@ -1662,6 +1662,9 @@ namespace Volo.CmsKit.Migrations .HasDefaultValue(false) .HasColumnName("IsDeleted"); + b.Property("IsHomePage") + .HasColumnType("bit"); + b.Property("LastModificationTime") .HasColumnType("datetime2") .HasColumnName("LastModificationTime"); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220504032430_Initial.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.cs similarity index 99% rename from modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220504032430_Initial.cs rename to modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.cs index e48811ee84..5f499c30a9 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220504032430_Initial.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.cs @@ -433,6 +433,7 @@ namespace Volo.CmsKit.Migrations Content = table.Column(type: "nvarchar(max)", maxLength: 2147483647, nullable: true), Script = table.Column(type: "nvarchar(max)", nullable: true), Style = table.Column(type: "nvarchar(max)", nullable: true), + IsHomePage = table.Column(type: "bit", nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), CreationTime = table.Column(type: "datetime2", nullable: false), diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index 2a5d13e732..4205bd31c3 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace Volo.CmsKit.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "6.0.0") + .HasAnnotation("ProductVersion", "6.0.5") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1); @@ -1660,6 +1660,9 @@ namespace Volo.CmsKit.Migrations .HasDefaultValue(false) .HasColumnName("IsDeleted"); + b.Property("IsHomePage") + .HasColumnType("bit"); + b.Property("LastModificationTime") .HasColumnType("datetime2") .HasColumnName("LastModificationTime"); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs index 20a76bf43e..f8348302d2 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs @@ -17,5 +17,7 @@ public class PageDto : AuditedEntityDto, IHasConcurrencyStamp public string Style { get; set; } + public bool IsHomePage { get; set; } + public string ConcurrencyStamp { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs index d5cd64fbed..339a034ee6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs @@ -20,6 +20,8 @@ public class Page : FullAuditedAggregateRoot, IMultiTenant public virtual string Style { get; protected set; } + public virtual bool IsHomePage { get; set; } + protected Page() { } @@ -49,9 +51,7 @@ public class Page : FullAuditedAggregateRoot, IMultiTenant internal virtual void SetSlug(string slug) { - Slug = SlugNormalizer.Normalize( - Check.NotNullOrEmpty(slug, nameof(slug), PageConsts.MaxSlugLength) - ); + Slug = SlugNormalizer.Normalize(Check.NotNullOrEmpty(slug, nameof(slug), PageConsts.MaxSlugLength)); } public virtual void SetContent(string content) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs index f0d1bac1e7..4a4d15728b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs @@ -1,9 +1,5 @@ -using JetBrains.Annotations; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Threading.Tasks; +using JetBrains.Annotations; using Volo.Abp; using Volo.Abp.Domain.Services; From 384fdab06eb7baa641007e73750365314f757c5a Mon Sep 17 00:00:00 2001 From: malik masis Date: Mon, 8 Aug 2022 16:25:05 +0300 Subject: [PATCH 007/362] Added SetAsHomePage main functionality --- .../Volo/CmsKit/Admin/Pages/IPageAdminAppService.cs | 3 +-- .../Volo/CmsKit/Admin/Pages/PageAdminAppService.cs | 11 +++++++++-- .../Volo/CmsKit/Admin/Pages/PageAdminController.cs | 8 +++++++- .../Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js | 11 +++++++++++ .../wwwroot/client-proxies/cms-kit-admin-proxy.js | 8 ++++++++ .../Volo/CmsKit/Pages/IPageRepository.cs | 2 ++ .../Volo/CmsKit/Pages/PageManager.cs | 10 ++++++++++ .../Volo/CmsKit/Pages/EfCorePageRepository.cs | 5 +++++ .../Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs | 5 +++++ 9 files changed, 58 insertions(+), 5 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/IPageAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/IPageAdminAppService.cs index ec7cb919f9..e0d901bdd5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/IPageAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/IPageAdminAppService.cs @@ -1,11 +1,10 @@ using System; using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; -using Volo.Abp.Content; namespace Volo.CmsKit.Admin.Pages; public interface IPageAdminAppService : ICrudAppService { + Task SetAsHomePageAsync(Guid id); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs index 68f0690555..67c6464e0c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs @@ -1,12 +1,10 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using AutoMapper; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; using Volo.Abp.GlobalFeatures; -using Volo.CmsKit.Admin.Menus; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Pages; using Volo.CmsKit.Permissions; @@ -85,4 +83,13 @@ public class PageAdminAppService : CmsKitAdminAppServiceBase, IPageAdminAppServi { await PageRepository.DeleteAsync(id); } + + public virtual async Task SetAsHomePageAsync(Guid id) + { + await PageManager.SetHomePageAsFalseAsync(true); + + var page = await PageRepository.GetAsync(id); + page.IsHomePage = true; + await PageRepository.UpdateAsync(page); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs index 7936b206e6..8311c8ff58 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs @@ -5,7 +5,6 @@ using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.GlobalFeatures; -using Volo.CmsKit.Admin.Menus; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; @@ -60,4 +59,11 @@ public class PageAdminController : CmsKitAdminController, IPageAdminAppService { return PageAdminAppService.DeleteAsync(id); } + + [HttpGet] + [Route("setashomepage/{id}")] + public virtual Task SetAsHomePageAsync(Guid id) + { + return PageAdminAppService.SetAsHomePageAsync(id); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js index 3a8612072c..f51532c63c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js @@ -46,6 +46,17 @@ $(function (){ abp.notify.success(l('SuccessfullyDeleted')); }); } + }, + { + text: l('SetAsHomePage'), + visible: abp.auth.isGranted('CmsKit.Pages.Delete'), + action: function (data) { + pagesService + .setAsHomePage(data.record.id) + .then(function () { + abp.notify.success(l('SetAsHomePage')); + }); + } } ] } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index 94017ec7e2..320aa73b12 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -136,6 +136,14 @@ }, ajaxParams)); }; + volo.cmsKit.admin.pages.pageAdmin.setAsHomePage = function(id, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-admin/pages/setashomepage/' + id + '', + type: 'GET', + dataType: null + }, ajaxParams)); + }; + })(); // controller volo.cmsKit.admin.menus.menuItemAdmin diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/IPageRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/IPageRepository.cs index 020622f080..20aab4ff8f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/IPageRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/IPageRepository.cs @@ -22,4 +22,6 @@ public interface IPageRepository : IBasicRepository Task FindBySlugAsync(string slug, CancellationToken cancellationToken = default); Task ExistsAsync(string slug, CancellationToken cancellationToken = default); + + Task FindByIsHomePageAsync(bool isHomePage, CancellationToken cancellationToken = default); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs index 4a4d15728b..8a85edfb25 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs @@ -45,6 +45,16 @@ public class PageManager : DomainService } } + public virtual async Task SetHomePageAsFalseAsync(bool isHomePage) + { + var page = await PageRepository.FindByIsHomePageAsync(isHomePage); + if (page is not null) + { + page.IsHomePage = false; + await PageRepository.UpdateAsync(page); + } + } + protected virtual async Task CheckPageSlugAsync(string slug) { if (await PageRepository.ExistsAsync(slug)) diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs index 125c1a97ff..e15689ace9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs @@ -63,4 +63,9 @@ public class EfCorePageRepository : EfCoreRepository x.Slug == slug, GetCancellationToken(cancellationToken)); } + + public virtual Task FindByIsHomePageAsync(bool isHomePage, CancellationToken cancellationToken = default) + { + return FindAsync(x => x.IsHomePage == isHomePage, cancellationToken: GetCancellationToken(cancellationToken)); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs index 74c5d8cc3c..e5073fc374 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs @@ -71,4 +71,9 @@ public class MongoPageRepository : MongoDbRepository x.Slug == slug, GetCancellationToken(cancellationToken)); } + + public virtual Task FindByIsHomePageAsync(bool isHomePage, CancellationToken cancellationToken = default) + { + return FindAsync(x => x.IsHomePage == isHomePage, cancellationToken: GetCancellationToken(cancellationToken)); + } } From 946b9904857e89bc4faba91c1ced7f11cd0328d3 Mon Sep 17 00:00:00 2001 From: malik masis Date: Mon, 8 Aug 2022 17:16:02 +0300 Subject: [PATCH 008/362] Added permission for `SetAsHomePage` --- ...CmsKitAdminPermissionDefinitionProvider.cs | 2 ++ .../Permissions/CmsKitAdminPermissions.cs | 7 +++--- .../CmsKit/Admin/Pages/PageAdminAppService.cs | 1 + .../CmsKit/Admin/Pages/PageAdminController.cs | 1 + .../CmsKitAdminWebModule.cs | 25 ++++++++++--------- .../Pages/CmsKit/Pages/index.js | 2 +- 6 files changed, 21 insertions(+), 17 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs index b89b38d43a..7ba4cc2d84 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs @@ -35,6 +35,8 @@ public class CmsKitAdminPermissionDefinitionProvider : PermissionDefinitionProvi .RequireGlobalFeatures(typeof(PagesFeature)); pageManagement.AddChild(CmsKitAdminPermissions.Pages.Delete, L("Permission:PageManagement:Delete")) .RequireGlobalFeatures(typeof(PagesFeature)); + pageManagement.AddChild(CmsKitAdminPermissions.Pages.SetAsHomePage, L("Permission:PageManagement:SetAsHomePage")) + .RequireGlobalFeatures(typeof(PagesFeature)); var blogManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Blogs.Default, L("Permission:BlogManagement")) .RequireGlobalFeatures(typeof(BlogsFeature)); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs index b5d2a8eaa6..2852a0b4ee 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs @@ -1,8 +1,6 @@ -using Volo.Abp.Reflection; +namespace Volo.CmsKit.Permissions; -namespace Volo.CmsKit.Permissions; - -public class CmsKitAdminPermissions +public static class CmsKitAdminPermissions { public const string GroupName = "CmsKit"; @@ -34,6 +32,7 @@ public class CmsKitAdminPermissions public const string Create = Default + ".Create"; public const string Update = Default + ".Update"; public const string Delete = Default + ".Delete"; + public const string SetAsHomePage = Default + ".SetAsHomePage"; } public static class Blogs diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs index 67c6464e0c..c6c7b614b3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs @@ -84,6 +84,7 @@ public class PageAdminAppService : CmsKitAdminAppServiceBase, IPageAdminAppServi await PageRepository.DeleteAsync(id); } + [Authorize(CmsKitAdminPermissions.Pages.SetAsHomePage)] public virtual async Task SetAsHomePageAsync(Guid id) { await PageManager.SetHomePageAsFalseAsync(true); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs index 8311c8ff58..637c4e11a0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs @@ -61,6 +61,7 @@ public class PageAdminController : CmsKitAdminController, IPageAdminAppService } [HttpGet] + [Authorize(CmsKitAdminPermissions.Pages.SetAsHomePage)] [Route("setashomepage/{id}")] public virtual Task SetAsHomePageAsync(Guid id) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs index be4d85ddcc..4c886b9185 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs @@ -1,19 +1,19 @@ using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc; -using Volo.CmsKit.Admin.Web.Menus; using Volo.Abp.AspNetCore.Mvc.Localization; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.PageToolbars; +using Volo.Abp.AutoMapper; +using Volo.Abp.Http.ProxyScripting.Generators.JQuery; +using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.UI.Navigation; using Volo.Abp.VirtualFileSystem; +using Volo.CmsKit.Admin.MediaDescriptors; +using Volo.CmsKit.Admin.Web.Menus; using Volo.CmsKit.Localization; -using Volo.CmsKit.Web; using Volo.CmsKit.Permissions; -using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.PageToolbars; -using Volo.Abp.Localization; -using Volo.Abp.AutoMapper; -using Volo.Abp.Http.ProxyScripting.Generators.JQuery; -using Volo.CmsKit.Admin.MediaDescriptors; +using Volo.CmsKit.Web; namespace Volo.CmsKit.Admin.Web; @@ -64,6 +64,7 @@ public class CmsKitAdminWebModule : AbpModule options.Conventions.AuthorizeFolder("/CmsKit/Pages", CmsKitAdminPermissions.Pages.Default); options.Conventions.AuthorizeFolder("/CmsKit/Pages/Create", CmsKitAdminPermissions.Pages.Create); options.Conventions.AuthorizeFolder("/CmsKit/Pages/Update", CmsKitAdminPermissions.Pages.Update); + options.Conventions.AuthorizeFolder("/CmsKit/Pages/SetAsHomePage", CmsKitAdminPermissions.Pages.SetAsHomePage); options.Conventions.AuthorizeFolder("/CmsKit/Blogs", CmsKitAdminPermissions.Blogs.Default); options.Conventions.AuthorizeFolder("/CmsKit/Blogs/Create", CmsKitAdminPermissions.Blogs.Create); options.Conventions.AuthorizeFolder("/CmsKit/Blogs/Update", CmsKitAdminPermissions.Blogs.Update); @@ -98,7 +99,7 @@ public class CmsKitAdminWebModule : AbpModule Configure(options => { - options.Configure( + options.Configure( toolbar => { toolbar.AddButton( @@ -110,7 +111,7 @@ public class CmsKitAdminWebModule : AbpModule } ); - options.Configure( + options.Configure( toolbar => { toolbar.AddButton( @@ -121,7 +122,7 @@ public class CmsKitAdminWebModule : AbpModule ); }); - options.Configure( + options.Configure( toolbar => { toolbar.AddButton( @@ -133,7 +134,7 @@ public class CmsKitAdminWebModule : AbpModule ); }); - options.Configure( + options.Configure( toolbar => { toolbar.AddButton( @@ -145,7 +146,7 @@ public class CmsKitAdminWebModule : AbpModule ); }); - options.Configure( + options.Configure( toolbar => { toolbar.AddButton( diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js index f51532c63c..de09ac2077 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js @@ -49,7 +49,7 @@ $(function (){ }, { text: l('SetAsHomePage'), - visible: abp.auth.isGranted('CmsKit.Pages.Delete'), + visible: abp.auth.isGranted('CmsKit.Pages.SetAsHomePage'), action: function (data) { pagesService .setAsHomePage(data.record.id) From b059057eb290ea8f6194c84474813bf15dce8043 Mon Sep 17 00:00:00 2001 From: malik masis Date: Mon, 8 Aug 2022 17:32:49 +0300 Subject: [PATCH 009/362] Added words for languages --- .../Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js | 2 +- .../Volo/CmsKit/Localization/Resources/en.json | 9 ++++++--- .../Volo/CmsKit/Localization/Resources/tr.json | 7 ++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js index de09ac2077..553d0ea1e3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js @@ -54,7 +54,7 @@ $(function (){ pagesService .setAsHomePage(data.record.id) .then(function () { - abp.notify.success(l('SetAsHomePage')); + abp.notify.success(l('CompletedSettingAsHomePage')); }); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 8da6be8bd5..9de5039719 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -112,6 +112,7 @@ "Permission:PageManagement:Create": "Create", "Permission:PageManagement:Delete": "Delete", "Permission:PageManagement:Update": "Update", + "Permission:PageManagement:SetAsHomePage": "Set As Home Page", "Permission:TagManagement": "Tag Management", "Permission:TagManagement.Create": "Create", "Permission:TagManagement.Delete": "Delete", @@ -185,8 +186,10 @@ "Add": "Add", "AddWidget": "Add Widget", "PleaseConfigureWidgets": "Please configure widgets", - "SelectAnAuthor":"Select an Author", - "InThisDocument":"In This Document", - "GoToTop":"Go To Top" + "SelectAnAuthor": "Select an Author", + "InThisDocument": "In This Document", + "GoToTop": "Go To Top", + "SetAsHomePage": "Set As Home Page", + "CompletedSettingAsHomePage": "Set as home page" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 431c50596c..b7bde02a87 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -112,6 +112,7 @@ "Permission:PageManagement:Create": "Oluşturmak", "Permission:PageManagement:Delete": "Silmek", "Permission:PageManagement:Update": "Güncelleme", + "Permission:PageManagement:SetAsHomePage": "Anasayfa Olarak Ayarla", "Permission:TagManagement": "Etiket Yönetimi", "Permission:TagManagement.Create": "Etiket Oluşturma", "Permission:TagManagement.Delete": "Etiket Silme", @@ -163,8 +164,6 @@ "YourReply": "Cevabınız", "MarkdownSupported": "Markdown destekler.", "GlobalResources": "Global Kaynaklar", - "Script": "Script", - "Style": "Style", "SavedSuccessfully": "Başarıyla kaydedildi", "CmsKit.BlogPost.Status.0": "Taslak", "CmsKit.BlogPost.Status.1": "Yayınlandı", @@ -190,6 +189,8 @@ "CmsKit.BlogPost.ScrollIndex": "Blog yazılarında hızlı gezinme çubuğu", "Add": "Ekle", "AddWidget": "Widget Ekle", - "PleaseConfigureWidgets": "Lütfen widget'leri yapılandırın" + "PleaseConfigureWidgets": "Lütfen widget'leri yapılandırın", + "SetAsHomePage": "Anasayfa Olarak Ayarla", + "CompletedSettingAsHomePage": "Anasayfa olarak ayarlandı" } } From 66aeb5a61cb9c222d143f225c735677270361471 Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 9 Aug 2022 10:47:05 +0300 Subject: [PATCH 010/362] Updated http client proxy --- .../PageAdminClientProxy.Generated.cs | 8 ++++ .../cms-kit-admin-generate-proxy.json | 37 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/PageAdminClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/PageAdminClientProxy.Generated.cs index 5d404b2751..efa0315690 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/PageAdminClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/PageAdminClientProxy.Generated.cs @@ -55,4 +55,12 @@ public partial class PageAdminClientProxy : ClientProxyBase" + }, + "SetAsHomePageAsyncById": { + "uniqueName": "SetAsHomePageAsyncById", + "name": "SetAsHomePageAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/pages/setashomepage/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Pages.IPageAdminAppService" } } }, From 64affb09b86e0e084cf96f87d8b0b5211dd60ae1 Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 9 Aug 2022 11:38:57 +0300 Subject: [PATCH 011/362] Added `IsHomePage` to Page list --- .../src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js | 8 +++++++- .../Volo/CmsKit/Localization/Resources/en.json | 3 ++- .../Volo/CmsKit/Localization/Resources/tr.json | 5 +++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js index 553d0ea1e3..8a49f94073 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js @@ -17,7 +17,7 @@ $(function (){ scrollCollapse: true, scrollX: true, ordering: true, - order: [[3, "desc"]], + order: [[4, "desc"]], ajax: abp.libs.datatables.createAjax(pagesService.getList, getFilter), columnDefs: [ { @@ -55,6 +55,7 @@ $(function (){ .setAsHomePage(data.record.id) .then(function () { abp.notify.success(l('CompletedSettingAsHomePage')); + _dataTable.ajax.reload(); }); } } @@ -71,6 +72,11 @@ $(function (){ orderable: true, data: "slug" }, + { + title: l("IsHomePage"), + orderable: true, + data: "isHomePage" + }, { title: l("CreationTime"), orderable: true, diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 9de5039719..79618107d5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -190,6 +190,7 @@ "InThisDocument": "In This Document", "GoToTop": "Go To Top", "SetAsHomePage": "Set As Home Page", - "CompletedSettingAsHomePage": "Set as home page" + "CompletedSettingAsHomePage": "Set as home page", + "IsHomePage": "Is Home Page" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index b7bde02a87..6223b3a2de 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -190,7 +190,8 @@ "Add": "Ekle", "AddWidget": "Widget Ekle", "PleaseConfigureWidgets": "Lütfen widget'leri yapılandırın", - "SetAsHomePage": "Anasayfa Olarak Ayarla", - "CompletedSettingAsHomePage": "Anasayfa olarak ayarlandı" + "SetAsHomePage": "Ana sayfa Olarak Ayarla", + "CompletedSettingAsHomePage": "Ana sayfa olarak ayarlandı", + "IsHomePage": "Ana Sayfa Mı" } } From 3e923ca7ca43a612d90f8e1a728892b339a373c5 Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 9 Aug 2022 11:39:14 +0300 Subject: [PATCH 012/362] Added unit tests --- .../Pages/PageAdminAppService_Tests.cs | 13 +++++++++ .../Pages/PageManager_Test.cs | 27 +++++++++++++++++++ .../Pages/PageRepository_Test.cs | 8 ++++++ 3 files changed, 48 insertions(+) diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs index 97a931fb70..86346da843 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs @@ -130,4 +130,17 @@ public class PageAdminAppService_Tests : CmsKitApplicationTestBase await Should.ThrowAsync(async () => await _pageRepository.GetAsync(_data.Page_1_Id)); } + + [Fact] + public async Task ShouldSetAsHomePageAsync() + { + await _pageAdminAppService.SetAsHomePageAsync(_data.Page_1_Id); + + var setAsHomePage = await _pageAdminAppService.GetAsync(_data.Page_1_Id); + var setAsHomePageAsFalse = await _pageAdminAppService.GetAsync(_data.Page_2_Id); + + setAsHomePage.IsHomePage.ShouldBeTrue(); + setAsHomePageAsFalse.IsHomePage.ShouldBeFalse(); + + } } diff --git a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs index 208de3817f..c674df49eb 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs @@ -67,4 +67,31 @@ public class PageManager_Test : CmsKitDomainTestBase exception.ShouldNotBeNull(); } + + [Fact] + public async Task SetHomePageAsFalseAsync_ShouldWorkProperly_IfExistHomePage() + { + var page = await pageRepository.GetAsync(testData.Page_1_Id); + page.IsHomePage = true; + await pageRepository.UpdateAsync(page); + + await pageManager.SetHomePageAsFalseAsync(true); + + page.IsHomePage.ShouldBeTrue(); + + var pageSetAsHomePageAsFalse = await pageRepository.GetAsync(testData.Page_2_Id); + pageSetAsHomePageAsFalse.IsHomePage.ShouldBeFalse(); + } + + [Fact] + public async Task SetHomePageAsFalseAsync_ShouldWorkProperly_IfNotExistHomePage() + { + var page = await pageRepository.GetAsync(testData.Page_1_Id); + page.IsHomePage = true; + await pageManager.SetHomePageAsFalseAsync(true); + page.IsHomePage.ShouldBeTrue(); + + var pageSetAsHomePageAsFalse = await pageRepository.GetAsync(testData.Page_2_Id); + pageSetAsHomePageAsFalse.IsHomePage.ShouldBeFalse(); + } } diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/Pages/PageRepository_Test.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/Pages/PageRepository_Test.cs index 4b56f77f43..09be4fff6e 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/Pages/PageRepository_Test.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/Pages/PageRepository_Test.cs @@ -91,4 +91,12 @@ public abstract class PageRepository_Test : CmsKitTestBase Date: Tue, 9 Aug 2022 15:02:45 +0300 Subject: [PATCH 013/362] Made the action PUT instead of GET --- .../ClientProxies/cms-kit-admin-generate-proxy.json | 2 +- .../Volo/CmsKit/Admin/Pages/PageAdminController.cs | 4 ++-- .../wwwroot/client-proxies/cms-kit-admin-proxy.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json index 69ff3c2450..4a8bb096dc 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json @@ -679,7 +679,7 @@ "SetAsHomePageAsyncById": { "uniqueName": "SetAsHomePageAsyncById", "name": "SetAsHomePageAsync", - "httpMethod": "GET", + "httpMethod": "PUT", "url": "api/cms-kit-admin/pages/setashomepage/{id}", "supportedVersions": [], "parametersOnMethod": [ diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs index 637c4e11a0..51e8c1a3e0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs @@ -60,10 +60,10 @@ public class PageAdminController : CmsKitAdminController, IPageAdminAppService return PageAdminAppService.DeleteAsync(id); } - [HttpGet] + [HttpPut] [Authorize(CmsKitAdminPermissions.Pages.SetAsHomePage)] [Route("setashomepage/{id}")] - public virtual Task SetAsHomePageAsync(Guid id) + public virtual Task SetAsHomePageAsync([FromRoute] Guid id) { return PageAdminAppService.SetAsHomePageAsync(id); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index 320aa73b12..ff5e16c2d0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -139,7 +139,7 @@ volo.cmsKit.admin.pages.pageAdmin.setAsHomePage = function(id, ajaxParams) { return abp.ajax($.extend(true, { url: abp.appPath + 'api/cms-kit-admin/pages/setashomepage/' + id + '', - type: 'GET', + type: 'PUT', dataType: null }, ajaxParams)); }; From 3b033c395dd401dd0871dd564c4d0eb99b0ddaac Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 9 Aug 2022 15:03:32 +0300 Subject: [PATCH 014/362] Added warning for `AlreadyHomePage` --- .../Pages/CmsKit/Pages/index.js | 20 ++++++++++++------- .../CmsKit/Localization/Resources/en.json | 3 ++- .../CmsKit/Localization/Resources/tr.json | 3 ++- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js index 8a49f94073..4d3d5ba765 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js @@ -1,4 +1,4 @@ -$(function (){ +$(function () { var l = abp.localization.getResource("CmsKit"); var pagesService = volo.cmsKit.admin.pages.pageAdmin; @@ -51,12 +51,18 @@ $(function (){ text: l('SetAsHomePage'), visible: abp.auth.isGranted('CmsKit.Pages.SetAsHomePage'), action: function (data) { - pagesService - .setAsHomePage(data.record.id) - .then(function () { - abp.notify.success(l('CompletedSettingAsHomePage')); - _dataTable.ajax.reload(); - }); + if (data.record.isHomePage === false) { + pagesService + .setAsHomePage(data.record.id) + .then(function () { + + _dataTable.ajax.reload(); + abp.notify.success(l('CompletedSettingAsHomePage')); + }); + } + else { + abp.notify.warn(l('AlreadyHomePage')); + } } } ] diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 79618107d5..983023321a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -191,6 +191,7 @@ "GoToTop": "Go To Top", "SetAsHomePage": "Set As Home Page", "CompletedSettingAsHomePage": "Set as home page", - "IsHomePage": "Is Home Page" + "IsHomePage": "Is Home Page", + "AlreadyHomePage": "Already set as home page" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 6223b3a2de..bf02b689ce 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -192,6 +192,7 @@ "PleaseConfigureWidgets": "Lütfen widget'leri yapılandırın", "SetAsHomePage": "Ana sayfa Olarak Ayarla", "CompletedSettingAsHomePage": "Ana sayfa olarak ayarlandı", - "IsHomePage": "Ana Sayfa Mı" + "IsHomePage": "Ana Sayfa Mı", + "AlreadyHomePage": "Önceden ana sayfa olarak ayarlı" } } From e7e9756cf228acdeaf0eaa2eee49264d6927fdd5 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 10 Aug 2022 15:44:32 +0800 Subject: [PATCH 015/362] Upgrade to NET 7.0. --- .github/workflows/build-and-test.yml | 2 +- Directory.Build.props | 6 +++--- NuGet.Config | 1 + ...lo.Abp.AspNetCore.Authentication.JwtBearer.csproj | 2 +- .../Volo.Abp.AspNetCore.Authentication.OAuth.csproj | 2 +- ...bp.AspNetCore.Authentication.OpenIdConnect.csproj | 2 +- ...o.Abp.AspNetCore.Components.Server.Theming.csproj | 2 +- .../Volo.Abp.AspNetCore.Components.Server.csproj | 2 +- ...Volo.Abp.AspNetCore.Components.Web.Theming.csproj | 2 +- .../Volo.Abp.AspNetCore.Components.Web.csproj | 2 +- ....AspNetCore.Components.WebAssembly.Theming.csproj | 2 +- ...Volo.Abp.AspNetCore.Components.WebAssembly.csproj | 2 +- .../Volo.Abp.AspNetCore.Components.csproj | 2 +- .../Volo.Abp.AspNetCore.MultiTenancy.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.Client.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.csproj | 2 +- ...bp.AspNetCore.Mvc.UI.Bundling.Abstractions.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.UI.Packages.csproj | 2 +- ...lo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.UI.Widgets.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.UI.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.csproj | 2 +- .../Volo.Abp.AspNetCore.Serilog.csproj | 2 +- .../Volo.Abp.AspNetCore.SignalR.csproj | 2 +- .../Volo.Abp.AspNetCore.TestBase.csproj | 2 +- .../Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj | 2 +- .../Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj | 2 +- .../Volo.Abp.Autofac.WebAssembly.csproj | 2 +- .../Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj | 2 +- .../Volo.Abp.BlobStoring.Minio.csproj | 2 +- framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj | 2 +- framework/src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj | 2 +- .../Volo.Abp.EntityFrameworkCore.MySQL.csproj | 2 +- ...Volo.Abp.EntityFrameworkCore.Oracle.Devart.csproj | 2 +- .../Volo.Abp.EntityFrameworkCore.Oracle.csproj | 2 +- .../Volo.Abp.EntityFrameworkCore.PostgreSql.csproj | 4 ++-- .../Volo.Abp.EntityFrameworkCore.SqlServer.csproj | 2 +- .../Volo.Abp.EntityFrameworkCore.Sqlite.csproj | 2 +- .../Volo.Abp.EntityFrameworkCore.csproj | 2 +- .../Volo/Abp/EntityFrameworkCore/AbpDbContext.cs | 6 +++--- .../ValueConverters/AbpDateTimeValueConverter.cs | 12 +++++++++++- .../Volo.Abp.Http.Client.IdentityModel.Web.csproj | 2 +- ....Abp.Http.Client.IdentityModel.WebAssembly.csproj | 2 +- .../Volo.Abp.Http.Client.Web.csproj | 2 +- .../Volo.Abp.Swashbuckle/Volo.Abp.Swashbuckle.csproj | 2 +- .../Volo.Abp.TextTemplating.Razor.csproj | 2 +- framework/test/AbpTestBase/AbpTestBase.csproj | 2 +- .../test/SimpleConsoleDemo/SimpleConsoleDemo.csproj | 2 +- ....Abp.AspNetCore.Authentication.OAuth.Tests.csproj | 2 +- .../Volo.Abp.AspNetCore.MultiTenancy.Tests.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.PlugIn.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.Tests.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.UI.Tests.csproj | 2 +- ...o.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.Versioning.Tests.csproj | 2 +- .../Volo.Abp.AspNetCore.Serilog.Tests.csproj | 2 +- .../Volo.Abp.AspNetCore.SignalR.Tests.csproj | 2 +- .../Volo.Abp.AspNetCore.Tests.csproj | 2 +- .../Volo.Abp.Auditing.Tests.csproj | 2 +- .../Volo.Abp.Authorization.Tests.csproj | 2 +- .../Volo.Abp.AutoMapper.Tests.csproj | 2 +- .../Volo.Abp.Autofac.Tests.csproj | 2 +- .../Volo.Abp.BackgroundJobs.Tests.csproj | 2 +- .../Volo.Abp.BlobStoring.Aliyun.Tests.csproj | 2 +- .../Volo.Abp.BlobStoring.Aws.Tests.csproj | 2 +- .../Volo.Abp.BlobStoring.Azure.Tests.csproj | 2 +- .../Volo.Abp.BlobStoring.FileSystem.Tests.csproj | 2 +- .../Volo.Abp.BlobStoring.Minio.Tests.csproj | 2 +- .../Volo.Abp.BlobStoring.Tests.csproj | 2 +- .../Volo.Abp.Caching.StackExchangeRedis.Tests.csproj | 2 +- .../Volo.Abp.Caching.Tests.csproj | 2 +- .../Volo.Abp.Castle.Core.Tests.csproj | 2 +- .../Volo.Abp.Cli.Core.Tests.csproj | 2 +- .../Volo.Abp.Core.Tests/Volo.Abp.Core.Tests.csproj | 2 +- .../Volo.Abp.Dapper.Tests.csproj | 2 +- .../Volo.Abp.Data.Tests/Volo.Abp.Data.Tests.csproj | 2 +- .../Volo.Abp.Ddd.Tests/Volo.Abp.Ddd.Tests.csproj | 2 +- ....Abp.DistributedLocking.Abstractions.Tests.csproj | 2 +- .../Volo.Abp.Emailing.Tests.csproj | 2 +- ...bp.EntityFrameworkCore.Tests.SecondContext.csproj | 2 +- .../Volo.Abp.EntityFrameworkCore.Tests.csproj | 2 +- .../UnitTestModelCacheKeyFactory.cs | 5 +++++ .../Volo.Abp.EventBus.Tests.csproj | 2 +- .../Volo.Abp.Features.Tests.csproj | 2 +- .../Volo.Abp.FluentValidation.Tests.csproj | 2 +- .../Volo.Abp.GlobalFeatures.Tests.csproj | 2 +- ...lo.Abp.Http.Client.IdentityModel.Web.Tests.csproj | 2 +- .../Volo.Abp.Http.Client.Tests.csproj | 2 +- .../Volo.Abp.Http.Tests/Volo.Abp.Http.Tests.csproj | 2 +- .../Volo.Abp.IdentityModel.Tests.csproj | 2 +- .../Volo.Abp.Json.Tests/Volo.Abp.Json.Tests.csproj | 2 +- .../Volo.Abp.Ldap.Tests/Volo.Abp.Ldap.Tests.csproj | 2 +- .../Volo.Abp.Localization.Tests.csproj | 2 +- .../Volo.Abp.MailKit.Tests.csproj | 2 +- .../Volo.Abp.MemoryDb.Tests.csproj | 2 +- .../Volo.Abp.Minify.Tests.csproj | 2 +- .../Volo.Abp.MongoDB.Tests.SecondContext.csproj | 2 +- .../Volo.Abp.MongoDB.Tests.csproj | 2 +- .../Volo.Abp.MultiLingualObjects.Tests.csproj | 2 +- .../Volo.Abp.MultiTenancy.Tests.csproj | 2 +- .../Volo.Abp.ObjectExtending.Tests.csproj | 2 +- .../Volo.Abp.ObjectMapping.Tests.csproj | 2 +- .../Volo.Abp.Security.Tests.csproj | 2 +- .../Volo.Abp.Serialization.Tests.csproj | 2 +- .../Volo.Abp.Settings.Tests.csproj | 2 +- .../Volo.Abp.Sms.Aliyun.Tests.csproj | 2 +- .../Volo.Abp.Specifications.Tests.csproj | 2 +- .../Volo.Abp.TestApp.Tests.csproj | 2 +- .../test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj | 2 +- .../Volo.Abp.TextTemplating.Razor.Tests.csproj | 2 +- .../Volo.Abp.TextTemplating.Scriban.Tests.csproj | 2 +- .../Volo.Abp.TextTemplating.Tests.csproj | 2 +- .../Volo.Abp.Threading.Tests.csproj | 2 +- .../Volo.Abp.UI.Navigation.Tests.csproj | 2 +- .../Volo.Abp.Uow.Tests/Volo.Abp.Uow.Tests.csproj | 2 +- .../Volo.Abp.Validation.Tests.csproj | 2 +- .../Volo.Abp.VirtualFileSystem.Tests.csproj | 2 +- global.json | 2 +- .../Volo.Abp.Account.Application.csproj | 2 +- .../Volo.Abp.Account.Blazor.csproj | 2 +- .../Volo.Abp.Account.HttpApi.csproj | 2 +- .../Volo.Abp.Account.Installer.csproj | 2 +- .../Volo.Abp.Account.Web.IdentityServer.csproj | 2 +- .../Volo.Abp.Account.Web.OpenIddict.csproj | 2 +- .../Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj | 2 +- .../Volo.Abp.Account.Application.Tests.csproj | 2 +- .../Volo.Abp.AuditLogging.EntityFrameworkCore.csproj | 2 +- .../Volo.Abp.AuditLogging.Installer.csproj | 2 +- ...Abp.AuditLogging.EntityFrameworkCore.Tests.csproj | 2 +- .../Volo.Abp.AuditLogging.MongoDB.Tests.csproj | 2 +- .../Volo.Abp.AuditLogging.TestBase.csproj | 2 +- .../Volo.Abp.AuditLogging.Tests.csproj | 2 +- .../Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj | 2 +- .../Volo.Abp.BackgroundJobs.DemoApp.Quartz.csproj | 2 +- .../Volo.Abp.BackgroundJobs.DemoApp.RabbitMq.csproj | 2 +- .../Volo.Abp.BackgroundJobs.DemoApp.csproj | 2 +- ...olo.Abp.BackgroundJobs.EntityFrameworkCore.csproj | 2 +- .../Volo.Abp.BackgroundJobs.Installer.csproj | 2 +- .../Volo.Abp.BackgroundJobs.Domain.Tests.csproj | 2 +- ...p.BackgroundJobs.EntityFrameworkCore.Tests.csproj | 2 +- .../Volo.Abp.BackgroundJobs.MongoDB.Tests.csproj | 2 +- .../Volo.Abp.BackgroundJobs.TestBase.csproj | 2 +- ...bp.AspNetCore.Components.Server.BasicTheme.csproj | 2 +- ...o.Abp.AspNetCore.Components.Web.BasicTheme.csproj | 2 +- ...pNetCore.Components.WebAssembly.BasicTheme.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj | 2 +- .../Volo.Abp.BasicTheme.Installer.csproj | 2 +- ...Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj | 2 +- ...olo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.csproj | 2 +- ...toring.Database.Host.ConsoleApp.ConsoleApp.csproj | 2 +- ...p.BlobStoring.Database.EntityFrameworkCore.csproj | 2 +- .../Volo.Abp.BlobStoring.Database.Installer.csproj | 2 +- ...Volo.Abp.BlobStoring.Database.Domain.Tests.csproj | 2 +- ...Storing.Database.EntityFrameworkCore.Tests.csproj | 2 +- ...olo.Abp.BlobStoring.Database.MongoDB.Tests.csproj | 2 +- .../Volo.Abp.BlobStoring.Database.TestBase.csproj | 2 +- .../Volo.BloggingTestApp.EntityFrameworkCore.csproj | 2 +- .../Volo.BloggingTestApp/Volo.BloggingTestApp.csproj | 2 +- .../Volo.Blogging.Admin.Application.csproj | 2 +- .../Volo.Blogging.Admin.HttpApi.csproj | 2 +- .../Volo.Blogging.Admin.Web.csproj | 2 +- .../Volo.Blogging.Application.csproj | 2 +- .../Volo.Blogging.EntityFrameworkCore.csproj | 2 +- .../Volo.Blogging.HttpApi.csproj | 2 +- .../src/Volo.Blogging.Web/Volo.Blogging.Web.csproj | 2 +- .../Volo.Blogging.Application.Tests.csproj | 2 +- .../Volo.Blogging.Domain.Tests.csproj | 2 +- .../Volo.Blogging.EntityFrameworkCore.Tests.csproj | 2 +- .../Volo.Blogging.MongoDB.Tests.csproj | 2 +- .../Volo.Blogging.TestBase.csproj | 2 +- .../Volo.ClientSimulation.Demo.csproj | 2 +- .../Volo.ClientSimulation.Web.csproj | 2 +- .../Volo.ClientSimulation.csproj | 2 +- .../Volo.CmsKit.HttpApi.Host.csproj | 2 +- .../Volo.CmsKit.IdentityServer.csproj | 2 +- .../Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.csproj | 2 +- .../Volo.CmsKit.Web.Unified.csproj | 2 +- .../Volo.CmsKit.Admin.Application.csproj | 2 +- .../Volo.CmsKit.Admin.HttpApi.csproj | 2 +- .../Volo.CmsKit.Admin.Web.csproj | 2 +- .../Volo.CmsKit.Application.csproj | 2 +- .../Volo.CmsKit.Common.Application.csproj | 2 +- .../Volo.CmsKit.Common.HttpApi.csproj | 2 +- .../Volo.CmsKit.Common.Web.csproj | 2 +- .../Volo.CmsKit.EntityFrameworkCore.csproj | 2 +- .../Volo.CmsKit.HttpApi/Volo.CmsKit.HttpApi.csproj | 2 +- .../Volo.CmsKit.Installer.csproj | 2 +- .../Volo.CmsKit.Public.Application.csproj | 2 +- .../Volo.CmsKit.Public.HttpApi.csproj | 2 +- .../Volo.CmsKit.Public.Web.csproj | 2 +- .../src/Volo.CmsKit.Web/Volo.CmsKit.Web.csproj | 2 +- .../Volo.CmsKit.Application.Tests.csproj | 2 +- .../Volo.CmsKit.Domain.Tests.csproj | 2 +- .../Volo.CmsKit.EntityFrameworkCore.Tests.csproj | 2 +- .../Volo.CmsKit.HttpApi.Client.ConsoleTestApp.csproj | 2 +- .../Volo.CmsKit.MongoDB.Tests.csproj | 2 +- .../Volo.CmsKit.TestBase/Volo.CmsKit.TestBase.csproj | 2 +- .../VoloDocs.EntityFrameworkCore.csproj | 2 +- .../app/VoloDocs.Migrator/VoloDocs.Migrator.csproj | 2 +- modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj | 2 +- .../Volo.Docs.Admin.Application.csproj | 2 +- .../Volo.Docs.Admin.HttpApi.csproj | 2 +- .../Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj | 2 +- .../Volo.Docs.Application.csproj | 2 +- .../Volo.Docs.EntityFrameworkCore.csproj | 2 +- .../src/Volo.Docs.HttpApi/Volo.Docs.HttpApi.csproj | 2 +- modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj | 2 +- .../Volo.Docs.Admin.Application.Tests.csproj | 2 +- .../Volo.Docs.Application.Tests.csproj | 2 +- .../Volo.Docs.Domain.Tests.csproj | 2 +- .../Volo.Docs.EntityFrameworkCore.Tests.csproj | 2 +- .../Volo.Docs.MongoDB.Tests.csproj | 2 +- .../Volo.Docs.TestBase/Volo.Docs.TestBase.csproj | 2 +- .../Volo.Abp.FeatureManagement.Application.csproj | 2 +- .../Volo.Abp.FeatureManagement.Blazor.Server.csproj | 2 +- ...o.Abp.FeatureManagement.Blazor.WebAssembly.csproj | 2 +- .../Volo.Abp.FeatureManagement.Blazor.csproj | 2 +- ....Abp.FeatureManagement.EntityFrameworkCore.csproj | 2 +- .../Volo.Abp.FeatureManagement.HttpApi.csproj | 2 +- .../Volo.Abp.FeatureManagement.Installer.csproj | 2 +- .../Volo.Abp.FeatureManagement.Web.csproj | 2 +- ...lo.Abp.FeatureManagement.Application.Tests.csproj | 2 +- .../Volo.Abp.FeatureManagement.Domain.Tests.csproj | 2 +- ...eatureManagement.EntityFrameworkCore.Tests.csproj | 2 +- .../Volo.Abp.FeatureManagement.MongoDB.Tests.csproj | 2 +- .../Volo.Abp.FeatureManagement.TestBase.csproj | 2 +- .../Volo.Abp.Identity.Application.csproj | 2 +- .../Volo.Abp.Identity.AspNetCore.csproj | 2 +- .../Volo.Abp.Identity.Blazor.Server.csproj | 2 +- .../Volo.Abp.Identity.Blazor.WebAssembly.csproj | 2 +- .../Volo.Abp.Identity.Blazor.csproj | 2 +- .../Volo.Abp.Identity.EntityFrameworkCore.csproj | 2 +- .../Volo.Abp.Identity.HttpApi.csproj | 2 +- .../Volo.Abp.Identity.Installer.csproj | 2 +- .../Volo.Abp.Identity.Web.csproj | 2 +- .../Volo.Abp.Identity.Application.Tests.csproj | 2 +- .../Volo.Abp.Identity.AspNetCore.Tests.csproj | 2 +- .../Volo.Abp.Identity.Domain.Tests.csproj | 2 +- ...olo.Abp.Identity.EntityFrameworkCore.Tests.csproj | 2 +- .../Volo.Abp.Identity.MongoDB.Tests.csproj | 2 +- .../Volo.Abp.Identity.TestBase.csproj | 2 +- .../Volo.Abp.IdentityServer.Domain.csproj | 2 +- ...olo.Abp.IdentityServer.EntityFrameworkCore.csproj | 2 +- .../Volo.Abp.IdentityServer.Installer.csproj | 2 +- .../Volo.Abp.IdentityServer.MongoDB.csproj | 2 +- .../Volo.Abp.IdentityServer.Domain.Tests.csproj | 2 +- ...p.IdentityServer.EntityFrameworkCore.Tests.csproj | 2 +- .../Volo.Abp.IdentityServer.MongoDB.Tests.csproj | 2 +- .../Volo.Abp.IdentityServer.TestBase.csproj | 2 +- .../OpenIddict.Demo.API/OpenIddict.Demo.API.csproj | 2 +- .../OpenIddict.Demo.Client.BlazorWASM.csproj | 2 +- .../OpenIddict.Demo.Client.Console.csproj | 2 +- .../OpenIddict.Demo.Client.Mvc.csproj | 2 +- .../OpenIddict.Demo.Server.csproj | 2 +- .../Volo.Abp.OpenIddict.AspNetCore.csproj | 2 +- .../Volo.Abp.OpenIddict.EntityFrameworkCore.csproj | 2 +- .../Volo.Abp.OpenIddict.MongoDB.csproj | 2 +- .../Volo.Abp.OpenIddict.Domain.Tests.csproj | 2 +- ...o.Abp.OpenIddict.EntityFrameworkCore.Tests.csproj | 2 +- .../Volo.Abp.OpenIddict.MongoDB.Tests.csproj | 2 +- .../Volo.Abp.OpenIddict.TestBase.csproj | 2 +- .../Volo.Abp.PermissionManagement.Application.csproj | 2 +- ...olo.Abp.PermissionManagement.Blazor.Server.csproj | 2 +- ...bp.PermissionManagement.Blazor.WebAssembly.csproj | 2 +- .../Volo.Abp.PermissionManagement.Blazor.csproj | 2 +- ...p.PermissionManagement.EntityFrameworkCore.csproj | 2 +- .../Volo.Abp.PermissionManagement.HttpApi.csproj | 2 +- .../Volo.Abp.PermissionManagement.Installer.csproj | 2 +- .../Volo.Abp.PermissionManagement.Web.csproj | 2 +- ...Abp.PermissionManagement.Application.Tests.csproj | 2 +- ...Volo.Abp.PermissionManagement.Domain.Tests.csproj | 2 +- ...issionManagement.EntityFrameworkCore.Tests.csproj | 2 +- ...olo.Abp.PermissionManagement.MongoDB.Tests.csproj | 2 +- .../Volo.Abp.PermissionManagement.TestBase.csproj | 2 +- .../Volo.Abp.SettingManagement.DemoApp.csproj | 2 +- .../Volo.Abp.SettingManagement.Application.csproj | 2 +- .../Volo.Abp.SettingManagement.Blazor.Server.csproj | 2 +- ...o.Abp.SettingManagement.Blazor.WebAssembly.csproj | 2 +- .../Volo.Abp.SettingManagement.Blazor.csproj | 2 +- ....Abp.SettingManagement.EntityFrameworkCore.csproj | 2 +- .../Volo.Abp.SettingManagement.HttpApi.csproj | 2 +- .../Volo.Abp.SettingManagement.Installer.csproj | 2 +- .../Volo.Abp.SettingManagement.Web.csproj | 2 +- ...ettingManagement.EntityFrameworkCore.Tests.csproj | 2 +- .../Volo.Abp.SettingManagement.MongoDB.Tests.csproj | 2 +- .../Volo.Abp.SettingManagement.TestBase.csproj | 2 +- .../Volo.Abp.SettingManagement.Tests.csproj | 2 +- .../Volo.Abp.TenantManagement.Application.csproj | 2 +- .../Volo.Abp.TenantManagement.Blazor.Server.csproj | 2 +- ...lo.Abp.TenantManagement.Blazor.WebAssembly.csproj | 2 +- .../Volo.Abp.TenantManagement.Blazor.csproj | 2 +- ...o.Abp.TenantManagement.EntityFrameworkCore.csproj | 2 +- .../Volo.Abp.TenantManagement.HttpApi.csproj | 2 +- .../Volo.Abp.TenantManagement.Installer.csproj | 2 +- .../Volo.Abp.TenantManagement.Web.csproj | 2 +- ...olo.Abp.TenantManagement.Application.Tests.csproj | 2 +- .../Volo.Abp.TenantManagement.Domain.Tests.csproj | 2 +- ...TenantManagement.EntityFrameworkCore.Tests.csproj | 2 +- .../Volo.Abp.TenantManagement.MongoDB.Tests.csproj | 2 +- .../Volo.Abp.TenantManagement.TestBase.csproj | 2 +- .../Volo.Abp.Users.EntityFrameworkCore.csproj | 2 +- .../Volo.Abp.Users.Installer.csproj | 2 +- .../Volo.Abp.VirtualFileExplorer.DemoApp.csproj | 2 +- .../Volo.Abp.VirtualFileExplorer.Installer.csproj | 2 +- .../Volo.Abp.VirtualFileExplorer.Web.csproj | 2 +- .../Volo.Abp.Account.SourceCode.csproj | 2 +- .../Volo.Abp.AuditLogging.SourceCode.csproj | 2 +- .../Volo.Abp.BackgroundJobs.SourceCode.csproj | 2 +- .../Volo.Abp.BasicTheme.SourceCode.csproj | 2 +- .../Volo.Abp.BlobStoring.Database.SourceCode.csproj | 2 +- .../Volo.Abp.FeatureManagement.SourceCode.csproj | 2 +- .../Volo.Abp.Identity.SourceCode.csproj | 2 +- .../Volo.Abp.IdentityServer.SourceCode.csproj | 2 +- .../Volo.Abp.PermissionManagement.SourceCode.csproj | 2 +- .../Volo.Abp.SettingManagement.SourceCode.csproj | 2 +- .../Volo.Abp.Studio.Open.SourceCode.csproj | 2 +- .../Volo.Abp.TenantManagement.SourceCode.csproj | 2 +- .../Volo.Abp.Users.SourceCode.csproj | 2 +- .../Volo.Abp.VirtualFileExplorer.SourceCode.csproj | 2 +- .../Volo.Blogging.SourceCode.csproj | 2 +- .../Volo.ClientSimulation.SourceCode.csproj | 2 +- .../Volo.CmsKit.SourceCode.csproj | 2 +- .../Volo.Docs.SourceCode/Volo.Docs.SourceCode.csproj | 2 +- .../Volo.Abp.Studio.Domain.CommonServices.csproj | 2 +- .../Volo.Abp.Studio.ModuleInstaller.csproj | 2 +- ...panyName.MyProjectName.Blazor.Server.Mongo.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Blazor.Server.csproj | 6 +++--- .../MyCompanyName.MyProjectName.Host.Mongo.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Host.csproj | 6 +++--- .../MyCompanyName.MyProjectName.Mvc.Mongo.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Mvc.csproj | 6 +++--- .../MyCompanyName.MyProjectName.Application.csproj | 2 +- .../MyCompanyName.MyProjectName.AuthServer.csproj | 2 +- ...anyName.MyProjectName.Blazor.Server.Tiered.csproj | 2 +- .../MyCompanyName.MyProjectName.Blazor.Server.csproj | 2 +- .../MyCompanyName.MyProjectName.Blazor.csproj | 6 +++--- .../MyCompanyName.MyProjectName.DbMigrator.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Domain.csproj | 2 +- ...panyName.MyProjectName.EntityFrameworkCore.csproj | 6 +++--- .../MyCompanyName.MyProjectName.HttpApi.Host.csproj | 6 +++--- ...panyName.MyProjectName.HttpApi.HostWithIds.csproj | 2 +- .../MyCompanyName.MyProjectName.HttpApi.csproj | 2 +- .../MyCompanyName.MyProjectName.MongoDB.csproj | 2 +- .../MyCompanyName.MyProjectName.Web.Host.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Web.csproj | 2 +- ...ompanyName.MyProjectName.Application.Tests.csproj | 2 +- .../MyCompanyName.MyProjectName.Domain.Tests.csproj | 2 +- ...me.MyProjectName.EntityFrameworkCore.Tests.csproj | 2 +- ...yProjectName.HttpApi.Client.ConsoleTestApp.csproj | 2 +- .../MyCompanyName.MyProjectName.MongoDB.Tests.csproj | 2 +- .../MyCompanyName.MyProjectName.TestBase.csproj | 2 +- .../MyCompanyName.MyProjectName.Web.Tests.csproj | 2 +- .../MyCompanyName.MyProjectName.csproj | 4 ++-- .../MyCompanyName.MyProjectName.csproj | 8 ++++---- .../MyCompanyName.MyProjectName.AuthServer.csproj | 6 +++--- .../MyCompanyName.MyProjectName.Blazor.Host.csproj | 6 +++--- ...mpanyName.MyProjectName.Blazor.Server.Host.csproj | 4 ++-- .../MyCompanyName.MyProjectName.HttpApi.Host.csproj | 8 ++++---- .../MyCompanyName.MyProjectName.Web.Host.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Web.Unified.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Application.csproj | 2 +- .../MyCompanyName.MyProjectName.Blazor.Server.csproj | 2 +- ...mpanyName.MyProjectName.Blazor.WebAssembly.csproj | 2 +- .../MyCompanyName.MyProjectName.Blazor.csproj | 2 +- .../MyCompanyName.MyProjectName.Domain.Shared.csproj | 2 +- ...panyName.MyProjectName.EntityFrameworkCore.csproj | 2 +- .../MyCompanyName.MyProjectName.HttpApi.csproj | 2 +- .../MyCompanyName.MyProjectName.Installer.csproj | 2 +- .../MyCompanyName.MyProjectName.Web.csproj | 4 ++-- ...ompanyName.MyProjectName.Application.Tests.csproj | 2 +- .../MyCompanyName.MyProjectName.Domain.Tests.csproj | 2 +- ...me.MyProjectName.EntityFrameworkCore.Tests.csproj | 4 ++-- ...yProjectName.HttpApi.Client.ConsoleTestApp.csproj | 4 ++-- .../MyCompanyName.MyProjectName.MongoDB.Tests.csproj | 2 +- .../MyCompanyName.MyProjectName.TestBase.csproj | 2 +- .../MyCompanyName.MyProjectName.csproj | 4 ++-- .../AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj | 2 +- .../AbpPerfTest.WithoutAbp.csproj | 2 +- .../DistDemoApp.EfCoreRabbitMq.csproj | 2 +- .../DistDemoApp.MongoDbKafka.csproj | 2 +- .../DistDemoApp.MongoDbRebus.csproj | 2 +- .../DistDemoApp.Shared/DistDemoApp.Shared.csproj | 2 +- 386 files changed, 440 insertions(+), 424 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index b88900019b..bc7364a7e5 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -41,7 +41,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-dotnet@master with: - dotnet-version: 6.0.100 + dotnet-version: 7.0.100-preview.7.22377.5 - name: Build All run: .\build-all.ps1 -f diff --git a/Directory.Build.props b/Directory.Build.props index 03538ef037..9c96d8d043 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,13 +2,13 @@ - 6.0.5 + 7.0.0-preview.7.* - 6.0.5 + 7.0.0-preview.7.* - 6.0.0 + 7.0.0-preview.7.* 17.2.0 diff --git a/NuGet.Config b/NuGet.Config index a0572030a2..786a28a6c0 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -3,5 +3,6 @@ + \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj index 439bdc2c65..bfe8b1d37b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Authentication.JwtBearer Volo.Abp.AspNetCore.Authentication.JwtBearer $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj index 19420e4c11..562e559273 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Authentication.OAuth Volo.Abp.AspNetCore.Authentication.OAuth $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj index e7810f6e37..4ee09824cf 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj b/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj index aad7755a37..c632120d73 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Library true diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj b/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj index 2cdbb63404..09c743bc2a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Library true diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.csproj b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.csproj index 2ae2151e57..d0abc31cdc 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.csproj b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.csproj index f8f4d5702c..bc975f9f92 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj index e835daf343..e310f4a2e2 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj index 8825a88626..5ddfd202a5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Components.WebAssembly Volo.Abp.AspNetCore.Components.WebAssembly $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj b/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj index acd1ff5408..79d67f8b57 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Components Volo.Abp.AspNetCore.Components $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj index 41127ef197..ac7d3eb556 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.MultiTenancy Volo.Abp.AspNetCore.MultiTenancy $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj index 5805e19376..2e5a66d740 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Mvc.Client Volo.Abp.AspNetCore.Mvc.Client $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.csproj index 0cb4998d07..75b09d631b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.Bootstrap Volo.Abp.AspNetCore.Mvc.UI.Bootstrap diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions.csproj index e7e3708a73..97d5b8b2a3 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj index 31842572e1..535a907335 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.Bundling Volo.Abp.AspNetCore.Mvc.UI.Bundling diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj index 15ea7f6eae..ed68be0443 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo.Abp.AspNetCore.Mvc.UI.Packages.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo.Abp.AspNetCore.Mvc.UI.Packages.csproj index f797dc9cfe..26bcc85cf7 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo.Abp.AspNetCore.Mvc.UI.Packages.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo.Abp.AspNetCore.Mvc.UI.Packages.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.Packages Volo.Abp.AspNetCore.Mvc.UI.Packages diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj index 0fea391a07..2ccb77a253 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj index 04d37045f2..40f95d10c9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo.Abp.AspNetCore.Mvc.UI.Widgets.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo.Abp.AspNetCore.Mvc.UI.Widgets.csproj index f03f8ab250..cbb3d106a1 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo.Abp.AspNetCore.Mvc.UI.Widgets.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo.Abp.AspNetCore.Mvc.UI.Widgets.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.Widgets Volo.Abp.AspNetCore.Mvc.UI.Widgets diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj index 887843eb03..1975ba8a67 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI Volo.Abp.AspNetCore.Mvc.UI diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj index 9113c4529e..46baa07c19 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc Volo.Abp.AspNetCore.Mvc diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj index 7e9e4f01a9..07ed436526 100644 --- a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Serilog Volo.Abp.AspNetCore.Serilog $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.SignalR/Volo.Abp.AspNetCore.SignalR.csproj b/framework/src/Volo.Abp.AspNetCore.SignalR/Volo.Abp.AspNetCore.SignalR.csproj index 3a39bdc5f8..8d427a5f21 100644 --- a/framework/src/Volo.Abp.AspNetCore.SignalR/Volo.Abp.AspNetCore.SignalR.csproj +++ b/framework/src/Volo.Abp.AspNetCore.SignalR/Volo.Abp.AspNetCore.SignalR.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.SignalR Volo.Abp.AspNetCore.SignalR $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj index b3a7a89ad8..07e3a08920 100644 --- a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj +++ b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.TestBase Volo.Abp.AspNetCore.TestBase $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj index a87b69eb19..aa1090e204 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj +++ b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore Volo.Abp.AspNetCore $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj b/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj index 32f9da017c..1fc812671d 100644 --- a/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj +++ b/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj @@ -21,7 +21,7 @@ - + diff --git a/framework/src/Volo.Abp.Autofac.WebAssembly/Volo.Abp.Autofac.WebAssembly.csproj b/framework/src/Volo.Abp.Autofac.WebAssembly/Volo.Abp.Autofac.WebAssembly.csproj index d1a8eb55ae..034c5c1903 100644 --- a/framework/src/Volo.Abp.Autofac.WebAssembly/Volo.Abp.Autofac.WebAssembly.csproj +++ b/framework/src/Volo.Abp.Autofac.WebAssembly/Volo.Abp.Autofac.WebAssembly.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj index 7ec32994de..fc1302f77a 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj +++ b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.csproj b/framework/src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.csproj index 90d58c71f8..cd20d43162 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.csproj +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 Volo.Abp.BlobStoring.Minio Volo.Abp.BlobStoring.Minio $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj index f30216a407..1781a23468 100644 --- a/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj +++ b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj @@ -5,7 +5,7 @@ Exe - net6.0 + net7.0 true abp diff --git a/framework/src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj b/framework/src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj index 63dfccb23e..e4236d697c 100644 --- a/framework/src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj +++ b/framework/src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Dapper Volo.Abp.Dapper $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj index f801add281..e15adae9b2 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.EntityFrameworkCore.MySQL Volo.Abp.EntityFrameworkCore.MySQL $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo.Abp.EntityFrameworkCore.Oracle.Devart.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo.Abp.EntityFrameworkCore.Oracle.Devart.csproj index 16c619ffee..3df271284f 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo.Abp.EntityFrameworkCore.Oracle.Devart.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo.Abp.EntityFrameworkCore.Oracle.Devart.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.EntityFrameworkCore.Oracle.Devart Volo.Abp.EntityFrameworkCore.Oracle.Devart $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo.Abp.EntityFrameworkCore.Oracle.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo.Abp.EntityFrameworkCore.Oracle.csproj index 5a0a11b6ad..1db66e7771 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo.Abp.EntityFrameworkCore.Oracle.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo.Abp.EntityFrameworkCore.Oracle.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.EntityFrameworkCore.Oracle Volo.Abp.EntityFrameworkCore.Oracle $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj index ec983f6891..e93925639d 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.EntityFrameworkCore.PostgreSql Volo.Abp.EntityFrameworkCore.PostgreSql $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; @@ -19,7 +19,7 @@ - + diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo.Abp.EntityFrameworkCore.SqlServer.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo.Abp.EntityFrameworkCore.SqlServer.csproj index cdd059825f..f655b66814 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo.Abp.EntityFrameworkCore.SqlServer.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo.Abp.EntityFrameworkCore.SqlServer.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.EntityFrameworkCore.SqlServer Volo.Abp.EntityFrameworkCore.SqlServer $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo.Abp.EntityFrameworkCore.Sqlite.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo.Abp.EntityFrameworkCore.Sqlite.csproj index 70cce89a19..002b876343 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo.Abp.EntityFrameworkCore.Sqlite.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo.Abp.EntityFrameworkCore.Sqlite.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.EntityFrameworkCore.Sqlite Volo.Abp.EntityFrameworkCore.Sqlite $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo.Abp.EntityFrameworkCore.csproj b/framework/src/Volo.Abp.EntityFrameworkCore/Volo.Abp.EntityFrameworkCore.csproj index d4b9814879..c547299bae 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo.Abp.EntityFrameworkCore.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo.Abp.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.EntityFrameworkCore Volo.Abp.EntityFrameworkCore $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs index fd998510af..6e151d287f 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -618,8 +618,6 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, return; } - var dateTimeValueConverter = new AbpDateTimeValueConverter(Clock); - var dateTimePropertyInfos = typeof(TEntity).GetProperties() .Where(property => (property.PropertyType == typeof(DateTime) || @@ -633,7 +631,9 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, modelBuilder .Entity() .Property(property.Name) - .HasConversion(dateTimeValueConverter); + .HasConversion(property.PropertyType == typeof(DateTime) + ? new AbpDateTimeValueConverter(Clock) + : new AbpNullableDateTimeValueConverter(Clock)); }); } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueConverters/AbpDateTimeValueConverter.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueConverters/AbpDateTimeValueConverter.cs index c5ebe79ff8..17513d46a2 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueConverters/AbpDateTimeValueConverter.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueConverters/AbpDateTimeValueConverter.cs @@ -5,9 +5,19 @@ using Volo.Abp.Timing; namespace Volo.Abp.EntityFrameworkCore.ValueConverters; -public class AbpDateTimeValueConverter : ValueConverter +public class AbpDateTimeValueConverter : ValueConverter { public AbpDateTimeValueConverter(IClock clock, [CanBeNull] ConverterMappingHints mappingHints = null) + : base( + x => clock.Normalize(x), + x => clock.Normalize(x), mappingHints) + { + } +} + +public class AbpNullableDateTimeValueConverter : ValueConverter +{ + public AbpNullableDateTimeValueConverter(IClock clock, [CanBeNull] ConverterMappingHints mappingHints = null) : base( x => x.HasValue ? clock.Normalize(x.Value) : x, x => x.HasValue ? clock.Normalize(x.Value) : x, mappingHints) diff --git a/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.csproj b/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.csproj index 2e34b17747..4fc1525e59 100644 --- a/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.csproj +++ b/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Http.Client.IdentityModel.Web Volo.Abp.Http.Client.IdentityModel.Web $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj b/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj index 323d877f05..e98f5d92ff 100644 --- a/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj +++ b/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Http.Client.IdentityModel.WebAssembly Volo.Abp.Http.Client.IdentityModel.WebAssembly $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.Http.Client.Web/Volo.Abp.Http.Client.Web.csproj b/framework/src/Volo.Abp.Http.Client.Web/Volo.Abp.Http.Client.Web.csproj index d7651c7b6d..68bbbd1157 100644 --- a/framework/src/Volo.Abp.Http.Client.Web/Volo.Abp.Http.Client.Web.csproj +++ b/framework/src/Volo.Abp.Http.Client.Web/Volo.Abp.Http.Client.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Http.Client.Web Volo.Abp.Http.Client.Web $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.Swashbuckle/Volo.Abp.Swashbuckle.csproj b/framework/src/Volo.Abp.Swashbuckle/Volo.Abp.Swashbuckle.csproj index 8be7bbd01b..bbfce19981 100644 --- a/framework/src/Volo.Abp.Swashbuckle/Volo.Abp.Swashbuckle.csproj +++ b/framework/src/Volo.Abp.Swashbuckle/Volo.Abp.Swashbuckle.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Swashbuckle Volo.Abp.Swashbuckle $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.TextTemplating.Razor/Volo.Abp.TextTemplating.Razor.csproj b/framework/src/Volo.Abp.TextTemplating.Razor/Volo.Abp.TextTemplating.Razor.csproj index f098ecc80d..670502cdb7 100644 --- a/framework/src/Volo.Abp.TextTemplating.Razor/Volo.Abp.TextTemplating.Razor.csproj +++ b/framework/src/Volo.Abp.TextTemplating.Razor/Volo.Abp.TextTemplating.Razor.csproj @@ -14,7 +14,7 @@ - + diff --git a/framework/test/AbpTestBase/AbpTestBase.csproj b/framework/test/AbpTestBase/AbpTestBase.csproj index f6fa9793cc..96c8860ac0 100644 --- a/framework/test/AbpTestBase/AbpTestBase.csproj +++ b/framework/test/AbpTestBase/AbpTestBase.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 AbpTestBase AbpTestBase diff --git a/framework/test/SimpleConsoleDemo/SimpleConsoleDemo.csproj b/framework/test/SimpleConsoleDemo/SimpleConsoleDemo.csproj index 6762cf2e53..5aca466d38 100644 --- a/framework/test/SimpleConsoleDemo/SimpleConsoleDemo.csproj +++ b/framework/test/SimpleConsoleDemo/SimpleConsoleDemo.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.AspNetCore.Authentication.OAuth.Tests/Volo.Abp.AspNetCore.Authentication.OAuth.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Authentication.OAuth.Tests/Volo.Abp.AspNetCore.Authentication.OAuth.Tests.csproj index 05435e64d6..569064de96 100644 --- a/framework/test/Volo.Abp.AspNetCore.Authentication.OAuth.Tests/Volo.Abp.AspNetCore.Authentication.OAuth.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Authentication.OAuth.Tests/Volo.Abp.AspNetCore.Authentication.OAuth.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 latest Volo.Abp.AspNetCore.Authentication.OAuth.Tests Volo.Abp.AspNetCore.Authentication.OAuth.Tests diff --git a/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo.Abp.AspNetCore.MultiTenancy.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo.Abp.AspNetCore.MultiTenancy.Tests.csproj index bda5373e69..67952c736a 100644 --- a/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo.Abp.AspNetCore.MultiTenancy.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo.Abp.AspNetCore.MultiTenancy.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.MultiTenancy.Tests Volo.Abp.AspNetCore.MultiTenancy.Tests diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj index d917afa97f..2d39963d3d 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Library true true diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj index 53a9bd3747..5cc7aa3857 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; Volo.Abp.AspNetCore.Mvc.Tests Volo.Abp.AspNetCore.Mvc.Tests diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo.Abp.AspNetCore.Mvc.UI.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo.Abp.AspNetCore.Mvc.UI.Tests.csproj index 7519c6a787..393e967adf 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo.Abp.AspNetCore.Mvc.UI.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo.Abp.AspNetCore.Mvc.UI.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; Volo.Abp.AspNetCore.Mvc.UI.Tests Volo.Abp.AspNetCore.Mvc.UI.Tests diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests.csproj index e18e2d0829..ad0eecce03 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo.Abp.AspNetCore.Mvc.Versioning.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo.Abp.AspNetCore.Mvc.Versioning.Tests.csproj index 3c26bc0184..a32ff29516 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo.Abp.AspNetCore.Mvc.Versioning.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo.Abp.AspNetCore.Mvc.Versioning.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; Volo.Abp.AspNetCore.Mvc.Versioning.Tests Volo.Abp.AspNetCore.Mvc.Versioning.Tests diff --git a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj index 18f7107cfd..f5f0315929 100644 --- a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Serilog.Tests Volo.Abp.AspNetCore.Serilog.Tests diff --git a/framework/test/Volo.Abp.AspNetCore.SignalR.Tests/Volo.Abp.AspNetCore.SignalR.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.SignalR.Tests/Volo.Abp.AspNetCore.SignalR.Tests.csproj index 89765ecd2e..4636f88c7f 100644 --- a/framework/test/Volo.Abp.AspNetCore.SignalR.Tests/Volo.Abp.AspNetCore.SignalR.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.SignalR.Tests/Volo.Abp.AspNetCore.SignalR.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.csproj index 44a6ee9a5b..4c5beb1de7 100644 --- a/framework/test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Tests Volo.Abp.AspNetCore.Tests true diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo.Abp.Auditing.Tests.csproj b/framework/test/Volo.Abp.Auditing.Tests/Volo.Abp.Auditing.Tests.csproj index 4e3fc4d3f7..fd4fe16eb9 100644 --- a/framework/test/Volo.Abp.Auditing.Tests/Volo.Abp.Auditing.Tests.csproj +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo.Abp.Auditing.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 Volo.Abp.Auditing.Tests Volo.Abp.Auditing.Tests true diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.csproj b/framework/test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.csproj index f0ec4953f5..eea95c887a 100644 --- a/framework/test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.csproj +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 Volo.Abp.Authorization.Tests Volo.Abp.Authorization.Tests true diff --git a/framework/test/Volo.Abp.AutoMapper.Tests/Volo.Abp.AutoMapper.Tests.csproj b/framework/test/Volo.Abp.AutoMapper.Tests/Volo.Abp.AutoMapper.Tests.csproj index 383277717b..585192dce3 100644 --- a/framework/test/Volo.Abp.AutoMapper.Tests/Volo.Abp.AutoMapper.Tests.csproj +++ b/framework/test/Volo.Abp.AutoMapper.Tests/Volo.Abp.AutoMapper.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 Volo.Abp.AutoMapper.Tests Volo.Abp.AutoMapper.Tests diff --git a/framework/test/Volo.Abp.Autofac.Tests/Volo.Abp.Autofac.Tests.csproj b/framework/test/Volo.Abp.Autofac.Tests/Volo.Abp.Autofac.Tests.csproj index 5d4e88e18f..3685ddb9d0 100644 --- a/framework/test/Volo.Abp.Autofac.Tests/Volo.Abp.Autofac.Tests.csproj +++ b/framework/test/Volo.Abp.Autofac.Tests/Volo.Abp.Autofac.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 Volo.Abp.Autofac.Tests Volo.Abp.Autofac.Tests true diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj index 7eeb7359e2..11b8b39864 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 Volo.Abp.BackgroundJobs.Tests Volo.Abp.BackgroundJobs.Tests diff --git a/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj index b31678d56b..a2c31d4791 100644 --- a/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 9f0d2c00-80c1-435b-bfab-2c39c8249091 diff --git a/framework/test/Volo.Abp.BlobStoring.Aws.Tests/Volo.Abp.BlobStoring.Aws.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Aws.Tests/Volo.Abp.BlobStoring.Aws.Tests.csproj index 935a3cc0ec..be778dbfde 100644 --- a/framework/test/Volo.Abp.BlobStoring.Aws.Tests/Volo.Abp.BlobStoring.Aws.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Aws.Tests/Volo.Abp.BlobStoring.Aws.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 9f0d2c00-80c1-435b-bfab-2c39c8249091 diff --git a/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo.Abp.BlobStoring.Azure.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo.Abp.BlobStoring.Azure.Tests.csproj index 90df4dbd00..e332f922b0 100644 --- a/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo.Abp.BlobStoring.Azure.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo.Abp.BlobStoring.Azure.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 9f0d2c00-80c1-435b-bfab-2c39c8249091 diff --git a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.csproj index 05568e46a3..f2aa172a60 100644 --- a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj index 4d47f1af72..db79d126cd 100644 --- a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 9f0d2c00-80c1-435b-bfab-2c39c8249091 diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj index 0eba37644c..86004b8d29 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.csproj b/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.csproj index 2804ae395a..9686fe4253 100644 --- a/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.csproj +++ b/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Caching.Tests/Volo.Abp.Caching.Tests.csproj b/framework/test/Volo.Abp.Caching.Tests/Volo.Abp.Caching.Tests.csproj index 907388b083..5827f21b9c 100644 --- a/framework/test/Volo.Abp.Caching.Tests/Volo.Abp.Caching.Tests.csproj +++ b/framework/test/Volo.Abp.Caching.Tests/Volo.Abp.Caching.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 Volo.Abp.Caching.Tests Volo.Abp.Caching.Tests diff --git a/framework/test/Volo.Abp.Castle.Core.Tests/Volo.Abp.Castle.Core.Tests.csproj b/framework/test/Volo.Abp.Castle.Core.Tests/Volo.Abp.Castle.Core.Tests.csproj index 44d6527daf..35db882572 100644 --- a/framework/test/Volo.Abp.Castle.Core.Tests/Volo.Abp.Castle.Core.Tests.csproj +++ b/framework/test/Volo.Abp.Castle.Core.Tests/Volo.Abp.Castle.Core.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Cli.Core.Tests/Volo.Abp.Cli.Core.Tests.csproj b/framework/test/Volo.Abp.Cli.Core.Tests/Volo.Abp.Cli.Core.Tests.csproj index dee24c99d6..eab8d36faa 100644 --- a/framework/test/Volo.Abp.Cli.Core.Tests/Volo.Abp.Cli.Core.Tests.csproj +++ b/framework/test/Volo.Abp.Cli.Core.Tests/Volo.Abp.Cli.Core.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Core.Tests/Volo.Abp.Core.Tests.csproj b/framework/test/Volo.Abp.Core.Tests/Volo.Abp.Core.Tests.csproj index 0f00d385b2..b0d7c525d7 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo.Abp.Core.Tests.csproj +++ b/framework/test/Volo.Abp.Core.Tests/Volo.Abp.Core.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Dapper.Tests/Volo.Abp.Dapper.Tests.csproj b/framework/test/Volo.Abp.Dapper.Tests/Volo.Abp.Dapper.Tests.csproj index 72948eebf8..f5be5aff5a 100644 --- a/framework/test/Volo.Abp.Dapper.Tests/Volo.Abp.Dapper.Tests.csproj +++ b/framework/test/Volo.Abp.Dapper.Tests/Volo.Abp.Dapper.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Data.Tests/Volo.Abp.Data.Tests.csproj b/framework/test/Volo.Abp.Data.Tests/Volo.Abp.Data.Tests.csproj index 1a42dd1bfc..ae175956ae 100644 --- a/framework/test/Volo.Abp.Data.Tests/Volo.Abp.Data.Tests.csproj +++ b/framework/test/Volo.Abp.Data.Tests/Volo.Abp.Data.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Ddd.Tests/Volo.Abp.Ddd.Tests.csproj b/framework/test/Volo.Abp.Ddd.Tests/Volo.Abp.Ddd.Tests.csproj index b6a478866f..ce26f12583 100644 --- a/framework/test/Volo.Abp.Ddd.Tests/Volo.Abp.Ddd.Tests.csproj +++ b/framework/test/Volo.Abp.Ddd.Tests/Volo.Abp.Ddd.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.DistributedLocking.Abstractions.Tests/Volo.Abp.DistributedLocking.Abstractions.Tests.csproj b/framework/test/Volo.Abp.DistributedLocking.Abstractions.Tests/Volo.Abp.DistributedLocking.Abstractions.Tests.csproj index 8194846f0c..2d12d5a63b 100644 --- a/framework/test/Volo.Abp.DistributedLocking.Abstractions.Tests/Volo.Abp.DistributedLocking.Abstractions.Tests.csproj +++ b/framework/test/Volo.Abp.DistributedLocking.Abstractions.Tests/Volo.Abp.DistributedLocking.Abstractions.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 true diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj b/framework/test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj index 16612c2365..f900a8f1ce 100644 --- a/framework/test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj +++ b/framework/test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo.Abp.EntityFrameworkCore.Tests.SecondContext.csproj b/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo.Abp.EntityFrameworkCore.Tests.SecondContext.csproj index 1e3dd32be7..d09d2a25b4 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo.Abp.EntityFrameworkCore.Tests.SecondContext.csproj +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo.Abp.EntityFrameworkCore.Tests.SecondContext.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true true diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo.Abp.EntityFrameworkCore.Tests.csproj b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo.Abp.EntityFrameworkCore.Tests.csproj index a463929d6c..15943cde6c 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo.Abp.EntityFrameworkCore.Tests.csproj +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo.Abp.EntityFrameworkCore.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/UnitTestModelCacheKeyFactory.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/UnitTestModelCacheKeyFactory.cs index e29f28d148..b5c3d96485 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/UnitTestModelCacheKeyFactory.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/UnitTestModelCacheKeyFactory.cs @@ -13,4 +13,9 @@ public class UnitTestModelCacheKeyFactory : IModelCacheKeyFactory { return context; } + + public virtual object Create(DbContext context, bool designTime) + { + return context; + } } diff --git a/framework/test/Volo.Abp.EventBus.Tests/Volo.Abp.EventBus.Tests.csproj b/framework/test/Volo.Abp.EventBus.Tests/Volo.Abp.EventBus.Tests.csproj index 6113e158a7..b01a779b74 100644 --- a/framework/test/Volo.Abp.EventBus.Tests/Volo.Abp.EventBus.Tests.csproj +++ b/framework/test/Volo.Abp.EventBus.Tests/Volo.Abp.EventBus.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj b/framework/test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj index ad1932bc7b..163dec5f9c 100644 --- a/framework/test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj +++ b/framework/test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.csproj b/framework/test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.csproj index caab7b56ae..cb7ac72fbd 100644 --- a/framework/test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.csproj +++ b/framework/test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.csproj b/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.csproj index ce95cf5eef..8e5cd8b6a7 100644 --- a/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.csproj +++ b/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Http.Client.IdentityModel.Web.Tests/Volo.Abp.Http.Client.IdentityModel.Web.Tests.csproj b/framework/test/Volo.Abp.Http.Client.IdentityModel.Web.Tests/Volo.Abp.Http.Client.IdentityModel.Web.Tests.csproj index f76183d6ec..5c670a014c 100644 --- a/framework/test/Volo.Abp.Http.Client.IdentityModel.Web.Tests/Volo.Abp.Http.Client.IdentityModel.Web.Tests.csproj +++ b/framework/test/Volo.Abp.Http.Client.IdentityModel.Web.Tests/Volo.Abp.Http.Client.IdentityModel.Web.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.csproj b/framework/test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.csproj index cc44e37d3d..91f0f51b33 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.csproj +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Http.Tests/Volo.Abp.Http.Tests.csproj b/framework/test/Volo.Abp.Http.Tests/Volo.Abp.Http.Tests.csproj index 38e412b7e1..4cf18261f9 100644 --- a/framework/test/Volo.Abp.Http.Tests/Volo.Abp.Http.Tests.csproj +++ b/framework/test/Volo.Abp.Http.Tests/Volo.Abp.Http.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.IdentityModel.Tests/Volo.Abp.IdentityModel.Tests.csproj b/framework/test/Volo.Abp.IdentityModel.Tests/Volo.Abp.IdentityModel.Tests.csproj index dd7ba0d439..a2206d8a19 100644 --- a/framework/test/Volo.Abp.IdentityModel.Tests/Volo.Abp.IdentityModel.Tests.csproj +++ b/framework/test/Volo.Abp.IdentityModel.Tests/Volo.Abp.IdentityModel.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Json.Tests/Volo.Abp.Json.Tests.csproj b/framework/test/Volo.Abp.Json.Tests/Volo.Abp.Json.Tests.csproj index 44f761798e..9d1bad51f2 100644 --- a/framework/test/Volo.Abp.Json.Tests/Volo.Abp.Json.Tests.csproj +++ b/framework/test/Volo.Abp.Json.Tests/Volo.Abp.Json.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Ldap.Tests/Volo.Abp.Ldap.Tests.csproj b/framework/test/Volo.Abp.Ldap.Tests/Volo.Abp.Ldap.Tests.csproj index d34f082a09..d608933b64 100644 --- a/framework/test/Volo.Abp.Ldap.Tests/Volo.Abp.Ldap.Tests.csproj +++ b/framework/test/Volo.Abp.Ldap.Tests/Volo.Abp.Ldap.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.csproj b/framework/test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.csproj index 4766e63f1e..f282b36438 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.csproj +++ b/framework/test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.MailKit.Tests/Volo.Abp.MailKit.Tests.csproj b/framework/test/Volo.Abp.MailKit.Tests/Volo.Abp.MailKit.Tests.csproj index 1a3ee859c7..a079374b04 100644 --- a/framework/test/Volo.Abp.MailKit.Tests/Volo.Abp.MailKit.Tests.csproj +++ b/framework/test/Volo.Abp.MailKit.Tests/Volo.Abp.MailKit.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.MemoryDb.Tests/Volo.Abp.MemoryDb.Tests.csproj b/framework/test/Volo.Abp.MemoryDb.Tests/Volo.Abp.MemoryDb.Tests.csproj index d7cf9dde01..565806f9c3 100644 --- a/framework/test/Volo.Abp.MemoryDb.Tests/Volo.Abp.MemoryDb.Tests.csproj +++ b/framework/test/Volo.Abp.MemoryDb.Tests/Volo.Abp.MemoryDb.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Minify.Tests/Volo.Abp.Minify.Tests.csproj b/framework/test/Volo.Abp.Minify.Tests/Volo.Abp.Minify.Tests.csproj index 46c4b1c22a..bdbeff278b 100644 --- a/framework/test/Volo.Abp.Minify.Tests/Volo.Abp.Minify.Tests.csproj +++ b/framework/test/Volo.Abp.Minify.Tests/Volo.Abp.Minify.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo.Abp.MongoDB.Tests.SecondContext.csproj b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo.Abp.MongoDB.Tests.SecondContext.csproj index b51ab8c799..5ed64d6ea0 100644 --- a/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo.Abp.MongoDB.Tests.SecondContext.csproj +++ b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo.Abp.MongoDB.Tests.SecondContext.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true true diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.csproj b/framework/test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.csproj index b38a453d43..ef1ff44a00 100644 --- a/framework/test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.csproj +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.MultiLingualObjects.Tests/Volo.Abp.MultiLingualObjects.Tests.csproj b/framework/test/Volo.Abp.MultiLingualObjects.Tests/Volo.Abp.MultiLingualObjects.Tests.csproj index b124e20722..a037cfbcf3 100644 --- a/framework/test/Volo.Abp.MultiLingualObjects.Tests/Volo.Abp.MultiLingualObjects.Tests.csproj +++ b/framework/test/Volo.Abp.MultiLingualObjects.Tests/Volo.Abp.MultiLingualObjects.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.csproj b/framework/test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.csproj index 86040d3500..875e837853 100644 --- a/framework/test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.csproj +++ b/framework/test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.ObjectExtending.Tests/Volo.Abp.ObjectExtending.Tests.csproj b/framework/test/Volo.Abp.ObjectExtending.Tests/Volo.Abp.ObjectExtending.Tests.csproj index b2d0263467..989ef61c2a 100644 --- a/framework/test/Volo.Abp.ObjectExtending.Tests/Volo.Abp.ObjectExtending.Tests.csproj +++ b/framework/test/Volo.Abp.ObjectExtending.Tests/Volo.Abp.ObjectExtending.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.ObjectMapping.Tests/Volo.Abp.ObjectMapping.Tests.csproj b/framework/test/Volo.Abp.ObjectMapping.Tests/Volo.Abp.ObjectMapping.Tests.csproj index bc8bd44946..68f993c07e 100644 --- a/framework/test/Volo.Abp.ObjectMapping.Tests/Volo.Abp.ObjectMapping.Tests.csproj +++ b/framework/test/Volo.Abp.ObjectMapping.Tests/Volo.Abp.ObjectMapping.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Security.Tests/Volo.Abp.Security.Tests.csproj b/framework/test/Volo.Abp.Security.Tests/Volo.Abp.Security.Tests.csproj index 62ef44f206..dc2e24b67d 100644 --- a/framework/test/Volo.Abp.Security.Tests/Volo.Abp.Security.Tests.csproj +++ b/framework/test/Volo.Abp.Security.Tests/Volo.Abp.Security.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Serialization.Tests/Volo.Abp.Serialization.Tests.csproj b/framework/test/Volo.Abp.Serialization.Tests/Volo.Abp.Serialization.Tests.csproj index f4746df20d..3b0efdb9c2 100644 --- a/framework/test/Volo.Abp.Serialization.Tests/Volo.Abp.Serialization.Tests.csproj +++ b/framework/test/Volo.Abp.Serialization.Tests/Volo.Abp.Serialization.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj b/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj index 9f47e239ab..fcb5b1bed7 100644 --- a/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj +++ b/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Sms.Aliyun.Tests/Volo.Abp.Sms.Aliyun.Tests.csproj b/framework/test/Volo.Abp.Sms.Aliyun.Tests/Volo.Abp.Sms.Aliyun.Tests.csproj index df7e4cd390..68f49b10b1 100644 --- a/framework/test/Volo.Abp.Sms.Aliyun.Tests/Volo.Abp.Sms.Aliyun.Tests.csproj +++ b/framework/test/Volo.Abp.Sms.Aliyun.Tests/Volo.Abp.Sms.Aliyun.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 9f0d2c00-80c1-435b-bfab-2c39c8249091 diff --git a/framework/test/Volo.Abp.Specifications.Tests/Volo.Abp.Specifications.Tests.csproj b/framework/test/Volo.Abp.Specifications.Tests/Volo.Abp.Specifications.Tests.csproj index dfa4d6363e..073387267d 100644 --- a/framework/test/Volo.Abp.Specifications.Tests/Volo.Abp.Specifications.Tests.csproj +++ b/framework/test/Volo.Abp.Specifications.Tests/Volo.Abp.Specifications.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.TestApp.Tests/Volo.Abp.TestApp.Tests.csproj b/framework/test/Volo.Abp.TestApp.Tests/Volo.Abp.TestApp.Tests.csproj index f251df0947..bc01e7035b 100644 --- a/framework/test/Volo.Abp.TestApp.Tests/Volo.Abp.TestApp.Tests.csproj +++ b/framework/test/Volo.Abp.TestApp.Tests/Volo.Abp.TestApp.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj b/framework/test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj index 5a6382eb80..b617600dcd 100644 --- a/framework/test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj +++ b/framework/test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 true diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj index d91645b537..06f957b165 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj +++ b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj index 9546a1bb86..e0c9a59743 100644 --- a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj +++ b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj b/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj index c150d2c0e0..d8875b01a0 100644 --- a/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Threading.Tests/Volo.Abp.Threading.Tests.csproj b/framework/test/Volo.Abp.Threading.Tests/Volo.Abp.Threading.Tests.csproj index c770dc6763..74a4ef6593 100644 --- a/framework/test/Volo.Abp.Threading.Tests/Volo.Abp.Threading.Tests.csproj +++ b/framework/test/Volo.Abp.Threading.Tests/Volo.Abp.Threading.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.UI.Navigation.Tests/Volo.Abp.UI.Navigation.Tests.csproj b/framework/test/Volo.Abp.UI.Navigation.Tests/Volo.Abp.UI.Navigation.Tests.csproj index 7d5a99562e..3c3a8dff37 100644 --- a/framework/test/Volo.Abp.UI.Navigation.Tests/Volo.Abp.UI.Navigation.Tests.csproj +++ b/framework/test/Volo.Abp.UI.Navigation.Tests/Volo.Abp.UI.Navigation.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Uow.Tests/Volo.Abp.Uow.Tests.csproj b/framework/test/Volo.Abp.Uow.Tests/Volo.Abp.Uow.Tests.csproj index 28536701fe..2b1cb36093 100644 --- a/framework/test/Volo.Abp.Uow.Tests/Volo.Abp.Uow.Tests.csproj +++ b/framework/test/Volo.Abp.Uow.Tests/Volo.Abp.Uow.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.Validation.Tests/Volo.Abp.Validation.Tests.csproj b/framework/test/Volo.Abp.Validation.Tests/Volo.Abp.Validation.Tests.csproj index 75e8997ce5..ebed71046e 100644 --- a/framework/test/Volo.Abp.Validation.Tests/Volo.Abp.Validation.Tests.csproj +++ b/framework/test/Volo.Abp.Validation.Tests/Volo.Abp.Validation.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj index 4cb884a7ca..fc07aebd46 100644 --- a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj +++ b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 true diff --git a/global.json b/global.json index 10b65be864..420278bb04 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "6.0.100", + "version": "7.0.100-preview.7.22377.5", "rollForward": "latestFeature" } } diff --git a/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj b/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj index 35f0f2a352..69e0f258a7 100644 --- a/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj +++ b/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Account.Application Volo.Abp.Account.Application true diff --git a/modules/account/src/Volo.Abp.Account.Blazor/Volo.Abp.Account.Blazor.csproj b/modules/account/src/Volo.Abp.Account.Blazor/Volo.Abp.Account.Blazor.csproj index 027afb9e70..b96d049912 100644 --- a/modules/account/src/Volo.Abp.Account.Blazor/Volo.Abp.Account.Blazor.csproj +++ b/modules/account/src/Volo.Abp.Account.Blazor/Volo.Abp.Account.Blazor.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Account.Blazor diff --git a/modules/account/src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.csproj b/modules/account/src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.csproj index 460da4f8dc..cccd02e38a 100644 --- a/modules/account/src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.csproj +++ b/modules/account/src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Account.HttpApi Volo.Abp.Account.HttpApi diff --git a/modules/account/src/Volo.Abp.Account.Installer/Volo.Abp.Account.Installer.csproj b/modules/account/src/Volo.Abp.Account.Installer/Volo.Abp.Account.Installer.csproj index 73df3c03d9..a35f247250 100644 --- a/modules/account/src/Volo.Abp.Account.Installer/Volo.Abp.Account.Installer.csproj +++ b/modules/account/src/Volo.Abp.Account.Installer/Volo.Abp.Account.Installer.csproj @@ -4,7 +4,7 @@ - net5.0 + net7.0 true diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj index c664c3fb8b..bd52bfd5f9 100644 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Account.Web.IdentityServer Volo.Abp.Account.Web.IdentityServer true diff --git a/modules/account/src/Volo.Abp.Account.Web.OpenIddict/Volo.Abp.Account.Web.OpenIddict.csproj b/modules/account/src/Volo.Abp.Account.Web.OpenIddict/Volo.Abp.Account.Web.OpenIddict.csproj index 637947b62f..a88df575e1 100644 --- a/modules/account/src/Volo.Abp.Account.Web.OpenIddict/Volo.Abp.Account.Web.OpenIddict.csproj +++ b/modules/account/src/Volo.Abp.Account.Web.OpenIddict/Volo.Abp.Account.Web.OpenIddict.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Account.Web.OpenIddict Volo.Abp.Account.Web.OpenIddict true diff --git a/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj b/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj index 322291da3e..b9e85e2c7f 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj +++ b/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Account.Web Volo.Abp.Account.Web $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.csproj b/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.csproj index c01aaf95cd..fc662baa97 100644 --- a/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.csproj +++ b/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo.Abp.AuditLogging.EntityFrameworkCore.csproj b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo.Abp.AuditLogging.EntityFrameworkCore.csproj index cf8a116b59..1c09f9d407 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo.Abp.AuditLogging.EntityFrameworkCore.csproj +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo.Abp.AuditLogging.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/Volo.Abp.AuditLogging.Installer.csproj b/modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/Volo.Abp.AuditLogging.Installer.csproj index 27ab25e369..8186c1a7fe 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/Volo.Abp.AuditLogging.Installer.csproj +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/Volo.Abp.AuditLogging.Installer.csproj @@ -4,7 +4,7 @@ - net5.0 + net7.0 true diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests.csproj b/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests.csproj index 8091f4b7ce..67aa3fcaf3 100644 --- a/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests.csproj +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.csproj b/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.csproj index e2e7ed4558..6599d1e446 100644 --- a/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.csproj +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.csproj b/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.csproj index ff3df67641..a6b5ff8505 100644 --- a/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.csproj +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.Tests/Volo.Abp.AuditLogging.Tests.csproj b/modules/audit-logging/test/Volo.Abp.AuditLogging.Tests/Volo.Abp.AuditLogging.Tests.csproj index ee5d70cc1a..03ba57fb17 100644 --- a/modules/audit-logging/test/Volo.Abp.AuditLogging.Tests/Volo.Abp.AuditLogging.Tests.csproj +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.Tests/Volo.Abp.AuditLogging.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj index 2e52fe8dd6..acad01b8e9 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.csproj b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.csproj index 9d96010a1b..8fe68d246c 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.csproj +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq.csproj b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq.csproj index 9ed318622a..242ea3fd15 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq.csproj +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.csproj b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.csproj index f62357c566..bca4cf8a22 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.csproj +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.csproj b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.csproj index e538bea2b6..70d6f91247 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.csproj +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/Volo.Abp.BackgroundJobs.Installer.csproj b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/Volo.Abp.BackgroundJobs.Installer.csproj index 59bd54205d..e7153fe8bc 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/Volo.Abp.BackgroundJobs.Installer.csproj +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/Volo.Abp.BackgroundJobs.Installer.csproj @@ -4,7 +4,7 @@ - net5.0 + net7.0 true diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.Domain.Tests/Volo.Abp.BackgroundJobs.Domain.Tests.csproj b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.Domain.Tests/Volo.Abp.BackgroundJobs.Domain.Tests.csproj index a9b42370b8..4d1fdcddca 100644 --- a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.Domain.Tests/Volo.Abp.BackgroundJobs.Domain.Tests.csproj +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.Domain.Tests/Volo.Abp.BackgroundJobs.Domain.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests.csproj b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests.csproj index 8f98fa4c39..bd373a31c6 100644 --- a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests.csproj +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.csproj b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.csproj index afd26815ac..7e763bdcc0 100644 --- a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.csproj +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.csproj b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.csproj index 779be70019..9f8d1936c1 100644 --- a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.csproj +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj index f9f741ac0a..2cb8153293 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Volo.Abp.AspNetCore.Components.Web.BasicTheme.csproj b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Volo.Abp.AspNetCore.Components.Web.BasicTheme.csproj index 5499c59a8f..565949c5a9 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Volo.Abp.AspNetCore.Components.Web.BasicTheme.csproj +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Volo.Abp.AspNetCore.Components.Web.BasicTheme.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.csproj b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.csproj index 4b58204601..d124430440 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.csproj +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj index 7a9a73305c..97132c6e5e 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic diff --git a/modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/Volo.Abp.BasicTheme.Installer.csproj b/modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/Volo.Abp.BasicTheme.Installer.csproj index 8a4b219092..c559897f08 100644 --- a/modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/Volo.Abp.BasicTheme.Installer.csproj +++ b/modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/Volo.Abp.BasicTheme.Installer.csproj @@ -4,7 +4,7 @@ - net5.0 + net7.0 true diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests.csproj b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests.csproj index ee105e4721..745f32a633 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests.csproj +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj index ff2f7ecff9..dca7a19065 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 true diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.csproj b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.csproj index 41de32d955..c2d285b01a 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.csproj +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true diff --git a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.csproj b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.csproj index de333dc7aa..0e6f151047 100644 --- a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.csproj +++ b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.csproj b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.csproj index eee69f5a35..a326c2081a 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.csproj +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo.Abp.BlobStoring.Database.Installer.csproj b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo.Abp.BlobStoring.Database.Installer.csproj index a2054f574c..1d9fac9797 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo.Abp.BlobStoring.Database.Installer.csproj +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo.Abp.BlobStoring.Database.Installer.csproj @@ -4,7 +4,7 @@ - net5.0 + net7.0 true diff --git a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.csproj b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.csproj index fd9b0d2da1..f3d6706088 100644 --- a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.csproj +++ b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.BlobStoring.Database diff --git a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj index a1b9f2730d..2f5b7ebbe2 100644 --- a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj +++ b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.BlobStoring.Database diff --git a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/Volo.Abp.BlobStoring.Database.MongoDB.Tests.csproj b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/Volo.Abp.BlobStoring.Database.MongoDB.Tests.csproj index ad3981ab2b..c4d517912b 100644 --- a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/Volo.Abp.BlobStoring.Database.MongoDB.Tests.csproj +++ b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/Volo.Abp.BlobStoring.Database.MongoDB.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.BlobStoring.Database diff --git a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/Volo.Abp.BlobStoring.Database.TestBase.csproj b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/Volo.Abp.BlobStoring.Database.TestBase.csproj index 1472b77878..bba2a88cf2 100644 --- a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/Volo.Abp.BlobStoring.Database.TestBase.csproj +++ b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/Volo.Abp.BlobStoring.Database.TestBase.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.BlobStoring.Database diff --git a/modules/blogging/app/Volo.BloggingTestApp.EntityFrameworkCore/Volo.BloggingTestApp.EntityFrameworkCore.csproj b/modules/blogging/app/Volo.BloggingTestApp.EntityFrameworkCore/Volo.BloggingTestApp.EntityFrameworkCore.csproj index f1229951df..953b743749 100644 --- a/modules/blogging/app/Volo.BloggingTestApp.EntityFrameworkCore/Volo.BloggingTestApp.EntityFrameworkCore.csproj +++ b/modules/blogging/app/Volo.BloggingTestApp.EntityFrameworkCore/Volo.BloggingTestApp.EntityFrameworkCore.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj b/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj index 455a25b131..64cfe35a5c 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj +++ b/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 InProcess diff --git a/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.csproj b/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.csproj index 6df6b27bb7..adc000a44b 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.csproj +++ b/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Blogging.Admin.Application Volo.Blogging.Admin.Application diff --git a/modules/blogging/src/Volo.Blogging.Admin.HttpApi/Volo.Blogging.Admin.HttpApi.csproj b/modules/blogging/src/Volo.Blogging.Admin.HttpApi/Volo.Blogging.Admin.HttpApi.csproj index 0ba8bfd200..29f78311d0 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.HttpApi/Volo.Blogging.Admin.HttpApi.csproj +++ b/modules/blogging/src/Volo.Blogging.Admin.HttpApi/Volo.Blogging.Admin.HttpApi.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Blogging.Admin.HttpApi Volo.Blogging.Admin.HttpApi diff --git a/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj b/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj index 0f3c2f52c7..a6754b1dfe 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj +++ b/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Blogging.Admin.Web Volo.Blogging.Admin.Web 2.8 diff --git a/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj b/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj index 99c491231b..9f1b8a1a00 100644 --- a/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj +++ b/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Blogging.Application Volo.Blogging.Application diff --git a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo.Blogging.EntityFrameworkCore.csproj b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo.Blogging.EntityFrameworkCore.csproj index ba3c5e65e0..805c517211 100644 --- a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo.Blogging.EntityFrameworkCore.csproj +++ b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo.Blogging.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Blogging.EntityFrameworkCore Volo.Blogging.EntityFrameworkCore diff --git a/modules/blogging/src/Volo.Blogging.HttpApi/Volo.Blogging.HttpApi.csproj b/modules/blogging/src/Volo.Blogging.HttpApi/Volo.Blogging.HttpApi.csproj index 3e1ca067c9..38424e1e07 100644 --- a/modules/blogging/src/Volo.Blogging.HttpApi/Volo.Blogging.HttpApi.csproj +++ b/modules/blogging/src/Volo.Blogging.HttpApi/Volo.Blogging.HttpApi.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Blogging.HttpApi Volo.Blogging.HttpApi diff --git a/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj b/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj index a05cff2692..4077e7cad8 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj +++ b/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Blogging.Web Volo.Blogging.Web 2.8 diff --git a/modules/blogging/test/Volo.Blogging.Application.Tests/Volo.Blogging.Application.Tests.csproj b/modules/blogging/test/Volo.Blogging.Application.Tests/Volo.Blogging.Application.Tests.csproj index 311fb70e29..432027ed2b 100644 --- a/modules/blogging/test/Volo.Blogging.Application.Tests/Volo.Blogging.Application.Tests.csproj +++ b/modules/blogging/test/Volo.Blogging.Application.Tests/Volo.Blogging.Application.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/modules/blogging/test/Volo.Blogging.Domain.Tests/Volo.Blogging.Domain.Tests.csproj b/modules/blogging/test/Volo.Blogging.Domain.Tests/Volo.Blogging.Domain.Tests.csproj index 1226436a12..92834131e2 100644 --- a/modules/blogging/test/Volo.Blogging.Domain.Tests/Volo.Blogging.Domain.Tests.csproj +++ b/modules/blogging/test/Volo.Blogging.Domain.Tests/Volo.Blogging.Domain.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo.Blogging.EntityFrameworkCore.Tests.csproj b/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo.Blogging.EntityFrameworkCore.Tests.csproj index 064f524ea3..119ff6807b 100644 --- a/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo.Blogging.EntityFrameworkCore.Tests.csproj +++ b/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo.Blogging.EntityFrameworkCore.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/modules/blogging/test/Volo.Blogging.MongoDB.Tests/Volo.Blogging.MongoDB.Tests.csproj b/modules/blogging/test/Volo.Blogging.MongoDB.Tests/Volo.Blogging.MongoDB.Tests.csproj index e6b7cc1b87..a2bfdf915a 100644 --- a/modules/blogging/test/Volo.Blogging.MongoDB.Tests/Volo.Blogging.MongoDB.Tests.csproj +++ b/modules/blogging/test/Volo.Blogging.MongoDB.Tests/Volo.Blogging.MongoDB.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/modules/blogging/test/Volo.Blogging.TestBase/Volo.Blogging.TestBase.csproj b/modules/blogging/test/Volo.Blogging.TestBase/Volo.Blogging.TestBase.csproj index 5dc973770e..b6151dd5bd 100644 --- a/modules/blogging/test/Volo.Blogging.TestBase/Volo.Blogging.TestBase.csproj +++ b/modules/blogging/test/Volo.Blogging.TestBase/Volo.Blogging.TestBase.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj index 3207233860..4295d91c77 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true diff --git a/modules/client-simulation/src/Volo.ClientSimulation.Web/Volo.ClientSimulation.Web.csproj b/modules/client-simulation/src/Volo.ClientSimulation.Web/Volo.ClientSimulation.Web.csproj index 06204eaa87..c244344969 100644 --- a/modules/client-simulation/src/Volo.ClientSimulation.Web/Volo.ClientSimulation.Web.csproj +++ b/modules/client-simulation/src/Volo.ClientSimulation.Web/Volo.ClientSimulation.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.ClientSimulation.Web Volo.ClientSimulation.Web Library diff --git a/modules/client-simulation/src/Volo.ClientSimulation/Volo.ClientSimulation.csproj b/modules/client-simulation/src/Volo.ClientSimulation/Volo.ClientSimulation.csproj index 274c11aed3..c29d50b132 100644 --- a/modules/client-simulation/src/Volo.ClientSimulation/Volo.ClientSimulation.csproj +++ b/modules/client-simulation/src/Volo.ClientSimulation/Volo.ClientSimulation.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.ClientSimulation Volo.ClientSimulation diff --git a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj index 8b2547b795..4016735f48 100644 --- a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj +++ b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.CmsKit true Volo.CmsKit-c2d31439-b723-48e2-b061-5ebd7aeb6010 diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj index e3f3b0cf3f..a619c0e744 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.CmsKit true Volo.CmsKit-c2d31439-b723-48e2-b061-5ebd7aeb6010 diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.csproj b/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.csproj index be312facab..6615f72396 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.csproj +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.CmsKit true Volo.CmsKit-c2d31439-b723-48e2-b061-5ebd7aeb6010 diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.csproj b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.csproj index 38130dc961..45aa6da55d 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.csproj +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.CmsKit true Volo.CmsKit-c2d31439-b723-48e2-b061-5ebd7aeb6010 diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.csproj b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.csproj index 684446b1f0..be0f0d9184 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo.CmsKit.Admin.HttpApi.csproj b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo.CmsKit.Admin.HttpApi.csproj index c1634ea1b7..25b90a7bae 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo.CmsKit.Admin.HttpApi.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo.CmsKit.Admin.HttpApi.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj index e7068a41a8..58aa5ac95d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true Library diff --git a/modules/cms-kit/src/Volo.CmsKit.Application/Volo.CmsKit.Application.csproj b/modules/cms-kit/src/Volo.CmsKit.Application/Volo.CmsKit.Application.csproj index 51282692af..85a3d48229 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Application/Volo.CmsKit.Application.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Application/Volo.CmsKit.Application.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo.CmsKit.Common.Application.csproj b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo.CmsKit.Common.Application.csproj index 145c7adac6..d6a1713198 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo.CmsKit.Common.Application.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo.CmsKit.Common.Application.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo.CmsKit.Common.HttpApi.csproj b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo.CmsKit.Common.HttpApi.csproj index decaf89c40..432e1c2c0b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo.CmsKit.Common.HttpApi.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo.CmsKit.Common.HttpApi.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj index e717f49be5..b47c66f5c7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true Library diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo.CmsKit.EntityFrameworkCore.csproj b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo.CmsKit.EntityFrameworkCore.csproj index eb970235d7..264c1aabdb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo.CmsKit.EntityFrameworkCore.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo.CmsKit.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/cms-kit/src/Volo.CmsKit.HttpApi/Volo.CmsKit.HttpApi.csproj b/modules/cms-kit/src/Volo.CmsKit.HttpApi/Volo.CmsKit.HttpApi.csproj index 481bfb18f8..6c7e80d065 100644 --- a/modules/cms-kit/src/Volo.CmsKit.HttpApi/Volo.CmsKit.HttpApi.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.HttpApi/Volo.CmsKit.HttpApi.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/cms-kit/src/Volo.CmsKit.Installer/Volo.CmsKit.Installer.csproj b/modules/cms-kit/src/Volo.CmsKit.Installer/Volo.CmsKit.Installer.csproj index 4ed4ae03fa..0a8b16c388 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Installer/Volo.CmsKit.Installer.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Installer/Volo.CmsKit.Installer.csproj @@ -4,7 +4,7 @@ - net5.0 + net7.0 true diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj index 0e192cec7a..9f6d08fea6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo.CmsKit.Public.HttpApi.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo.CmsKit.Public.HttpApi.csproj index 34682192d6..b85a6537a4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo.CmsKit.Public.HttpApi.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo.CmsKit.Public.HttpApi.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj index b4aeb556fe..e126b222b0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true Library diff --git a/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.csproj index a22da28426..e8aa365b66 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true Library diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Volo.CmsKit.Application.Tests.csproj b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Volo.CmsKit.Application.Tests.csproj index 0fcb1c227e..a6b48225f8 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Volo.CmsKit.Application.Tests.csproj +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Volo.CmsKit.Application.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.CmsKit diff --git a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Volo.CmsKit.Domain.Tests.csproj b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Volo.CmsKit.Domain.Tests.csproj index d2fdb5d123..f12130fac5 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Volo.CmsKit.Domain.Tests.csproj +++ b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Volo.CmsKit.Domain.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.CmsKit diff --git a/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/Volo.CmsKit.EntityFrameworkCore.Tests.csproj b/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/Volo.CmsKit.EntityFrameworkCore.Tests.csproj index 89319b548f..ed960bc8a0 100644 --- a/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/Volo.CmsKit.EntityFrameworkCore.Tests.csproj +++ b/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/Volo.CmsKit.EntityFrameworkCore.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.CmsKit diff --git a/modules/cms-kit/test/Volo.CmsKit.HttpApi.Client.ConsoleTestApp/Volo.CmsKit.HttpApi.Client.ConsoleTestApp.csproj b/modules/cms-kit/test/Volo.CmsKit.HttpApi.Client.ConsoleTestApp/Volo.CmsKit.HttpApi.Client.ConsoleTestApp.csproj index afad061355..3119777e1b 100644 --- a/modules/cms-kit/test/Volo.CmsKit.HttpApi.Client.ConsoleTestApp/Volo.CmsKit.HttpApi.Client.ConsoleTestApp.csproj +++ b/modules/cms-kit/test/Volo.CmsKit.HttpApi.Client.ConsoleTestApp/Volo.CmsKit.HttpApi.Client.ConsoleTestApp.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 Volo.CmsKit diff --git a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/Volo.CmsKit.MongoDB.Tests.csproj b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/Volo.CmsKit.MongoDB.Tests.csproj index c34425e716..b735bc5645 100644 --- a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/Volo.CmsKit.MongoDB.Tests.csproj +++ b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/Volo.CmsKit.MongoDB.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.CmsKit diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/Volo.CmsKit.TestBase.csproj b/modules/cms-kit/test/Volo.CmsKit.TestBase/Volo.CmsKit.TestBase.csproj index 4e7550c00c..57bf7af9f5 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/Volo.CmsKit.TestBase.csproj +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/Volo.CmsKit.TestBase.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.CmsKit diff --git a/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.csproj b/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.csproj index 84dce5e2e4..cfd2728af5 100644 --- a/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.csproj +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/docs/app/VoloDocs.Migrator/VoloDocs.Migrator.csproj b/modules/docs/app/VoloDocs.Migrator/VoloDocs.Migrator.csproj index 05d3072d87..9dd4a5e1a9 100644 --- a/modules/docs/app/VoloDocs.Migrator/VoloDocs.Migrator.csproj +++ b/modules/docs/app/VoloDocs.Migrator/VoloDocs.Migrator.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 Exe win-x64;linux-x64;osx-x64 diff --git a/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj b/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj index 3a0ed64889..ed0ea66aaa 100644 --- a/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj +++ b/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 true true false diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.csproj b/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.csproj index 72f94bdd47..eb1c23a955 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.csproj +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Docs.Admin.Application Volo.Docs.Admin.Application diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo.Docs.Admin.HttpApi.csproj b/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo.Docs.Admin.HttpApi.csproj index b82f4bba91..2be7decae7 100644 --- a/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo.Docs.Admin.HttpApi.csproj +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo.Docs.Admin.HttpApi.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Docs.Admin.HttpApi Volo.Docs.Admin.HttpApi diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj b/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj index 1c83977e3a..7ca9847f71 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj +++ b/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Docs.Admin.Web Volo.Docs.Admin.Web Library diff --git a/modules/docs/src/Volo.Docs.Application/Volo.Docs.Application.csproj b/modules/docs/src/Volo.Docs.Application/Volo.Docs.Application.csproj index b00754b104..689c7ba62f 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo.Docs.Application.csproj +++ b/modules/docs/src/Volo.Docs.Application/Volo.Docs.Application.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Docs.Application Volo.Docs.Application diff --git a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo.Docs.EntityFrameworkCore.csproj b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo.Docs.EntityFrameworkCore.csproj index 0ffb7999a0..81d4f3304f 100644 --- a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo.Docs.EntityFrameworkCore.csproj +++ b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo.Docs.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Docs.EntityFrameworkCore Volo.Docs.EntityFrameworkCore diff --git a/modules/docs/src/Volo.Docs.HttpApi/Volo.Docs.HttpApi.csproj b/modules/docs/src/Volo.Docs.HttpApi/Volo.Docs.HttpApi.csproj index a9c7c6a4e5..88c41e50da 100644 --- a/modules/docs/src/Volo.Docs.HttpApi/Volo.Docs.HttpApi.csproj +++ b/modules/docs/src/Volo.Docs.HttpApi/Volo.Docs.HttpApi.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Docs.HttpApi Volo.Docs.HttpApi diff --git a/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj b/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj index 43fb1bb9bb..afb85eee10 100644 --- a/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj +++ b/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Docs.Web Volo.Docs.Web Library diff --git a/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo.Docs.Admin.Application.Tests.csproj b/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo.Docs.Admin.Application.Tests.csproj index 431a785799..626f8d74a5 100644 --- a/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo.Docs.Admin.Application.Tests.csproj +++ b/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo.Docs.Admin.Application.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/modules/docs/test/Volo.Docs.Application.Tests/Volo.Docs.Application.Tests.csproj b/modules/docs/test/Volo.Docs.Application.Tests/Volo.Docs.Application.Tests.csproj index 4ca20fbe28..8b14273f9c 100644 --- a/modules/docs/test/Volo.Docs.Application.Tests/Volo.Docs.Application.Tests.csproj +++ b/modules/docs/test/Volo.Docs.Application.Tests/Volo.Docs.Application.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/modules/docs/test/Volo.Docs.Domain.Tests/Volo.Docs.Domain.Tests.csproj b/modules/docs/test/Volo.Docs.Domain.Tests/Volo.Docs.Domain.Tests.csproj index a4218704d9..94baa3cb98 100644 --- a/modules/docs/test/Volo.Docs.Domain.Tests/Volo.Docs.Domain.Tests.csproj +++ b/modules/docs/test/Volo.Docs.Domain.Tests/Volo.Docs.Domain.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/modules/docs/test/Volo.Docs.EntityFrameworkCore.Tests/Volo.Docs.EntityFrameworkCore.Tests.csproj b/modules/docs/test/Volo.Docs.EntityFrameworkCore.Tests/Volo.Docs.EntityFrameworkCore.Tests.csproj index 2ee496241e..6e1ebecc8f 100644 --- a/modules/docs/test/Volo.Docs.EntityFrameworkCore.Tests/Volo.Docs.EntityFrameworkCore.Tests.csproj +++ b/modules/docs/test/Volo.Docs.EntityFrameworkCore.Tests/Volo.Docs.EntityFrameworkCore.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/modules/docs/test/Volo.Docs.MongoDB.Tests/Volo.Docs.MongoDB.Tests.csproj b/modules/docs/test/Volo.Docs.MongoDB.Tests/Volo.Docs.MongoDB.Tests.csproj index 3403137a3f..a99fe71479 100644 --- a/modules/docs/test/Volo.Docs.MongoDB.Tests/Volo.Docs.MongoDB.Tests.csproj +++ b/modules/docs/test/Volo.Docs.MongoDB.Tests/Volo.Docs.MongoDB.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/modules/docs/test/Volo.Docs.TestBase/Volo.Docs.TestBase.csproj b/modules/docs/test/Volo.Docs.TestBase/Volo.Docs.TestBase.csproj index e8a295d1b0..92fff9f042 100644 --- a/modules/docs/test/Volo.Docs.TestBase/Volo.Docs.TestBase.csproj +++ b/modules/docs/test/Volo.Docs.TestBase/Volo.Docs.TestBase.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo.Abp.FeatureManagement.Application.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo.Abp.FeatureManagement.Application.csproj index 4ea705d8ef..b1d73f3b39 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo.Abp.FeatureManagement.Application.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo.Abp.FeatureManagement.Application.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor.Server/Volo.Abp.FeatureManagement.Blazor.Server.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor.Server/Volo.Abp.FeatureManagement.Blazor.Server.csproj index 18bc701f47..cf125135ca 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor.Server/Volo.Abp.FeatureManagement.Blazor.Server.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor.Server/Volo.Abp.FeatureManagement.Blazor.Server.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor.WebAssembly/Volo.Abp.FeatureManagement.Blazor.WebAssembly.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor.WebAssembly/Volo.Abp.FeatureManagement.Blazor.WebAssembly.csproj index 6ca6827345..e6883c3e65 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor.WebAssembly/Volo.Abp.FeatureManagement.Blazor.WebAssembly.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor.WebAssembly/Volo.Abp.FeatureManagement.Blazor.WebAssembly.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Volo.Abp.FeatureManagement.Blazor.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Volo.Abp.FeatureManagement.Blazor.csproj index 49d7ffd6c6..4034f39c12 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Volo.Abp.FeatureManagement.Blazor.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Volo.Abp.FeatureManagement.Blazor.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo.Abp.FeatureManagement.EntityFrameworkCore.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo.Abp.FeatureManagement.EntityFrameworkCore.csproj index 9059e0e14b..06376b2198 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo.Abp.FeatureManagement.EntityFrameworkCore.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo.Abp.FeatureManagement.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo.Abp.FeatureManagement.HttpApi.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo.Abp.FeatureManagement.HttpApi.csproj index f522c517e7..accd91a9c7 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo.Abp.FeatureManagement.HttpApi.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo.Abp.FeatureManagement.HttpApi.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Installer/Volo.Abp.FeatureManagement.Installer.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Installer/Volo.Abp.FeatureManagement.Installer.csproj index de78fd2a68..4de43fbe31 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Installer/Volo.Abp.FeatureManagement.Installer.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Installer/Volo.Abp.FeatureManagement.Installer.csproj @@ -4,7 +4,7 @@ - net5.0 + net7.0 true diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj index f9e1bdb16e..b460935d48 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true Library diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo.Abp.FeatureManagement.Application.Tests.csproj b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo.Abp.FeatureManagement.Application.Tests.csproj index 64407eeaac..558ce8d4ec 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo.Abp.FeatureManagement.Application.Tests.csproj +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo.Abp.FeatureManagement.Application.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Domain.Tests/Volo.Abp.FeatureManagement.Domain.Tests.csproj b/modules/feature-management/test/Volo.Abp.FeatureManagement.Domain.Tests/Volo.Abp.FeatureManagement.Domain.Tests.csproj index 554b15141e..f6ee203f43 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Domain.Tests/Volo.Abp.FeatureManagement.Domain.Tests.csproj +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.Domain.Tests/Volo.Abp.FeatureManagement.Domain.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests.csproj b/modules/feature-management/test/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests.csproj index f028c9b9b6..2b2dd43864 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests.csproj +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.MongoDB.Tests/Volo.Abp.FeatureManagement.MongoDB.Tests.csproj b/modules/feature-management/test/Volo.Abp.FeatureManagement.MongoDB.Tests/Volo.Abp.FeatureManagement.MongoDB.Tests.csproj index 8f00ecf998..4e5a1775c4 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.MongoDB.Tests/Volo.Abp.FeatureManagement.MongoDB.Tests.csproj +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.MongoDB.Tests/Volo.Abp.FeatureManagement.MongoDB.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo.Abp.FeatureManagement.TestBase.csproj b/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo.Abp.FeatureManagement.TestBase.csproj index 89341bd394..4380732711 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo.Abp.FeatureManagement.TestBase.csproj +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo.Abp.FeatureManagement.TestBase.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/identity/src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.csproj b/modules/identity/src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.csproj index 4698a381fa..4a01b833aa 100644 --- a/modules/identity/src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Identity.Application Volo.Abp.Identity.Application $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo.Abp.Identity.AspNetCore.csproj b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo.Abp.Identity.AspNetCore.csproj index 3e00d7d2ce..5bb4e3b29e 100644 --- a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo.Abp.Identity.AspNetCore.csproj +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo.Abp.Identity.AspNetCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Identity.AspNetCore Volo.Abp.Identity.AspNetCore $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor.Server/Volo.Abp.Identity.Blazor.Server.csproj b/modules/identity/src/Volo.Abp.Identity.Blazor.Server/Volo.Abp.Identity.Blazor.Server.csproj index c3606503b8..eed96d26ce 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor.Server/Volo.Abp.Identity.Blazor.Server.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Blazor.Server/Volo.Abp.Identity.Blazor.Server.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor.WebAssembly/Volo.Abp.Identity.Blazor.WebAssembly.csproj b/modules/identity/src/Volo.Abp.Identity.Blazor.WebAssembly/Volo.Abp.Identity.Blazor.WebAssembly.csproj index 590ac76e92..7ee187e3cd 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor.WebAssembly/Volo.Abp.Identity.Blazor.WebAssembly.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Blazor.WebAssembly/Volo.Abp.Identity.Blazor.WebAssembly.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Volo.Abp.Identity.Blazor.csproj b/modules/identity/src/Volo.Abp.Identity.Blazor/Volo.Abp.Identity.Blazor.csproj index 4cd965e0eb..1cdab5e69f 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Volo.Abp.Identity.Blazor.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Volo.Abp.Identity.Blazor.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.csproj b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.csproj index 41cf02d96e..8dd4ffa899 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.csproj +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Identity.EntityFrameworkCore Volo.Abp.Identity.EntityFrameworkCore $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/identity/src/Volo.Abp.Identity.HttpApi/Volo.Abp.Identity.HttpApi.csproj b/modules/identity/src/Volo.Abp.Identity.HttpApi/Volo.Abp.Identity.HttpApi.csproj index 374001080d..a5f9a793a0 100644 --- a/modules/identity/src/Volo.Abp.Identity.HttpApi/Volo.Abp.Identity.HttpApi.csproj +++ b/modules/identity/src/Volo.Abp.Identity.HttpApi/Volo.Abp.Identity.HttpApi.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Identity.HttpApi Volo.Abp.Identity.HttpApi $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/identity/src/Volo.Abp.Identity.Installer/Volo.Abp.Identity.Installer.csproj b/modules/identity/src/Volo.Abp.Identity.Installer/Volo.Abp.Identity.Installer.csproj index 80a1b51bb0..f0d0b7f76b 100644 --- a/modules/identity/src/Volo.Abp.Identity.Installer/Volo.Abp.Identity.Installer.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Installer/Volo.Abp.Identity.Installer.csproj @@ -4,7 +4,7 @@ - net5.0 + net7.0 true diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj b/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj index e3baeb0892..8ffd329591 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Identity.Web Volo.Abp.Identity.Web $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo.Abp.Identity.Application.Tests.csproj b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo.Abp.Identity.Application.Tests.csproj index 43ce47b016..08e8c32d87 100644 --- a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo.Abp.Identity.Application.Tests.csproj +++ b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo.Abp.Identity.Application.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.Identity.Application.Tests Volo.Abp.Identity.Application.Tests true diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.csproj b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.csproj index 50963e1538..798cb3473f 100644 --- a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.csproj +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.Identity.AspNetCore.Tests Volo.Abp.Identity.AspNetCore.Tests true diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.csproj b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.csproj index 825c31a2eb..0f1ec0b5f7 100644 --- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.csproj +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.Identity.Domain.Tests Volo.Abp.Identity.Domain.Tests true diff --git a/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo.Abp.Identity.EntityFrameworkCore.Tests.csproj b/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo.Abp.Identity.EntityFrameworkCore.Tests.csproj index 139ccc9262..9f583a4d1b 100644 --- a/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo.Abp.Identity.EntityFrameworkCore.Tests.csproj +++ b/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo.Abp.Identity.EntityFrameworkCore.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.Identity.EntityFrameworkCore.Tests Volo.Abp.Identity.EntityFrameworkCore.Tests true diff --git a/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo.Abp.Identity.MongoDB.Tests.csproj b/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo.Abp.Identity.MongoDB.Tests.csproj index 4288c3073b..d9704ac108 100644 --- a/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo.Abp.Identity.MongoDB.Tests.csproj +++ b/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo.Abp.Identity.MongoDB.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.Identity.MongoDB.Tests Volo.Abp.Identity.MongoDB.Tests true diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo.Abp.Identity.TestBase.csproj b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo.Abp.Identity.TestBase.csproj index 81f145e863..5b4929712f 100644 --- a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo.Abp.Identity.TestBase.csproj +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo.Abp.Identity.TestBase.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.Identity.TestBase Volo.Abp.Identity.TestBase true diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj index 525cea6871..c945924124 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.IdentityServer.Domain Volo.Abp.IdentityServer.Domain $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo.Abp.IdentityServer.EntityFrameworkCore.csproj b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo.Abp.IdentityServer.EntityFrameworkCore.csproj index 14de1ee8c9..f295a9b3a2 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo.Abp.IdentityServer.EntityFrameworkCore.csproj +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo.Abp.IdentityServer.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.IdentityServer.EntityFrameworkCore Volo.Abp.IdentityServer.EntityFrameworkCore $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Installer/Volo.Abp.IdentityServer.Installer.csproj b/modules/identityserver/src/Volo.Abp.IdentityServer.Installer/Volo.Abp.IdentityServer.Installer.csproj index ca7d96ac5d..3fa3900729 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Installer/Volo.Abp.IdentityServer.Installer.csproj +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Installer/Volo.Abp.IdentityServer.Installer.csproj @@ -4,7 +4,7 @@ - net5.0 + net7.0 true diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo.Abp.IdentityServer.MongoDB.csproj b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo.Abp.IdentityServer.MongoDB.csproj index 6ed1f9ba6b..a088db3778 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo.Abp.IdentityServer.MongoDB.csproj +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo.Abp.IdentityServer.MongoDB.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.IdentityServer.MongoDB Volo.Abp.IdentityServer.MongoDB $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.csproj b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.csproj index fe9c092f4f..531d7db8cf 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.csproj +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.IdentityServer.Domain.Tests Volo.Abp.IdentityServer.Domain.Tests true diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.csproj b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.csproj index e23e9416d5..49fcacef4e 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.csproj +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.IdentityServer.EntityFrameworkCore.Tests Volo.Abp.IdentityServer.EntityFrameworkCore.Tests true diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo.Abp.IdentityServer.MongoDB.Tests.csproj b/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo.Abp.IdentityServer.MongoDB.Tests.csproj index 7200a74ce6..43cd256eac 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo.Abp.IdentityServer.MongoDB.Tests.csproj +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo.Abp.IdentityServer.MongoDB.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.IdentityServer.MongoDB.Tests Volo.Abp.IdentityServer.MongoDB.Tests true diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo.Abp.IdentityServer.TestBase.csproj b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo.Abp.IdentityServer.TestBase.csproj index 5ea3296863..cc3210f7c7 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo.Abp.IdentityServer.TestBase.csproj +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo.Abp.IdentityServer.TestBase.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.IdentityServer.TestBase Volo.Abp.IdentityServer.TestBase true diff --git a/modules/openiddict/app/OpenIddict.Demo.API/OpenIddict.Demo.API.csproj b/modules/openiddict/app/OpenIddict.Demo.API/OpenIddict.Demo.API.csproj index fc8ba192d3..055162f5ac 100644 --- a/modules/openiddict/app/OpenIddict.Demo.API/OpenIddict.Demo.API.csproj +++ b/modules/openiddict/app/OpenIddict.Demo.API/OpenIddict.Demo.API.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 enable enable diff --git a/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/OpenIddict.Demo.Client.BlazorWASM.csproj b/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/OpenIddict.Demo.Client.BlazorWASM.csproj index 8291ec7157..70721e10c1 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/OpenIddict.Demo.Client.BlazorWASM.csproj +++ b/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/OpenIddict.Demo.Client.BlazorWASM.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 enable enable diff --git a/modules/openiddict/app/OpenIddict.Demo.Client.Console/OpenIddict.Demo.Client.Console.csproj b/modules/openiddict/app/OpenIddict.Demo.Client.Console/OpenIddict.Demo.Client.Console.csproj index 8302a5d26e..12b1085bc2 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Client.Console/OpenIddict.Demo.Client.Console.csproj +++ b/modules/openiddict/app/OpenIddict.Demo.Client.Console/OpenIddict.Demo.Client.Console.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 enable enable diff --git a/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.csproj b/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.csproj index f1fc938e17..51010aa002 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.csproj +++ b/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 enable enable diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddict.Demo.Server.csproj b/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddict.Demo.Server.csproj index 3bf02ee182..d779929d9a 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddict.Demo.Server.csproj +++ b/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddict.Demo.Server.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 enable enable OpenIddict.Demo.Server1 diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo.Abp.OpenIddict.AspNetCore.csproj b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo.Abp.OpenIddict.AspNetCore.csproj index fabcb8116b..ac3eef6a01 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo.Abp.OpenIddict.AspNetCore.csproj +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo.Abp.OpenIddict.AspNetCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Library true diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo.Abp.OpenIddict.EntityFrameworkCore.csproj b/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo.Abp.OpenIddict.EntityFrameworkCore.csproj index 3a4b4147bc..fadaaa201a 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo.Abp.OpenIddict.EntityFrameworkCore.csproj +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo.Abp.OpenIddict.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo.Abp.OpenIddict.MongoDB.csproj b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo.Abp.OpenIddict.MongoDB.csproj index ff155124b1..0607a4723e 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo.Abp.OpenIddict.MongoDB.csproj +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo.Abp.OpenIddict.MongoDB.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo.Abp.OpenIddict.Domain.Tests.csproj b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo.Abp.OpenIddict.Domain.Tests.csproj index bc0107236b..3e06388401 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo.Abp.OpenIddict.Domain.Tests.csproj +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo.Abp.OpenIddict.Domain.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests.csproj b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests.csproj index 959bdcbfef..46e791178d 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests.csproj +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo.Abp.OpenIddict.MongoDB.Tests.csproj b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo.Abp.OpenIddict.MongoDB.Tests.csproj index 12cb1cfddd..77e2d9c59f 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo.Abp.OpenIddict.MongoDB.Tests.csproj +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo.Abp.OpenIddict.MongoDB.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo.Abp.OpenIddict.TestBase.csproj b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo.Abp.OpenIddict.TestBase.csproj index 08d40ade84..3eb46bff4e 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo.Abp.OpenIddict.TestBase.csproj +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo.Abp.OpenIddict.TestBase.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.csproj index 080432db39..3a37ab6d33 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.PermissionManagement.Application Volo.Abp.PermissionManagement.Application $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.Server/Volo.Abp.PermissionManagement.Blazor.Server.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.Server/Volo.Abp.PermissionManagement.Blazor.Server.csproj index a89e5cfaee..695170a1a0 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.Server/Volo.Abp.PermissionManagement.Blazor.Server.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.Server/Volo.Abp.PermissionManagement.Blazor.Server.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.WebAssembly/Volo.Abp.PermissionManagement.Blazor.WebAssembly.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.WebAssembly/Volo.Abp.PermissionManagement.Blazor.WebAssembly.csproj index a8ff989b53..a2eaf1bfb2 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.WebAssembly/Volo.Abp.PermissionManagement.Blazor.WebAssembly.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.WebAssembly/Volo.Abp.PermissionManagement.Blazor.WebAssembly.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Volo.Abp.PermissionManagement.Blazor.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Volo.Abp.PermissionManagement.Blazor.csproj index 18b2dda1a0..965cd5f0d9 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Volo.Abp.PermissionManagement.Blazor.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Volo.Abp.PermissionManagement.Blazor.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.csproj index 83d07fbd40..e22990e2f8 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.PermissionManagement.EntityFrameworkCore Volo.Abp.PermissionManagement.EntityFrameworkCore $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.csproj index 8f6c2e9006..870cd86aa1 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.PermissionManagement.HttpApi Volo.Abp.PermissionManagement.HttpApi $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Installer/Volo.Abp.PermissionManagement.Installer.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.Installer/Volo.Abp.PermissionManagement.Installer.csproj index c1fa844501..a979c13d03 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Installer/Volo.Abp.PermissionManagement.Installer.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Installer/Volo.Abp.PermissionManagement.Installer.csproj @@ -4,7 +4,7 @@ - net5.0 + net7.0 true diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.csproj index bf11efd61d..d289598e8b 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.PermissionManagement.Web Volo.Abp.PermissionManagement.Web $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj index ae945dd4a9..3aed24a20e 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj index 9b0cd2f1c0..8e2e789c22 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.PermissionManagement.Tests Volo.Abp.PermissionManagement.Tests true diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.csproj index 034ee303da..4235636aa6 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.csproj +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests true diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.csproj index 93b14e484f..708cc79a6a 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.csproj +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.PermissionManagement.MongoDB.Tests Volo.Abp.PermissionManagement.MongoDB.Tests true diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo.Abp.PermissionManagement.TestBase.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo.Abp.PermissionManagement.TestBase.csproj index 66d69fe5c1..9b5d6cc9f9 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo.Abp.PermissionManagement.TestBase.csproj +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo.Abp.PermissionManagement.TestBase.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.PermissionManagement.TestBase Volo.Abp.PermissionManagement.TestBase true diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/Volo.Abp.SettingManagement.DemoApp.csproj b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/Volo.Abp.SettingManagement.DemoApp.csproj index d844f022ae..397202db72 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/Volo.Abp.SettingManagement.DemoApp.csproj +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/Volo.Abp.SettingManagement.DemoApp.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 InProcess true diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj index 8061d285e7..024fa9ad60 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.Server/Volo.Abp.SettingManagement.Blazor.Server.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.Server/Volo.Abp.SettingManagement.Blazor.Server.csproj index bb4d130a4b..86ce407803 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.Server/Volo.Abp.SettingManagement.Blazor.Server.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.Server/Volo.Abp.SettingManagement.Blazor.Server.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.WebAssembly/Volo.Abp.SettingManagement.Blazor.WebAssembly.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.WebAssembly/Volo.Abp.SettingManagement.Blazor.WebAssembly.csproj index d237edd4c5..9d3b2bf0a3 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.WebAssembly/Volo.Abp.SettingManagement.Blazor.WebAssembly.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.WebAssembly/Volo.Abp.SettingManagement.Blazor.WebAssembly.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.csproj index d10f250d58..6aeeb72dc4 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.SettingManagement.Blazor diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo.Abp.SettingManagement.EntityFrameworkCore.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo.Abp.SettingManagement.EntityFrameworkCore.csproj index cde8078b21..3938a0bbd4 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo.Abp.SettingManagement.EntityFrameworkCore.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo.Abp.SettingManagement.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.SettingManagement.EntityFrameworkCore Volo.Abp.SettingManagement.EntityFrameworkCore $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.csproj index f46efa14ee..e90095f43d 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Installer/Volo.Abp.SettingManagement.Installer.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Installer/Volo.Abp.SettingManagement.Installer.csproj index dd3daf7500..5ee01e2326 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Installer/Volo.Abp.SettingManagement.Installer.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Installer/Volo.Abp.SettingManagement.Installer.csproj @@ -4,7 +4,7 @@ - net5.0 + net7.0 true diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj index 7b77c68f22..9307cfa02e 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Library true $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.csproj b/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.csproj index a1d22398ab..905949555c 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.csproj +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.SettingManagement.EntityFrameworkCore.Tests Volo.Abp.SettingManagement.EntityFrameworkCore.Tests true diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.csproj b/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.csproj index a0b59785ad..ee315162a7 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.csproj +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.SettingManagement.MongoDB.Tests Volo.Abp.SettingManagement.MongoDB.Tests true diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo.Abp.SettingManagement.TestBase.csproj b/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo.Abp.SettingManagement.TestBase.csproj index 58846a3c59..6a50c2c08d 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo.Abp.SettingManagement.TestBase.csproj +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo.Abp.SettingManagement.TestBase.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.SettingManagement.TestBase Volo.Abp.SettingManagement.TestBase true diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo.Abp.SettingManagement.Tests.csproj b/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo.Abp.SettingManagement.Tests.csproj index 2cef566e1f..eddc8c95c4 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo.Abp.SettingManagement.Tests.csproj +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo.Abp.SettingManagement.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.SettingManagement.Tests Volo.Abp.SettingManagement.Tests true diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.csproj index 25e39ab17c..81e405b030 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.TenantManagement.Application Volo.Abp.TenantManagement.Application $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor.Server/Volo.Abp.TenantManagement.Blazor.Server.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor.Server/Volo.Abp.TenantManagement.Blazor.Server.csproj index 5fdaf68394..9bec240ef7 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor.Server/Volo.Abp.TenantManagement.Blazor.Server.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor.Server/Volo.Abp.TenantManagement.Blazor.Server.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor.WebAssembly/Volo.Abp.TenantManagement.Blazor.WebAssembly.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor.WebAssembly/Volo.Abp.TenantManagement.Blazor.WebAssembly.csproj index 6c3485a812..1966e0bcdd 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor.WebAssembly/Volo.Abp.TenantManagement.Blazor.WebAssembly.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor.WebAssembly/Volo.Abp.TenantManagement.Blazor.WebAssembly.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Volo.Abp.TenantManagement.Blazor.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Volo.Abp.TenantManagement.Blazor.csproj index 664af8aa4c..23e373f003 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Volo.Abp.TenantManagement.Blazor.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Volo.Abp.TenantManagement.Blazor.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo.Abp.TenantManagement.EntityFrameworkCore.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo.Abp.TenantManagement.EntityFrameworkCore.csproj index 38e4bd007a..9b12c9b859 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo.Abp.TenantManagement.EntityFrameworkCore.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo.Abp.TenantManagement.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.TenantManagement.EntityFrameworkCore Volo.Abp.TenantManagement.EntityFrameworkCore $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi/Volo.Abp.TenantManagement.HttpApi.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi/Volo.Abp.TenantManagement.HttpApi.csproj index 65b638427e..40aa3b5af2 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi/Volo.Abp.TenantManagement.HttpApi.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi/Volo.Abp.TenantManagement.HttpApi.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.TenantManagement.HttpApi Volo.Abp.TenantManagement.HttpApi $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Installer/Volo.Abp.TenantManagement.Installer.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Installer/Volo.Abp.TenantManagement.Installer.csproj index 13fa3e195f..071b88fd9e 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Installer/Volo.Abp.TenantManagement.Installer.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Installer/Volo.Abp.TenantManagement.Installer.csproj @@ -4,7 +4,7 @@ - net5.0 + net7.0 true diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj index 57bcb8be37..7e211e504c 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.TenantManagement.Web Volo.Abp.TenantManagement.Web true diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo.Abp.TenantManagement.Application.Tests.csproj b/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo.Abp.TenantManagement.Application.Tests.csproj index 813368f1cb..14d682f05e 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo.Abp.TenantManagement.Application.Tests.csproj +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo.Abp.TenantManagement.Application.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.TenantManagement.Application.Tests Volo.Abp.TenantManagement.Application.Tests true diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.Domain.Tests/Volo.Abp.TenantManagement.Domain.Tests.csproj b/modules/tenant-management/test/Volo.Abp.TenantManagement.Domain.Tests/Volo.Abp.TenantManagement.Domain.Tests.csproj index 14fae122ed..b2f13e5502 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.Domain.Tests/Volo.Abp.TenantManagement.Domain.Tests.csproj +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.Domain.Tests/Volo.Abp.TenantManagement.Domain.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests.csproj b/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests.csproj index 938b36c9e8..d3c9a0ec89 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests.csproj +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.TenantManagement.EntityFrameworkCore.Tests Volo.Abp.TenantManagement.EntityFrameworkCore.Tests true diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo.Abp.TenantManagement.MongoDB.Tests.csproj b/modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo.Abp.TenantManagement.MongoDB.Tests.csproj index a6c673baa0..c37658f4ec 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo.Abp.TenantManagement.MongoDB.Tests.csproj +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo.Abp.TenantManagement.MongoDB.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.TenantManagement.MongoDB.Tests Volo.Abp.TenantManagement.MongoDB.Tests true diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.TestBase/Volo.Abp.TenantManagement.TestBase.csproj b/modules/tenant-management/test/Volo.Abp.TenantManagement.TestBase/Volo.Abp.TenantManagement.TestBase.csproj index e6b67f478d..a79a6914dd 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.TestBase/Volo.Abp.TenantManagement.TestBase.csproj +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.TestBase/Volo.Abp.TenantManagement.TestBase.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 Volo.Abp.TenantManagement.TestBase Volo.Abp.TenantManagement.TestBase true diff --git a/modules/users/src/Volo.Abp.Users.EntityFrameworkCore/Volo.Abp.Users.EntityFrameworkCore.csproj b/modules/users/src/Volo.Abp.Users.EntityFrameworkCore/Volo.Abp.Users.EntityFrameworkCore.csproj index be263c46d7..b524fe897d 100644 --- a/modules/users/src/Volo.Abp.Users.EntityFrameworkCore/Volo.Abp.Users.EntityFrameworkCore.csproj +++ b/modules/users/src/Volo.Abp.Users.EntityFrameworkCore/Volo.Abp.Users.EntityFrameworkCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.Users.EntityFrameworkCore Volo.Abp.Users.EntityFrameworkCore $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/users/src/Volo.Abp.Users.Installer/Volo.Abp.Users.Installer.csproj b/modules/users/src/Volo.Abp.Users.Installer/Volo.Abp.Users.Installer.csproj index e39f1e5b6e..f4835f2a49 100644 --- a/modules/users/src/Volo.Abp.Users.Installer/Volo.Abp.Users.Installer.csproj +++ b/modules/users/src/Volo.Abp.Users.Installer/Volo.Abp.Users.Installer.csproj @@ -4,7 +4,7 @@ - net5.0 + net7.0 true diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.csproj b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.csproj index e3eccbec46..04ab3f124a 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.csproj +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 aspnet-Volo.Abp.VirtualFileExplorer.DemoApp-234AF9E1-C3E0-4F8F-BD7D-840627CC8E46 diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer/Volo.Abp.VirtualFileExplorer.Installer.csproj b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer/Volo.Abp.VirtualFileExplorer.Installer.csproj index 6a82e34326..5266adfd1f 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer/Volo.Abp.VirtualFileExplorer.Installer.csproj +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer/Volo.Abp.VirtualFileExplorer.Installer.csproj @@ -4,7 +4,7 @@ - net5.0 + net7.0 true diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj index e314e532f9..32ae96fa5b 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; false false diff --git a/studio/source-codes/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.csproj b/studio/source-codes/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.csproj index ff32f7eefc..31945a6778 100644 --- a/studio/source-codes/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.csproj b/studio/source-codes/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.csproj index e52db56ad7..478eec905f 100644 --- a/studio/source-codes/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.csproj b/studio/source-codes/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.csproj index 6076424029..4a96c8171b 100644 --- a/studio/source-codes/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.csproj b/studio/source-codes/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.csproj index 4496c586d9..2a514ef40b 100644 --- a/studio/source-codes/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.csproj b/studio/source-codes/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.csproj index cb4dd198a0..ca8d68865a 100644 --- a/studio/source-codes/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.csproj b/studio/source-codes/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.csproj index 1135d55f1a..56b7608ad2 100644 --- a/studio/source-codes/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.csproj b/studio/source-codes/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.csproj index 8f10f1ae5b..f6aa9f7b68 100644 --- a/studio/source-codes/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.csproj b/studio/source-codes/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.csproj index b8f93f5ab1..2838f95dbe 100644 --- a/studio/source-codes/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.csproj b/studio/source-codes/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.csproj index 3a61ff5a4a..0bf4d38be4 100644 --- a/studio/source-codes/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.csproj b/studio/source-codes/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.csproj index d1df2a61d8..be3c7d07cc 100644 --- a/studio/source-codes/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Abp.Studio.Open.SourceCode/Volo.Abp.Studio.Open.SourceCode.csproj b/studio/source-codes/Volo.Abp.Studio.Open.SourceCode/Volo.Abp.Studio.Open.SourceCode.csproj index e9363c3d48..d84cbbdd3b 100644 --- a/studio/source-codes/Volo.Abp.Studio.Open.SourceCode/Volo.Abp.Studio.Open.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.Studio.Open.SourceCode/Volo.Abp.Studio.Open.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.csproj b/studio/source-codes/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.csproj index 6a3e5f317c..4f8e923b65 100644 --- a/studio/source-codes/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.csproj b/studio/source-codes/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.csproj index ca0f28a959..fdefecbac9 100644 --- a/studio/source-codes/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.csproj b/studio/source-codes/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.csproj index e8daef2a09..c5a1b2c530 100644 --- a/studio/source-codes/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.csproj b/studio/source-codes/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.csproj index 9a836e5f35..48e82d3803 100644 --- a/studio/source-codes/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.csproj +++ b/studio/source-codes/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.csproj b/studio/source-codes/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.csproj index 1a687aea73..2069b27fa2 100644 --- a/studio/source-codes/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.csproj +++ b/studio/source-codes/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.csproj b/studio/source-codes/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.csproj index 5b5d0a3632..99aa51eb22 100644 --- a/studio/source-codes/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.csproj +++ b/studio/source-codes/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/source-codes/Volo.Docs.SourceCode/Volo.Docs.SourceCode.csproj b/studio/source-codes/Volo.Docs.SourceCode/Volo.Docs.SourceCode.csproj index e8f3b5aa53..98718442af 100644 --- a/studio/source-codes/Volo.Docs.SourceCode/Volo.Docs.SourceCode.csproj +++ b/studio/source-codes/Volo.Docs.SourceCode/Volo.Docs.SourceCode.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/studio/src/Volo.Abp.Studio.Domain.CommonServices/Volo.Abp.Studio.Domain.CommonServices.csproj b/studio/src/Volo.Abp.Studio.Domain.CommonServices/Volo.Abp.Studio.Domain.CommonServices.csproj index 0f266a153e..07304831b3 100644 --- a/studio/src/Volo.Abp.Studio.Domain.CommonServices/Volo.Abp.Studio.Domain.CommonServices.csproj +++ b/studio/src/Volo.Abp.Studio.Domain.CommonServices/Volo.Abp.Studio.Domain.CommonServices.csproj @@ -3,7 +3,7 @@ - net5.0 + net7.0 true diff --git a/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo.Abp.Studio.ModuleInstaller.csproj b/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo.Abp.Studio.ModuleInstaller.csproj index 2d3577e20f..af3e35b8f7 100644 --- a/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo.Abp.Studio.ModuleInstaller.csproj +++ b/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo.Abp.Studio.ModuleInstaller.csproj @@ -3,7 +3,7 @@ - net5.0 + net7.0 true diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj index b96ca830b6..329a828dcc 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 enable true @@ -81,7 +81,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index b915262a65..73474e371a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 enable true @@ -82,11 +82,11 @@ - + - + runtime; build; native; contentfiles; analyzers compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj index 6d700763c7..26d7fc39c7 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 enable true @@ -73,7 +73,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj index 782a0b7afb..691595cb9c 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 enable true @@ -74,11 +74,11 @@ - + - + runtime; build; native; contentfiles; analyzers compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj index 694178b55b..d5912468c2 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 enable true @@ -76,7 +76,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj index d942bd74a0..df33bb7952 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 enable true @@ -77,11 +77,11 @@ - + - + runtime; build; native; contentfiles; analyzers compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj index 25e526fd2d..8037a452b4 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj index 6d1cf200e5..3956046dd4 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj index 60a62cafbe..395d347807 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 true true true diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index de7bc577a6..2101cc16a7 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 true true true diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj index 8cd4c0d3c8..507c6f504f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 true service-worker-assets.js @@ -13,8 +13,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj index 77892c5cc5..8b6a4022f1 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj @@ -4,7 +4,7 @@ Exe - net6.0 + net7.0 @@ -21,7 +21,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyCompanyName.MyProjectName.Domain.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyCompanyName.MyProjectName.Domain.csproj index 85787e9ffd..16f823b3ba 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyCompanyName.MyProjectName.Domain.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyCompanyName.MyProjectName.Domain.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj index b3ed2380a9..32ce8677cf 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName @@ -21,9 +21,9 @@ - + + all runtime; build; native; contentfiles; analyzers - compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index 800dcbf3da..98f4b8a541 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName true MyCompanyName.MyProjectName-4681b4fd-151f-4221-84a4-929d86723e4c @@ -12,8 +12,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj index 1df4ec3e02..f7bbc5fec6 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName true MyCompanyName.MyProjectName-4681b4fd-151f-4221-84a4-929d86723e4c diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj index 630a23c3bd..2a585f45a4 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MyCompanyName.MyProjectName.MongoDB.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MyCompanyName.MyProjectName.MongoDB.csproj index 01cca1665c..e9f07986e2 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MyCompanyName.MyProjectName.MongoDB.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MyCompanyName.MyProjectName.MongoDB.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index c65609d468..223b5d5fc0 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName.Web $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true @@ -17,7 +17,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index 4f2b5e268e..19aa2efbc7 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName.Web $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj index f7c2ea234d..ee00e7f04c 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj index c54db160e0..defd452da5 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj index 7c0d168034..6806868b1c 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj index 66d5efd55e..cba50f2f41 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj index 368d378885..b9844d6d0f 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj index 57ea860a60..efdeb6718b 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyCompanyName.MyProjectName.Web.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyCompanyName.MyProjectName.Web.Tests.csproj index b9aad6bf1d..05193d0987 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyCompanyName.MyProjectName.Web.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyCompanyName.MyProjectName.Web.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 Exe $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; MyCompanyName.MyProjectName diff --git a/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index b79488f83f..f7fb67b3ad 100644 --- a/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -4,7 +4,7 @@ Exe - net6.0 + net7.0 @@ -12,7 +12,7 @@ - + diff --git a/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index 73a3c5c110..3bcd4f90d4 100644 --- a/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -3,10 +3,10 @@ - net6.0-android;net6.0-ios;net6.0-maccatalyst - $(TargetFrameworks);net6.0-windows10.0.19041.0 + net7.0-android;net7.0-ios;net7.0-maccatalyst + $(TargetFrameworks);net7.0-windows10.0.19041.0 - + Exe MyCompanyName.MyProjectName true @@ -34,7 +34,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj index d1052473bb..e002870852 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName true MyCompanyName.MyProjectName-c2d31439-b723-48e2-b061-5ebd7aeb6010 @@ -12,8 +12,8 @@ - - + + all runtime; build; native; contentfiles; analyzers diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj index 67219be5b6..57563e358f 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj @@ -3,15 +3,15 @@ - net6.0 + net7.0 true - - + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj index fcfd56b48b..53bc4573ff 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 true true true @@ -16,7 +16,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index b48c14ab1e..5913a0185f 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName true MyCompanyName.MyProjectName-c2d31439-b723-48e2-b061-5ebd7aeb6010 @@ -13,9 +13,9 @@ - - - + + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index 491a246ea1..6ca12573ae 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName true MyCompanyName.MyProjectName-c2d31439-b723-48e2-b061-5ebd7aeb6010 @@ -12,7 +12,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj index c807ce3049..e0299c5774 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName true MyCompanyName.MyProjectName-c2d31439-b723-48e2-b061-5ebd7aeb6010 @@ -12,7 +12,7 @@ - + all runtime; build; native; contentfiles; analyzers diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj index f97a38e9bf..82e5ec1a94 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index f4b05fda0a..fb7721dabc 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebAssembly/MyCompanyName.MyProjectName.Blazor.WebAssembly.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebAssembly/MyCompanyName.MyProjectName.Blazor.WebAssembly.csproj index 0baa9305ff..7a47626fc9 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebAssembly/MyCompanyName.MyProjectName.Blazor.WebAssembly.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebAssembly/MyCompanyName.MyProjectName.Blazor.WebAssembly.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj index 0385b5be02..c5bf783de3 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index d468b62c59..abcade0ecf 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -13,7 +13,7 @@ - + diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj index 64bf004cb2..5c50aed0f2 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj index e7739550be..411049eb72 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Installer/MyCompanyName.MyProjectName.Installer.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Installer/MyCompanyName.MyProjectName.Installer.csproj index 04e01c4466..97cca24af8 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Installer/MyCompanyName.MyProjectName.Installer.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Installer/MyCompanyName.MyProjectName.Installer.csproj @@ -3,7 +3,7 @@ - net5.0 + net7.0 true MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index c6b9ea8d03..765c804972 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true Library @@ -21,7 +21,7 @@ - + diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj index 0dc4ddd733..ae01d6eff1 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj index b2a8dbed03..5edd4ddc4f 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj index 0d577f1e96..3831bf7a5b 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj @@ -3,13 +3,13 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName - + diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj index bca4086c54..d7cdfd4404 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 MyCompanyName.MyProjectName @@ -22,7 +22,7 @@ - + diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj index 31efe22b92..1dffc4d80f 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj index 9af92ffc88..8c422a46e3 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj @@ -3,7 +3,7 @@ - net6.0 + net7.0 MyCompanyName.MyProjectName diff --git a/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index cead3f8c94..42b0bb2def 100644 --- a/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -4,7 +4,7 @@ WinExe - net5.0-windows + net7.0-windows true @@ -13,7 +13,7 @@ - + diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj b/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj index 4f8cdd8bbd..c9bf97f998 100644 --- a/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj index 858401c9bf..181b8c098d 100644 --- a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 diff --git a/test/DistEvents/DistDemoApp.EfCoreRabbitMq/DistDemoApp.EfCoreRabbitMq.csproj b/test/DistEvents/DistDemoApp.EfCoreRabbitMq/DistDemoApp.EfCoreRabbitMq.csproj index 60168258f0..53fb4732bf 100644 --- a/test/DistEvents/DistDemoApp.EfCoreRabbitMq/DistDemoApp.EfCoreRabbitMq.csproj +++ b/test/DistEvents/DistDemoApp.EfCoreRabbitMq/DistDemoApp.EfCoreRabbitMq.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 DistDemoApp diff --git a/test/DistEvents/DistDemoApp.MongoDbKafka/DistDemoApp.MongoDbKafka.csproj b/test/DistEvents/DistDemoApp.MongoDbKafka/DistDemoApp.MongoDbKafka.csproj index dbb980b427..4e7aa25eb3 100644 --- a/test/DistEvents/DistDemoApp.MongoDbKafka/DistDemoApp.MongoDbKafka.csproj +++ b/test/DistEvents/DistDemoApp.MongoDbKafka/DistDemoApp.MongoDbKafka.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 DistDemoApp diff --git a/test/DistEvents/DistDemoApp.MongoDbRebus/DistDemoApp.MongoDbRebus.csproj b/test/DistEvents/DistDemoApp.MongoDbRebus/DistDemoApp.MongoDbRebus.csproj index 5698855ebb..f37868a36e 100644 --- a/test/DistEvents/DistDemoApp.MongoDbRebus/DistDemoApp.MongoDbRebus.csproj +++ b/test/DistEvents/DistDemoApp.MongoDbRebus/DistDemoApp.MongoDbRebus.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 DistDemoApp diff --git a/test/DistEvents/DistDemoApp.Shared/DistDemoApp.Shared.csproj b/test/DistEvents/DistDemoApp.Shared/DistDemoApp.Shared.csproj index f43d82dd19..7712e0ef4a 100644 --- a/test/DistEvents/DistDemoApp.Shared/DistDemoApp.Shared.csproj +++ b/test/DistEvents/DistDemoApp.Shared/DistDemoApp.Shared.csproj @@ -1,7 +1,7 @@ - net6.0 + net7.0 DistDemoApp From a97c9ad697e1cfe23279086a6c21d4a48a8099b2 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 10 Aug 2022 16:23:05 +0800 Subject: [PATCH 016/362] Update Startup.cs --- .../Volo/Abp/AspNetCore/Mvc/Startup.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Startup.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Startup.cs index e26e6ce2c3..ad4a222c33 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Startup.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Startup.cs @@ -16,10 +16,10 @@ public class Startup var hostEnvironment = services.GetHostingEnvironment(); #if DEBUG var plugDllInPath = Path.Combine(hostEnvironment.ContentRootPath, - @"..\..\..\..\..\Volo.Abp.AspNetCore.Mvc.PlugIn\bin\Debug\net6.0\"); + @"..\..\..\..\..\Volo.Abp.AspNetCore.Mvc.PlugIn\bin\Debug\net7.0\"); #else plugDllInPath = Path.Combine(_env.ContentRootPath, - @"..\..\..\..\..\Volo.Abp.AspNetCore.Mvc.PlugIn\bin\Release\net6.0\"); + @"..\..\..\..\..\Volo.Abp.AspNetCore.Mvc.PlugIn\bin\Release\net7.0\"); #endif options.PlugInSources.AddFolder(plugDllInPath); From 04a57e6c270cebdccbaed967b82d187919df1fa0 Mon Sep 17 00:00:00 2001 From: malik masis Date: Wed, 10 Aug 2022 16:57:01 +0300 Subject: [PATCH 017/362] Added a new action to find default page --- .../CmsKit/Public/Pages/IPagePublicAppService.cs | 1 + .../CmsKit/Public/Pages/PagePublicAppService.cs | 13 +++++++++++++ .../CmsKit/Public/Pages/PagesPublicController.cs | 6 ++++++ 3 files changed, 20 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs index 230b8ded97..bec4261f19 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs @@ -8,4 +8,5 @@ namespace Volo.CmsKit.Public.Pages; public interface IPagePublicAppService : IApplicationService { Task FindBySlugAsync([NotNull] string slug); + Task FindDefaultHomePageAsync(); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs index 2bae7c350f..b4b20460f6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs @@ -31,4 +31,17 @@ public class PagePublicAppService : CmsKitPublicAppServiceBase, IPagePublicAppSe pageDto.ContentFragments = await ContentParser.ParseAsync(page.Content); return pageDto; } + + public virtual async Task FindDefaultHomePageAsync() + { + var page = await PageRepository.FindByIsHomePageAsync(true); + + if (page == null) + { + return null; + } + + var pageDto = ObjectMapper.Map(page); + return pageDto; + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs index cd65f84c26..b18167ad67 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs @@ -26,4 +26,10 @@ public class PagesPublicController : CmsKitPublicControllerBase, IPagePublicAppS { return PageAppService.FindBySlugAsync(slug); } + + [HttpGet] + public Task FindDefaultHomePageAsync() + { + return PageAppService.FindDefaultHomePageAsync(); + } } From 95115cef4d501700660f1f9e5035cb55929506c4 Mon Sep 17 00:00:00 2001 From: malik masis Date: Wed, 10 Aug 2022 16:58:52 +0300 Subject: [PATCH 018/362] Added a new middleware to set the default homepage --- .../CmsKitPublicWebModule.cs | 17 +++++++---- .../DefaultHomePageMiddleware.cs | 28 +++++++++++++++++++ .../HomePageDefaultMiddlewareExtensions.cs | 11 ++++++++ 3 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/HomePageDefaultMiddlewareExtensions.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs index 88b01c8ae9..6e30c49a9c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs @@ -1,6 +1,7 @@ using Markdig; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook; using Volo.Abp.AutoMapper; @@ -88,21 +89,27 @@ public class CmsKitPublicWebModule : AbpModule options.Conventions.AddPageRoute("/Public/CmsKit/Blogs/BlogPost", @"/blogs/{blogSlug}/{blogPostSlug:minlength(1)}"); }); } - + if (GlobalFeatureManager.Instance.IsEnabled()) { Configure(options => { options.Add( - LayoutHooks.Head.Last, - typeof(GlobalStyleViewComponent) + LayoutHooks.Head.Last, + typeof(GlobalStyleViewComponent) ); options.Add( - LayoutHooks.Body.Last, - typeof(GlobalScriptViewComponent) + LayoutHooks.Body.Last, + typeof(GlobalScriptViewComponent) ); }); } } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + app.UseHomePageDefaultMiddleware(); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs new file mode 100644 index 0000000000..bb30a5276c --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs @@ -0,0 +1,28 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Volo.CmsKit.Pages; +using Volo.CmsKit.Public.Pages; + +namespace Volo.CmsKit.Public.Web; + +public class DefaultHomePageMiddleware +{ + private readonly RequestDelegate _next; + private readonly IPagePublicAppService _pagePublicAppService; + + public DefaultHomePageMiddleware(RequestDelegate next, IPagePublicAppService pagePublicAppService) + { + _next = next; + _pagePublicAppService = pagePublicAppService; + } + public async Task InvokeAsync(HttpContext httpContext) + { + var page = await _pagePublicAppService.FindDefaultHomePageAsync(); + if (page is not null && httpContext.Request.Path.Value == "/") + { + httpContext.Request.Path = $"{PageConsts.UrlPrefix}{page.Slug}"; + } + + await _next(httpContext); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/HomePageDefaultMiddlewareExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/HomePageDefaultMiddlewareExtensions.cs new file mode 100644 index 0000000000..c5a2d8516f --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/HomePageDefaultMiddlewareExtensions.cs @@ -0,0 +1,11 @@ +using Microsoft.AspNetCore.Builder; + +namespace Volo.CmsKit.Public.Web; + +public static class HomePageDefaultMiddlewareExtensions +{ + public static IApplicationBuilder UseHomePageDefaultMiddleware(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } +} From b5ded3aa6912c57d227a68c69ac5409699206697 Mon Sep 17 00:00:00 2001 From: malik masis Date: Wed, 10 Aug 2022 16:59:07 +0300 Subject: [PATCH 019/362] updated both proxies --- .../BlogPostPublicClientProxy.Generated.cs | 3 +++ .../PagesPublicClientProxy.Generated.cs | 10 ++++++++++ .../ClientProxies/cms-kit-generate-proxy.json | 15 +++++++++++++++ .../wwwroot/client-proxies/cms-kit-proxy.js | 9 ++++++++- 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs index f26816e88d..79b883aa49 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs @@ -2,8 +2,11 @@ using System; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Modeling; using Volo.Abp.DependencyInjection; using Volo.Abp.Http.Client.ClientProxying; +using Volo.CmsKit.Public.Blogs; using Volo.CmsKit.Contents; using Volo.CmsKit.Users; diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs index f992bb3dbf..2ae4e790a6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs @@ -1,7 +1,12 @@ // This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Modeling; using Volo.Abp.DependencyInjection; using Volo.Abp.Http.Client.ClientProxying; +using Volo.CmsKit.Public.Pages; using Volo.CmsKit.Contents; // ReSharper disable once CheckNamespace @@ -18,4 +23,9 @@ public partial class PagesPublicClientProxy : ClientProxyBase FindDefaultHomePageAsync() + { + return await RequestAsync(nameof(FindDefaultHomePageAsync)); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json index e3b3802ee9..2892c636e3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json @@ -553,6 +553,21 @@ }, "allowAnonymous": null, "implementFrom": "Volo.CmsKit.Public.Pages.IPagePublicAppService" + }, + "FindDefaultHomePageAsync": { + "uniqueName": "FindDefaultHomePageAsync", + "name": "FindDefaultHomePageAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/pages", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.CmsKit.Contents.PageDto", + "typeSimple": "Volo.CmsKit.Contents.PageDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Pages.IPagePublicAppService" } } }, diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js index e1cdae5ec3..ec98417af5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js @@ -95,6 +95,13 @@ }, ajaxParams)); }; + volo.cmsKit.public.pages.pagesPublic.findDefaultHomePage = function(ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-public/pages', + type: 'GET' + }, ajaxParams)); + }; + })(); // controller volo.cmsKit.public.menus.menuItemPublic @@ -188,7 +195,7 @@ volo.cmsKit.public.blogs.blogPostPublic.getList = function(blogSlug, input, ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-public/blog-posts/' + blogSlug + '' + abp.utils.buildQueryString([{ name: 'authorId', value: input.authorId }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '', + url: abp.appPath + 'api/cms-kit-public/blog-posts/' + blogSlug + '' + abp.utils.buildQueryString([{ name: 'authorId', value: input.authorId }, { name: 'tagId', value: input.tagId }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '', type: 'GET' }, ajaxParams)); }; From 567936d259dfd1e8695216ddd455f621bb3a8fbf Mon Sep 17 00:00:00 2001 From: malik masis Date: Wed, 10 Aug 2022 17:47:17 +0300 Subject: [PATCH 020/362] Cached homepage action for better performance --- .../Public/Pages/PagePublicAppService.cs | 26 ++++++++++++++----- .../CmsKitPublicWebModule.cs | 6 +++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs index b4b20460f6..99bf3b4cae 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs @@ -1,4 +1,7 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Distributed; +using Volo.Abp.Caching; using Volo.Abp.GlobalFeatures; using Volo.CmsKit.Contents; using Volo.CmsKit.GlobalFeatures; @@ -11,11 +14,13 @@ public class PagePublicAppService : CmsKitPublicAppServiceBase, IPagePublicAppSe { protected IPageRepository PageRepository { get; } protected ContentParser ContentParser { get; } + private readonly IDistributedCache _cache; - public PagePublicAppService(IPageRepository pageRepository, ContentParser contentParser) + public PagePublicAppService(IPageRepository pageRepository, ContentParser contentParser, IDistributedCache cache) { PageRepository = pageRepository; ContentParser = contentParser; + _cache = cache; } public virtual async Task FindBySlugAsync(string slug) @@ -34,14 +39,21 @@ public class PagePublicAppService : CmsKitPublicAppServiceBase, IPagePublicAppSe public virtual async Task FindDefaultHomePageAsync() { - var page = await PageRepository.FindByIsHomePageAsync(true); - - if (page == null) + var pageDto = await _cache.GetAsync("DefaultHomePage"); + if (pageDto is null) { - return null; + var page = await PageRepository.FindByIsHomePageAsync(true); + if (page is null) + { + return null; + } + + pageDto = ObjectMapper.Map(page); + + await _cache.SetAsync("DefaultHomePage", pageDto, + new DistributedCacheEntryOptions { AbsoluteExpiration = DateTimeOffset.Now.AddHours(1) }); } - var pageDto = ObjectMapper.Map(page); return pageDto; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs index 6e30c49a9c..6e679e1c82 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs @@ -5,6 +5,7 @@ using Volo.Abp; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook; using Volo.Abp.AutoMapper; +using Volo.Abp.Caching; using Volo.Abp.GlobalFeatures; using Volo.Abp.Http.ProxyScripting.Generators.JQuery; using Volo.Abp.Modularity; @@ -76,6 +77,11 @@ public class CmsKitPublicWebModule : AbpModule { options.DisableModule(CmsKitPublicRemoteServiceConsts.ModuleName); }); + + Configure(options => + { + options.KeyPrefix = "CmsKit:"; + }); } public override void PostConfigureServices(ServiceConfigurationContext context) From 035c66403c7b08921281b49d01a3d48bc7fd6b60 Mon Sep 17 00:00:00 2001 From: malik masis Date: Wed, 10 Aug 2022 18:37:58 +0300 Subject: [PATCH 021/362] Added the removing home page feature --- .../CmsKit/Admin/Pages/PageAdminAppService.cs | 11 ++++++++--- .../Pages/CmsKit/Pages/index.js | 19 ++++++++----------- .../CmsKit/Localization/Resources/en.json | 4 ++-- .../CmsKit/Localization/Resources/tr.json | 6 +++--- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs index c6c7b614b3..ea89ced70d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs @@ -87,10 +87,15 @@ public class PageAdminAppService : CmsKitAdminAppServiceBase, IPageAdminAppServi [Authorize(CmsKitAdminPermissions.Pages.SetAsHomePage)] public virtual async Task SetAsHomePageAsync(Guid id) { - await PageManager.SetHomePageAsFalseAsync(true); - var page = await PageRepository.GetAsync(id); - page.IsHomePage = true; + if (!page.IsHomePage) + { + await PageManager.SetHomePageAsFalseAsync(true); + page = await PageRepository.GetAsync(id); + } + + page.IsHomePage = !page.IsHomePage; ; + await PageRepository.UpdateAsync(page); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js index 4d3d5ba765..730c9b6b30 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js @@ -51,18 +51,15 @@ $(function () { text: l('SetAsHomePage'), visible: abp.auth.isGranted('CmsKit.Pages.SetAsHomePage'), action: function (data) { - if (data.record.isHomePage === false) { - pagesService - .setAsHomePage(data.record.id) - .then(function () { + pagesService + .setAsHomePage(data.record.id) + .then(function () { - _dataTable.ajax.reload(); - abp.notify.success(l('CompletedSettingAsHomePage')); - }); - } - else { - abp.notify.warn(l('AlreadyHomePage')); - } + _dataTable.ajax.reload(); + data.record.isHomePage ? + abp.notify.warn(l('RemovedSettingAsHomePage')) + : abp.notify.success(l('CompletedSettingAsHomePage')); + }); } } ] diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 983023321a..4870abe237 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -189,9 +189,9 @@ "SelectAnAuthor": "Select an Author", "InThisDocument": "In This Document", "GoToTop": "Go To Top", - "SetAsHomePage": "Set As Home Page", + "SetAsHomePage": "Change Home Page Status", "CompletedSettingAsHomePage": "Set as home page", "IsHomePage": "Is Home Page", - "AlreadyHomePage": "Already set as home page" + "RemovedSettingAsHomePage": "Removed setting the home page" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index bf02b689ce..70763aad47 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -190,9 +190,9 @@ "Add": "Ekle", "AddWidget": "Widget Ekle", "PleaseConfigureWidgets": "Lütfen widget'leri yapılandırın", - "SetAsHomePage": "Ana sayfa Olarak Ayarla", - "CompletedSettingAsHomePage": "Ana sayfa olarak ayarlandı", + "SetAsHomePage": "Ana sayfa Durumunu Değiştir", + "CompletedSettingAsHomePage": "Ana Sayfa olarak ayarlandı", "IsHomePage": "Ana Sayfa Mı", - "AlreadyHomePage": "Önceden ana sayfa olarak ayarlı" + "RemovedSettingAsHomePage": "Ana sayfa ayarı kaldırıldı" } } From 149e5c603b5ae5d5842a774334b32e6096ac5293 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 12 Aug 2022 15:23:47 +0800 Subject: [PATCH 022/362] Update Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj --- .../Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj index 9e8b8951e3..83ac5bc666 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.NewtonsoftJson Volo.Abp.AspNetCore.Mvc.NewtonsoftJson From 2875cae136e7ad30c552f819a633eb740503ab6d Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 12 Aug 2022 17:45:04 +0800 Subject: [PATCH 023/362] Update some package to `MicrosoftPackageVersion`. --- .../Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj | 2 +- .../Volo.Abp.Caching.StackExchangeRedis.csproj | 2 +- framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj | 2 +- framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj | 2 +- framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj | 6 +++--- .../Volo.Abp.ExceptionHandling.csproj | 2 +- .../Volo.Abp.VirtualFileSystem.csproj | 2 +- framework/test/SimpleConsoleDemo/SimpleConsoleDemo.csproj | 2 +- .../Volo.Abp.BlobStoring.Aliyun.Tests.csproj | 2 +- .../Volo.Abp.Sms.Aliyun.Tests.csproj | 2 +- .../Volo.Abp.VirtualFileSystem.Tests.csproj | 2 +- .../Volo.Abp.Account.Application.Contracts.csproj | 2 +- .../Volo.Abp.Account.Application.csproj | 2 +- .../Volo.Abp.Account.Web.IdentityServer.csproj | 2 +- .../Volo.Abp.Account.Web.OpenIddict.csproj | 2 +- .../src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj | 2 +- .../Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj | 2 +- .../Volo.Blogging.Domain.Shared.csproj | 2 +- .../blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj | 2 +- .../src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj | 2 +- .../Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj | 2 +- .../Volo.CmsKit.Domain.Shared.csproj | 2 +- .../Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj | 2 +- modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.csproj | 2 +- .../Volo.Docs.Admin.Application.Contracts.csproj | 2 +- .../docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj | 2 +- modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj | 2 +- modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj | 2 +- .../Volo.Abp.FeatureManagement.Domain.Shared.csproj | 2 +- .../Volo.Abp.FeatureManagement.Web.csproj | 2 +- .../Volo.Abp.Identity.Domain.Shared.csproj | 2 +- .../src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj | 2 +- .../Volo.Abp.Identity.Domain.Tests.csproj | 2 +- .../Volo.Abp.OpenIddict.Domain.Shared.csproj | 2 +- .../Volo.Abp.PermissionManagement.Domain.Shared.csproj | 2 +- .../Volo.Abp.PermissionManagement.Web.csproj | 2 +- .../Volo.Abp.SettingManagement.Domain.Shared.csproj | 2 +- .../Volo.Abp.SettingManagement.Web.csproj | 2 +- .../Volo.Abp.TenantManagement.Domain.Shared.csproj | 2 +- .../Volo.Abp.TenantManagement.Web.csproj | 2 +- .../Volo.Abp.VirtualFileExplorer.Web.csproj | 2 +- .../MyCompanyName.MyProjectName.Domain.Shared.csproj | 2 +- .../AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj | 2 +- .../AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj | 4 ++-- .../DistEvents/DistDemoApp.Shared/DistDemoApp.Shared.csproj | 2 +- 45 files changed, 48 insertions(+), 48 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj index 2ccb77a253..cad3da097a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj @@ -26,7 +26,7 @@ - + diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj index 2e36b1cef0..d1faed8f5c 100644 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj @@ -19,7 +19,7 @@ - + diff --git a/framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj b/framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj index 62aebd1056..4022d38fee 100644 --- a/framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj +++ b/framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj index 1781a23468..65a67b86bc 100644 --- a/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj +++ b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj @@ -18,7 +18,7 @@ - + diff --git a/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj b/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj index 4e79126174..e208ecf533 100644 --- a/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj +++ b/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj @@ -15,10 +15,10 @@ - + - - + + diff --git a/framework/src/Volo.Abp.ExceptionHandling/Volo.Abp.ExceptionHandling.csproj b/framework/src/Volo.Abp.ExceptionHandling/Volo.Abp.ExceptionHandling.csproj index cc55a077c4..b1d60e60c7 100644 --- a/framework/src/Volo.Abp.ExceptionHandling/Volo.Abp.ExceptionHandling.csproj +++ b/framework/src/Volo.Abp.ExceptionHandling/Volo.Abp.ExceptionHandling.csproj @@ -19,7 +19,7 @@ - + diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj b/framework/src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj index adba125cd3..64425620dc 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj @@ -17,7 +17,7 @@ - + diff --git a/framework/test/SimpleConsoleDemo/SimpleConsoleDemo.csproj b/framework/test/SimpleConsoleDemo/SimpleConsoleDemo.csproj index 5aca466d38..6863fb0242 100644 --- a/framework/test/SimpleConsoleDemo/SimpleConsoleDemo.csproj +++ b/framework/test/SimpleConsoleDemo/SimpleConsoleDemo.csproj @@ -18,7 +18,7 @@ - + diff --git a/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj index a2c31d4791..00d58302bd 100644 --- a/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/framework/test/Volo.Abp.Sms.Aliyun.Tests/Volo.Abp.Sms.Aliyun.Tests.csproj b/framework/test/Volo.Abp.Sms.Aliyun.Tests/Volo.Abp.Sms.Aliyun.Tests.csproj index 68f49b10b1..f43cebafaf 100644 --- a/framework/test/Volo.Abp.Sms.Aliyun.Tests/Volo.Abp.Sms.Aliyun.Tests.csproj +++ b/framework/test/Volo.Abp.Sms.Aliyun.Tests/Volo.Abp.Sms.Aliyun.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj index fc07aebd46..2d845fd6cc 100644 --- a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj +++ b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj @@ -16,7 +16,7 @@ - + diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.csproj b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.csproj index 4b5029d234..d6b87b957d 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.csproj +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.csproj @@ -21,7 +21,7 @@ - + diff --git a/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj b/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj index 69e0f258a7..812ea46e23 100644 --- a/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj +++ b/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj @@ -25,7 +25,7 @@ - + diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj index bd52bfd5f9..2e2b28fcc6 100644 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj @@ -38,7 +38,7 @@ - + diff --git a/modules/account/src/Volo.Abp.Account.Web.OpenIddict/Volo.Abp.Account.Web.OpenIddict.csproj b/modules/account/src/Volo.Abp.Account.Web.OpenIddict/Volo.Abp.Account.Web.OpenIddict.csproj index a88df575e1..6fa9812461 100644 --- a/modules/account/src/Volo.Abp.Account.Web.OpenIddict/Volo.Abp.Account.Web.OpenIddict.csproj +++ b/modules/account/src/Volo.Abp.Account.Web.OpenIddict/Volo.Abp.Account.Web.OpenIddict.csproj @@ -28,7 +28,7 @@ - + diff --git a/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj b/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj index b9e85e2c7f..0a19b8e1a0 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj +++ b/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj @@ -44,7 +44,7 @@ - + diff --git a/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj b/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj index a6754b1dfe..6afb71c7e9 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj +++ b/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj @@ -24,7 +24,7 @@ - + diff --git a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.csproj b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.csproj index 96c14f8da0..c56b888d38 100644 --- a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.csproj +++ b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.csproj @@ -21,7 +21,7 @@ - + diff --git a/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj b/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj index 4077e7cad8..0ba240d8c2 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj +++ b/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj @@ -24,7 +24,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj index 58aa5ac95d..03a1542d46 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj @@ -18,7 +18,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj index b47c66f5c7..8e86d9eee4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj @@ -19,7 +19,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj index 22160272fd..107aa14452 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj @@ -12,7 +12,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj index e126b222b0..da794f2eac 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj @@ -15,7 +15,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.csproj index e8aa365b66..ea7e47859b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.csproj @@ -19,7 +19,7 @@ - + diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo.Docs.Admin.Application.Contracts.csproj b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo.Docs.Admin.Application.Contracts.csproj index 781dc024c5..e7f372dfc6 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo.Docs.Admin.Application.Contracts.csproj +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo.Docs.Admin.Application.Contracts.csproj @@ -23,7 +23,7 @@ - + diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj b/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj index 7ca9847f71..0e184f85ce 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj +++ b/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj @@ -27,7 +27,7 @@ - + diff --git a/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj b/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj index d8548c9bbc..29020e50bc 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj +++ b/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj @@ -20,7 +20,7 @@ - + diff --git a/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj b/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj index afb85eee10..24085924a7 100644 --- a/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj +++ b/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj @@ -23,7 +23,7 @@ - + diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj index 20e31fe161..8b1796e8fb 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj @@ -15,7 +15,7 @@ - + diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj index b460935d48..4c72508f43 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj @@ -28,7 +28,7 @@ - + diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.csproj b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.csproj index fd461ebe66..ddd23ab870 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.csproj @@ -27,7 +27,7 @@ - + diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj b/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj index 8ffd329591..e9b57c9b01 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj @@ -45,7 +45,7 @@ - + diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.csproj b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.csproj index 0f1ec0b5f7..efec94a7ea 100644 --- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.csproj +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.csproj @@ -19,7 +19,7 @@ - + diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo.Abp.OpenIddict.Domain.Shared.csproj b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo.Abp.OpenIddict.Domain.Shared.csproj index 34a4d6c334..2644d555f4 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo.Abp.OpenIddict.Domain.Shared.csproj +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo.Abp.OpenIddict.Domain.Shared.csproj @@ -15,7 +15,7 @@ - + diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.csproj index c44c0b326f..70c8b26f2d 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.csproj @@ -25,7 +25,7 @@ - + diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.csproj index d289598e8b..1fb94a5eae 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.csproj @@ -35,7 +35,7 @@ - + diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.csproj index f6c3e0a102..38991408d5 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.csproj @@ -21,7 +21,7 @@ - + diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj index 9307cfa02e..f4f03b3706 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj @@ -23,7 +23,7 @@ - + diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.csproj index 7aa53a7476..effe1e51f4 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.csproj @@ -25,7 +25,7 @@ - + diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj index 7e211e504c..baa3cdb03c 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj @@ -39,7 +39,7 @@ - + diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj index 32ae96fa5b..4558a035fc 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj @@ -34,7 +34,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index 112c33a01e..a8cfeb8d94 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -25,7 +25,7 @@ - + diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj b/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj index c9bf97f998..36469eae3e 100644 --- a/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj @@ -8,7 +8,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj index 181b8c098d..9b603886c8 100644 --- a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj @@ -5,11 +5,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/test/DistEvents/DistDemoApp.Shared/DistDemoApp.Shared.csproj b/test/DistEvents/DistDemoApp.Shared/DistDemoApp.Shared.csproj index 7712e0ef4a..ff46489662 100644 --- a/test/DistEvents/DistDemoApp.Shared/DistDemoApp.Shared.csproj +++ b/test/DistEvents/DistDemoApp.Shared/DistDemoApp.Shared.csproj @@ -7,7 +7,7 @@ - + From 1e9c0871a3dfb53a553e72c38d24ed6d9b23394a Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 16 Aug 2022 16:21:17 +0800 Subject: [PATCH 024/362] Introduce `IncludeNonPublicPropertiesModifiers`. --- .../AbpMvcNewtonsoftJsonOptionsSetup.cs | 16 ++++- .../Mvc/Json/AbpJsonOptionsSetup.cs | 3 + .../Mvc/Json/AbpSystemTextJsonFormatter.cs | 11 ++-- ...CamelCasePropertyNamesContractResolver.cs} | 19 ++++-- .../AbpNewtonsoftJsonSerializerProvider.cs | 59 ++++++++--------- .../Volo.Abp.Json.SystemTextJson.csproj | 1 + .../AbpDefaultJsonTypeInfoResolver.cs | 16 +++++ ...ystemTextJsonSerializerModifiersOptions.cs | 21 ++++++ ...AbpSystemTextJsonSerializerOptionsSetup.cs | 2 + .../AbpSystemTextJsonSerializerProvider.cs | 9 +-- ...AbpSystemTextJsonUnsupportedTypeMatcher.cs | 21 ------ .../IncludeNonPublicPropertiesModifiers.cs | 37 +++++++++++ .../Abp/ObjectExtending/ExtensibleObject.cs | 2 - ...temTextJsonUnsupportedTypeMatcher_Tests.cs | 65 ------------------- .../Json/ExtensibleObjectModifiers_Tests.cs | 19 ++++++ 15 files changed, 161 insertions(+), 140 deletions(-) rename framework/src/{Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonContractResolver.cs => Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpCamelCasePropertyNamesContractResolver.cs} (65%) create mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpDefaultJsonTypeInfoResolver.cs create mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptions.cs delete mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonUnsupportedTypeMatcher.cs create mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeNonPublicPropertiesModifiers.cs delete mode 100644 framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpSystemTextJsonUnsupportedTypeMatcher_Tests.cs create mode 100644 framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ExtensibleObjectModifiers_Tests.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpMvcNewtonsoftJsonOptionsSetup.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpMvcNewtonsoftJsonOptionsSetup.cs index 1d1dc6a373..ab7eaf2244 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpMvcNewtonsoftJsonOptionsSetup.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpMvcNewtonsoftJsonOptionsSetup.cs @@ -1,21 +1,31 @@ using System; +using System.Collections.Generic; +using System.Linq; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using Volo.Abp.Json.Newtonsoft; namespace Volo.Abp.AspNetCore.Mvc.NewtonsoftJson; public class AbpMvcNewtonsoftJsonOptionsSetup : IConfigureOptions { - protected IServiceProvider ServiceProvider { get; } + private readonly IServiceProvider _serviceProvider; public AbpMvcNewtonsoftJsonOptionsSetup(IServiceProvider serviceProvider) { - ServiceProvider = serviceProvider; + _serviceProvider = serviceProvider; } public void Configure(MvcNewtonsoftJsonOptions options) { - options.SerializerSettings.ContractResolver = ServiceProvider.GetRequiredService(); + options.SerializerSettings.ContractResolver = _serviceProvider.GetRequiredService(); + + var converters = _serviceProvider.GetRequiredService>().Value + .Converters.Select(converterType => _serviceProvider.GetRequiredService(converterType).As()) + .ToList(); + + options.SerializerSettings.Converters.InsertRange(0, converters); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs index 116adca4e8..650d3890c1 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs @@ -4,6 +4,7 @@ using System.Text.Json.Serialization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using Volo.Abp.Json.SystemTextJson; using Volo.Abp.Json.SystemTextJson.JsonConverters; namespace Volo.Abp.AspNetCore.Mvc.Json; @@ -29,5 +30,7 @@ public class AbpJsonOptionsSetup : IConfigureOptions options.JsonSerializerOptions.Converters.Add(new AbpStringToBooleanConverter()); options.JsonSerializerOptions.Converters.Add(new ObjectToInferredTypesConverter()); + + options.JsonSerializerOptions.TypeInfoResolver = new AbpDefaultJsonTypeInfoResolver(ServiceProvider.GetRequiredService>()); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpSystemTextJsonFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpSystemTextJsonFormatter.cs index e680d54fa5..fb8c509748 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpSystemTextJsonFormatter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpSystemTextJsonFormatter.cs @@ -13,22 +13,23 @@ namespace Volo.Abp.AspNetCore.Mvc.Json; public class AbpSystemTextJsonFormatter : IAbpHybridJsonInputFormatter, IAbpHybridJsonOutputFormatter, ITransientDependency { - private readonly AbpSystemTextJsonUnsupportedTypeMatcher _unsupportedTypeMatcher; private readonly IOptions _jsonOptions; + private readonly IOptions _systemTextJsonSerializerOptions; private readonly ILoggerFactory _loggerFactory; - public AbpSystemTextJsonFormatter(AbpSystemTextJsonUnsupportedTypeMatcher unsupportedTypeMatcher, + public AbpSystemTextJsonFormatter( IOptions jsonOptions, + IOptions systemTextJsonSerializerOptions, ILoggerFactory loggerFactory) { - _unsupportedTypeMatcher = unsupportedTypeMatcher; _jsonOptions = jsonOptions; + _systemTextJsonSerializerOptions = systemTextJsonSerializerOptions; _loggerFactory = loggerFactory; } Task IAbpHybridJsonInputFormatter.CanHandleAsync(Type type) { - return Task.FromResult(!_unsupportedTypeMatcher.Match(type)); + return Task.FromResult(!_systemTextJsonSerializerOptions.Value.UnsupportedTypes.Contains(type)); } public virtual Task GetTextInputFormatterAsync() @@ -40,7 +41,7 @@ public class AbpSystemTextJsonFormatter : IAbpHybridJsonInputFormatter, IAbpHybr Task IAbpHybridJsonOutputFormatter.CanHandleAsync(Type type) { - return Task.FromResult(!_unsupportedTypeMatcher.Match(type)); + return Task.FromResult(!_systemTextJsonSerializerOptions.Value.UnsupportedTypes.Contains(type)); } public Task GetTextOutputFormatterAsync() diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonContractResolver.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpCamelCasePropertyNamesContractResolver.cs similarity index 65% rename from framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonContractResolver.cs rename to framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpCamelCasePropertyNamesContractResolver.cs index f33c9abbd4..502265db84 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonContractResolver.cs +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpCamelCasePropertyNamesContractResolver.cs @@ -4,17 +4,16 @@ using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using Volo.Abp.DependencyInjection; -using Volo.Abp.Json.Newtonsoft; using Volo.Abp.Reflection; using Volo.Abp.Timing; -namespace Volo.Abp.AspNetCore.Mvc.NewtonsoftJson; +namespace Volo.Abp.Json.Newtonsoft; -public class AbpNewtonsoftJsonContractResolver : DefaultContractResolver, ITransientDependency +public class AbpCamelCasePropertyNamesContractResolver : CamelCasePropertyNamesContractResolver, ITransientDependency { private readonly Lazy _dateTimeConverter; - public AbpNewtonsoftJsonContractResolver(IServiceProvider serviceProvider) + public AbpCamelCasePropertyNamesContractResolver(IServiceProvider serviceProvider) { _dateTimeConverter = new Lazy( serviceProvider.GetRequiredService, @@ -35,7 +34,8 @@ public class AbpNewtonsoftJsonContractResolver : DefaultContractResolver, ITrans protected virtual void ModifyProperty(MemberInfo member, JsonProperty property) { - if (property.PropertyType != typeof(DateTime) && property.PropertyType != typeof(DateTime?)) + if (property.PropertyType != typeof(DateTime) && + property.PropertyType != typeof(DateTime?)) { return; } @@ -45,4 +45,13 @@ public class AbpNewtonsoftJsonContractResolver : DefaultContractResolver, ITrans property.Converter = _dateTimeConverter.Value; } } + + protected override JsonDictionaryContract CreateDictionaryContract(Type objectType) + { + var contract = base.CreateDictionaryContract(objectType); + + contract.DictionaryKeyResolver = propertyName => propertyName; + + return contract; + } } diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs index 14ae0556f3..01c7c1be14 100644 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs @@ -1,25 +1,23 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; using Volo.Abp.DependencyInjection; - namespace Volo.Abp.Json.Newtonsoft; public class AbpNewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ITransientDependency { - private static readonly CamelCaseExceptDictionaryKeysResolver SharedCamelCaseExceptDictionaryKeysResolver = - new CamelCaseExceptDictionaryKeysResolver(); - + protected IServiceProvider ServiceProvider{ get; } protected List Converters { get; } public AbpNewtonsoftJsonSerializerProvider( - IOptions options, - IServiceProvider serviceProvider) + IServiceProvider serviceProvider, + IOptions options) { + ServiceProvider = serviceProvider; Converters = options.Value .Converters .Select(c => (JsonConverter)serviceProvider.GetRequiredService(c)) @@ -33,47 +31,44 @@ public class AbpNewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ITra public string Serialize(object obj, bool camelCase = true, bool indented = false) { - return JsonConvert.SerializeObject(obj, CreateSerializerSettings(camelCase, indented)); + return JsonConvert.SerializeObject(obj, CreateJsonSerializerOptions(camelCase, indented)); } public T Deserialize(string jsonString, bool camelCase = true) { - return JsonConvert.DeserializeObject(jsonString, CreateSerializerSettings(camelCase)); + return JsonConvert.DeserializeObject(jsonString, CreateJsonSerializerOptions(camelCase)); } public object Deserialize(Type type, string jsonString, bool camelCase = true) { - return JsonConvert.DeserializeObject(jsonString, type, CreateSerializerSettings(camelCase)); + return JsonConvert.DeserializeObject(jsonString, type, CreateJsonSerializerOptions(camelCase)); } - protected virtual JsonSerializerSettings CreateSerializerSettings(bool camelCase = true, bool indented = false) - { - var settings = new JsonSerializerSettings(); + private readonly static ConcurrentDictionary JsonSerializerOptionsCache = new ConcurrentDictionary(); - settings.Converters.InsertRange(0, Converters); - - if (camelCase) + protected virtual JsonSerializerSettings CreateJsonSerializerOptions(bool camelCase = true, bool indented = false) + { + return JsonSerializerOptionsCache.GetOrAdd(new { - settings.ContractResolver = SharedCamelCaseExceptDictionaryKeysResolver; - } - - if (indented) + camelCase, + indented + }, _ => { - settings.Formatting = Formatting.Indented; - } + var settings = new JsonSerializerSettings(); - return settings; - } + settings.Converters.InsertRange(0, Converters); - private class CamelCaseExceptDictionaryKeysResolver : CamelCasePropertyNamesContractResolver - { - protected override JsonDictionaryContract CreateDictionaryContract(Type objectType) - { - var contract = base.CreateDictionaryContract(objectType); + if (camelCase) + { + settings.ContractResolver = ServiceProvider.GetRequiredService(); + } - contract.DictionaryKeyResolver = propertyName => propertyName; + if (indented) + { + settings.Formatting = Formatting.Indented; + } - return contract; - } + return settings; + }); } } diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj b/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj index c9aa014c82..5402dd3c37 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj @@ -17,6 +17,7 @@ + diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpDefaultJsonTypeInfoResolver.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpDefaultJsonTypeInfoResolver.cs new file mode 100644 index 0000000000..385544dc0b --- /dev/null +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpDefaultJsonTypeInfoResolver.cs @@ -0,0 +1,16 @@ +using System.Text.Json.Serialization.Metadata; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Json.SystemTextJson; + +public class AbpDefaultJsonTypeInfoResolver : DefaultJsonTypeInfoResolver, ITransientDependency +{ + public AbpDefaultJsonTypeInfoResolver(IOptions options) + { + foreach (var modifier in options.Value.Modifiers) + { + Modifiers.Add(modifier); + } + } +} diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptions.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptions.cs new file mode 100644 index 0000000000..4f4f8d1bac --- /dev/null +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptions.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text.Json.Serialization.Metadata; +using Volo.Abp.Data; +using Volo.Abp.Json.SystemTextJson.Modifiers; +using Volo.Abp.ObjectExtending; + +namespace Volo.Abp.Json.SystemTextJson; + +public class AbpSystemTextJsonSerializerModifiersOptions +{ + public List> Modifiers { get; } + + public AbpSystemTextJsonSerializerModifiersOptions() + { + Modifiers = new List> + { + new IncludeNonPublicPropertiesModifiers().CreateModifyAction("ExtraProperties") + }; + } +} diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs index 1615581a9d..a5806b28be 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs @@ -28,5 +28,7 @@ public class AbpSystemTextJsonSerializerOptionsSetup : IConfigureOptions>()); } } diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs index 802dd3f528..43aad3383d 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs @@ -10,19 +10,14 @@ public class AbpSystemTextJsonSerializerProvider : IJsonSerializerProvider, ITra { protected AbpSystemTextJsonSerializerOptions Options { get; } - protected AbpSystemTextJsonUnsupportedTypeMatcher AbpSystemTextJsonUnsupportedTypeMatcher { get; } - - public AbpSystemTextJsonSerializerProvider( - IOptions options, - AbpSystemTextJsonUnsupportedTypeMatcher abpSystemTextJsonUnsupportedTypeMatcher) + public AbpSystemTextJsonSerializerProvider(IOptions options) { - AbpSystemTextJsonUnsupportedTypeMatcher = abpSystemTextJsonUnsupportedTypeMatcher; Options = options.Value; } public bool CanHandle(Type type) { - return !AbpSystemTextJsonUnsupportedTypeMatcher.Match(type); + return !Options.UnsupportedTypes.Contains(type); } public string Serialize(object obj, bool camelCase = true, bool indented = false) diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonUnsupportedTypeMatcher.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonUnsupportedTypeMatcher.cs deleted file mode 100644 index eecc20c555..0000000000 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonUnsupportedTypeMatcher.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using JetBrains.Annotations; -using Microsoft.Extensions.Options; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Json.SystemTextJson; - -public class AbpSystemTextJsonUnsupportedTypeMatcher : ITransientDependency -{ - protected AbpSystemTextJsonSerializerOptions Options { get; } - - public AbpSystemTextJsonUnsupportedTypeMatcher(IOptions options) - { - Options = options.Value; - } - - public virtual bool Match([CanBeNull] Type type) - { - return Options.UnsupportedTypes.Contains(type); - } -} diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeNonPublicPropertiesModifiers.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeNonPublicPropertiesModifiers.cs new file mode 100644 index 0000000000..fcca1d672c --- /dev/null +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeNonPublicPropertiesModifiers.cs @@ -0,0 +1,37 @@ +using System; +using System.Linq; +using System.Text.Json.Serialization.Metadata; + +namespace Volo.Abp.Json.SystemTextJson.Modifiers; + +public class IncludeNonPublicPropertiesModifiers + where TClass : class +{ + private string _propertyName; + + public Action CreateModifyAction(string propertyName) + { + _propertyName = propertyName; + return Modify; + } + + public void Modify(JsonTypeInfo jsonTypeInfo) + { + if (jsonTypeInfo.Type == typeof(TClass)) + { + var propertyJsonInfo = jsonTypeInfo.Properties.FirstOrDefault(x => x.Name.Equals(_propertyName, StringComparison.OrdinalIgnoreCase) && x.Set == null); + if (propertyJsonInfo != null) + { + var propertyInfo = typeof(TClass).GetProperty(_propertyName); + if (propertyInfo != null) + { + var jsonPropertyInfo = jsonTypeInfo.CreateJsonPropertyInfo(typeof(TProperty), propertyJsonInfo.Name); + jsonPropertyInfo.Get = propertyInfo.GetValue; + jsonPropertyInfo.Set = propertyInfo.SetValue; + jsonTypeInfo.Properties.Remove(propertyJsonInfo); + jsonTypeInfo.Properties.Add(jsonPropertyInfo); + } + } + } + } +} diff --git a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ExtensibleObject.cs b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ExtensibleObject.cs index 4479eeb648..611176b570 100644 --- a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ExtensibleObject.cs +++ b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ExtensibleObject.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using System.Text.Json.Serialization; using Volo.Abp.Data; using Volo.Abp.DynamicProxy; @@ -10,7 +9,6 @@ namespace Volo.Abp.ObjectExtending; [Serializable] public class ExtensibleObject : IHasExtraProperties, IValidatableObject { - [JsonInclude] public ExtraPropertyDictionary ExtraProperties { get; protected set; } public ExtensibleObject() diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpSystemTextJsonUnsupportedTypeMatcher_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpSystemTextJsonUnsupportedTypeMatcher_Tests.cs deleted file mode 100644 index 1c621f3930..0000000000 --- a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpSystemTextJsonUnsupportedTypeMatcher_Tests.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.Extensions.DependencyInjection; -using Shouldly; -using Volo.Abp.Json.SystemTextJson; -using Xunit; - -namespace Volo.Abp.Json; - -public class AbpSystemTextJsonUnsupportedTypeMatcher_Tests : AbpJsonTestBase -{ - private readonly AbpSystemTextJsonUnsupportedTypeMatcher _abpSystemTextJsonUnsupportedTypeMatcher; - - public AbpSystemTextJsonUnsupportedTypeMatcher_Tests() - { - _abpSystemTextJsonUnsupportedTypeMatcher = GetRequiredService(); - } - - protected override void AfterAddApplication(IServiceCollection services) - { - services.Configure(options => - { - options.UnsupportedTypes.Add(); - options.UnsupportedTypes.Add(); - options.UnsupportedTypes.Add>(); - }); - } - - [Fact] - public void Match_Test() - { - _abpSystemTextJsonUnsupportedTypeMatcher.Match(typeof(MyClass)).ShouldBeTrue(); - _abpSystemTextJsonUnsupportedTypeMatcher.Match(typeof(byte[])).ShouldBeTrue(); - - _abpSystemTextJsonUnsupportedTypeMatcher.Match(typeof(MyClass2)).ShouldBeFalse(); - _abpSystemTextJsonUnsupportedTypeMatcher.Match(typeof(MyClass3)).ShouldBeFalse(); - _abpSystemTextJsonUnsupportedTypeMatcher.Match(typeof(MyClass4)).ShouldBeFalse(); - - _abpSystemTextJsonUnsupportedTypeMatcher.Match(typeof(string)).ShouldBeFalse(); - _abpSystemTextJsonUnsupportedTypeMatcher.Match(typeof(string[])).ShouldBeFalse(); - - _abpSystemTextJsonUnsupportedTypeMatcher.Match(typeof(Dictionary)).ShouldBeTrue(); - _abpSystemTextJsonUnsupportedTypeMatcher.Match(typeof(IDictionary)).ShouldBeFalse(); - } - - class MyClass - { - public DateTime Prop1 { get; set; } - } - - class MyClass2 - { - public DateTime Prop1 { get; set; } - } - - class MyClass3 - { - public MyClass4 Prop1 { get; set; } - } - - class MyClass4 - { - public DateTime Prop1 { get; set; } - } -} diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ExtensibleObjectModifiers_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ExtensibleObjectModifiers_Tests.cs new file mode 100644 index 0000000000..617301bd6c --- /dev/null +++ b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ExtensibleObjectModifiers_Tests.cs @@ -0,0 +1,19 @@ +using Shouldly; +using Volo.Abp.Json.SystemTextJson; +using Volo.Abp.ObjectExtending; +using Xunit; + +namespace Volo.Abp.Json; + +public class ExtensibleObjectModifiers_Tests : AbpJsonTestBase +{ + [Fact] + public void Should_Modify_Object() + { + var jsonSerializer = GetRequiredService(); + + var extensibleObject = jsonSerializer.Deserialize("{\"ExtraProperties\": {\"Test-Key\":\"Test-Value\"}}"); + + extensibleObject.ExtraProperties.ShouldContainKeyAndValue("Test-Key", "Test-Value"); + } +} From c59d75be61b69c3122311a7dc65bb5bbb427c28b Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 17 Aug 2022 11:14:14 +0800 Subject: [PATCH 025/362] Fix unit tests. --- .../Mvc/Json/AbpJsonOptionsSetup.cs | 3 -- .../Newtonsoft/AbpJsonIsoDateTimeConverter.cs | 7 +--- .../Newtonsoft/AbpJsonNewtonsoftModule.cs | 5 --- .../AbpJsonSystemTextJsonModule.cs | 1 + ...ystemTextJsonSerializerModifiersOptions.cs | 5 +-- ...TextJsonSerializerModifiersOptionsSetup.cs | 20 ++++++++++ ...AbpSystemTextJsonSerializerOptionsSetup.cs | 3 -- .../Modifiers/AbpDateTimeConverterModifier.cs | 39 +++++++++++++++++++ .../IncludeExtraPropertiesModifiers.cs | 29 ++++++++++++++ .../ModelBindingController_Tests.cs | 10 ----- 10 files changed, 92 insertions(+), 30 deletions(-) create mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptionsSetup.cs create mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpDateTimeConverterModifier.cs create mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeExtraPropertiesModifiers.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs index 650d3890c1..05c57ee5a7 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs @@ -23,9 +23,6 @@ public class AbpJsonOptionsSetup : IConfigureOptions options.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Skip; options.JsonSerializerOptions.AllowTrailingCommas = true; - options.JsonSerializerOptions.Converters.Add(ServiceProvider.GetRequiredService()); - options.JsonSerializerOptions.Converters.Add(ServiceProvider.GetRequiredService()); - options.JsonSerializerOptions.Converters.Add(new AbpStringToEnumFactory()); options.JsonSerializerOptions.Converters.Add(new AbpStringToBooleanConverter()); diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs index 660a69e4e7..605f06e9a6 100644 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs @@ -23,12 +23,7 @@ public class AbpJsonIsoDateTimeConverter : IsoDateTimeConverter, ITransientDepen public override bool CanConvert(Type objectType) { - if (objectType == typeof(DateTime) || objectType == typeof(DateTime?)) - { - return true; - } - - return false; + return objectType == typeof(DateTime) || objectType == typeof(DateTime?); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs index afa419bba2..e276821bcb 100644 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs @@ -12,10 +12,5 @@ public class AbpJsonNewtonsoftModule : AbpModule { options.Providers.Add(); }); - - Configure(options => - { - options.Converters.Add(); - }); } } diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs index 895c9bcfe4..ac7e66a7ef 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs @@ -12,6 +12,7 @@ public class AbpJsonSystemTextJsonModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpSystemTextJsonSerializerOptionsSetup>()); + context.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpSystemTextJsonSerializerModifiersOptionsSetup>()); Configure(options => { diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptions.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptions.cs index 4f4f8d1bac..efc0a6a883 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptions.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptions.cs @@ -1,9 +1,8 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization.Metadata; -using Volo.Abp.Data; using Volo.Abp.Json.SystemTextJson.Modifiers; -using Volo.Abp.ObjectExtending; + namespace Volo.Abp.Json.SystemTextJson; @@ -15,7 +14,7 @@ public class AbpSystemTextJsonSerializerModifiersOptions { Modifiers = new List> { - new IncludeNonPublicPropertiesModifiers().CreateModifyAction("ExtraProperties") + IncludeExtraPropertiesModifiers.Modify, }; } } diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptionsSetup.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptionsSetup.cs new file mode 100644 index 0000000000..f0ee1e9cfb --- /dev/null +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptionsSetup.cs @@ -0,0 +1,20 @@ +using System; +using Microsoft.Extensions.Options; +using Volo.Abp.Json.SystemTextJson.Modifiers; + +namespace Volo.Abp.Json.SystemTextJson; + +public class AbpSystemTextJsonSerializerModifiersOptionsSetup : IConfigureOptions +{ + protected IServiceProvider ServiceProvider { get; } + + public AbpSystemTextJsonSerializerModifiersOptionsSetup(IServiceProvider serviceProvider) + { + ServiceProvider = serviceProvider; + } + + public void Configure(AbpSystemTextJsonSerializerModifiersOptions options) + { + options.Modifiers.Add(new AbpDateTimeConverterModifier().CreateModifyAction(ServiceProvider)); + } +} diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs index a5806b28be..a9a35c1d47 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs @@ -18,9 +18,6 @@ public class AbpSystemTextJsonSerializerOptionsSetup : IConfigureOptions()); - options.JsonSerializerOptions.Converters.Add(ServiceProvider.GetRequiredService()); - options.JsonSerializerOptions.Converters.Add(new AbpStringToEnumFactory()); options.JsonSerializerOptions.Converters.Add(new AbpStringToBooleanConverter()); diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpDateTimeConverterModifier.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpDateTimeConverterModifier.cs new file mode 100644 index 0000000000..a691423cf3 --- /dev/null +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpDateTimeConverterModifier.cs @@ -0,0 +1,39 @@ +using System; +using System.Linq; +using System.Text.Json.Serialization.Metadata; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Json.SystemTextJson.JsonConverters; +using Volo.Abp.Reflection; +using Volo.Abp.Timing; + +namespace Volo.Abp.Json.SystemTextJson.Modifiers; + +public class AbpDateTimeConverterModifier +{ + private IServiceProvider _serviceProvider; + + public Action CreateModifyAction(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + return Modify; + } + + private void Modify(JsonTypeInfo jsonTypeInfo) + { + if (ReflectionHelper.GetAttributesOfMemberOrDeclaringType(jsonTypeInfo.Type).Any()) + { + return; + } + + foreach (var property in jsonTypeInfo.Properties.Where(x => x.PropertyType == typeof(DateTime) || x.PropertyType == typeof(DateTime?))) + { + if (property.AttributeProvider == null || + !property.AttributeProvider.GetCustomAttributes(typeof(DisableDateTimeNormalizationAttribute), false).Any()) + { + property.CustomConverter = property.PropertyType == typeof(DateTime) + ? _serviceProvider.GetRequiredService() + : _serviceProvider.GetRequiredService(); + } + } + } +} diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeExtraPropertiesModifiers.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeExtraPropertiesModifiers.cs new file mode 100644 index 0000000000..b96a73e1f7 --- /dev/null +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeExtraPropertiesModifiers.cs @@ -0,0 +1,29 @@ +using System; +using System.Linq; +using System.Text.Json.Serialization.Metadata; +using Volo.Abp.Data; +using Volo.Abp.ObjectExtending; + +namespace Volo.Abp.Json.SystemTextJson.Modifiers; + +public static class IncludeExtraPropertiesModifiers +{ + public static void Modify(JsonTypeInfo jsonTypeInfo) + { + var propertyJsonInfo = jsonTypeInfo.Properties.FirstOrDefault(x => x.PropertyType == typeof(ExtraPropertyDictionary) && + x.Name.Equals(nameof(ExtensibleObject.ExtraProperties), StringComparison.OrdinalIgnoreCase) && + x.Set == null); + if (propertyJsonInfo != null) + { + var propertyInfo = jsonTypeInfo.Type.GetProperty(nameof(ExtensibleObject.ExtraProperties)); + if (propertyInfo != null) + { + var jsonPropertyInfo = jsonTypeInfo.CreateJsonPropertyInfo(typeof(ExtraPropertyDictionary), propertyJsonInfo.Name); + jsonPropertyInfo.Get = propertyInfo.GetValue; + jsonPropertyInfo.Set = propertyInfo.SetValue; + jsonTypeInfo.Properties.Remove(propertyJsonInfo); + jsonTypeInfo.Properties.Add(jsonPropertyInfo); + } + } + } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs index 0d30d101cb..2850ca82c7 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs @@ -8,7 +8,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Shouldly; using Volo.Abp.Http; -using Volo.Abp.Json.SystemTextJson; using Volo.Abp.Timing; using Xunit; @@ -18,15 +17,6 @@ public abstract class ModelBindingController_Tests : AspNetCoreMvcTestBase { protected DateTimeKind Kind { get; set; } - protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) - { - services.Configure(options => - { - options.UnsupportedTypes.Add(); - options.UnsupportedTypes.Add(); - }); - } - [Fact] public async Task DateTimeKind_Test() { From d6152d01c2acbcf272b11cf84c83be8ca3418edc Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 17 Aug 2022 13:15:08 +0800 Subject: [PATCH 026/362] Add `AbpTestServer`. --- .../AbpAspNetCoreIntegratedTestBase.cs | 2 +- .../TestBase/AbpNoopHostLifetime.cs | 18 +++++++ .../TestBase/WebHostBuilderExtensions.cs | 19 +++++++ .../ModelBindingController_Tests.cs | 49 ++++++++++++++++++- 4 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpNoopHostLifetime.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/WebHostBuilderExtensions.cs diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreIntegratedTestBase.cs b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreIntegratedTestBase.cs index f3e60979bb..aa2ee0026a 100644 --- a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreIntegratedTestBase.cs +++ b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreIntegratedTestBase.cs @@ -40,7 +40,7 @@ public abstract class AbpAspNetCoreIntegratedTestBase : AbpTestBaseWit .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); - webBuilder.UseTestServer(); + webBuilder.UseAbpTestServer(); }) .UseAutofac() .ConfigureServices(ConfigureServices); diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpNoopHostLifetime.cs b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpNoopHostLifetime.cs new file mode 100644 index 0000000000..c20cf0db3a --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpNoopHostLifetime.cs @@ -0,0 +1,18 @@ +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Hosting; + +namespace Volo.Abp.AspNetCore.TestBase; + +public class AbpNoopHostLifetime : IHostLifetime +{ + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } + + public Task WaitForStartAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/WebHostBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/WebHostBuilderExtensions.cs new file mode 100644 index 0000000000..288f6ad569 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/WebHostBuilderExtensions.cs @@ -0,0 +1,19 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Hosting.Server; +using Microsoft.AspNetCore.TestHost; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace Volo.Abp.AspNetCore.TestBase; + +public static class AbpWebHostBuilderExtensions +{ + public static IWebHostBuilder UseAbpTestServer(this IWebHostBuilder builder) + { + return builder.ConfigureServices(services => + { + services.AddScoped(); + services.AddScoped(); + }); + } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs index 2850ca82c7..b2270adc42 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs @@ -6,8 +6,10 @@ using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Options; using Shouldly; using Volo.Abp.Http; +using Volo.Abp.Json.SystemTextJson; using Volo.Abp.Timing; using Xunit; @@ -106,7 +108,7 @@ public abstract class ModelBindingController_Tests : AspNetCoreMvcTestBase } } -public class ModelBindingController_Utc_Tests : ModelBindingController_Tests +public abstract class ModelBindingController_Utc_Tests : ModelBindingController_Tests { protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) { @@ -117,7 +119,7 @@ public class ModelBindingController_Utc_Tests : ModelBindingController_Tests } } -public class ModelBindingController_Local_Tests : ModelBindingController_Tests +public abstract class ModelBindingController_Local_Tests : ModelBindingController_Tests { protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) { @@ -127,3 +129,46 @@ public class ModelBindingController_Local_Tests : ModelBindingController_Tests base.ConfigureServices(context, services); } } + +public class SystemTextJson_ModelBindingController_Utc_Tests : ModelBindingController_Utc_Tests +{ + +} + +public class SystemTextJson_ModelBindingController_Local_Tests : ModelBindingController_Local_Tests +{ + +} + +public class Newtonsoft_ModelBindingController_Utc_Tests : ModelBindingController_Utc_Tests +{ + protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) + { + services.Configure(options => + { + options.UnsupportedTypes.Add(); + options.UnsupportedTypes.Add(); + }); + + services.Configure>(x => + { + + }); + + base.ConfigureServices(context, services); + } +} + +public class Newtonsoft_ModelBindingController_Local_Tests : ModelBindingController_Local_Tests +{ + protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) + { + services.Configure(options => + { + options.UnsupportedTypes.Add(); + options.UnsupportedTypes.Add(); + }); + + base.ConfigureServices(context, services); + } +} From 1c6db60ed62f81911df5f9688791d60766e4a0a5 Mon Sep 17 00:00:00 2001 From: Robert Roos Date: Wed, 17 Aug 2022 08:20:15 +0000 Subject: [PATCH 027/362] Update Previews.md Clarification for new users (such as me) that to move over to the preview of a release the CLI needs to be upgraded to the latest RC as well. --- docs/en/Previews.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/en/Previews.md b/docs/en/Previews.md index 61cf1c9226..70ddc4fe2b 100644 --- a/docs/en/Previews.md +++ b/docs/en/Previews.md @@ -11,6 +11,14 @@ More than one preview releases (like 3.1.0-rc.2 and 3.1.0-rc.3) might be publish ## Using the Preview Versions +### Update the CLI + +Before creating or updating an existing solution make sure to update the CLI to the latest preview version, for example: + +````bash +dotnet tool update --global Volo.Abp.Cli --version 6.0.0-rc.2 +```` + ### New Solutions To create a project for testing the preview version, you can select the "**preview**" option on the [download page](https://abp.io/get-started) or use the "**--preview**" parameter with the [ABP CLI](CLI.md) new command: From e2748ce82a8bfc8d684bf3bd004eac668eaad937 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 19 Aug 2022 20:55:51 +0800 Subject: [PATCH 028/362] Use action replace the `IConfigureOptions` classes. --- .../AbpAspNetCoreMvcNewtonsoftModule.cs | 43 ++++++++------ .../AbpAspNetCoreMvcNewtonsoftOptions.cs | 11 ---- .../AbpMvcNewtonsoftJsonOptionsSetup.cs | 31 ---------- .../Mvc/Json/AbpJsonOptionsSetup.cs | 33 ----------- .../Mvc/Json/MvcCoreBuilderExtensions.cs | 23 ++++++-- .../Newtonsoft/AbpJsonNewtonsoftModule.cs | 9 ++- .../AbpNewtonsoftJsonSerializerOptions.cs | 5 +- .../AbpNewtonsoftJsonSerializerProvider.cs | 59 +++++++++++++------ .../AbpJsonSystemTextJsonModule.cs | 30 ++++++++-- ...TextJsonSerializerModifiersOptionsSetup.cs | 20 ------- ...AbpSystemTextJsonSerializerOptionsSetup.cs | 31 ---------- 11 files changed, 119 insertions(+), 176 deletions(-) delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftOptions.cs delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpMvcNewtonsoftJsonOptionsSetup.cs delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs delete mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptionsSetup.cs delete mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftModule.cs index ccf25979db..f195f98bf4 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftModule.cs @@ -1,10 +1,14 @@ -using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.ObjectPool; using Microsoft.Extensions.Options; +using Newtonsoft.Json; using Volo.Abp.AspNetCore.Mvc.Json; +using Volo.Abp.Json.Newtonsoft; using Volo.Abp.Modularity; namespace Volo.Abp.AspNetCore.Mvc.NewtonsoftJson; @@ -14,29 +18,30 @@ public class AbpAspNetCoreMvcNewtonsoftModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - var options = context.Services.ExecutePreConfiguredActions(); + context.Services.TryAddSingleton(); - if (options.UseHybridSerializer) + Configure(mvcOptions => { - context.Services.TryAddSingleton(); + mvcOptions.InputFormatters.RemoveType(); + mvcOptions.OutputFormatters.RemoveType(); + }); - Configure(mvcOptions => - { - mvcOptions.InputFormatters.RemoveType(); - mvcOptions.OutputFormatters.RemoveType(); - }); + Configure(formatterOptions => + { + formatterOptions.TextInputFormatters.Add(); + formatterOptions.TextOutputFormatters.Add(); + }); - Configure(formatterOptions => + context.Services.AddOptions() + .Configure((options, serviceProvider) => { - formatterOptions.TextInputFormatters.Add(); - formatterOptions.TextOutputFormatters.Add(); - }); - } - else - { - context.Services.AddMvcCore().AddNewtonsoftJson(); - } + options.SerializerSettings.ContractResolver = serviceProvider.GetRequiredService(); + + var converters = serviceProvider.GetRequiredService>().Value + .Converters.Select(converterType => serviceProvider.GetRequiredService(converterType).As()) + .ToList(); - context.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpMvcNewtonsoftJsonOptionsSetup>()); + options.SerializerSettings.Converters.InsertRange(0, converters); + }); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftOptions.cs deleted file mode 100644 index 63d11b00b7..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftOptions.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Volo.Abp.AspNetCore.Mvc.NewtonsoftJson; - -public class AbpAspNetCoreMvcNewtonsoftOptions -{ - public bool UseHybridSerializer { get; set; } - - public AbpAspNetCoreMvcNewtonsoftOptions() - { - UseHybridSerializer = true; - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpMvcNewtonsoftJsonOptionsSetup.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpMvcNewtonsoftJsonOptionsSetup.cs deleted file mode 100644 index ab7eaf2244..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpMvcNewtonsoftJsonOptionsSetup.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using Newtonsoft.Json; -using Volo.Abp.Json.Newtonsoft; - -namespace Volo.Abp.AspNetCore.Mvc.NewtonsoftJson; - -public class AbpMvcNewtonsoftJsonOptionsSetup : IConfigureOptions -{ - private readonly IServiceProvider _serviceProvider; - - public AbpMvcNewtonsoftJsonOptionsSetup(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - - public void Configure(MvcNewtonsoftJsonOptions options) - { - options.SerializerSettings.ContractResolver = _serviceProvider.GetRequiredService(); - - var converters = _serviceProvider.GetRequiredService>().Value - .Converters.Select(converterType => _serviceProvider.GetRequiredService(converterType).As()) - .ToList(); - - options.SerializerSettings.Converters.InsertRange(0, converters); - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs deleted file mode 100644 index 05c57ee5a7..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Text.Json; -using System.Text.Json.Serialization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using Volo.Abp.Json.SystemTextJson; -using Volo.Abp.Json.SystemTextJson.JsonConverters; - -namespace Volo.Abp.AspNetCore.Mvc.Json; - -public class AbpJsonOptionsSetup : IConfigureOptions -{ - protected IServiceProvider ServiceProvider { get; } - - public AbpJsonOptionsSetup(IServiceProvider serviceProvider) - { - ServiceProvider = serviceProvider; - } - - public void Configure(JsonOptions options) - { - options.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Skip; - options.JsonSerializerOptions.AllowTrailingCommas = true; - - options.JsonSerializerOptions.Converters.Add(new AbpStringToEnumFactory()); - options.JsonSerializerOptions.Converters.Add(new AbpStringToBooleanConverter()); - - options.JsonSerializerOptions.Converters.Add(new ObjectToInferredTypesConverter()); - - options.JsonSerializerOptions.TypeInfoResolver = new AbpDefaultJsonTypeInfoResolver(ServiceProvider.GetRequiredService>()); - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs index 39a4e0670a..ea3f5ea156 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs @@ -1,8 +1,11 @@ -using Microsoft.AspNetCore.Mvc; +using System; +using System.Text.Json; +using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; +using Volo.Abp.Json.SystemTextJson; +using Volo.Abp.Json.SystemTextJson.JsonConverters; namespace Volo.Abp.AspNetCore.Mvc.Json; @@ -10,8 +13,6 @@ public static class MvcCoreBuilderExtensions { public static IMvcCoreBuilder AddAbpHybridJson(this IMvcCoreBuilder builder) { - builder.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpJsonOptionsSetup>()); - builder.Services.Configure(options => { options.InputFormatters.RemoveType(); @@ -27,6 +28,20 @@ public static class MvcCoreBuilderExtensions options.TextOutputFormatters.Add(); }); + builder.Services.AddOptions() + .Configure((options, serviceProvider) => + { + options.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Skip; + options.JsonSerializerOptions.AllowTrailingCommas = true; + + options.JsonSerializerOptions.Converters.Add(new AbpStringToEnumFactory()); + options.JsonSerializerOptions.Converters.Add(new AbpStringToBooleanConverter()); + options.JsonSerializerOptions.Converters.Add(new ObjectToInferredTypesConverter()); + + options.JsonSerializerOptions.TypeInfoResolver = new AbpDefaultJsonTypeInfoResolver(serviceProvider + .GetRequiredService>()); + }); + return builder; } } diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs index e276821bcb..0989dfdd03 100644 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs @@ -1,4 +1,5 @@ -using Volo.Abp.Modularity; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; using Volo.Abp.Timing; namespace Volo.Abp.Json.Newtonsoft; @@ -12,5 +13,11 @@ public class AbpJsonNewtonsoftModule : AbpModule { options.Providers.Add(); }); + + context.Services.AddOptions() + .Configure((options, contractResolver) => + { + options.JsonSerializerSettings.ContractResolver = contractResolver; + }); } } diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerOptions.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerOptions.cs index d4e392cf80..e5da4ac83f 100644 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerOptions.cs +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerOptions.cs @@ -1,14 +1,13 @@ using Newtonsoft.Json; -using Volo.Abp.Collections; namespace Volo.Abp.Json.Newtonsoft; public class AbpNewtonsoftJsonSerializerOptions { - public ITypeList Converters { get; } + public JsonSerializerSettings JsonSerializerSettings { get; } public AbpNewtonsoftJsonSerializerOptions() { - Converters = new TypeList(); + JsonSerializerSettings = new JsonSerializerSettings(); } } diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs index 01c7c1be14..a23580bf6c 100644 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; -using System.Linq; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Volo.Abp.DependencyInjection; @@ -10,18 +8,11 @@ namespace Volo.Abp.Json.Newtonsoft; public class AbpNewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ITransientDependency { - protected IServiceProvider ServiceProvider{ get; } - protected List Converters { get; } + protected IOptions Options { get; } - public AbpNewtonsoftJsonSerializerProvider( - IServiceProvider serviceProvider, - IOptions options) + public AbpNewtonsoftJsonSerializerProvider(IOptions options) { - ServiceProvider = serviceProvider; - Converters = options.Value - .Converters - .Select(c => (JsonConverter)serviceProvider.GetRequiredService(c)) - .ToList(); + Options = options; } public bool CanHandle(Type type) @@ -46,6 +37,7 @@ public class AbpNewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ITra private readonly static ConcurrentDictionary JsonSerializerOptionsCache = new ConcurrentDictionary(); + protected virtual JsonSerializerSettings CreateJsonSerializerOptions(bool camelCase = true, bool indented = false) { return JsonSerializerOptionsCache.GetOrAdd(new @@ -54,14 +46,45 @@ public class AbpNewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ITra indented }, _ => { - var settings = new JsonSerializerSettings(); + var settings = new JsonSerializerSettings { + Binder = Options.Value.JsonSerializerSettings.Binder, CheckAdditionalContent = Options.Value.JsonSerializerSettings.CheckAdditionalContent, + Context = Options.Value.JsonSerializerSettings.Context, + ContractResolver = Options.Value.JsonSerializerSettings.ContractResolver, + ConstructorHandling = Options.Value.JsonSerializerSettings.ConstructorHandling, + Converters = Options.Value.JsonSerializerSettings.Converters, + Culture = Options.Value.JsonSerializerSettings.Culture, + DateFormatHandling = Options.Value.JsonSerializerSettings.DateFormatHandling, + DateFormatString = Options.Value.JsonSerializerSettings.DateFormatString, + DateParseHandling = Options.Value.JsonSerializerSettings.DateParseHandling, + DateTimeZoneHandling = Options.Value.JsonSerializerSettings.DateTimeZoneHandling, + DefaultValueHandling = Options.Value.JsonSerializerSettings.DefaultValueHandling, + Error = Options.Value.JsonSerializerSettings.Error, + EqualityComparer = Options.Value.JsonSerializerSettings.EqualityComparer, + FloatFormatHandling = Options.Value.JsonSerializerSettings.FloatFormatHandling, + FloatParseHandling = Options.Value.JsonSerializerSettings.FloatParseHandling, + Formatting = Options.Value.JsonSerializerSettings.Formatting, + MaxDepth = Options.Value.JsonSerializerSettings.MaxDepth, + MetadataPropertyHandling = Options.Value.JsonSerializerSettings.MetadataPropertyHandling, + MissingMemberHandling = Options.Value.JsonSerializerSettings.MissingMemberHandling, + NullValueHandling = Options.Value.JsonSerializerSettings.NullValueHandling, + ObjectCreationHandling = Options.Value.JsonSerializerSettings.ObjectCreationHandling, + PreserveReferencesHandling = Options.Value.JsonSerializerSettings.PreserveReferencesHandling, + ReferenceLoopHandling = Options.Value.JsonSerializerSettings.ReferenceLoopHandling, + ReferenceResolver = Options.Value.JsonSerializerSettings.ReferenceResolver, + ReferenceResolverProvider = Options.Value.JsonSerializerSettings.ReferenceResolverProvider, + SerializationBinder = Options.Value.JsonSerializerSettings.SerializationBinder, + StringEscapeHandling = Options.Value.JsonSerializerSettings.StringEscapeHandling, + TraceWriter = Options.Value.JsonSerializerSettings.TraceWriter, + TypeNameAssemblyFormat = Options.Value.JsonSerializerSettings.TypeNameAssemblyFormat, + TypeNameHandling = Options.Value.JsonSerializerSettings.TypeNameHandling, + TypeNameAssemblyFormatHandling = Options.Value.JsonSerializerSettings.TypeNameAssemblyFormatHandling + }; - settings.Converters.InsertRange(0, Converters); - if (camelCase) - { - settings.ContractResolver = ServiceProvider.GetRequiredService(); - } + // if (camelCase) + // { + // settings.ContractResolver = ServiceProvider.GetRequiredService(); + // } if (indented) { diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs index ac7e66a7ef..178d0aa6a1 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs @@ -1,6 +1,9 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; +using System; +using System.Text.Encodings.Web; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using Volo.Abp.Json.SystemTextJson.JsonConverters; +using Volo.Abp.Json.SystemTextJson.Modifiers; using Volo.Abp.Modularity; using Volo.Abp.Timing; @@ -11,12 +14,29 @@ public class AbpJsonSystemTextJsonModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpSystemTextJsonSerializerOptionsSetup>()); - context.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpSystemTextJsonSerializerModifiersOptionsSetup>()); - Configure(options => { options.Providers.Add(); }); + + context.Services.AddOptions() + .Configure((options, serviceProvider) => + { + // If the user hasn't explicitly configured the encoder, use the less strict encoder that does not encode all non-ASCII characters. + options.JsonSerializerOptions.Encoder ??= JavaScriptEncoder.UnsafeRelaxedJsonEscaping; + + options.JsonSerializerOptions.Converters.Add(new AbpStringToEnumFactory()); + options.JsonSerializerOptions.Converters.Add(new AbpStringToBooleanConverter()); + options.JsonSerializerOptions.Converters.Add(new ObjectToInferredTypesConverter()); + + options.JsonSerializerOptions.TypeInfoResolver = new AbpDefaultJsonTypeInfoResolver(serviceProvider + .GetRequiredService>()); + }); + + context.Services.AddOptions() + .Configure((options, serviceProvider) => + { + options.Modifiers.Add(new AbpDateTimeConverterModifier().CreateModifyAction(serviceProvider)); + }); } } diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptionsSetup.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptionsSetup.cs deleted file mode 100644 index f0ee1e9cfb..0000000000 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptionsSetup.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using Microsoft.Extensions.Options; -using Volo.Abp.Json.SystemTextJson.Modifiers; - -namespace Volo.Abp.Json.SystemTextJson; - -public class AbpSystemTextJsonSerializerModifiersOptionsSetup : IConfigureOptions -{ - protected IServiceProvider ServiceProvider { get; } - - public AbpSystemTextJsonSerializerModifiersOptionsSetup(IServiceProvider serviceProvider) - { - ServiceProvider = serviceProvider; - } - - public void Configure(AbpSystemTextJsonSerializerModifiersOptions options) - { - options.Modifiers.Add(new AbpDateTimeConverterModifier().CreateModifyAction(ServiceProvider)); - } -} diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs deleted file mode 100644 index a9a35c1d47..0000000000 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Text.Encodings.Web; -using System.Text.Json.Serialization; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using Volo.Abp.Json.SystemTextJson.JsonConverters; - -namespace Volo.Abp.Json.SystemTextJson; - -public class AbpSystemTextJsonSerializerOptionsSetup : IConfigureOptions -{ - protected IServiceProvider ServiceProvider { get; } - - public AbpSystemTextJsonSerializerOptionsSetup(IServiceProvider serviceProvider) - { - ServiceProvider = serviceProvider; - } - - public void Configure(AbpSystemTextJsonSerializerOptions options) - { - options.JsonSerializerOptions.Converters.Add(new AbpStringToEnumFactory()); - options.JsonSerializerOptions.Converters.Add(new AbpStringToBooleanConverter()); - - options.JsonSerializerOptions.Converters.Add(new ObjectToInferredTypesConverter()); - - // If the user hasn't explicitly configured the encoder, use the less strict encoder that does not encode all non-ASCII characters. - options.JsonSerializerOptions.Encoder ??= JavaScriptEncoder.UnsafeRelaxedJsonEscaping; - - options.JsonSerializerOptions.TypeInfoResolver = new AbpDefaultJsonTypeInfoResolver(ServiceProvider.GetRequiredService>()); - } -} From ff2ecc004f8c57ff8d59c468c2390b70fea66e25 Mon Sep 17 00:00:00 2001 From: maliming Date: Sun, 21 Aug 2022 15:34:06 +0800 Subject: [PATCH 029/362] Remove `HybridJson`. --- framework/Volo.Abp.sln | 2 +- ...o.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj | 1 + .../AbpAspNetCoreMvcNewtonsoftModule.cs | 36 +---- .../AbpNewtonsoftJsonFormatter.cs | 65 -------- .../AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs | 4 +- ...tCoreApiDescriptionModelProviderOptions.cs | 11 +- .../Mvc/Json/AbpHybridJsonFormatterOptions.cs | 17 -- .../Mvc/Json/AbpHybridJsonInputFormatter.cs | 44 ------ .../Mvc/Json/AbpHybridJsonOutputFormatter.cs | 42 ----- .../Mvc/Json/AbpSystemTextJsonFormatter.cs | 61 ------- .../Mvc/Json/IAbpHybridJsonInputFormatter.cs | 12 -- .../Mvc/Json/IAbpHybridJsonOutputFormatter.cs | 12 -- .../Mvc/Json/MediaTypeHeaderValues.cs | 21 --- .../Mvc/Json/MvcCoreBuilderExtensions.cs | 16 -- .../Abp/Auditing/AuditingContractResolver.cs | 42 ----- .../Volo/Abp/Auditing/JsonAuditSerializer.cs | 78 +++++++++ .../Abp/Auditing/JsonNetAuditSerializer.cs | 43 ----- .../Volo.Abp.Cli.Core.csproj | 1 + .../Volo/Abp/Cli/AbpCliCoreModule.cs | 8 - .../Volo/Abp/Cli/LIbs/InstallLibsService.cs | 11 +- .../AbpApiProxyScriptingConfiguration.cs | 18 +-- .../FodyWeavers.xml | 0 .../FodyWeavers.xsd | 0 .../Volo.Abp.Json.Abstractions.csproj} | 2 +- .../Abp/Json/AbpJsonAbstractionsModule.cs} | 2 +- .../Volo/Abp/Json/AbpJsonOptions.cs | 9 ++ .../Volo/Abp/Json/IJsonSerializer.cs | 0 .../Volo/Abp/Json/AbpHybridJsonSerializer.cs | 66 -------- .../Volo/Abp/Json/AbpJsonOptions.cs | 18 --- .../Volo/Abp/Json/IJsonSerializerProvider.cs | 15 -- .../Volo.Abp.Json.Newtonsoft.csproj | 2 +- ...pCamelCasePropertyNamesContractResolver.cs | 31 +--- .../Newtonsoft/AbpDefaultContractResolver.cs | 33 ++++ .../Newtonsoft/AbpJsonIsoDateTimeConverter.cs | 14 ++ .../Newtonsoft/AbpJsonNewtonsoftModule.cs | 7 +- ...ider.cs => AbpNewtonsoftJsonSerializer.cs} | 33 ++-- .../Volo.Abp.Json.SystemTextJson.csproj | 2 +- .../AbpJsonSystemTextJsonModule.cs | 7 +- ...ider.cs => AbpSystemTextJsonSerializer.cs} | 12 +- .../AbpSystemTextJsonSerializerOptions.cs | 4 - .../IncludeExtraPropertiesModifiers.cs | 19 +-- .../src/Volo.Abp.Json/Volo.Abp.Json.csproj | 1 - .../Volo/Abp/Json/AbpJsonModule.cs | 5 +- .../Volo.Abp.AspNetCore.Mvc.Tests.csproj | 1 - .../Mvc/AbpAspNetCoreMvcTestModule.cs | 4 +- .../ModelBindingController_Tests.cs | 47 +----- .../Volo/Abp/AspNetCore/Mvc/Startup.cs | 33 +++- ...er_Test.cs => JsonAuditSerializer_Test.cs} | 13 +- .../Abp/Json/AbpHybridJsonSerializer_Tests.cs | 149 ------------------ ...pSystemTextJsonSerializerProvider_Tests.cs | 4 +- .../Json/ExtensibleObjectModifiers_Tests.cs | 2 +- nupkg/common.ps1 | 2 +- 52 files changed, 237 insertions(+), 845 deletions(-) delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonFormatter.cs delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonFormatterOptions.cs delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonInputFormatter.cs delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOutputFormatter.cs delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpSystemTextJsonFormatter.cs delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonInputFormatter.cs delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonOutputFormatter.cs delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MediaTypeHeaderValues.cs delete mode 100644 framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs create mode 100644 framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonAuditSerializer.cs delete mode 100644 framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs rename framework/src/{Volo.Abp.Json.Core => Volo.Abp.Json.Abstractions}/FodyWeavers.xml (100%) rename framework/src/{Volo.Abp.Json.Core => Volo.Abp.Json.Abstractions}/FodyWeavers.xsd (100%) rename framework/src/{Volo.Abp.Json.Core/Volo.Abp.Json.Core.csproj => Volo.Abp.Json.Abstractions/Volo.Abp.Json.Abstractions.csproj} (92%) rename framework/src/{Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonCoreModule.cs => Volo.Abp.Json.Abstractions/Volo/Abp/Json/AbpJsonAbstractionsModule.cs} (54%) create mode 100644 framework/src/Volo.Abp.Json.Abstractions/Volo/Abp/Json/AbpJsonOptions.cs rename framework/src/{Volo.Abp.Json.Core => Volo.Abp.Json.Abstractions}/Volo/Abp/Json/IJsonSerializer.cs (100%) delete mode 100644 framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpHybridJsonSerializer.cs delete mode 100644 framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonOptions.cs delete mode 100644 framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/IJsonSerializerProvider.cs create mode 100644 framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDefaultContractResolver.cs rename framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/{AbpNewtonsoftJsonSerializerProvider.cs => AbpNewtonsoftJsonSerializer.cs} (80%) rename framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/{AbpSystemTextJsonSerializerProvider.cs => AbpSystemTextJsonSerializer.cs} (76%) rename framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/{JsonNetAuditSerializer_Test.cs => JsonAuditSerializer_Test.cs} (78%) delete mode 100644 framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpHybridJsonSerializer_Tests.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index b646c5f9e6..27f68c5410 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -413,7 +413,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.Newtonsoft", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.SystemTextJson", "src\Volo.Abp.Json.SystemTextJson\Volo.Abp.Json.SystemTextJson.csproj", "{0AD06E14-CBFE-4551-8D18-9E921D8F2A87}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.Core", "src\Volo.Abp.Json.Core\Volo.Abp.Json.Core.csproj", "{08531C5D-0436-4721-986D-96446CF54316}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.Abstractions", "src\Volo.Abp.Json.Abstractions\Volo.Abp.Json.Abstractions.csproj", "{08531C5D-0436-4721-986D-96446CF54316}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.NewtonsoftJson", "src\Volo.Abp.AspNetCore.Mvc.NewtonsoftJson\Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj", "{0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}" EndProject diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj index 83ac5bc666..026fb2f4d4 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj @@ -19,6 +19,7 @@ + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftModule.cs index f195f98bf4..6e71fe7b5f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpAspNetCoreMvcNewtonsoftModule.cs @@ -1,47 +1,21 @@ -using System; -using System.Collections.Generic; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Formatters; +using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.ObjectPool; -using Microsoft.Extensions.Options; -using Newtonsoft.Json; -using Volo.Abp.AspNetCore.Mvc.Json; using Volo.Abp.Json.Newtonsoft; using Volo.Abp.Modularity; namespace Volo.Abp.AspNetCore.Mvc.NewtonsoftJson; -[DependsOn(typeof(AbpAspNetCoreMvcModule))] +[DependsOn(typeof(AbpJsonNewtonsoftModule), typeof(AbpAspNetCoreMvcModule))] public class AbpAspNetCoreMvcNewtonsoftModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.TryAddSingleton(); - - Configure(mvcOptions => - { - mvcOptions.InputFormatters.RemoveType(); - mvcOptions.OutputFormatters.RemoveType(); - }); - - Configure(formatterOptions => - { - formatterOptions.TextInputFormatters.Add(); - formatterOptions.TextOutputFormatters.Add(); - }); + context.Services.AddMvcCore().AddNewtonsoftJson(); context.Services.AddOptions() - .Configure((options, serviceProvider) => + .Configure((options, contractResolver) => { - options.SerializerSettings.ContractResolver = serviceProvider.GetRequiredService(); - - var converters = serviceProvider.GetRequiredService>().Value - .Converters.Select(converterType => serviceProvider.GetRequiredService(converterType).As()) - .ToList(); - - options.SerializerSettings.Converters.InsertRange(0, converters); + options.SerializerSettings.ContractResolver = contractResolver; }); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonFormatter.cs deleted file mode 100644 index aa411bfb61..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo/Abp/AspNetCore/Mvc/NewtonsoftJson/AbpNewtonsoftJsonFormatter.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Buffers; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Formatters; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.ObjectPool; -using Microsoft.Extensions.Options; -using Volo.Abp.AspNetCore.Mvc.Json; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.AspNetCore.Mvc.NewtonsoftJson; - -public class AbpNewtonsoftJsonFormatter : IAbpHybridJsonInputFormatter, IAbpHybridJsonOutputFormatter, ITransientDependency -{ - private readonly ILoggerFactory _loggerFactory; - private readonly ArrayPool _charPool; - private readonly ObjectPoolProvider _objectPoolProvider; - private readonly IOptions _mvcOptions; - private readonly IOptions _mvcNewtonsoftJsonOptions; - - public AbpNewtonsoftJsonFormatter( - ILoggerFactory loggerFactory, - ArrayPool charPool, - ObjectPoolProvider objectPoolProvider, - IOptions mvcOptions, - IOptions mvcNewtonsoftJsonOptions) - { - _loggerFactory = loggerFactory; - _charPool = charPool; - _objectPoolProvider = objectPoolProvider; - _mvcOptions = mvcOptions; - _mvcNewtonsoftJsonOptions = mvcNewtonsoftJsonOptions; - } - - Task IAbpHybridJsonInputFormatter.CanHandleAsync(Type type) - { - return Task.FromResult(true); - } - - public Task GetTextInputFormatterAsync() - { - return Task.FromResult(new NewtonsoftJsonInputFormatter( - _loggerFactory.CreateLogger(), - _mvcNewtonsoftJsonOptions.Value.SerializerSettings, - _charPool, - _objectPoolProvider, - _mvcOptions.Value, - _mvcNewtonsoftJsonOptions.Value)); - } - - Task IAbpHybridJsonOutputFormatter.CanHandleAsync(Type type) - { - return Task.FromResult(true); - } - - public Task GetTextOutputFormatterAsync() - { - return Task.FromResult(new NewtonsoftJsonOutputFormatter( - _mvcNewtonsoftJsonOptions.Value.SerializerSettings, - _charPool, - _mvcOptions.Value, - _mvcNewtonsoftJsonOptions.Value)); - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs index 22b919c91c..20922527bf 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs @@ -38,6 +38,7 @@ using Volo.Abp.GlobalFeatures; using Volo.Abp.Http.Modeling; using Volo.Abp.Http.ProxyScripting.Generators.JQuery; using Volo.Abp.Json; +using Volo.Abp.Json.SystemTextJson; using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.UI; @@ -52,7 +53,8 @@ namespace Volo.Abp.AspNetCore.Mvc; typeof(AbpAspNetCoreMvcContractsModule), typeof(AbpUiNavigationModule), typeof(AbpGlobalFeaturesModule), - typeof(AbpDddApplicationModule) + typeof(AbpDddApplicationModule), + typeof(AbpJsonSystemTextJsonModule) )] public class AbpAspNetCoreMvcModule : AbpModule { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProviderOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProviderOptions.cs index 2b9e231874..4dc4a9719a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProviderOptions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProviderOptions.cs @@ -62,19 +62,12 @@ public class AspNetCoreApiDescriptionModelProviderOptions { if (apiParameterDescription.ModelMetadata is DefaultModelMetadata defaultModelMetadata) { - var jsonPropertyNameAttribute = (System.Text.Json.Serialization.JsonPropertyNameAttribute) - defaultModelMetadata?.Attributes?.PropertyAttributes?.FirstOrDefault(x => x is System.Text.Json.Serialization.JsonPropertyNameAttribute); + var jsonPropertyNameAttribute = (JsonPropertyNameAttribute) + defaultModelMetadata?.Attributes?.PropertyAttributes?.FirstOrDefault(x => x is JsonPropertyNameAttribute); if (jsonPropertyNameAttribute != null) { return jsonPropertyNameAttribute.Name; } - - var jsonPropertyAttribute = (Newtonsoft.Json.JsonPropertyAttribute) - defaultModelMetadata?.Attributes?.PropertyAttributes?.FirstOrDefault(x => x is Newtonsoft.Json.JsonPropertyAttribute); - if (jsonPropertyAttribute != null) - { - return jsonPropertyAttribute.PropertyName; - } } return null; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonFormatterOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonFormatterOptions.cs deleted file mode 100644 index 066ebe4413..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonFormatterOptions.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.AspNetCore.Mvc.Formatters; -using Volo.Abp.Collections; - -namespace Volo.Abp.AspNetCore.Mvc.Json; - -public class AbpHybridJsonFormatterOptions -{ - public ITypeList TextInputFormatters { get; } - - public ITypeList TextOutputFormatters { get; } - - public AbpHybridJsonFormatterOptions() - { - TextInputFormatters = new TypeList(); - TextOutputFormatters = new TypeList(); - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonInputFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonInputFormatter.cs deleted file mode 100644 index 874508ac1f..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonInputFormatter.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc.Formatters; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; - -namespace Volo.Abp.AspNetCore.Mvc.Json; - -public class AbpHybridJsonInputFormatter : TextInputFormatter, IInputFormatterExceptionPolicy -{ - public AbpHybridJsonInputFormatter() - { - SupportedEncodings.Add(UTF8EncodingWithoutBOM); - SupportedEncodings.Add(UTF16EncodingLittleEndian); - - SupportedMediaTypes.Add(MediaTypeHeaderValues.ApplicationJson); - SupportedMediaTypes.Add(MediaTypeHeaderValues.TextJson); - SupportedMediaTypes.Add(MediaTypeHeaderValues.ApplicationAnyJsonSyntax); - } - - public async override Task ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding) - { - return await (await GetTextInputFormatterAsync(context)).ReadRequestBodyAsync(context, encoding); - } - - protected virtual async Task GetTextInputFormatterAsync(InputFormatterContext context) - { - var options = context.HttpContext.RequestServices.GetRequiredService>().Value; - - foreach (var inputFormatterType in options.TextInputFormatters) - { - var inputFormatter = context.HttpContext.RequestServices.GetRequiredService(inputFormatterType).As(); - if (await inputFormatter.CanHandleAsync(context.ModelType)) - { - return await inputFormatter.GetTextInputFormatterAsync(); - } - } - - throw new AbpException($"The {nameof(AbpHybridJsonInputFormatter)} can't handle '{context.ModelType.GetFullNameWithAssemblyName()}'!"); - } - - public virtual InputFormatterExceptionPolicy ExceptionPolicy => InputFormatterExceptionPolicy.MalformedInputExceptions; -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOutputFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOutputFormatter.cs deleted file mode 100644 index 2960ff1635..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOutputFormatter.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc.Formatters; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; - -namespace Volo.Abp.AspNetCore.Mvc.Json; - -public class AbpHybridJsonOutputFormatter : TextOutputFormatter -{ - public AbpHybridJsonOutputFormatter() - { - SupportedEncodings.Add(Encoding.UTF8); - SupportedEncodings.Add(Encoding.Unicode); - - SupportedMediaTypes.Add(MediaTypeHeaderValues.ApplicationJson); - SupportedMediaTypes.Add(MediaTypeHeaderValues.TextJson); - SupportedMediaTypes.Add(MediaTypeHeaderValues.ApplicationAnyJsonSyntax); - } - - public async override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding) - { - await (await GetTextInputFormatter(context)).WriteResponseBodyAsync(context, selectedEncoding); - } - - protected virtual async Task GetTextInputFormatter(OutputFormatterWriteContext context) - { - var options = context.HttpContext.RequestServices.GetRequiredService>().Value; - - foreach (var outputFormatterType in options.TextOutputFormatters) - { - var outputFormatter = context.HttpContext.RequestServices.GetRequiredService(outputFormatterType).As(); - if (await outputFormatter.CanHandleAsync(context.ObjectType)) - { - return await outputFormatter.GetTextOutputFormatterAsync(); - } - } - - throw new AbpException($"The {nameof(AbpHybridJsonOutputFormatter)} can't handle '{context.ObjectType.GetFullNameWithAssemblyName()}'!"); - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpSystemTextJsonFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpSystemTextJsonFormatter.cs deleted file mode 100644 index fb8c509748..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpSystemTextJsonFormatter.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Text.Encodings.Web; -using System.Text.Json; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Formatters; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Json.SystemTextJson; - -namespace Volo.Abp.AspNetCore.Mvc.Json; - -public class AbpSystemTextJsonFormatter : IAbpHybridJsonInputFormatter, IAbpHybridJsonOutputFormatter, ITransientDependency -{ - private readonly IOptions _jsonOptions; - private readonly IOptions _systemTextJsonSerializerOptions; - private readonly ILoggerFactory _loggerFactory; - - public AbpSystemTextJsonFormatter( - IOptions jsonOptions, - IOptions systemTextJsonSerializerOptions, - ILoggerFactory loggerFactory) - { - _jsonOptions = jsonOptions; - _systemTextJsonSerializerOptions = systemTextJsonSerializerOptions; - _loggerFactory = loggerFactory; - } - - Task IAbpHybridJsonInputFormatter.CanHandleAsync(Type type) - { - return Task.FromResult(!_systemTextJsonSerializerOptions.Value.UnsupportedTypes.Contains(type)); - } - - public virtual Task GetTextInputFormatterAsync() - { - return Task.FromResult(new SystemTextJsonInputFormatter( - _jsonOptions.Value, - _loggerFactory.CreateLogger())); - } - - Task IAbpHybridJsonOutputFormatter.CanHandleAsync(Type type) - { - return Task.FromResult(!_systemTextJsonSerializerOptions.Value.UnsupportedTypes.Contains(type)); - } - - public Task GetTextOutputFormatterAsync() - { - var jsonSerializerOptions = _jsonOptions.Value.JsonSerializerOptions; - if (jsonSerializerOptions.Encoder is null) - { - // If the user hasn't explicitly configured the encoder, use the less strict encoder that does not encode all non-ASCII characters. - jsonSerializerOptions = new JsonSerializerOptions(jsonSerializerOptions) - { - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, - }; - } - - return Task.FromResult(new SystemTextJsonOutputFormatter(jsonSerializerOptions)); - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonInputFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonInputFormatter.cs deleted file mode 100644 index 0a167e58d4..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonInputFormatter.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc.Formatters; - -namespace Volo.Abp.AspNetCore.Mvc.Json; - -public interface IAbpHybridJsonInputFormatter -{ - Task CanHandleAsync(Type type); - - Task GetTextInputFormatterAsync(); -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonOutputFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonOutputFormatter.cs deleted file mode 100644 index 06418b88d4..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/IAbpHybridJsonOutputFormatter.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc.Formatters; - -namespace Volo.Abp.AspNetCore.Mvc.Json; - -public interface IAbpHybridJsonOutputFormatter -{ - Task CanHandleAsync(Type type); - - Task GetTextOutputFormatterAsync(); -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MediaTypeHeaderValues.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MediaTypeHeaderValues.cs deleted file mode 100644 index 23d039ef30..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MediaTypeHeaderValues.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Microsoft.Net.Http.Headers; - -namespace Volo.Abp.AspNetCore.Mvc.Json; - -/// -/// https://github.com/dotnet/aspnetcore/blob/master/src/Mvc/Mvc.NewtonsoftJson/src/MediaTypeHeaderValues.cs -/// -internal static class MediaTypeHeaderValues -{ - public static readonly MediaTypeHeaderValue ApplicationJson = MediaTypeHeaderValue.Parse("application/json").CopyAsReadOnly(); - - public static readonly MediaTypeHeaderValue TextJson = MediaTypeHeaderValue.Parse("text/json").CopyAsReadOnly(); - - public static readonly MediaTypeHeaderValue ApplicationAnyJsonSyntax = MediaTypeHeaderValue.Parse("application/*+json").CopyAsReadOnly(); - - public static readonly MediaTypeHeaderValue ApplicationXml = MediaTypeHeaderValue.Parse("application/xml").CopyAsReadOnly(); - - public static readonly MediaTypeHeaderValue TextXml = MediaTypeHeaderValue.Parse("text/xml").CopyAsReadOnly(); - - public static readonly MediaTypeHeaderValue ApplicationAnyXmlSyntax = MediaTypeHeaderValue.Parse("application/*+xml").CopyAsReadOnly(); -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs index ea3f5ea156..66af7b060c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs @@ -1,7 +1,6 @@ using System; using System.Text.Json; using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Json.SystemTextJson; @@ -13,21 +12,6 @@ public static class MvcCoreBuilderExtensions { public static IMvcCoreBuilder AddAbpHybridJson(this IMvcCoreBuilder builder) { - builder.Services.Configure(options => - { - options.InputFormatters.RemoveType(); - options.InputFormatters.Add(new AbpHybridJsonInputFormatter()); - - options.OutputFormatters.RemoveType(); - options.OutputFormatters.Add(new AbpHybridJsonOutputFormatter()); - }); - - builder.Services.Configure(options => - { - options.TextInputFormatters.Add(); - options.TextOutputFormatters.Add(); - }); - builder.Services.AddOptions() .Configure((options, serviceProvider) => { diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs deleted file mode 100644 index 77d1b7ddb9..0000000000 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; - -namespace Volo.Abp.Auditing; - -public class AuditingContractResolver : CamelCasePropertyNamesContractResolver -{ - private readonly List _ignoredTypes; - - public AuditingContractResolver(List ignoredTypes) - { - _ignoredTypes = ignoredTypes; - } - - protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) - { - var property = base.CreateProperty(member, memberSerialization); - - if (_ignoredTypes.Any(ignoredType => ignoredType.GetTypeInfo().IsAssignableFrom(property.PropertyType))) - { - property.ShouldSerialize = instance => false; - return property; - } - - if (member.DeclaringType != null && (member.DeclaringType.IsDefined(typeof(DisableAuditingAttribute)) || member.DeclaringType.IsDefined(typeof(JsonIgnoreAttribute)))) - { - property.ShouldSerialize = instance => false; - return property; - } - - if (member.IsDefined(typeof(DisableAuditingAttribute)) || member.IsDefined(typeof(JsonIgnoreAttribute))) - { - property.ShouldSerialize = instance => false; - } - - return property; - } -} diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonAuditSerializer.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonAuditSerializer.cs new file mode 100644 index 0000000000..9d8c4248e6 --- /dev/null +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonAuditSerializer.cs @@ -0,0 +1,78 @@ +using System.Collections.Concurrent; +using System.Linq; +using System.Reflection; +using System.Text.Json; +using System.Text.Json.Serialization.Metadata; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Auditing; + +public class JsonAuditSerializer : IAuditSerializer, ITransientDependency +{ + protected AbpAuditingOptions Options; + + public JsonAuditSerializer(IOptions options) + { + Options = options.Value; + } + + public string Serialize(object obj) + { + return JsonSerializer.Serialize(obj, CreateJsonSerializerOptions()); + } + + private static readonly ConcurrentDictionary JsonSerializerOptionsCache = + new ConcurrentDictionary(); + + protected virtual JsonSerializerOptions CreateJsonSerializerOptions() + { + return JsonSerializerOptionsCache.GetOrAdd(nameof(JsonAuditSerializer), _ => + { + var settings = new JsonSerializerOptions() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + TypeInfoResolver = new DefaultJsonTypeInfoResolver() + { + Modifiers = + { + jsonTypeInfo => + { + if (Options.IgnoredTypes.Any(ignoredType => ignoredType.IsAssignableFrom(jsonTypeInfo.Type))) + { + jsonTypeInfo.Properties.Clear(); + } + + if (jsonTypeInfo.Type.GetCustomAttributes(typeof(DisableAuditingAttribute), false).Any()) + { + jsonTypeInfo.Properties.Clear(); + } + + foreach (var property in jsonTypeInfo.Properties) + { + if (Options.IgnoredTypes.Any(ignoredType => ignoredType.IsAssignableFrom(property.PropertyType))) + { + property.ShouldSerialize = (_, _) => false; + } + + if (property.AttributeProvider != null && + property.AttributeProvider.GetCustomAttributes(typeof(DisableAuditingAttribute), false).Any()) + { + property.ShouldSerialize = (_, _) => false; + } + + if (property.PropertyType.DeclaringType != null && + property.PropertyType.DeclaringType.IsDefined(typeof(DisableAuditingAttribute))) + { + property.ShouldSerialize = (_, _) => false; + } + } + } + } + } + }; + + return settings; + }); + } +} diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs deleted file mode 100644 index d5df2b2644..0000000000 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Microsoft.Extensions.Options; -using Newtonsoft.Json; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Auditing; - -//TODO: Rename to JsonAuditSerializer -public class JsonNetAuditSerializer : IAuditSerializer, ITransientDependency -{ - protected AbpAuditingOptions Options; - - public JsonNetAuditSerializer(IOptions options) - { - Options = options.Value; - } - - public string Serialize(object obj) - { - return JsonConvert.SerializeObject(obj, GetSharedJsonSerializerSettings()); - } - - private static readonly object SyncObj = new object(); - private static JsonSerializerSettings _sharedJsonSerializerSettings; - - private JsonSerializerSettings GetSharedJsonSerializerSettings() - { - if (_sharedJsonSerializerSettings == null) - { - lock (SyncObj) - { - if (_sharedJsonSerializerSettings == null) - { - _sharedJsonSerializerSettings = new JsonSerializerSettings - { - ContractResolver = new AuditingContractResolver(Options.IgnoredTypes) - }; - } - } - } - - return _sharedJsonSerializerSettings; - } -} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj b/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj index 5c83874fa0..1688a4246f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj +++ b/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj @@ -30,5 +30,6 @@ + diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs index 7aba9ae849..28ab693ba1 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs @@ -2,17 +2,14 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Cli.Commands; using Volo.Abp.Cli.Http; -using Volo.Abp.Cli.LIbs; using Volo.Abp.Cli.ServiceProxying; using Volo.Abp.Cli.ServiceProxying.Angular; using Volo.Abp.Cli.ServiceProxying.CSharp; using Volo.Abp.Cli.ServiceProxying.JavaScript; using Volo.Abp.Domain; using Volo.Abp.Http; -using Volo.Abp.Http.ProxyScripting.Generators.JQuery; using Volo.Abp.IdentityModel; using Volo.Abp.Json; -using Volo.Abp.Json.SystemTextJson; using Volo.Abp.Minify; using Volo.Abp.Modularity; @@ -34,11 +31,6 @@ public class AbpCliCoreModule : AbpModule Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - Configure(options => - { - options.UnsupportedTypes.Add(typeof(ResourceMapping)); - }); - Configure(options => { options.Commands[HelpCommand.Name] = typeof(HelpCommand); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs index 654feb117b..b925a4220c 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.FileSystemGlobbing; using Microsoft.Extensions.FileSystemGlobbing.Abstractions; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using Newtonsoft.Json; using NuGet.Versioning; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; @@ -30,12 +31,9 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency public ILogger Logger { get; set; } - private readonly IJsonSerializer _jsonSerializer; - - public InstallLibsService(IJsonSerializer jsonSerializer, NpmHelper npmHelper) + public InstallLibsService(NpmHelper npmHelper) { NpmHelper = npmHelper; - _jsonSerializer = jsonSerializer; } public async Task InstallLibsAsync(string directory) @@ -119,7 +117,7 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency { return false; } - + using (var reader = File.OpenText(file)) { return reader.ReadToEnd().Contains("Microsoft.NET.Sdk.Web"); @@ -145,7 +143,8 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency { var mappingFileContent = await reader.ReadToEndAsync(); - var mapping = _jsonSerializer.Deserialize(mappingFileContent + // System.Text.Json doesn't support the property name without quotes. + var mapping = Newtonsoft.Json.JsonConvert.DeserializeObject(mappingFileContent .Replace("module.exports", string.Empty) .Replace("=", string.Empty).Trim().TrimEnd(';')); diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Configuration/AbpApiProxyScriptingConfiguration.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Configuration/AbpApiProxyScriptingConfiguration.cs index e8da5693f6..86449c8971 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Configuration/AbpApiProxyScriptingConfiguration.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Configuration/AbpApiProxyScriptingConfiguration.cs @@ -10,22 +10,6 @@ public static class AbpApiProxyScriptingConfiguration static AbpApiProxyScriptingConfiguration() { PropertyNameGenerator = propertyInfo => - { - var jsonPropertyNameAttribute = propertyInfo.GetSingleAttributeOrNull(true); - - if (jsonPropertyNameAttribute != null) - { - return jsonPropertyNameAttribute.Name; - } - - var jsonPropertyAttribute = propertyInfo.GetSingleAttributeOrNull(true); - - if (jsonPropertyAttribute != null) - { - return jsonPropertyAttribute.PropertyName; - } - - return null; - }; + propertyInfo.GetSingleAttributeOrNull()?.Name; } } diff --git a/framework/src/Volo.Abp.Json.Core/FodyWeavers.xml b/framework/src/Volo.Abp.Json.Abstractions/FodyWeavers.xml similarity index 100% rename from framework/src/Volo.Abp.Json.Core/FodyWeavers.xml rename to framework/src/Volo.Abp.Json.Abstractions/FodyWeavers.xml diff --git a/framework/src/Volo.Abp.Json.Core/FodyWeavers.xsd b/framework/src/Volo.Abp.Json.Abstractions/FodyWeavers.xsd similarity index 100% rename from framework/src/Volo.Abp.Json.Core/FodyWeavers.xsd rename to framework/src/Volo.Abp.Json.Abstractions/FodyWeavers.xsd diff --git a/framework/src/Volo.Abp.Json.Core/Volo.Abp.Json.Core.csproj b/framework/src/Volo.Abp.Json.Abstractions/Volo.Abp.Json.Abstractions.csproj similarity index 92% rename from framework/src/Volo.Abp.Json.Core/Volo.Abp.Json.Core.csproj rename to framework/src/Volo.Abp.Json.Abstractions/Volo.Abp.Json.Abstractions.csproj index b7a88c22f6..15130c129c 100644 --- a/framework/src/Volo.Abp.Json.Core/Volo.Abp.Json.Core.csproj +++ b/framework/src/Volo.Abp.Json.Abstractions/Volo.Abp.Json.Abstractions.csproj @@ -5,7 +5,7 @@ netstandard2.0 - Volo.Abp.Json.Core + Volo.Abp.Json.Abstractions $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; false false diff --git a/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonCoreModule.cs b/framework/src/Volo.Abp.Json.Abstractions/Volo/Abp/Json/AbpJsonAbstractionsModule.cs similarity index 54% rename from framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonCoreModule.cs rename to framework/src/Volo.Abp.Json.Abstractions/Volo/Abp/Json/AbpJsonAbstractionsModule.cs index 68de7be35e..422d34745d 100644 --- a/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonCoreModule.cs +++ b/framework/src/Volo.Abp.Json.Abstractions/Volo/Abp/Json/AbpJsonAbstractionsModule.cs @@ -2,7 +2,7 @@ namespace Volo.Abp.Json; -public class AbpJsonCoreModule : AbpModule +public class AbpJsonAbstractionsModule : AbpModule { } diff --git a/framework/src/Volo.Abp.Json.Abstractions/Volo/Abp/Json/AbpJsonOptions.cs b/framework/src/Volo.Abp.Json.Abstractions/Volo/Abp/Json/AbpJsonOptions.cs new file mode 100644 index 0000000000..f7f5370255 --- /dev/null +++ b/framework/src/Volo.Abp.Json.Abstractions/Volo/Abp/Json/AbpJsonOptions.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.Json; + +public class AbpJsonOptions +{ + /// + /// Used to set default value for the DateTimeFormat. + /// + public string DefaultDateTimeFormat { get; set; } +} diff --git a/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/IJsonSerializer.cs b/framework/src/Volo.Abp.Json.Abstractions/Volo/Abp/Json/IJsonSerializer.cs similarity index 100% rename from framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/IJsonSerializer.cs rename to framework/src/Volo.Abp.Json.Abstractions/Volo/Abp/Json/IJsonSerializer.cs diff --git a/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpHybridJsonSerializer.cs b/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpHybridJsonSerializer.cs deleted file mode 100644 index f61f8b78ce..0000000000 --- a/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpHybridJsonSerializer.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Linq; -using JetBrains.Annotations; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Json; - -public class AbpHybridJsonSerializer : IJsonSerializer, ITransientDependency -{ - protected AbpJsonOptions Options { get; } - - protected IServiceScopeFactory ServiceScopeFactory { get; } - - public AbpHybridJsonSerializer(IOptions options, IServiceScopeFactory serviceScopeFactory) - { - Options = options.Value; - ServiceScopeFactory = serviceScopeFactory; - } - - public string Serialize([CanBeNull] object obj, bool camelCase = true, bool indented = false) - { - using (var scope = ServiceScopeFactory.CreateScope()) - { - var serializerProvider = GetSerializerProvider(scope.ServiceProvider, obj?.GetType()); - return serializerProvider.Serialize(obj, camelCase, indented); - } - } - - public T Deserialize([NotNull] string jsonString, bool camelCase = true) - { - Check.NotNull(jsonString, nameof(jsonString)); - - using (var scope = ServiceScopeFactory.CreateScope()) - { - var serializerProvider = GetSerializerProvider(scope.ServiceProvider, typeof(T)); - return serializerProvider.Deserialize(jsonString, camelCase); - } - } - - public object Deserialize(Type type, [NotNull] string jsonString, bool camelCase = true) - { - Check.NotNull(jsonString, nameof(jsonString)); - - using (var scope = ServiceScopeFactory.CreateScope()) - { - var serializerProvider = GetSerializerProvider(scope.ServiceProvider, type); - return serializerProvider.Deserialize(type, jsonString, camelCase); - } - } - - protected virtual IJsonSerializerProvider GetSerializerProvider(IServiceProvider serviceProvider, [CanBeNull] Type type) - { - foreach (var providerType in Options.Providers.Reverse()) - { - var provider = serviceProvider.GetRequiredService(providerType) as IJsonSerializerProvider; - if (provider.CanHandle(type)) - { - return provider; - } - } - - throw new AbpException($"There is no IJsonSerializerProvider that can handle '{type.GetFullNameWithAssemblyName()}'!"); - } -} diff --git a/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonOptions.cs b/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonOptions.cs deleted file mode 100644 index ffbd510b93..0000000000 --- a/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/AbpJsonOptions.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Volo.Abp.Collections; - -namespace Volo.Abp.Json; - -public class AbpJsonOptions -{ - /// - /// Used to set default value for the DateTimeFormat. - /// - public string DefaultDateTimeFormat { get; set; } - - public ITypeList Providers { get; } - - public AbpJsonOptions() - { - Providers = new TypeList(); - } -} diff --git a/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/IJsonSerializerProvider.cs b/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/IJsonSerializerProvider.cs deleted file mode 100644 index c3ae179d45..0000000000 --- a/framework/src/Volo.Abp.Json.Core/Volo/Abp/Json/IJsonSerializerProvider.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using JetBrains.Annotations; - -namespace Volo.Abp.Json; - -public interface IJsonSerializerProvider -{ - bool CanHandle([CanBeNull] Type type); - - string Serialize(object obj, bool camelCase = true, bool indented = false); - - T Deserialize(string jsonString, bool camelCase = true); - - object Deserialize(Type type, string jsonString, bool camelCase = true); -} diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo.Abp.Json.Newtonsoft.csproj b/framework/src/Volo.Abp.Json.Newtonsoft/Volo.Abp.Json.Newtonsoft.csproj index d53a9e2b33..6927cff0db 100644 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo.Abp.Json.Newtonsoft.csproj +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo.Abp.Json.Newtonsoft.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpCamelCasePropertyNamesContractResolver.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpCamelCasePropertyNamesContractResolver.cs index 502265db84..a73213af6c 100644 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpCamelCasePropertyNamesContractResolver.cs +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpCamelCasePropertyNamesContractResolver.cs @@ -4,8 +4,6 @@ using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using Volo.Abp.DependencyInjection; -using Volo.Abp.Reflection; -using Volo.Abp.Timing; namespace Volo.Abp.Json.Newtonsoft; @@ -20,38 +18,21 @@ public class AbpCamelCasePropertyNamesContractResolver : CamelCasePropertyNamesC true ); - NamingStrategy = new CamelCaseNamingStrategy(); + NamingStrategy = new CamelCaseNamingStrategy + { + ProcessDictionaryKeys = false + }; } protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var property = base.CreateProperty(member, memberSerialization); - ModifyProperty(member, property); - - return property; - } - - protected virtual void ModifyProperty(MemberInfo member, JsonProperty property) - { - if (property.PropertyType != typeof(DateTime) && - property.PropertyType != typeof(DateTime?)) - { - return; - } - - if (ReflectionHelper.GetSingleAttributeOfMemberOrDeclaringTypeOrDefault(member) == null) + if (AbpJsonIsoDateTimeConverter.ShouldNormalize(member, property)) { property.Converter = _dateTimeConverter.Value; } - } - protected override JsonDictionaryContract CreateDictionaryContract(Type objectType) - { - var contract = base.CreateDictionaryContract(objectType); - - contract.DictionaryKeyResolver = propertyName => propertyName; - - return contract; + return property; } } diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDefaultContractResolver.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDefaultContractResolver.cs new file mode 100644 index 0000000000..f39f6af578 --- /dev/null +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDefaultContractResolver.cs @@ -0,0 +1,33 @@ +using System; +using System.Reflection; +using Microsoft.Extensions.DependencyInjection; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Json.Newtonsoft; + +public class AbpDefaultContractResolver : DefaultContractResolver, ITransientDependency +{ + private readonly Lazy _dateTimeConverter; + + public AbpDefaultContractResolver(IServiceProvider serviceProvider) + { + _dateTimeConverter = new Lazy( + serviceProvider.GetRequiredService, + true + ); + } + + protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + var property = base.CreateProperty(member, memberSerialization); + + if (AbpJsonIsoDateTimeConverter.ShouldNormalize(member, property)) + { + property.Converter = _dateTimeConverter.Value; + } + + return property; + } +} diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs index 605f06e9a6..b859688a0d 100644 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs @@ -1,8 +1,11 @@ using System; +using System.Reflection; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Serialization; using Volo.Abp.DependencyInjection; +using Volo.Abp.Reflection; using Volo.Abp.Timing; namespace Volo.Abp.Json.Newtonsoft; @@ -43,4 +46,15 @@ public class AbpJsonIsoDateTimeConverter : IsoDateTimeConverter, ITransientDepen var date = value as DateTime?; base.WriteJson(writer, date.HasValue ? _clock.Normalize(date.Value) : value, serializer); } + + internal static bool ShouldNormalize(MemberInfo member, JsonProperty property) + { + if (property.PropertyType != typeof(DateTime) && + property.PropertyType != typeof(DateTime?)) + { + return false; + } + + return ReflectionHelper.GetSingleAttributeOfMemberOrDeclaringTypeOrDefault(member) == null; + } } diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs index 0989dfdd03..c1f1f3a0cf 100644 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonNewtonsoftModule.cs @@ -4,16 +4,11 @@ using Volo.Abp.Timing; namespace Volo.Abp.Json.Newtonsoft; -[DependsOn(typeof(AbpJsonCoreModule), typeof(AbpTimingModule))] +[DependsOn(typeof(AbpJsonAbstractionsModule), typeof(AbpTimingModule))] public class AbpJsonNewtonsoftModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.Providers.Add(); - }); - context.Services.AddOptions() .Configure((options, contractResolver) => { diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializer.cs similarity index 80% rename from framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs rename to framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializer.cs index a23580bf6c..36ba95e74c 100644 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializerProvider.cs +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializer.cs @@ -1,25 +1,24 @@ using System; using System.Collections.Concurrent; -using System.Collections.Generic; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Volo.Abp.DependencyInjection; + namespace Volo.Abp.Json.Newtonsoft; -public class AbpNewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ITransientDependency +[Dependency(ReplaceServices = true)] +public class AbpNewtonsoftJsonSerializer : IJsonSerializer, ITransientDependency { + protected IServiceProvider ServiceProvider { get; } protected IOptions Options { get; } - public AbpNewtonsoftJsonSerializerProvider(IOptions options) + public AbpNewtonsoftJsonSerializer(IServiceProvider serviceProvider, IOptions options) { + ServiceProvider = serviceProvider; Options = options; } - public bool CanHandle(Type type) - { - return true; - } - public string Serialize(object obj, bool camelCase = true, bool indented = false) { return JsonConvert.SerializeObject(obj, CreateJsonSerializerOptions(camelCase, indented)); @@ -35,8 +34,8 @@ public class AbpNewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ITra return JsonConvert.DeserializeObject(jsonString, type, CreateJsonSerializerOptions(camelCase)); } - private readonly static ConcurrentDictionary JsonSerializerOptionsCache = new ConcurrentDictionary(); - + private static readonly ConcurrentDictionary JsonSerializerOptionsCache = + new ConcurrentDictionary(); protected virtual JsonSerializerSettings CreateJsonSerializerOptions(bool camelCase = true, bool indented = false) { @@ -46,8 +45,10 @@ public class AbpNewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ITra indented }, _ => { - var settings = new JsonSerializerSettings { - Binder = Options.Value.JsonSerializerSettings.Binder, CheckAdditionalContent = Options.Value.JsonSerializerSettings.CheckAdditionalContent, + var settings = new JsonSerializerSettings + { + Binder = Options.Value.JsonSerializerSettings.Binder, + CheckAdditionalContent = Options.Value.JsonSerializerSettings.CheckAdditionalContent, Context = Options.Value.JsonSerializerSettings.Context, ContractResolver = Options.Value.JsonSerializerSettings.ContractResolver, ConstructorHandling = Options.Value.JsonSerializerSettings.ConstructorHandling, @@ -80,11 +81,9 @@ public class AbpNewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ITra TypeNameAssemblyFormatHandling = Options.Value.JsonSerializerSettings.TypeNameAssemblyFormatHandling }; - - // if (camelCase) - // { - // settings.ContractResolver = ServiceProvider.GetRequiredService(); - // } + settings.ContractResolver = camelCase + ? ServiceProvider.GetRequiredService() + : ServiceProvider.GetRequiredService(); if (indented) { diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj b/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj index 5402dd3c37..b3aba746a3 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs index 178d0aa6a1..50dd47d9e2 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs @@ -9,16 +9,11 @@ using Volo.Abp.Timing; namespace Volo.Abp.Json.SystemTextJson; -[DependsOn(typeof(AbpJsonCoreModule), typeof(AbpTimingModule))] +[DependsOn(typeof(AbpJsonAbstractionsModule), typeof(AbpTimingModule))] public class AbpJsonSystemTextJsonModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.Providers.Add(); - }); - context.Services.AddOptions() .Configure((options, serviceProvider) => { diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializer.cs similarity index 76% rename from framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs rename to framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializer.cs index 43aad3383d..8313f6ee99 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializer.cs @@ -6,20 +6,15 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.Json.SystemTextJson; -public class AbpSystemTextJsonSerializerProvider : IJsonSerializerProvider, ITransientDependency +public class AbpSystemTextJsonSerializer : IJsonSerializer, ITransientDependency { protected AbpSystemTextJsonSerializerOptions Options { get; } - public AbpSystemTextJsonSerializerProvider(IOptions options) + public AbpSystemTextJsonSerializer(IOptions options) { Options = options.Value; } - public bool CanHandle(Type type) - { - return !Options.UnsupportedTypes.Contains(type); - } - public string Serialize(object obj, bool camelCase = true, bool indented = false) { return JsonSerializer.Serialize(obj, CreateJsonSerializerOptions(camelCase, indented)); @@ -35,7 +30,8 @@ public class AbpSystemTextJsonSerializerProvider : IJsonSerializerProvider, ITra return JsonSerializer.Deserialize(jsonString, type, CreateJsonSerializerOptions(camelCase)); } - private readonly static ConcurrentDictionary JsonSerializerOptionsCache = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary JsonSerializerOptionsCache = + new ConcurrentDictionary(); protected virtual JsonSerializerOptions CreateJsonSerializerOptions(bool camelCase = true, bool indented = false) { diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptions.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptions.cs index f9d6e1a5d9..7288be03c0 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptions.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptions.cs @@ -7,8 +7,6 @@ public class AbpSystemTextJsonSerializerOptions { public JsonSerializerOptions JsonSerializerOptions { get; } - public ITypeList UnsupportedTypes { get; } - public AbpSystemTextJsonSerializerOptions() { JsonSerializerOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web) @@ -16,7 +14,5 @@ public class AbpSystemTextJsonSerializerOptions ReadCommentHandling = JsonCommentHandling.Skip, AllowTrailingCommas = true }; - - UnsupportedTypes = new TypeList(); } } diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeExtraPropertiesModifiers.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeExtraPropertiesModifiers.cs index b96a73e1f7..a3168fa76f 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeExtraPropertiesModifiers.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeExtraPropertiesModifiers.cs @@ -10,20 +10,17 @@ public static class IncludeExtraPropertiesModifiers { public static void Modify(JsonTypeInfo jsonTypeInfo) { - var propertyJsonInfo = jsonTypeInfo.Properties.FirstOrDefault(x => x.PropertyType == typeof(ExtraPropertyDictionary) && - x.Name.Equals(nameof(ExtensibleObject.ExtraProperties), StringComparison.OrdinalIgnoreCase) && - x.Set == null); + var propertyJsonInfo = jsonTypeInfo.Properties.FirstOrDefault(x => + x.PropertyType == typeof(ExtraPropertyDictionary) && + x.Name.Equals(nameof(ExtensibleObject.ExtraProperties), StringComparison.OrdinalIgnoreCase) && + x.Set == null); + if (propertyJsonInfo != null) { - var propertyInfo = jsonTypeInfo.Type.GetProperty(nameof(ExtensibleObject.ExtraProperties)); - if (propertyInfo != null) + propertyJsonInfo.Set = (extraProperties, value) => { - var jsonPropertyInfo = jsonTypeInfo.CreateJsonPropertyInfo(typeof(ExtraPropertyDictionary), propertyJsonInfo.Name); - jsonPropertyInfo.Get = propertyInfo.GetValue; - jsonPropertyInfo.Set = propertyInfo.SetValue; - jsonTypeInfo.Properties.Remove(propertyJsonInfo); - jsonTypeInfo.Properties.Add(jsonPropertyInfo); - } + ObjectHelper.TrySetProperty(extraProperties.As(), x => x.ExtraProperties, () => (ExtraPropertyDictionary)value); + }; } } } diff --git a/framework/src/Volo.Abp.Json/Volo.Abp.Json.csproj b/framework/src/Volo.Abp.Json/Volo.Abp.Json.csproj index fd0408acba..eee618b18d 100644 --- a/framework/src/Volo.Abp.Json/Volo.Abp.Json.csproj +++ b/framework/src/Volo.Abp.Json/Volo.Abp.Json.csproj @@ -15,7 +15,6 @@ - diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonModule.cs b/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonModule.cs index ef9419a784..b3b9c459b6 100644 --- a/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonModule.cs +++ b/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonModule.cs @@ -1,10 +1,9 @@ -using Volo.Abp.Json.Newtonsoft; -using Volo.Abp.Json.SystemTextJson; +using Volo.Abp.Json.SystemTextJson; using Volo.Abp.Modularity; namespace Volo.Abp.Json; -[DependsOn(typeof(AbpJsonNewtonsoftModule), typeof(AbpJsonSystemTextJsonModule))] +[DependsOn(typeof(AbpJsonSystemTextJsonModule))] public class AbpJsonModule : AbpModule { diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj index be8f77271d..930cdb5855 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj @@ -25,7 +25,6 @@ - diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs index 76a95a09cf..d8a49abf23 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs @@ -7,11 +7,9 @@ using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; -using Volo.Abp.AspNetCore.Mvc.Authorization; using Volo.Abp.AspNetCore.Mvc.GlobalFeatures; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.Localization.Resource; -using Volo.Abp.AspNetCore.Mvc.NewtonsoftJson; using Volo.Abp.AspNetCore.Security.Claims; using Volo.Abp.AspNetCore.TestBase; using Volo.Abp.Authorization; @@ -30,7 +28,7 @@ namespace Volo.Abp.AspNetCore.Mvc; [DependsOn( typeof(AbpAspNetCoreTestBaseModule), typeof(AbpMemoryDbTestModule), - typeof(AbpAspNetCoreMvcNewtonsoftModule), + typeof(AbpAspNetCoreMvcModule), typeof(AbpAutofacModule) )] public class AbpAspNetCoreMvcTestModule : AbpModule diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs index b2270adc42..befbd169fa 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs @@ -108,7 +108,7 @@ public abstract class ModelBindingController_Tests : AspNetCoreMvcTestBase } } -public abstract class ModelBindingController_Utc_Tests : ModelBindingController_Tests +public class ModelBindingController_Utc_Tests : ModelBindingController_Tests { protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) { @@ -119,7 +119,7 @@ public abstract class ModelBindingController_Utc_Tests : ModelBindingController_ } } -public abstract class ModelBindingController_Local_Tests : ModelBindingController_Tests +public class ModelBindingController_Local_Tests : ModelBindingController_Tests { protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) { @@ -129,46 +129,3 @@ public abstract class ModelBindingController_Local_Tests : ModelBindingControlle base.ConfigureServices(context, services); } } - -public class SystemTextJson_ModelBindingController_Utc_Tests : ModelBindingController_Utc_Tests -{ - -} - -public class SystemTextJson_ModelBindingController_Local_Tests : ModelBindingController_Local_Tests -{ - -} - -public class Newtonsoft_ModelBindingController_Utc_Tests : ModelBindingController_Utc_Tests -{ - protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) - { - services.Configure(options => - { - options.UnsupportedTypes.Add(); - options.UnsupportedTypes.Add(); - }); - - services.Configure>(x => - { - - }); - - base.ConfigureServices(context, services); - } -} - -public class Newtonsoft_ModelBindingController_Local_Tests : ModelBindingController_Local_Tests -{ - protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) - { - services.Configure(options => - { - options.UnsupportedTypes.Add(); - options.UnsupportedTypes.Add(); - }); - - base.ConfigureServices(context, services); - } -} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Startup.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Startup.cs index ad4a222c33..df5a8b7b9c 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Startup.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Startup.cs @@ -1,4 +1,6 @@ -using System.IO; +using System; +using System.IO; +using System.Linq; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; @@ -14,13 +16,34 @@ public class Startup services.AddApplication(options => { var hostEnvironment = services.GetHostingEnvironment(); + var currentDirectory = hostEnvironment.ContentRootPath; + var plugDllInPath = ""; + + for (var i = 0; i < 10; i++) + { + var parentDirectory = new DirectoryInfo(currentDirectory).Parent; + if (parentDirectory == null) + { + break; + } + + if (parentDirectory.Name == "test") + { #if DEBUG - var plugDllInPath = Path.Combine(hostEnvironment.ContentRootPath, - @"..\..\..\..\..\Volo.Abp.AspNetCore.Mvc.PlugIn\bin\Debug\net7.0\"); + plugDllInPath = Path.Combine(parentDirectory.FullName, "Volo.Abp.AspNetCore.Mvc.PlugIn", "bin", "Debug", "net7.0"); #else - plugDllInPath = Path.Combine(_env.ContentRootPath, - @"..\..\..\..\..\Volo.Abp.AspNetCore.Mvc.PlugIn\bin\Release\net7.0\"); + plugDllInPath = Path.Combine(parentDirectory.FullName, "Volo.Abp.AspNetCore.Mvc.PlugIn", "bin", "Release", "net7.0"); #endif + break; + } + + currentDirectory = parentDirectory.FullName; + } + + if (plugDllInPath.IsNullOrWhiteSpace()) + { + throw new AbpException("Could not find the plug DLL path!"); + } options.PlugInSources.AddFolder(plugDllInPath); }); diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonNetAuditSerializer_Test.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonAuditSerializer_Test.cs similarity index 78% rename from framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonNetAuditSerializer_Test.cs rename to framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonAuditSerializer_Test.cs index 1dc3fcf839..cc20805947 100644 --- a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonNetAuditSerializer_Test.cs +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonAuditSerializer_Test.cs @@ -1,18 +1,19 @@ using System; using System.Collections.Generic; +using System.Text.Json.Serialization; using Microsoft.Extensions.DependencyInjection; using Shouldly; using Xunit; namespace Volo.Abp.Auditing; -public class JsonNetAuditSerializer_Test : AbpAuditingTestBase +public class JsonAuditSerializer_Test : AbpAuditingTestBase { - private readonly JsonNetAuditSerializer _jsonNetAuditSerializer; + private readonly JsonAuditSerializer _jsonAuditSerializer; - public JsonNetAuditSerializer_Test() + public JsonAuditSerializer_Test() { - _jsonNetAuditSerializer = GetRequiredService(); + _jsonAuditSerializer = GetRequiredService(); } protected override void AfterAddApplication(IServiceCollection services) @@ -34,7 +35,7 @@ public class JsonNetAuditSerializer_Test : AbpAuditingTestBase {"input2", new Input2Dto {UserName = "admin", Password = "1q2w3E*", Birthday = DateTime.Now}} }; - var str = _jsonNetAuditSerializer.Serialize(arguments); + var str = _jsonAuditSerializer.Serialize(arguments); str.ShouldNotContain("IdCard"); str.ShouldNotContain("1q2w3E*"); @@ -58,7 +59,7 @@ public class JsonNetAuditSerializer_Test : AbpAuditingTestBase [DisableAuditing] public string Password { get; set; } - [Newtonsoft.Json.JsonIgnore] + [JsonIgnore] public string PrivateEmail { get; set; } public DateTime Birthday { get; set; } diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpHybridJsonSerializer_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpHybridJsonSerializer_Tests.cs deleted file mode 100644 index 5733d739d2..0000000000 --- a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpHybridJsonSerializer_Tests.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text.Json; -using Microsoft.Extensions.DependencyInjection; -using Newtonsoft.Json; -using Shouldly; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Json.Newtonsoft; -using Volo.Abp.Json.SystemTextJson; -using Xunit; -using JsonSerializer = Newtonsoft.Json.JsonSerializer; - -namespace Volo.Abp.Json; - -public class AbpHybridJsonSerializer_Tests : AbpJsonTestBase -{ - private readonly IJsonSerializer _jsonSerializer; - - public AbpHybridJsonSerializer_Tests() - { - _jsonSerializer = GetRequiredService(); - } - - protected override void AfterAddApplication(IServiceCollection services) - { - services.Configure(options => - { - options.UnsupportedTypes.Add(); - - options.JsonSerializerOptions.Converters.Add(new SystemTextJsonConverter()); - }); - - services.Configure(options => - { - options.Converters.Add(); - }); - } - - [Fact] - public void NewtonsoftSerialize_Test() - { - var json = _jsonSerializer.Serialize(new MyClass1 - { - Providers = new List - { - new MyClass3() - } - }); - - json.ShouldContain("Newtonsoft"); - } - - [Fact] - public void SystemTextJsonSerialize_Test() - { - var json = _jsonSerializer.Serialize(new MyClass2 - { - Providers = new List - { - new MyClass3() - } - }); - - json.ShouldContain("SystemTextJson"); - } - - [Fact] - public void SystemTextJsonSerialize_With_Dictionary_Test() - { - var json = _jsonSerializer.Serialize(new MyClassWithDictionary - { - Properties = - { - {"A", "AV"}, - {"B", "BV"} - } - }); - - var deserialized = _jsonSerializer.Deserialize(json); - deserialized.Properties.ShouldContain(p => p.Key == "A" && p.Value == "AV"); - deserialized.Properties.ShouldContain(p => p.Key == "B" && p.Value == "BV"); - } - - public class MyClass1 - { - public string Provider { get; set; } - - public List Providers { get; set; } - } - - public class MyClass2 - { - public string Provider { get; set; } - - public List Providers { get; set; } - } - - public class MyClass3 - { - public string Provider { get; set; } - } - - public class MyClassWithDictionary - { - public Dictionary Properties { get; set; } - - public MyClassWithDictionary() - { - Properties = new Dictionary(); - } - } - - class NewtonsoftJsonConverter : JsonConverter, ITransientDependency - { - public override void WriteJson(JsonWriter writer, MyClass1 value, JsonSerializer serializer) - { - value.Provider = "Newtonsoft"; - foreach (var provider in value.Providers) - { - provider.Provider = "Newtonsoft"; - } - - writer.WriteRawValue(JsonConvert.SerializeObject(value)); - } - - public override MyClass1 ReadJson(JsonReader reader, Type objectType, MyClass1 existingValue, bool hasExistingValue, JsonSerializer serializer) - { - return (MyClass1)serializer.Deserialize(reader, objectType); - } - } - - class SystemTextJsonConverter : System.Text.Json.Serialization.JsonConverter, ITransientDependency - { - public override void Write(Utf8JsonWriter writer, MyClass2 value, JsonSerializerOptions options) - { - value.Provider = "SystemTextJson"; - foreach (var provider in value.Providers) - { - provider.Provider = "SystemTextJson"; - } - System.Text.Json.JsonSerializer.Serialize(writer, value); - } - - public override MyClass2 Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - return (MyClass2)System.Text.Json.JsonSerializer.Deserialize(ref reader, typeToConvert); - } - } -} diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpSystemTextJsonSerializerProvider_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpSystemTextJsonSerializerProvider_Tests.cs index 21b3fd51bb..f9823e7d65 100644 --- a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpSystemTextJsonSerializerProvider_Tests.cs +++ b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpSystemTextJsonSerializerProvider_Tests.cs @@ -11,11 +11,11 @@ namespace Volo.Abp.Json; public abstract class AbpSystemTextJsonSerializerProvider_TestBase : AbpJsonTestBase { - protected AbpSystemTextJsonSerializerProvider JsonSerializer; + protected AbpSystemTextJsonSerializer JsonSerializer; public AbpSystemTextJsonSerializerProvider_TestBase() { - JsonSerializer = GetRequiredService(); + JsonSerializer = GetRequiredService(); } public class TestExtensibleObjectClass : ExtensibleObject diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ExtensibleObjectModifiers_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ExtensibleObjectModifiers_Tests.cs index 617301bd6c..820f18b1a2 100644 --- a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ExtensibleObjectModifiers_Tests.cs +++ b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ExtensibleObjectModifiers_Tests.cs @@ -10,7 +10,7 @@ public class ExtensibleObjectModifiers_Tests : AbpJsonTestBase [Fact] public void Should_Modify_Object() { - var jsonSerializer = GetRequiredService(); + var jsonSerializer = GetRequiredService(); var extensibleObject = jsonSerializer.Deserialize("{\"ExtraProperties\": {\"Test-Key\":\"Test-Value\"}}"); diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index 9f44b11c6d..a15a8e6b5d 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -192,7 +192,7 @@ $projects = ( "framework/src/Volo.Abp.Http", "framework/src/Volo.Abp.IdentityModel", "framework/src/Volo.Abp.Json", - "framework/src/Volo.Abp.Json.Core", + "framework/src/Volo.Abp.Json.Abstractions", "framework/src/Volo.Abp.Json.Newtonsoft", "framework/src/Volo.Abp.Json.SystemTextJson", "framework/src/Volo.Abp.Ldap", From 46d8b417ac55803691d1998989b35df4e5d01926 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 24 Aug 2022 16:55:29 +0800 Subject: [PATCH 030/362] Add `InputDateTimeFormats` and `OutputDateTimeFormat` to `AbpJsonOptions`. Resolve #12338 --- .../Volo/Abp/Json/AbpJsonOptions.cs | 18 ++- ...pCamelCasePropertyNamesContractResolver.cs | 8 +- .../Json/Newtonsoft/AbpDateTimeConverter.cs | 116 ++++++++++++++++++ .../Newtonsoft/AbpDefaultContractResolver.cs | 8 +- .../Newtonsoft/AbpJsonIsoDateTimeConverter.cs | 60 --------- .../JsonConverters/AbpDateTimeConverter.cs | 24 ++-- .../AbpNullableDateTimeConverter.cs | 24 ++-- .../Mvc/Json/JsonResultController_Tests.cs | 2 +- .../Mvc/Json/JsonSerializer_Tests.cs | 2 +- ...pSystemTextJsonSerializerProvider_Tests.cs | 19 ++- 10 files changed, 183 insertions(+), 98 deletions(-) create mode 100644 framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDateTimeConverter.cs delete mode 100644 framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs diff --git a/framework/src/Volo.Abp.Json.Abstractions/Volo/Abp/Json/AbpJsonOptions.cs b/framework/src/Volo.Abp.Json.Abstractions/Volo/Abp/Json/AbpJsonOptions.cs index f7f5370255..043c1081d7 100644 --- a/framework/src/Volo.Abp.Json.Abstractions/Volo/Abp/Json/AbpJsonOptions.cs +++ b/framework/src/Volo.Abp.Json.Abstractions/Volo/Abp/Json/AbpJsonOptions.cs @@ -1,9 +1,21 @@ -namespace Volo.Abp.Json; +using System.Collections.Generic; + +namespace Volo.Abp.Json; public class AbpJsonOptions { /// - /// Used to set default value for the DateTimeFormat. + /// Formats of input JSON date, Empty string means default format. /// - public string DefaultDateTimeFormat { get; set; } + public List InputDateTimeFormats { get; set; } + + /// + /// Format of output json date, Null or empty string means default format. + /// + public string OutputDateTimeFormat { get; set; } + + public AbpJsonOptions() + { + InputDateTimeFormats = new List(); + } } diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpCamelCasePropertyNamesContractResolver.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpCamelCasePropertyNamesContractResolver.cs index a73213af6c..3e4e5d0121 100644 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpCamelCasePropertyNamesContractResolver.cs +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpCamelCasePropertyNamesContractResolver.cs @@ -9,12 +9,12 @@ namespace Volo.Abp.Json.Newtonsoft; public class AbpCamelCasePropertyNamesContractResolver : CamelCasePropertyNamesContractResolver, ITransientDependency { - private readonly Lazy _dateTimeConverter; + private readonly Lazy _dateTimeConverter; public AbpCamelCasePropertyNamesContractResolver(IServiceProvider serviceProvider) { - _dateTimeConverter = new Lazy( - serviceProvider.GetRequiredService, + _dateTimeConverter = new Lazy( + serviceProvider.GetRequiredService, true ); @@ -28,7 +28,7 @@ public class AbpCamelCasePropertyNamesContractResolver : CamelCasePropertyNamesC { var property = base.CreateProperty(member, memberSerialization); - if (AbpJsonIsoDateTimeConverter.ShouldNormalize(member, property)) + if (AbpDateTimeConverter.ShouldNormalize(member, property)) { property.Converter = _dateTimeConverter.Value; } diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDateTimeConverter.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDateTimeConverter.cs new file mode 100644 index 0000000000..3bd97f7aee --- /dev/null +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDateTimeConverter.cs @@ -0,0 +1,116 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Reflection; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Serialization; +using Volo.Abp.Reflection; +using Volo.Abp.Timing; + +namespace Volo.Abp.Json.Newtonsoft; + +public class AbpDateTimeConverter : DateTimeConverterBase +{ + private readonly string _dateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; + private readonly DateTimeStyles _dateTimeStyles = DateTimeStyles.RoundtripKind; + private readonly CultureInfo _culture = CultureInfo.InvariantCulture; + private readonly IClock _clock; + private readonly AbpJsonOptions _options; + + public AbpDateTimeConverter(IClock clock, IOptions options) + { + _clock = clock; + _options = options.Value; + } + + public override bool CanConvert(Type objectType) + { + return objectType == typeof(DateTime) || objectType == typeof(DateTime?); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + var nullable = Nullable.GetUnderlyingType(objectType) != null; + if (reader.TokenType == JsonToken.Null) + { + if (!nullable) + { + throw new JsonSerializationException($"Cannot convert null value to {objectType.FullName}."); + } + + return null; + } + + if (reader.TokenType == JsonToken.Date) + { + return _clock.Normalize(reader.Value.To()); + } + + if (reader.TokenType != JsonToken.String) + { + throw new JsonSerializationException($"Unexpected token parsing date. Expected String, got {reader.TokenType}."); + } + + var dateText = reader.Value?.ToString(); + + if (dateText.IsNullOrEmpty() && nullable) + { + return null; + } + + if (_options.InputDateTimeFormats.Any()) + { + foreach (var format in _options.InputDateTimeFormats) + { + if (DateTime.TryParseExact(dateText, format, _culture, _dateTimeStyles, out var d1)) + { + return _clock.Normalize(d1); + } + } + } + + var date = !_dateTimeFormat.IsNullOrEmpty() ? + DateTime.ParseExact(dateText, _dateTimeFormat, _culture, _dateTimeStyles) : + DateTime.Parse(dateText, _culture, _dateTimeStyles); + + return _clock.Normalize(date); + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + if (value != null) + { + value = _clock.Normalize(value.To()); + } + + if (value is DateTime dateTime) + { + if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal || + (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal) + { + dateTime = dateTime.ToUniversalTime(); + } + + writer.WriteValue(_options.OutputDateTimeFormat.IsNullOrWhiteSpace() + ? dateTime.ToString(_dateTimeFormat, _culture) + : dateTime.ToString(_options.OutputDateTimeFormat, _culture)); + } + else + { + throw new JsonSerializationException($"Unexpected value when converting date. Expected DateTime or DateTimeOffset, got {value.GetType()}."); + } + } + + internal static bool ShouldNormalize(MemberInfo member, JsonProperty property) + { + if (property.PropertyType != typeof(DateTime) && + property.PropertyType != typeof(DateTime?)) + { + return false; + } + + return ReflectionHelper.GetSingleAttributeOfMemberOrDeclaringTypeOrDefault(member) == null; + } +} diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDefaultContractResolver.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDefaultContractResolver.cs index f39f6af578..131e95d4c2 100644 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDefaultContractResolver.cs +++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpDefaultContractResolver.cs @@ -9,12 +9,12 @@ namespace Volo.Abp.Json.Newtonsoft; public class AbpDefaultContractResolver : DefaultContractResolver, ITransientDependency { - private readonly Lazy _dateTimeConverter; + private readonly Lazy _dateTimeConverter; public AbpDefaultContractResolver(IServiceProvider serviceProvider) { - _dateTimeConverter = new Lazy( - serviceProvider.GetRequiredService, + _dateTimeConverter = new Lazy( + serviceProvider.GetRequiredService, true ); } @@ -23,7 +23,7 @@ public class AbpDefaultContractResolver : DefaultContractResolver, ITransientDep { var property = base.CreateProperty(member, memberSerialization); - if (AbpJsonIsoDateTimeConverter.ShouldNormalize(member, property)) + if (AbpDateTimeConverter.ShouldNormalize(member, property)) { property.Converter = _dateTimeConverter.Value; } diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs deleted file mode 100644 index b859688a0d..0000000000 --- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpJsonIsoDateTimeConverter.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Reflection; -using Microsoft.Extensions.Options; -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using Newtonsoft.Json.Serialization; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Reflection; -using Volo.Abp.Timing; - -namespace Volo.Abp.Json.Newtonsoft; - -public class AbpJsonIsoDateTimeConverter : IsoDateTimeConverter, ITransientDependency -{ - private readonly IClock _clock; - - public AbpJsonIsoDateTimeConverter(IClock clock, IOptions abpJsonOptions) - { - _clock = clock; - - if (abpJsonOptions.Value.DefaultDateTimeFormat != null) - { - DateTimeFormat = abpJsonOptions.Value.DefaultDateTimeFormat; - } - } - - public override bool CanConvert(Type objectType) - { - return objectType == typeof(DateTime) || objectType == typeof(DateTime?); - } - - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) - { - var date = base.ReadJson(reader, objectType, existingValue, serializer) as DateTime?; - - if (date.HasValue) - { - return _clock.Normalize(date.Value); - } - - return null; - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - var date = value as DateTime?; - base.WriteJson(writer, date.HasValue ? _clock.Normalize(date.Value) : value, serializer); - } - - internal static bool ShouldNormalize(MemberInfo member, JsonProperty property) - { - if (property.PropertyType != typeof(DateTime) && - property.PropertyType != typeof(DateTime?)) - { - return false; - } - - return ReflectionHelper.GetSingleAttributeOfMemberOrDeclaringTypeOrDefault(member) == null; - } -} diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs index 417037e776..366a933d13 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpDateTimeConverter.cs @@ -1,5 +1,6 @@ using System; using System.Globalization; +using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; using Microsoft.Extensions.Options; @@ -21,20 +22,23 @@ public class AbpDateTimeConverter : JsonConverter, ITransientDependenc public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (!_options.DefaultDateTimeFormat.IsNullOrWhiteSpace()) + if (_options.InputDateTimeFormats.Any()) { if (reader.TokenType == JsonTokenType.String) { - var s = reader.GetString(); - if (DateTime.TryParseExact(s, _options.DefaultDateTimeFormat, CultureInfo.CurrentUICulture, DateTimeStyles.None, out var d1)) + foreach (var format in _options.InputDateTimeFormats) { - return _clock.Normalize(d1); + var s = reader.GetString(); + if (DateTime.TryParseExact(s, format, CultureInfo.CurrentUICulture, DateTimeStyles.None, out var d1)) + { + return _clock.Normalize(d1); + } } - - throw new JsonException($"'{s}' can't parse to DateTime({_options.DefaultDateTimeFormat})!"); } - - throw new JsonException("Reader's TokenType is not String!"); + else + { + throw new JsonException("Reader's TokenType is not String!"); + } } if (reader.TryGetDateTime(out var d3)) @@ -47,13 +51,13 @@ public class AbpDateTimeConverter : JsonConverter, ITransientDependenc public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) { - if (_options.DefaultDateTimeFormat.IsNullOrWhiteSpace()) + if (_options.OutputDateTimeFormat.IsNullOrWhiteSpace()) { writer.WriteStringValue(_clock.Normalize(value)); } else { - writer.WriteStringValue(_clock.Normalize(value).ToString(_options.DefaultDateTimeFormat, CultureInfo.CurrentUICulture)); + writer.WriteStringValue(_clock.Normalize(value).ToString(_options.OutputDateTimeFormat, CultureInfo.CurrentUICulture)); } } } diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableDateTimeConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableDateTimeConverter.cs index 8b3459fcce..da5983250d 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableDateTimeConverter.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableDateTimeConverter.cs @@ -1,5 +1,6 @@ using System; using System.Globalization; +using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; using Microsoft.Extensions.Options; @@ -21,20 +22,23 @@ public class AbpNullableDateTimeConverter : JsonConverter, ITransient public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - if (!_options.DefaultDateTimeFormat.IsNullOrWhiteSpace()) + if (_options.InputDateTimeFormats.Any()) { if (reader.TokenType == JsonTokenType.String) { - var s = reader.GetString(); - if (DateTime.TryParseExact(s, _options.DefaultDateTimeFormat, CultureInfo.CurrentUICulture, DateTimeStyles.None, out var d1)) + foreach (var format in _options.InputDateTimeFormats) { - return _clock.Normalize(d1); + var s = reader.GetString(); + if (DateTime.TryParseExact(s, format, CultureInfo.CurrentUICulture, DateTimeStyles.None, out var d1)) + { + return _clock.Normalize(d1); + } } - - throw new JsonException($"'{s}' can't parse to DateTime({_options.DefaultDateTimeFormat})!"); } - - throw new JsonException("Reader's TokenType is not String!"); + else + { + throw new JsonException("Reader's TokenType is not String!"); + } } if (reader.TryGetDateTime(out var d2)) @@ -53,13 +57,13 @@ public class AbpNullableDateTimeConverter : JsonConverter, ITransient } else { - if (_options.DefaultDateTimeFormat.IsNullOrWhiteSpace()) + if (_options.OutputDateTimeFormat.IsNullOrWhiteSpace()) { writer.WriteStringValue(_clock.Normalize(value.Value)); } else { - writer.WriteStringValue(_clock.Normalize(value.Value).ToString(_options.DefaultDateTimeFormat, CultureInfo.CurrentUICulture)); + writer.WriteStringValue(_clock.Normalize(value.Value).ToString(_options.OutputDateTimeFormat, CultureInfo.CurrentUICulture)); } } } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Json/JsonResultController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Json/JsonResultController_Tests.cs index 851ef88db8..e7015313cb 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Json/JsonResultController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Json/JsonResultController_Tests.cs @@ -14,7 +14,7 @@ public class JsonResultController_Tests : AspNetCoreMvcTestBase { services.Configure(options => { - options.DefaultDateTimeFormat = "yyyy*MM*dd"; + options.OutputDateTimeFormat = "yyyy*MM*dd"; }); base.ConfigureServices(context, services); diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Json/JsonSerializer_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Json/JsonSerializer_Tests.cs index 2f986c89c3..1613e4bb49 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Json/JsonSerializer_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Json/JsonSerializer_Tests.cs @@ -21,7 +21,7 @@ public class JsonSerializer_Tests : AspNetCoreMvcTestBase { services.Configure(options => { - options.DefaultDateTimeFormat = "yyyy*MM*dd"; + options.OutputDateTimeFormat = "yyyy*MM*dd"; }); base.ConfigureServices(context, services); diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpSystemTextJsonSerializerProvider_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpSystemTextJsonSerializerProvider_Tests.cs index f9823e7d65..f605914d6e 100644 --- a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpSystemTextJsonSerializerProvider_Tests.cs +++ b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpSystemTextJsonSerializerProvider_Tests.cs @@ -220,7 +220,8 @@ public class AbpSystemTextJsonSerializerProvider_DateTimeFormat_Tests : AbpSyste { services.Configure(options => { - options.DefaultDateTimeFormat = "yyyy*MM*dd"; + options.InputDateTimeFormats.Add("yyyy*MM*dd"); + options.OutputDateTimeFormat = "yyyy*MM*dd HH*mm*ss"; }); } @@ -233,8 +234,12 @@ public class AbpSystemTextJsonSerializerProvider_DateTimeFormat_Tests : AbpSyste file.CreationTime.Month.ShouldBe(11); file.CreationTime.Day.ShouldBe(20); - var newJson = JsonSerializer.Serialize(file); - newJson.ShouldBe(json); + json = JsonSerializer.Serialize(new FileWithDatetime() + { + Name = "abp", + CreationTime = new DateTime(2020, 11, 20, 12, 34, 56) + }); + json.ShouldContain("\"2020*11*20 12*34*56\""); } [Fact] @@ -256,8 +261,12 @@ public class AbpSystemTextJsonSerializerProvider_DateTimeFormat_Tests : AbpSyste file.CreationTime.Value.Month.ShouldBe(11); file.CreationTime.Value.Day.ShouldBe(20); - var newJson = JsonSerializer.Serialize(file); - newJson.ShouldBe(json); + json = JsonSerializer.Serialize(new FileWithDatetime() + { + Name = "abp", + CreationTime = new DateTime(2020, 11, 20, 12, 34, 56) + }); + json.ShouldContain("\"2020*11*20 12*34*56\""); } } From 866104e071480fcd15c2faa2cf6a143b7f199049 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 25 Aug 2022 15:29:46 +0800 Subject: [PATCH 031/362] Update package target to net7.0. --- .../Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.csproj | 2 +- .../Volo.Abp.AspNetCore.Mvc.Dapr.csproj | 2 +- framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj | 2 +- .../Volo.Abp.DistributedLocking.Dapr.csproj | 2 +- .../src/Volo.Abp.EventBus.Dapr/Volo.Abp.EventBus.Dapr.csproj | 2 +- .../Volo.Abp.Http.Client.Dapr/Volo.Abp.Http.Client.Dapr.csproj | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.csproj index 78b46cad27..e1ede9fe69 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 enable enable diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.csproj index d792a30b24..0c72d5acc5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 enable enable diff --git a/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj b/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj index d3a8651086..ab079747e9 100644 --- a/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj +++ b/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 enable enable diff --git a/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.csproj b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.csproj index 80cad677a3..4adc11cef7 100644 --- a/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.csproj +++ b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 enable enable diff --git a/framework/src/Volo.Abp.EventBus.Dapr/Volo.Abp.EventBus.Dapr.csproj b/framework/src/Volo.Abp.EventBus.Dapr/Volo.Abp.EventBus.Dapr.csproj index 2bef3f9dc9..95cd73dbfd 100644 --- a/framework/src/Volo.Abp.EventBus.Dapr/Volo.Abp.EventBus.Dapr.csproj +++ b/framework/src/Volo.Abp.EventBus.Dapr/Volo.Abp.EventBus.Dapr.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 enable enable diff --git a/framework/src/Volo.Abp.Http.Client.Dapr/Volo.Abp.Http.Client.Dapr.csproj b/framework/src/Volo.Abp.Http.Client.Dapr/Volo.Abp.Http.Client.Dapr.csproj index 909fb156c8..610203dae5 100644 --- a/framework/src/Volo.Abp.Http.Client.Dapr/Volo.Abp.Http.Client.Dapr.csproj +++ b/framework/src/Volo.Abp.Http.Client.Dapr/Volo.Abp.Http.Client.Dapr.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 enable enable From cfa60f3a5f2db0ddd8a944761c3d23ac12d6bc61 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 25 Aug 2022 20:09:11 +0800 Subject: [PATCH 032/362] Remove `Newtonsoft` from `feature-management`. --- ...ureManagementApplicationContractsModule.cs | 6 - .../NewtonsoftStringValueTypeJsonConverter.cs | 95 -------------- ...ewtonsoftStringValueJsonConverter_Tests.cs | 16 --- .../StringValueJsonConverter_Tests.cs | 122 ------------------ ...mTextJsonStringValueJsonConverter_Tests.cs | 118 ++++++++++++++++- 5 files changed, 112 insertions(+), 245 deletions(-) delete mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/NewtonsoftStringValueTypeJsonConverter.cs delete mode 100644 modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/NewtonsoftStringValueJsonConverter_Tests.cs delete mode 100644 modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/StringValueJsonConverter_Tests.cs diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/AbpFeatureManagementApplicationContractsModule.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/AbpFeatureManagementApplicationContractsModule.cs index cfbcf1c95e..b94459dc68 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/AbpFeatureManagementApplicationContractsModule.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/AbpFeatureManagementApplicationContractsModule.cs @@ -4,7 +4,6 @@ using Volo.Abp.Application; using Volo.Abp.Authorization; using Volo.Abp.FeatureManagement.JsonConverters; using Volo.Abp.Json; -using Volo.Abp.Json.Newtonsoft; using Volo.Abp.Json.SystemTextJson; using Volo.Abp.Modularity; using Volo.Abp.VirtualFileSystem; @@ -32,11 +31,6 @@ public class AbpFeatureManagementApplicationContractsModule : AbpModule contractsOptionsActions.Configure(options); }); - Configure(options => - { - options.Converters.Add(); - }); - Configure(options => { options.JsonSerializerOptions.Converters.AddIfNotContains(new StringValueTypeJsonConverter(contractsOptionsActions.Configure())); diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/NewtonsoftStringValueTypeJsonConverter.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/NewtonsoftStringValueTypeJsonConverter.cs deleted file mode 100644 index aa9a913718..0000000000 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/NewtonsoftStringValueTypeJsonConverter.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Microsoft.Extensions.Options; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Validation.StringValues; - -namespace Volo.Abp.FeatureManagement.JsonConverters; - -public class NewtonsoftStringValueTypeJsonConverter : JsonConverter, ITransientDependency -{ - public override bool CanWrite => false; - - protected readonly AbpFeatureManagementApplicationContractsOptions Options; - - public NewtonsoftStringValueTypeJsonConverter(IOptions options) - { - Options = options.Value; - } - - public override bool CanConvert(Type objectType) - { - return objectType == typeof(IStringValueType); - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - throw new NotImplementedException("This method should not be called to write (since CanWrite is false)."); - } - - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) - { - if (reader.TokenType != JsonToken.StartObject) - { - return null; - } - - var jsonObject = JObject.Load(reader); - - var stringValue = CreateStringValueTypeByName(jsonObject, jsonObject["name"].ToString()); - foreach (var o in serializer.Deserialize>( - new JsonTextReader(new StringReader(jsonObject["properties"].ToString())))) - { - stringValue[o.Key] = o.Value; - } - - stringValue.Validator = CreateValueValidatorByName(jsonObject["validator"], jsonObject["validator"]["name"].ToString()); - foreach (var o in serializer.Deserialize>( - new JsonTextReader(new StringReader(jsonObject["validator"]["properties"].ToString())))) - { - stringValue.Validator[o.Key] = o.Value; - } - - return stringValue; - } - - protected virtual IStringValueType CreateStringValueTypeByName(JObject jObject, string name) - { - if (name == "SelectionStringValueType") - { - var selectionStringValueType = new SelectionStringValueType(); - if (jObject["itemSource"].HasValues) - { - selectionStringValueType.ItemSource = new StaticSelectionStringValueItemSource(jObject["itemSource"]["items"] - .Select(item => new LocalizableSelectionStringValueItem() - { - Value = item["value"].ToString(), - DisplayText = new LocalizableStringInfo(item["displayText"]["resourceName"].ToString(), item["displayText"]["name"].ToString()) - }).ToArray()); - } - - return selectionStringValueType; - } - - return name switch - { - "FreeTextStringValueType" => new FreeTextStringValueType(), - "ToggleStringValueType" => new ToggleStringValueType(), - _ => throw new ArgumentException($"{nameof(IStringValueType)} named {name} was not found!") - }; - } - - protected virtual IValueValidator CreateValueValidatorByName(JToken jObject, string name) - { - foreach (var factory in Options.ValueValidatorFactory.Where(factory => factory.CanCreate(name))) - { - return factory.Create(); - } - - throw new ArgumentException($"{nameof(IValueValidator)} named {name} was cannot be created!"); - } -} diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/NewtonsoftStringValueJsonConverter_Tests.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/NewtonsoftStringValueJsonConverter_Tests.cs deleted file mode 100644 index 4a8a1a36be..0000000000 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/NewtonsoftStringValueJsonConverter_Tests.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Json; -using Volo.Abp.Json.SystemTextJson; - -namespace Volo.Abp.FeatureManagement; - -public class NewtonsoftStringValueJsonConverter_Tests : StringValueJsonConverter_Tests -{ - protected override void AfterAddApplication(IServiceCollection services) - { - services.PreConfigure(options => - { - options.Providers.Remove(); - }); - } -} diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/StringValueJsonConverter_Tests.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/StringValueJsonConverter_Tests.cs deleted file mode 100644 index 28b8e55052..0000000000 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/StringValueJsonConverter_Tests.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.Extensions.DependencyInjection; -using Shouldly; -using Volo.Abp.FeatureManagement.JsonConverters; -using Volo.Abp.Json; -using Volo.Abp.Validation.StringValues; -using Xunit; - -namespace Volo.Abp.FeatureManagement; - -public abstract class StringValueJsonConverter_Tests : FeatureManagementApplicationTestBase -{ - private readonly IJsonSerializer _jsonSerializer; - - public StringValueJsonConverter_Tests() - { - _jsonSerializer = GetRequiredService(); - } - - protected override void BeforeAddApplication(IServiceCollection services) - { - services.PreConfigure(options => - { - options.ValueValidatorFactory.Add(new ValueValidatorFactory("URL")); - }); - - base.BeforeAddApplication(services); - } - - [Fact] - public void Should_Serialize_And_Deserialize() - { - var featureListDto = new GetFeatureListResultDto - { - Groups = new List - { - new FeatureGroupDto - { - Name = "MyGroup", - DisplayName = "MyGroup", - Features = new List - { - new FeatureDto - { - ValueType = new FreeTextStringValueType - { - Validator = new BooleanValueValidator() - } - }, - new FeatureDto - { - ValueType = new SelectionStringValueType - { - ItemSource = new StaticSelectionStringValueItemSource( - new LocalizableSelectionStringValueItem - { - Value = "TestValue", - DisplayText = new LocalizableStringInfo("TestResourceName", "TestName") - }), - Validator = new AlwaysValidValueValidator() - } - }, - new FeatureDto - { - ValueType = new ToggleStringValueType - { - Validator = new NumericValueValidator - { - MaxValue = 1000, - MinValue = 10 - } - } - }, - new FeatureDto - { - Provider = new FeatureProviderDto - { - Name = "FeatureName", - Key = "FeatureKey" - } - }, - new FeatureDto - { - ValueType = new FreeTextStringValueType - { - Validator = new UrlValueValidator("https") - } - } - } - } - } - }; - - var serialized = _jsonSerializer.Serialize(featureListDto, indented: true); - - var featureListDto2 = _jsonSerializer.Deserialize(serialized); - - featureListDto2.ShouldNotBeNull(); - featureListDto2.Groups[0].Features[0].ValueType.ShouldBeOfType(); - featureListDto2.Groups[0].Features[0].ValueType.Validator.ShouldBeOfType(); - - featureListDto2.Groups[0].Features[1].ValueType.ShouldBeOfType(); - featureListDto2.Groups[0].Features[1].ValueType.Validator.ShouldBeOfType(); - featureListDto2.Groups[0].Features[1].ValueType.As().ItemSource.Items.ShouldBeOfType(); - featureListDto2.Groups[0].Features[1].ValueType.As().ItemSource.Items.ShouldContain(x => - x.Value == "TestValue" && x.DisplayText.ResourceName == "TestResourceName" && - x.DisplayText.Name == "TestName"); - - featureListDto2.Groups[0].Features[2].ValueType.ShouldBeOfType(); - featureListDto2.Groups[0].Features[2].ValueType.Validator.ShouldBeOfType(); - featureListDto2.Groups[0].Features[2].ValueType.Validator.As().MaxValue.ShouldBe(1000); - featureListDto2.Groups[0].Features[2].ValueType.Validator.As().MinValue.ShouldBe(10); - - featureListDto2.Groups[0].Features[3].Provider.Name.ShouldBe("FeatureName"); - featureListDto2.Groups[0].Features[3].Provider.Key.ShouldBe("FeatureKey"); - - featureListDto2.Groups[0].Features[4].ValueType.ShouldBeOfType(); - featureListDto2.Groups[0].Features[4].ValueType.Validator.ShouldBeOfType(); - featureListDto2.Groups[0].Features[4].ValueType.Validator.As().Scheme.ShouldBe("https"); - } -} diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/SystemTextJsonStringValueJsonConverter_Tests.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/SystemTextJsonStringValueJsonConverter_Tests.cs index e51f9885ac..828d5b3814 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/SystemTextJsonStringValueJsonConverter_Tests.cs +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/SystemTextJsonStringValueJsonConverter_Tests.cs @@ -1,16 +1,122 @@ -using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Volo.Abp.FeatureManagement.JsonConverters; using Volo.Abp.Json; -using Volo.Abp.Json.Newtonsoft; +using Volo.Abp.Validation.StringValues; +using Xunit; namespace Volo.Abp.FeatureManagement; -public class SystemTextJsonStringValueJsonConverter_Tests : StringValueJsonConverter_Tests +public class SystemTextJsonStringValueJsonConverter_Tests : FeatureManagementApplicationTestBase { - protected override void AfterAddApplication(IServiceCollection services) + private readonly IJsonSerializer _jsonSerializer; + + public SystemTextJsonStringValueJsonConverter_Tests() + { + _jsonSerializer = GetRequiredService(); + } + + protected override void BeforeAddApplication(IServiceCollection services) { - services.PreConfigure(options => + services.PreConfigure(options => { - options.Providers.Remove(); + options.ValueValidatorFactory.Add(new ValueValidatorFactory("URL")); }); + + base.BeforeAddApplication(services); + } + + [Fact] + public void Should_Serialize_And_Deserialize() + { + var featureListDto = new GetFeatureListResultDto + { + Groups = new List + { + new FeatureGroupDto + { + Name = "MyGroup", + DisplayName = "MyGroup", + Features = new List + { + new FeatureDto + { + ValueType = new FreeTextStringValueType + { + Validator = new BooleanValueValidator() + } + }, + new FeatureDto + { + ValueType = new SelectionStringValueType + { + ItemSource = new StaticSelectionStringValueItemSource( + new LocalizableSelectionStringValueItem + { + Value = "TestValue", + DisplayText = new LocalizableStringInfo("TestResourceName", "TestName") + }), + Validator = new AlwaysValidValueValidator() + } + }, + new FeatureDto + { + ValueType = new ToggleStringValueType + { + Validator = new NumericValueValidator + { + MaxValue = 1000, + MinValue = 10 + } + } + }, + new FeatureDto + { + Provider = new FeatureProviderDto + { + Name = "FeatureName", + Key = "FeatureKey" + } + }, + new FeatureDto + { + ValueType = new FreeTextStringValueType + { + Validator = new UrlValueValidator("https") + } + } + } + } + } + }; + + var serialized = _jsonSerializer.Serialize(featureListDto, indented: true); + + var featureListDto2 = _jsonSerializer.Deserialize(serialized); + + featureListDto2.ShouldNotBeNull(); + featureListDto2.Groups[0].Features[0].ValueType.ShouldBeOfType(); + featureListDto2.Groups[0].Features[0].ValueType.Validator.ShouldBeOfType(); + + featureListDto2.Groups[0].Features[1].ValueType.ShouldBeOfType(); + featureListDto2.Groups[0].Features[1].ValueType.Validator.ShouldBeOfType(); + featureListDto2.Groups[0].Features[1].ValueType.As().ItemSource.Items.ShouldBeOfType(); + featureListDto2.Groups[0].Features[1].ValueType.As().ItemSource.Items.ShouldContain(x => + x.Value == "TestValue" && x.DisplayText.ResourceName == "TestResourceName" && + x.DisplayText.Name == "TestName"); + + featureListDto2.Groups[0].Features[2].ValueType.ShouldBeOfType(); + featureListDto2.Groups[0].Features[2].ValueType.Validator.ShouldBeOfType(); + featureListDto2.Groups[0].Features[2].ValueType.Validator.As().MaxValue.ShouldBe(1000); + featureListDto2.Groups[0].Features[2].ValueType.Validator.As().MinValue.ShouldBe(10); + + featureListDto2.Groups[0].Features[3].Provider.Name.ShouldBe("FeatureName"); + featureListDto2.Groups[0].Features[3].Provider.Key.ShouldBe("FeatureKey"); + + featureListDto2.Groups[0].Features[4].ValueType.ShouldBeOfType(); + featureListDto2.Groups[0].Features[4].ValueType.Validator.ShouldBeOfType(); + featureListDto2.Groups[0].Features[4].ValueType.Validator.As().Scheme.ShouldBe("https"); } } From 4cbaff3ee7a66a7102b347b937232eb42edde3ad Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Thu, 25 Aug 2022 17:34:07 +0300 Subject: [PATCH 033/362] Add layout notfound error in dynamic layout. --- .../src/lib/components/dynamic-layout.component.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts index 61846ad126..a411fa0ba9 100644 --- a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts +++ b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts @@ -82,7 +82,19 @@ export class DynamicLayoutComponent { const key = this.layouts.get(expectedLayout); this.layout = this.getComponent(key)?.component; this.layoutKey = expectedLayout; + if(!this.layout){ + this.showLayoutNotFoundError(expectedLayout); + } + } + + showLayoutNotFoundError(layoutName: string) { + let message = `Layout ${layoutName} not found.`; + if(layoutName === 'account'){ + message = 'Account layout not found. Please check your configuration. If you are using LeptonX, please make sure you have added "AccountLayoutModule.forRoot()" to your app.module configuration.'; + } + console.error(message); } + private listenToLanguageChange() { this.subscription.addOne(this.localizationService.languageChange$, () => { From 291c07155da9920e01f58684f87122750d708b0b Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 26 Aug 2022 11:27:18 +0800 Subject: [PATCH 034/362] Add `AbpIgnorePropertiesModifiers`. --- ...ystemTextJsonSerializerModifiersOptions.cs | 2 +- .../Modifiers/AbpIgnorePropertiesModifiers.cs | 26 +++++++ ... => AbpIncludeExtraPropertiesModifiers.cs} | 13 ++-- ...AbpIncludeNonPublicPropertiesModifiers.cs} | 15 ++-- .../AbpIgnorePropertiesModifiers_Tests.cs | 73 +++++++++++++++++++ ...cludeNonPublicPropertiesModifiers_Tests.cs | 61 ++++++++++++++++ .../Volo/Abp/Json/ExtensibleObject_Tests.cs | 2 +- 7 files changed, 179 insertions(+), 13 deletions(-) create mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIgnorePropertiesModifiers.cs rename framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/{IncludeExtraPropertiesModifiers.cs => AbpIncludeExtraPropertiesModifiers.cs} (54%) rename framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/{IncludeNonPublicPropertiesModifiers.cs => AbpIncludeNonPublicPropertiesModifiers.cs} (61%) create mode 100644 framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpIgnorePropertiesModifiers_Tests.cs create mode 100644 framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpIncludeNonPublicPropertiesModifiers_Tests.cs diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptions.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptions.cs index efc0a6a883..5b59a7583d 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptions.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerModifiersOptions.cs @@ -14,7 +14,7 @@ public class AbpSystemTextJsonSerializerModifiersOptions { Modifiers = new List> { - IncludeExtraPropertiesModifiers.Modify, + AbpIncludeExtraPropertiesModifiers.Modify, }; } } diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIgnorePropertiesModifiers.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIgnorePropertiesModifiers.cs new file mode 100644 index 0000000000..6eff57bfbf --- /dev/null +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIgnorePropertiesModifiers.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Text.Json.Serialization.Metadata; + +namespace Volo.Abp.Json.SystemTextJson.Modifiers; + +public class AbpIgnorePropertiesModifiers + where TClass : class +{ + private Expression> _propertySelector; + + public Action CreateModifyAction(Expression> propertySelector) + { + _propertySelector = propertySelector; + return Modify; + } + + public void Modify(JsonTypeInfo jsonTypeInfo) + { + if (jsonTypeInfo.Type == typeof(TClass)) + { + jsonTypeInfo.Properties.RemoveAll(x => x.Name == _propertySelector.Body.As().Member.Name); + } + } +} diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeExtraPropertiesModifiers.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeExtraPropertiesModifiers.cs similarity index 54% rename from framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeExtraPropertiesModifiers.cs rename to framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeExtraPropertiesModifiers.cs index a3168fa76f..edb0b121b7 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeExtraPropertiesModifiers.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeExtraPropertiesModifiers.cs @@ -1,19 +1,22 @@ using System; using System.Linq; +using System.Reflection; using System.Text.Json.Serialization.Metadata; using Volo.Abp.Data; using Volo.Abp.ObjectExtending; namespace Volo.Abp.Json.SystemTextJson.Modifiers; -public static class IncludeExtraPropertiesModifiers +public static class AbpIncludeExtraPropertiesModifiers { public static void Modify(JsonTypeInfo jsonTypeInfo) { - var propertyJsonInfo = jsonTypeInfo.Properties.FirstOrDefault(x => - x.PropertyType == typeof(ExtraPropertyDictionary) && - x.Name.Equals(nameof(ExtensibleObject.ExtraProperties), StringComparison.OrdinalIgnoreCase) && - x.Set == null); + var propertyJsonInfo = jsonTypeInfo.Properties + .Where(x => x.AttributeProvider != null && x.AttributeProvider is MemberInfo) + .FirstOrDefault(x => + x.PropertyType == typeof(ExtraPropertyDictionary) && + x.AttributeProvider.As().Name == nameof(ExtensibleObject.ExtraProperties) && + x.Set == null); if (propertyJsonInfo != null) { diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeNonPublicPropertiesModifiers.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeNonPublicPropertiesModifiers.cs similarity index 61% rename from framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeNonPublicPropertiesModifiers.cs rename to framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeNonPublicPropertiesModifiers.cs index fcca1d672c..2005bb4f5e 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/IncludeNonPublicPropertiesModifiers.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeNonPublicPropertiesModifiers.cs @@ -1,17 +1,19 @@ using System; using System.Linq; +using System.Linq.Expressions; +using System.Reflection; using System.Text.Json.Serialization.Metadata; namespace Volo.Abp.Json.SystemTextJson.Modifiers; -public class IncludeNonPublicPropertiesModifiers +public class AbpIncludeNonPublicPropertiesModifiers where TClass : class { - private string _propertyName; + private Expression> _propertySelector; - public Action CreateModifyAction(string propertyName) + public Action CreateModifyAction(Expression> propertySelector) { - _propertyName = propertyName; + _propertySelector = propertySelector; return Modify; } @@ -19,10 +21,11 @@ public class IncludeNonPublicPropertiesModifiers { if (jsonTypeInfo.Type == typeof(TClass)) { - var propertyJsonInfo = jsonTypeInfo.Properties.FirstOrDefault(x => x.Name.Equals(_propertyName, StringComparison.OrdinalIgnoreCase) && x.Set == null); + var propertyName = _propertySelector.Body.As().Member.Name; + var propertyJsonInfo = jsonTypeInfo.Properties.FirstOrDefault(x => x.Name == propertyName && x.Set == null); if (propertyJsonInfo != null) { - var propertyInfo = typeof(TClass).GetProperty(_propertyName); + var propertyInfo = typeof(TClass).GetProperty(propertyName, BindingFlags.NonPublic); if (propertyInfo != null) { var jsonPropertyInfo = jsonTypeInfo.CreateJsonPropertyInfo(typeof(TProperty), propertyJsonInfo.Name); diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpIgnorePropertiesModifiers_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpIgnorePropertiesModifiers_Tests.cs new file mode 100644 index 0000000000..138ffd46a7 --- /dev/null +++ b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpIgnorePropertiesModifiers_Tests.cs @@ -0,0 +1,73 @@ +using System.Collections.Generic; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Volo.Abp.Json.SystemTextJson; +using Volo.Abp.Json.SystemTextJson.Modifiers; +using Xunit; + +namespace Volo.Abp.Json; + +public class AbpIgnorePropertiesModifiers_Tests : AbpJsonTestBase +{ + private readonly IJsonSerializer _jsonSerializer; + + public AbpIgnorePropertiesModifiers_Tests() + { + _jsonSerializer = GetRequiredService(); + } + + protected override void AfterAddApplication(IServiceCollection services) + { + services.Configure(options => + { + options.Modifiers.Add(new AbpIgnorePropertiesModifiers>().CreateModifyAction(x => x.BarDtos)); + options.Modifiers.Add(new AbpIgnorePropertiesModifiers().CreateModifyAction(x => x.Id)); + }); + + base.AfterAddApplication(services); + } + + [Fact] + public void Test() + { + var json = _jsonSerializer.Serialize(new FooDto() + { + Name = "foo", + BarDtos = new List + { + new BarDto + { + Name = "bar1" + }, + new BarDto + { + Name = "bar2" + } + } + }); + + json.ShouldNotContain("bar"); + + json = _jsonSerializer.Serialize(new BarDto() + { + Id = "id", + Name = "bar" + }); + + json.ShouldNotContain("id"); + } + + class FooDto + { + public string Name { get; set; } + + public List BarDtos { get; set; } + } + + class BarDto + { + public string Id { get; set; } + + public string Name { get; set; } + } +} diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpIncludeNonPublicPropertiesModifiers_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpIncludeNonPublicPropertiesModifiers_Tests.cs new file mode 100644 index 0000000000..d05ab2dfa0 --- /dev/null +++ b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpIncludeNonPublicPropertiesModifiers_Tests.cs @@ -0,0 +1,61 @@ +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Volo.Abp.Json.SystemTextJson; +using Volo.Abp.Json.SystemTextJson.Modifiers; +using Xunit; + +namespace Volo.Abp.Json; + +public class AbpIncludeNonPublicPropertiesModifiers_Tests : AbpJsonTestBase +{ + private readonly IJsonSerializer _jsonSerializer; + + public AbpIncludeNonPublicPropertiesModifiers_Tests() + { + _jsonSerializer = GetRequiredService(); + } + + protected override void AfterAddApplication(IServiceCollection services) + { + services.Configure(options => + { + options.Modifiers.Add(new AbpIncludeNonPublicPropertiesModifiers().CreateModifyAction(x => x.Name)); + options.Modifiers.Add(new AbpIncludeNonPublicPropertiesModifiers().CreateModifyAction(x => x.Age)); + }); + + base.AfterAddApplication(services); + } + + [Fact] + public void Test() + { + var json = _jsonSerializer.Serialize(new NonPublicPropertiesClass() + { + Id = "id" + }); + + json.ShouldContain("id"); + json.ShouldContain("name"); + json.ShouldContain("age"); + + var obj = _jsonSerializer.Deserialize(json); + obj.Id.ShouldBe("id"); + obj.Name.ShouldBe("name"); + obj.Age.ShouldBe("age"); + } + + class NonPublicPropertiesClass + { + public string Id { get; set; } + + public string Name { get; private set; } + + public string Age { get; protected set; } + + public NonPublicPropertiesClass() + { + Name = "name"; + Age = "age"; + } + } +} diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ExtensibleObject_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ExtensibleObject_Tests.cs index bdd41f20b6..a5bcb723db 100644 --- a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ExtensibleObject_Tests.cs +++ b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ExtensibleObject_Tests.cs @@ -7,7 +7,7 @@ using Xunit; namespace Volo.Abp.Json; -public class ExtensibleObject_Tests: AbpJsonTestBase +public class ExtensibleObject_Tests : AbpJsonTestBase { private readonly IJsonSerializer _jsonSerializer; From f99398b7c00053c0f051b7b56c4f50986ba2ef52 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 26 Aug 2022 13:16:08 +0800 Subject: [PATCH 035/362] Fix unit test. --- .../SystemTextJson/Modifiers/AbpIgnorePropertiesModifiers.cs | 5 ++++- .../Modifiers/AbpIncludeExtraPropertiesModifiers.cs | 2 +- .../Modifiers/AbpIncludeNonPublicPropertiesModifiers.cs | 5 ++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIgnorePropertiesModifiers.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIgnorePropertiesModifiers.cs index 6eff57bfbf..27a50395bf 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIgnorePropertiesModifiers.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIgnorePropertiesModifiers.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Reflection; using System.Text.Json.Serialization.Metadata; namespace Volo.Abp.Json.SystemTextJson.Modifiers; @@ -20,7 +21,9 @@ public class AbpIgnorePropertiesModifiers { if (jsonTypeInfo.Type == typeof(TClass)) { - jsonTypeInfo.Properties.RemoveAll(x => x.Name == _propertySelector.Body.As().Member.Name); + jsonTypeInfo.Properties.RemoveAll( + x => x.AttributeProvider is MemberInfo memberInfo && + memberInfo.Name == _propertySelector.Body.As().Member.Name); } } } diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeExtraPropertiesModifiers.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeExtraPropertiesModifiers.cs index edb0b121b7..d692c358eb 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeExtraPropertiesModifiers.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeExtraPropertiesModifiers.cs @@ -12,7 +12,7 @@ public static class AbpIncludeExtraPropertiesModifiers public static void Modify(JsonTypeInfo jsonTypeInfo) { var propertyJsonInfo = jsonTypeInfo.Properties - .Where(x => x.AttributeProvider != null && x.AttributeProvider is MemberInfo) + .Where(x => x.AttributeProvider is MemberInfo) .FirstOrDefault(x => x.PropertyType == typeof(ExtraPropertyDictionary) && x.AttributeProvider.As().Name == nameof(ExtensibleObject.ExtraProperties) && diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeNonPublicPropertiesModifiers.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeNonPublicPropertiesModifiers.cs index 2005bb4f5e..3721c3ffcd 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeNonPublicPropertiesModifiers.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpIncludeNonPublicPropertiesModifiers.cs @@ -22,7 +22,10 @@ public class AbpIncludeNonPublicPropertiesModifiers if (jsonTypeInfo.Type == typeof(TClass)) { var propertyName = _propertySelector.Body.As().Member.Name; - var propertyJsonInfo = jsonTypeInfo.Properties.FirstOrDefault(x => x.Name == propertyName && x.Set == null); + var propertyJsonInfo = jsonTypeInfo.Properties.FirstOrDefault(x => + x.AttributeProvider is MemberInfo memberInfo && + memberInfo.Name == propertyName && + x.Set == null); if (propertyJsonInfo != null) { var propertyInfo = typeof(TClass).GetProperty(propertyName, BindingFlags.NonPublic); From c22afaadd60f1f128315bc10eb4bbf741963b9ef Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 26 Aug 2022 16:05:27 +0800 Subject: [PATCH 036/362] Update JSON.md --- docs/en/JSON.md | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/docs/en/JSON.md b/docs/en/JSON.md index 29e93007af..d8979945a7 100644 --- a/docs/en/JSON.md +++ b/docs/en/JSON.md @@ -4,7 +4,7 @@ The ABP Framework provides an abstraction to work with JSON. Having such an abst * You can write library independent code. Therefore, you can change the underlying library with the minimum effort and code change. * You can use the predefined converters defined in the ABP without worrying about the underlying library's internal details. -> The JSON serialization system is implemented with the [Volo.Abp.Json](https://www.nuget.org/packages/Volo.Abp.Json) NuGet package. Most of the time, you don't need to manually [install it](https://abp.io/package-detail/Volo.Abp.Json) since it comes pre-installed with the [application startup template](Startup-Templates/Application.md). +> The JSON serialization system is implemented with the [Volo.Abp.Json](https://www.nuget.org/packages/Volo.Abp.Json) NuGet package([Volo.Abp.Json.SystemTextJson](https://www.nuget.org/packages/Volo.Abp.Json.SystemTextJson) is the default implementation). Most of the time, you don't need to manually [install it](https://abp.io/package-detail/Volo.Abp.Json) since it comes pre-installed with the [application startup template](Startup-Templates/Application.md). ## IJsonSerializer @@ -45,16 +45,24 @@ public class ProductManager `AbpJsonOptions` type provides options for the JSON operations in the ABP Framework. Properties: -* **DefaultDateTimeFormat(`string`)**: Default `DateTime` format. -* **UseHybridSerializer(`bool`)**: True by default. Boolean field indicating whether the ABP Framework uses the hybrid approach or not. If the field is true, it will try to use `System.Json.Text` to handle JSON if it can otherwise use the `Newtonsoft.Json.` -* **Providers(`ITypeList`)**: List of JSON serializer providers implementing the `IJsonSerializerProvider` interface. You can create and add custom serializers to the list, and the ABP Framework uses them automatically. When the `Serialize` or `Deserialize` method is called on the `IJsonSerializer` interface, the ABP Framework calls the `CanHandle` methods of the given providers in reverse order and uses the first provider that returns `true` to do the JSON operation. +* **InputDateTimeFormats(`List`)**: Formats of input JSON date, Empty string means default format. You can provide multiple formats to parse the date. +* **OutputDateTimeFormat(`bool`)**: Format of output json date, Null or empty string means default format. + +## System Text Json ### AbpSystemTextJsonSerializerOptions -`AbpSystemTextJsonSerializerOptions` provides options for `System.Text.Json` usage. +- **JsonSerializerOptions(`System.Text.Json.JsonSerializerOptions`)**: Global options for System.Text.Json library operations. See [here](https://docs.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializeroptions) for reference. -Properties: +### AbpSystemTextJsonSerializerModifiersOptions -- **JsonSerializerOptions(`System.Text.Json.JsonSerializerOptions`)**: Global options for System.Text.Json library operations. See [here](https://docs.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializeroptions) for reference. -- **UnsupportedTypes(`ITypeList`)**: List of the unsupported types. You can add types of the unsupported types to the list and, the hybrid JSON serializer automatically uses the `Newtonsoft.Json` library instead of `System.Text.Json`. +- **Modifiers(`List>`)**: Configure `Modifiers` of `DefaultJsonTypeInfoResolver`. See [here](https://devblogs.microsoft.com/dotnet/announcing-dotnet-7-preview-6/#json-contract-customization) for reference. + + +## Newtonsoft + +Add [Volo.Abp.Json.Newtonsoft](https://www.nuget.org/packages/Volo.Abp.Json.Newtonsoft) pcakge and `AbpJsonNewtonsoftModule` to replace the `System Text Json`. + +#### AbpNewtonsoftJsonSerializerOptions +- **JsonSerializerSettings(`Newtonsoft.Json.JsonSerializerSettings`)**: Global options for Newtonsoft library operations. See [here](https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonSerializerSettings.htm) for reference. From a5524a700594b1642d0ace516f4f77d5fa5edb25 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 7 Sep 2022 11:38:18 +0800 Subject: [PATCH 037/362] Add `SeedInSeparateUowAsync` method. --- .../Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs | 16 ++++++++++++---- .../Volo/Abp/Data/DataSeederExtensions.cs | 5 +++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs index 0f930d1f70..8b01bcde77 100644 --- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs @@ -25,13 +25,21 @@ public class DataSeeder : IDataSeeder, ITransientDependency { using (var scope = ServiceScopeFactory.CreateScope()) { + var manager = scope.ServiceProvider.GetRequiredService(); foreach (var contributorType in Options.Contributors) { - var contributor = (IDataSeedContributor)scope - .ServiceProvider - .GetRequiredService(contributorType); + using (var uow = manager.Begin( + requiresNew: context.Properties.ContainsKey(nameof(DataSeederExtensions.SeedInSeparateUowAsync)), + isTransactional: true)) + { + var contributor = (IDataSeedContributor)scope + .ServiceProvider + .GetRequiredService(contributorType); - await contributor.SeedAsync(context); + await contributor.SeedAsync(context); + + await uow.CompleteAsync(); + } } } } diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeederExtensions.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeederExtensions.cs index 83fa974d85..8d8d7126c9 100644 --- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeederExtensions.cs +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeederExtensions.cs @@ -9,4 +9,9 @@ public static class DataSeederExtensions { return seeder.SeedAsync(new DataSeedContext(tenantId)); } + + public static Task SeedInSeparateUowAsync(this IDataSeeder seeder, Guid? tenantId = null) + { + return seeder.SeedAsync(new DataSeedContext(tenantId).WithProperty(nameof(DataSeederExtensions.SeedInSeparateUowAsync), true)); + } } From e5f4f40d25d2a64014bfe05b75e3d1fcc832ab96 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 7 Sep 2022 13:09:25 +0800 Subject: [PATCH 038/362] Update DataSeeder.cs --- .../Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs index 8b01bcde77..2c3a467ce6 100644 --- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs @@ -25,20 +25,25 @@ public class DataSeeder : IDataSeeder, ITransientDependency { using (var scope = ServiceScopeFactory.CreateScope()) { - var manager = scope.ServiceProvider.GetRequiredService(); - foreach (var contributorType in Options.Contributors) + if (context.Properties.ContainsKey(nameof(DataSeederExtensions.SeedInSeparateUowAsync))) { - using (var uow = manager.Begin( - requiresNew: context.Properties.ContainsKey(nameof(DataSeederExtensions.SeedInSeparateUowAsync)), - isTransactional: true)) + var manager = scope.ServiceProvider.GetRequiredService(); + foreach (var contributorType in Options.Contributors) { - var contributor = (IDataSeedContributor)scope - .ServiceProvider - .GetRequiredService(contributorType); - + using (var uow = manager.Begin(requiresNew: true, isTransactional: true)) + { + var contributor = (IDataSeedContributor)scope.ServiceProvider.GetRequiredService(contributorType); + await contributor.SeedAsync(context); + await uow.CompleteAsync(); + } + } + } + else + { + foreach (var contributorType in Options.Contributors) + { + var contributor = (IDataSeedContributor)scope.ServiceProvider.GetRequiredService(contributorType); await contributor.SeedAsync(context); - - await uow.CompleteAsync(); } } } From 2bcf619e267829245f7e78cb78da627b9e11129b Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Wed, 7 Sep 2022 18:22:04 +0300 Subject: [PATCH 039/362] Add feature `When the user change personal info, the confirmation modal appear` --- .../Account/Localization/Resources/en.json | 2 + .../Account/Localization/Resources/tr.json | 2 + .../account/src/lib/account.module.ts | 5 ++ .../personal-settings.component.ts | 61 ++++++++++++++++--- .../account/src/lib/models/config-options.ts | 1 + .../packages/account/src/lib/tokens/index.ts | 1 + .../lib/tokens/re-login-confirmation.token.ts | 5 ++ 7 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 npm/ng-packs/packages/account/src/lib/tokens/re-login-confirmation.token.ts diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json index 17f05fe29b..9dafae13f3 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json @@ -34,6 +34,8 @@ "DisplayName:PhoneNumber": "Phone number", "PersonalSettings": "Personal settings", "PersonalSettingsSaved": "Personal settings saved", + "PersonalSettingsChangedConfirmationModalTitle": "Personal info changed", + "PersonalSettingsChangedConfirmationModalDescription": "If you want to apply these changes, you have to login. Do you want to log out?", "PasswordChanged": "Password changed", "NewPasswordConfirmFailed": "Please confirm the new password.", "Manage": "Manage", diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json index 6edaf2c1c4..d7d2454b6f 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json @@ -34,6 +34,8 @@ "DisplayName:PhoneNumber": "Telefon numarası", "PersonalSettings": "Kişisel ayarlar", "PersonalSettingsSaved": "Kişisel ayarlar kaydedildi", + "PersonalSettingsChangedConfirmationModalTitle": "Personal info changed", + "PersonalSettingsChangedConfirmationModalDescription": "If you want to apply these changes, you have to login. Do you want to log out?", "PasswordChanged": "Şifre değiştirildi", "NewPasswordConfirmFailed": "Lütfen yeni şifreyi onaylayın.", "Manage": "Manage", diff --git a/npm/ng-packs/packages/account/src/lib/account.module.ts b/npm/ng-packs/packages/account/src/lib/account.module.ts index bfa37d4bfa..d04f931a0f 100644 --- a/npm/ng-packs/packages/account/src/lib/account.module.ts +++ b/npm/ng-packs/packages/account/src/lib/account.module.ts @@ -15,6 +15,7 @@ import { accountConfigOptionsFactory } from './utils/factory-utils'; import { AuthenticationFlowGuard } from './guards/authentication-flow.guard'; import { ForgotPasswordComponent } from './components/forgot-password/forgot-password.component'; import { ResetPasswordComponent } from './components/reset-password/reset-password.component'; +import { RE_LOGIN_CONFIRMATION_TOKEN } from './tokens'; const declarations = [ LoginComponent, @@ -49,6 +50,10 @@ export class AccountModule { useFactory: accountConfigOptionsFactory, deps: [ACCOUNT_CONFIG_OPTIONS], }, + { + provide: RE_LOGIN_CONFIRMATION_TOKEN, + useValue: options.isPersonalSettingsChangedConfirmationActive ?? true, + }, ], }; } diff --git a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts index d15df99878..ec75ab96ef 100644 --- a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts +++ b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts @@ -1,10 +1,12 @@ -import { ProfileService } from '@abp/ng.account.core/proxy'; -import { ToasterService } from '@abp/ng.theme.shared'; -import { Component, OnInit } from '@angular/core'; +import { ProfileDto, ProfileService } from '@abp/ng.account.core/proxy'; +import { Confirmation, ConfirmationService, ToasterService } from '@abp/ng.theme.shared'; +import { Component, Inject, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { finalize } from 'rxjs/operators'; +import { finalize, filter } from 'rxjs/operators'; import { Account } from '../../models/account'; import { ManageProfileStateService } from '../../services/manage-profile.state.service'; +import { AuthService } from '@abp/ng.core'; +import { RE_LOGIN_CONFIRMATION_TOKEN } from '../../tokens'; const { maxLength, required, email } = Validators; @@ -22,12 +24,17 @@ export class PersonalSettingsComponent form: FormGroup; inProgress: boolean; + private profile: ProfileDto; constructor( private fb: FormBuilder, private toasterService: ToasterService, private profileService: ProfileService, private manageProfileState: ManageProfileStateService, + private readonly authService: AuthService, + private confirmationService: ConfirmationService, + @Inject(RE_LOGIN_CONFIRMATION_TOKEN) + private isPersonalSettingsChangedConfirmationActive: boolean, ) {} ngOnInit() { @@ -35,18 +42,19 @@ export class PersonalSettingsComponent } buildForm() { - const profile = this.manageProfileState.getProfile(); + this.profile = this.manageProfileState.getProfile(); this.form = this.fb.group({ - userName: [profile.userName, [required, maxLength(256)]], - email: [profile.email, [required, email, maxLength(256)]], - name: [profile.name || '', [maxLength(64)]], - surname: [profile.surname || '', [maxLength(64)]], - phoneNumber: [profile.phoneNumber || '', [maxLength(16)]], + userName: [this.profile.userName, [required, maxLength(256)]], + email: [this.profile.email, [required, email, maxLength(256)]], + name: [this.profile.name || '', [maxLength(64)]], + surname: [this.profile.surname || '', [maxLength(64)]], + phoneNumber: [this.profile.phoneNumber || '', [maxLength(16)]], }); } submit() { if (this.form.invalid) return; + const isLogOutConfirmMessageVisible = this.isLogoutConfirmMessageActive(); this.inProgress = true; this.profileService .update(this.form.value) @@ -54,6 +62,39 @@ export class PersonalSettingsComponent .subscribe(profile => { this.manageProfileState.setProfile(profile); this.toasterService.success('AbpAccount::PersonalSettingsSaved', 'Success', { life: 5000 }); + if (isLogOutConfirmMessageVisible) { + this.showLogoutConfirmMessage(); + } }); } + + isDataSame(oldValue, newValue) { + return Object.entries(oldValue).some(([key, value]) => { + if (key in newValue) { + return value !== newValue[key]; + } + return false; + }); + } + + logoutConfirmation = () => { + this.authService.logout().subscribe(); + }; + + private isLogoutConfirmMessageActive() { + if (!this.isPersonalSettingsChangedConfirmationActive) { + return false; + } + return this.isDataSame(this.profile, this.form.value); + } + + private showLogoutConfirmMessage() { + this.confirmationService + .info( + 'AbpAccount::PersonalSettingsChangedConfirmationModalDescription', + 'AbpAccount::PersonalSettingsChangedConfirmationModalTitle', + ) + .pipe(filter(status => status === Confirmation.Status.confirm)) + .subscribe(this.logoutConfirmation); + } } diff --git a/npm/ng-packs/packages/account/src/lib/models/config-options.ts b/npm/ng-packs/packages/account/src/lib/models/config-options.ts index 898021b04e..1f6a15641d 100644 --- a/npm/ng-packs/packages/account/src/lib/models/config-options.ts +++ b/npm/ng-packs/packages/account/src/lib/models/config-options.ts @@ -1,3 +1,4 @@ export interface AccountConfigOptions { redirectUrl?: string; + isPersonalSettingsChangedConfirmationActive?: boolean; } diff --git a/npm/ng-packs/packages/account/src/lib/tokens/index.ts b/npm/ng-packs/packages/account/src/lib/tokens/index.ts index 0a88318130..9e126a7a1f 100644 --- a/npm/ng-packs/packages/account/src/lib/tokens/index.ts +++ b/npm/ng-packs/packages/account/src/lib/tokens/index.ts @@ -1 +1,2 @@ export * from './config-options.token'; +export * from './re-login-confirmation.token'; diff --git a/npm/ng-packs/packages/account/src/lib/tokens/re-login-confirmation.token.ts b/npm/ng-packs/packages/account/src/lib/tokens/re-login-confirmation.token.ts new file mode 100644 index 0000000000..8ca5375bab --- /dev/null +++ b/npm/ng-packs/packages/account/src/lib/tokens/re-login-confirmation.token.ts @@ -0,0 +1,5 @@ +import { InjectionToken } from '@angular/core'; + +export const RE_LOGIN_CONFIRMATION_TOKEN = new InjectionToken( + 'RE_LOGIN_CONFIRMATION_TOKEN', +); From f9991bdf503daaeef72739004b23a0d0799d9324 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Wed, 7 Sep 2022 18:22:19 +0300 Subject: [PATCH 040/362] Update Docs of Account-Module --- docs/en/UI/Angular/Account-Module.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/en/UI/Angular/Account-Module.md b/docs/en/UI/Angular/Account-Module.md index 3670a14f73..1b6be08f16 100644 --- a/docs/en/UI/Angular/Account-Module.md +++ b/docs/en/UI/Angular/Account-Module.md @@ -95,6 +95,24 @@ export class AppRoutingModule {} Before v4.3, the "My account" link in the current user dropdown on the top bar redirected the user to MVC's profile management page. As of v4.3, if you added the account module to your project, the same link will land on a page in the Angular UI account module instead. +### Personal Info Page Confirm Message + +When the user changes their own data on the personal settings tab in My Account, The data can not update the CurrentUser key of Application-Configuration. The information of the user is stored in claims. The only way to apply this information to the CurrentUser of Application-Configuration is user should log out and log in. When the Refresh-Token feature is implemented, it will be fixed. So We've added a confirmation alert. + +If you want to disable these warning, You should set `isPersonalSettingsChangedConfirmationActive` false + +```js +// app-routing.module.ts +const routes: Routes = [ + //... + { + path: 'account', + loadChildren: () => import('@volo/abp.ng.account/public').then(m => m.AccountPublicModule.forLazy({ isPersonalSettingsChangedConfirmationActive:false })), + }, + //... +export class AppRoutingModule {} +``` + ### Security Logs Page [COMMERCIAL] Before v4.3, the "Security Logs" link in the current user dropdown on the top bar redirected the user to MVC's security logs page. As of v4.3, if you added the account module to your project, the same link will land on a page in the Angular UI account public module instead. From fbc32f5f891f42a881266e58ecfa5d6f39c169e4 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 8 Sep 2022 14:28:05 +0800 Subject: [PATCH 041/362] Add `DataSeederExtensions_Tests`. --- .../Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs | 13 ++++-- .../Volo/Abp/Data/DataSeederExtensions.cs | 13 +++++- .../Abp/Data/DataSeederExtensions_Tests.cs | 43 +++++++++++++++++++ 3 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 framework/test/Volo.Abp.Data.Tests/Volo/Abp/Data/DataSeederExtensions_Tests.cs diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs index 2c3a467ce6..45729fcb86 100644 --- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs @@ -1,4 +1,6 @@ -using System.Threading.Tasks; +using System; +using System.Linq; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; @@ -25,12 +27,17 @@ public class DataSeeder : IDataSeeder, ITransientDependency { using (var scope = ServiceScopeFactory.CreateScope()) { - if (context.Properties.ContainsKey(nameof(DataSeederExtensions.SeedInSeparateUowAsync))) + if (context.Properties.ContainsKey(DataSeederExtensions.SeedInSeparateUow)) { var manager = scope.ServiceProvider.GetRequiredService(); foreach (var contributorType in Options.Contributors) { - using (var uow = manager.Begin(requiresNew: true, isTransactional: true)) + var options = context.Properties.TryGetValue(DataSeederExtensions.SeedInSeparateUowOptions, out var uowOptions) + ? (AbpUnitOfWorkOptions) uowOptions + : new AbpUnitOfWorkOptions(); + var requiresNew = context.Properties.TryGetValue(DataSeederExtensions.SeedInSeparateUowRequiresNew, out var obj) && (bool) obj; + + using (var uow = manager.Begin(options, requiresNew)) { var contributor = (IDataSeedContributor)scope.ServiceProvider.GetRequiredService(contributorType); await contributor.SeedAsync(context); diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeederExtensions.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeederExtensions.cs index 8d8d7126c9..bd17736b46 100644 --- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeederExtensions.cs +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeederExtensions.cs @@ -1,17 +1,26 @@ using System; using System.Threading.Tasks; +using Volo.Abp.Uow; namespace Volo.Abp.Data; public static class DataSeederExtensions { + public const string SeedInSeparateUow = "__SeedInSeparateUow"; + public const string SeedInSeparateUowOptions = "__SeedInSeparateUowOptions"; + public const string SeedInSeparateUowRequiresNew = "__SeedInSeparateUowRequiresNew"; + public static Task SeedAsync(this IDataSeeder seeder, Guid? tenantId = null) { return seeder.SeedAsync(new DataSeedContext(tenantId)); } - public static Task SeedInSeparateUowAsync(this IDataSeeder seeder, Guid? tenantId = null) + public static Task SeedInSeparateUowAsync(this IDataSeeder seeder, Guid? tenantId = null, AbpUnitOfWorkOptions options = null, bool requiresNew = false) { - return seeder.SeedAsync(new DataSeedContext(tenantId).WithProperty(nameof(DataSeederExtensions.SeedInSeparateUowAsync), true)); + var context = new DataSeedContext(tenantId); + context.WithProperty(SeedInSeparateUow, true); + context.WithProperty(SeedInSeparateUowOptions, options); + context.WithProperty(SeedInSeparateUowRequiresNew, requiresNew); + return seeder.SeedAsync(context); } } diff --git a/framework/test/Volo.Abp.Data.Tests/Volo/Abp/Data/DataSeederExtensions_Tests.cs b/framework/test/Volo.Abp.Data.Tests/Volo/Abp/Data/DataSeederExtensions_Tests.cs new file mode 100644 index 0000000000..25d20b58b5 --- /dev/null +++ b/framework/test/Volo.Abp.Data.Tests/Volo/Abp/Data/DataSeederExtensions_Tests.cs @@ -0,0 +1,43 @@ +using System; +using System.Data; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using NSubstitute; +using Volo.Abp.Modularity; +using Volo.Abp.Testing; +using Volo.Abp.Uow; +using Xunit; + +namespace Volo.Abp.Data; + +public class DataSeederExtensions_Tests : AbpIntegratedTest +{ + private IDataSeeder _dataSeeder; + + protected override void AfterAddApplication(IServiceCollection services) + { + _dataSeeder = Substitute.For(); + services.Replace(ServiceDescriptor.Singleton(_dataSeeder)); + base.AfterAddApplication(services); + } + + [Fact] + public void SeedInSeparateUowAsync() + { + var tenantId = Guid.NewGuid(); + _dataSeeder.SeedInSeparateUowAsync(tenantId, new AbpUnitOfWorkOptions(true, IsolationLevel.Serializable, 888), true); + + _dataSeeder.Received().SeedAsync(Arg.Is(x => x.TenantId == tenantId && + x.Properties[DataSeederExtensions.SeedInSeparateUow].To() == true && + x.Properties[DataSeederExtensions.SeedInSeparateUowOptions].As().IsTransactional == true && + x.Properties[DataSeederExtensions.SeedInSeparateUowOptions].As().IsolationLevel == IsolationLevel.Serializable && + x.Properties[DataSeederExtensions.SeedInSeparateUowOptions].As().Timeout == 888 && + x.Properties[DataSeederExtensions.SeedInSeparateUowRequiresNew].To() == true)); + } + + [DependsOn(typeof(AbpDataModule))] + public class TestModule : AbpModule + { + + } +} From d1637c1f2eaaffde7d303677844d4340722093aa Mon Sep 17 00:00:00 2001 From: Roc Date: Fri, 9 Sep 2022 10:47:38 +0800 Subject: [PATCH 042/362] Update Volo.Abp.Cli.csproj --- framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj index cb892d5bd8..2a55a3f422 100644 --- a/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj +++ b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj @@ -17,7 +17,7 @@ - + From 8d33e009495884d3c9e05ca975a6ea22ce83e0be Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 15 Sep 2022 08:47:12 +0800 Subject: [PATCH 043/362] Update net6 to net7. --- .../src/Volo.Blogging.Installer/Volo.Blogging.Installer.csproj | 2 +- modules/docs/src/Volo.Docs.Installer/Volo.Docs.Installer.csproj | 2 +- .../Volo.Abp.OpenIddict.Installer.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/blogging/src/Volo.Blogging.Installer/Volo.Blogging.Installer.csproj b/modules/blogging/src/Volo.Blogging.Installer/Volo.Blogging.Installer.csproj index 643522f32b..74de48410f 100644 --- a/modules/blogging/src/Volo.Blogging.Installer/Volo.Blogging.Installer.csproj +++ b/modules/blogging/src/Volo.Blogging.Installer/Volo.Blogging.Installer.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true diff --git a/modules/docs/src/Volo.Docs.Installer/Volo.Docs.Installer.csproj b/modules/docs/src/Volo.Docs.Installer/Volo.Docs.Installer.csproj index 322d689782..e5aa21834b 100644 --- a/modules/docs/src/Volo.Docs.Installer/Volo.Docs.Installer.csproj +++ b/modules/docs/src/Volo.Docs.Installer/Volo.Docs.Installer.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/Volo.Abp.OpenIddict.Installer.csproj b/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/Volo.Abp.OpenIddict.Installer.csproj index d2cdd84b53..23e62b1773 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/Volo.Abp.OpenIddict.Installer.csproj +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/Volo.Abp.OpenIddict.Installer.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true From 10d16cbb447fdbfcf4acef55a5072a5edc7e49c7 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 15 Sep 2022 09:06:40 +0800 Subject: [PATCH 044/362] Update sdk version. --- .github/workflows/build-and-test.yml | 2 +- global.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index dda9340d7d..fd76637900 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -47,7 +47,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-dotnet@master with: - dotnet-version: 7.0.100-preview.7.22377.5 + dotnet-version: 7.0.100-rc.1.22431.12 - name: Build All run: .\build-all.ps1 -f diff --git a/global.json b/global.json index 420278bb04..05338f613a 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "7.0.100-preview.7.22377.5", + "version": "7.0.100-rc.1.22431.12", "rollForward": "latestFeature" } } From 52dbcf77adc8cfbdcb28917cdb65b8fa2062bb66 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 15 Sep 2022 09:54:45 +0800 Subject: [PATCH 045/362] Update packages version. --- Directory.Build.props | 6 +++--- .../Volo.Abp.AuditLogging.Domain.Shared.csproj | 2 +- .../MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj | 2 +- .../MyCompanyName.MyProjectName.Blazor.Server.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Host.Mongo.csproj | 2 +- .../MyCompanyName.MyProjectName.Host.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Mvc.Mongo.csproj | 2 +- .../MyCompanyName.MyProjectName.Mvc.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Blazor.csproj | 4 ++-- .../MyCompanyName.MyProjectName.DbMigrator.csproj | 2 +- .../MyCompanyName.MyProjectName.Domain.Shared.csproj | 2 +- .../MyCompanyName.MyProjectName.EntityFrameworkCore.csproj | 2 +- .../MyCompanyName.MyProjectName.HttpApi.Host.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Web.Host.csproj | 2 +- .../MyCompanyName.MyProjectName.csproj | 2 +- .../MyCompanyName.MyProjectName.csproj | 2 +- .../MyCompanyName.MyProjectName.AuthServer.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Blazor.Host.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Blazor.Server.Host.csproj | 2 +- .../MyCompanyName.MyProjectName.HttpApi.Host.csproj | 6 +++--- .../MyCompanyName.MyProjectName.Web.Host.csproj | 2 +- .../MyCompanyName.MyProjectName.Web.Unified.csproj | 2 +- .../MyCompanyName.MyProjectName.Domain.Shared.csproj | 2 +- .../MyCompanyName.MyProjectName.Web.csproj | 2 +- ...mpanyName.MyProjectName.EntityFrameworkCore.Tests.csproj | 2 +- ...yName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj | 2 +- .../MyCompanyName.MyProjectName.csproj | 2 +- 27 files changed, 38 insertions(+), 38 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 9c96d8d043..a0667f9aae 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,13 +2,13 @@ - 7.0.0-preview.7.* + 7.0.0-rc.* - 7.0.0-preview.7.* + 7.0.0-rc.* - 7.0.0-preview.7.* + 7.0.0-rc.* 17.2.0 diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.csproj b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.csproj index a28148f0b7..bcbb397f5b 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.csproj +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.csproj @@ -20,7 +20,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj index 3c6a3db8fd..0d25509561 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj @@ -81,7 +81,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index fea24c9541..3f49e5bc76 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -82,11 +82,11 @@ - + - + runtime; build; native; contentfiles; analyzers compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj index 16011a403e..87dd51da66 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj @@ -73,7 +73,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj index 975f7949d4..ae9163bec1 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj @@ -74,11 +74,11 @@ - + - + runtime; build; native; contentfiles; analyzers compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj index 85acc9fc34..621c83dc0e 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj @@ -76,7 +76,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj index 63c17fa50e..5585bcd141 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj @@ -77,11 +77,11 @@ - + - + runtime; build; native; contentfiles; analyzers compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj index c91cee530c..6c72ff2b88 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj index 8b6a4022f1..c6b440ca60 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj @@ -21,7 +21,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index a8cfeb8d94..aeb84f72f7 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -25,7 +25,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj index 32ce8677cf..80fbe2c8b0 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj @@ -21,7 +21,7 @@ - + all runtime; build; native; contentfiles; analyzers diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index f9f4fdb651..5580db6082 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -12,8 +12,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index fe0da0ecbb..d854b9dd61 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -18,7 +18,7 @@ - + diff --git a/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index f7fb67b3ad..f6c4c12faf 100644 --- a/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -12,7 +12,7 @@ - + diff --git a/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index 3bcd4f90d4..4a9b8c6a23 100644 --- a/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -34,7 +34,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj index e002870852..c8a6f860f0 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj @@ -12,8 +12,8 @@ - - + + all runtime; build; native; contentfiles; analyzers diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj index 57563e358f..8aacd66cbe 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj @@ -10,8 +10,8 @@ - - + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj index 53bc4573ff..c25d03a5d6 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj @@ -16,7 +16,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index 5913a0185f..6b9412bb3c 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -13,9 +13,9 @@ - - - + + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index cf2057fc05..5e0c972a23 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -12,7 +12,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj index e0299c5774..f09364bd10 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj @@ -12,7 +12,7 @@ - + all runtime; build; native; contentfiles; analyzers diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index abcade0ecf..c974f66c98 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -13,7 +13,7 @@ - + diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index 765c804972..24838a5c4b 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -21,7 +21,7 @@ - + diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj index 3831bf7a5b..010d512430 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj @@ -9,7 +9,7 @@ - + diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj index d7cdfd4404..7426837690 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj @@ -22,7 +22,7 @@ - + diff --git a/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index 42b0bb2def..795164b0a8 100644 --- a/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -13,7 +13,7 @@ - + From 5537d24e874fc70bf5c3ceb67a57fe5759c53ca7 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 15 Sep 2022 10:29:23 +0800 Subject: [PATCH 046/362] Resolve merge conflicts. --- .../Volo.Abp.FeatureManagement.Domain.Shared.csproj | 2 +- .../AbpFeatureManagementDomainSharedModule.cs | 13 ++----------- .../FeatureGroupDefinitionRecord.cs | 2 +- .../SystemTextJsonStringValueJsonConverter_Tests.cs | 2 +- 4 files changed, 5 insertions(+), 14 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj index 21f8595cf7..14f93d3db7 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj @@ -16,7 +16,7 @@ - + diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainSharedModule.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainSharedModule.cs index 5d924f1457..3d47bfbde8 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainSharedModule.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainSharedModule.cs @@ -1,10 +1,6 @@ -using System.Collections.Generic; -using System.Linq; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.FeatureManagement.JsonConverters; using Volo.Abp.FeatureManagement.Localization; -using Volo.Abp.Json; -using Volo.Abp.Json.Newtonsoft; using Volo.Abp.Json.SystemTextJson; using Volo.Abp.Localization; using Volo.Abp.Localization.ExceptionHandling; @@ -17,7 +13,7 @@ namespace Volo.Abp.FeatureManagement; [DependsOn( typeof(AbpValidationModule), - typeof(AbpJsonModule) + typeof(AbpJsonSystemTextJsonModule) )] public class AbpFeatureManagementDomainSharedModule : AbpModule { @@ -42,11 +38,6 @@ public class AbpFeatureManagementDomainSharedModule : AbpModule options.MapCodeNamespace("Volo.Abp.FeatureManagement", typeof(AbpFeatureManagementResource)); }); - Configure(options => - { - options.Converters.Add(); - }); - var valueValidatorFactoryOptions = context.Services.GetPreConfigureActions(); Configure(options => { diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureGroupDefinitionRecord.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureGroupDefinitionRecord.cs index c40f74c2cd..677f055f3e 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureGroupDefinitionRecord.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureGroupDefinitionRecord.cs @@ -1,5 +1,5 @@ using System; -using Newtonsoft.Json; +using System.Text.Json.Serialization; using Volo.Abp.Data; using Volo.Abp.Domain.Entities; diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/SystemTextJsonStringValueJsonConverter_Tests.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/SystemTextJsonStringValueJsonConverter_Tests.cs index 828d5b3814..0517210579 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/SystemTextJsonStringValueJsonConverter_Tests.cs +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/SystemTextJsonStringValueJsonConverter_Tests.cs @@ -20,7 +20,7 @@ public class SystemTextJsonStringValueJsonConverter_Tests : FeatureManagementApp protected override void BeforeAddApplication(IServiceCollection services) { - services.PreConfigure(options => + services.PreConfigure(options => { options.ValueValidatorFactory.Add(new ValueValidatorFactory("URL")); }); From 852dafdb957f5c152f84d1f2c5aa33290952134f Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 15 Sep 2022 14:13:49 +0800 Subject: [PATCH 047/362] Remove `abp.auth.policies`. Resolve #13950 --- docs/en/UI/AspNetCore/JavaScript-API/Auth.md | 1 - .../ApplicationAuthConfigurationDto.cs | 3 --- .../AbpApplicationConfigurationAppService.cs | 7 ++----- npm/packs/core/src/abp.js | 4 +--- 4 files changed, 3 insertions(+), 12 deletions(-) diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Auth.md b/docs/en/UI/AspNetCore/JavaScript-API/Auth.md index 45af8c4b3e..b50e077ba6 100644 --- a/docs/en/UI/AspNetCore/JavaScript-API/Auth.md +++ b/docs/en/UI/AspNetCore/JavaScript-API/Auth.md @@ -20,5 +20,4 @@ if (abp.auth.isGranted('DeleteUsers')) { * ` abp.auth.isAnyGranted(...)`: Gets one or more permission/policy names and returns `true` if at least one of them has granted. * `abp.auth.areAllGranted(...)`: Gets one or more permission/policy names and returns `true` if all of them of them have granted. -* `abp.auth.policies`: This is an object where its keys are the permission/policy names. You can find all permission/policy names here. * `abp.auth.grantedPolicies`: This is an object where its keys are the permission/policy names. You can find the granted permission/policy names here. \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationAuthConfigurationDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationAuthConfigurationDto.cs index be5a022b01..3b94ea0b72 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationAuthConfigurationDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationAuthConfigurationDto.cs @@ -6,13 +6,10 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; [Serializable] public class ApplicationAuthConfigurationDto { - public Dictionary Policies { get; set; } - public Dictionary GrantedPolicies { get; set; } public ApplicationAuthConfigurationDto() { - Policies = new Dictionary(); GrantedPolicies = new Dictionary(); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs index 0deae4b5b3..4254b5479f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs @@ -185,8 +185,6 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp foreach (var policyName in otherPolicyNames) { - authConfig.Policies[policyName] = true; - if (await _authorizationService.IsGrantedAsync(policyName)) { authConfig.GrantedPolicies[policyName] = true; @@ -196,7 +194,6 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp var result = await _permissionChecker.IsGrantedAsync(abpPolicyNames.ToArray()); foreach (var (key, value) in result.Result) { - authConfig.Policies[key] = true; if (value == PermissionGrantResult.Granted) { authConfig.GrantedPolicies[key] = true; @@ -228,10 +225,10 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp foreach (var resourceName in resourceNames) { var dictionary = new Dictionary(); - + var localizer = await StringLocalizerFactory .CreateByResourceNameOrNullAsync(resourceName); - + if (localizer != null) { foreach (var localizedString in await localizer.GetAllStringsAsync()) diff --git a/npm/packs/core/src/abp.js b/npm/packs/core/src/abp.js index 074d4f0f50..b4c31c18a5 100644 --- a/npm/packs/core/src/abp.js +++ b/npm/packs/core/src/abp.js @@ -201,12 +201,10 @@ var abp = abp || {}; abp.auth = abp.auth || {}; - abp.auth.policies = abp.auth.policies || {}; - abp.auth.grantedPolicies = abp.auth.grantedPolicies || {}; abp.auth.isGranted = function (policyName) { - return abp.auth.policies[policyName] != undefined && abp.auth.grantedPolicies[policyName] != undefined; + return abp.auth.grantedPolicies[policyName] != undefined; }; abp.auth.isAnyGranted = function () { From 678e17b87a469c08a3656c4d6ec1ae216a78762d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 18 Sep 2022 00:05:08 +0300 Subject: [PATCH 048/362] Add AbpCachingModule to AbpDddDomainModule --- .../src/Volo.Abp.Ddd.Domain/Volo.Abp.Ddd.Domain.csproj | 4 +--- .../Volo/Abp/Domain/AbpDddDomainModule.cs | 10 +++------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo.Abp.Ddd.Domain.csproj b/framework/src/Volo.Abp.Ddd.Domain/Volo.Abp.Ddd.Domain.csproj index 87879334af..f10f6fdebd 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo.Abp.Ddd.Domain.csproj +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo.Abp.Ddd.Domain.csproj @@ -16,16 +16,14 @@ + - - - diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/AbpDddDomainModule.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/AbpDddDomainModule.cs index 7c0759edcf..0b41fef1cf 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/AbpDddDomainModule.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/AbpDddDomainModule.cs @@ -1,17 +1,15 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Auditing; +using Volo.Abp.Caching; using Volo.Abp.Data; using Volo.Abp.Domain.Repositories; using Volo.Abp.EventBus; using Volo.Abp.ExceptionHandling; using Volo.Abp.Guids; using Volo.Abp.Modularity; -using Volo.Abp.MultiTenancy; using Volo.Abp.ObjectMapping; using Volo.Abp.Specifications; -using Volo.Abp.Threading; using Volo.Abp.Timing; -using Volo.Abp.Uow; namespace Volo.Abp.Domain; @@ -20,13 +18,11 @@ namespace Volo.Abp.Domain; typeof(AbpDataModule), typeof(AbpEventBusModule), typeof(AbpGuidsModule), - typeof(AbpMultiTenancyModule), - typeof(AbpThreadingModule), typeof(AbpTimingModule), - typeof(AbpUnitOfWorkModule), typeof(AbpObjectMappingModule), typeof(AbpExceptionHandlingModule), - typeof(AbpSpecificationsModule) + typeof(AbpSpecificationsModule), + typeof(AbpCachingModule) )] public class AbpDddDomainModule : AbpModule { From 4530b445b58a76eabdcf401779a790400e2e280c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 18 Sep 2022 00:42:05 +0300 Subject: [PATCH 049/362] Introduce IEntityCache and its default implementations. --- .../Entities/Caching/EntityCacheBase.cs | 40 ++++++++++++++++++ .../EntityCacheServiceCollectionExtensions.cs | 41 +++++++++++++++++++ .../Caching/EntityCacheWithObjectMapper.cs | 35 ++++++++++++++++ .../EntityCacheWithObjectMapperContext.cs | 22 ++++++++++ .../Caching/EntityCacheWithoutCacheItem.cs | 24 +++++++++++ .../Domain/Entities/Caching/IEntityCache.cs | 22 ++++++++++ 6 files changed, 184 insertions(+) create mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs create mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs create mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithObjectMapper.cs create mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithObjectMapperContext.cs create mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithoutCacheItem.cs create mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/IEntityCache.cs diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs new file mode 100644 index 0000000000..1d641ea953 --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs @@ -0,0 +1,40 @@ +using System.Threading.Tasks; +using Volo.Abp.Caching; +using Volo.Abp.Domain.Repositories; + +namespace Volo.Abp.Domain.Entities.Caching; + +public abstract class EntityCacheBase : + IEntityCache + where TEntity : Entity + where TEntityCacheItem : class +{ + protected IReadOnlyRepository Repository { get; } + protected IDistributedCache Cache { get; } + + protected EntityCacheBase( + IReadOnlyRepository repository, + IDistributedCache cache) + { + Repository = repository; + Cache = cache; + } + + public virtual async Task FindAsync(TKey id) + { + return await Cache.GetOrAddAsync( + id, + async () => MapToCacheItem(await Repository.FindAsync(id)) + ); + } + + public virtual async Task GetAsync(TKey id) + { + return await Cache.GetOrAddAsync( + id, + async () => MapToCacheItem(await Repository.FindAsync(id)) + ); + } + + protected abstract TEntityCacheItem MapToCacheItem(TEntity entity); +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs new file mode 100644 index 0000000000..6bded3c401 --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs @@ -0,0 +1,41 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace Volo.Abp.Domain.Entities.Caching; + +public static class EntityCacheServiceCollectionExtensions +{ + public static IServiceCollection AddEntityCache( + this IServiceCollection services) + where TEntity : Entity + { + return services + .AddTransient< + IEntityCache, + EntityCacheWithoutCacheItem + >(); + } + + public static IServiceCollection AddEntityCache( + this IServiceCollection services) + where TEntity : Entity + where TEntityCacheItem : class + { + return services + .AddTransient< + IEntityCache, + EntityCacheWithObjectMapper + >(); + } + + public static IServiceCollection AddEntityCache( + this IServiceCollection services) + where TEntity : Entity + where TEntityCacheItem : class + { + return services + .AddTransient< + IEntityCache, + EntityCacheWithObjectMapperContext + >(); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithObjectMapper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithObjectMapper.cs new file mode 100644 index 0000000000..bcc2157761 --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithObjectMapper.cs @@ -0,0 +1,35 @@ +using System; +using Volo.Abp.Caching; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.ObjectMapping; + +namespace Volo.Abp.Domain.Entities.Caching; + +public class EntityCacheWithObjectMapper : + EntityCacheBase + where TEntity : Entity + where TEntityCacheItem : class +{ + protected IObjectMapper ObjectMapper { get; } + + public EntityCacheWithObjectMapper( + IReadOnlyRepository repository, + IDistributedCache cache, + IObjectMapper objectMapper) + : base( + repository, + cache) + { + ObjectMapper = objectMapper; + } + + protected override TEntityCacheItem MapToCacheItem(TEntity entity) + { + if (typeof(TEntity) == typeof(TEntityCacheItem)) + { + return entity.As(); + } + + return ObjectMapper.Map(entity); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithObjectMapperContext.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithObjectMapperContext.cs new file mode 100644 index 0000000000..e5eba5781c --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithObjectMapperContext.cs @@ -0,0 +1,22 @@ +using Volo.Abp.Caching; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.ObjectMapping; + +namespace Volo.Abp.Domain.Entities.Caching; + +public class EntityCacheWithObjectMapperContext : + EntityCacheWithObjectMapper + where TEntity : Entity + where TEntityCacheItem : class +{ + public EntityCacheWithObjectMapperContext( + IReadOnlyRepository repository, + IDistributedCache cache, + IObjectMapper objectMapper) // Intentionally injected with TContext + : base( + repository, + cache, + objectMapper) + { + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithoutCacheItem.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithoutCacheItem.cs new file mode 100644 index 0000000000..33af591556 --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithoutCacheItem.cs @@ -0,0 +1,24 @@ +using Volo.Abp.Caching; +using Volo.Abp.Domain.Repositories; + +namespace Volo.Abp.Domain.Entities.Caching; + +public class EntityCacheWithoutCacheItem : + EntityCacheBase + where TEntity : Entity +{ + public EntityCacheWithoutCacheItem( + IReadOnlyRepository repository, + IDistributedCache cache) + : base( + repository, + cache) + { + + } + + protected override TEntity MapToCacheItem(TEntity entity) + { + return entity; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/IEntityCache.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/IEntityCache.cs new file mode 100644 index 0000000000..84f4486c65 --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/IEntityCache.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using JetBrains.Annotations; + +namespace Volo.Abp.Domain.Entities.Caching; + +public interface IEntityCache + where TEntityCacheItem : class +{ + /// + /// Gets the entity with given , + /// or returns null if the entity was not found. + /// + [ItemCanBeNull] + Task FindAsync(TKey id); + + /// + /// Gets the entity with given , + /// or throws if the entity was not found. + /// + [ItemNotNull] + Task GetAsync(TKey id); +} \ No newline at end of file From 3c4e90d8b2450bbaeda1919d714f57003ab1bccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 18 Sep 2022 00:48:56 +0300 Subject: [PATCH 050/362] Should use Repository's GetAsync for GetAsync --- .../Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs index 1d641ea953..6874878286 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs @@ -32,7 +32,7 @@ public abstract class EntityCacheBase : { return await Cache.GetOrAddAsync( id, - async () => MapToCacheItem(await Repository.FindAsync(id)) + async () => MapToCacheItem(await Repository.GetAsync(id)) ); } From 374edc3771e0efab84164a65863d2a6fd0bfbc48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 18 Sep 2022 00:58:44 +0300 Subject: [PATCH 051/362] Invalidate entity cache on change --- .../Domain/Entities/Caching/EntityCacheBase.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs index 6874878286..3f3b5fa42d 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs @@ -1,11 +1,14 @@ using System.Threading.Tasks; using Volo.Abp.Caching; +using Volo.Abp.Domain.Entities.Events; using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus; namespace Volo.Abp.Domain.Entities.Caching; public abstract class EntityCacheBase : - IEntityCache + IEntityCache, + ILocalEventHandler> where TEntity : Entity where TEntityCacheItem : class { @@ -37,4 +40,14 @@ public abstract class EntityCacheBase : } protected abstract TEntityCacheItem MapToCacheItem(TEntity entity); + + public async Task HandleEventAsync(EntityChangedEventData eventData) + { + if (eventData is EntityCreatedEventData) + { + return; + } + + await Cache.RemoveAsync(eventData.Entity.Id); + } } \ No newline at end of file From 91fcbd8b3e7d222b83e0c18b245a3337f610c35e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 18 Sep 2022 22:08:58 +0300 Subject: [PATCH 052/362] Use TryAdd for adding entitycache --- .../EntityCacheServiceCollectionExtensions.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs index 6bded3c401..f426e9adcb 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; namespace Volo.Abp.Domain.Entities.Caching; @@ -8,11 +9,12 @@ public static class EntityCacheServiceCollectionExtensions this IServiceCollection services) where TEntity : Entity { - return services - .AddTransient< + services + .TryAddTransient< IEntityCache, EntityCacheWithoutCacheItem >(); + return services; } public static IServiceCollection AddEntityCache( @@ -20,11 +22,12 @@ public static class EntityCacheServiceCollectionExtensions where TEntity : Entity where TEntityCacheItem : class { - return services - .AddTransient< + services + .TryAddTransient< IEntityCache, EntityCacheWithObjectMapper >(); + return services; } public static IServiceCollection AddEntityCache( @@ -32,10 +35,11 @@ public static class EntityCacheServiceCollectionExtensions where TEntity : Entity where TEntityCacheItem : class { - return services - .AddTransient< + services + .TryAddTransient< IEntityCache, EntityCacheWithObjectMapperContext >(); + return services; } } \ No newline at end of file From 9bd4ad1d83127d567259e928a0bf0e7307a70990 Mon Sep 17 00:00:00 2001 From: LiangShiWei Date: Fri, 23 Sep 2022 15:56:48 +0800 Subject: [PATCH 053/362] Update postgresql to net7 --- .../Volo.Abp.EntityFrameworkCore.PostgreSql.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj index e93925639d..275e01526b 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj @@ -19,7 +19,7 @@ - + From 5065c5714e6fc8bb2aa5d3e2110b2b12408d8468 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 26 Sep 2022 15:29:09 +0800 Subject: [PATCH 054/362] Update JsonAuditSerializer.cs --- .../Volo/Abp/Auditing/JsonAuditSerializer.cs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonAuditSerializer.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonAuditSerializer.cs index 9d8c4248e6..5f64c58eed 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonAuditSerializer.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonAuditSerializer.cs @@ -38,14 +38,13 @@ public class JsonAuditSerializer : IAuditSerializer, ITransientDependency { jsonTypeInfo => { - if (Options.IgnoredTypes.Any(ignoredType => ignoredType.IsAssignableFrom(jsonTypeInfo.Type))) + if (Options.IgnoredTypes.Any(ignoredType => ignoredType.IsAssignableFrom(jsonTypeInfo.Type)) || + jsonTypeInfo.Type.GetCustomAttributes(typeof(DisableAuditingAttribute), false).Any()) { - jsonTypeInfo.Properties.Clear(); - } - - if (jsonTypeInfo.Type.GetCustomAttributes(typeof(DisableAuditingAttribute), false).Any()) - { - jsonTypeInfo.Properties.Clear(); + if (jsonTypeInfo.Kind == JsonTypeInfoKind.Object) + { + jsonTypeInfo.Properties.Clear(); + } } foreach (var property in jsonTypeInfo.Properties) From 11f8c7476d97e2897a3b702a5eaee1a479ccead5 Mon Sep 17 00:00:00 2001 From: LiangShiWei Date: Tue, 27 Sep 2022 16:52:08 +0800 Subject: [PATCH 055/362] Add EntityCache_Tests --- .../EntityCacheServiceCollectionExtensions.cs | 5 + .../Domain/EntityCache_Tests.cs | 7 + .../TestMigrationsDbContext.cs | 5 + .../EntityFrameworkCore/TestAppDbContext.cs | 5 + .../Volo/Abp/MongoDB/AbpMongoDbTestModule.cs | 2 +- .../Abp/MongoDB/Domain/EntityCache_Tests.cs | 9 ++ .../TestApp/MongoDb/ITestAppMongoDbContext.cs | 3 + .../TestApp/MongoDb/TestAppMongoDbContext.cs | 3 + .../Abp/TestApp/Domain/TestAutoMapProfile.cs | 3 + .../Volo/Abp/TestApp/TestAppModule.cs | 11 +- .../Abp/TestApp/TestMemoryDistributedCache.cs | 93 ++++++++++++ .../Abp/TestApp/Testing/EntityCache_Tests.cs | 133 ++++++++++++++++++ 12 files changed, 277 insertions(+), 2 deletions(-) create mode 100644 framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/EntityCache_Tests.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Domain/EntityCache_Tests.cs create mode 100644 framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestMemoryDistributedCache.cs create mode 100644 framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs index f426e9adcb..8136042690 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs @@ -14,6 +14,8 @@ public static class EntityCacheServiceCollectionExtensions IEntityCache, EntityCacheWithoutCacheItem >(); + services + .TryAddTransient>(); return services; } @@ -27,6 +29,8 @@ public static class EntityCacheServiceCollectionExtensions IEntityCache, EntityCacheWithObjectMapper >(); + services + .TryAddTransient>(); return services; } @@ -40,6 +44,7 @@ public static class EntityCacheServiceCollectionExtensions IEntityCache, EntityCacheWithObjectMapperContext >(); + services.TryAddTransient>(); return services; } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/EntityCache_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/EntityCache_Tests.cs new file mode 100644 index 0000000000..e6eb02be59 --- /dev/null +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/EntityCache_Tests.cs @@ -0,0 +1,7 @@ +using Volo.Abp.TestApp.Testing; + +namespace Volo.Abp.EntityFrameworkCore.Domain; + +public class EntityCache_Tests : EntityCache_Tests +{ +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs index fe2f492aaf..529912aa68 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs @@ -3,6 +3,7 @@ using Microsoft.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.TestApp.SecondContext; using Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext; using Volo.Abp.TestApp.Domain; +using Volo.Abp.TestApp.Testing; namespace Volo.Abp.EntityFrameworkCore; @@ -19,6 +20,8 @@ public class TestMigrationsDbContext : AbpDbContext public DbSet EntityWithIntPks { get; set; } public DbSet Author { get; set; } + + public DbSet Products { get; set; } public TestMigrationsDbContext(DbContextOptions options) : base(options) @@ -51,5 +54,7 @@ public class TestMigrationsDbContext : AbpDbContext d.HasKey(x => new { x.CityId, x.Name }); }); }); + + modelBuilder.Entity(); } } diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs index 4e1cc528b7..921b97f6a4 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs @@ -7,6 +7,7 @@ using Volo.Abp.EntityFrameworkCore.Modeling; using Volo.Abp.EntityFrameworkCore.TestApp.FourthContext; using Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext; using Volo.Abp.TestApp.Domain; +using Volo.Abp.TestApp.Testing; namespace Volo.Abp.TestApp.EntityFrameworkCore; @@ -28,6 +29,8 @@ public class TestAppDbContext : AbpDbContext, IThirdDbContext, public DbSet Author { get; set; } public DbSet FourthDummyEntities { get; set; } + + public DbSet Products { get; set; } public TestAppDbContext(DbContextOptions options) : base(options) @@ -79,6 +82,8 @@ public class TestAppDbContext : AbpDbContext, IThirdDbContext, b.ApplyObjectExtensionMappings(); }); + modelBuilder.Entity(); + modelBuilder.TryConfigureObjectExtensions(); } } diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs index 63b63f0873..0ad7554ea1 100644 --- a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs @@ -30,7 +30,7 @@ public class AbpMongoDbTestModule : AbpModule context.Services.AddMongoDbContext(options => { - options.AddDefaultRepositories(); + options.AddDefaultRepositories(true); options.AddRepository(); options.ReplaceDbContext(); diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Domain/EntityCache_Tests.cs b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Domain/EntityCache_Tests.cs new file mode 100644 index 0000000000..638d274100 --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Domain/EntityCache_Tests.cs @@ -0,0 +1,9 @@ +using Volo.Abp.TestApp.Testing; +using Xunit; + +namespace Volo.Abp.MongoDB.Domain; + +[Collection(MongoTestCollection.Name)] +public class EntityCache_Tests : EntityCache_Tests +{ +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/TestApp/MongoDb/ITestAppMongoDbContext.cs b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/TestApp/MongoDb/ITestAppMongoDbContext.cs index cfbe6d5f22..c1b91ae181 100644 --- a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/TestApp/MongoDb/ITestAppMongoDbContext.cs +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/TestApp/MongoDb/ITestAppMongoDbContext.cs @@ -2,6 +2,7 @@ using Volo.Abp.Data; using Volo.Abp.MongoDB; using Volo.Abp.TestApp.Domain; +using Volo.Abp.TestApp.Testing; namespace Volo.Abp.TestApp.MongoDB; @@ -11,4 +12,6 @@ public interface ITestAppMongoDbContext : IAbpMongoDbContext IMongoCollection People { get; } IMongoCollection Cities { get; } + + IMongoCollection Products { get; } } diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/TestApp/MongoDb/TestAppMongoDbContext.cs b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/TestApp/MongoDb/TestAppMongoDbContext.cs index e1fca141c7..9bc2606878 100644 --- a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/TestApp/MongoDb/TestAppMongoDbContext.cs +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/TestApp/MongoDb/TestAppMongoDbContext.cs @@ -6,6 +6,7 @@ using Volo.Abp.MongoDB; using Volo.Abp.MongoDB.TestApp.FourthContext; using Volo.Abp.MongoDB.TestApp.ThirdDbContext; using Volo.Abp.TestApp.Domain; +using Volo.Abp.TestApp.Testing; namespace Volo.Abp.TestApp.MongoDB; @@ -23,6 +24,8 @@ public class TestAppMongoDbContext : AbpMongoDbContext, ITestAppMongoDbContext, public IMongoCollection DummyEntities => Collection(); public IMongoCollection FourthDummyEntities => Collection(); + + public IMongoCollection Products => Collection(); protected internal override void CreateModel(IMongoModelBuilder modelBuilder) { diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/TestAutoMapProfile.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/TestAutoMapProfile.cs index 2d574056d6..2cbac6964a 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/TestAutoMapProfile.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/TestAutoMapProfile.cs @@ -1,4 +1,5 @@ using AutoMapper; +using Volo.Abp.TestApp.Testing; namespace Volo.Abp.TestApp.Domain; @@ -7,5 +8,7 @@ public class TestAutoMapProfile : Profile public TestAutoMapProfile() { CreateMap().ReverseMap(); + + CreateMap(); } } diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs index aa5ce5a54d..0c8339d6f7 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs @@ -1,11 +1,16 @@ -using Microsoft.Extensions.DependencyInjection; +using System; +using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Volo.Abp.Application; using Volo.Abp.Autofac; using Volo.Abp.Modularity; using Volo.Abp.TestApp.Domain; using Volo.Abp.AutoMapper; +using Volo.Abp.Domain.Entities.Caching; using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.TestApp.Application.Dto; +using Volo.Abp.TestApp.Testing; using Volo.Abp.Threading; namespace Volo.Abp.TestApp; @@ -22,6 +27,10 @@ public class TestAppModule : AbpModule { ConfigureAutoMapper(); ConfigureDistributedEventBus(); + + context.Services.Replace(ServiceDescriptor.Singleton()); + context.Services.AddEntityCache(); + context.Services.AddEntityCache(); } public override void OnApplicationInitialization(ApplicationInitializationContext context) diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestMemoryDistributedCache.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestMemoryDistributedCache.cs new file mode 100644 index 0000000000..623370d17a --- /dev/null +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestMemoryDistributedCache.cs @@ -0,0 +1,93 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.TestApp; + +[DisableConventionalRegistration] +public class TestMemoryDistributedCache : MemoryDistributedCache, ICacheSupportsMultipleItems +{ + public TestMemoryDistributedCache(IOptions optionsAccessor) + : base(optionsAccessor) + { + } + + public TestMemoryDistributedCache(IOptions optionsAccessor, ILoggerFactory loggerFactory) + : base(optionsAccessor, loggerFactory) + { + } + + public byte[][] GetMany(IEnumerable keys) + { + var values = new List(); + foreach (var key in keys) + { + values.Add(Get(key)); + } + return values.ToArray(); + } + + public async Task GetManyAsync(IEnumerable keys, CancellationToken token = default) + { + var values = new List(); + foreach (var key in keys) + { + values.Add(await GetAsync(key, token)); + } + return values.ToArray(); + } + + public void SetMany(IEnumerable> items, DistributedCacheEntryOptions options) + { + foreach (var item in items) + { + Set(item.Key, item.Value, options); + } + } + + public async Task SetManyAsync(IEnumerable> items, DistributedCacheEntryOptions options, CancellationToken token = default) + { + foreach (var item in items) + { + await SetAsync(item.Key, item.Value, options, token); + } + } + + public void RefreshMany(IEnumerable keys) + { + foreach (var key in keys) + { + Refresh(key); + } + } + + public async Task RefreshManyAsync(IEnumerable keys, CancellationToken token = default) + { + foreach (var key in keys) + { + await RefreshAsync(key, token); + } + } + + public void RemoveMany(IEnumerable keys) + { + foreach (var key in keys) + { + Remove(key); + } + } + + public async Task RemoveManyAsync(IEnumerable keys, CancellationToken token = default) + { + foreach (var key in keys) + { + await RemoveAsync(key, token); + } + } +} diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs new file mode 100644 index 0000000000..e244e6f79b --- /dev/null +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs @@ -0,0 +1,133 @@ +using System; +using System.Text.Json.Serialization; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Domain.Entities; +using Volo.Abp.Domain.Entities.Caching; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Modularity; +using Xunit; + +namespace Volo.Abp.TestApp.Testing; + +public class EntityCache_Tests : TestAppTestBase + where TStartupModule : IAbpModule +{ + protected readonly IRepository ProductRepository; + protected readonly IEntityCache ProductEntityCache; + protected readonly IEntityCache ProductCacheItem; + + public EntityCache_Tests() + { + ProductRepository = GetRequiredService>(); + ProductEntityCache = GetRequiredService>(); + ProductCacheItem = GetRequiredService>(); + } + + [Fact] + public async Task Should_Return_Null_IF_Entity_Not_Exist() + { + var notExistId = Guid.NewGuid(); + (await ProductEntityCache.FindAsync(notExistId)).ShouldBeNull(); + (await ProductCacheItem.FindAsync(notExistId)).ShouldBeNull(); + } + + [Fact] + public async Task Should_Throw_EntityNotFoundException_IF_Entity_Not_Exist() + { + var notExistId = Guid.NewGuid(); + await Assert.ThrowsAsync(() => ProductEntityCache.GetAsync(notExistId)); + await Assert.ThrowsAsync(() => ProductCacheItem.GetAsync(notExistId)); + } + + [Fact] + public async Task Should_Return_EntityCache() + { + var id = Guid.NewGuid(); + var product = await ProductRepository.InsertAsync(new Product(id, "Product1", decimal.One)); + + product = await ProductEntityCache.FindAsync(product.Id); + product.ShouldNotBeNull(); + product.Id.ShouldBe(id); + product.Name.ShouldBe("Product1"); + product.Price.ShouldBe(decimal.One); + + var productCacheItem = await ProductCacheItem.FindAsync(product.Id); + productCacheItem.ShouldNotBeNull(); + productCacheItem.Id.ShouldBe(id); + productCacheItem.Name.ShouldBe("Product1"); + productCacheItem.Price.ShouldBe(decimal.One); + } + + [Fact] + public async Task Should_Return_Null_IF_Deleted() + { + var id = Guid.NewGuid(); + var product = await ProductRepository.InsertAsync(new Product(id, "Product1", decimal.One)); + (await ProductEntityCache.FindAsync(id)).ShouldNotBeNull(); + (await ProductCacheItem.FindAsync(id)).ShouldNotBeNull(); + + await ProductRepository.DeleteAsync(id); + + (await ProductEntityCache.FindAsync(product.Id)).ShouldBeNull(); + (await ProductCacheItem.FindAsync(product.Id)).ShouldBeNull(); + } + + [Fact] + public async Task Should_Return_New_EntityCache_IF_Updated() + { + var id = Guid.NewGuid(); + var product = await ProductRepository.InsertAsync(new Product(id, "Product1", decimal.One)); + (await ProductEntityCache.FindAsync(id)).ShouldNotBeNull(); + (await ProductCacheItem.FindAsync(id)).ShouldNotBeNull(); + + product.Name = "Product2"; + product.Price = decimal.Zero; + await ProductRepository.UpdateAsync(product); + + product = await ProductEntityCache.FindAsync(product.Id); + product.ShouldNotBeNull(); + product.Id.ShouldBe(id); + product.Name.ShouldBe("Product2"); + product.Price.ShouldBe(decimal.Zero); + + var productCacheItem = await ProductCacheItem.FindAsync(product.Id); + productCacheItem.ShouldNotBeNull(); + productCacheItem.Id.ShouldBe(id); + productCacheItem.Name.ShouldBe("Product2"); + productCacheItem.Price.ShouldBe(decimal.Zero); + } +} + +[Serializable] +public class Product : Entity +{ + public Product() + { + + } + + public Product(Guid id, string name, decimal price) + { + Id = id; + Name = name; + Price = price; + } + + [JsonInclude] + public override Guid Id { get; protected set; } + + public string Name { get; set; } + + public decimal Price { get; set; } +} + +[Serializable] +public class ProductCacheItem +{ + public Guid Id { get; set; } + + public string Name { get; set; } + + public decimal Price { get; set; } +} \ No newline at end of file From 0a55297f8b71a2e017caafb345b2878979eccd9e Mon Sep 17 00:00:00 2001 From: Salih Date: Tue, 27 Sep 2022 11:18:02 +0300 Subject: [PATCH 056/362] =?UTF-8?q?Fixed=20cms-kit=20=C4=B0nvalid=20Date?= =?UTF-8?q?=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/CmsKit/Comments/Index.cshtml | 4 +-- .../Pages/CmsKit/Comments/index.js | 26 +++++++++++++------ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/Index.cshtml index 93dfc2aa4d..1bb83f989c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/Index.cshtml @@ -15,8 +15,6 @@ PageLayout.Content.Title = L["Comments"].Value; PageLayout.Content.BreadCrumb.Add(L["Menu:CMS"].Value); PageLayout.Content.MenuItemName = CmsKitAdminMenus.Comments.CommentsMenu; - - var defaultStartDate = DateTime.Now.AddDays(-7).Date.ToShortDateString(); } @section styles{ @@ -41,7 +39,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/index.js index d3190661eb..728a204f4c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/index.js @@ -5,10 +5,20 @@ $(function (){ var detailsModal = new abp.ModalManager(abp.appPath + "CmsKit/Comments/DetailsModal"); + moment()._locale.preparse = (string) => string; + moment()._locale.postformat = (string) => string; + var getFormattedDate = function ($datePicker) { - return $datePicker.data('date'); + if(!$datePicker.val()) { + return null; + } + var momentDate = moment($datePicker.val(), $datePicker.data('daterangepicker').locale.format); + return momentDate.isValid() ? momentDate.toISOString() : null; }; - + + + var defaultStartDate = moment().add(-7, 'days'); + $("#CreationStartDate").val(defaultStartDate.format('L')); $('.singledatepicker').daterangepicker({ "singleDatePicker": true, @@ -16,25 +26,25 @@ $(function (){ "autoUpdateInput": false, "autoApply": true, "opens": "center", - "drops": "auto", - "minYear": 1901, - "maxYear": 2199, + "drops": "auto" }); + + $('.singledatepicker').attr('autocomplete', 'off'); $('.singledatepicker').on('apply.daterangepicker', function (ev, picker) { $(this).val(picker.startDate.format('l')); - $(this).data('date', picker.startDate.locale('en').format('YYYY-MM-DD')); }); + var filterForm = $('#CmsKitCommentsFilterForm'); var getFilter = function () { var filterObj = filterForm.serializeFormToObject(); - filterObj.creationStartDate = getFormattedDate($('#creationStartDate')); - filterObj.creationEndDate = getFormattedDate($('#creationEndDate')); + filterObj.creationStartDate = getFormattedDate($('#CreationStartDate')); + filterObj.creationEndDate = getFormattedDate($('#CreationEndDate')); return filterObj; }; From 31d4f701bc02135c55e2cfe5b5a917c1c92e9753 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Wed, 28 Sep 2022 00:22:14 +0300 Subject: [PATCH 057/362] Update AbpIoSourceCodeStore.cs --- .../Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs index 636324f0f6..e0817d8a45 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs @@ -205,7 +205,7 @@ public class AbpIoSourceCodeStore : ISourceCodeStore, ITransientDependency private async Task IsVersionExists(string templateName, string version) { - var url = $"{CliUrls.WwwAbpIo}api/download/versions?includePreReleases=true"; + var url = $"{CliUrls.WwwAbpIo}api/download/all-versions?includePreReleases=true"; try { From 04e86d0686ede2ce7ba32c6bbc3dbea750e22b12 Mon Sep 17 00:00:00 2001 From: LiangShiWei Date: Wed, 28 Sep 2022 11:05:20 +0800 Subject: [PATCH 058/362] Update EntityCache_Tests --- .../Volo/Abp/TestApp/TestDataBuilder.cs | 14 +++++- .../Abp/TestApp/Testing/EntityCache_Tests.cs | 44 +++++++------------ 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestDataBuilder.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestDataBuilder.cs index c31363bc98..de2e95895c 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestDataBuilder.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestDataBuilder.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Repositories; using Volo.Abp.TestApp.Domain; +using Volo.Abp.TestApp.Testing; namespace Volo.Abp.TestApp; @@ -15,19 +16,24 @@ public class TestDataBuilder : ITransientDependency public static Guid IstanbulCityId { get; } = new Guid("4d734a0e-3e6b-4bad-bb43-ef8cf1b09633"); public static Guid LondonCityId { get; } = new Guid("27237527-605e-4652-a2a5-68e0e512da36"); + + public static Guid ProductId { get; } = new Guid("c5b3fbd4-7b0b-4a72-8d99-ccf6c8c98f61"); private readonly IBasicRepository _personRepository; private readonly ICityRepository _cityRepository; private readonly IRepository _entityWithIntPksRepository; + private readonly IRepository _productRepository; public TestDataBuilder( IBasicRepository personRepository, ICityRepository cityRepository, - IRepository entityWithIntPksRepository) + IRepository entityWithIntPksRepository, + IRepository productRepository) { _personRepository = personRepository; _cityRepository = cityRepository; _entityWithIntPksRepository = entityWithIntPksRepository; + _productRepository = productRepository; } public async Task BuildAsync() @@ -35,6 +41,7 @@ public class TestDataBuilder : ITransientDependency await AddCities(); await AddPeople(); await AddEntitiesWithPks(); + await AddProducts(); } private async Task AddCities() @@ -87,4 +94,9 @@ public class TestDataBuilder : ITransientDependency { await _entityWithIntPksRepository.InsertAsync(new EntityWithIntPk("Entity1")); } + + private async Task AddProducts() + { + await _productRepository.InsertAsync(new Product(ProductId, "Product1", decimal.One)); + } } diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs index e244e6f79b..4d1f810705 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs @@ -10,14 +10,14 @@ using Xunit; namespace Volo.Abp.TestApp.Testing; -public class EntityCache_Tests : TestAppTestBase +public abstract class EntityCache_Tests : TestAppTestBase where TStartupModule : IAbpModule { protected readonly IRepository ProductRepository; protected readonly IEntityCache ProductEntityCache; protected readonly IEntityCache ProductCacheItem; - public EntityCache_Tests() + protected EntityCache_Tests() { ProductRepository = GetRequiredService>(); ProductEntityCache = GetRequiredService>(); @@ -43,18 +43,15 @@ public class EntityCache_Tests : TestAppTestBase [Fact] public async Task Should_Return_EntityCache() { - var id = Guid.NewGuid(); - var product = await ProductRepository.InsertAsync(new Product(id, "Product1", decimal.One)); - - product = await ProductEntityCache.FindAsync(product.Id); + var product = await ProductEntityCache.FindAsync(TestDataBuilder.ProductId); product.ShouldNotBeNull(); - product.Id.ShouldBe(id); + product.Id.ShouldBe(TestDataBuilder.ProductId); product.Name.ShouldBe("Product1"); product.Price.ShouldBe(decimal.One); var productCacheItem = await ProductCacheItem.FindAsync(product.Id); productCacheItem.ShouldNotBeNull(); - productCacheItem.Id.ShouldBe(id); + productCacheItem.Id.ShouldBe(TestDataBuilder.ProductId); productCacheItem.Name.ShouldBe("Product1"); productCacheItem.Price.ShouldBe(decimal.One); } @@ -62,38 +59,32 @@ public class EntityCache_Tests : TestAppTestBase [Fact] public async Task Should_Return_Null_IF_Deleted() { - var id = Guid.NewGuid(); - var product = await ProductRepository.InsertAsync(new Product(id, "Product1", decimal.One)); - (await ProductEntityCache.FindAsync(id)).ShouldNotBeNull(); - (await ProductCacheItem.FindAsync(id)).ShouldNotBeNull(); - - await ProductRepository.DeleteAsync(id); + await ProductRepository.DeleteAsync(TestDataBuilder.ProductId); - (await ProductEntityCache.FindAsync(product.Id)).ShouldBeNull(); - (await ProductCacheItem.FindAsync(product.Id)).ShouldBeNull(); + (await ProductEntityCache.FindAsync(TestDataBuilder.ProductId)).ShouldBeNull(); + (await ProductCacheItem.FindAsync(TestDataBuilder.ProductId)).ShouldBeNull(); } [Fact] public async Task Should_Return_New_EntityCache_IF_Updated() { - var id = Guid.NewGuid(); - var product = await ProductRepository.InsertAsync(new Product(id, "Product1", decimal.One)); - (await ProductEntityCache.FindAsync(id)).ShouldNotBeNull(); - (await ProductCacheItem.FindAsync(id)).ShouldNotBeNull(); - + (await ProductEntityCache.FindAsync(TestDataBuilder.ProductId)).ShouldNotBeNull(); + (await ProductCacheItem.FindAsync(TestDataBuilder.ProductId)).ShouldNotBeNull(); + + var product = await ProductRepository.FindAsync(TestDataBuilder.ProductId); product.Name = "Product2"; product.Price = decimal.Zero; await ProductRepository.UpdateAsync(product); product = await ProductEntityCache.FindAsync(product.Id); product.ShouldNotBeNull(); - product.Id.ShouldBe(id); + product.Id.ShouldBe(TestDataBuilder.ProductId); product.Name.ShouldBe("Product2"); product.Price.ShouldBe(decimal.Zero); var productCacheItem = await ProductCacheItem.FindAsync(product.Id); productCacheItem.ShouldNotBeNull(); - productCacheItem.Id.ShouldBe(id); + productCacheItem.Id.ShouldBe(TestDataBuilder.ProductId); productCacheItem.Name.ShouldBe("Product2"); productCacheItem.Price.ShouldBe(decimal.Zero); } @@ -102,14 +93,9 @@ public class EntityCache_Tests : TestAppTestBase [Serializable] public class Product : Entity { - public Product() - { - - } - public Product(Guid id, string name, decimal price) + : base(id) { - Id = id; Name = name; Price = price; } From 31e519087efa4f2c64dd48778a9b69711f7133f0 Mon Sep 17 00:00:00 2001 From: LiangShiWei Date: Wed, 28 Sep 2022 11:38:53 +0800 Subject: [PATCH 059/362] Fix unit tests --- .../Volo/Abp/MemoryDb/DomainEvents/EntityCache_Tests.cs | 7 +++++++ .../Volo/Abp/TestApp/MemoryDb/TestAppMemoryDbContext.cs | 6 ++++-- .../Volo/Abp/MongoDB/AbpMongoDbTestModule.cs | 2 +- .../Volo/Abp/TestApp/Testing/EntityCache_Tests.cs | 3 ++- 4 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/DomainEvents/EntityCache_Tests.cs diff --git a/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/DomainEvents/EntityCache_Tests.cs b/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/DomainEvents/EntityCache_Tests.cs new file mode 100644 index 0000000000..6718fabc4e --- /dev/null +++ b/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/DomainEvents/EntityCache_Tests.cs @@ -0,0 +1,7 @@ +using Volo.Abp.TestApp.Testing; + +namespace Volo.Abp.MemoryDb.DomainEvents; + +public class EntityCache_Tests : EntityCache_Tests +{ +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/TestApp/MemoryDb/TestAppMemoryDbContext.cs b/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/TestApp/MemoryDb/TestAppMemoryDbContext.cs index 63eddc6f94..4336889b90 100644 --- a/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/TestApp/MemoryDb/TestAppMemoryDbContext.cs +++ b/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/TestApp/MemoryDb/TestAppMemoryDbContext.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using Volo.Abp.MemoryDb; using Volo.Abp.TestApp.Domain; +using Volo.Abp.TestApp.Testing; namespace Volo.Abp.TestApp.MemoryDb; @@ -9,8 +10,9 @@ public class TestAppMemoryDbContext : MemoryDbContext { private static readonly Type[] EntityTypeList = { typeof(Person), - typeof(EntityWithIntPk) - }; + typeof(EntityWithIntPk), + typeof(Product) + }; public override IReadOnlyList GetEntityTypes() { diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs index 0ad7554ea1..63b63f0873 100644 --- a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs @@ -30,7 +30,7 @@ public class AbpMongoDbTestModule : AbpModule context.Services.AddMongoDbContext(options => { - options.AddDefaultRepositories(true); + options.AddDefaultRepositories(); options.AddRepository(); options.ReplaceDbContext(); diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs index 4d1f810705..7291fcf585 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityCache_Tests.cs @@ -3,6 +3,7 @@ using System.Text.Json.Serialization; using System.Threading.Tasks; using Shouldly; using Volo.Abp.Domain.Entities; +using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.Domain.Entities.Caching; using Volo.Abp.Domain.Repositories; using Volo.Abp.Modularity; @@ -91,7 +92,7 @@ public abstract class EntityCache_Tests : TestAppTestBase +public class Product : FullAuditedAggregateRoot { public Product(Guid id, string name, decimal price) : base(id) From 25b432b736f639bc9e59e1ab43d84540ad204544 Mon Sep 17 00:00:00 2001 From: Stephane Pilloy Date: Wed, 28 Sep 2022 10:04:44 +0200 Subject: [PATCH 060/362] Change FR Localization PagerNext --- framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json index 7504de8acc..0fc43162b2 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json @@ -27,7 +27,7 @@ "Submit": "Envoyer", "Back": "Précédent", "PagerSearch": "Recherche", - "PagerNext": "prochain", + "PagerNext": "Suivant", "PagerPrevious": "Précédent", "PagerFirst": "Première", "PagerLast": "Dernier", From 9a33dd4dbdda8238afd10c25280f005e675c27d5 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Wed, 28 Sep 2022 14:27:23 +0300 Subject: [PATCH 061/362] Update mdl.json files --- modules/account/Volo.Abp.Account.abpmdl.json | 24 +++---- .../Volo.Abp.AuditLogging.abpmdl.json | 8 +-- .../Volo.Abp.BackgroundJobs.abpmdl.json | 46 ++++++------ .../Volo.Abp.BasicTheme.abpmdl.json | 16 ++--- .../Volo.Abp.BlobStoring.Database.abpmdl.json | 16 ++--- modules/blogging/Volo.Blogging.abpmdl.json | 18 ++--- .../Volo.BloggingTestApp.abppkg.json | 2 +- modules/cms-kit/Volo.CmsKit.abpmdl.json | 32 ++++----- .../Volo.Abp.FeatureManagement.abpmdl.json | 56 +++++++-------- .../identity/Volo.Abp.Identity.abpmdl.json | 56 +++++++-------- .../Volo.Abp.IdentityServer.abpmdl.json | 8 +-- .../Volo.Abp.OpenIddict.abpmdl.json | 46 ++++++------ .../Volo.Abp.PermissionManagement.abpmdl.json | 60 ++++++++-------- .../Volo.Abp.SettingManagement.abpmdl.json | 72 +++++++++---------- .../Volo.Abp.TenantManagement.abpmdl.json | 52 +++++++------- modules/users/Volo.Abp.Users.abpmdl.json | 8 +-- .../Volo.Abp.VirtualFileExplorer.abpmdl.json | 8 +-- 17 files changed, 264 insertions(+), 264 deletions(-) diff --git a/modules/account/Volo.Abp.Account.abpmdl.json b/modules/account/Volo.Abp.Account.abpmdl.json index dabb3f2ff9..39ecf6ca19 100644 --- a/modules/account/Volo.Abp.Account.abpmdl.json +++ b/modules/account/Volo.Abp.Account.abpmdl.json @@ -6,28 +6,32 @@ } }, "packages": { - "Volo.Abp.Account.Web": { - "path": "src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.abppkg.json", + "Volo.Abp.Account.Web.OpenIddict": { + "path": "src/Volo.Abp.Account.Web.OpenIddict/Volo.Abp.Account.Web.OpenIddict.abppkg.json", "folder": "src" }, "Volo.Abp.Account.Web.IdentityServer": { "path": "src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.abppkg.json", "folder": "src" }, - "Volo.Abp.Account.Application": { - "path": "src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.abppkg.json", + "Volo.Abp.Account.Web": { + "path": "src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.abppkg.json", "folder": "src" }, - "Volo.Abp.Account.Application.Contracts": { - "path": "src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.abppkg.json", + "Volo.Abp.Account.HttpApi.Client": { + "path": "src/Volo.Abp.Account.HttpApi.Client/Volo.Abp.Account.HttpApi.Client.abppkg.json", "folder": "src" }, "Volo.Abp.Account.HttpApi": { "path": "src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.abppkg.json", "folder": "src" }, - "Volo.Abp.Account.HttpApi.Client": { - "path": "src/Volo.Abp.Account.HttpApi.Client/Volo.Abp.Account.HttpApi.Client.abppkg.json", + "Volo.Abp.Account.Application": { + "path": "src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.abppkg.json", + "folder": "src" + }, + "Volo.Abp.Account.Application.Contracts": { + "path": "src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.abppkg.json", "folder": "src" }, "Volo.Abp.Account.Application.Tests": { @@ -37,10 +41,6 @@ "Volo.Abp.Account.Blazor": { "path": "src/Volo.Abp.Account.Blazor/Volo.Abp.Account.Blazor.abppkg.json", "folder": "src" - }, - "Volo.Abp.Account.Web.OpenIddict": { - "path": "src/Volo.Abp.Account.Web.OpenIddict/Volo.Abp.Account.Web.OpenIddict.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/audit-logging/Volo.Abp.AuditLogging.abpmdl.json b/modules/audit-logging/Volo.Abp.AuditLogging.abpmdl.json index 5b2cc3f54b..7235552474 100644 --- a/modules/audit-logging/Volo.Abp.AuditLogging.abpmdl.json +++ b/modules/audit-logging/Volo.Abp.AuditLogging.abpmdl.json @@ -6,14 +6,14 @@ } }, "packages": { - "Volo.Abp.AuditLogging.Domain.Shared": { - "path": "src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.abppkg.json", - "folder": "src" - }, "Volo.Abp.AuditLogging.Domain": { "path": "src/Volo.Abp.AuditLogging.Domain/Volo.Abp.AuditLogging.Domain.abppkg.json", "folder": "src" }, + "Volo.Abp.AuditLogging.Domain.Shared": { + "path": "src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.abppkg.json", + "folder": "src" + }, "Volo.Abp.AuditLogging.EntityFrameworkCore": { "path": "src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo.Abp.AuditLogging.EntityFrameworkCore.abppkg.json", "folder": "src" diff --git a/modules/background-jobs/Volo.Abp.BackgroundJobs.abpmdl.json b/modules/background-jobs/Volo.Abp.BackgroundJobs.abpmdl.json index e3bea65da3..afaaa34965 100644 --- a/modules/background-jobs/Volo.Abp.BackgroundJobs.abpmdl.json +++ b/modules/background-jobs/Volo.Abp.BackgroundJobs.abpmdl.json @@ -7,14 +7,34 @@ } }, "packages": { - "Volo.Abp.BackgroundJobs.Domain.Shared": { - "path": "src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.abppkg.json", - "folder": "src" + "Volo.Abp.BackgroundJobs.DemoApp": { + "path": "app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.abppkg.json", + "folder": "app" + }, + "Volo.Abp.BackgroundJobs.DemoApp.RabbitMq": { + "path": "app/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq.abppkg.json", + "folder": "app" + }, + "Volo.Abp.BackgroundJobs.DemoApp.Quartz": { + "path": "app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.abppkg.json", + "folder": "app" + }, + "Volo.Abp.BackgroundJobs.DemoApp.HangFire": { + "path": "app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.abppkg.json", + "folder": "app" + }, + "Volo.Abp.BackgroundJobs.DemoApp.Shared": { + "path": "app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Volo.Abp.BackgroundJobs.DemoApp.Shared.abppkg.json", + "folder": "app" }, "Volo.Abp.BackgroundJobs.Domain": { "path": "src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.abppkg.json", "folder": "src" }, + "Volo.Abp.BackgroundJobs.Domain.Shared": { + "path": "src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.abppkg.json", + "folder": "src" + }, "Volo.Abp.BackgroundJobs.EntityFrameworkCore": { "path": "src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.abppkg.json", "folder": "src" @@ -38,26 +58,6 @@ "Volo.Abp.BackgroundJobs.MongoDB.Tests": { "path": "test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.abppkg.json", "folder": "test" - }, - "Volo.Abp.BackgroundJobs.DemoApp": { - "path": "app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.abppkg.json", - "folder": "app" - }, - "Volo.Abp.BackgroundJobs.DemoApp.Shared": { - "path": "app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Volo.Abp.BackgroundJobs.DemoApp.Shared.abppkg.json", - "folder": "app" - }, - "Volo.Abp.BackgroundJobs.DemoApp.HangFire": { - "path": "app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.abppkg.json", - "folder": "app" - }, - "Volo.Abp.BackgroundJobs.DemoApp.RabbitMq": { - "path": "app/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq.abppkg.json", - "folder": "app" - }, - "Volo.Abp.BackgroundJobs.DemoApp.Quartz": { - "path": "app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.abppkg.json", - "folder": "app" } } } \ No newline at end of file diff --git a/modules/basic-theme/Volo.Abp.BasicTheme.abpmdl.json b/modules/basic-theme/Volo.Abp.BasicTheme.abpmdl.json index 23dcc2e243..38278730f3 100644 --- a/modules/basic-theme/Volo.Abp.BasicTheme.abpmdl.json +++ b/modules/basic-theme/Volo.Abp.BasicTheme.abpmdl.json @@ -6,6 +6,14 @@ } }, "packages": { + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo": { + "path": "test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.abppkg.json", + "folder": "test" + }, + "Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo": { + "path": "test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.abppkg.json", + "folder": "test" + }, "Volo.Abp.AspNetCore.Components.Server.BasicTheme": { "path": "src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Volo.Abp.AspNetCore.Components.Server.BasicTheme.abppkg.json", "folder": "src" @@ -22,14 +30,6 @@ "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.abppkg.json", "folder": "src" }, - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo": { - "path": "test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.abppkg.json", - "folder": "test" - }, - "Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo": { - "path": "test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.abppkg.json", - "folder": "test" - }, "Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests": { "path": "test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests.abppkg.json", "folder": "test" diff --git a/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpmdl.json b/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpmdl.json index f5f118cbdc..81e2ef10f4 100644 --- a/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpmdl.json +++ b/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpmdl.json @@ -15,14 +15,18 @@ } }, "packages": { - "Volo.Abp.BlobStoring.Database.Domain.Shared": { - "path": "src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo.Abp.BlobStoring.Database.Domain.Shared.abppkg.json", - "folder": "src" - }, + "BlobStoring.Database.Host.ConsoleApp.ConsoleApp": { + "path": "host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.abppkg.json", + "folder": "host/BlobStoring.Database.Host.ConsoleApp/src" + }i "Volo.Abp.BlobStoring.Database.Domain": { "path": "src/Volo.Abp.BlobStoring.Database.Domain/Volo.Abp.BlobStoring.Database.Domain.abppkg.json", "folder": "src" }, + "Volo.Abp.BlobStoring.Database.Domain.Shared": { + "path": "src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo.Abp.BlobStoring.Database.Domain.Shared.abppkg.json", + "folder": "src" + }, "Volo.Abp.BlobStoring.Database.EntityFrameworkCore": { "path": "src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.abppkg.json", "folder": "src" @@ -46,10 +50,6 @@ "Volo.Abp.BlobStoring.Database.Domain.Tests": { "path": "test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.abppkg.json", "folder": "test" - }, - "BlobStoring.Database.Host.ConsoleApp.ConsoleApp": { - "path": "host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.abppkg.json", - "folder": "host/BlobStoring.Database.Host.ConsoleApp/src" } } } \ No newline at end of file diff --git a/modules/blogging/Volo.Blogging.abpmdl.json b/modules/blogging/Volo.Blogging.abpmdl.json index f3754eec7f..48c3da23d5 100644 --- a/modules/blogging/Volo.Blogging.abpmdl.json +++ b/modules/blogging/Volo.Blogging.abpmdl.json @@ -7,22 +7,26 @@ } }, "packages": { - "Volo.Blogging.Domain.Shared": { - "path": "src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.abppkg.json", - "folder": "src" + "Volo.BloggingTestApp": { + "path": "app/Volo.BloggingTestApp/Volo.BloggingTestApp.abppkg.json", + "folder": "app" }, "Volo.Blogging.Domain": { "path": "src/Volo.Blogging.Domain/Volo.Blogging.Domain.abppkg.json", "folder": "src" }, - "Volo.Blogging.Application.Contracts": { - "path": "src/Volo.Blogging.Application.Contracts/Volo.Blogging.Application.Contracts.abppkg.json", + "Volo.Blogging.Domain.Shared": { + "path": "src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.abppkg.json", "folder": "src" }, "Volo.Blogging.Application": { "path": "src/Volo.Blogging.Application/Volo.Blogging.Application.abppkg.json", "folder": "src" }, + "Volo.Blogging.Application.Contracts": { + "path": "src/Volo.Blogging.Application.Contracts/Volo.Blogging.Application.Contracts.abppkg.json", + "folder": "src" + }, "Volo.Blogging.EntityFrameworkCore": { "path": "src/Volo.Blogging.EntityFrameworkCore/Volo.Blogging.EntityFrameworkCore.abppkg.json", "folder": "src" @@ -43,10 +47,6 @@ "path": "app/Volo.BloggingTestApp.EntityFrameworkCore/Volo.BloggingTestApp.EntityFrameworkCore.abppkg.json", "folder": "app" }, - "Volo.BloggingTestApp": { - "path": "app/Volo.BloggingTestApp/Volo.BloggingTestApp.abppkg.json", - "folder": "app" - }, "Volo.Blogging.TestBase": { "path": "test/Volo.Blogging.TestBase/Volo.Blogging.TestBase.abppkg.json", "folder": "test" diff --git a/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.abppkg.json b/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.abppkg.json index a686451fbc..48875c29cf 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.abppkg.json +++ b/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.abppkg.json @@ -1,3 +1,3 @@ { - "role": "lib.test" + "role": "host.mvc" } \ No newline at end of file diff --git a/modules/cms-kit/Volo.CmsKit.abpmdl.json b/modules/cms-kit/Volo.CmsKit.abpmdl.json index 5e0bfb9317..9cf03be4dc 100644 --- a/modules/cms-kit/Volo.CmsKit.abpmdl.json +++ b/modules/cms-kit/Volo.CmsKit.abpmdl.json @@ -7,6 +7,22 @@ } }, "packages": { + "Volo.CmsKit.Web.Host": { + "path": "host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.abppkg.json", + "folder": "host" + }, + "Volo.CmsKit.IdentityServer": { + "path": "host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.abppkg.json", + "folder": "host" + }, + "Volo.CmsKit.Host.Shared": { + "path": "host/Volo.CmsKit.Host.Shared/Volo.CmsKit.Host.Shared.abppkg.json", + "folder": "host" + }, + "Volo.CmsKit.Web.Unified": { + "path": "host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.abppkg.json", + "folder": "host" + }, "Volo.CmsKit.Domain.Shared": { "path": "src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.abppkg.json", "folder": "src" @@ -71,22 +87,6 @@ "path": "test/Volo.CmsKit.HttpApi.Client.ConsoleTestApp/Volo.CmsKit.HttpApi.Client.ConsoleTestApp.abppkg.json", "folder": "test" }, - "Volo.CmsKit.Web.Host": { - "path": "host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.abppkg.json", - "folder": "host" - }, - "Volo.CmsKit.IdentityServer": { - "path": "host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.abppkg.json", - "folder": "host" - }, - "Volo.CmsKit.Host.Shared": { - "path": "host/Volo.CmsKit.Host.Shared/Volo.CmsKit.Host.Shared.abppkg.json", - "folder": "host" - }, - "Volo.CmsKit.Web.Unified": { - "path": "host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.abppkg.json", - "folder": "host" - }, "Volo.CmsKit.Admin.Application": { "path": "src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.abppkg.json", "folder": "src" diff --git a/modules/feature-management/Volo.Abp.FeatureManagement.abpmdl.json b/modules/feature-management/Volo.Abp.FeatureManagement.abpmdl.json index 4f99948bd0..057390dae8 100644 --- a/modules/feature-management/Volo.Abp.FeatureManagement.abpmdl.json +++ b/modules/feature-management/Volo.Abp.FeatureManagement.abpmdl.json @@ -6,40 +6,52 @@ } }, "packages": { - "Volo.Abp.FeatureManagement.Domain.Shared": { - "path": "src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.abppkg.json", + "Volo.Abp.FeatureManagement.Web": { + "path": "src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.abppkg.json", "folder": "src" }, - "Volo.Abp.FeatureManagement.Domain": { - "path": "src/Volo.Abp.FeatureManagement.Domain/Volo.Abp.FeatureManagement.Domain.abppkg.json", + "Volo.Abp.FeatureManagement.Blazor": { + "path": "src/Volo.Abp.FeatureManagement.Blazor/Volo.Abp.FeatureManagement.Blazor.abppkg.json", "folder": "src" }, - "Volo.Abp.FeatureManagement.Application.Contracts": { - "path": "src/Volo.Abp.FeatureManagement.Application.Contracts/Volo.Abp.FeatureManagement.Application.Contracts.abppkg.json", + "Volo.Abp.FeatureManagement.Blazor.Server": { + "path": "src/Volo.Abp.FeatureManagement.Blazor.Server/Volo.Abp.FeatureManagement.Blazor.Server.abppkg.json", + "folder": "src" + }, + "Volo.Abp.FeatureManagement.Blazor.WebAssembly": { + "path": "src/Volo.Abp.FeatureManagement.Blazor.WebAssembly/Volo.Abp.FeatureManagement.Blazor.WebAssembly.abppkg.json", + "folder": "src" + }, + "Volo.Abp.FeatureManagement.HttpApi": { + "path": "src/Volo.Abp.FeatureManagement.HttpApi/Volo.Abp.FeatureManagement.HttpApi.abppkg.json", + "folder": "src" + }, + "Volo.Abp.FeatureManagement.HttpApi.Client": { + "path": "src/Volo.Abp.FeatureManagement.HttpApi.Client/Volo.Abp.FeatureManagement.HttpApi.Client.abppkg.json", "folder": "src" }, "Volo.Abp.FeatureManagement.Application": { "path": "src/Volo.Abp.FeatureManagement.Application/Volo.Abp.FeatureManagement.Application.abppkg.json", "folder": "src" }, - "Volo.Abp.FeatureManagement.EntityFrameworkCore": { - "path": "src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo.Abp.FeatureManagement.EntityFrameworkCore.abppkg.json", + "Volo.Abp.FeatureManagement.Domain": { + "path": "src/Volo.Abp.FeatureManagement.Domain/Volo.Abp.FeatureManagement.Domain.abppkg.json", "folder": "src" }, - "Volo.Abp.FeatureManagement.MongoDB": { - "path": "src/Volo.Abp.FeatureManagement.MongoDB/Volo.Abp.FeatureManagement.MongoDB.abppkg.json", + "Volo.Abp.FeatureManagement.Domain.Shared": { + "path": "src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.abppkg.json", "folder": "src" }, - "Volo.Abp.FeatureManagement.HttpApi": { - "path": "src/Volo.Abp.FeatureManagement.HttpApi/Volo.Abp.FeatureManagement.HttpApi.abppkg.json", + "Volo.Abp.FeatureManagement.Application.Contracts": { + "path": "src/Volo.Abp.FeatureManagement.Application.Contracts/Volo.Abp.FeatureManagement.Application.Contracts.abppkg.json", "folder": "src" }, - "Volo.Abp.FeatureManagement.HttpApi.Client": { - "path": "src/Volo.Abp.FeatureManagement.HttpApi.Client/Volo.Abp.FeatureManagement.HttpApi.Client.abppkg.json", + "Volo.Abp.FeatureManagement.EntityFrameworkCore": { + "path": "src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo.Abp.FeatureManagement.EntityFrameworkCore.abppkg.json", "folder": "src" }, - "Volo.Abp.FeatureManagement.Web": { - "path": "src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.abppkg.json", + "Volo.Abp.FeatureManagement.MongoDB": { + "path": "src/Volo.Abp.FeatureManagement.MongoDB/Volo.Abp.FeatureManagement.MongoDB.abppkg.json", "folder": "src" }, "Volo.Abp.FeatureManagement.TestBase": { @@ -61,18 +73,6 @@ "Volo.Abp.FeatureManagement.Application.Tests": { "path": "test/Volo.Abp.FeatureManagement.Application.Tests/Volo.Abp.FeatureManagement.Application.Tests.abppkg.json", "folder": "test" - }, - "Volo.Abp.FeatureManagement.Blazor": { - "path": "src/Volo.Abp.FeatureManagement.Blazor/Volo.Abp.FeatureManagement.Blazor.abppkg.json", - "folder": "src" - }, - "Volo.Abp.FeatureManagement.Blazor.Server": { - "path": "src/Volo.Abp.FeatureManagement.Blazor.Server/Volo.Abp.FeatureManagement.Blazor.Server.abppkg.json", - "folder": "src" - }, - "Volo.Abp.FeatureManagement.Blazor.WebAssembly": { - "path": "src/Volo.Abp.FeatureManagement.Blazor.WebAssembly/Volo.Abp.FeatureManagement.Blazor.WebAssembly.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/identity/Volo.Abp.Identity.abpmdl.json b/modules/identity/Volo.Abp.Identity.abpmdl.json index f58988ab30..0ad432d707 100644 --- a/modules/identity/Volo.Abp.Identity.abpmdl.json +++ b/modules/identity/Volo.Abp.Identity.abpmdl.json @@ -6,36 +6,48 @@ } }, "packages": { - "Volo.Abp.Identity.Domain.Shared": { - "path": "src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.abppkg.json", + "Volo.Abp.Identity.Web": { + "path": "src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.abppkg.json", "folder": "src" }, - "Volo.Abp.Identity.Domain": { - "path": "src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.abppkg.json", + "Volo.Abp.Identity.HttpApi": { + "path": "src/Volo.Abp.Identity.HttpApi/Volo.Abp.Identity.HttpApi.abppkg.json", "folder": "src" }, - "Volo.Abp.Identity.Application.Contracts": { - "path": "src/Volo.Abp.Identity.Application.Contracts/Volo.Abp.Identity.Application.Contracts.abppkg.json", + "Volo.Abp.Identity.HttpApi.Client": { + "path": "src/Volo.Abp.Identity.HttpApi.Client/Volo.Abp.Identity.HttpApi.Client.abppkg.json", "folder": "src" }, - "Volo.Abp.Identity.Application": { - "path": "src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.abppkg.json", + "Volo.Abp.Identity.Blazor": { + "path": "src/Volo.Abp.Identity.Blazor/Volo.Abp.Identity.Blazor.abppkg.json", "folder": "src" }, - "Volo.Abp.Identity.EntityFrameworkCore": { - "path": "src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.abppkg.json", + "Volo.Abp.Identity.Blazor.Server": { + "path": "src/Volo.Abp.Identity.Blazor.Server/Volo.Abp.Identity.Blazor.Server.abppkg.json", "folder": "src" }, - "Volo.Abp.Identity.HttpApi": { - "path": "src/Volo.Abp.Identity.HttpApi/Volo.Abp.Identity.HttpApi.abppkg.json", + "Volo.Abp.Identity.Blazor.WebAssembly": { + "path": "src/Volo.Abp.Identity.Blazor.WebAssembly/Volo.Abp.Identity.Blazor.WebAssembly.abppkg.json", "folder": "src" }, - "Volo.Abp.Identity.HttpApi.Client": { - "path": "src/Volo.Abp.Identity.HttpApi.Client/Volo.Abp.Identity.HttpApi.Client.abppkg.json", + "Volo.Abp.Identity.Domain": { + "path": "src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.abppkg.json", "folder": "src" }, - "Volo.Abp.Identity.Web": { - "path": "src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.abppkg.json", + "Volo.Abp.Identity.Application": { + "path": "src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.abppkg.json", + "folder": "src" + }, + "Volo.Abp.Identity.Application.Contracts": { + "path": "src/Volo.Abp.Identity.Application.Contracts/Volo.Abp.Identity.Application.Contracts.abppkg.json", + "folder": "src" + }, + "Volo.Abp.Identity.Domain.Shared": { + "path": "src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.abppkg.json", + "folder": "src" + }, + "Volo.Abp.Identity.EntityFrameworkCore": { + "path": "src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.abppkg.json", "folder": "src" }, "Volo.Abp.Identity.Application.Tests": { @@ -73,18 +85,6 @@ "Volo.Abp.Identity.AspNetCore.Tests": { "path": "test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.abppkg.json", "folder": "test" - }, - "Volo.Abp.Identity.Blazor": { - "path": "src/Volo.Abp.Identity.Blazor/Volo.Abp.Identity.Blazor.abppkg.json", - "folder": "src" - }, - "Volo.Abp.Identity.Blazor.Server": { - "path": "src/Volo.Abp.Identity.Blazor.Server/Volo.Abp.Identity.Blazor.Server.abppkg.json", - "folder": "src" - }, - "Volo.Abp.Identity.Blazor.WebAssembly": { - "path": "src/Volo.Abp.Identity.Blazor.WebAssembly/Volo.Abp.Identity.Blazor.WebAssembly.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/identityserver/Volo.Abp.IdentityServer.abpmdl.json b/modules/identityserver/Volo.Abp.IdentityServer.abpmdl.json index 01fe37ad9f..cda750d441 100644 --- a/modules/identityserver/Volo.Abp.IdentityServer.abpmdl.json +++ b/modules/identityserver/Volo.Abp.IdentityServer.abpmdl.json @@ -6,6 +6,10 @@ } }, "packages": { + "Volo.Abp.PermissionManagement.Domain.IdentityServer": { + "path": "src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo.Abp.PermissionManagement.Domain.IdentityServer.abppkg.json", + "folder": "src" + }, "Volo.Abp.IdentityServer.Domain": { "path": "src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.abppkg.json", "folder": "src" @@ -37,10 +41,6 @@ "Volo.Abp.IdentityServer.Domain.Tests": { "path": "test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.abppkg.json", "folder": "test" - }, - "Volo.Abp.PermissionManagement.Domain.IdentityServer": { - "path": "src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo.Abp.PermissionManagement.Domain.IdentityServer.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/openiddict/Volo.Abp.OpenIddict.abpmdl.json b/modules/openiddict/Volo.Abp.OpenIddict.abpmdl.json index 7cb30216ab..f43ad02c40 100644 --- a/modules/openiddict/Volo.Abp.OpenIddict.abpmdl.json +++ b/modules/openiddict/Volo.Abp.OpenIddict.abpmdl.json @@ -7,14 +7,34 @@ } }, "packages": { - "Volo.Abp.OpenIddict.Domain.Shared": { - "path": "src/Volo.Abp.OpenIddict.Domain.Shared/Volo.Abp.OpenIddict.Domain.Shared.abppkg.json", - "folder": "src" + "OpenIddict.Demo.Server": { + "path": "app/OpenIddict.Demo.Server/OpenIddict.Demo.Server.abppkg.json", + "folder": "app" + }, + "OpenIddict.Demo.Client.Mvc": { + "path": "app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.abppkg.json", + "folder": "app" + }, + "OpenIddict.Demo.Client.Console": { + "path": "app/OpenIddict.Demo.Client.Console/OpenIddict.Demo.Client.Console.abppkg.json", + "folder": "app" + }, + "OpenIddict.Demo.API": { + "path": "app/OpenIddict.Demo.API/OpenIddict.Demo.API.abppkg.json", + "folder": "app" + }, + "OpenIddict.Demo.Client.BlazorWASM": { + "path": "app/OpenIddict.Demo.Client.BlazorWASM/OpenIddict.Demo.Client.BlazorWASM.abppkg.json", + "folder": "app" }, "Volo.Abp.OpenIddict.Domain": { "path": "src/Volo.Abp.OpenIddict.Domain/Volo.Abp.OpenIddict.Domain.abppkg.json", "folder": "src" }, + "Volo.Abp.OpenIddict.Domain.Shared": { + "path": "src/Volo.Abp.OpenIddict.Domain.Shared/Volo.Abp.OpenIddict.Domain.Shared.abppkg.json", + "folder": "src" + }, "Volo.Abp.OpenIddict.EntityFrameworkCore": { "path": "src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo.Abp.OpenIddict.EntityFrameworkCore.abppkg.json", "folder": "src" @@ -39,30 +59,10 @@ "path": "test/Volo.Abp.OpenIddict.Domain.Tests/Volo.Abp.OpenIddict.Domain.Tests.abppkg.json", "folder": "test" }, - "OpenIddict.Demo.Server": { - "path": "app/OpenIddict.Demo.Server/OpenIddict.Demo.Server.abppkg.json", - "folder": "app" - }, - "OpenIddict.Demo.Client.Mvc": { - "path": "app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.abppkg.json", - "folder": "app" - }, "Volo.Abp.OpenIddict.AspNetCore": { "path": "src/Volo.Abp.OpenIddict.AspNetCore/Volo.Abp.OpenIddict.AspNetCore.abppkg.json", "folder": "src" }, - "OpenIddict.Demo.Client.Console": { - "path": "app/OpenIddict.Demo.Client.Console/OpenIddict.Demo.Client.Console.abppkg.json", - "folder": "app" - }, - "OpenIddict.Demo.API": { - "path": "app/OpenIddict.Demo.API/OpenIddict.Demo.API.abppkg.json", - "folder": "app" - }, - "OpenIddict.Demo.Client.BlazorWASM": { - "path": "app/OpenIddict.Demo.Client.BlazorWASM/OpenIddict.Demo.Client.BlazorWASM.abppkg.json", - "folder": "app" - }, "Volo.Abp.PermissionManagement.Domain.OpenIddict": { "path": "src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo.Abp.PermissionManagement.Domain.OpenIddict.abppkg.json", "folder": "src" diff --git a/modules/permission-management/Volo.Abp.PermissionManagement.abpmdl.json b/modules/permission-management/Volo.Abp.PermissionManagement.abpmdl.json index 82dc87dade..6e265fa935 100644 --- a/modules/permission-management/Volo.Abp.PermissionManagement.abpmdl.json +++ b/modules/permission-management/Volo.Abp.PermissionManagement.abpmdl.json @@ -6,28 +6,48 @@ } }, "packages": { - "Volo.Abp.PermissionManagement.Domain.Shared": { - "path": "src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.abppkg.json", + "Volo.Abp.PermissionManagement.Web": { + "path": "src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.abppkg.json", "folder": "src" }, - "Volo.Abp.PermissionManagement.Domain": { - "path": "src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.abppkg.json", + "Volo.Abp.PermissionManagement.Blazor": { + "path": "src/Volo.Abp.PermissionManagement.Blazor/Volo.Abp.PermissionManagement.Blazor.abppkg.json", "folder": "src" }, - "Volo.Abp.PermissionManagement.Application.Contracts": { - "path": "src/Volo.Abp.PermissionManagement.Application.Contracts/Volo.Abp.PermissionManagement.Application.Contracts.abppkg.json", + "Volo.Abp.PermissionManagement.Blazor.Server": { + "path": "src/Volo.Abp.PermissionManagement.Blazor.Server/Volo.Abp.PermissionManagement.Blazor.Server.abppkg.json", + "folder": "src" + }, + "Volo.Abp.PermissionManagement.Blazor.WebAssembly": { + "path": "src/Volo.Abp.PermissionManagement.Blazor.WebAssembly/Volo.Abp.PermissionManagement.Blazor.WebAssembly.abppkg.json", + "folder": "src" + }, + "Volo.Abp.PermissionManagement.HttpApi": { + "path": "src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.abppkg.json", + "folder": "src" + }, + "Volo.Abp.PermissionManagement.HttpApi.Client": { + "path": "src/Volo.Abp.PermissionManagement.HttpApi.Client/Volo.Abp.PermissionManagement.HttpApi.Client.abppkg.json", "folder": "src" }, "Volo.Abp.PermissionManagement.Application": { "path": "src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.abppkg.json", "folder": "src" }, - "Volo.Abp.PermissionManagement.EntityFrameworkCore": { - "path": "src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.abppkg.json", + "Volo.Abp.PermissionManagement.Application.Contracts": { + "path": "src/Volo.Abp.PermissionManagement.Application.Contracts/Volo.Abp.PermissionManagement.Application.Contracts.abppkg.json", "folder": "src" }, - "Volo.Abp.PermissionManagement.Web": { - "path": "src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.abppkg.json", + "Volo.Abp.PermissionManagement.Domain": { + "path": "src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.abppkg.json", + "folder": "src" + }, + "Volo.Abp.PermissionManagement.Domain.Shared": { + "path": "src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.abppkg.json", + "folder": "src" + }, + "Volo.Abp.PermissionManagement.EntityFrameworkCore": { + "path": "src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.abppkg.json", "folder": "src" }, "Volo.Abp.PermissionManagement.Domain.Tests": { @@ -50,29 +70,9 @@ "path": "test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.abppkg.json", "folder": "test" }, - "Volo.Abp.PermissionManagement.HttpApi": { - "path": "src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.abppkg.json", - "folder": "src" - }, - "Volo.Abp.PermissionManagement.HttpApi.Client": { - "path": "src/Volo.Abp.PermissionManagement.HttpApi.Client/Volo.Abp.PermissionManagement.HttpApi.Client.abppkg.json", - "folder": "src" - }, "Volo.Abp.PermissionManagement.Application.Tests": { "path": "test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.abppkg.json", "folder": "test" - }, - "Volo.Abp.PermissionManagement.Blazor": { - "path": "src/Volo.Abp.PermissionManagement.Blazor/Volo.Abp.PermissionManagement.Blazor.abppkg.json", - "folder": "src" - }, - "Volo.Abp.PermissionManagement.Blazor.Server": { - "path": "src/Volo.Abp.PermissionManagement.Blazor.Server/Volo.Abp.PermissionManagement.Blazor.Server.abppkg.json", - "folder": "src" - }, - "Volo.Abp.PermissionManagement.Blazor.WebAssembly": { - "path": "src/Volo.Abp.PermissionManagement.Blazor.WebAssembly/Volo.Abp.PermissionManagement.Blazor.WebAssembly.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/setting-management/Volo.Abp.SettingManagement.abpmdl.json b/modules/setting-management/Volo.Abp.SettingManagement.abpmdl.json index 899d1a00ed..d0412fc6e0 100644 --- a/modules/setting-management/Volo.Abp.SettingManagement.abpmdl.json +++ b/modules/setting-management/Volo.Abp.SettingManagement.abpmdl.json @@ -7,6 +7,42 @@ } }, "packages": { + "Volo.Abp.SettingManagement.DemoApp": { + "path": "app/Volo.Abp.SettingManagement.DemoApp/Volo.Abp.SettingManagement.DemoApp.abppkg.json", + "folder": "app" + }, + "Volo.Abp.SettingManagement.Web": { + "path": "src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.abppkg.json", + "folder": "src" + }, + "Volo.Abp.SettingManagement.Blazor": { + "path": "src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.abppkg.json", + "folder": "src" + }, + "Volo.Abp.SettingManagement.Blazor.Server": { + "path": "src/Volo.Abp.SettingManagement.Blazor.Server/Volo.Abp.SettingManagement.Blazor.Server.abppkg.json", + "folder": "src" + }, + "Volo.Abp.SettingManagement.Blazor.WebAssembly": { + "path": "src/Volo.Abp.SettingManagement.Blazor.WebAssembly/Volo.Abp.SettingManagement.Blazor.WebAssembly.abppkg.json", + "folder": "src" + }, + "Volo.Abp.SettingManagement.HttpApi": { + "path": "src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.abppkg.json", + "folder": "src" + }, + "Volo.Abp.SettingManagement.HttpApi.Client": { + "path": "src/Volo.Abp.SettingManagement.HttpApi.Client/Volo.Abp.SettingManagement.HttpApi.Client.abppkg.json", + "folder": "src" + }, + "Volo.Abp.SettingManagement.Application": { + "path": "src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.abppkg.json", + "folder": "src" + }, + "Volo.Abp.SettingManagement.Application.Contracts": { + "path": "src/Volo.Abp.SettingManagement.Application.Contracts/Volo.Abp.SettingManagement.Application.Contracts.abppkg.json", + "folder": "src" + }, "Volo.Abp.SettingManagement.Domain.Shared": { "path": "src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.abppkg.json", "folder": "src" @@ -38,42 +74,6 @@ "Volo.Abp.SettingManagement.MongoDB.Tests": { "path": "test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.abppkg.json", "folder": "test" - }, - "Volo.Abp.SettingManagement.Web": { - "path": "src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.abppkg.json", - "folder": "src" - }, - "Volo.Abp.SettingManagement.Blazor": { - "path": "src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.abppkg.json", - "folder": "src" - }, - "Volo.Abp.SettingManagement.Application": { - "path": "src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.abppkg.json", - "folder": "src" - }, - "Volo.Abp.SettingManagement.Application.Contracts": { - "path": "src/Volo.Abp.SettingManagement.Application.Contracts/Volo.Abp.SettingManagement.Application.Contracts.abppkg.json", - "folder": "src" - }, - "Volo.Abp.SettingManagement.HttpApi": { - "path": "src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.abppkg.json", - "folder": "src" - }, - "Volo.Abp.SettingManagement.HttpApi.Client": { - "path": "src/Volo.Abp.SettingManagement.HttpApi.Client/Volo.Abp.SettingManagement.HttpApi.Client.abppkg.json", - "folder": "src" - }, - "Volo.Abp.SettingManagement.DemoApp": { - "path": "app/Volo.Abp.SettingManagement.DemoApp/Volo.Abp.SettingManagement.DemoApp.abppkg.json", - "folder": "app" - }, - "Volo.Abp.SettingManagement.Blazor.Server": { - "path": "src/Volo.Abp.SettingManagement.Blazor.Server/Volo.Abp.SettingManagement.Blazor.Server.abppkg.json", - "folder": "src" - }, - "Volo.Abp.SettingManagement.Blazor.WebAssembly": { - "path": "src/Volo.Abp.SettingManagement.Blazor.WebAssembly/Volo.Abp.SettingManagement.Blazor.WebAssembly.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/tenant-management/Volo.Abp.TenantManagement.abpmdl.json b/modules/tenant-management/Volo.Abp.TenantManagement.abpmdl.json index f9094439d8..2bd4dc939d 100644 --- a/modules/tenant-management/Volo.Abp.TenantManagement.abpmdl.json +++ b/modules/tenant-management/Volo.Abp.TenantManagement.abpmdl.json @@ -6,24 +6,20 @@ } }, "packages": { - "Volo.Abp.TenantManagement.Domain.Shared": { - "path": "src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.abppkg.json", - "folder": "src" - }, - "Volo.Abp.TenantManagement.Domain": { - "path": "src/Volo.Abp.TenantManagement.Domain/Volo.Abp.TenantManagement.Domain.abppkg.json", + "Volo.Abp.TenantManagement.Web": { + "path": "src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.abppkg.json", "folder": "src" }, - "Volo.Abp.TenantManagement.Application.Contracts": { - "path": "src/Volo.Abp.TenantManagement.Application.Contracts/Volo.Abp.TenantManagement.Application.Contracts.abppkg.json", + "Volo.Abp.TenantManagement.Blazor": { + "path": "src/Volo.Abp.TenantManagement.Blazor/Volo.Abp.TenantManagement.Blazor.abppkg.json", "folder": "src" }, - "Volo.Abp.TenantManagement.Application": { - "path": "src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.abppkg.json", + "Volo.Abp.TenantManagement.Blazor.WebAssembly": { + "path": "src/Volo.Abp.TenantManagement.Blazor.WebAssembly/Volo.Abp.TenantManagement.Blazor.WebAssembly.abppkg.json", "folder": "src" }, - "Volo.Abp.TenantManagement.EntityFrameworkCore": { - "path": "src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo.Abp.TenantManagement.EntityFrameworkCore.abppkg.json", + "Volo.Abp.TenantManagement.Blazor.Server": { + "path": "src/Volo.Abp.TenantManagement.Blazor.Server/Volo.Abp.TenantManagement.Blazor.Server.abppkg.json", "folder": "src" }, "Volo.Abp.TenantManagement.HttpApi": { @@ -34,8 +30,24 @@ "path": "src/Volo.Abp.TenantManagement.HttpApi.Client/Volo.Abp.TenantManagement.HttpApi.Client.abppkg.json", "folder": "src" }, - "Volo.Abp.TenantManagement.Web": { - "path": "src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.abppkg.json", + "Volo.Abp.TenantManagement.Application": { + "path": "src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.abppkg.json", + "folder": "src" + }, + "Volo.Abp.TenantManagement.Application.Contracts": { + "path": "src/Volo.Abp.TenantManagement.Application.Contracts/Volo.Abp.TenantManagement.Application.Contracts.abppkg.json", + "folder": "src" + }, + "Volo.Abp.TenantManagement.Domain": { + "path": "src/Volo.Abp.TenantManagement.Domain/Volo.Abp.TenantManagement.Domain.abppkg.json", + "folder": "src" + }, + "Volo.Abp.TenantManagement.Domain.Shared": { + "path": "src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.abppkg.json", + "folder": "src" + }, + "Volo.Abp.TenantManagement.EntityFrameworkCore": { + "path": "src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo.Abp.TenantManagement.EntityFrameworkCore.abppkg.json", "folder": "src" }, "Volo.Abp.TenantManagement.Application.Tests": { @@ -61,18 +73,6 @@ "Volo.Abp.TenantManagement.Domain.Tests": { "path": "test/Volo.Abp.TenantManagement.Domain.Tests/Volo.Abp.TenantManagement.Domain.Tests.abppkg.json", "folder": "test" - }, - "Volo.Abp.TenantManagement.Blazor": { - "path": "src/Volo.Abp.TenantManagement.Blazor/Volo.Abp.TenantManagement.Blazor.abppkg.json", - "folder": "src" - }, - "Volo.Abp.TenantManagement.Blazor.WebAssembly": { - "path": "src/Volo.Abp.TenantManagement.Blazor.WebAssembly/Volo.Abp.TenantManagement.Blazor.WebAssembly.abppkg.json", - "folder": "src" - }, - "Volo.Abp.TenantManagement.Blazor.Server": { - "path": "src/Volo.Abp.TenantManagement.Blazor.Server/Volo.Abp.TenantManagement.Blazor.Server.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/users/Volo.Abp.Users.abpmdl.json b/modules/users/Volo.Abp.Users.abpmdl.json index f2b03eef4f..509859df1e 100644 --- a/modules/users/Volo.Abp.Users.abpmdl.json +++ b/modules/users/Volo.Abp.Users.abpmdl.json @@ -9,14 +9,14 @@ "path": "src/Volo.Abp.Users.Domain/Volo.Abp.Users.Domain.abppkg.json", "folder": "src" }, - "Volo.Abp.Users.EntityFrameworkCore": { - "path": "src/Volo.Abp.Users.EntityFrameworkCore/Volo.Abp.Users.EntityFrameworkCore.abppkg.json", - "folder": "src" - }, "Volo.Abp.Users.Domain.Shared": { "path": "src/Volo.Abp.Users.Domain.Shared/Volo.Abp.Users.Domain.Shared.abppkg.json", "folder": "src" }, + "Volo.Abp.Users.EntityFrameworkCore": { + "path": "src/Volo.Abp.Users.EntityFrameworkCore/Volo.Abp.Users.EntityFrameworkCore.abppkg.json", + "folder": "src" + }, "Volo.Abp.Users.Abstractions": { "path": "src/Volo.Abp.Users.Abstractions/Volo.Abp.Users.Abstractions.abppkg.json", "folder": "src" diff --git a/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpmdl.json b/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpmdl.json index dbb8cc5c4e..98ac3e3c2d 100644 --- a/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpmdl.json +++ b/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpmdl.json @@ -6,13 +6,13 @@ } }, "packages": { - "Volo.Abp.VirtualFileExplorer.Web": { - "path": "src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.abppkg.json", - "folder": "src" - }, "Volo.Abp.VirtualFileExplorer.DemoApp": { "path": "app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.abppkg.json", "folder": "app" + }, + "Volo.Abp.VirtualFileExplorer.Web": { + "path": "src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.abppkg.json", + "folder": "src" } } } \ No newline at end of file From 3a5fa78a967fa0810e3758b9cc4bdd1af290420b Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Wed, 28 Sep 2022 14:42:26 +0300 Subject: [PATCH 062/362] Update Index.cshtml --- .../src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml index 4d049e684b..ef7b5bee58 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml @@ -249,7 +249,7 @@ @L["Contributors"].Value - @if (string.IsNullOrEmpty(Model.Document.EditLink)) + @if (!string.IsNullOrEmpty(Model.Document.EditLink)) { @@ -414,4 +414,4 @@ else } })) } -} \ No newline at end of file +} From 7c2753953217e7ffce051aa19783010db1e0eb9a Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Wed, 28 Sep 2022 14:44:51 +0300 Subject: [PATCH 063/362] Update mdl.json files cont. --- modules/cms-kit/Volo.CmsKit.abpmdl.json | 16 ++++----- modules/docs/Volo.Docs.abpmdl.json | 44 ++++++++++++------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/modules/cms-kit/Volo.CmsKit.abpmdl.json b/modules/cms-kit/Volo.CmsKit.abpmdl.json index 9cf03be4dc..69c407d6dd 100644 --- a/modules/cms-kit/Volo.CmsKit.abpmdl.json +++ b/modules/cms-kit/Volo.CmsKit.abpmdl.json @@ -7,10 +7,18 @@ } }, "packages": { + "Volo.CmsKit.Web.Unified": { + "path": "host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.abppkg.json", + "folder": "host" + }, "Volo.CmsKit.Web.Host": { "path": "host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.abppkg.json", "folder": "host" }, + "Volo.CmsKit.HttpApi.Host": { + "path": "host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.abppkg.json", + "folder": "host" + }, "Volo.CmsKit.IdentityServer": { "path": "host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.abppkg.json", "folder": "host" @@ -19,10 +27,6 @@ "path": "host/Volo.CmsKit.Host.Shared/Volo.CmsKit.Host.Shared.abppkg.json", "folder": "host" }, - "Volo.CmsKit.Web.Unified": { - "path": "host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.abppkg.json", - "folder": "host" - }, "Volo.CmsKit.Domain.Shared": { "path": "src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.abppkg.json", "folder": "src" @@ -75,10 +79,6 @@ "path": "test/Volo.CmsKit.Application.Tests/Volo.CmsKit.Application.Tests.abppkg.json", "folder": "test" }, - "Volo.CmsKit.HttpApi.Host": { - "path": "host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.abppkg.json", - "folder": "host" - }, "Volo.CmsKit.Web": { "path": "src/Volo.CmsKit.Web/Volo.CmsKit.Web.abppkg.json", "folder": "src" diff --git a/modules/docs/Volo.Docs.abpmdl.json b/modules/docs/Volo.Docs.abpmdl.json index 12dd1ea26e..19476c5a80 100644 --- a/modules/docs/Volo.Docs.abpmdl.json +++ b/modules/docs/Volo.Docs.abpmdl.json @@ -7,20 +7,36 @@ } }, "packages": { - "Volo.Docs.Domain.Shared": { - "path": "src/Volo.Docs.Domain.Shared/Volo.Docs.Domain.Shared.abppkg.json", + "VoloDocs.Web": { + "path": "app/VoloDocs.Web/VoloDocs.Web.abppkg.json", + "folder": "app" + }, + "VoloDocs.EntityFrameworkCore": { + "path": "app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.abppkg.json", + "folder": "app" + }, + "VoloDocs.Migrator": { + "path": "app/VoloDocs.Migrator/VoloDocs.Migrator.abppkg.json", + "folder": "app" + }, + "Volo.Docs.Web": { + "path": "src/Volo.Docs.Web/Volo.Docs.Web.abppkg.json", + "folder": "src" + }, + "Volo.Docs.Application": { + "path": "src/Volo.Docs.Application/Volo.Docs.Application.abppkg.json", "folder": "src" }, "Volo.Docs.Domain": { "path": "src/Volo.Docs.Domain/Volo.Docs.Domain.abppkg.json", "folder": "src" }, - "Volo.Docs.Application.Contracts": { - "path": "src/Volo.Docs.Application.Contracts/Volo.Docs.Application.Contracts.abppkg.json", + "Volo.Docs.Domain.Shared": { + "path": "src/Volo.Docs.Domain.Shared/Volo.Docs.Domain.Shared.abppkg.json", "folder": "src" }, - "Volo.Docs.Application": { - "path": "src/Volo.Docs.Application/Volo.Docs.Application.abppkg.json", + "Volo.Docs.Application.Contracts": { + "path": "src/Volo.Docs.Application.Contracts/Volo.Docs.Application.Contracts.abppkg.json", "folder": "src" }, "Volo.Docs.EntityFrameworkCore": { @@ -35,10 +51,6 @@ "path": "src/Volo.Docs.HttpApi.Client/Volo.Docs.HttpApi.Client.abppkg.json", "folder": "src" }, - "Volo.Docs.Web": { - "path": "src/Volo.Docs.Web/Volo.Docs.Web.abppkg.json", - "folder": "src" - }, "Volo.Docs.Admin.Application.Contracts": { "path": "src/Volo.Docs.Admin.Application.Contracts/Volo.Docs.Admin.Application.Contracts.abppkg.json", "folder": "src" @@ -79,18 +91,6 @@ "path": "test/Volo.Docs.Admin.Application.Tests/Volo.Docs.Admin.Application.Tests.abppkg.json", "folder": "test" }, - "VoloDocs.EntityFrameworkCore": { - "path": "app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.abppkg.json", - "folder": "app" - }, - "VoloDocs.Web": { - "path": "app/VoloDocs.Web/VoloDocs.Web.abppkg.json", - "folder": "app" - }, - "VoloDocs.Migrator": { - "path": "app/VoloDocs.Migrator/VoloDocs.Migrator.abppkg.json", - "folder": "app" - }, "Volo.Docs.MongoDB": { "path": "src/Volo.Docs.MongoDB/Volo.Docs.MongoDB.abppkg.json", "folder": "src" From ba902f4edb64cce2e2d52c0199cd98174d667740 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 29 Sep 2022 13:16:35 +0800 Subject: [PATCH 064/362] Make sure the culture is valid. Resolve #14174 --- .../Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs | 8 +++++++- .../AspNetCore/Mvc/Localization/AbpLanguagesController.cs | 6 ++++++ .../Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs index 8fc6a3995c..00b3f87056 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs @@ -118,6 +118,12 @@ public class MultiTenancyMiddleware : IMiddleware, ITransientDependency uiCulture = defaultLanguage; } - return new RequestCulture(culture, uiCulture); + if (CultureHelper.IsValidCultureCode(culture) && + CultureHelper.IsValidCultureCode(uiCulture)) + { + return new RequestCulture(culture, uiCulture); + } + + return null; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs index 9f5d6aa530..8a4f82953a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.Mvc; using System; +using System.Globalization; using System.Threading.Tasks; using Microsoft.AspNetCore.RequestLocalization; using Volo.Abp.Auditing; @@ -30,6 +31,11 @@ public class AbpLanguagesController : AbpController throw new AbpException("The selected culture is not valid! Make sure you enter a valid culture code."); } + if (!CultureHelper.IsValidCultureCode(uiCulture)) + { + throw new AbpException("The selected uiCulture is not valid! Make sure you enter a valid culture code."); + } + AbpRequestCultureCookieHelper.SetCultureCookie( HttpContext, new RequestCulture(culture, uiCulture) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs index 74a62116a4..adf2890b21 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs @@ -47,7 +47,7 @@ public static class CultureHelper try { - CultureInfo.GetCultureInfo(cultureCode); + _ = CultureInfo.GetCultureInfo(cultureCode); return true; } catch (CultureNotFoundException) From 2941236df659da2c434be40157c6cd3b15953aa9 Mon Sep 17 00:00:00 2001 From: Hamza Albreem <94292623+braim23@users.noreply.github.com> Date: Thu, 29 Sep 2022 09:26:47 +0300 Subject: [PATCH 065/362] Added localization for the reject trial license button --- .../AbpIoLocalization/Admin/Localization/Resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 7a064a8ce7..91a24bdf85 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -399,6 +399,7 @@ "AllowFeatureUpgradeOnLicenseExpire": "Allow feature upgrade on license expire", "Deleted{0}": "[Deleted {0}]", "Tags": "Tags", - "SetTagsInfo": "Tags should be comma-separated. Eg: CSharp, Entity Framework" + "SetTagsInfo": "Tags should be comma-separated. Eg: CSharp, Entity Framework", + "RejectTrialLicenseWarningMessage": "Are you sure you want to reject this request?" } } From eeb783498dba58f3e7be493433b766147c24cafa Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Thu, 29 Sep 2022 09:31:01 +0300 Subject: [PATCH 066/362] Update en.json --- .../AbpIoLocalization/Admin/Localization/Resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 91a24bdf85..3251f8224f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -400,6 +400,6 @@ "Deleted{0}": "[Deleted {0}]", "Tags": "Tags", "SetTagsInfo": "Tags should be comma-separated. Eg: CSharp, Entity Framework", - "RejectTrialLicenseWarningMessage": "Are you sure you want to reject this request?" + "RejectTrialLicenseWarningMessage": "Are you sure you want to reject this trial license request?" } } From 25057a1ae9502f8abe8ca659e5cbf438062df129 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Thu, 29 Sep 2022 11:39:37 +0300 Subject: [PATCH 067/362] Check latest version one time per day --- .../Volo/Abp/Cli/CliConsts.cs | 14 +++--- .../Volo/Abp/Cli/CliPaths.cs | 1 + .../Volo/Abp/Cli/CliService.cs | 34 ++++++++++++- .../Volo/Abp/Cli/Commands/GetSourceCommand.cs | 5 -- .../Services/SourceCodeDownloadService.cs | 3 +- .../Volo/Abp/Cli/Memory/MemoryService.cs | 50 +++++++++++++++++++ 6 files changed, 91 insertions(+), 16 deletions(-) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Memory/MemoryService.cs diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliConsts.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliConsts.cs index ac4747de5d..1c0cd3ace4 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliConsts.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliConsts.cs @@ -1,11 +1,4 @@ -using System.Collections.Generic; -using System.Security.Policy; -using Volo.Abp.Cli.ProjectBuilding.Templates.App; -using Volo.Abp.Cli.ProjectBuilding.Templates.Microservice; -using Volo.Abp.Cli.ProjectBuilding.Templates.Module; -using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule; - -namespace Volo.Abp.Cli; +namespace Volo.Abp.Cli; public static class CliConsts { @@ -24,4 +17,9 @@ public static class CliConsts public const string AppSettingsJsonFileName = "appsettings.json"; public const string AppSettingsSecretJsonFileName = "appsettings.secrets.json"; + + public static class MemoryKeys + { + public const string LatestCliVersionCheckDate = "LatestCliVersionCheckDate"; + } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliPaths.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliPaths.cs index e4cec4e2c4..e2e362b4cc 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliPaths.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliPaths.cs @@ -10,6 +10,7 @@ public static class CliPaths public static string Log => Path.Combine(AbpRootPath, "cli", "logs"); public static string Root => Path.Combine(AbpRootPath, "cli"); public static string AccessToken => Path.Combine(AbpRootPath, "cli", "access-token.bin"); + public static string Memory => Path.Combine(AbpRootPath, "cli", "memory.bin"); public static string Build => Path.Combine(AbpRootPath, "build"); public static string Lic => Path.Combine(Path.GetTempPath(), Encoding.ASCII.GetString(new byte[] { 65, 98, 112, 76, 105, 99, 101, 110, 115, 101, 46, 98, 105, 110 })); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs index f03ae851c1..9444381a0d 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.Logging.Abstractions; using NuGet.Versioning; using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Reflection; @@ -11,14 +12,17 @@ using System.Text; using System.Threading.Tasks; using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Commands; +using Volo.Abp.Cli.Memory; using Volo.Abp.Cli.NuGet; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; +using Volo.Abp.IO; namespace Volo.Abp.Cli; public class CliService : ITransientDependency { + private readonly MemoryService _memoryService; public ILogger Logger { get; set; } protected ICommandLineArgumentParser CommandLineArgumentParser { get; } protected ICommandSelector CommandSelector { get; } @@ -31,8 +35,10 @@ public class CliService : ITransientDependency ICommandSelector commandSelector, IServiceScopeFactory serviceScopeFactory, NuGetService nugetService, - ICmdHelper cmdHelper) + ICmdHelper cmdHelper, + MemoryService memoryService) { + _memoryService = memoryService; CommandLineArgumentParser = commandLineArgumentParser; CommandSelector = commandSelector; ServiceScopeFactory = serviceScopeFactory; @@ -164,6 +170,11 @@ public class CliService : ITransientDependency private async Task CheckCliVersionAsync() { + if (!await IsLatestVersionCheckExpiredAsync()) + { + return; + } + var assembly = typeof(CliService).Assembly; var toolPath = GetToolPath(assembly); var currentCliVersion = await GetCurrentCliVersionInternalAsync(assembly); @@ -187,6 +198,27 @@ public class CliService : ITransientDependency } } + private async Task IsLatestVersionCheckExpiredAsync() + { + try + { + var latestTime = await _memoryService.GetAsync(CliConsts.MemoryKeys.LatestCliVersionCheckDate); + + if (latestTime != null && DateTime.Now - DateTime.Parse(latestTime, CultureInfo.InvariantCulture) < TimeSpan.FromDays(1)) + { + return false; + } + + await _memoryService.SetAsync(CliConsts.MemoryKeys.LatestCliVersionCheckDate, DateTime.Now.ToString(CultureInfo.InvariantCulture)); + + return true; + } + catch (Exception) + { + return true; + } + } + private string GetToolPath(Assembly assembly) { if (!assembly.Location.Contains(".store")) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GetSourceCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GetSourceCommand.cs index 1cccf87f7b..82f5bd11ba 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GetSourceCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GetSourceCommand.cs @@ -39,13 +39,8 @@ public class GetSourceCommand : IConsoleCommand, ITransientDependency } var version = commandLineArgs.Options.GetOrNull(Options.Version.Short, Options.Version.Long); - if (version != null) - { - Logger.LogInformation("Version: " + version); - } var outputFolder = GetOutPutFolder(commandLineArgs); - Logger.LogInformation("Output folder: " + outputFolder); var gitHubAbpLocalRepositoryPath = commandLineArgs.Options.GetOrNull(Options.GitHubAbpLocalRepositoryPath.Long); if (gitHubAbpLocalRepositoryPath != null) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/SourceCodeDownloadService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/SourceCodeDownloadService.cs index c9a4a7098b..bee03b9c1f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/SourceCodeDownloadService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/SourceCodeDownloadService.cs @@ -33,8 +33,7 @@ public class SourceCodeDownloadService : ITransientDependency public async Task DownloadModuleAsync(string moduleName, string outputFolder, string version, string gitHubAbpLocalRepositoryPath, string gitHubVoloLocalRepositoryPath, AbpCommandLineOptions options) { - Logger.LogInformation("Downloading source code of " + moduleName); - Logger.LogInformation("Version: " + (version ?? "Latest")); + Logger.LogInformation($"Downloading source code of {moduleName} (v{version ?? "Latest"})"); Logger.LogInformation("Output folder: " + outputFolder); var result = await ModuleProjectBuilder.BuildAsync( diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Memory/MemoryService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Memory/MemoryService.cs new file mode 100644 index 0000000000..5f8b18cf99 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Memory/MemoryService.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Volo.Abp.DependencyInjection; +using Volo.Abp.IO; + +namespace Volo.Abp.Cli.Memory; + +public class MemoryService : ITransientDependency +{ + private const string KeyValueSeparator = "|||"; + + [ItemCanBeNull] + public async Task GetAsync(string key) + { + if (!File.Exists(CliPaths.Memory)) + { + return null; + } + + return (await FileHelper.ReadAllTextAsync(CliPaths.Memory)) + .Split(new[] { Environment.NewLine, "\n" }, StringSplitOptions.None) + .FirstOrDefault(x => x.StartsWith($"{key} "))?.Split(KeyValueSeparator).Last().Trim(); + } + + public async Task SetAsync(string key, string value) + { + if (!File.Exists(CliPaths.Memory)) + { + File.WriteAllText(CliPaths.Memory, + $"{key} {KeyValueSeparator} {value}" + ); + return; + } + + var memoryContentLines = (await FileHelper.ReadAllTextAsync(CliPaths.Memory)) + .Split(new[] { Environment.NewLine, "\n" }, StringSplitOptions.None) + .ToList(); + + memoryContentLines.RemoveAll(x => x.StartsWith(key)); + memoryContentLines.Add($"{key} {KeyValueSeparator} {value}"); + + File.WriteAllText(CliPaths.Memory, + memoryContentLines.JoinAsString(Environment.NewLine) + ); + } +} \ No newline at end of file From 69398329a64a934b1def653561f95ac8c26ec907 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Thu, 29 Sep 2022 13:00:09 +0300 Subject: [PATCH 068/362] Cli: Update memory file path --- framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliPaths.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliPaths.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliPaths.cs index e2e362b4cc..99ba8fbe7e 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliPaths.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliPaths.cs @@ -10,7 +10,7 @@ public static class CliPaths public static string Log => Path.Combine(AbpRootPath, "cli", "logs"); public static string Root => Path.Combine(AbpRootPath, "cli"); public static string AccessToken => Path.Combine(AbpRootPath, "cli", "access-token.bin"); - public static string Memory => Path.Combine(AbpRootPath, "cli", "memory.bin"); + public static string Memory => Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)!, "memory.bin"); public static string Build => Path.Combine(AbpRootPath, "build"); public static string Lic => Path.Combine(Path.GetTempPath(), Encoding.ASCII.GetString(new byte[] { 65, 98, 112, 76, 105, 99, 101, 110, 115, 101, 46, 98, 105, 110 })); From 6706499fa3bf048fc735139addd68f964618959e Mon Sep 17 00:00:00 2001 From: Galip Tolga Erdem Date: Thu, 29 Sep 2022 13:57:15 +0300 Subject: [PATCH 069/362] Added policy options for document discovery --- .../IdentityClientConfiguration.cs | 18 ++++++++++++++++++ .../IdentityModelAuthenticationService.cs | 4 +++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs index 325491685b..d31b95e231 100644 --- a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs +++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs @@ -83,6 +83,24 @@ public class IdentityClientConfiguration : Dictionary get => this.GetOrDefault(nameof(CacheAbsoluteExpiration))?.To() ?? 60 * 30; set => this[nameof(CacheAbsoluteExpiration)] = value.ToString(CultureInfo.InvariantCulture); } + + /// + /// ValidateIssuerName. + /// Default: true. + /// + public bool ValidateIssuerName { + get => this.GetOrDefault(nameof(ValidateIssuerName))?.To() ?? true; + set => this[nameof(ValidateIssuerName)] = value.ToString().ToLowerInvariant(); + } + + /// + /// ValidateEndpoints. + /// Default: true. + /// + public bool ValidateEndpoints { + get => this.GetOrDefault(nameof(ValidateEndpoints))?.To() ?? true; + set => this[nameof(ValidateEndpoints)] = value.ToString().ToLowerInvariant(); + } public IdentityClientConfiguration() { diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs index 6e98a047bb..db59346465 100644 --- a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs +++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs @@ -127,7 +127,9 @@ public class IdentityModelAuthenticationService : IIdentityModelAuthenticationSe Address = configuration.Authority, Policy = { - RequireHttps = configuration.RequireHttps + RequireHttps = configuration.RequireHttps, + ValidateIssuerName = configuration.ValidateIssuerName, + ValidateEndpoints = configuration.ValidateEndpoints } }; IdentityModelHttpRequestMessageOptions.ConfigureHttpRequestMessage?.Invoke(request); From 2e4206413706d92ceace620e2b9257465c21843f Mon Sep 17 00:00:00 2001 From: Galip Tolga Erdem Date: Thu, 29 Sep 2022 13:59:48 +0300 Subject: [PATCH 070/362] Update IdentityClientConfiguration.cs --- .../Volo/Abp/IdentityModel/IdentityClientConfiguration.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs index d31b95e231..8faf3225ab 100644 --- a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs +++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs @@ -116,7 +116,9 @@ public class IdentityClientConfiguration : Dictionary string userName = null, string userPassword = null, bool requireHttps = true, - int cacheAbsoluteExpiration = 60 * 30) + int cacheAbsoluteExpiration = 60 * 30, + bool validateIssuerName = true, + bool validateEndpoints = true) { this[nameof(Authority)] = authority; this[nameof(Scope)] = scope; @@ -127,5 +129,7 @@ public class IdentityClientConfiguration : Dictionary this[nameof(UserPassword)] = userPassword; this[nameof(RequireHttps)] = requireHttps.ToString().ToLowerInvariant(); this[nameof(CacheAbsoluteExpiration)] = cacheAbsoluteExpiration.ToString(CultureInfo.InvariantCulture); + this[nameof(ValidateIssuerName)] = validateIssuerName.ToString().ToLowerInvariant(); + this[nameof(ValidateEndpoints)] = validateEndpoints.ToString().ToLowerInvariant(); } } From 2cf53087d7cc0f08c88811ff3b39053a7d9b786e Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Thu, 29 Sep 2022 15:06:10 +0300 Subject: [PATCH 071/362] Support HideAbpEndpoints method for optional query parameter. Resolves #14172 --- .../Volo/Abp/Swashbuckle/AbpSwashbuckleDocumentFilter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleDocumentFilter.cs b/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleDocumentFilter.cs index 8bd9c0c81b..5e86c04189 100644 --- a/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleDocumentFilter.cs +++ b/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleDocumentFilter.cs @@ -17,7 +17,7 @@ public class AbpSwashbuckleDocumentFilter : IDocumentFilter .Where(actionDescriptor => !string.IsNullOrEmpty(actionDescriptor.DisplayName) && ActionUrlPrefixes.Any(actionUrlPrefix => !actionDescriptor.DisplayName.Contains(actionUrlPrefix))) .DistinctBy(actionDescriptor => actionDescriptor.AttributeRouteInfo?.Template) - .Select(actionDescriptor => actionDescriptor.AttributeRouteInfo?.Template.EnsureStartsWith('/')) + .Select(actionDescriptor => actionDescriptor.AttributeRouteInfo?.Template?.EnsureStartsWith('/').Replace("?", "")) .Where(actionUrl => !string.IsNullOrEmpty(actionUrl)) .ToList(); From 57d1c06c3942d856de19bf1eae2a1a31d96064f9 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Thu, 29 Sep 2022 15:29:15 +0300 Subject: [PATCH 072/362] Update Index.cshtml.cs --- .../Pages/Public/CmsKit/Blogs/Index.cshtml.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs index f5f2cc2f7a..e83eb03153 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs @@ -27,11 +27,11 @@ public class IndexModel : CmsKitPublicPageModelBase [BindProperty(SupportsGet = true)] public Guid? TagId { get; set; } - public PagedResultDto Blogs { get; private set; } + public PagedResultDto Blogs { get; protected set; } public PagerModel PagerModel => new PagerModel(Blogs.TotalCount, Blogs.Items.Count, CurrentPage, PageSize, Request.Path.ToString()); - public CmsUserDto SelectedAuthor { get; set; } + public CmsUserDto SelectedAuthor { get; protected set; } protected IBlogPostPublicAppService BlogPostPublicAppService { get; } @@ -40,7 +40,7 @@ public class IndexModel : CmsKitPublicPageModelBase BlogPostPublicAppService = blogPostPublicAppService; } - public async Task OnGetAsync() + public virtual async Task OnGetAsync() { Blogs = await BlogPostPublicAppService.GetListAsync( BlogSlug, @@ -56,5 +56,7 @@ public class IndexModel : CmsKitPublicPageModelBase { SelectedAuthor = await BlogPostPublicAppService.GetAuthorHasBlogPostAsync(AuthorId.Value); } + + return Page(); } } From d319b0f775443cdb8ffae35379e1624677ed9941 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 30 Sep 2022 09:58:30 +0800 Subject: [PATCH 073/362] Find button under `AbpContentToolbar`. Resolve #14191 --- .../src/Volo.Abp.Identity.Web/Pages/Identity/Roles/index.js | 2 +- .../src/Volo.Abp.Identity.Web/Pages/Identity/Users/index.js | 2 +- .../Pages/TenantManagement/Tenants/Index.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/index.js b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/index.js index e6f5810c9d..b2093e1e4e 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/index.js +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/index.js @@ -135,7 +135,7 @@ _dataTable.ajax.reload(); }); - _$wrapper.find('button[name=CreateRole]').click(function (e) { + $('#AbpContentToolbar button[name=CreateRole]').click(function (e) { e.preventDefault(); _createModal.open(); }); diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/index.js b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/index.js index fcd3a72f52..26b2e1ce36 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/index.js +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/index.js @@ -170,7 +170,7 @@ _dataTable.ajax.reload(); }); - _$wrapper.find('button[name=CreateUser]').click(function (e) { + $('#AbpContentToolbar button[name=CreateUser]').click(function (e) { e.preventDefault(); _createModal.open(); }); diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js index a9cf094c6c..d1cbbf6bdc 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js @@ -109,7 +109,7 @@ _dataTable.ajax.reload(); }); - _$wrapper.find('button[name=CreateTenant]').click(function (e) { + $('#AbpContentToolbar button[name=CreateTenant]').click(function (e) { e.preventDefault(); _createModal.open(); }); From 6c6f0227d51b6ff646175ab3412b0c8389ee69c6 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 30 Sep 2022 16:00:47 +0800 Subject: [PATCH 074/362] Avoid using eval in javascript. Resolve #14178 --- .../jquery/jquery-extensions.js | 42 ++++++------------- 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js index d62dba1809..78e98071ea 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js @@ -99,7 +99,7 @@ // add unchecked checkboxes because serializeArray ignores them $(this).find("input[type=checkbox]").each(function () { if (!$(this).is(':checked')) { - data.push({name: this.name, value: this.checked}); + data.push({ name: this.name, value: this.checked }); } }); @@ -118,26 +118,7 @@ }); //map to object - - var getVarName = function (v) { - return v.toString().replace(/\(\)\s?=\>\s?/, ''); - } - - var getNames = function (index, variable) { - var name = ''; - for (var i = 0; i <= index; i++) { - if (i == 0) { - name = variable + '[' + i + ']' - } else { - name += '][' + variable + '[' + i + ']' - } - } - return name; - } - var obj = {}; - var objName = getVarName(() => obj); - if (camelCase !== undefined ? camelCase : true) { data.forEach(function (d) { d.name = toCamelCase(d.name); @@ -146,18 +127,19 @@ data.map(function (x) { var names = x.name.split("."); - var xName = getVarName(() => x); - var namesName = getVarName(() => names); + for (var i = 0; i < names.length; i++) { + var o = obj; + for (var j = 0; j <= i; j++) { + if ($.isEmptyObject(o[names[j]])) { + o[names[j]] = {}; + } - var i = obj ? 0 : 1; - for (i = 0; i < names.length; i++) { - if (eval('!' + objName + '[' + getNames(i, '' + namesName + '') + ']')) { - eval('' + objName + '[' + getNames(i, '' + namesName + '') + '] = {}'); - } - } + if (i == names.length - 1 && j == i) { + o[names[j]] = x.value; + } - if ($.isEmptyObject(eval('' + objName + '[' + getNames(names.length - 1, '' + namesName + '') + ']'))) { - eval('' + objName + '[' + getNames(names.length - 1, '' + namesName + '') + '] = ' + xName + '.value'); + o = o[names[j]] + } } }); From 53fdf86acc72d9da5cfb896cb076cb0f9fa65335 Mon Sep 17 00:00:00 2001 From: LiangShiWei Date: Fri, 30 Sep 2022 16:53:40 +0800 Subject: [PATCH 075/362] Fix cms build error --- .../Pages/Public/CmsKit/Blogs/Index.cshtml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs index 1f2f57f36d..7feab76946 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs @@ -25,7 +25,7 @@ public class IndexModel : CmsKitPublicPageModelBase [BindProperty(SupportsGet = true)] public Guid? TagId { get; set; } - public PagedResultDto Blogs { get; protected set; } + public PagedResultDto Blogs { get; protected set; } public PagerModel PagerModel => new PagerModel(Blogs.TotalCount, Blogs.Items.Count, CurrentPage, PageSize, Request.Path.ToString()); From 211f9b927c5cb2ab6f16f12c4c8dc601124638a2 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 1 Oct 2022 10:27:51 +0800 Subject: [PATCH 076/362] Update build-all.ps1 --- build/build-all.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/build-all.ps1 b/build/build-all.ps1 index 16f8bf037c..f0b2f398db 100644 --- a/build/build-all.ps1 +++ b/build/build-all.ps1 @@ -6,6 +6,8 @@ $full = $args[0] Write-Host $solutionPaths +dotnet workload install wasm-tools + foreach ($solutionPath in $solutionPaths) { $solutionAbsPath = (Join-Path $rootFolder $solutionPath) Set-Location $solutionAbsPath From f6ca95b3586d774448d87f97cb45454fc1c25de3 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 1 Oct 2022 14:04:41 +0800 Subject: [PATCH 077/362] Update JsonNetAuditSerializer_Test.cs --- .../Volo/Abp/Auditing/JsonNetAuditSerializer_Test.cs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonNetAuditSerializer_Test.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonNetAuditSerializer_Test.cs index 1dc3fcf839..4de7881cac 100644 --- a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonNetAuditSerializer_Test.cs +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonNetAuditSerializer_Test.cs @@ -8,13 +8,6 @@ namespace Volo.Abp.Auditing; public class JsonNetAuditSerializer_Test : AbpAuditingTestBase { - private readonly JsonNetAuditSerializer _jsonNetAuditSerializer; - - public JsonNetAuditSerializer_Test() - { - _jsonNetAuditSerializer = GetRequiredService(); - } - protected override void AfterAddApplication(IServiceCollection services) { services.Configure(options => @@ -34,7 +27,7 @@ public class JsonNetAuditSerializer_Test : AbpAuditingTestBase {"input2", new Input2Dto {UserName = "admin", Password = "1q2w3E*", Birthday = DateTime.Now}} }; - var str = _jsonNetAuditSerializer.Serialize(arguments); + var str = GetRequiredService().Serialize(arguments); str.ShouldNotContain("IdCard"); str.ShouldNotContain("1q2w3E*"); From 3871cd8414ec39f87abcac09f6a65961548fba19 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 1 Oct 2022 15:03:52 +0800 Subject: [PATCH 078/362] Update JsonAuditSerializer_Test.cs --- .../Volo/Abp/Auditing/JsonAuditSerializer_Test.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonAuditSerializer_Test.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonAuditSerializer_Test.cs index ec6244c4d7..2613fe4ba6 100644 --- a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonAuditSerializer_Test.cs +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/JsonAuditSerializer_Test.cs @@ -28,7 +28,7 @@ public class JsonAuditSerializer_Test : AbpAuditingTestBase {"input2", new Input2Dto {UserName = "admin", Password = "1q2w3E*", Birthday = DateTime.Now}} }; - var str = GetRequiredService().Serialize(arguments); + var str = GetRequiredService().Serialize(arguments); str.ShouldNotContain("IdCard"); str.ShouldNotContain("1q2w3E*"); From cf3d090c4f3ce2785d1e3256b6b02afe53a794aa Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 1 Oct 2022 19:40:53 +0800 Subject: [PATCH 079/362] Upgrade `AutoMapper` to 12. --- NuGet.Config | 1 - framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index 786a28a6c0..a0572030a2 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -3,6 +3,5 @@ - \ No newline at end of file diff --git a/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj b/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj index 1fc812671d..f1408e38e2 100644 --- a/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj +++ b/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj @@ -21,7 +21,7 @@ - + From a4152f3f579bc5189901996de85d785634e1ed72 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 3 Oct 2022 11:01:19 +0800 Subject: [PATCH 080/362] Update `OpenIddict-Mvc.md`. --- .../2022-07-26 v6_0_Preview/POST.md | 8 ++++---- .../en/Migration-Guides/OpenIddict-Angular.md | 10 +++++----- .../OpenIddict-Blazor-Server.md | 10 +++++----- docs/en/Migration-Guides/OpenIddict-Blazor.md | 10 +++++----- docs/en/Migration-Guides/OpenIddict-Mvc.md | 10 +++++----- .../OpenIddict-Step-by-Step.md | 20 +++++++++---------- 6 files changed, 34 insertions(+), 34 deletions(-) diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/POST.md b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/POST.md index 2b756f2958..e545681d71 100644 --- a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/POST.md +++ b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/POST.md @@ -10,16 +10,16 @@ Try this version and provide feedback for the stable ABP v6.0! Thank you to all. Follow the steps below to try version 6.0.0 RC today: -1) **Upgrade** the ABP CLI to version `6.0.0-rc.1` using a command line terminal: +1) **Upgrade** the ABP CLI to version `6.0.0-rc.5` using a command line terminal: ````bash -dotnet tool update Volo.Abp.Cli -g --version 6.0.0-rc.1 +dotnet tool update Volo.Abp.Cli -g --version 6.0.0-rc.5 ```` **or install** it if you haven't before: ````bash -dotnet tool install Volo.Abp.Cli -g --version 6.0.0-rc.1 +dotnet tool install Volo.Abp.Cli -g --version 6.0.0-rc.5 ```` 2) Create a **new application** with the `--preview` option: @@ -199,7 +199,7 @@ The following improvements have been made on [eShopOnAbp project](https://github * Performance Improvements have been made in the **Settings Module** and tabs on the *Settings* page are lazy loading now. * Some improvements have been made in the CMS Kit Module. You can see the improvements from [here](https://github.com/abpframework/abp/issues/11965). -If you want to see more details, you can check [the release on GitHub](https://github.com/abpframework/abp/releases/tag/6.0.0-rc.1), which contains a list of all the issues and pull requests closed in this version. +If you want to see more details, you can check [the release on GitHub](https://github.com/abpframework/abp/releases/tag/6.0.0-rc.5), which contains a list of all the issues and pull requests closed in this version. diff --git a/docs/en/Migration-Guides/OpenIddict-Angular.md b/docs/en/Migration-Guides/OpenIddict-Angular.md index e8d34cb5fc..77fb7f1447 100644 --- a/docs/en/Migration-Guides/OpenIddict-Angular.md +++ b/docs/en/Migration-Guides/OpenIddict-Angular.md @@ -16,14 +16,14 @@ - In **MyApplication.HttpApi.Host.csproj** replace **project references**: ```csharp - - + + ``` with ```csharp - + ``` - In the **MyApplicationHttpApiHostModule.cs** replace usings and **module dependencies**: @@ -117,13 +117,13 @@ This project is renamed to **AuthServer** after v6.0.0-rc1. You can also refacto - In **MyApplication.IdentityServer.csproj** replace **project references**: ```csharp - + ``` with ```csharp - + ``` - In the **MyApplicationIdentityServerModule.cs** replace usings and **module dependencies**: diff --git a/docs/en/Migration-Guides/OpenIddict-Blazor-Server.md b/docs/en/Migration-Guides/OpenIddict-Blazor-Server.md index 4db4556479..8a8f25e9dc 100644 --- a/docs/en/Migration-Guides/OpenIddict-Blazor-Server.md +++ b/docs/en/Migration-Guides/OpenIddict-Blazor-Server.md @@ -5,14 +5,14 @@ - In the **MyApplication.Blazor.csproj** replace **project references**: ```csharp - - + + ``` with ```csharp - + ``` - In the **MyApplicationBlazorModule.cs** replace usings and **module dependencies**: @@ -108,13 +108,13 @@ This project is renamed to **AuthServer** after v6.0.0-rc1. You can also refacto - In **MyApplication.IdentityServer.csproj** replace **project references**: ```csharp - + ``` with ```csharp - + ``` - In **MyApplicationIdentityServerModule.cs** replace usings and **module dependencies**: diff --git a/docs/en/Migration-Guides/OpenIddict-Blazor.md b/docs/en/Migration-Guides/OpenIddict-Blazor.md index 0dc1c0f123..7fefae2f74 100644 --- a/docs/en/Migration-Guides/OpenIddict-Blazor.md +++ b/docs/en/Migration-Guides/OpenIddict-Blazor.md @@ -34,14 +34,14 @@ - In the **MyApplication.HttpApi.Host.csproj** replace **project references**: ```csharp - - + + ``` with ```csharp - + ``` - In the **MyApplicationHttpApiHostModule.cs** replace usings and **module dependencies**: @@ -136,13 +136,13 @@ This project is renamed to **AuthServer** after v6.0.0-rc1. You can also refacto - In **MyApplication.IdentityServer.csproj** replace **project references**: ```csharp - + ``` with ```csharp - + ``` - In the **MyApplicationIdentityServerModule.cs** replace usings and **module dependencies**: diff --git a/docs/en/Migration-Guides/OpenIddict-Mvc.md b/docs/en/Migration-Guides/OpenIddict-Mvc.md index e772de272c..71114371c2 100644 --- a/docs/en/Migration-Guides/OpenIddict-Mvc.md +++ b/docs/en/Migration-Guides/OpenIddict-Mvc.md @@ -5,14 +5,14 @@ - In **MyApplication.Web.csproj** replace **project references**: ```csharp - - + + ``` with ```csharp - + ``` - In **MyApplicationWebModule.cs** replace usings and **module dependencies**: @@ -99,13 +99,13 @@ This project is renamed to **AuthServer** after v6.0.0-rc1. You can also refacto - In **MyApplication.IdentityServer.csproj** replace **project references**: ```csharp - + ``` with ```csharp - + ``` - In **MyApplicationIdentityServerModule.cs** replace usings and **module dependencies**: diff --git a/docs/en/Migration-Guides/OpenIddict-Step-by-Step.md b/docs/en/Migration-Guides/OpenIddict-Step-by-Step.md index 7a36b250c9..ff9d25b80b 100644 --- a/docs/en/Migration-Guides/OpenIddict-Step-by-Step.md +++ b/docs/en/Migration-Guides/OpenIddict-Step-by-Step.md @@ -20,11 +20,11 @@ Use the `abp update` command to update your existing application. See [Upgrading - In **MyApplication.Domain.Shared.csproj** replace **project reference**: ```csharp - + ``` with ```csharp - + ``` - In **MyApplicationDomainSharedModule.cs** replace usings and **module dependencies:** @@ -45,15 +45,15 @@ Use the `abp update` command to update your existing application. See [Upgrading - In **MyApplication.Domain.csproj** replace **project references**: ```csharp - - + + ``` with ```csharp - - + + ``` - In **MyApplicationDomainModule.cs** replace usings and **module dependencies**: @@ -90,13 +90,13 @@ If you are using MongoDB, skip this step and check the *MongoDB* layer section. - In **MyApplication.EntityFrameworkCore.csproj** replace **project reference**: ```csharp - + ``` with ```csharp - + ``` - In **MyApplicationEntityFrameworkCoreModule.cs** replace usings and **module dependencies**: @@ -154,13 +154,13 @@ If you are using EntityFrameworkCore, skip this step and check the *EntityFramew - In **MyApplication.MongoDB.csproj** replace **project reference**: ```csharp - + ``` with ```csharp - + ``` - In **MyApplicationMongoDbModule.cs** replace usings and **module dependencies**: From ec7126844cb6e84199121557406b11c1af2dfa00 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 3 Oct 2022 11:54:37 +0800 Subject: [PATCH 081/362] Update OpenIddict-Mvc.md --- docs/en/Migration-Guides/OpenIddict-Mvc.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/en/Migration-Guides/OpenIddict-Mvc.md b/docs/en/Migration-Guides/OpenIddict-Mvc.md index 71114371c2..fc69f7d417 100644 --- a/docs/en/Migration-Guides/OpenIddict-Mvc.md +++ b/docs/en/Migration-Guides/OpenIddict-Mvc.md @@ -50,6 +50,23 @@ context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); } ``` + + - In the **MyApplicationWebModule.cs** add `PreConfigureServices` like below with your application name as the audience: + + ```csharp + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(builder => + { + builder.AddValidation(options => + { + options.AddAudiences("MyApplication"); // Replace with your application name + options.UseLocalServer(); + options.UseAspNetCore(); + }); + }); + } + ``` - In **MyApplicationWebModule.cs** `OnApplicationInitialization` method **replace IdentityServer and JwtToken midwares**: From 6404b9583e12720adc8ae865bbae41e612c27607 Mon Sep 17 00:00:00 2001 From: Salih Date: Mon, 3 Oct 2022 09:48:08 +0300 Subject: [PATCH 082/362] Refactoring --- .../Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/details.js | 4 +++- .../Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/details.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/details.js index fc429e03ff..6d211ec636 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/details.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/details.js @@ -10,7 +10,9 @@ $(function (){ return $datePicker.data('date'); }; - + moment.localeData().preparse = (s)=>s; + moment.localeData().postformat = (s)=>s; + $('.singledatepicker').daterangepicker({ "singleDatePicker": true, "showDropdowns": true, diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js index d8a8bbd9f9..a1ff58ff63 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js @@ -6,7 +6,9 @@ $(function () { return $datePicker.data('date'); }; - + moment.localeData().preparse = (s)=>s; + moment.localeData().postformat = (s)=>s; + $('.singledatepicker').daterangepicker({ "singleDatePicker": true, "showDropdowns": true, From 249409f65f9d954736cca0b490d9430d043540a3 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Mon, 3 Oct 2022 11:06:01 +0300 Subject: [PATCH 083/362] Add lepton-x lite docs --- docs/en/Themes/LeptonXLite/Angular.md | 99 ++++++++++++++++++ .../images/leptonxlite-toolbar-component.png | Bin 0 -> 813084 bytes 2 files changed, 99 insertions(+) create mode 100644 docs/en/images/leptonxlite-toolbar-component.png diff --git a/docs/en/Themes/LeptonXLite/Angular.md b/docs/en/Themes/LeptonXLite/Angular.md index 506ffaf753..103d7929c7 100644 --- a/docs/en/Themes/LeptonXLite/Angular.md +++ b/docs/en/Themes/LeptonXLite/Angular.md @@ -82,3 +82,102 @@ To change the logos and brand color of `LeptonX`, simply add the following CSS t ### Server Side In order to migrate to LeptonX on your server side projects (Host and/or AuthServer projects), please follow the [Server Side Migration](AspNetCore.md) document. + +## Customization + + +### Layouts + +Angular version of LeptonX Lite provides **layout components** for your **user interface** on [ABP Framework Theming](https://docs.abp.io/en/abp/latest/UI/Angular/Theming). You can use layouts to **organize your user interface**. You can replace the **layout components** and some parts of the **layout components** with the [ABP replaceable component system](https://docs.abp.io/en/abp/latest/UI/Angular/Component-Replacement). + + +The main responsibility of a theme iss to **provides** the layouts. There are **three pre-defined layouts that must be implemented by all the themes:** + +* **ApplicationLayoutComponent:** The **default** layout which is used by the **main** application pages. + +* **AccountLayoutComponent:** Mostly used by the **account module** for **login**, **register**, **forgot password**... pages. + +* **EmptyLayoutComponent:** The **Minimal** layout that **has no layout components** at all. + + The **Layout components** and all the replacable components are predefined in `eThemeLeptonXComponents` as enum. + +### How to replace a component + +```js +import { ReplaceableComponentsService } from '@abp/ng.core'; // imported ReplaceableComponentsService +import { eIdentityComponents } from '@abp/ng.identity'; // imported eIdentityComponents enum +import { eThemeLeptonXComponents } from '@abp/ng.theme.lepton-x'; // imported eThemeLeptonXComponents enum + +//... + +@Component(/* component metadata */) +export class AppComponent { + constructor( + private replaceableComponents: ReplaceableComponentsService, // injected the service + ) { + this.replaceableComponents.add({ + component: YourNewApplicationLayoutComponent, + key: eThemeLeptonXComponents.ApplicationLayout, + }); + } +} +``` +See the [Component Replacement](https://docs.abp.io/en/abp/latest/UI/Angular/Component-Replacement) documentation for more information on how to replace components. + + +### Brand Component + +The **brand component** is a simple component that can be used to display your brand. I +t contains a **logo** and a **company name**. You can change logo via css but if you want to change logo component, the key is `eThemeLeptonXComponents.Logo` + +```js +///... + this.replaceableComponents.add({ + component: YourNewLogoComponent, + key: eThemeLeptonXComponents.Logo, + }); +///... +``` + +![Brand component](../../images/leptonxlite-brand-component.png) + + + +## Breadcrumb Component + +On websites that have a lot of pages, **breadcrumb navigation** can greatly **enhance the way users find their way** around. In terms of **usability**, breadcrumbs reduce the number of actions a website **visitor** needs to take in order to get to a **higher-level page**, and they **improve** the **findability** of **website sections** and **pages**. + +``` TODO: DESCRIBE THE HOW TO OVERRIDE``` + +![Breadcrumb component](../../images/leptonxlite-breadcrumb-component.png) + +## Sidebar Menu Component + +Sidebar menus have been used as **a directory for Related Pages** to a **Service** offering, **Navigation** items to a **specific service** or topic and even just as **Links** the user may be interested in. + +```js +///... + this.replaceableComponents.add({ + component: YourNewSidebarComponent, + key: eThemeLeptonXComponents.Sidebar, + }); +///... +``` +![Sidebar menu component](../../images/leptonxlite-sidebar-menu-component.png) + +## Page Alerts Component + +Provides contextual **feedback messages** for typical user actions with the handful of **available** and **flexible** **alert messages**. Alerts are available for any length of text, as well as an **optional dismiss button**. + +![Page alerts component](../../images/leptonxlite-page-alerts-component.png) + +``` TODO: DESCRIBE THE HOW TO OVERRIDE``` + +## Toolbar Component +![Breadcrumb component](../../images/leptonxlite-toolbar-component.png) + +Toolbar items are used to add **extra functionality to the toolbar**. The toolbar is a **horizontal bar** that **contains** a group of **toolbar items**. +``` TODO: DESCRIBE THE HOW TO OVERRIDE``` + +## Toolbar Item Component +``` TODO: DESCRIBE THE HOW TO OVERRIDE``` diff --git a/docs/en/images/leptonxlite-toolbar-component.png b/docs/en/images/leptonxlite-toolbar-component.png new file mode 100644 index 0000000000000000000000000000000000000000..6076c20ff01dae9bd1cc6bf8b1053115f541a6ff GIT binary patch literal 813084 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

AYPxy=c8TEHro+1V! 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

dD=L4HCf;N^5JAAcr*8W?eyeXD8A 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%0DI%*w_yIDqmkt%s+l6xkGVu+Ou5mb){0F|ut1-| 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�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

{0^Bkwffo18w)K%ff`UrzjAd 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%0DkZgBOex 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ν2Ex6fDirnRXp@kWib7$QEPY<{nO?xOI~Ud>n>_0Ugn-PFF`?EgNtjS@Iiv0 zREjK6HKnk;xU8D(Yg9;lm&#)ow?0yfYWnS$AycQ0#VsivTEXiJoEHiTnYdi5i_x)9!G?iZ29;cITu4ug821CHNUT_8F33ER)y0d8P}JBc zdvQU1Kr^2&7fByzC3vxr05e1*<+Q;$aO}+eknYKm`-^3Gl5LS~>HZ_Ts3Jr4$GzRO zF`|3CgkJ%1`@#(B8lq_LyBsAUJX?ZpM31|)DQd<)a;lC!A39K4N%rOR<)#D9hJfOG z;wi?00~OlwXmvfJFM>6kIElWvz3R2|fQ*Vk+h)Sh@I#Og(fZF$;GbH%vA{xfn6j;CBR%#Ac zqFf$aAXwVDw>{d7O5V`(R>l5bO2OL$%rBb}n{Ie_@LjYmqcp3K#SqtEY7^rMt9@DcecB^aH@ z4xNXgVz6YHxIuCS-=|4`CROzvdS*s2T7i-Ruvib>Cz2BztkEU&prv?PnxXCkol#}DF zOk)4G(E_k-%>$}Httnpw&P>bL_)9j{BcC9xO^-Us4#N-?yE}Urf2WCR%BKk`%JaR; zQ&9e74H3$V9huOO$_;5E1nkZHjX}5 z6Yqudndf8A{?A8z#h2plzl2F7<%M^Wu9P7eg1B*Olx6qttqI3?Db5H(&XHFbLmDmj ztSzUIH3^JZ0kLw?Y>3jqP4#mq?qO{WSen^LU;hdy9`Cdubr5hfi2OZe2v86)t`}W5 z`To4vN;Ew`0kMk>FI=?RO`~lv1e?aaIBTC}7JCs;ogfY1oHD))o z`Dv?)-}Mjir)t4Qu*3KMS@pk=iuMt)EsijvoZpgB6c5GQ2mIId`pZgpKjWFv=2*eT zdKM2Sw)+Ol@?M@#Ltq(U-xD{h zdN5f_7;F}JfaKceg#>+NvcnW+9yNZVx(K{w1t;sHHIsU&3?CRO1Z1}*GcN?2jwe)& zxDG%}Zp!4=EvU%*ra!0e%~`dq(qQKW+_IYLa8<{dvXu7ZEj1>qAB}-C?SGw=;=(nQ zslCd=@IT5P!9F0>6uQ9G{G9w<@^f-d-Yv90`W{LxD<1ou7l9A1ApE$8mKb)d4DzVOnN$Kzg zPo?}%d1(Fx+Qe$foK9Rf5d^0@eIM;pPc_ygDG~W^v|vkE;N%p)_B+$? z>70K*zg@u~1l(|C43DefrH#6$Mk*j*5G>fe>0Qn`%b67(1QUC_rO59#5Sv8q(Lpa8 z2UNUPQuw}LvZE6HJsABbHpdT8?MwCsoMlB;zv+#E0vCUO!F|s?%!ElT4Jh+$K)VHI zx_a-&8l^aG&;w`Wn|WB8nufiY_-P1(&&YRXIs_Wp z4+O3~?lnLPU0*HUgs;(;s*|C%!=FY1U&KgcO;hLyp~$(beeD^?;ye4E0#PQIm<#** znGLA$!pMRyQ@a{v3jIXof>{^%7e=O7a4?;F?n3w&yI0sV$E*(B%iq1)iL);EP4vo=xz$!9lAi4F4mEn$KNiD z?a2M%8T`RxiPU=9RnVvZ(IVfIbwkTexm5U0l4#})2`JP;p1>Z);o@4cL=sRB#L%^T z8Q2H9*CgSOW68kpAFv}RpuCeY{?axv(aKa{pbO<*Nrzq~2b=(Jv0#Sf1Qo516&apB znLeIVEvyZYYugDoH3e-3myP_%AM72QbB7ABDVQ$qlc1-*1=fy$*3FFwY_E}#(Iox zBVJ&wMeA1;g=cYHO_KI)r+v~&ZQ44KTX1Jv^rgC{`dHh=mZY*pcmn-EC3k}B zUw^RgecRLD{c*stX-hHZ^P%>eax?BjZ*lR9Uuv7*Ight3zq~~KT8QyEs^(Oi^5#*H zr9IjGD6X2nf6hJa+sVv7w1Q?<`xUz($&D96#M^(AF3j84P=)b7#uR%GaBDZ$!I}8% z*uQQQfX|Z?CFru2!!y|V*CJA3Lw}e&`imDvtR232px#`s-rFtirU=!$e%unaSOE8et(Jq>fhPnIG7hg|JI?AF#75UAt$%16_`uh+*8@IBA|44WnNR3Ovk6-lWj%cqJ$x#`(kVwu8VXDaf8~_;2Q$g1@4D8l0UC z7Yq1bv5X)9IwKjt_bNl^H~Gyj*JSj7TmhgFy)&6ep90_&@KJ-@NkZohw`~^SQclGi z6a!??eY0i3O`h8m1wnnyQIv6)g+u${tJxdc3og3yJ#o$o(j5+!%X{^vFt9s1!|37o zdfWSfMBY!iCL1%G$)LCE3{&{>TIMft!y@T47ujz>H+h4b@S>7;;qqaWrP-3{MWOSi zMHOmPlj3F}^f8i{CbCtSmX=J88D3}*4 zh@?bTq*^x+ zO>a_+zl(BS%O9@0w`^U*r2BFEK^wmY^ zd88(FI_=OxOm&@zq3s0&=laMfDv9&&O?D`Cq!dKe8b=N2=UvRU#WDzM`3tJ37R~Nd zmmSjAq+-W*os<6Rq4%nPQ69>=)Pr>w9tB*nA|E5o^my>3$d7;FR#1&sq(A4TR&qe{DDZ;ARXDzNGCBIYRhmBxq^X+rr3w|tegEomV#J4L<+Idra_yEC9Vta}_cwBU zm0X^0_dU18Sm#QD3o7gvy z_dET0{QS_@FL|qH-*5ZSx_FY`rRiFfxt*K_2G)?GM;6pJPI!G{Vl+i*-Ez^!Zr*$C z*5eh184U64@g4V}Z!v=+89$X?E@glzNh(az+`{_#j_GR6>bKB}D~K5Eb+~cTB%H97 ztiHPFv{13EQ;zKh3K#mM{}~^%L==g{4j7kzvsIBIn14>pRyyv6UtPcR8H9++5Of3~ z@iPHvL}4TvrL>msjMI_MNL@U*4<_^Egv`r=%{&cxQ)+9xe8d);ofsZgf*`vHanGlR z>v1CvG*WZfw&Rk`;1=cacWCN6YOONmjmJ(IpPb4{Y8ooodcr@JjBX2x9ZwIJhk-my zM9jD=UDeyP&xb2r{(&Sb@@ko>vBP9SW{2tw8Oxfb1rOT(&!%0HRO9kBEU&=HtC9bP z2VpOL)|BqRAEMd~=K?AIO`OU9EkY-AEEQUB#ws&qQBhHM-{a*G_$ShX92cA1*!BJP z54oFtq>OUm{XG_o$gdelM?NQ9U7=WL5NyZ{v*3qe)S&sn(xts;;~W7#flC|!kuDq> zh4OI)8*z`{#6tRko-BuaUWH8W@ak42P}=L=0j{dvU))t6Wvsl9)%|D(X;^?EMRluC zn+cDL97;u?NH)zM1oDBhACMqh356!2iX8)lO7!rjvk3i+1Xr#1PzOexRpdU#^}r|t zrXg0JKmw?C6t>-yu5iJ$pf{0`IP0Qma>%&4c@Ga(7W{<0a_xUiOUXD`?cbTt#vRew zDt(ZT2i~S&-h8EZv6$Q889(idDT}=bQxqc_2}ugGzqmas%8 z>A++@tz*PR<8$AWK4f#Q%}Ih4VF7-NqQ-UQ&9fvdDS*4|tVO41q-#O^s7Ca#PpwzZ z|JwP=;!P@n! zG&$yzax9Fl#$MSW%gPZ(z(w=IXXtq_#<$T86NH(;C0oBwyiFz=V|`YEC6RgBxNSM zu;wi?%T{;#T?30OoZ)aLdV%Pws?ggv-$yxUe3>IXdg*Rs-zMNP!5rY@nl(ddlH$FQ z%IcC$(hIV!%xlD#$i*(v7wJ^!?%Ih*4;s%-6okdoqL;<5?NQ6*1P~1yIcD0f)1i<* z{v_E0s=12Ju*(!zt=ZI%8qAiOU_Ph}94R5cgK{H+pCcZ4%lDyJ%js?ZCP-=wdPqJ=-FGMPa__-GGrei)Mp zvrO?nd&W`ss>AjE(WScoA!IaL=lZTcG;OBlx4E{qynU^iFosjoo>JJ3ImGdvY5Q*q zQ?!)Lza~wewIHsHBO8#HLjMh33I&nXyrvnaELe6(mdguxJBWl*<9Db-j^#G~Ua2g` zNS3O@=4%DI{h~}oD#HEsilVPA=8GEJi7|Ixd0Kt0=bYqc{pSY_AfhloAyb@HynYT| z?{Zw%1XNio|GCMYr0)+eU{IdIbIYgwi3b$|_yOVo3CJ_3Ij{vZwXWrNe?Fp6Y>Gvw z06Ie@$tm>RB1k?{;5O1l%9y zc4V^mD)Aj29H2~CcPyZDUv!ZezBYnk1Ai7|m{b4E|F&iN%6?RDC7y*9ZE-yJ&&kVjb1 zEA(s1gSARnVP++5jO9~i2Nb3GgYd+Rn@^9ov&pVgV)jh{siGVn01wgDwtC$pbpfX6 zl(_|~)3o~ZQeH{nC9WPWnxUap9UYoxJ}V8xixO&Bo`~|`KXp!XdG|13KJ7#mtvFdP z#Cltrn{WlK&#!)$$$3Ayo~^hEJ~M8ylR%J4Jw~1Gj8V@|2}ZTZ=^0!UlY1Gsa_*F% zQ@o>{ilTgP;vz-jycOf6H5&4`uBRt~{nz8DvaNv$AC(o4ed`;;StnVY8uPAy33oV+slnfl5{Zmy0iWP^#WTjXdPu(#rNpB{87 zq`iy_h~QUkaBPG+rp7>}qogdlwIS1QO1H-BnVzHzO$M6i*ltnJ$YX%%swa9b{tw*n zhCR@Qxa1%DsCS++vJ+$SnbSIZ=x6;6kr|Zv8BZJQfcnJ-Csr5afC=e~N97Dq@|J+A zZgcBBGi&&R8SC-OLV$Kq6l_%L+oSi3* zAJ|m1BN?_@`-hVVmR`zq{^rr$Um#vM);ga5wlwHMRJY;f`BsLZN6Mn^g?W9e9M56= zwHRyMGTB^&>SUd;SCsPV0!qfWD zp&(PQaq8=He*@je5ji898ac*muAa@=lRkWoDvH)M`s37;WV^T|`yX2*#P{Np=XQ(R z^Q3r*Snf=t2$Q$}R%7aYD%mSMF8U#)!%$LX0iIxcD^h_Y%Y%uE$GUwdqV?wYYX=UV z>qNaxYv8wW@;zH_|Dc}c5R5pd6R>gH2E`57fKBu8{LWEuw*MJJF`cjq{}E>Y_sHl! zVRvL$R%R*&U}0Et6Wv(m31nFPfbrLXb>?A3?}D<4VpO4H zFy33nUI?M;kjPo%jr>h`tsaW!Y^5wS)O0?8=&(M)fzhYCt#gwMO_RyY2iZu*MYc3e z#lV;VMZ0)UvOfNb+Dinn7|N62J;`|o5MvSV+~A*L^g@d^I8gT=g6puf_$nHS0K9JH zXqMyTb7;-Y>gjrQgpOF#!CO}7ag%vi{Dy5TN;@>Qx}{nJfTy{DdzU#Ie@3rD22#2a zu@znHL;Pn-%1DR&Lwj{x-}OyEQ}&dWvGk-0tDsSjyK!QWt>^n>F2nHr%|aS8#f)em z!z}25NW#`{4kZIR{H~jE=rmK?`GcMr0xL1!p&-4w5`)dQD?N{H)UJKN*)06_i?Z$- z#-Dz2KMag0Wd@^J6)!59OnSZq$y6z>PrVKNIe=Sq(jKxd?UvVK>Qrtm6sEBr?Na#x zkqSM=@ycbMwMYx7TG%r*C!%bEcIGX}(n{Bdr`#hSuC%SdVZ2p+Ffo~={nV;>(Of&} z-WOBavn93bA{?6GxW{4&^3dpjyTg5)V4UEW=anelWcpt+%zIs2BkX+#f`3uK;|bwo z^-DfH-7oX;We+&DSB2)Pq}-&o+GjX%l!htb(4WZYhA zTsx22q!clHEXt5=6KylB9lNpvx8`8zonaX}ZwlW=MoxTsmazPP10nynSQ!ZYC*R26 z@l(nFaL)e*e%VEW?$bEhec@4HJkS9jQOR!Ksj{b|`y0lLcK!hCMYszCcG+d%6DRS= z?)e`E3+9=T_tWm2^0JkYumyY8Q@Y>`dskr5sM(31Mu4RQ@Ckhe*Dq&7$}e9J?KOX) zNr552A6XIOBz6x3{l&D4elckos`0CnWNF`W*@9cOjfpYc`)qp%E(+TR&irOKaVQkm zTsOyfjq-?+e}nA>mA_%R>K{)~>A(1ex$Zg!(I7IIOgh77so>C#2D~zfRJ{5~W-qo@ zjQOgj0H~ywyH2}%ccP5gSXUfl7k%WvM181fs*Xho^lvviboLgOQT4Bdo%aVOf0p(^6)3m+v85~bvUB7ba(XlNd{#FYTRLFq3kV z;Jhg_i7q%J?n?53|K=t?ayBSEpJznru9>AaYSZxjFihobZp$Zz{}}kz_AxrA2{Y{s zqgkdt=TGA(8J4rRe<_cJd)iv~)OrCPkq?T~{qJ~mKrOpCzi{mht(9=T&G?bic_rp% z7Xf@RUTM78D*;pLK`X+gtEn#Y2NYVLQ=U>}cpdvKz2lD=N2GGyC(_BKWYx2~EuM1a zwVzBBWITj5*OfMZ3-IzI)FIfk{Wpi>WE-1<`Lm(0))^TrYoJIsQkQ(P6uN}LCR@2WI zvt(EW>`(5*HVLkS^7tsxe$k)kN`ytSJc@*ZvTWKF2MFU&@xCDIg7t3u72_RdPO^R> zYFC^Wc2!w^z6${byC#X=UQ|ykQ~c5a%)vp*mZ!zX-n$xfQ`&5$2-Z!9qwVNy(V|Js z19qTou0zR(_^_0Gj<`asqzq|wZG-AlGOH+&UdmPDJ7zD}tcUxZ(RJZOM>W=b?iX<` zWll}60dTHTrd5*hQ~}LUpFbdmRKVS?NYO2zvwrGjG|+FB_Bb~+_@_r-O!eVM;5Cbf z2$!9=pSZ6q}lWGd^85&*n7t2zz3&+&=Jd5+=hr@&_K+D0P z`MdiUz_|1E7kRw@O%kM*f4Q>1>8;eNp>f91f10m`;MYcOy-6B6Cp`mH1z~TTtOt>_`S3z7|ycFA4-sAcv&`?Co18hkX6Db^7plh(gBP&Vl##nEC=4yguMVTDJJXa&4N5B~++#Vw4%ZHU?X zjq3see`_J<{({6`0Qf<(UqX_PN6Y<60T4*g5kV~i&k%i_RUF^W@JXi+I6O3*S6o!! zyF|21#K^bI;u$gK4h_*PPP(j@3WZjtARa#LJ!{|NOanV2jl8SW!((%l5wpX->5>7? z;%uPLGlVzxe#bg{ZU_)UeoSSg`!3_*?VuD_N2clSP=xMkJpTSg<7Z?Kn^dyPQ^mjr#(BHEhlJl zk@%a;vwNZ=X(gU02PQ>3l14GA^TtyW#z4wAAC)T{D-R)y+0BP6gU^a=U+;blS&6>} zUQO0Q{da(8x_oM7A9@j!duTgLP>$Bt=NO`gto9$Jc?d#&rMrr5(NB+rxPUkPVu+>d zv3a{?f?m400j<@rOxRb*I}El+9NQBl%|w? z`~yp(k~^^+4N$+Z&S&3Bo9+1(|p}}P8!=737Z!{59F;q>3wJbC%dIsEl z$pt^zw>~1z#34V9pN(lL2Q-d)PUz?oq#R-D7uVXChsp;jn&WvgvcXCh71&X}ZE=o~ z=6fSKOhhC^V>APK6#i zmN;7rOqwE2lCz)bA_)0ldi`gQeZyaWbDeHoe&=pHUhp&E`)c@js3?l$jw*8~qbmQQ z=2th73o|Z(mPyeLU*I(5nS)U!T!EB%ZJR*y64JFUDri6;9iq{^1r9 z?K@c1B=qm<+cTi#Vc|#_9`7@cQ=nhJ&@yU64MN>D5|(ihzsdt-BD;ewT)73&M;25@ zQbGU@rFkp7piKZe(vKSA9aHSuJj58kA%B!3&>DLBTD;LQiTTSgiTpsKJW{hn=_Ar> z6fZQ*fjw&2D`30^k#Nw}iQkPE{m3ua)>p-NDZ^Pl-&1jEc%On2gU^(C$$RaO-#W(e zF7gEgvM_(@1l*~^#3Fd0ewIW4G4L$0RylfmxL~GuDDE9R^+Qtk3yzncRWmMtrf6a= z%K5J3Ej7ga<)iz*o>RJFk6Q0+EoJw4VG`XM9T5p|!zMSylRuKMECu8vtNOWJ#3cpj z4x5MtkJTgoX`Ml8_iKS&5&n+&>AGci_zzF=Ec;-uCC`0+G{*Mja0g9~S zm%4o8O;r?n^Z3ZJy{|fQO_?Euk0&QepG~w>cIa$E4TOV|U(yRisNV9#l3tfMr5lI8 zy$PPo#P4Rnu6tOGCG@Ri2pr$0H)Xjl|Mru$I&fTr#Klo3WxlQb`zMk3iD3)Pe$Jy4 zjrcu{m4uoI_=!YnrRRFAKorYXOMlObiTa|2VyFNKAw~nK$3{p?=FM~T{hqm>t0xF* zIV1#9#&&aCTN>3t!kOLURkfR$Ziy#>zcNY#K7p7UtA*5V1?BT&xv8U&94BAg|F|S* zmoDvcTlNvsZ}Md=cew0Z!Vbo&@tks%prfFh?`%azdaJVg zg59!#{rp3Lj3N(8cAhI-`$<-evDC_*mQ8)?q7J%qs#3+$y0K{kRpr(#l|^{QmRZ@1 z>IVxshL`xd;wI3Zes{hBED0jXrkxrD8owU3YyksB`kG#};?;r5h!V`SebyYp!SBDe zEmz~RWen^}2U@!N7V>vXblX(Xb;aLil;~$F9$>H=U;vkYxTBBG?OgVe>3AQqI=tOTUsDU0*lN3&`o7~w> zglp!eU>-z_dFh|`npI?W=Z(R>PcA|!&Mg*aE*`@Ylt4`l$=%G~pP+UfyMr{7c)@B3 zjp{5xpZklOi+It~^&8aDc`>h&Y7F*2-?t-7`+IV$2^bB(-xd1pX0H~@*^6$;)4;)Q zwU|Ef!)89B_!bm2LXv%2lZHnb%3N-QjOA`PAq}t8d^+z!ISb#6xXr90BgG>%U}~{_ zP?snY5Hf#Hww{;2qc`|!RW+V@5M^%M;pj_`fWqF%9|Vo=+JuDjF!Uyh{~~9T*iCRF zP5Ou0Y~uaNQ1}cjFW{>hvEjvU+8HysnoPFP5&CWFe0`fi-?sVuw2q{CHpL%g%9lH0C7CQNuYs zW9*i0@s)SfEr@IB0NlOn!JqxKo;xQ0=DW{c`l2t0Pj5S^UH&1#ymbj1c2ePAtVvSs z6RmGAljHdf_bx=r!-kK_-NqJDh#JD5>)x)(TxvDb_MgVjV*e~T_y@lJFXH@vT(sBA z{U;p!0(ZU5#6ghq-2BK*Hn%gnDWKsDf$xiG(wJ zH{%wrmg#|8B?Tn4=;m4zU~I;~u-`$}Fns?TWo}0$Z?sa0bjTu7Iqm$-nh<0Itn;dP zPrj%y_5Gl?K$IvD;}eoMGeE81POLt8ObUs&6Q*U~=)y3-;!L+$Qlz zwy9~l_9LZ)yGX@y{H^s!?P8QDbuw z7mPBFYznxpj4U&3OLx6;RWUpl7$Kh}D8Xnj)YLQ_W-X1eEoV3}78&I3iJ}&fxjtT2 z1c(LcaQ%U4Sx{M0cDA*(L9P}7C>VGJT)-!)A=Ig&E3E5^X;803h`GeZNU(s}0tUY` z6!K6(9u20D?EUbugiqj~y(aV@?cT`awl?)7-$}l0oElr?`XR@w`F3${c)*%Xl3reM z{z60j3r~{Om+q~meV-*HcX#A!Y2v=3{%29pJ>?B7FffoLEMNOI1l|oV+Qp^2Xa1J2 zPwP2db2;2}fc^^pL2k*IylJY@?C{9lk`J|$X^vP-EeWr5yoTPT8qg#)AX!t=onTyI7SUT4#o^$HN2H42N$ol977feR&u_5ipR zcc~5;0-W?phzO>HL}36N2Kcnvk$S@`QOyIpS%+gRc)&Z$Z0JOA{UB0>f#S7{TNx?K zN|cZ_I9n=}(Zd~IcH zHyC4HdoO8UnTr2I#FkK+9s1Fglh5+Q<8>RmRDEPW>!J@*2m43NuHJ>&`pRu%O4FYE zE${2fhQGRGQPW6irMQim-+iaOtqu%mW ze+OIR#+Tg^uJDX!sUQgBWlrf5fw_iaq5jV5O3f?!B`m6oVE% z-npjpfrgBPIXl?PSw#{vGn55UuiNGeWLWB;S->Gqe{7W4$b*}fs5j!12Q%IVDnyLQ zEn{JF`CCnxU}cbIe@OD~EgOTzD-G-Px2MwK74|tbpV`o^%6{=Wqji*#%`Dd@yQ3?T zZ+pGypFI}x_EVg;e#Fg#&ZqgA5Bro;rmni>E_fZQ(Cw>KpIbNlZx(>R+RC=d3htta z*zYGuLznN@d@;L3;_E1QTbpcKbK6rhW>U^WkLpU(&~lVg&LUVW+sgGLSjAtBhDiEf zf81a)8MQAPnjcW|{ug&igCCJG0I!mVw>J;Ys=Oc0)Nco;pES}lT3DS%_a#y9O!%oW z5w5x%jjjCLG%?81V}3I&#P2OQNcX7h6Jb69p{I~&B&8yLiZ%)6Ge0$EExbOZbOfXn zbY;OvjuiSO442k^2Nf^BRdt?-U-2Rxw$!kR=(!RzP|v#U`g|>B&G$+gng$r}i~qbD zL|8ewK$J{jbDAFzI*~bZp!StM5O_&lK|cu5RsGsqSqG6y#XLq!T0@}zh3YuANUd#b_Jsqy{E|6U%bYDb^hhB@iYduCuU4t&b z(BgOPSV*+gw+B`c*brw$4INI)=6Gv9(APomEybHJIh7}3guM}{O3~u_AOo9E?>o^b zWd$ClEeSpiw3kK{Xi0AXNe4z~T@}4j>{Cah%X_$7|Y(SnQsXM z7&YZI?5#WIB$U71yKZB7o|UmZM~O1xQa^8?%MfMtx&ui*AE2X+>1bQiz{i5y3+`^6 zr&mS}0xaWU79K1klhfs`Y{QD_WX!V}y^<+jb~Tzfk;v&2H+OKz2@vMUA6{$PT78M- ze>m?YBNXekX8LLiK-$d=k`3c3e+k^i$%+YSgtHYw;R0b-emul8UL=6;+;PSPQZ}E)2#IoC-%N- z%Wy7;24}_lTwr)%v&(UnCuz?I*q{jDg1Ih9=nSy($2EzI24~R?6ktR?b=`g->u)>p z6}*FsG~^I*of{pcL!34a*e1l|D-Bj-T*Xw(EAfB+5WU%{M~o;`PwZ0i6PF#gtIREk z{-JO(DY-J|IHIBn7&De=)UQfa7D?RR4ygKw*}*t_XSHaB$^Gnr<_&yACSE|>s1qGe zSMwDw7r&y2!Hx{XN?RW5-7oEF;FE%r?&yk$zw%3>*L7-HwoS+U{6 z*!3|gM3kxiXo*c^ad10~%ZFj8HVWA;?wDVU-0+-6;Yj_RtGxl5fx9MFGfUQoUxJ)1 zQ$K7L6u#}1TbH{%r}$|tPx;k9nria}`Ye?UU#qR)GF3E{&y_t$)QJ_OJDnMiUoG5g zq0X{Dm$D^Yuy6n3375hi!-A5SF`-yg@#1q%`@^|;vVn^KvHA+Tcj96C-EjmD_J3J2 zpTAoOjJOX}e#E!Q`|pbFzS7EVvF4`RaC*F*!ctr#jpC+#8|AVHVF4RVd2NbRrTPU& z4@cJbsL^t4q+VntW-ZRgsBZPEW5V0TS42u~ab*wbmA?hBY#jHAth)8mb*A4UKm!)& zQS+5Lo3?Csq_yftt>`cbYaw}CI{LtzuPiFFVxB!XUvSn5f*?z~id3cdIJJVv{Dfkh z0P+¢`L{ZCwzrJEF)cqcEdv0z1j;^!D29dx&ix5t--bvIcVS(2T(TAn(=z9iCy zhFOJ?p7R9;9KZaZx7R5{Z&3pH`jo85F|i1(Ck?$=_tidw5XjAS(HZIO_CbNVx$J-` z6$~H5t=VRZU3z@I-BKJML;1k$MRRyi&f6W_X0xq(3Gl|^?wB3s<(2?32zz~00fjFB1<>QLx?z$uZlBX=#1`18rnxZHJWIhs4u z%k#DME*4=E4$_FIk*RFy{3hZz2fLAxY{zd66cG!(-*JzXW`vQMUf)-!t_C(Yzqy;p z0`Czfh8&#jN;8}ySo6UEAHmcO3l#jU~I+(C7-J+ zAMpamS~}MMuTqmlX=LSBN>(G4sqb9S6XBp(bIL z{PK(5o^v~cxFi}sk@lk#%ChylYpQobC6UJxvG(P7xDx_CQZ8(?^-g~ zui5GZb#Pn-^;D;wCPcYMri;4bCBdS$Cy7Zf`9mDx;=FGNkTQqwod^p)EC?NQ(n->r z=@7XhqWpH0vXQF>=XF0qsnA1tw(BR;VfzCcJKMnQu0_(cOByD39bPIkBeOnzlr$}{(Ehy;S z-7(b{*@BX;TYN?7G1|uY-pVw~=&hu?Tm!G>x zmT%T9>|l4@9bvm6*dKHd9|_HfLnn4^oUiI)+QtIgRLN$Q>Yyw9ExM28Q>nFj%vH

BK62NmK~R)Q4lfU8e>8T%R~sHC=sUDG zzj0pXY^r>gZzy*|Qfe%7IgiRU&PKKYci6A?Pb^delDm1>P5ZJ)2?dqU;%dkJ`5sp4v3 z-5pmA#!nhA9nrb36^T?8LPlQD$*tsPmtfhIu#U$N0C>5sm^i6u_UD!Pc@!?H$y>Y; zrFLPMm(S+<>3iS1qiuENg`8ET_7ieijG z&(9H|Q$}LKO`VuCA9TdmqJ@U$rre6yD|V!Zz{)gqnzq@~gB(& z7x0EqbVk-Nmy*~Nc`wbw5Ze$IJJQDW*(M7Th+)0O@$M?k(fdxiqT_C}FDUBp{4wwj z1$hnfGyXa&cc&BHv3=(0-gD|GGHGL9S~b-*6ij?|JlI)PdGDw8TfPZ8L*UFCFGu&# zL1l%R{pKpqnq%z`E|qjq`MUA32g^?@0XI??LE4!5s}m#C0}8q$f~S~6HI6=l(ym4t zKR|E79LY_le&j+#We7EC(%VN;Thlj*+g-jU#N;sFy2^+&SlW_A9sGgED}` zzWjj79qJp?o=hmktf+$UaSRr+H9L=)!dH@&x7m}hP(RGe@%{c7t{Q_^NPHi^fWhGew3sm6ekEXb{+l(dUJbwOk{Ptg@!U>XS=%td zt1vTTF=gvJ;w$D;cM2A_307BwhWt3~Yr*tuL#imWIiJYJ;}hZ_=H~p3$(Iv|p*){r ztFjchg~@s)*?_Ba-On@sSA&IE)_tBT^y&~#JJHYohqbp3it=Im#W(0iP`X4~QaTqw zKtZ}YrKMS#1r$(XQA!#_x?|~-lt#L9>5ir0$MgKonK@_XedfI1nfI@qy=U*)|E~Ge z^|`pA{@k-w7KuTfXu>^yiMVN)3;q2}ZCcl!{pJGPiL+&HJ7mFz?;HR*r~L&Pp8

jiS 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%0AW|3H$rP*Tl-Rqrszr6SL%s9{e^?=#gfjQ6P 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 ZhlQ_h7UyH8efNML?F)K86=>Q#_v?u literal 0 HcmV?d00001 From b35a0f7342c7379b13e7b5b6bb2904ee254f9dd5 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 3 Oct 2022 14:48:01 +0300 Subject: [PATCH 084/362] Cli: Check login before suite command --- .../Volo/Abp/Cli/Commands/SuiteCommand.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs index 060262eb93..f1aebafc64 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs @@ -14,6 +14,7 @@ using Microsoft.Extensions.Logging.Abstractions; using Newtonsoft.Json.Linq; using NuGet.Versioning; using Volo.Abp.Cli.Args; +using Volo.Abp.Cli.Auth; using Volo.Abp.Cli.Commands.Services; using Volo.Abp.Cli.Http; using Volo.Abp.Cli.NuGet; @@ -32,6 +33,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency public ICmdHelper CmdHelper { get; } private readonly AbpNuGetIndexUrlService _nuGetIndexUrlService; private readonly NuGetService _nuGetService; + private readonly AuthService _authService; private readonly CliHttpClientFactory _cliHttpClientFactory; private const string SuitePackageName = "Volo.Abp.Suite"; public ILogger Logger { get; set; } @@ -42,17 +44,28 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency AbpNuGetIndexUrlService nuGetIndexUrlService, NuGetService nuGetService, ICmdHelper cmdHelper, + AuthService authService, CliHttpClientFactory cliHttpClientFactory) { CmdHelper = cmdHelper; _nuGetIndexUrlService = nuGetIndexUrlService; _nuGetService = nuGetService; + _authService = authService; _cliHttpClientFactory = cliHttpClientFactory; Logger = NullLogger.Instance; } public async Task ExecuteAsync(CommandLineArgs commandLineArgs) { +#if !DEBUG + var loginInfo = await _authService.GetLoginInfoAsync(); + + if (string.IsNullOrEmpty(loginInfo.Organization)) + { + throw new CliUsageException("Please login with your account."); + } +#endif + var operationType = NamespaceHelper.NormalizeNamespace(commandLineArgs.Target); var preview = commandLineArgs.Options.ContainsKey(Options.Preview.Short) || From bd3f65040879794e7f5c492b60f151ffd175f14c Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 3 Oct 2022 14:51:24 +0300 Subject: [PATCH 085/362] Fix DefaultDotNetProjectBuilder.cs for path with space --- .../Volo/Abp/Cli/Build/DefaultDotNetProjectBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultDotNetProjectBuilder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultDotNetProjectBuilder.cs index a7e5d1ba71..7dfe2c59e8 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultDotNetProjectBuilder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultDotNetProjectBuilder.cs @@ -76,7 +76,7 @@ public class DefaultDotNetProjectBuilder : IDotNetProjectBuilder, ITransientDepe Console.WriteLine("Executing...: dotnet build " + project.CsProjPath + " " + buildArguments); var output = CmdHelper.RunCmdAndGetOutput( - "dotnet build " + project.CsProjPath + " " + buildArguments, + "dotnet build \"" + project.CsProjPath + "\" " + buildArguments, out int buildStatus ); From fd4061d52a97e8030c81388adca9ee752df5e23b Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 3 Oct 2022 14:59:36 +0300 Subject: [PATCH 086/362] Implementation of AllowuserToEdit for Blazor --- .../Pages/Account/AccountManage.razor | 53 +++++++++++++++---- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor b/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor index 2a625f3e35..842201df2d 100644 --- a/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor +++ b/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor @@ -1,8 +1,11 @@ @page "/account/manage-profile" -@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Forms @using Volo.Abp.Account.Localization @using Volo.Abp.AspNetCore.Components.Web @using Volo.Abp.BlazoriseUI.Components.ObjectExtending +@using Volo.Abp.ObjectExtending +@using Volo.Abp.Data + @inject AbpBlazorMessageLocalizerHelper LH @inherits AbpAccountComponentBase @@ -20,15 +23,15 @@ @L["DisplayName:CurrentPassword"] - + @L["DisplayName:NewPassword"] - + @L["DisplayName:NewPasswordConfirm"] - + @@ -42,27 +45,57 @@ @L["DisplayName:UserName"] - + @L["DisplayName:Name"] - + @L["DisplayName:Surname"] - + @L["DisplayName:Email"] - + @L["DisplayName:PhoneNumber"] - + - + + @foreach (var propertyInfo in ObjectExtensionManager.Instance.GetProperties()) + { + var isAllowed = propertyInfo.Configuration.GetOrDefault(IdentityModuleExtensionConsts.ConfigurationNames.AllowUserToEdit); + + if (isAllowed == null || !isAllowed.Equals(true)) + { + continue; + } + + if (!propertyInfo.Name.EndsWith("_Text")) + { + if (propertyInfo.Type.IsEnum) + { + + } + else if (!propertyInfo.Lookup.Url.IsNullOrEmpty()) + { + + } + else + { + var inputType = propertyInfo.GetInputType(); + __builder.OpenComponent(0, inputType.MakeGenericType(new[] { typeof(PersonalInfoModel), typeof(AccountResource) })); + __builder.AddAttribute(1, "PropertyInfo", propertyInfo); + __builder.AddAttribute(2, "Entity", PersonalInfoModel); + __builder.AddAttribute(3, "LH", LH); + __builder.CloseComponent(); + } + } + } From a00c65217af8bcf7835bf1034af9bae3e3b7cb7f Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 3 Oct 2022 15:00:21 +0300 Subject: [PATCH 087/362] Add TODO --- .../Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor b/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor index 842201df2d..ea42414679 100644 --- a/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor +++ b/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor @@ -66,6 +66,7 @@ + // TODO: Move this logic to 'ExtensionProperties' component. @foreach (var propertyInfo in ObjectExtensionManager.Instance.GetProperties()) { var isAllowed = propertyInfo.Configuration.GetOrDefault(IdentityModuleExtensionConsts.ConfigurationNames.AllowUserToEdit); From f908851eb912cb89a2e1cad090002c6d927c7461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Mon, 3 Oct 2022 15:30:55 +0300 Subject: [PATCH 088/362] Update en.json --- .../AbpIoLocalization/Commercial/Localization/Resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index 39e5084e92..8f9a6759d8 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -268,7 +268,7 @@ "SeeABPSuiteDocument": "Check out the ABP Suite document to learn the usage of ABP Suite.", "AskQuestionsOnSupport": "You can ask questions on ABP Commercial Support.", "Documentation": "Documentation", - "SeeModulesDocument": "Check out the modules document for a list of all the commercial(pro) modules and their documents.", + "SeeModulesDocument": "See the modules page for a list of all the PRO modules.", "Pricing": "Pricing", "PricingExplanation": "Choose the features and functionality your business needs today. Easily upgrade as your business grows.", "Team": "Team", From fa58806f99ea83dd765b0f895f99faf5e3187c90 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Mon, 3 Oct 2022 15:31:18 +0300 Subject: [PATCH 089/362] Update dynamic-layout.component.ts --- .../core/src/lib/components/dynamic-layout.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts index a411fa0ba9..5f39e5c865 100644 --- a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts +++ b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts @@ -92,7 +92,7 @@ export class DynamicLayoutComponent { if(layoutName === 'account'){ message = 'Account layout not found. Please check your configuration. If you are using LeptonX, please make sure you have added "AccountLayoutModule.forRoot()" to your app.module configuration.'; } - console.error(message); + console.warn(message); } From a6937932be371c3892134b009898d01e9999a089 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Mon, 3 Oct 2022 17:37:51 +0300 Subject: [PATCH 090/362] Update links for "How to Add Custom Properties to the User Entity" community articles --- .../How-To-Add-Custom-Property-To-The-User-Entity.md | 4 ++-- .../How-To-Add-Custom-Property-To-The-User-Entity.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md b/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md index 8e46bd6944..178a8f261e 100644 --- a/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md +++ b/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md @@ -1,12 +1,12 @@ # How to Add Custom Properties to the User Entity -> **Note:** If your application is greater than version 4.3.3, please follow [this article](../2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md). +> **Note:** If your application is greater than version 4.3.3, please follow [this article](https://community.abp.io/posts/how-to-add-custom-properties-to-the-user-entity-rixchoha). ## Introduction In this step-by-step article, I will explain how you can customize the user entity class, which is available in every web application you create using the ABP framework, according to your needs. When you read this article, you will learn how to override the services of built-in modules, extend the entities, extend data transfer objects and customize the user interface in the applications you develop using the ABP framework. -> **Note:** This article is not about customizing the `Login` page. If you have such a need, please follow [this article](../2020-05-09-Customize-the-Login-Page-for-MVC-Razor-Page-Applications/POST.md). +> **Note:** This article is not about customizing the `Login` page. If you have such a need, please follow [this article](https://community.abp.io/posts/how-to-customize-the-login-page-for-mvc-razor-page-applications-9a40f3cd). You can see the screenshots below which we will reach at the end of the article. diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md index 7c119c6e66..df9a8cf41a 100644 --- a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md +++ b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md @@ -1,12 +1,12 @@ # How to Add Custom Properties to the User Entity -> **Note:** If your application is less than version 4.4.x, please follow [this article](../2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md). +> **Note:** If your application is less than version 4.4.x, please follow [this article](https://community.abp.io/posts/how-to-add-custom-property-to-the-user-entity-6ggxiddr). ## Introduction In this step-by-step article, I will explain how you can customize the user entity class, which is available in every web application you create using the ABP framework, according to your needs. When you read this article, you will learn how to override the services of built-in modules, extend the entities, extend data transfer objects and customize the user interface in the applications you develop using the ABP framework. -> **Note:** This article is not about customizing the `Login` page. If you have such a need, please follow [this article](../2020-05-09-Customize-the-Login-Page-for-MVC-Razor-Page-Applications/POST.md). +> **Note:** This article is not about customizing the `Login` page. If you have such a need, please follow [this article](https://community.abp.io/posts/how-to-customize-the-login-page-for-mvc-razor-page-applications-9a40f3cd). You can see the screenshots below which we will reach at the end of the article. From b3e0170cc84f8c1ceade24fe246b904ecde80faf Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 4 Oct 2022 09:46:20 +0800 Subject: [PATCH 091/362] Support text as a callback method. Resolve #14205 --- .../datatables/datatables-extensions.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js index f87b7c27b1..47e89dcaae 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js @@ -36,7 +36,7 @@ var abp = abp || {}; var $a = $(''); if (fieldItem.displayNameHtml) { - $a.html(fieldItem.text); + $a.html(abp.utils.isFunction(fieldItem.text) ? fieldItem.text(record, tableInstance) : fieldItem.text); } else { if (fieldItem.icon !== undefined && fieldItem.icon) { @@ -45,7 +45,7 @@ var abp = abp || {}; $a.append($("").addClass(fieldItem.iconClass + " me-1")); } - $a.append(htmlEncode(fieldItem.text)); + $a.append(htmlEncode(abp.utils.isFunction(fieldItem.text) ? fieldItem.text(record, tableInstance) : fieldItem.text)); } if (fieldItem.action) { @@ -81,14 +81,14 @@ var abp = abp || {}; var $button = $(''); if (firstItem.displayNameHtml) { - $button.html(firstItem.text); + $button.html(abp.utils.isFunction(firstItem.text) ? firstItem.text(record, tableInstance) : firstItem.text); } else { if (firstItem.icon !== undefined && firstItem.icon) { $button.append($("").addClass("fa fa-" + firstItem.icon + " me-1")); } else if (firstItem.iconClass) { $button.append($("").addClass(firstItem.iconClass + " me-1")); } - $button.append(htmlEncode(firstItem.text)); + $button.append(htmlEncode(abp.utils.isFunction(firstItem.text) ? firstItem.text(record, tableInstance) : firstItem.text)); } if (firstItem.enabled && !firstItem.enabled({ record: record, table: tableInstance })) { @@ -132,7 +132,7 @@ var abp = abp || {}; } if (field.text) { - $dropdownButton.append(htmlEncode(field.text)); + $dropdownButton.append(htmlEncode(abp.utils.isFunction(field.text) ? field.text(record, tableInstance) : field.text)); } else { $dropdownButton.append(htmlEncode(localize("DatatableActionDropdownDefaultText"))); } @@ -272,7 +272,7 @@ var abp = abp || {}; } }); - //Delay for processing indicator + //Delay for processing indicator var defaultDelayForProcessingIndicator = 500; var _existingDefaultFnPreDrawCallback = $.fn.dataTable.defaults.fnPreDrawCallback; $.extend(true, From 096dab71ee14aa25b59effcff49af0fea344fbc3 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 4 Oct 2022 10:27:56 +0800 Subject: [PATCH 092/362] Add `X-Content-Type-Options` to `AbpSecurityHeaders`. Resolve #14217 --- .../Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs index 7eaa8b55e8..583b12efcb 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs @@ -19,6 +19,9 @@ public class AbpSecurityHeadersMiddleware : IMiddleware, ITransientDependency /*The X-Frame-Options HTTP response header can be used to indicate whether or not a browser should be allowed to render a page in a ,

p$=oI7wybtaBCXk-DHCuQxqyBf zIy@GE=mKqHL!lGiK$4`24_tzZiGG=&Hwh`*&1qGtE67hjK=ygc;ZxDHUv1cfP_|>7 zeUM!ABKb%o)#h+)5$J*Q3{MLJvF>Ih?6WzxveWaS7h$9|{YGti_QTp0azcT{)g6Sb zoA?+nOEc-aRlliCid%QfjTKYQ|6Z9)9SdAH(Z3p8bf@-$fgD&!yCC0Tn?XTjvv3Gw zpX%%im-krr0}HC|DjD9O-KOK`_&Rj8<*faqOS~W@1&$;Fe>mx8^!SW1{+`>|HeOu8 zD~K1VCeO(dqQrsG68woihvczFO;<(9xO-XJUcK6@+}6gSDf99PS#G;&#u3jc-vXqh z<3lrP(Txmh%ZbYoE#D0ngbVdLu;!>aLq#xWp=`!}`bBSUUI3OR49S?QUO@N%P~V8=T}?hte1^AI?1 zfhDroOl}JP@lL!rIKVEI+4H^RGS_o%`0~@00s{TaK(U?ed>k*w<_?#}5ni^RmFd3` zlvJFQq|6YNk1ep?BtON%RoxJ-Kx&eVE+^lZu%X(kO~fchgWQA{+U(V)T;X7$12q=EB-Q%UoL_7k9j>|$mYkrj&+)Lb9~zuWt}p+@ ziqH}&pV3P98vFD4gu~*P#CWM>dQ_`(hbzWIRN2#4L=kqgBbZtX@Q4z6;>RS#G#d>u zcGa-Z25MV@iHY^m%VmcW*0o)X3_d@b^RX{=a5@Cg9)drbK{M0CKF7?q$mr-cus!O_ zawnLM7^J2dK&aBDH3a;CX)c(90&&#@bq(sAmf%^%m}*b_ZMZ=fBXA8QXrvx=qule< z>DxI;f9E3potzH{z(2n4qgq~FsTa_r2kY^AZbH7c9p2i{xt$okwM2l@R+5O3R%QOQ zmR>SUJ986}qrZ|mak8z>$lsEKWZM`L)UY5*8XUWP?Sw~pT5>7{A)@{$Vxed*x3Dk< zNEa#}xaGW4ytkP9hSJj{Q}WP}?$^@0C5F=+mY01saP1y6OSvFF_zKp*w%T4B+7fv* zqN>Kd4QXI4W2gP8v{@D3ageW5q`LJ`ea1t*zJ27%)#4tyN%)wz!3yyW&zg;O^Y2ld ze+#$&;~IvIoO}_!&L@9Nyg48i(e!0a0;a0^x9-{+4FHIB-!|b_SjjjmHVhhHG%?X4 zjz$*8FC@h?SGwVGn#2ZakbR|_UÐnPWPW;kYnRw6a*<-OT9CX?=CtU~NHPMBzbo z$f4BGpS*B|aiC%GojwM3@zkI9Y~_j)n$~;7dh9ETPrLxa_r6Zl`^u{|;P0-! zhY&x*4aQTNA%D^nZZ+)UEXm*4gSuC`{8&pZ9ZpiaJ=EqH<}de1b&;{FlbP;F6$Ue~ zm=A@8GWi7s3n7;xxWvT(s<+H2Jzf=mySTJ&KytKQ?DR8a03P#x zi#94tw{dMEMg`ru#_0hr?^Mk@{?GEKf0V=j~qVZHL*I7F*1V4=!#sABy=D?*fy9qsziAZKZHv*Lk`?Sc&pZoA5_NW0pt z+Q-2@q-K-*EXtbpNQTODApt6GA&}S45 znGz>W8Uav1`T$1?m8oqV&?0|yoJgaIKi}fy_xq-u{SaM|JwV=f4gjhc99eErjg8SM z)fJsGL979c*v26sLWQm!PR zrzJ~kLX4QnKN;D{u-{{<|DtxoWnw~q?*;HL3DDOtjQ5i&dAN5RXgr=6nwe>xmbLYt z)2q8}(Q+?BOoXRw`4cc7;pY(+Rl(q0#qi;r>%;}b7ht~Y(!O4gXj1E>!nVt67!di* z9~gHkBqX5si{Ered7$B)TWS(r2*vsJ>d8sEJM&$kQC`+V^hKQB4AMJAK2m7Jlj|b< zwCL};%fI-5|H?zvW$SW`Ypx8gcrThbPSgrax0?CPG)E;A*!n8ch`sVH05X?&CMv?m z2h3kX9?tN6V`XZPHjd$keoj4|D7c-|d~}MYtd;Q`&$~Y`2*ES)uI=cGu`rVt;bm*C zNSz)ZQOG~9rPsQg+-RqMmW>XOwJ$)xvmE|UJWG`>$Fy+hU{idFTZ9Of|Rjcx{}{tnwO#-z?zi1AyJ zwVacx6PxyW5gEkINvh`fhHUphAAoDNgzaiRPB)xpCqLaQV5uegGMw7)B{eBuDKz4h z5C5*di_-ZmLAzVW*)|R?Ej$swBkWaM2o$kW?SfoV{-pJ*+`Jc-=a~nX!%FA4GQcZ9 zjZeTQRO|*l$$Y;DV|Iy1`0HlE;`q)k3{KggvG<&4EpUs}5h{ye$4x&ohABXb&Gq9A zzk#8g1-rfX!A=Sr76)uT!5=MJjg>20PslgR%)eF3$#*P0c|Mz3iIZ)vhoo2Gyg9an zD?EJb`z?2;n*8_N`PYGlUIs9N@7r;szND?sGotl6A3Nz%c&f1>ImbdwOw}_;LtIO8 z`f6}&+?Zzi@VCf|w%lHmH%5rwDRMEOb$akf7nfR!lB;Rwx!xROq`K$Q#iih)qL5o-X!28$aJ+JM((6WV5A;2)k4;*3n?0uW>uEOSWk4Kd@^>SY%Z32LYsn`aKk}OGw_q& z<0roI7cbKX}X1HOH@H=qNx<+ZjQz|)iw=vj(BZDdX&P6pl@N$G3LA!a{ z*jsB>2iUtSCtF&a7d~R*aa9rhl}aUEo~XxYUMyx<#j`hjB_a*%MO;R?-Qj40cp7{T zn!D}Rd2mZQb}5qbjD_rmw1sZZH6j~U+urDe1}~k^6v0rgEB9!mF5v?PYq)kF(m>zn zT03)53of<`UU6J%S`EbZ7sd*gedoHP0k*eXmdd4uB z7vMG=KWZyiXJs^|c-H0Jrg?qW=o~?K|KGuTH!58Rlw@xu$_Yd_XX`Ju6zJbRMEucj zTfb9I6y2`|tf(wDfP=O0+=kark*6t=FPey^pX{O4fSzQ0J}rl)uWIGWvu#vnXEAaf zeoCyWDBi79>>r?xZtFqwk68f1Yb_dVO5l>k<%BExdu+aUq76u$SLGxMi+)*HSN46? z;_Am%42ZT)v{NfZ#RF@kuVSGYKBnAfx(#S~Kuw=js?su`#WB?PA+BDrY+K4zq?V1> z180GD9d~zktUkwLJ)rtM6%Q)SrTYQ)J-EC@_{wA5HMacVjVOs$aUP)e-<|nUMX=U; z;@KPRHDsyhQnE^J_P*VXAU_6JfzR$O948x!2RiE?-`<9~R|DZ#DaQSd~JOY|yY!Oyk~q z$$yZ-KgW>&y&AfhX3Px8nhbr4lufDrx_^l0@VD8Mx*4c_!5$;nQM5jg^2NngGPTbE z(PF7GLM6}ksFR0jPVLpU4?l+AD^K_zpx}J(bt8PhPU#Vq4+DJFSJE$4S4j=ToC7d&io$&C34)CMTFZ5R zB{@!taP`&`jZh;E`{Uu0Spz+~4I6k@V8D3E!x@rQDwTosmuA~AOxHpA2gJ92&&bpL zd`7bV+Rjcszy>r*_JJ@@Uy=#X2evUkT;Y8gXdTE#wFTtW-M;-cl(qYOs&-9{!3mtq z?xM)Rn97*Q%aH+ajc|J7KF%H_M*3fE4-euc}XR$v3$ z%QP>;Q7~k>!WY@HvmH_O0boQvSXLY3JMEkjjPtwk-IoFf6pQ2S+>{W8PAd7DdJkUdB(j_6OxKnJsCTDo z&ratXB3htzv9V=mE2dDGyvouVWWDh0Kc0&XW~1=b(W7yrlh-9cuEZ-f9@@6 zD5(kQ5(E73lc{W@RP2qnb}0i^HG~99dm*WHPcOH*G)d#MJ2Q!9%lD`u8!FKn2aFCZ zW_}vZan=iVwY!qRyPCvCRqmf>7ZWg8OHQ8rdx`bmK@7iL;-Ufz*~cZ>&yif_cFr`= zuz*7uQduRs-h3DylNR0<2%XARkq%i%tX<)@9swHF#%Y(kk*#kR(0zR+{C2qbFASS~ zKifXXpE1PVd%#g_Pz1}ca~%=8DyWLQ&Un~o>R(DAzng1E>bSWj`)M3ikLJx!F%GAG&fqRau-b_^wbe9(MJzf&?7MqMU%P}f4 zlSuto2h6LDb1^h_e8O>_-0jD=X(C5<2gLm)XJ3yn?Ar@uM8HbdIUusWzctu=VM&$o znBvJj2oOR(%oWxZY)8brjQ_~Aqy*|&(h?7kG*{$HfINCprt`CYd3&&S%|*Rk!*~>3 z{fPCx7KDUy~x0TQ)z9pTwJ=&Z{E_J&Fp(JHvIn zyt^0+n&aQJ+vFEnSf( zNWuc$1h{_|^3L^(@HxfcFYJ!%)Tiy8Su?!z)eRGQrndPMbKvQ*(xHj+$++J0ODNv6 z5rob(ZB1f5snNd6jb1|BXxto+{!pKRY9#8wne;{@saWGPbBFq~Ac1%N(t+Kgv^it& zp$IkNS2M>S8K1SeY%1qdYiM9nq-CP)l6OoTKi@TYjMVO!-(D8nwTy_uh&~y12VoQ| z4k%U%gvB);!s8vyzJYi-0 z#<{b0KS295%48sUDThGrAu+U-Oe-owy>vZM-PU)b_%jS;cYphXXB05ZLVsHej6rr4 zh*js^MaPK-#F8QQ1!Becr@H0gTjYlw$v+tpFem-YO<#K%#34k zp7kCEIVt*&KS5cHbygn6h?P4ZI;K>kAKzbK*(|}0$2g*QnH|d5KIl6cB-Sain#97W zlZK|LEB4HAbBaeMp+VK_BO^7BY&pmVPL%J8AMVIgvPjhe^0~0ZQl0yKHG}ZJ`ipSa zTV72}phkYKJ~ot6zdj0L*aOW9LoY8e@(t8Wkg6x(AnH#y=PiycW3DL?0bI<)7Ql#ZY#c!6O=pfooA^|?3BqdFl16GBnS zdGOa0l-Qpbst@VHVr8tT|oL$lX-5V<&&Sw77mkz0=0@F4*reVY=&Wi%#g= zdh)$kE=qxQ!~FYxR)$>d;8r@pwIPX_>p zbSQYJS4TPs-Ivso)#K-$SGoq0dV@TAnvFX<6pGC`3bop4Pr_Zwpi>N_+4;OUC84{? z`G2b70V+2h^-I*oUYxPqtl1|p$G$>2$Lx;69Sw3Pcx!KX6vP4MfwQpnt2gF&x8QO8 zo-Z&cy5Jqifxz|bsqHKpnaDQ8zI?J3TsB)|X7l0Y=ZF*yv-k@d{6H`Y<~_2Gk%-+@ zix_NS3D@ebUP-hKsNXSx2Tv8^o%^)B=HF{fdTnK5{Zy2ZM?5kA$eGT6nxTQ2x-*SRYZ7RUQ% zZ->*ItdB#tqVond5^lAr>$Lbr3YBj8*8KMM_t49Fu?22J!TkwH&P`l!9S%Olo2%-9 zt*DuNWiUP-El=zZGu;Dpw;1?T>s^P4hpzv$b##RQx#-<`PV?>1UP4n$wPrEvE-6Lw z#k*gqk;-uQXYp#Rds&uF-WvWfVOXH(r4cOBe?`;)O{jl?o_~mzRc8|8om+6xIhNVk zKTsZg%he%2hua!)nXj5Af`yeZBSF*M>EPaX0}ykoJD5s{%6!P+9XMvimO7kjg1QGS zf6y6K*8k^09+e9Qp?U6|chP0~bq3g+G{VIoS;CI-J_wr!h5X4-UQ2nTvOAz!m&E43 zIZe1iJquia5YN&tq&g=fDm9x8nb^>||6xPCuDeD@R@t3^U6JzjsxDQeR$UEwvm?D&tg9j` zp&?L9T4SLZmxv523x!$MQu(d}n;5YP}3KO(P;qIL`bqwx6J){V2VTt1NX;QlkVK1=hV zbpzG?jbx%(H$8aTpS%k6riNMY&CZcde1;cM^-@!I(U0QvGfG0MmT1LOFVKzMi@2B_ zBfe?X=;A3giOenyK!=&B0GovRD6tqL|A){ zV%Km@Ex?s;juHsN3m+O$ffo_&{y6aC+%^ z4ymJPSp!y;Oa5C}(=Fiqc>N1mB6^WJ-}@>*-J zz4lsSKF36;1W&KqGk5!Pje(2bC8=UkEVx~Jx>Gps?jLO3wR-@#IeW@>R9r3(stUKg z9%6aTuJ7#|H62Ke_vHa`P+*^qbLn_g=hx+U(VoU54sf3YYHgVUr_f?#XV1-l;+Jq7 zvuT=*y$S3{-b4i%f{zGT^{82!|5Tp)Rz7^}O8pj%isupv&BdpXi@zgF7$9Q(V2Ri9 zLHyw7IN;uoy7)iOKQ};=J``F@m>XRG=OY})i&|y!TPd4`w?|t?xjlE%*<)!JKHT4L zHQ3gjZtL$sv!L5ET#$%*0MabE4R(^s*N({8dWn#Caa2>BU`xXpeuh3f@t837`vr*| zUYIwYMWk3mHl)9Jy2bD(+lM~QCEm}3djd40(1(`u$CcZ-c5pI{t?XPfY6^KYt+z4c zgqGh#%1~9VZ{ptHuc+@nfwQzzUY<8XXxx_aUBV33wx@&9$!7Zt%uEUFxSRbNVdGqU zfHrh8gl7=%$bRu8_~*Ve&*8KdP)#YjFz?xM#@=6u(O}a6B_l+`RgjUrl&em5<0@AG zsW%Cf_u0eW%#0pBZYlrAa*Wly?hClY!CBqBI%xKm8wmA=h3)wGvQ+k&W>%8H`&Jx= zt?iv%wKmmJ`p3HQ{y#x0@)Kj4WN$0*^cXdOM3FJg=RUfLyB{bFpOYEVP97-!r9{hr z7MJ-?V*^DwV%MOkhw%qmTIEKa%H`h#{pp675$Yd*MS=hHQUAA+KYyVvn-F54W)|yA zsEFD6hI_O>r}yCd%>N(9?&s4I9U^n4{hv1>jU12yHQ3&-l1{g#Tjr%!}5fDf~O#Mwpd z27;3rAfW@7z$LDf-wSb^XKTNb#%mXsKrPHC1hRWA`%AzI0_*mG)}J99e~KXCx|yGJ1%j9*DuJ|Mic5)5-voCoriAfe2iZKd!vT??lC`gaS~mS(k||(o-k11Toe!uye?Abfxj@A31Z^(h65je#Z~bqo-T$2ZpGn1udOZJg z_WzyEFSB-W0LjtskE)%FYSb;C3_t@RJs*L&sAJ7}{f$;uFMU`A;+Ag?IMsw%Mtqn3kR_e_V9jr{Tul|2Fi=!oCd0bp6b4E zypR1wCBfk8}*<)beAFUk= z?1^(S+)Tj2#y+5WVT}LpEX#jCGyvvSe@i6(oL}5xKy*6XKn*9X;Do@%SljDyt#%xI znPqbBzbC=JgC~IcfU}L4rGG-?2kx0+AB^m7Rto)nJp2Q&;+FX*3z7#4kN-p~>@)Q=YTGU>eJKhI>+!wPi zdm!hYxb0t-wSD+au)*h1K$Y)epSd}_O5AiLYDae>>ix7r?PJG#CSV)3XD!4cmqX5BJOt?x*g@qtd5SziF(cn!BIt z#8V#e`x?JE+nA+kQm~R7EF#eQ#Z%mmIB>Qt+-mF9QImHL{l<@tH1=KhqG_!D$V2d6|`^&jVAie`RrwvJIm44>uC;yJ&Lt{UG-lHU->SBy4>VID6$Od`uY*2; zAQjptP`m?}@NT-8)M1tKa<;F5;MdgQSKALuG%Tdxy(DiH8{~JauCMGl>6L)@N;^qw zbAX;pJwY5-*;ub!g0UR%TDHW$wIZi`Ls3}z4PqZe7h(|V5IjFNjqqVwE8eSd7CzKZ ztrk@g5D@tGl9287bg-z1BalW9RLRNLYk2FtJ>@su%90zv2XikRMa0`QQrZlt8HMhq zDaO+R7i47@TzXQZIe>mI&PzaZ+LBRAf5DZiLQc_Tn;vP#hIdl5l!8ln;#I(M`eoUT84=LE^;kb| z<6v`d?*^DH?CYqFn%wJ)*Hzih7$tv;y31Qbg>FdN+qAWV>`hof_GPAAnap!5QeM>T zqhX>7g3Cn_Kuf*7jdam$BwN3t(Aw9#Ga=$Ko5Aig^lQsj;L3}{s~|1LWe^FwZb&aAoWxY33$6cx@y;95Oj1O`lu1j^?_V%ZAvhJ>|Yf<*FVUV!CFIE z=siBS;WNgN0=F|iTQc|i0gVcs#%!c!12SxuM~d@J`#-l1-SZZJ^&j18!8`V(*CX^W z&k%zUZDahGUTn+g>H%OsFtn#};HnvMC=}NMdtF_i8;kWKJ|NgI*{pG6ZVG3(xy-PZ zaoT&WMwOgpI_cZ^nodoY;bQG&(!=Uiqcyt1db1Hsy||Q=)EKaOj_1uGJq|!YZ}KN; za&PE^g*bx*7C$}o@;ZttRBiC@%zV&a=t&Lbpa9uFN{wSSfzcgqH*wg{cRj`c zg%$OH0tN2|WDsuXt#W`ihU_Ph&eCeV#-JP2U8Qa!lv5?DPP*v&0IrIwQnSu5_ zz%kmkthuw^3GPs`ESvIGEw`OD4CZvThko&c$GKU4#0&yLM9}HB*{{N4mZM(G3?P>l zP(F&s^yyMwJ+V#0C6%u(@K_bfCm=PT8fT2-h)HM~P@lOm(kPA+vcGJlU;6?pbxXst z{3a3*;ns-0@VS3n)8RF2kC4&+9AgKx6+A#gAbnen)K*{LFveXzsz4jya@0~U<%7ao z7t~xsP9>6xUMeU+(PQz64I;Z#x$)EA@RfeBV84a~5=yasCWy_8Z4Oz$w+8I-c2XZN zog1i3EW1;q<(_a6i4Gqg0u;9i0aOfeI~RauW239dG{jyEiWj9V^e5B<^-q|<4Dr#j zMq_qRVW0yo$=H(7*VpGwoJ()wPKCA|;d4LW4sYq@Uyk2tH);*$@Z8&$sWzK662+(u zrak=P#iE?`spxRkPc*BqEwpH*!T})@41&7tE~JP1HQ-WcDgh0LkPq*@gzXNLwg#`| z2YX~aJ`s;nO#8IJE@xS2qewhNjbH?$=tI(U$RtUiE?3#_bThoP(C46p9UR??RkaaFi|fE-=Pe-xorU*+ql4*W1{G0bwW|wPDI) z4|PBcGyn#^cR9j#nkBdD0s!dR3pPiUtQq6o3&x)998A+4s%G$gek`J|z5*C~M1KL$ z21X^fky7FWqIO<6*giQ#arhe#5|o_L>4iWW)DB`WpkU1UKr?r>469|CodAzvqx4wE z#WrjGlh{8gou7YLe7lXAi21ZDeI8KPbAEpQHPGJ8!f{*6ZTT5xq4U}|84oj+RwFq~ zjKhFh^@!zcYiKo<(TU`VR}g%}K3Er88JQS>9x7Fd&dti2o+A!=WV87q1K8m`x&D}R z;`MoYnW>O7SFFW^fJPF+1p!z13wlcJ7kZASdDO$Y-j9Uc0)>GcdVVk(8!^fk`BT98 z?^(L9ozQidJA|ediGdV!r=;siW(90g7nhpVdy|N$mhS?UB-ApTvfbDGwF9tl@IFR8 zDbvnZT@rYnDJ;6tB_3KViW!C~FM?Q@60Cu(piSQ+DTn2wTS~`1S1&EXv)c%sP_KS$ zJ9uZd5UtJE^EO+4Bj13L?{6hE9}$g`fRD+3y?O%rNw z-^ZV3(cY1f1KKbm0g!4&2{Fh;kODfPK3mFTHBnV|u!|^V8UuEzRIu$vzHg}bLw6Hc z8(U@8#hLKVb>PNFlb^^&;#~j`^qWJjr5+Gb^L`zy*($bheGq*d9kYJmSr_;yNu4P~ z{#uucmsxH#FF@^hnGhIIkd5A>BFre>gSQg^p`4D<8JEr&{(QjB1I<9=wMJGZy-9*L z7SwwVaa1&IB&&AjqCu5HCy}<4pn~nA70CIC6<0Y|3sjDd;xS|1Tx<=m*+?y0NQ>43 zT+#lHRM&jffFtwY!WdumNZX1UXtF&xn)q%Dk>kG8rX956iLQL)5x;1|UcK@73V3hL z2JniN`7%#r!iw0#OhALR~4x3o!mKP6f9b{O_PaMhhF{NnRrHr=p}J=&PSV}}PZ@Wo~Y z{@IU0Ah~%puzNM~pJr}1y|&H=vJg*U$8wySZfxRpUp9VX>Ld&qkp2GQC@0`O#nk0v zW!*2B+%*CmCa7cf`GtSb_g@{@U%vX^e8T+(IO=6^IUfYneK~;vvRQ!$bulcy_awCQ zf299+TJk^A{}4?5je7o1>i=BZ{|7jKj)VWh`rjzgkIu;d>wxo*gl=^Vxxz^lXa{7f zr10o6G8DD!e(t0$1q_e_c@xE3mtx{h!k7awTriM(FnUOH7wgY;2FkEKZWT1PQhbeTj%l5ufywcTKlt$R77e>AcG_Om=GTwtK&J@YFkx*jnd?ekYBt+e^yFP-@vQUBYy{{erlzNn?W1Pm0s zUTAZY{1H3l{LjfA+<-g?WNur;;GGZZG)d_adB!!L7R?_wBm=jck{< z&l^iVXsv+^9zNE7^XB!$zPGOb&&ZjlO(3EC^yx!Y)gjMv)Drh!kS8SyuVNqS**1C6 zmSD9H_^3?6tBCIz6?h}T3*k~pkOc|dF`Mtr6yVQc9}hMspG zy8E-IFO6cq!)zh*oqk5qUuW?`tp02k>)0)5uJaS+xm=3~;sxCAfkCH~&{zlaGR9!t zuM_^zFM_wy17lA5{dc~f{E-xGd3db?ZNEIg?8D-JK`#?%vHk5-nmq{PuaD)@`ewcT zPLjAUVG&slf~OZCo40f)UgQw%P*BGWeF(da3 zz~2u+pKuMlYb8SPGfBAG6@oo=>Cz>lVLFd%zv1@J2!RRshfo5lfR5bP{eIn4m zvG+^qevpvgbDz}sme*=tUY_rwzvuT0__wm)KOpO`KmWg1eJZsC+nH93 zS;0T!^>3)VB#V879a4q2wuMbT4_=gGo{;k(8!7G)gt2g_0uNR2?=L=ub zz$UZ{U)B)(I`M;I_T8$5;F{e?!ur|6UR@=nB_}7p&lUB<6aMX6OmOYzmzx-9XF>XJ zC~@?Yuv3TRGZMdL>K|#UmoMqrK?P=JW~wCi-JgB=w-4CD_saTaf%)p0NA|B=^K^E1}<6RKi?b#-<7OLg#nMxEafAuk?(W`%hSx)m}0gBVZ3UdG`3Fq_}K?IOi~ zcZ4b3Bp$zc=>JLHpM8c25c65B{_HWQQ}De;i@nC))3_sXE9z$mC8qQbG)W**ef=}a z{BF`eo!$?>;30fvMt1+e)HezDFHrWcj`EK|znlh;0x*&~7OK7{zpk_Y6d4|FeU6h} z*xA!$dDsUpd2}dGe5AhHq*{+2J+fm_|1cc-xBpCxFxr`f+YqhIJ|8qmJ~wCdx> zaCNYtOo4&^6#0%t+qss}P}ox^FPoo1$?xa_pwo;-27zaXl4@noB`z%SdbO81+G@ZuQ=ZA0 zHjge{xPMlsIkx+!?)mS`cY?ZC^V_!s*Jg6n>BxUKzu!^qSMJF_(6P4FF3*4(Tp&9S z%H+7oYsS=3mz;@A zUCR^+H7L*Ar+(!9Z`Sj#l_^;r$!c%Nj}Fnl|D{;(rOTtPA2oZY-SJ5Xb9=AyT+GYC z0!x(&O9ZW0N8I3({Wy325yJ$#oa3{l_e<}E)U@-Y4~my8)S@Bz3e$S2X)LSTU62U< zI2|JEdt014qk9zSW}W0Z`dK>hL+10k=Lfd@QZ_>U8ON%m8hiTqcG1^LWo1wjMiEq} zx4=)3pHamt_FpApPZL}6XtFKXMj4G;@g5lZJauLEZXX*#%SgX|TdHo{H7j4u{=t81 zb!WvbZig7sCq!r4j?y(-b7c95EZh{8agi*y;+hjD?RwE9h|xAHUW)H~BGBaY(GM<6 zR~N;7?`mGH&2m#~DoC+(Vs?pKn>^JPi?0K~p}M@cAbfEwk=ZUotxio7wOmvCg#U zI*k;rPekR;d~ksAqvW`AYU{nN!nX3WvjgV^`*$D*((8_wxRDPK-57drt9Q!XOv)q; z1~+YIXCMQ~e9AxgDu3W>ImU~nSjvbW+~OfjNh=K#*~gQ1%`ABz67jrdh?LF6Ww<~G zDHkbhC(}XGh5cJ!?00(by?6h~TdZ_juDqhDydP-7b!+H0%rfe#g?^8L{qCJNLB?~X zp>yggiz+lldd4!MfDX*|2#rA?&3O-5&ON}@Db!I ztwLEmTi?~Bq2|jhcbaq8Jhi$zPj78&9dgW7Wtf#2J(=ti>waf~Be}xwIIQ)a73IX1 z4>V>nQb#?P=7wihZpbeoXm61#Z7xJ8w=tM?tvrCaJbY3UoZec z&z9{b#azNdAk-tz4-S+cHbjewI+<9;$s*nKD~IgSdTG>ZVz8B^Bd z4CqMRiF?aV(F7UBw$u7zzaq+?yb^Q3eg<>=oP)c0fqL{lvEcgYg^=zRMS3RwXV;UG z_7*e#Kra52y;S$bykjhpZa$1-t>d}ALi;u&`wB0@@lwXS5Eq=t%qoi9!?i(qZ@D;w z-q{Jnl4iXzQaencU2k8loL!eLjXsrr9m;7)^+3mdSE)R$X-B~*nAKU@bDXmy5=PC4 zoOcSmq@1P?)5Shui?c3-S+);}XuoZfjmi6x-5_`tAN6F!iKQp`$xN7timRiwTZ=;Z z^SbP~3J)6wD;2Njm#ip=+6w)Vm4ai6h!rF_Tf)Z;(zZJq97wTh6nwJ}`Z~{=GNeyd zi+}Qbxl?Dao8(>nPndzBWf4_Oae#$z>u`Hfwq1+~1L>#i+9?sQcRmJ^Nl;ZHrG0ac zULxnrWzQawvf6^N{-miXb?!SWf@BvaKFa!hbB?_}O&U_bV%?O+Q zP||5%w{JiEH7n8<1m%2l*55kHv<#*|7DsMM`A*=fP8lp}kEr05Tlw?wIcdK#-X6aE z%A(f+4i$l1yx%lA)d~%+xOjBKzvCsbVnCBr-Ls53$TP0Jm}=-%yhA-(k%4Yq1F-Kt zYH#1O_iL02uuu9u09nF8H*I1lWXymC(2OqgEn}^|7AZRaF_h24EhDbUg8@k zz>0<0L-MnwaLvf=)u3S@p*FXor6qiHuaCyt5}zw&6g1tMmP;NP>Ch?=t}P+}(o*qK zKF&3kKfiv;_EGqgSnE1o4ij6)^y%4-P&!O;Dz;Yz!Ayiwi;9Z7(qO+D3D6WtM{+{F z+@O(O-gD2+i7o6~!G$;6Qw7W4)Maf8B~Z5sfHspNXe6a|wI=tJVfU(f-tl)x6ULN!;n0JAgxDJ0sX?uPdR^nD8l{7tC>L{ zhk+w2e>&(x8TlGk6DJsXZpX(O@`Cs2_5awn6*ILoyD1x5BFs z;+UU3(-$PQW1)$2aG#aJiC;d-PX)JjCfXX(#xTJkY0!XG+4UmieZk}M0?csdIskNd zMBBX_bp2a8CS)JjSg-3FXsi*dSzrf#IZhTl8MrjCfY^}D7vmF^C15I;1 ze<-89@O*@UPnMJ@w|7;dcc z0F!5zsCGIRp*Kd&>q~D$T2w;AS9s+^LK)<;N+hA--s(i5Ict$U*Gh_CMJlli!_%yy z86oD8i-REZ=K(PvTwXq-qq_vZt!O&%m<{2Y#&y_JP#SB3&ewid`k)5J-K{n!*!{GV z-C@BhX!u2n)?9>rUR^scxnWDdGAhe%&}mHG!Sm^e4y9hs2W5^7W#`e>Du;rrZjr;m zJN;U@ex>|koYMl%jtd>n=pwfy!R444x7q)JHXo`YW_et+gB)oc1(2 z_9yF$VX7UQBQ(9HDJhX_791Y?6$X4t!0nP#VyC1f?mexL8|Rg3WogYsu0cCj+1Oi>7TGj+*tQ~)e1ImZx_2R|3f2(Fh2C%LC_Y$v&-Zz`Bu5{$85LhG z!C=@?6la!hL`y&3zORzoLFA*6rT=-##j$(!i~eZvJI^=55-U>C?VAEt@C!R5V=!^1 z`p3I%c^^FoiUH@{LU?o_$_)cYfIr6GxJBz{X|ZX4(@C>VHAOS67TKGHotE^Qc~VO(d&-s z2ry%u9tjF_A7G1f$>BSs!nN zWjUQkm)P$-vLMO-yfISfuNA)KaUY?jy_3kbr4(Nd2uar%VpIc^)2eNRY=8`p4=!*G zsK$M8Nh-9I_gE}U(bk)-eB|?{z|*Xs@fwXd%nlVgyYkj|!UVkA{?K267rj}&zWbIW zm3MHmJXYai^;WUmox#r{EXzqNQCor<%4@ugI*QPn9##Vg8Q2$34(P|7xf-%h+d;FL zfue0Adx1Uen!zK7SaUAf*D`zC-5R0M>8fza1kW*j8__347UCB5)u3wdyc-ynf_y(9 zq{e;M{jH1Np$+OeB1SN2`Cbo4Np^8-Qq1gJxj;vC#mDHwXQ7|-AfE-&{?y<3Pt%-!tdM9N(iP-K;ZvV;HLBF~ktpaaAE(Vq#?g`*z%Q;hsvC{<~0uZQZ~RpRL$ zIDth6aae=08e|gltg#Z}UyFj7G~mtks5m|j)&m$+VEpu+$*rKUEt~8PaQ)0cjY`y^ zvd5VmmHR6E^wX-tnq|*&;%vh&4e4c1qUdPqad51P>O98$cO&v*3OR#6fLT38PY)P4 zV_zP}0#lJY#^Ap!@b@j&97J4anS|!_)=D~chvY|NG<9(?