From 89da4554299c17d03c651d74392719adb2c9800d Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 10 Dec 2021 09:00:03 +0800 Subject: [PATCH] Update MyProjectNameBlazorModule.cs --- .../MyProjectNameBlazorModule.cs | 272 +++++++++++++++--- 1 file changed, 228 insertions(+), 44 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs index a429bc61f2..39c3601722 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs @@ -1,65 +1,211 @@ using System; +using System.IO; using System.Net.Http; using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; -using IdentityModel; -using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using MyCompanyName.MyProjectName.Blazor.Menus; -using Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic; +using Microsoft.Extensions.Hosting; +using Microsoft.OpenApi.Models; +using MyCompanyName.MyProjectName.Blazor.Server.Menus; +using MyCompanyName.MyProjectName.EntityFrameworkCore; +using MyCompanyName.MyProjectName.Localization; +using MyCompanyName.MyProjectName.MultiTenancy; +using Volo.Abp; +using Volo.Abp.Account.Web; +using Volo.Abp.AspNetCore.Authentication.JwtBearer; +using Volo.Abp.AspNetCore.Components.Server.BasicTheme; +using Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling; using Volo.Abp.AspNetCore.Components.Web.Theming.Routing; -using Volo.Abp.Autofac.WebAssembly; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.Localization; +using Volo.Abp.AspNetCore.Mvc.UI; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.AspNetCore.Serilog; +using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; +using Volo.Abp.Identity.Blazor.Server; +using Volo.Abp.Localization; using Volo.Abp.Modularity; +using Volo.Abp.SettingManagement.Blazor.Server; +using Volo.Abp.Swashbuckle; +using Volo.Abp.TenantManagement.Blazor.Server; +using Volo.Abp.UI; using Volo.Abp.UI.Navigation; -using Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme; -using Volo.Abp.Identity.Blazor.WebAssembly; -using Volo.Abp.SettingManagement.Blazor.WebAssembly; -using Volo.Abp.TenantManagement.Blazor.WebAssembly; +using Volo.Abp.UI.Navigation.Urls; +using Volo.Abp.VirtualFileSystem; -namespace MyCompanyName.MyProjectName.Blazor; +namespace MyCompanyName.MyProjectName.Blazor.Server; [DependsOn( - typeof(AbpAutofacWebAssemblyModule), - typeof(MyProjectNameHttpApiClientModule), - typeof(AbpAspNetCoreComponentsWebAssemblyBasicThemeModule), - typeof(AbpIdentityBlazorWebAssemblyModule), - typeof(AbpTenantManagementBlazorWebAssemblyModule), - typeof(AbpSettingManagementBlazorWebAssemblyModule) -)] + typeof(MyProjectNameApplicationModule), + typeof(MyProjectNameEntityFrameworkCoreModule), + typeof(MyProjectNameHttpApiModule), + typeof(AbpAspNetCoreMvcUiBasicThemeModule), + typeof(AbpAutofacModule), + typeof(AbpSwashbuckleModule), + typeof(AbpAspNetCoreAuthenticationJwtBearerModule), + typeof(AbpAspNetCoreSerilogModule), + typeof(AbpAccountWebIdentityServerModule), + typeof(AbpAspNetCoreComponentsServerBasicThemeModule), + typeof(AbpIdentityBlazorServerModule), + typeof(AbpTenantManagementBlazorServerModule), + typeof(AbpSettingManagementBlazorServerModule) + )] public class MyProjectNameBlazorModule : AbpModule { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + context.Services.PreConfigure(options => + { + options.AddAssemblyResource( + typeof(MyProjectNameResource), + typeof(MyProjectNameDomainModule).Assembly, + typeof(MyProjectNameDomainSharedModule).Assembly, + typeof(MyProjectNameApplicationModule).Assembly, + typeof(MyProjectNameApplicationContractsModule).Assembly, + typeof(MyProjectNameBlazorModule).Assembly + ); + }); + } + public override void ConfigureServices(ServiceConfigurationContext context) { - var environment = context.Services.GetSingletonInstance(); - var builder = context.Services.GetSingletonInstance(); + var hostingEnvironment = context.Services.GetHostingEnvironment(); + var configuration = context.Services.GetConfiguration(); - ConfigureAuthentication(builder); - ConfigureHttpClient(context, environment); + ConfigureUrls(configuration); + ConfigureBundles(); + ConfigureAuthentication(context, configuration); + ConfigureAutoMapper(); + ConfigureVirtualFileSystem(hostingEnvironment); + ConfigureLocalizationServices(); + ConfigureSwaggerServices(context.Services); + ConfigureAutoApiControllers(); ConfigureBlazorise(context); ConfigureRouter(context); - ConfigureUI(builder); ConfigureMenu(context); - ConfigureAutoMapper(context); } - private void ConfigureRouter(ServiceConfigurationContext context) + private void ConfigureUrls(IConfiguration configuration) { - Configure(options => + Configure(options => { - options.AppAssembly = typeof(MyProjectNameBlazorModule).Assembly; + options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; + options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"].Split(',')); }); } - private void ConfigureMenu(ServiceConfigurationContext context) + private void ConfigureBundles() { - Configure(options => + Configure(options => + { + // MVC UI + options.StyleBundles.Configure( + BasicThemeBundles.Styles.Global, + bundle => + { + bundle.AddFiles("/global-styles.css"); + } + ); + + //BLAZOR UI + options.StyleBundles.Configure( + BlazorBasicThemeBundles.Styles.Global, + bundle => + { + bundle.AddFiles("/blazor-global-styles.css"); + //You can remove the following line if you don't use Blazor CSS isolation for components + bundle.AddFiles("/MyCompanyName.MyProjectName.Blazor.Server.styles.css"); + } + ); + }); + } + + private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration) + { + context.Services.AddAuthentication() + .AddJwtBearer(options => + { + options.Authority = configuration["AuthServer:Authority"]; + options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); + options.Audience = "MyProjectName"; + }); + } + + private void ConfigureVirtualFileSystem(IWebHostEnvironment hostingEnvironment) + { + if (hostingEnvironment.IsDevelopment()) + { + Configure(options => + { + // + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.UI", Path.DirectorySeparatorChar))); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI", Path.DirectorySeparatorChar))); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.Bootstrap", Path.DirectorySeparatorChar))); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared", Path.DirectorySeparatorChar))); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}basic-theme{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", Path.DirectorySeparatorChar))); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy", Path.DirectorySeparatorChar))); + //options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}permission-management{0}src{0}Volo.Abp.PermissionManagement.Web", Path.DirectorySeparatorChar))); + //options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}feature-management{0}src{0}Volo.Abp.FeatureManagement.Web", Path.DirectorySeparatorChar))); + //options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}identity{0}src{0}Volo.Abp.Identity.Web", Path.DirectorySeparatorChar))); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}account{0}src{0}Volo.Abp.Account.Web", Path.DirectorySeparatorChar))); + //options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}tenant-management{0}src{0}Volo.Abp.TenantManagement.Web", Path.DirectorySeparatorChar))); + // + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}MyCompanyName.MyProjectName.Domain.Shared")); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}MyCompanyName.MyProjectName.Domain")); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}MyCompanyName.MyProjectName.Application.Contracts")); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}MyCompanyName.MyProjectName.Application")); + options.FileSets.ReplaceEmbeddedByPhysical(hostingEnvironment.ContentRootPath); + }); + } + } + + private void ConfigureLocalizationServices() + { + Configure(options => { - options.MenuContributors.Add(new MyProjectNameMenuContributor(context.Services.GetConfiguration())); + options.Languages.Add(new LanguageInfo("ar", "ar", "العربية")); + 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("hu", "hu", "Magyar")); + options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish")); + options.Languages.Add(new LanguageInfo("fr", "fr", "Français")); + options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in")); + options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is")); + options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it")); + options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português")); + options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română")); + options.Languages.Add(new LanguageInfo("ru", "ru", "Русский")); + options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak")); + 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", "繁體中文")); + options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch", "de")); + options.Languages.Add(new LanguageInfo("es", "es", "Español")); }); } + private void ConfigureSwaggerServices(IServiceCollection services) + { + services.AddAbpSwaggerGen( + options => + { + options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" }); + options.DocInclusionPredicate((docName, description) => true); + options.CustomSchemaIds(type => type.FullName); + } + ); + } + private void ConfigureBlazorise(ServiceConfigurationContext context) { context.Services @@ -67,37 +213,75 @@ public class MyProjectNameBlazorModule : AbpModule .AddFontAwesomeIcons(); } - private static void ConfigureAuthentication(WebAssemblyHostBuilder builder) + private void ConfigureMenu(ServiceConfigurationContext context) { - builder.Services.AddOidcAuthentication(options => + Configure(options => { - builder.Configuration.Bind("AuthServer", options.ProviderOptions); - options.UserOptions.RoleClaim = JwtClaimTypes.Role; - options.ProviderOptions.DefaultScopes.Add("MyProjectName"); - options.ProviderOptions.DefaultScopes.Add("role"); - options.ProviderOptions.DefaultScopes.Add("email"); - options.ProviderOptions.DefaultScopes.Add("phone"); + options.MenuContributors.Add(new MyProjectNameMenuContributor()); }); } - private static void ConfigureUI(WebAssemblyHostBuilder builder) + private void ConfigureRouter(ServiceConfigurationContext context) { - builder.RootComponents.Add("#ApplicationContainer"); + Configure(options => + { + options.AppAssembly = typeof(MyProjectNameBlazorModule).Assembly; + }); } - private static void ConfigureHttpClient(ServiceConfigurationContext context, IWebAssemblyHostEnvironment environment) + private void ConfigureAutoApiControllers() { - context.Services.AddTransient(sp => new HttpClient + Configure(options => { - BaseAddress = new Uri(environment.BaseAddress) + options.ConventionalControllers.Create(typeof(MyProjectNameApplicationModule).Assembly); }); } - private void ConfigureAutoMapper(ServiceConfigurationContext context) + private void ConfigureAutoMapper() { Configure(options => { options.AddMaps(); }); } -} \ No newline at end of file + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var env = context.GetEnvironment(); + var app = context.GetApplicationBuilder(); + + app.UseAbpRequestLocalization(); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseExceptionHandler("/Error"); + app.UseHsts(); + } + + app.UseHttpsRedirection(); + app.UseCorrelationId(); + app.UseStaticFiles(); + app.UseRouting(); + app.UseAuthentication(); + app.UseJwtTokenMiddleware(); + + if (MultiTenancyConsts.IsEnabled) + { + app.UseMultiTenancy(); + } + + app.UseUnitOfWork(); + app.UseIdentityServer(); + app.UseAuthorization(); + app.UseSwagger(); + app.UseAbpSwaggerUI(options => + { + options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API"); + }); + app.UseConfiguredEndpoints(); + } +}