Browse Source

feat: 调整模板

abp/9.3.0.4 9.3.0.4
zzzwangjun@gmail.com 7 months ago
parent
commit
5af840a875
  1. 2
      templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/GlobalUsings.cs
  2. 4
      templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj
  3. 258
      templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
  4. 2
      templates/pro-nuget/service/host/MyCompanyName.MyProjectName.WebGateway/MyCompanyName.MyProjectName.WebGateway.csproj
  5. 3
      templates/pro-nuget/service/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json

2
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.States;
global using Hangfire.Storage; global using Hangfire.Storage;
global using Lion.AbpPro; global using Lion.AbpPro;
global using Lion.AbpPro.AspNetCore;
global using MyCompanyName.MyProjectName.EntityFrameworkCore; global using MyCompanyName.MyProjectName.EntityFrameworkCore;
global using MyCompanyName.MyProjectName.MultiTenancy; global using MyCompanyName.MyProjectName.MultiTenancy;
global using Microsoft.AspNetCore.Authentication.JwtBearer; global using Microsoft.AspNetCore.Authentication.JwtBearer;
@ -59,5 +60,6 @@ global using Volo.Abp.Http;
global using Volo.Abp.Json; global using Volo.Abp.Json;
global using Volo.Abp.Modularity; global using Volo.Abp.Modularity;
global using Volo.Abp.MultiTenancy; global using Volo.Abp.MultiTenancy;
global using Volo.Abp.Swashbuckle;
global using Volo.Abp.Users; global using Volo.Abp.Users;
global using Volo.Abp.Validation; global using Volo.Abp.Validation;

4
templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj

@ -27,6 +27,7 @@
<PackageReference Include="DotNetCore.CAP.Dashboard"/> <PackageReference Include="DotNetCore.CAP.Dashboard"/>
<PackageReference Include="DistributedLock.Redis"/> <PackageReference Include="DistributedLock.Redis"/>
<PackageReference Include="Hangfire.Redis.StackExchange"/> <PackageReference Include="Hangfire.Redis.StackExchange"/>
<PackageReference Include="Lion.AbpPro.AspNetCore"/>
</ItemGroup> </ItemGroup>
@ -38,9 +39,6 @@
<ProjectReference Include="..\..\src\MyCompanyName.MyProjectName.HttpApi\MyCompanyName.MyProjectName.HttpApi.csproj"/> <ProjectReference Include="..\..\src\MyCompanyName.MyProjectName.HttpApi\MyCompanyName.MyProjectName.HttpApi.csproj"/>
</ItemGroup> </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\..\aspnet-core\frameworks\src\Lion.AbpPro.AspNetCore\Lion.AbpPro.AspNetCore.csproj"/>
</ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Remove="Logs\**"/> <Compile Remove="Logs\**"/>

258
templates/pro-nuget/service/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs

