diff --git a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain/GlobalUsings.cs b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain/GlobalUsings.cs index af2f2e10..d4b72d28 100644 --- a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain/GlobalUsings.cs +++ b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain/GlobalUsings.cs @@ -1,6 +1,8 @@ // Global using directives global using System.Net; +global using Lion.AbpPro.BasicManagement.Localization; +global using Lion.AbpPro.Core; global using Volo.Abp.Auditing; global using Volo.Abp.AuditLogging; global using Volo.Abp.AutoMapper; @@ -9,7 +11,10 @@ global using Volo.Abp.Domain; global using Volo.Abp.Domain.Services; global using Volo.Abp.FeatureManagement; global using Volo.Abp.Identity; +global using Volo.Abp.Localization; global using Volo.Abp.Modularity; global using Volo.Abp.PermissionManagement.Identity; global using Volo.Abp.SettingManagement; -global using Volo.Abp.TenantManagement; \ No newline at end of file +global using Volo.Abp.Settings; +global using Volo.Abp.TenantManagement; +global using Volo.Abp.Timing; \ No newline at end of file diff --git a/templates/abp-vnext-pro-nuget-all/aspnet-core/MyCompanyName.MyProjectName.sln b/templates/abp-vnext-pro-nuget-all/aspnet-core/MyCompanyName.MyProjectName.sln index 73fa6339..e5991efb 100644 --- a/templates/abp-vnext-pro-nuget-all/aspnet-core/MyCompanyName.MyProjectName.sln +++ b/templates/abp-vnext-pro-nuget-all/aspnet-core/MyCompanyName.MyProjectName.sln @@ -48,6 +48,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyCompanyName.MyProjectName EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyCompanyName.MyProjectName.FreeSqlRepository", "src\MyCompanyName.MyProjectName.FreeSqlRepository\MyCompanyName.MyProjectName.FreeSqlRepository.csproj", "{27C7A0E6-4C2E-4AFF-9DE7-1F526DDC0D18}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyCompanyName.MyProjectName.WebGateway", "host\MyCompanyName.MyProjectName.WebGateway\MyCompanyName.MyProjectName.WebGateway.csproj", "{9C009501-0ED2-4930-B020-C8D06FE28E44}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -114,6 +116,10 @@ Global {27C7A0E6-4C2E-4AFF-9DE7-1F526DDC0D18}.Debug|Any CPU.Build.0 = Debug|Any CPU {27C7A0E6-4C2E-4AFF-9DE7-1F526DDC0D18}.Release|Any CPU.ActiveCfg = Release|Any CPU {27C7A0E6-4C2E-4AFF-9DE7-1F526DDC0D18}.Release|Any CPU.Build.0 = Release|Any CPU + {9C009501-0ED2-4930-B020-C8D06FE28E44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C009501-0ED2-4930-B020-C8D06FE28E44}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C009501-0ED2-4930-B020-C8D06FE28E44}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C009501-0ED2-4930-B020-C8D06FE28E44}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -134,6 +140,7 @@ Global {AA94D832-1CCC-4715-95A9-A483F23A1A5D} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} {FB20372D-6C96-4733-9AAC-12522F15CAA6} = {8C1B8C6C-C518-4290-B070-622CCA6004DA} {27C7A0E6-4C2E-4AFF-9DE7-1F526DDC0D18} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} + {9C009501-0ED2-4930-B020-C8D06FE28E44} = {8C1B8C6C-C518-4290-B070-622CCA6004DA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F} diff --git a/templates/abp-vnext-pro-nuget-all/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/GlobalUsings.cs b/templates/abp-vnext-pro-nuget-all/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/GlobalUsings.cs index 33760843..95bc3485 100644 --- a/templates/abp-vnext-pro-nuget-all/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/GlobalUsings.cs +++ b/templates/abp-vnext-pro-nuget-all/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/GlobalUsings.cs @@ -12,6 +12,7 @@ global using Hangfire.Common; global using Hangfire.Dashboard; global using Hangfire.States; global using Hangfire.Storage; +global using Lion.AbpPro; global using MyCompanyName.MyProjectName.EntityFrameworkCore; global using MyCompanyName.MyProjectName.Extensions; global using MyCompanyName.MyProjectName.Extensions.Hangfire; @@ -37,6 +38,7 @@ global using Microsoft.IdentityModel.Tokens; global using Microsoft.OpenApi.Models; global using Serilog; global using StackExchange.Redis; +global using Swagger; global using Swashbuckle.AspNetCore.SwaggerUI; global using Volo.Abp; global using Volo.Abp.Account.Web; @@ -59,5 +61,6 @@ global using Volo.Abp.ExceptionHandling; global using Volo.Abp.Http; global using Volo.Abp.Json; global using Volo.Abp.Modularity; +global using Volo.Abp.MultiTenancy; global using Volo.Abp.Users; global using Volo.Abp.Validation; \ No newline at end of file diff --git a/templates/abp-vnext-pro-nuget-all/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/abp-vnext-pro-nuget-all/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs index bfe9a2b4..d3126778 100644 --- a/templates/abp-vnext-pro-nuget-all/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs +++ b/templates/abp-vnext-pro-nuget-all/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs @@ -1,6 +1,3 @@ -using Lion.AbpPro; -using Swagger; - namespace MyCompanyName.MyProjectName { [DependsOn( @@ -27,6 +24,7 @@ namespace MyCompanyName.MyProjectName ConfigureIdentity(context); ConfigureAuditLog(context); ConfigurationSignalR(context); + ConfigurationMultiTenancy(); } public override void OnApplicationInitialization(ApplicationInitializationContext context) @@ -273,5 +271,10 @@ namespace MyCompanyName.MyProjectName options.IgnoredUrls.Add("/cap"); }); } + + private void ConfigurationMultiTenancy() + { + Configure(options => { options.IsEnabled = MultiTenancyConsts.IsEnabled; }); + } } } \ No newline at end of file diff --git a/templates/abp-vnext-pro-nuget-all/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Pages/Monitor.cshtml b/templates/abp-vnext-pro-nuget-all/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Pages/Monitor.cshtml index 6d5decea..ebf35a54 100644 --- a/templates/abp-vnext-pro-nuget-all/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Pages/Monitor.cshtml +++ b/templates/abp-vnext-pro-nuget-all/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Pages/Monitor.cshtml @@ -38,18 +38,18 @@ -
-
- - - -
-

