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