5 changed files with 146 additions and 211 deletions
@ -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 |
|||
{ |
|||
/// <summary>
|
|||
/// 注册Redis缓存
|
|||
/// </summary>
|
|||
public static IServiceCollection AddAbpProRedis(this IServiceCollection service) |
|||
{ |
|||
service.Configure<AbpDistributedCacheOptions>(options => { options.KeyPrefix = "AbpPro:"; }); |
|||
var configuration = service.GetConfiguration(); |
|||
var redis = ConnectionMultiplexer.Connect(configuration.GetValue<string>("Redis:Configuration")); |
|||
service |
|||
.AddDataProtection() |
|||
.PersistKeysToStackExchangeRedis(redis, "AbpPro-Protection-Keys"); |
|||
return service; |
|||
} |
|||
/// <summary>
|
|||
/// 配置虚拟文件系统
|
|||
/// </summary>
|
|||
public static IServiceCollection AddAbpProVirtualFileSystem(this IServiceCollection service) |
|||
{ |
|||
service.Configure<AbpVirtualFileSystemOptions>(options => |
|||
{ |
|||
options.FileSets.AddEmbedded<MyModuleNameHttpApiHostModule>(); |
|||
}); |
|||
return service; |
|||
} |
|||
|
|||
public static IServiceCollection AddAbpProDbContext(this IServiceCollection service) |
|||
{ |
|||
service.Configure<AbpDbContextOptions>(options => { options.UseMySQL(builder => { builder.TranslateParameterizedCollectionsToConstants(); }); }); |
|||
return service; |
|||
} |
|||
|
|||
|
|||
} |
|||
@ -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<AbpMultiTenancyOptions>(options => { options.IsEnabled = MultiTenancyIsEnabled; }); |
|||
} |
|||
/// <summary>
|
|||
/// 配置跨域
|
|||
/// </summary>
|
|||
/// <param name="context"></param>
|
|||
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(); |
|||
}); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 配置SwaggerUI
|
|||
/// </summary>
|
|||
/// <param name="context"></param>
|
|||
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<string>() |
|||
} |
|||
}); |
|||
|
|||
#endregion
|
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Redis缓存
|
|||
/// </summary>
|
|||
/// <param name="context"></param>
|
|||
private void ConfigureCache(ServiceConfigurationContext context) |
|||
{ |
|||
var hostingEnvironment = context.Services.GetHostingEnvironment(); |
|||
var configuration = context.Services.GetConfiguration(); |
|||
Configure<AbpDistributedCacheOptions>(options => { options.KeyPrefix = "MyModuleName:"; }); |
|||
|
|||
if (!hostingEnvironment.IsDevelopment()) |
|||
{ |
|||
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); |
|||
context.Services |
|||
.AddDataProtection() |
|||
.PersistKeysToStackExchangeRedis(redis, "MyModuleName-Protection-Keys"); |
|||
} |
|||
} |
|||
|
|||
private void ConfigureDB() |
|||
{ |
|||
Configure<AbpDbContextOptions>(options => { options.UseMySQL(builder => { builder.TranslateParameterizedCollectionsToConstants(); }); }); |
|||
} |
|||
context.Services.AddAbpProSwagger("MyProjectName") |
|||
.AddAbpProRedis() |
|||
.AddAbpProCors() |
|||
.AddAbpProLocalization() |
|||
.AddAbpProExceptions() |
|||
.AddAbpProHealthChecks() |
|||
.AddAbpProTenantResolvers() |
|||
.AddAbpProMultiTenancy() |
|||
.AddAbpProAntiForgery() |
|||
.AddAbpProVirtualFileSystem() |
|||
.AddAbpProDbContext() |
|||
.AddAlwaysAllowAuthorization(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
///配置本地化
|
|||
/// </summary>
|
|||
private void ConfigureLocalization() |
|||
{ |
|||
Configure<AbpLocalizationOptions>(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", "繁體中文")); |
|||
}); |
|||
} |
|||
/// <summary>
|
|||
/// 配置虚拟文件系统
|
|||
/// </summary>
|
|||
/// <param name="context"></param>
|
|||
private void ConfigureVirtualFileSystem(ServiceConfigurationContext context) |
|||
{ |
|||
Configure<AbpVirtualFileSystemOptions>(options => |
|||
{ |
|||
options.FileSets.AddEmbedded<MyModuleNameHttpApiHostModule>(); |
|||
}); |
|||
} |
|||
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"); }); |
|||
} |
|||
} |
|||
@ -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 |
|||
} |
|||
} |
|||
Loading…
Reference in new issue