From ed9eb9abbde4094352d36ad21bba58e4afc27856 Mon Sep 17 00:00:00 2001 From: "zzzwangjun@gmail.com" <510423039@qq.com> Date: Thu, 25 Sep 2025 15:38:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pro-module/Directory.Build.Lion.targets | 3 +- .../ServiceCollectionExtensions.cs | 42 +++ ...ojectName.MyModuleName.HttpApi.Host.csproj | 1 + .../MyModuleNameHttpApiHostModule.cs | 250 ++++-------------- .../appsettings.json | 61 ++++- 5 files changed, 146 insertions(+), 211 deletions(-) create mode 100644 templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/Microsoft/Extensions/DependencyInjection/ServiceCollectionExtensions.cs diff --git a/templates/pro-module/Directory.Build.Lion.targets b/templates/pro-module/Directory.Build.Lion.targets index 05e1e959..2c24356c 100644 --- a/templates/pro-module/Directory.Build.Lion.targets +++ b/templates/pro-module/Directory.Build.Lion.targets @@ -2,7 +2,6 @@ - - + \ No newline at end of file diff --git a/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/Microsoft/Extensions/DependencyInjection/ServiceCollectionExtensions.cs b/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/Microsoft/Extensions/DependencyInjection/ServiceCollectionExtensions.cs new file mode 100644 index 00000000..96b3d446 --- /dev/null +++ b/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/Microsoft/Extensions/DependencyInjection/ServiceCollectionExtensions.cs @@ -0,0 +1,42 @@ +using Microsoft.AspNetCore.Identity; +using MyCompanyName.MyProjectName.MyModuleName; + +#pragma warning disable CS0618 // Type or member is obsolete + +namespace Microsoft.Extensions.DependencyInjection; + +public static class ServiceCollectionExtensions +{ + /// + /// 注册Redis缓存 + /// + public static IServiceCollection AddAbpProRedis(this IServiceCollection service) + { + service.Configure(options => { options.KeyPrefix = "AbpPro:"; }); + var configuration = service.GetConfiguration(); + var redis = ConnectionMultiplexer.Connect(configuration.GetValue("Redis:Configuration")); + service + .AddDataProtection() + .PersistKeysToStackExchangeRedis(redis, "AbpPro-Protection-Keys"); + return service; + } + /// + /// 配置虚拟文件系统 + /// + public static IServiceCollection AddAbpProVirtualFileSystem(this IServiceCollection service) + { + service.Configure(options => + { + options.FileSets.AddEmbedded(); + }); + return service; + } + + public static IServiceCollection AddAbpProDbContext(this IServiceCollection service) + { + service.Configure(options => { options.UseMySQL(builder => { builder.TranslateParameterizedCollectionsToConstants(); }); }); + return service; + } + + +} \ No newline at end of file diff --git a/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host.csproj b/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host.csproj index 5d4b507d..eebfde98 100644 --- a/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host.csproj +++ b/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host.csproj @@ -20,6 +20,7 @@ + diff --git a/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/MyModuleNameHttpApiHostModule.cs b/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/MyModuleNameHttpApiHostModule.cs index 2a0f76e2..b43c5917 100644 --- a/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/MyModuleNameHttpApiHostModule.cs +++ b/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/MyModuleNameHttpApiHostModule.cs @@ -1,207 +1,51 @@ -using Volo.Abp.MultiTenancy; - -namespace MyCompanyName.MyProjectName.MyModuleName +using Lion.AbpPro.AspNetCore; + +namespace MyCompanyName.MyProjectName.MyModuleName; + +[DependsOn( + typeof(AbpProAspNetCoreModule), + typeof(MyModuleNameApplicationModule), + typeof(MyModuleNameEntityFrameworkCoreModule), + typeof(MyModuleNameHttpApiModule), + typeof(AbpAspNetCoreMvcUiMultiTenancyModule), + typeof(AbpAutofacModule), + typeof(AbpCachingStackExchangeRedisModule), + typeof(AbpEntityFrameworkCoreMySQLModule), + typeof(AbpAspNetCoreSerilogModule), + typeof(AbpSwashbuckleModule) +)] +public class MyModuleNameHttpApiHostModule : AbpModule { - [DependsOn( - typeof(MyModuleNameApplicationModule), - typeof(MyModuleNameEntityFrameworkCoreModule), - typeof(MyModuleNameHttpApiModule), - typeof(AbpAspNetCoreMvcUiMultiTenancyModule), - typeof(AbpAutofacModule), - typeof(AbpCachingStackExchangeRedisModule), - typeof(AbpEntityFrameworkCoreMySQLModule), - //typeof(AbpAuditLoggingEntityFrameworkCoreModule), - //typeof(AbpPermissionManagementEntityFrameworkCoreModule), - //typeof(AbpSettingManagementEntityFrameworkCoreModule), - typeof(AbpAspNetCoreSerilogModule), - typeof(AbpSwashbuckleModule) - )] - public class MyModuleNameHttpApiHostModule : AbpModule + public override void ConfigureServices(ServiceConfigurationContext context) { - private const string DefaultCorsPolicyName = "Default"; - private const bool MultiTenancyIsEnabled = true; - - public override void ConfigureServices(ServiceConfigurationContext context) - { - ConfigureSwaggerServices(context); - ConfigureCache(context); - ConfigureCors(context); - ConfigureDB(); - ConfigureLocalization(); - ConfigureVirtualFileSystem(context); - ConfigurationMultiTenancy(); - context.Services.AddAlwaysAllowAuthorization(); - } - - public override void OnApplicationInitialization(ApplicationInitializationContext context) - { - var app = context.GetApplicationBuilder(); - var env = context.GetEnvironment(); - - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - else - { - app.UseErrorPage(); - app.UseHsts(); - } - - app.UseHttpsRedirection(); - app.UseCorrelationId(); - app.UseStaticFiles(); - app.UseRouting(); - app.UseCors(DefaultCorsPolicyName); - app.UseAuthentication(); - - if (MultiTenancyIsEnabled) - { - app.UseMultiTenancy(); - } - app.UseAbpRequestLocalization(); - app.UseAuthorization(); - app.UseSwagger(); - app.UseAbpSwaggerUI(options => - { - options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API"); - - var configuration = context.GetConfiguration(); - options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]); - options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]); - options.OAuthScopes("MyModuleName"); - }); - app.UseAuditing(); - app.UseAbpSerilogEnrichers(); - app.UseConfiguredEndpoints(); - } - - private void ConfigurationMultiTenancy() - { - Configure(options => { options.IsEnabled = MultiTenancyIsEnabled; }); - } - /// - /// 配置跨域 - /// - /// - private void ConfigureCors(ServiceConfigurationContext context) - { - var configuration = context.Services.GetConfiguration(); - context.Services.AddCors(options => - { - options.AddPolicy(DefaultCorsPolicyName, builder => - { - builder - .WithOrigins( - configuration["App:CorsOrigins"] - .Split(",", StringSplitOptions.RemoveEmptyEntries) - .Select(o => o.RemovePostFix("/")) - .ToArray() - ) - .WithAbpExposedHeaders() - .SetIsOriginAllowedToAllowWildcardSubdomains() - .AllowAnyHeader() - .AllowAnyMethod() - .AllowCredentials(); - }); - }); - } - - /// - /// 配置SwaggerUI - /// - /// - private static void ConfigureSwaggerServices(ServiceConfigurationContext context) - { - context.Services.AddSwaggerGen( - options => - { - options.SwaggerDoc("v1", new OpenApiInfo {Title = "MyModuleName API", Version = "v1"}); - - options.DocInclusionPredicate((docName, description) => true); - - #region 添加token - - options.AddSecurityDefinition(JwtBearerDefaults.AuthenticationScheme, new OpenApiSecurityScheme() - { - Description = "请输入Token", - Name = "Authorization", - In = ParameterLocation.Header, - Type = SecuritySchemeType.Http, - Scheme = JwtBearerDefaults.AuthenticationScheme, - BearerFormat = "JWT" - }); - options.AddSecurityRequirement(new OpenApiSecurityRequirement - { - { - new OpenApiSecurityScheme - { - Reference = new OpenApiReference - { - Type = ReferenceType.SecurityScheme, Id = "Bearer" - } - }, - new List() - } - }); - - #endregion - }); - } - - /// - /// Redis缓存 - /// - /// - private void ConfigureCache(ServiceConfigurationContext context) - { - var hostingEnvironment = context.Services.GetHostingEnvironment(); - var configuration = context.Services.GetConfiguration(); - Configure(options => { options.KeyPrefix = "MyModuleName:"; }); + context.Services.AddAbpProSwagger("MyProjectName") + .AddAbpProRedis() + .AddAbpProCors() + .AddAbpProLocalization() + .AddAbpProExceptions() + .AddAbpProHealthChecks() + .AddAbpProTenantResolvers() + .AddAbpProMultiTenancy() + .AddAbpProAntiForgery() + .AddAbpProVirtualFileSystem() + .AddAbpProDbContext() + .AddAlwaysAllowAuthorization(); + } - if (!hostingEnvironment.IsDevelopment()) - { - var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); - context.Services - .AddDataProtection() - .PersistKeysToStackExchangeRedis(redis, "MyModuleName-Protection-Keys"); - } - } - - private void ConfigureDB() - { - Configure(options => { options.UseMySQL(builder => { builder.TranslateParameterizedCollectionsToConstants(); }); }); - } - - /// - ///配置本地化 - /// - private void ConfigureLocalization() - { - Configure(options => - { - options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština")); - options.Languages.Add(new LanguageInfo("en", "en", "English")); - options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)")); - options.Languages.Add(new LanguageInfo("fr", "fr", "Français")); - options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar")); - options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português")); - options.Languages.Add(new LanguageInfo("ru", "ru", "Русский")); - options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe")); - options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); - options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文")); - }); - } - /// - /// 配置虚拟文件系统 - /// - /// - private void ConfigureVirtualFileSystem(ServiceConfigurationContext context) - { - Configure(options => - { - options.FileSets.AddEmbedded(); - }); - } + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + app.UseAbpProRequestLocalization(); + app.UseCorrelationId(); + app.MapAbpStaticAssets(); + app.UseRouting(); + app.UseAbpProCors(); + app.UseAuthentication(); + app.UseAbpProMultiTenancy(); + app.UseAuthorization(); + app.UseAbpProSwaggerUI("/swagger/MyProjectName/swagger.json", "MyProjectName"); + app.UseAbpSerilogEnrichers(); + app.UseUnitOfWork(); + app.UseConfiguredEndpoints(endpoints => { endpoints.MapHealthChecks("/health"); }); } -} +} \ No newline at end of file diff --git a/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/appsettings.json b/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/appsettings.json index 19627a1c..e5c8fcea 100644 --- a/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/appsettings.json +++ b/templates/pro-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/appsettings.json @@ -1,13 +1,62 @@ { + "Serilog": { + "Using": [ + "Serilog.Sinks.Console", + "Serilog.Sinks.File" + ], + "MinimumLevel": { + "Default": "Debug", + "Override": { + "Microsoft": "Information", + "Volo.Abp": "Information", + "Hangfire": "Information", + "DotNetCore.CAP": "Information", + "Serilog.AspNetCore": "Information", + "Microsoft.EntityFrameworkCore": "Warning", + "Microsoft.AspNetCore": "Information" + } + }, + "WriteTo": [ + { + "Name": "Console" + }, + { + "Name": "File", + "Args": { + "path": "logs/logs-.txt", + "rollingInterval": "Day" + } + }, + { + "Name": "Elastic", + "Args": { + "Enabled": false, + "Url": "http://es.cn", + "IndexFormat": "Lion.AbpPro.development.{0:yyyy.MM.dd}", + "UserName": "elastic", + "Password": "aVVhjQ95RP7nbwNy", + "ApplicationName": "Lion.AbpPro.HttpApi.Host" + } + } + ] + }, "App": { - "CorsOrigins": "https://*.MyModuleName.com,http://localhost:4200,http://localhost:44307,https://localhost:44307" + "SelfUrl": "http://localhost:44315", }, "ConnectionStrings": { - "Default": "Data Source=localhost;Database=MyCompanyNameMyProjectNameDB;uid=root;pwd=mypassword;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true", - "MyModuleName": "Data Source=localhost;Database=MyModuleName;uid=root;pwd=mypassword;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" + "Default": "Data Source=localhost;Port=3306;Database=MyCompanyName.MyProjectName.MyModuleName;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" }, "Redis": { - "Configuration": "localhost,password=mypassword", - "DatabaseId": 1 + "Configuration": "localhost:6379,password=1q2w3E*,defaultdatabase=2" + }, + "Swagger": { + "Enabled": true + }, + "Cors": { + "Enabled": true, + "CorsOrigins": "http://localhost:4200,http://localhost:4201" + }, + "MultiTenancy": { + "Enabled": true } -} +} \ No newline at end of file