From 5af840a8756cf8c0f7f2c50c4bc2821dfecc3faa Mon Sep 17 00:00:00 2001
From: "zzzwangjun@gmail.com" <510423039@qq.com>
Date: Sun, 17 Aug 2025 14:25:05 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E6=A8=A1=E6=9D=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../GlobalUsings.cs | 2 +
...panyName.MyProjectName.HttpApi.Host.csproj | 4 +-
.../MyProjectNameHttpApiHostModule.cs | 258 +-----------------
...ompanyName.MyProjectName.WebGateway.csproj | 2 +-
.../appsettings.json | 3 +
5 files changed, 17 insertions(+), 252 deletions(-)
diff --git a/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/GlobalUsings.cs b/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/GlobalUsings.cs
index ed6b0b0b..5ae0b980 100644
--- a/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/GlobalUsings.cs
+++ b/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/GlobalUsings.cs
@@ -13,6 +13,7 @@ global using Hangfire.Dashboard;
global using Hangfire.States;
global using Hangfire.Storage;
global using Lion.AbpPro;
+global using Lion.AbpPro.AspNetCore;
global using MyCompanyName.MyProjectName.EntityFrameworkCore;
global using MyCompanyName.MyProjectName.MultiTenancy;
global using Microsoft.AspNetCore.Authentication.JwtBearer;
@@ -59,5 +60,6 @@ global using Volo.Abp.Http;
global using Volo.Abp.Json;
global using Volo.Abp.Modularity;
global using Volo.Abp.MultiTenancy;
+global using Volo.Abp.Swashbuckle;
global using Volo.Abp.Users;
global using Volo.Abp.Validation;
\ No newline at end of file
diff --git a/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj
index 5b786630..30f64da9 100644
--- a/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj
+++ b/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj
@@ -27,6 +27,7 @@
+
@@ -38,9 +39,6 @@
-
-
-
diff --git a/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
index 3debd6a6..57943598 100644
--- a/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
+++ b/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
@@ -1,5 +1,3 @@
-using Lion.AbpPro.AspNetCore;
-
namespace MyCompanyName.MyProjectName
{
[DependsOn(
@@ -12,23 +10,13 @@ namespace MyCompanyName.MyProjectName
typeof(AbpAccountWebModule),
typeof(MyProjectNameApplicationModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
- typeof(AbpCachingStackExchangeRedisModule)
+ typeof(AbpCachingStackExchangeRedisModule),
+ typeof(AbpSwashbuckleModule)
)]
public class MyProjectNameHttpApiHostModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
- var configuration = context.Services.GetConfiguration();
- ConfigureCache(context);
- ConfigureSwaggerServices(context);
- ConfigureJwtAuthentication(context, configuration);
- ConfigureMiniProfiler(context);
- ConfigureIdentity(context);
- ConfigureAuditLog(context);
- ConfigurationSignalR(context);
- ConfigurationMultiTenancy();
-
-
context.Services
.AddAbpProAuditLog()
.AddAbpProAuthentication()
@@ -50,35 +38,20 @@ namespace MyCompanyName.MyProjectName
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
- var configuration = context.GetConfiguration();
-
app.UseAbpProRequestLocalization();
app.UseCorrelationId();
- app.UseStaticFiles();
- app.UseMiniProfiler();
+ app.MapAbpStaticAssets();
+ app.UseAbpProMiniProfiler();
app.UseRouting();
- app.UseCors(MyProjectNameHttpApiHostConst.DefaultCorsPolicyName);
+ app.UseAbpProCors();
app.UseAuthentication();
-
- if (MultiTenancyConsts.IsEnabled)
- {
- app.UseMultiTenancy();
- }
-
+ app.UseAbpProMultiTenancy();
app.UseAuthorization();
- app.UseSwagger();
- app.UseAbpSwaggerUI(options =>
- {
- options.SwaggerEndpoint("/swagger/MyProjectName/swagger.json", "MyProjectName API");
- options.DocExpansion(DocExpansion.None);
- options.DefaultModelsExpandDepth(-1);
- });
-
- app.UseAuditing();
+ app.UseAbpProSwaggerUI("/swagger/AbpPro/swagger.json","AbpPro");
+ app.UseAbpProAuditing();
app.UseAbpSerilogEnrichers();
-
app.UseUnitOfWork();
- app.UseConfiguredEndpoints(endpoints =>
+ app.UseConfiguredEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health");
@@ -89,218 +62,7 @@ namespace MyCompanyName.MyProjectName
// });
});
-
-
- }
-
- private void ConfigurationSignalR(ServiceConfigurationContext context)
- {
- var redisConnection = context.Services.GetConfiguration().GetValue("Redis:Configuration");
-
- if (redisConnection.IsNullOrWhiteSpace())
- {
- throw new UserFriendlyException(message: "Redis连接字符串未配置.");
- }
-
- context.Services.AddSignalR().AddStackExchangeRedis(redisConnection, options => { options.Configuration.ChannelPrefix = "Lion.AbpPro"; });
- }
-
- ///
- /// 配置MiniProfiler
- ///
- private void ConfigureMiniProfiler(ServiceConfigurationContext context)
- {
- context.Services.AddMiniProfiler(options => options.RouteBasePath = "/profiler").AddEntityFramework();
- }
-
- ///
- /// 配置JWT
- ///
- private void ConfigureJwtAuthentication(ServiceConfigurationContext context,
- IConfiguration configuration)
- {
- context.Services.AddAuthentication(options =>
- {
- options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
- options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
- })
- .AddJwtBearer(options =>
- {
- options.TokenValidationParameters =
- new TokenValidationParameters()
- {
- // 是否开启签名认证
- ValidateIssuerSigningKey = true,
- ValidateIssuer = true,
- ValidateAudience = true,
- ValidateLifetime = true,
- //ClockSkew = TimeSpan.Zero,
- ValidIssuer = configuration["Jwt:Issuer"],
- ValidAudience = configuration["Jwt:Audience"],
- IssuerSigningKey =
- new SymmetricSecurityKey(
- Encoding.ASCII.GetBytes(configuration["Jwt:SecurityKey"]))
- };
-
- options.Events = new JwtBearerEvents
- {
- OnMessageReceived = currentContext =>
- {
- var path = currentContext.HttpContext.Request.Path;
- if (path.StartsWithSegments("/login"))
- {
- return Task.CompletedTask;
- }
-
- var accessToken = string.Empty;
- if (currentContext.HttpContext.Request.Headers.ContainsKey("Authorization"))
- {
- accessToken = currentContext.HttpContext.Request.Headers["Authorization"];
- if (!string.IsNullOrWhiteSpace(accessToken))
- {
- accessToken = accessToken.Split(" ").LastOrDefault();
- }
- }
-
- if (accessToken.IsNullOrWhiteSpace())
- {
- accessToken = currentContext.Request.Query["access_token"].FirstOrDefault();
- }
-
- if (accessToken.IsNullOrWhiteSpace())
- {
- accessToken = currentContext.Request.Cookies[MyProjectNameHttpApiHostConst.DefaultCookieName];
- }
-
- currentContext.Token = accessToken;
- currentContext.Request.Headers.Remove("Authorization");
- currentContext.Request.Headers.Add("Authorization", $"Bearer {accessToken}");
-
- return Task.CompletedTask;
- }
- };
- });
- }
-
-
- ///
- /// Redis缓存
- ///
- private void ConfigureCache(ServiceConfigurationContext context)
- {
- Configure(
- options => { options.KeyPrefix = "MyProjectName:"; });
- var configuration = context.Services.GetConfiguration();
- var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
- context.Services
- .AddDataProtection()
- .PersistKeysToStackExchangeRedis(redis, "MyProjectName-Protection-Keys");
- }
-
-
- ///
- /// 配置Identity
- ///
- private void ConfigureIdentity(ServiceConfigurationContext context)
- {
- context.Services.Configure(options => { options.Lockout = new LockoutOptions() { AllowedForNewUsers = false }; });
- }
-
- private static void ConfigureSwaggerServices(ServiceConfigurationContext context)
- {
- context.Services.AddSwaggerGen(
- options =>
- {
- // 文件下载类型
- options.MapType(() => new OpenApiSchema() { Type = "file" });
-
- options.SwaggerDoc("MyProjectName",
- new OpenApiInfo { Title = "MyCompanyNameMyProjectName API", Version = "v1" });
- options.DocInclusionPredicate((docName, description) => true);
- options.EnableAnnotations(); // 启用注解
- options.DocumentFilter();
- options.SchemaFilter();
- // 加载所有xml注释,这里会导致swagger加载有点缓慢
- var xmlPaths = Directory.GetFiles(AppContext.BaseDirectory, "*.xml");
- foreach (var xml in xmlPaths)
- {
- options.IncludeXmlComments(xml, true);
- }
-
- options.AddSecurityDefinition(JwtBearerDefaults.AuthenticationScheme,
- new OpenApiSecurityScheme()
- {
- Description = "直接在下框输入JWT生成的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()
- }
- });
-
- options.AddSecurityDefinition("ApiKey", new OpenApiSecurityScheme()
- {
- Type = SecuritySchemeType.ApiKey,
- In = ParameterLocation.Header,
- Name = "Accept-Language",
- Description = "多语言设置,系统预设语言有zh-Hans、en,默认为zh-Hans",
- });
-
- options.AddSecurityRequirement(new OpenApiSecurityRequirement
- {
- {
- new OpenApiSecurityScheme
- {
- Reference = new OpenApiReference
- { Type = ReferenceType.SecurityScheme, Id = "ApiKey" }
- },
- Array.Empty()
- }
- });
- });
- }
-
-
- ///
- /// 审计日志
- ///
- private void ConfigureAuditLog(ServiceConfigurationContext context)
- {
- Configure
- (
- options =>
- {
- options.IsEnabled = true;
- options.EntityHistorySelectors.AddAllEntities();
- options.ApplicationName = "MyCompanyName.MyProjectName";
- }
- );
-
- Configure(
- options =>
- {
- options.IgnoredUrls.Add("/AuditLogs/page");
- options.IgnoredUrls.Add("/hangfire/stats");
- options.IgnoredUrls.Add("/cap");
- });
- }
-
- private void ConfigurationMultiTenancy()
- {
- Configure(options => { options.IsEnabled = MultiTenancyConsts.IsEnabled; });
+ app.UseAbpProConsul();
}
}
}
\ No newline at end of file
diff --git a/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.WebGateway/MyCompanyName.MyProjectName.WebGateway.csproj b/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.WebGateway/MyCompanyName.MyProjectName.WebGateway.csproj
index 1a4dde84..25e55aeb 100644
--- a/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.WebGateway/MyCompanyName.MyProjectName.WebGateway.csproj
+++ b/templates/pro-nuget/service/host/MyCompanyName.MyProjectName.WebGateway/MyCompanyName.MyProjectName.WebGateway.csproj
@@ -5,6 +5,6 @@
-
+
\ No newline at end of file
diff --git a/templates/pro-nuget/service/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json b/templates/pro-nuget/service/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json
index 12bc0f07..3cb9f713 100644
--- a/templates/pro-nuget/service/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json
+++ b/templates/pro-nuget/service/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json
@@ -1,5 +1,8 @@
{
"ConnectionStrings": {
"Default": "Data Source=localhost;Port=3306;Database=MyCompanyNameMyProjectNameDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
+ },
+ "Redis": {
+ "Configuration": "localhost:6379,password=75He82bB5jFA84XZ1,defaultdatabase=1"
}
}
\ No newline at end of file