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; |
using Lion.AbpPro.AspNetCore; |
||||
|
|
||||
namespace MyCompanyName.MyProjectName.MyModuleName |
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( |
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
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 |
|
||||
{ |
{ |
||||
private const string DefaultCorsPolicyName = "Default"; |
context.Services.AddAbpProSwagger("MyProjectName") |
||||
private const bool MultiTenancyIsEnabled = true; |
.AddAbpProRedis() |
||||
|
.AddAbpProCors() |
||||
public override void ConfigureServices(ServiceConfigurationContext context) |
.AddAbpProLocalization() |
||||
{ |
.AddAbpProExceptions() |
||||
ConfigureSwaggerServices(context); |
.AddAbpProHealthChecks() |
||||
ConfigureCache(context); |
.AddAbpProTenantResolvers() |
||||
ConfigureCors(context); |
.AddAbpProMultiTenancy() |
||||
ConfigureDB(); |
.AddAbpProAntiForgery() |
||||
ConfigureLocalization(); |
.AddAbpProVirtualFileSystem() |
||||
ConfigureVirtualFileSystem(context); |
.AddAbpProDbContext() |
||||
ConfigurationMultiTenancy(); |
.AddAlwaysAllowAuthorization(); |
||||
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()) |
public override void OnApplicationInitialization(ApplicationInitializationContext context) |
||||
{ |
{ |
||||
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); |
var app = context.GetApplicationBuilder(); |
||||
context.Services |
app.UseAbpProRequestLocalization(); |
||||
.AddDataProtection() |
app.UseCorrelationId(); |
||||
.PersistKeysToStackExchangeRedis(redis, "MyModuleName-Protection-Keys"); |
app.MapAbpStaticAssets(); |
||||
} |
app.UseRouting(); |
||||
} |
app.UseAbpProCors(); |
||||
|
app.UseAuthentication(); |
||||
private void ConfigureDB() |
app.UseAbpProMultiTenancy(); |
||||
{ |
app.UseAuthorization(); |
||||
Configure<AbpDbContextOptions>(options => { options.UseMySQL(builder => { builder.TranslateParameterizedCollectionsToConstants(); }); }); |
app.UseAbpProSwaggerUI("/swagger/MyProjectName/swagger.json", "MyProjectName"); |
||||
} |
app.UseAbpSerilogEnrichers(); |
||||
|
app.UseUnitOfWork(); |
||||
/// <summary>
|
app.UseConfiguredEndpoints(endpoints => { endpoints.MapHealthChecks("/health"); }); |
||||
///配置本地化
|
|
||||
/// </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>(); |
|
||||
}); |
|
||||
} |
|
||||
} |
} |
||||
} |
} |
||||
@ -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": { |
"App": { |
||||
"CorsOrigins": "https://*.MyModuleName.com,http://localhost:4200,http://localhost:44307,https://localhost:44307" |
"SelfUrl": "http://localhost:44315", |
||||
}, |
}, |
||||
"ConnectionStrings": { |
"ConnectionStrings": { |
||||
"Default": "Data Source=localhost;Database=MyCompanyNameMyProjectNameDB;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" |
||||
"MyModuleName": "Data Source=localhost;Database=MyModuleName;uid=root;pwd=mypassword;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" |
|
||||
}, |
}, |
||||
"Redis": { |
"Redis": { |
||||
"Configuration": "localhost,password=mypassword", |
"Configuration": "localhost:6379,password=1q2w3E*,defaultdatabase=2" |
||||
"DatabaseId": 1 |
}, |
||||
|
"Swagger": { |
||||
|
"Enabled": true |
||||
|
}, |
||||
|
"Cors": { |
||||
|
"Enabled": true, |
||||
|
"CorsOrigins": "http://localhost:4200,http://localhost:4201" |
||||
|
}, |
||||
|
"MultiTenancy": { |
||||
|
"Enabled": true |
||||
} |
} |
||||
} |
} |
||||
Loading…
Reference in new issue