diff --git a/templates/module/aspnet-core/MyCompanyName.MyProjectName.sln b/templates/module/aspnet-core/MyCompanyName.MyProjectName.sln index f8a737dfdc..f23f8610d0 100644 --- a/templates/module/aspnet-core/MyCompanyName.MyProjectName.sln +++ b/templates/module/aspnet-core/MyCompanyName.MyProjectName.sln @@ -51,6 +51,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyCompanyName.MyProjectName EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyCompanyName.MyProjectName.Blazor", "src\MyCompanyName.MyProjectName.Blazor\MyCompanyName.MyProjectName.Blazor.csproj", "{827FCC18-A22B-4175-82CD-1233F6DEE8FB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyCompanyName.MyProjectName.Blazor.Host", "host\MyCompanyName.MyProjectName.Blazor.Host\MyCompanyName.MyProjectName.Blazor.Host.csproj", "{D7E0F672-F5E2-4338-AFF4-4E5091C55A62}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -141,6 +143,10 @@ Global {827FCC18-A22B-4175-82CD-1233F6DEE8FB}.Debug|Any CPU.Build.0 = Debug|Any CPU {827FCC18-A22B-4175-82CD-1233F6DEE8FB}.Release|Any CPU.ActiveCfg = Release|Any CPU {827FCC18-A22B-4175-82CD-1233F6DEE8FB}.Release|Any CPU.Build.0 = Release|Any CPU + {D7E0F672-F5E2-4338-AFF4-4E5091C55A62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D7E0F672-F5E2-4338-AFF4-4E5091C55A62}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D7E0F672-F5E2-4338-AFF4-4E5091C55A62}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D7E0F672-F5E2-4338-AFF4-4E5091C55A62}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -167,6 +173,7 @@ Global {F6AC8D4A-EDD7-4514-8E8A-5BCB019864DB} = {E400416D-2895-4512-9D17-90681EEC7E0A} {3D872C41-E226-45C8-89C1-9D3DBD7C73F2} = {E400416D-2895-4512-9D17-90681EEC7E0A} {827FCC18-A22B-4175-82CD-1233F6DEE8FB} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} + {D7E0F672-F5E2-4338-AFF4-4E5091C55A62} = {E400416D-2895-4512-9D17-90681EEC7E0A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4324B3B4-B60B-4E3C-91D8-59576B4E26DD} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj new file mode 100644 index 0000000000..7a9d717591 --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj @@ -0,0 +1,32 @@ + + + + + + netstandard2.1 + 3.0 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostAutoMapperProfile.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostAutoMapperProfile.cs new file mode 100644 index 0000000000..7135b52c32 --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostAutoMapperProfile.cs @@ -0,0 +1,12 @@ +using AutoMapper; + +namespace MyCompanyName.MyProjectName.Blazor.Host +{ + public class MyProjectNameBlazorHostAutoMapperProfile : Profile + { + public MyProjectNameBlazorHostAutoMapperProfile() + { + //Define your AutoMapper configuration here for the Blazor project. + } + } +} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostModule.cs new file mode 100644 index 0000000000..35de1c6673 --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostModule.cs @@ -0,0 +1,106 @@ +using System; +using System.Net.Http; +using Blazorise; +using Blazorise.Bootstrap; +using Blazorise.Icons.FontAwesome; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; +using Volo.Abp.Account.Blazor; +using Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme; +using Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.Themes.Basic; +using Volo.Abp.AspNetCore.Components.WebAssembly.Theming.Routing; +using Volo.Abp.Autofac.WebAssembly; +using Volo.Abp.AutoMapper; +using Volo.Abp.Identity.Blazor; +using Volo.Abp.Modularity; +using Volo.Abp.UI.Navigation; + +namespace MyCompanyName.MyProjectName.Blazor.Host +{ + [DependsOn( + typeof(AbpAutofacWebAssemblyModule), + typeof(AbpAspNetCoreComponentsWebAssemblyBasicThemeModule), + typeof(AbpIdentityBlazorModule), + typeof(AbpAccountBlazorModule), + typeof(MyProjectNameBlazorModule) + )] + public class MyProjectNameBlazorHostModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + var environment = context.Services.GetSingletonInstance(); + var builder = context.Services.GetSingletonInstance(); + + ConfigureAuthentication(builder); + ConfigureHttpClient(context, environment); + ConfigureBlazorise(context); + ConfigureRouter(context); + ConfigureUI(builder); + ConfigureMenu(context); + ConfigureAutoMapper(context); + } + + private void ConfigureRouter(ServiceConfigurationContext context) + { + Configure(options => + { + options.AppAssembly = typeof(MyProjectNameBlazorHostModule).Assembly; + }); + } + + private void ConfigureMenu(ServiceConfigurationContext context) + { + Configure(options => + { + options.MenuContributors.Add(new MyProjectNameHostMenuContributor()); + }); + } + + private void ConfigureBlazorise(ServiceConfigurationContext context) + { + context.Services + .AddBlazorise() + .AddBootstrapProviders() + .AddFontAwesomeIcons(); + } + + private static void ConfigureAuthentication(WebAssemblyHostBuilder builder) + { + builder.Services.AddOidcAuthentication(options => + { + builder.Configuration.Bind("AuthServer", options.ProviderOptions); + options.ProviderOptions.DefaultScopes.Add("MyProjectName"); + }); + } + + private static void ConfigureUI(WebAssemblyHostBuilder builder) + { + builder.RootComponents.Add("app"); + } + + private static void ConfigureHttpClient(ServiceConfigurationContext context, IWebAssemblyHostEnvironment environment) + { + context.Services.AddTransient(sp => new HttpClient + { + BaseAddress = new Uri(environment.BaseAddress) + }); + } + + private void ConfigureAutoMapper(ServiceConfigurationContext context) + { + Configure(options => + { + options.AddMaps(); + }); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + context.ServiceProvider + .UseBootstrapProviders() + .UseFontAwesomeIcons(); + } + } +} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameHostBrandingProvider.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameHostBrandingProvider.cs new file mode 100644 index 0000000000..13c921dea7 --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameHostBrandingProvider.cs @@ -0,0 +1,9 @@ +using Volo.Abp.Ui.Branding; + +namespace MyCompanyName.MyProjectName.Blazor.Host +{ + public class MyProjectNameHostBrandingProvider : DefaultBrandingProvider + { + public override string AppName => "MyProjectName"; + } +} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameHostMenuContributor.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameHostMenuContributor.cs new file mode 100644 index 0000000000..c7e04108b8 --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameHostMenuContributor.cs @@ -0,0 +1,31 @@ +using System.Threading.Tasks; +using MyCompanyName.MyProjectName.Localization; +using Volo.Abp.UI.Navigation; + +namespace MyCompanyName.MyProjectName.Blazor.Host +{ + public class MyProjectNameHostMenuContributor : IMenuContributor + { + public Task ConfigureMenuAsync(MenuConfigurationContext context) + { + if(context.Menu.DisplayName != StandardMenus.Main) + { + return Task.CompletedTask; + } + + var l = context.GetLocalizer(); + + context.Menu.Items.Insert( + 0, + new ApplicationMenuItem( + "MyProjectName.Home", + l["Menu:Home"], + "/", + icon: "fas fa-home" + ) + ); + + return Task.CompletedTask; + } + } +} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Pages/Index.razor b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Pages/Index.razor new file mode 100644 index 0000000000..66c4949ac9 --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Pages/Index.razor @@ -0,0 +1,60 @@ +@page "/" +@using Volo.Abp.Users +@using Volo.Abp.MultiTenancy +@using System.Security.Claims +@inject ICurrentUser CurrentUser +@inject ICurrentTenant CurrentTenant +@inject AuthenticationStateProvider AuthenticationStateProvider + +

Welcome to MyProjectName!

+ +@if (CurrentUser.IsAuthenticated) +{ +

Current User

+
    +
  • Id: @CurrentUser.Id
  • +
  • TenantId: @CurrentUser.TenantId
  • +
  • UserName: @CurrentUser.UserName
  • +
  • Name: @CurrentUser.Name
  • +
  • SurName: @CurrentUser.SurName
  • +
  • Email: @CurrentUser.Email
  • +
  • EmailVerified: @CurrentUser.EmailVerified
  • +
  • PhoneNumber: @CurrentUser.PhoneNumber
  • +
  • PhoneNumberVerified: @CurrentUser.PhoneNumberVerified
  • +
  • Roles: @CurrentUser.Roles.JoinAsString(", ")
  • +
+} + +@if (_claims != null) +{ +

Current Claims

+
    + @foreach (var claim in _claims) + { +
  • @claim.Type: @claim.Value
  • + } +
+} + +@if (CurrentTenant.IsAvailable) +{ +

Current Tenant

+
    +
  • Id: @CurrentTenant.Id
  • +
  • Name: @CurrentTenant.Name
  • +
+} + +@code +{ + private IEnumerable _claims; + + protected override async Task OnInitializedAsync() + { + var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); + if (authState.User.Identity.IsAuthenticated) + { + _claims = authState.User.Claims; + } + } +} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Program.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Program.cs new file mode 100644 index 0000000000..6712a8fc5e --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Program.cs @@ -0,0 +1,24 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; + +namespace MyCompanyName.MyProjectName.Blazor.Host +{ + public class Program + { + public static async Task Main(string[] args) + { + var builder = WebAssemblyHostBuilder.CreateDefault(args); + + var application = builder.AddApplication(options => + { + options.UseAutofac(); + }); + + var host = builder.Build(); + + await application.InitializeAsync(host.Services); + + await host.RunAsync(); + } + } +} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Properties/launchSettings.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Properties/launchSettings.json new file mode 100644 index 0000000000..9ef766441e --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Properties/launchSettings.json @@ -0,0 +1,29 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "https://localhost:44307", + "sslPort": 44307 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "MyCompanyName.MyProjectName.Blazor": { + "commandName": "Project", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:44307", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/_Imports.razor b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/_Imports.razor new file mode 100644 index 0000000000..b1ade9c628 --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/_Imports.razor @@ -0,0 +1,11 @@ +@using System.Net.Http +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.WebAssembly.Http +@using Microsoft.JSInterop +@using Volo.Abp.AspNetCore.Components.WebAssembly +@using MyCompanyName.MyProjectName.Blazor +@using Blazorise +@using Blazorise.DataGrid diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/appsettings.Development.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/appsettings.Development.json new file mode 100644 index 0000000000..0db3279e44 --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/appsettings.Development.json @@ -0,0 +1,3 @@ +{ + +} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/appsettings.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/appsettings.json new file mode 100644 index 0000000000..fdcb329db4 --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/appsettings.json @@ -0,0 +1,12 @@ +{ + "AuthServer": { + "Authority": "https://localhost:44301", + "ClientId": "MyProjectName_Blazor", + "ResponseType": "code" + }, + "RemoteServices": { + "Default": { + "BaseUrl": "https://localhost:44300" + } + } +} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/favicon.ico b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/favicon.ico new file mode 100644 index 0000000000..a3a799985c Binary files /dev/null and b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/favicon.ico differ diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/index.html b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/index.html new file mode 100644 index 0000000000..99ab025095 --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/index.html @@ -0,0 +1,39 @@ + + + + + + + MyCompanyName.MyProjectName.Blazor + + + + + + + + + + + + + Loading... + +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + + + + + + + + + + + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/main.css b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/main.css new file mode 100644 index 0000000000..23e0f7a249 --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/main.css @@ -0,0 +1,18 @@ +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + +#blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; +} \ No newline at end of file diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/appsettings.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/appsettings.json index ed2fa02f22..d05f571054 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/appsettings.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/appsettings.json @@ -1,6 +1,6 @@ { "App": { - "CorsOrigins": "https://*.MyProjectName.com,http://localhost:4200" + "CorsOrigins": "https://*.MyProjectName.com,http://localhost:4200,http://localhost:44307,https://localhost:44307" }, "ConnectionStrings": { "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName_Main;Trusted_Connection=True;MultipleActiveResultSets=true", diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/appsettings.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/appsettings.json index d3a8325f90..bee76cb9a1 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/appsettings.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/appsettings.json @@ -1,7 +1,7 @@ { "App": { "SelfUrl": "https://localhost:44301/", - "CorsOrigins": "https://*.MyProjectName.com,http://localhost:4200" + "CorsOrigins": "https://*.MyProjectName.com,http://localhost:4200,http://localhost:44307,https://localhost:44307" }, "AppSelfUrl": "https://localhost:44301/", "ConnectionStrings": { @@ -20,6 +20,10 @@ "ClientId": "MyProjectName_Web", "RootUrl": "https://localhost:44302/" }, + "MyProjectName_Blazor": { + "ClientId": "MyProjectName_Blazor", + "RootUrl": "https://localhost:44307/" + }, "MyProjectName_ConsoleTestApp": { "ClientId": "MyProjectName_ConsoleTestApp" } diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Properties/launchSettings.json b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Properties/launchSettings.json new file mode 100644 index 0000000000..3196608ce0 --- /dev/null +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:64779/", + "sslPort": 44326 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "MyCompanyName.MyProjectName.Web": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} \ No newline at end of file