@ -1,5 +1,3 @@
using Lion.AbpPro.AspNetCore;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName
{ {
[DependsOn( [DependsOn(
@ -12,23 +10,13 @@ namespace MyCompanyName.MyProjectName
typeof(AbpAccountWebModule), typeof(AbpAccountWebModule),
typeof(MyProjectNameApplicationModule), typeof(MyProjectNameApplicationModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpCachingStackExchangeRedisModule) typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpSwashbuckleModule)
)] )]
public class MyProjectNameHttpApiHostModule : AbpModule public class MyProjectNameHttpApiHostModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) 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 context.Services
.AddAbpProAuditLog() .AddAbpProAuditLog()
.AddAbpProAuthentication() .AddAbpProAuthentication()
@ -50,35 +38,20 @@ namespace MyCompanyName.MyProjectName
public override void OnApplicationInitialization(ApplicationInitializationContext context) public override void OnApplicationInitialization(ApplicationInitializationContext context)
{ {
var app = context.GetApplicationBuilder(); var app = context.GetApplicationBuilder();
var configuration = context.GetConfiguration();
app.UseAbpProRequestLocalization(); app.UseAbpProRequestLocalization();
app.UseCorrelationId(); app.UseCorrelationId();
app.UseStaticFiles(); app.MapAbpStaticAssets();
app.UseMiniProfiler(); app.UseAbpProMiniProfiler();
app.UseRouting(); app.UseRouting();
app.UseCors(MyProjectNameHttpApiHostConst.DefaultCorsPolicyName); app.UseAbpProCors();
app.UseAuthentication(); app.UseAuthentication();
app.UseAbpProMultiTenancy();
if (MultiTenancyConsts.IsEnabled)
{
app.UseMultiTenancy();
}
app.UseAuthorization(); app.UseAuthorization();
app.UseSwagger(); app.UseAbpProSwaggerUI("/swagger/AbpPro/swagger.json","AbpPro");
app.UseAbpSwaggerUI(options => app.UseAbpProAuditing();
{
options.SwaggerEndpoint("/swagger/MyProjectName/swagger.json", "MyProjectName API");
options.DocExpansion(DocExpansion.None);
options.DefaultModelsExpandDepth(-1);
});
app.UseAuditing();
app.UseAbpSerilogEnrichers(); app.UseAbpSerilogEnrichers();
app.UseUnitOfWork(); app.UseUnitOfWork();
app.UseConfiguredEndpoints(endpoints => app.UseConfiguredEndpoints(endpoints =>
{ {
endpoints.MapHealthChecks("/health"); endpoints.MapHealthChecks("/health");
@ -89,218 +62,7 @@ namespace MyCompanyName.MyProjectName
// }); // });
}); });
app.UseAbpProConsul();
}
private void ConfigurationSignalR(ServiceConfigurationContext context)
{
var redisConnection = context.Services.GetConfiguration().GetValue<string>("Redis:Configuration");
if (redisConnection.IsNullOrWhiteSpace())
{
throw new UserFriendlyException(message: "Redis连接字符串未配置.");
}
context.Services.AddSignalR().AddStackExchangeRedis(redisConnection, options => { options.Configuration.ChannelPrefix = "Lion.AbpPro"; });
}
/// <summary>
/// 配置MiniProfiler
/// </summary>
private void ConfigureMiniProfiler(ServiceConfigurationContext context)
{
context.Services.AddMiniProfiler(options => options.RouteBasePath = "/profiler").AddEntityFramework();
}
/// <summary>
/// 配置JWT
/// </summary>
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;
}
};
});
}
/// <summary>
/// Redis缓存
/// </summary>
private void ConfigureCache(ServiceConfigurationContext context)
{
Configure<AbpDistributedCacheOptions>(
options => { options.KeyPrefix = "MyProjectName:"; });
var configuration = context.Services.GetConfiguration();
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
context.Services
.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "MyProjectName-Protection-Keys");
}
/// <summary>
/// 配置Identity
/// </summary>
private void ConfigureIdentity(ServiceConfigurationContext context)
{
context.Services.Configure<IdentityOptions>(options => { options.Lockout = new LockoutOptions() { AllowedForNewUsers = false }; });
}
private static void ConfigureSwaggerServices(ServiceConfigurationContext context)
{
context.Services.AddSwaggerGen(
options =>
{
// 文件下载类型
options.MapType<FileContentResult>(() => new OpenApiSchema() { Type = "file" });
options.SwaggerDoc("MyProjectName",
new OpenApiInfo { Title = "MyCompanyNameMyProjectName API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.EnableAnnotations(); // 启用注解
options.DocumentFilter<HiddenAbpDefaultApiFilter>();
options.SchemaFilter<EnumSchemaFilter>();
// 加载所有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<string>()
}
});
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<string>()
}
});
});
}
/// <summary>
/// 审计日志
/// </summary>
private void ConfigureAuditLog(ServiceConfigurationContext context)
{
Configure<AbpAuditingOptions>
(
options =>
{
options.IsEnabled = true;
options.EntityHistorySelectors.AddAllEntities();
options.ApplicationName = "MyCompanyName.MyProjectName";
}
);
Configure<AbpAspNetCoreAuditingOptions>(
options =>
{
options.IgnoredUrls.Add("/AuditLogs/page");
options.IgnoredUrls.Add("/hangfire/stats");
options.IgnoredUrls.Add("/cap");
});
}
private void ConfigurationMultiTenancy()
{
Configure<AbpMultiTenancyOptions>(options => { options.IsEnabled = MultiTenancyConsts.IsEnabled; });
} }
} }
} }

2
templates/pro-nuget/service/host/MyCompanyName.MyProjectName.WebGateway/MyCompanyName.MyProjectName.WebGateway.csproj

@ -5,6 +5,6 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\..\..\aspnet-core\frameworks\src\Lion.AbpPro.AspNetCore\Lion.AbpPro.AspNetCore.csproj"/> <PackageReference Include="Lion.AbpPro.AspNetCore"/>
</ItemGroup> </ItemGroup>
</Project> </Project>

3
templates/pro-nuget/service/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json

@ -1,5 +1,8 @@
{ {
"ConnectionStrings": { "ConnectionStrings": {
"Default": "Data Source=localhost;Port=3306;Database=MyCompanyNameMyProjectNameDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" "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"
} }
} }
Loading…
Cancel
Save