- Hangfire面板 -

-
-
-
+ @*
*@ + @*
*@ + @* *@ + @* *@ + @* *@ + @*
*@ + @*

*@ + @* Hangfire面板 *@ + @*

*@ + @*
*@ + @*
*@ + @*
*@
diff --git a/templates/abp-vnext-pro-nuget-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/MyModuleNameHttpApiHostModule.cs b/templates/abp-vnext-pro-nuget-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/MyModuleNameHttpApiHostModule.cs index 926562b6..4ccfe669 100644 --- a/templates/abp-vnext-pro-nuget-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/MyModuleNameHttpApiHostModule.cs +++ b/templates/abp-vnext-pro-nuget-module/host/MyCompanyName.MyProjectName.MyModuleName.HttpApi.Host/MyModuleNameHttpApiHostModule.cs @@ -1,3 +1,5 @@ +using Volo.Abp.MultiTenancy; + namespace MyCompanyName.MyProjectName.MyModuleName { [DependsOn( @@ -17,6 +19,7 @@ namespace MyCompanyName.MyProjectName.MyModuleName public class MyModuleNameHttpApiHostModule : AbpModule { private const string DefaultCorsPolicyName = "Default"; + private const bool MultiTenancyIsEnabled = true; public override void ConfigureServices(ServiceConfigurationContext context) { @@ -26,6 +29,7 @@ namespace MyCompanyName.MyProjectName.MyModuleName ConfigureDB(); ConfigureLocalization(); ConfigureVirtualFileSystem(context); + ConfigurationMultiTenancy(); } public override void OnApplicationInitialization(ApplicationInitializationContext context) @@ -49,6 +53,11 @@ namespace MyCompanyName.MyProjectName.MyModuleName app.UseRouting(); app.UseCors(DefaultCorsPolicyName); app.UseAuthentication(); + + if (MultiTenancyIsEnabled) + { + app.UseMultiTenancy(); + } app.UseAbpRequestLocalization(); app.UseAuthorization(); app.UseSwagger(); @@ -66,6 +75,10 @@ namespace MyCompanyName.MyProjectName.MyModuleName app.UseConfiguredEndpoints(); } + private void ConfigurationMultiTenancy() + { + Configure(options => { options.IsEnabled = MultiTenancyIsEnabled; }); + } /// /// 配置跨域 /// diff --git a/templates/abp-vnext-pro-nuget-simplify/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/GlobalUsings.cs b/templates/abp-vnext-pro-nuget-simplify/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/GlobalUsings.cs index 7680d5c7..7dc6d3ee 100644 --- a/templates/abp-vnext-pro-nuget-simplify/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/GlobalUsings.cs +++ b/templates/abp-vnext-pro-nuget-simplify/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/GlobalUsings.cs @@ -62,4 +62,5 @@ global using Volo.Abp.Http; global using Volo.Abp.Json; global using Volo.Abp.Modularity; global using Volo.Abp.Users; -global using Volo.Abp.Validation; \ No newline at end of file +global using Volo.Abp.Validation; +global using Volo.Abp.MultiTenancy; \ No newline at end of file diff --git a/templates/abp-vnext-pro-nuget-simplify/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/abp-vnext-pro-nuget-simplify/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs index c4ca7692..02a6a871 100644 --- a/templates/abp-vnext-pro-nuget-simplify/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs +++ b/templates/abp-vnext-pro-nuget-simplify/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs @@ -1,268 +1,273 @@ -namespace MyCompanyName.MyProjectName +namespace MyCompanyName.MyProjectName; + +[DependsOn( + typeof(MyProjectNameHttpApiModule), + typeof(AbpProSharedHostingMicroserviceModule), + typeof(AbpAspNetCoreMvcUiMultiTenancyModule), + typeof(MyProjectNameEntityFrameworkCoreModule), + typeof(AbpAspNetCoreAuthenticationJwtBearerModule), + typeof(AbpAspNetCoreSerilogModule), + typeof(AbpAccountWebModule), + typeof(MyProjectNameApplicationModule), + typeof(AbpAspNetCoreMvcUiBasicThemeModule), + typeof(AbpCachingStackExchangeRedisModule) +)] +public class MyProjectNameHttpApiHostModule : AbpModule { - [DependsOn( - typeof(MyProjectNameHttpApiModule), - typeof(AbpProSharedHostingMicroserviceModule), - typeof(AbpAspNetCoreMvcUiMultiTenancyModule), - typeof(MyProjectNameEntityFrameworkCoreModule), - typeof(AbpAspNetCoreAuthenticationJwtBearerModule), - typeof(AbpAspNetCoreSerilogModule), - typeof(AbpAccountWebModule), - typeof(MyProjectNameApplicationModule), - typeof(AbpAspNetCoreMvcUiBasicThemeModule), - typeof(AbpCachingStackExchangeRedisModule) - )] - 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(); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + app.UseAbpRequestLocalization(); + app.UseCorrelationId(); + app.UseStaticFiles(); + app.UseMiniProfiler(); + app.UseRouting(); + app.UseCors(MyProjectNameHttpApiHostConst.DefaultCorsPolicyName); + app.UseAuthentication(); + + if (MultiTenancyConsts.IsEnabled) { - var configuration = context.Services.GetConfiguration(); - ConfigureCache(context); - ConfigureSwaggerServices(context); - ConfigureJwtAuthentication(context, configuration); - ConfigureMiniProfiler(context); - ConfigureIdentity(context); - ConfigureAuditLog(context); - ConfigurationSignalR(context); + app.UseMultiTenancy(); } - public override void OnApplicationInitialization(ApplicationInitializationContext context) + app.UseAuthorization(); + app.UseSwagger(); + app.UseAbpSwaggerUI(options => { - var app = context.GetApplicationBuilder(); - app.UseAbpRequestLocalization(); - app.UseCorrelationId(); - app.UseStaticFiles(); - app.UseMiniProfiler(); - app.UseRouting(); - app.UseCors(MyProjectNameHttpApiHostConst.DefaultCorsPolicyName); - app.UseAuthentication(); + options.SwaggerEndpoint("/swagger/MyProjectName/swagger.json", "MyProjectName API"); + options.DocExpansion(DocExpansion.None); + options.DefaultModelsExpandDepth(-1); + }); - if (MultiTenancyConsts.IsEnabled) - { - app.UseMultiTenancy(); - } + app.UseAuditing(); + app.UseAbpSerilogEnrichers(); - 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.UseAbpSerilogEnrichers(); - - app.UseUnitOfWork(); - app.UseConfiguredEndpoints(endpoints => { endpoints.MapHealthChecks("/health"); }); + app.UseUnitOfWork(); + app.UseConfiguredEndpoints(endpoints => { endpoints.MapHealthChecks("/health"); }); - } - private void ConfigurationSignalR(ServiceConfigurationContext context) - { - var redisConnection = context.Services.GetConfiguration()["Redis:Configuration"]; - - if (redisConnection.IsNullOrWhiteSpace()) - { - throw new UserFriendlyException(message: "Redis连接字符串未配置."); - } + } + private void ConfigurationSignalR(ServiceConfigurationContext context) + { + var redisConnection = context.Services.GetConfiguration()["Redis:Configuration"]; - context.Services.AddSignalR().AddStackExchangeRedis(redisConnection, options => { options.Configuration.ChannelPrefix = "Lion.AbpPro"; }); - } - /// - /// 配置MiniProfiler - /// - private void ConfigureMiniProfiler(ServiceConfigurationContext context) + if (redisConnection.IsNullOrWhiteSpace()) { - context.Services.AddMiniProfiler(options => options.RouteBasePath = "/profiler").AddEntityFramework(); + throw new UserFriendlyException(message: "Redis连接字符串未配置."); } - /// - /// 配置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"])) - }; + 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 + options.Events = new JwtBearerEvents + { + OnMessageReceived = currentContext => { - OnMessageReceived = currentContext => + var path = currentContext.HttpContext.Request.Path; + if (path.StartsWithSegments("/login")) { - var path = currentContext.HttpContext.Request.Path; - if (path.StartsWithSegments("/login")) - { - return Task.CompletedTask; - } + return Task.CompletedTask; + } - var accessToken = string.Empty; - if (currentContext.HttpContext.Request.Headers.ContainsKey("Authorization")) + var accessToken = string.Empty; + if (currentContext.HttpContext.Request.Headers.ContainsKey("Authorization")) + { + accessToken = currentContext.HttpContext.Request.Headers["Authorization"]; + if (!string.IsNullOrWhiteSpace(accessToken)) { - accessToken = currentContext.HttpContext.Request.Headers["Authorization"]; - if (!string.IsNullOrWhiteSpace(accessToken)) - { - accessToken = accessToken.Split(" ").LastOrDefault(); - } + accessToken = accessToken.Split(" ").LastOrDefault(); } + } - if (accessToken.IsNullOrWhiteSpace()) - { - accessToken = currentContext.Request.Query["access_token"].FirstOrDefault(); - } + if (accessToken.IsNullOrWhiteSpace()) + { + accessToken = currentContext.Request.Query["access_token"].FirstOrDefault(); + } - if (accessToken.IsNullOrWhiteSpace()) - { - accessToken = currentContext.Request.Cookies[MyProjectNameHttpApiHostConst.DefaultCookieName]; - } + if (accessToken.IsNullOrWhiteSpace()) + { + accessToken = currentContext.Request.Cookies[MyProjectNameHttpApiHostConst.DefaultCookieName]; + } - currentContext.Token = accessToken; - currentContext.Request.Headers.Remove("Authorization"); - currentContext.Request.Headers.Add("Authorization", $"Bearer {accessToken}"); + currentContext.Token = accessToken; + currentContext.Request.Headers.Remove("Authorization"); + currentContext.Request.Headers.Add("Authorization", $"Bearer {accessToken}"); - return Task.CompletedTask; - } - }; - }); - } + 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"); - } + /// + /// 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 }; }); - } + /// + /// 配置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 => + 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.MapType(() => new OpenApiSchema() { Type = "file" }); + options.IncludeXmlComments(xml, true); + } - 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.AddSecurityDefinition(JwtBearerDefaults.AuthenticationScheme, + new OpenApiSecurityScheme() { - 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 + Description = "直接在下框输入JWT生成的Token", + Name = "Authorization", + In = ParameterLocation.Header, + Type = SecuritySchemeType.Http, + Scheme = JwtBearerDefaults.AuthenticationScheme, + BearerFormat = "JWT" + }); + options.AddSecurityRequirement(new OpenApiSecurityRequirement + { { + new OpenApiSecurityScheme { - new OpenApiSecurityScheme + Reference = new OpenApiReference { - Reference = new OpenApiReference - { - Type = ReferenceType.SecurityScheme, Id = "Bearer" - } - }, - new List() - } - }); + 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.AddSecurityDefinition("ApiKey", new OpenApiSecurityScheme() + { + Type = SecuritySchemeType.ApiKey, + In = ParameterLocation.Header, + Name = "Accept-Language", + Description = "多语言设置,系统预设语言有zh-Hans、en,默认为zh-Hans", + }); - options.AddSecurityRequirement(new OpenApiSecurityRequirement + options.AddSecurityRequirement(new OpenApiSecurityRequirement + { { + new OpenApiSecurityScheme { - new OpenApiSecurityScheme - { - Reference = new OpenApiReference - { Type = ReferenceType.SecurityScheme, Id = "ApiKey" } - }, - Array.Empty() - } - }); + 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"; - } - ); + /// + /// 审计日志 + /// + 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"); - }); - } + 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; }); } } \ No newline at end of file