From 71d4fba3235aded71624889e931f833a647754fe Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sat, 20 Jul 2024 11:41:51 +0800 Subject: [PATCH] Support Blazor web app --- .../BlazorServerComponentBundleManager.cs | 28 ++++++++++ .../Bundling/AbpScripts.razor | 56 +++++++++++++++++++ .../Bundling/AbpStyles.razor | 56 +++++++++++++++++++ .../Bundling/IComponentBundleManager.cs | 11 ++++ .../AntDesignTheme/RedirectToLogin.razor | 10 +--- ...mponentsWebAssemblyAntDesignThemeModule.cs | 11 ++++ .../AuthenticationOptions.cs | 8 +++ .../WebAssemblyComponentBundleManager.cs | 19 +++++++ .../Themes/AntDesignTheme/LoginDisplay.razor | 3 +- .../AntDesignTheme/LoginDisplay.razor.cs | 6 +- .../WebAssemblyRedirectToLogin.razor | 27 +++++++++ 11 files changed, 224 insertions(+), 11 deletions(-) create mode 100644 modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorServerComponentBundleManager.cs create mode 100644 modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/AbpScripts.razor create mode 100644 modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/AbpStyles.razor create mode 100644 modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/IComponentBundleManager.cs create mode 100644 modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AuthenticationOptions.cs create mode 100644 modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Bundling/WebAssemblyComponentBundleManager.cs create mode 100644 modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/WebAssemblyRedirectToLogin.razor diff --git a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorServerComponentBundleManager.cs b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorServerComponentBundleManager.cs new file mode 100644 index 0000000..684e3c0 --- /dev/null +++ b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorServerComponentBundleManager.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.DependencyInjection; + +namespace Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.Bundling; + +public class BlazorServerComponentBundleManager : IComponentBundleManager, ITransientDependency +{ + protected IBundleManager BundleManager { get; } + + public BlazorServerComponentBundleManager(IBundleManager bundleManager) + { + BundleManager = bundleManager; + } + + public virtual async Task> GetStyleBundleFilesAsync(string bundleName) + { + return (await BundleManager.GetStyleBundleFilesAsync(bundleName)).Select(f => f.FileName).ToList(); + } + + public virtual async Task> GetScriptBundleFilesAsync(string bundleName) + { + return (await BundleManager.GetScriptBundleFilesAsync(bundleName)).Select(f => f.FileName).ToList(); + } +} diff --git a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/AbpScripts.razor b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/AbpScripts.razor new file mode 100644 index 0000000..91f9205 --- /dev/null +++ b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/AbpScripts.razor @@ -0,0 +1,56 @@ +@using Volo.Abp +@implements IDisposable +@inject IComponentBundleManager BundleManager +@inject PersistentComponentState PersistentComponentState + +@if (ScriptFiles != null) +{ + foreach (var file in ScriptFiles) + { + + } +} + +@code { + [Parameter] + public List? WebAssemblyScriptFiles { get; set; } + + [Parameter] + public string? BundleName { get; set; } + + private List? ScriptFiles { get; set; } + + private PersistingComponentStateSubscription persistingSubscription; + + protected override async Task OnInitializedAsync() + { + if (BundleName == null) + { + throw new AbpException("The BundleName parameter of the AbpScripts component can not be null!"); + } + + persistingSubscription = PersistentComponentState.RegisterOnPersisting(PersistScriptFiles); + + if (PersistentComponentState.TryTakeFromJson>(nameof(ScriptFiles), out var restoredStyleFiles)) + { + ScriptFiles = restoredStyleFiles; + } + else + { + ScriptFiles = (await BundleManager.GetScriptBundleFilesAsync(BundleName!)).ToList(); + } + + if (WebAssemblyScriptFiles != null) + { + ScriptFiles?.AddRange(WebAssemblyScriptFiles); + } + } + + private Task PersistScriptFiles() + { + PersistentComponentState.PersistAsJson(nameof(ScriptFiles), ScriptFiles); + return Task.CompletedTask; + } + + public void Dispose() => persistingSubscription.Dispose(); +} \ No newline at end of file diff --git a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/AbpStyles.razor b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/AbpStyles.razor new file mode 100644 index 0000000..cf2edbf --- /dev/null +++ b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/AbpStyles.razor @@ -0,0 +1,56 @@ +@using Volo.Abp +@implements IDisposable +@inject IComponentBundleManager BundleManager +@inject PersistentComponentState PersistentComponentState + +@if (StyleFiles != null) +{ + foreach (var file in StyleFiles) + { + + } +} + +@code { + [Parameter] + public List? WebAssemblyStyleFiles { get; set; } + + [Parameter] + public string? BundleName { get; set; } + + private List? StyleFiles { get; set; } + + private PersistingComponentStateSubscription persistingSubscription; + + protected override async Task OnInitializedAsync() + { + if (BundleName == null) + { + throw new AbpException("The BundleName parameter of the AbpStyles component can not be null!"); + } + + persistingSubscription = PersistentComponentState.RegisterOnPersisting(PersistStyleFiles); + + if (PersistentComponentState.TryTakeFromJson>(nameof(StyleFiles), out var restoredStyleFiles)) + { + StyleFiles = restoredStyleFiles; + } + else + { + StyleFiles = (await BundleManager.GetStyleBundleFilesAsync(BundleName!)).ToList(); + } + + if (OperatingSystem.IsBrowser() && WebAssemblyStyleFiles != null) + { + StyleFiles?.AddRange(WebAssemblyStyleFiles); + } + } + + private Task PersistStyleFiles() + { + PersistentComponentState.PersistAsJson(nameof(StyleFiles), StyleFiles); + return Task.CompletedTask; + } + + public void Dispose() => persistingSubscription.Dispose(); +} \ No newline at end of file diff --git a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/IComponentBundleManager.cs b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/IComponentBundleManager.cs new file mode 100644 index 0000000..da6fee7 --- /dev/null +++ b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/IComponentBundleManager.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Bundling; + +public interface IComponentBundleManager +{ + Task> GetStyleBundleFilesAsync(string bundleName); + + Task> GetScriptBundleFilesAsync(string bundleName); +} diff --git a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/RedirectToLogin.razor b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/RedirectToLogin.razor index 54926f1..f58d975 100644 --- a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/RedirectToLogin.razor +++ b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/RedirectToLogin.razor @@ -1,16 +1,8 @@ @inject NavigationManager Navigation -@inject IJSRuntime JSRuntime @code { protected override void OnInitialized() { - if (JSRuntime is IJSInProcessRuntime) - { - Navigation.NavigateTo($"authentication/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}"); - } - else - { - Navigation.NavigateTo($"account/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}", true); - } + Navigation.NavigateTo($"account/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}", true); } } diff --git a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule.cs b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule.cs index 980efa0..ed6974a 100644 --- a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule.cs +++ b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule.cs @@ -1,6 +1,8 @@ using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme; using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Routing; using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Toolbars; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AspNetCore.Components.Web; using Volo.Abp.AspNetCore.Components.WebAssembly; using Volo.Abp.Http.Client.IdentityModel.WebAssembly; using Volo.Abp.Modularity; @@ -25,5 +27,14 @@ public class AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule : AbpModule { options.Contributors.Add(new AntDesignThemeToolbarContributor()); }); + + if (context.Services.ExecutePreConfiguredActions().IsBlazorWebApp) + { + Configure(options => + { + options.LoginUrl = "Account/Login"; + options.LogoutUrl = "Account/Logout"; + }); + } } } diff --git a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AuthenticationOptions.cs b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AuthenticationOptions.cs new file mode 100644 index 0000000..00f7018 --- /dev/null +++ b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AuthenticationOptions.cs @@ -0,0 +1,8 @@ +namespace Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme; + +public class AuthenticationOptions +{ + public string LoginUrl { get; set; } = "authentication/login"; + + public string LogoutUrl { get; set; } = "authentication/logout"; +} diff --git a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Bundling/WebAssemblyComponentBundleManager.cs b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Bundling/WebAssemblyComponentBundleManager.cs new file mode 100644 index 0000000..eafcf72 --- /dev/null +++ b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Bundling/WebAssemblyComponentBundleManager.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Bundling; +using Volo.Abp.DependencyInjection; + +namespace Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling; + +public class WebAssemblyComponentBundleManager : IComponentBundleManager, ITransientDependency +{ + public virtual Task> GetStyleBundleFilesAsync(string bundleName) + { + return Task.FromResult>(new List()); + } + + public virtual Task> GetScriptBundleFilesAsync(string bundleName) + { + return Task.FromResult>(new List()); + } +} diff --git a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/LoginDisplay.razor b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/LoginDisplay.razor index f700156..5403e17 100644 --- a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/LoginDisplay.razor +++ b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/LoginDisplay.razor @@ -1,6 +1,7 @@ @using global::Localization.Resources.AbpUi @using Microsoft.Extensions.Localization @using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.Extensions.Options @using Microsoft.JSInterop @inherits Volo.Abp.AspNetCore.Components.AbpComponentBase @inject IJSRuntime JsRuntime @@ -41,6 +42,6 @@ - @UiLocalizer["Login"] + @UiLocalizer["Login"] diff --git a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/LoginDisplay.razor.cs b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/LoginDisplay.razor.cs index 922f631..c93b925 100644 --- a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/LoginDisplay.razor.cs +++ b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/LoginDisplay.razor.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Routing; using Microsoft.AspNetCore.Components.WebAssembly.Authentication; +using Microsoft.Extensions.Options; using Microsoft.JSInterop; using Volo.Abp.AspNetCore.Components.Web.Security; using Volo.Abp.UI.Navigation; @@ -16,6 +17,9 @@ public partial class LoginDisplay : IDisposable [Inject] protected ApplicationConfigurationChangedService ApplicationConfigurationChangedService { get; set; } + + [Inject] + protected IOptions AuthenticationOptions { get; set; } protected ApplicationMenu Menu { get; set; } @@ -59,6 +63,6 @@ public partial class LoginDisplay : IDisposable private void BeginSignOut() { - Navigation.NavigateToLogout("authentication/logout"); + Navigation.NavigateToLogout(AuthenticationOptions.Value.LogoutUrl); } } diff --git a/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/WebAssemblyRedirectToLogin.razor b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/WebAssemblyRedirectToLogin.razor new file mode 100644 index 0000000..f38804a --- /dev/null +++ b/modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/WebAssemblyRedirectToLogin.razor @@ -0,0 +1,27 @@ +@inject NavigationManager Navigation +@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesignTheme +@using Microsoft.Extensions.Options +@inject IOptions AuthenticationOptions +@inject IOptions AbpAspNetCoreComponentsWebOptions +@using Volo.Abp.DependencyInjection +@using Microsoft.AspNetCore.Components.WebAssembly.Authentication +@using Volo.Abp.AspNetCore.Components.Web +@inherits RedirectToLogin +@attribute [ExposeServices(typeof(RedirectToLogin))] +@attribute [Dependency(ReplaceServices = true)] + +@code { + + protected override void OnInitialized() + { + if (AbpAspNetCoreComponentsWebOptions.Value.IsBlazorWebApp) + { + Navigation.NavigateTo(AuthenticationOptions.Value.LogoutUrl, forceLoad: true); + } + else + { + Navigation.NavigateToLogin(AuthenticationOptions.Value.LoginUrl); + } + } + +} \ No newline at end of file