433 changed files with 6803 additions and 69522 deletions
Binary file not shown.
@ -0,0 +1,10 @@ |
|||
@using Microsoft.Extensions.Options |
|||
@inject IOptions<AbpDynamicLayoutComponentOptions> AbpDynamicLayoutComponentOptions |
|||
|
|||
@if (AbpDynamicLayoutComponentOptions.Value.Components.Any()) |
|||
{ |
|||
foreach (var (componentType, parameters) in AbpDynamicLayoutComponentOptions.Value.Components) |
|||
{ |
|||
<DynamicComponent Type="@componentType" Parameters="@parameters" /> |
|||
} |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
@if (LayoutHookViewModel.Hooks.Any()) |
|||
{ |
|||
foreach (var hook in LayoutHookViewModel.Hooks) |
|||
{ |
|||
<DynamicComponent Type="@hook.ComponentType" /> |
|||
} |
|||
} |
|||
@ -0,0 +1,43 @@ |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.AspNetCore.Components; |
|||
using Microsoft.Extensions.Options; |
|||
using Volo.Abp.Ui.LayoutHooks; |
|||
|
|||
namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Components; |
|||
|
|||
public partial class LayoutHook : ComponentBase |
|||
{ |
|||
[Parameter] |
|||
public string Name { get; set; } = default!; |
|||
|
|||
[Parameter] |
|||
public string? Layout { get; set; } |
|||
|
|||
[Inject] |
|||
protected IOptions<AbpLayoutHookOptions> LayoutHookOptions { get; set; } = default!; |
|||
|
|||
protected LayoutHookViewModel LayoutHookViewModel { get; private set; } = default!; |
|||
|
|||
protected override Task OnInitializedAsync() |
|||
{ |
|||
if (LayoutHookOptions.Value.Hooks.TryGetValue(Name, out var layoutHooks)) |
|||
{ |
|||
layoutHooks = layoutHooks |
|||
.Where(x => IsComponentBase(x) && (string.IsNullOrWhiteSpace(x.Layout) || x.Layout == Layout)) |
|||
.ToList(); |
|||
} |
|||
|
|||
layoutHooks ??= new List<LayoutHookInfo>(); |
|||
|
|||
LayoutHookViewModel = new LayoutHookViewModel(layoutHooks.ToArray(), Layout); |
|||
|
|||
return Task.CompletedTask; |
|||
} |
|||
|
|||
protected virtual bool IsComponentBase(LayoutHookInfo layoutHook) |
|||
{ |
|||
return typeof(ComponentBase).IsAssignableFrom(layoutHook.ComponentType); |
|||
} |
|||
} |
|||
Binary file not shown.
@ -1,5 +0,0 @@ |
|||
{ |
|||
"singleQuote": true, |
|||
"useTabs": false, |
|||
"tabWidth": 4 |
|||
} |
|||
@ -1,16 +0,0 @@ |
|||
<Project> |
|||
<PropertyGroup> |
|||
<LangVersion>latest</LangVersion> |
|||
<Version>1.0.0</Version> |
|||
<NoWarn>$(NoWarn);CS1591</NoWarn> |
|||
<AbpProjectType>app</AbpProjectType> |
|||
<!--<VoloAbpPackageVersion>8.3.0</VoloAbpPackageVersion>--> |
|||
</PropertyGroup> |
|||
|
|||
<Target Name="NoWarnOnRazorViewImportedTypeConflicts" BeforeTargets="RazorCoreCompile"> |
|||
<PropertyGroup> |
|||
<NoWarn>$(NoWarn);0436</NoWarn> |
|||
</PropertyGroup> |
|||
</Target> |
|||
|
|||
</Project> |
|||
@ -1,38 +0,0 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly"> |
|||
|
|||
<Import Project="..\..\common.props" /> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net9.0</TargetFramework> |
|||
<BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<!-- <PackageReference Include="Blazorise.Bootstrap5" Version="0.9.5.4" />--> |
|||
<!-- <PackageReference Include="Blazorise.Icons.FontAwesome" Version="0.9.5.4" />--> |
|||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" /> |
|||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" /> |
|||
<PackageReference Include="Volo.Abp.AutoMapper" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Volo.Abp.Autofac.WebAssembly" /> |
|||
<!-- <PackageReference Include="Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme" Version="8.0.0" />--> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<!-- <PackageReference Include="Volo.Abp.Identity.Blazor.WebAssembly" Version="8.0.0" />--> |
|||
<!-- <PackageReference Include="Volo.Abp.TenantManagement.Blazor.WebAssembly" Version="8.0.0" />--> |
|||
<!-- <PackageReference Include="Volo.Abp.SettingManagement.Blazor.WebAssembly" Version="8.0.0" />--> |
|||
|
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\..\modules\IdentityManagement\Lsw.Abp.IdentityManagement.Blazor.WebAssembly.AntDesignUI\Lsw.Abp.IdentityManagement.Blazor.WebAssembly.AntDesignUI.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\AntDesignTheme\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\SettingManagement\Lsw.Abp.SettingManagement.Blazor.WebAssembly.AntDesignUI\Lsw.Abp.SettingManagement.Blazor.WebAssembly.AntDesignUI.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\TenantManagement\Lsw.Abp.TenantManagement.Blazor.WebAssembly.AntDesignUI\Lsw.Abp.TenantManagement.Blazor.WebAssembly.AntDesignUI.csproj" /> |
|||
<ProjectReference Include="..\..\src\BookStore.HttpApi.Client\BookStore.HttpApi.Client.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -1,89 +0,0 @@ |
|||
using System; |
|||
using System.Net.Http; |
|||
using IdentityModel; |
|||
using Microsoft.AspNetCore.Components.WebAssembly.Hosting; |
|||
using Microsoft.Extensions.Configuration; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using BookStore.Blazor.Menus; |
|||
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Routing; |
|||
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesignTheme; |
|||
using Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme; |
|||
using Lsw.Abp.IdentityManagement.Blazor.WebAssembly.AntDesignUI; |
|||
using Lsw.Abp.TenantManagement.Blazor.WebAssembly.AntDesignUI; |
|||
using Volo.Abp.Autofac.WebAssembly; |
|||
using Volo.Abp.AutoMapper; |
|||
using Volo.Abp.Modularity; |
|||
using Lsw.Abp.SettingManagement.Blazor.WebAssembly.AntDesignUI; |
|||
using Volo.Abp.UI.Navigation; |
|||
|
|||
namespace BookStore.Blazor; |
|||
|
|||
[DependsOn( |
|||
typeof(AbpAutofacWebAssemblyModule), |
|||
typeof(BookStoreHttpApiClientModule), |
|||
typeof(AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule), |
|||
typeof(AbpAutoMapperModule), |
|||
typeof(AbpIdentityBlazorWebAssemblyAntDesignModule), |
|||
typeof(AbpTenantManagementBlazorWebAssemblyAntDesignModule), |
|||
typeof(AbpSettingManagementBlazorWebAssemblyAntDesignModule) |
|||
)] |
|||
public class BookStoreBlazorModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
var environment = context.Services.GetSingletonInstance<IWebAssemblyHostEnvironment>(); |
|||
var builder = context.Services.GetSingletonInstance<WebAssemblyHostBuilder>(); |
|||
|
|||
ConfigureAuthentication(builder); |
|||
ConfigureHttpClient(context, environment); |
|||
ConfigureRouter(context); |
|||
ConfigureUI(builder); |
|||
ConfigureMenu(context); |
|||
ConfigureAutoMapper(context); |
|||
} |
|||
|
|||
private void ConfigureRouter(ServiceConfigurationContext context) |
|||
{ |
|||
Configure<AbpRouterOptions>(options => { options.AppAssembly = typeof(BookStoreBlazorModule).Assembly; }); |
|||
} |
|||
|
|||
private void ConfigureMenu(ServiceConfigurationContext context) |
|||
{ |
|||
Configure<AbpNavigationOptions>(options => |
|||
{ |
|||
options.MenuContributors.Add(new BookStoreMenuContributor(context.Services.GetConfiguration())); |
|||
}); |
|||
} |
|||
|
|||
private static void ConfigureAuthentication(WebAssemblyHostBuilder builder) |
|||
{ |
|||
builder.Services.AddOidcAuthentication(options => |
|||
{ |
|||
builder.Configuration.Bind("AuthServer", options.ProviderOptions); |
|||
options.UserOptions.RoleClaim = JwtClaimTypes.Role; |
|||
options.ProviderOptions.DefaultScopes.Add("BookStore"); |
|||
options.ProviderOptions.DefaultScopes.Add("role"); |
|||
options.ProviderOptions.DefaultScopes.Add("email"); |
|||
options.ProviderOptions.DefaultScopes.Add("phone"); |
|||
}); |
|||
} |
|||
|
|||
private static void ConfigureUI(WebAssemblyHostBuilder builder) |
|||
{ |
|||
builder.RootComponents.Add<App>("#ApplicationContainer"); |
|||
} |
|||
|
|||
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<AbpAutoMapperOptions>(options => { options.AddMaps<BookStoreBlazorModule>(); }); |
|||
} |
|||
} |
|||
@ -1,14 +0,0 @@ |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Ui.Branding; |
|||
|
|||
namespace BookStore.Blazor; |
|||
|
|||
[Dependency(ReplaceServices = true)] |
|||
public class BookStoreBrandingProvider : DefaultBrandingProvider |
|||
{ |
|||
public override string AppName => "BookStore"; |
|||
|
|||
public override string LogoUrl => "logo.svg"; |
|||
|
|||
// public override string LogoReverseUrl => "logo.svg";
|
|||
} |
|||
@ -1,19 +0,0 @@ |
|||
using Volo.Abp.Bundling; |
|||
|
|||
namespace BookStore.Blazor; |
|||
|
|||
/* Add your global styles/scripts here. |
|||
* See https://docs.abp.io/en/abp/latest/UI/Blazor/Global-Scripts-Styles to learn how to use it
|
|||
*/ |
|||
public class BookStoreBundleContributor : IBundleContributor |
|||
{ |
|||
public void AddScripts(BundleContext context) |
|||
{ |
|||
|
|||
} |
|||
|
|||
public void AddStyles(BundleContext context) |
|||
{ |
|||
context.Add("main.css", true); |
|||
} |
|||
} |
|||
@ -1,67 +0,0 @@ |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.Configuration; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using BookStore.Localization; |
|||
using Volo.Abp.Account.Localization; |
|||
using Volo.Abp.Authorization.Permissions; |
|||
using Volo.Abp.UI.Navigation; |
|||
using Volo.Abp.Users; |
|||
|
|||
namespace BookStore.Blazor.Menus; |
|||
|
|||
public class BookStoreMenuContributor : IMenuContributor |
|||
{ |
|||
private readonly IConfiguration _configuration; |
|||
|
|||
public BookStoreMenuContributor(IConfiguration configuration) |
|||
{ |
|||
_configuration = configuration; |
|||
} |
|||
|
|||
public async Task ConfigureMenuAsync(MenuConfigurationContext context) |
|||
{ |
|||
if (context.Menu.Name == StandardMenus.Main) |
|||
{ |
|||
await ConfigureMainMenuAsync(context); |
|||
} |
|||
else if (context.Menu.Name == StandardMenus.User) |
|||
{ |
|||
await ConfigureUserMenuAsync(context); |
|||
} |
|||
} |
|||
|
|||
private Task ConfigureMainMenuAsync(MenuConfigurationContext context) |
|||
{ |
|||
var l = context.GetLocalizer<BookStoreResource>(); |
|||
|
|||
context.Menu.Items.Insert( |
|||
0, |
|||
new ApplicationMenuItem( |
|||
BookStoreMenus.Home, |
|||
l["Menu:Home"], |
|||
"/", |
|||
icon: "home" |
|||
) |
|||
); |
|||
|
|||
return Task.CompletedTask; |
|||
} |
|||
|
|||
private Task ConfigureUserMenuAsync(MenuConfigurationContext context) |
|||
{ |
|||
var accountStringLocalizer = context.GetLocalizer<AccountResource>(); |
|||
|
|||
var identityServerUrl = _configuration["AuthServer:Authority"] ?? ""; |
|||
|
|||
context.Menu.AddItem(new ApplicationMenuItem( |
|||
"Account.Manage", |
|||
accountStringLocalizer["MyAccount"], |
|||
$"{identityServerUrl.EnsureEndsWith('/')}Account/Manage?returnUrl={_configuration["App:SelfUrl"]}", |
|||
icon: "fa fa-cog", |
|||
order: 1000, |
|||
null).RequireAuthenticated()); |
|||
|
|||
return Task.CompletedTask; |
|||
} |
|||
} |
|||
@ -1,10 +0,0 @@ |
|||
namespace BookStore.Blazor.Menus; |
|||
|
|||
public class BookStoreMenus |
|||
{ |
|||
private const string Prefix = "BookStore"; |
|||
public const string Home = Prefix + ".Home"; |
|||
|
|||
//Add your menu items here...
|
|||
|
|||
} |
|||
@ -1,27 +0,0 @@ |
|||
@page "/" |
|||
@using Volo.Abp.MultiTenancy |
|||
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Settings |
|||
@inherits BookStoreComponentBase |
|||
@* @inject ICurrentTenant CurrentTenant *@ |
|||
@inject AuthenticationStateProvider AuthenticationStateProvider |
|||
|
|||
<div class="page-content"> |
|||
<div style="text-align: center"> |
|||
|
|||
<Alert Type="@AlertType.Success" |
|||
Message="Success" |
|||
Description=" Congratulations, BookStore is successfully running!" |
|||
ShowIcon="true"/> |
|||
|
|||
<Divider/> |
|||
|
|||
<p>@L["LongWelcomeMessage"]</p> |
|||
|
|||
@if (!CurrentUser.IsAuthenticated) |
|||
{ |
|||
<a class="ant-btn ant-btn-primary" href="/authentication/login"> |
|||
@L["Login"] |
|||
</a> |
|||
} |
|||
</div> |
|||
</div> |
|||
@ -1,13 +0,0 @@ |
|||
using System.Threading.Tasks; |
|||
using AntDesign; |
|||
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme; |
|||
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Settings; |
|||
using Microsoft.AspNetCore.Components; |
|||
using Microsoft.Extensions.Options; |
|||
|
|||
namespace BookStore.Blazor.Pages; |
|||
|
|||
public partial class Index |
|||
{ |
|||
|
|||
} |
|||
@ -1 +0,0 @@ |
|||
/* Write here your styles for the Index page */ |
|||
@ -1,29 +0,0 @@ |
|||
{ |
|||
"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" |
|||
} |
|||
}, |
|||
"BookStore.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" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1,13 +0,0 @@ |
|||
@using System.Net.Http |
|||
@using Microsoft.AspNetCore.Authorization |
|||
@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.Web |
|||
@using BookStore.Blazor |
|||
@using AntDesign |
|||
@using Lsw.Abp.AntDesignUI |
|||
@using Lsw.Abp.AntDesignUI.Components |
|||
@ -1,24 +0,0 @@ |
|||
{ |
|||
"App": { |
|||
"SelfUrl": "https://localhost:44307" |
|||
}, |
|||
"AuthServer": { |
|||
"Authority": "https://localhost:44306", |
|||
"ClientId": "BookStore_Blazor", |
|||
"ResponseType": "code" |
|||
}, |
|||
"RemoteServices": { |
|||
"Default": { |
|||
"BaseUrl": "https://localhost:44306" |
|||
} |
|||
}, |
|||
"AbpCli": { |
|||
"Bundle": { |
|||
"Mode": "BundleAndMinify", /* Options: None, Bundle, BundleAndMinify */ |
|||
"Name": "global", |
|||
"Parameters": { |
|||
|
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
Before Width: | Height: | Size: 31 KiB |
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
@ -1,29 +0,0 @@ |
|||
<!DOCTYPE html> |
|||
<html> |
|||
|
|||
<head> |
|||
<meta charset="utf-8" /> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> |
|||
<title>BookStore.Blazor</title> |
|||
<base href="/" /> |
|||
|
|||
<!--ABP:Styles--> |
|||
<link href="global.css?_v=638691865248680701" rel="stylesheet"/> |
|||
<link href="main.css" rel="stylesheet"/> |
|||
<!--/ABP:Styles--> |
|||
<link href="BookStore.Blazor.styles.css" rel="stylesheet"/> |
|||
</head> |
|||
|
|||
<body class="abp-application-layout bg-light"> |
|||
<div id="ApplicationContainer"> |
|||
<div class="spinner"> |
|||
<div class="double-bounce1"></div> |
|||
<div class="double-bounce2"></div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!--ABP:Scripts--> |
|||
<script src="global.js?_v=638691865250004542"></script> |
|||
<!--/ABP:Scripts--> |
|||
</body> |
|||
</html> |
|||
|
Before Width: | Height: | Size: 4.6 KiB |
@ -1,49 +0,0 @@ |
|||
/* Global styles for the BookStore application */ |
|||
.spinner { |
|||
width: 40px; |
|||
height: 40px; |
|||
display: block; |
|||
position: fixed; |
|||
top: calc( 50% - ( 40px / 2) ); |
|||
right: calc( 50% - ( 40px / 2) ); |
|||
} |
|||
|
|||
.double-bounce1, .double-bounce2 { |
|||
width: 100%; |
|||
height: 100%; |
|||
border-radius: 50%; |
|||
background-color: #333; |
|||
opacity: 0.6; |
|||
position: absolute; |
|||
top: 0; |
|||
left: 0; |
|||
-webkit-animation: sk-bounce 2.0s infinite ease-in-out; |
|||
animation: sk-bounce 2.0s infinite ease-in-out; |
|||
} |
|||
|
|||
.double-bounce2 { |
|||
-webkit-animation-delay: -1.0s; |
|||
animation-delay: -1.0s; |
|||
} |
|||
|
|||
@-webkit-keyframes sk-bounce { |
|||
0%, 100% { |
|||
-webkit-transform: scale(0.0) |
|||
} |
|||
|
|||
50% { |
|||
-webkit-transform: scale(1.0) |
|||
} |
|||
} |
|||
|
|||
@keyframes sk-bounce { |
|||
0%, 100% { |
|||
transform: scale(0.0); |
|||
-webkit-transform: scale(0.0); |
|||
} |
|||
|
|||
50% { |
|||
transform: scale(1.0); |
|||
-webkit-transform: scale(1.0); |
|||
} |
|||
} |
|||
@ -1,55 +0,0 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk.Web"> |
|||
|
|||
<Import Project="..\..\common.props" /> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net9.0</TargetFramework> |
|||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> |
|||
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> |
|||
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> |
|||
<MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish> |
|||
<PreserveCompilationReferences>true</PreserveCompilationReferences> |
|||
<UserSecretsId>BookStore-4681b4fd-151f-4221-84a4-929d86723e4c</UserSecretsId> |
|||
</PropertyGroup> |
|||
|
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Microsoft.Data.SqlClient" /> |
|||
|
|||
<PackageReference Include="Serilog.AspNetCore" /> |
|||
<PackageReference Include="Serilog.Sinks.Async" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\..\modules\IdentityManagement\Lsw.Abp.IdentityManagement.Blazor.Server.AntDesignUI\Lsw.Abp.IdentityManagement.Blazor.Server.AntDesignUI.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\AntDesignTheme\Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme\Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\SettingManagement\Lsw.Abp.SettingManagement.Blazor.Server.AntDesignUI\Lsw.Abp.SettingManagement.Blazor.Server.AntDesignUI.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\TenantManagement\Lsw.Abp.TenantManagement.Blazor.Server.AntDesignUI\Lsw.Abp.TenantManagement.Blazor.Server.AntDesignUI.csproj" /> |
|||
<ProjectReference Include="..\..\src\BookStore.Application\BookStore.Application.csproj" /> |
|||
<ProjectReference Include="..\..\src\BookStore.HttpApi\BookStore.HttpApi.csproj" /> |
|||
<ProjectReference Include="..\..\src\BookStore.EntityFrameworkCore\BookStore.EntityFrameworkCore.csproj" /> |
|||
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic" /> |
|||
<PackageReference Include="Volo.Abp.Autofac" /> |
|||
<PackageReference Include="Volo.Abp.Swashbuckle" /> |
|||
<PackageReference Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" /> |
|||
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" /> |
|||
<PackageReference Include="Volo.Abp.Account.Web.IdentityServer" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<Compile Remove="Logs\**" /> |
|||
<Content Remove="Logs\**" /> |
|||
<EmbeddedResource Remove="Logs\**" /> |
|||
<None Remove="Logs\**" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<None Update="Pages\**\*.js"> |
|||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> |
|||
</None> |
|||
<None Update="Pages\**\*.css"> |
|||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> |
|||
</None> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -1,245 +0,0 @@ |
|||
using System; |
|||
using System.IO; |
|||
using Microsoft.AspNetCore.Builder; |
|||
using Microsoft.AspNetCore.Hosting; |
|||
using Microsoft.Extensions.Configuration; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Microsoft.Extensions.Hosting; |
|||
using Microsoft.OpenApi.Models; |
|||
using BookStore.Blazor.Menus; |
|||
using BookStore.EntityFrameworkCore; |
|||
using BookStore.Localization; |
|||
using BookStore.MultiTenancy; |
|||
using Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.Bundling; |
|||
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Routing; |
|||
using Lsw.Abp.IdentityManagement.Blazor.Server.AntDesignUI; |
|||
using Lsw.Abp.TenantManagement.Blazor.Server.AntDesignUI; |
|||
using Volo.Abp; |
|||
using Volo.Abp.Account.Web; |
|||
using Volo.Abp.AspNetCore.Authentication.JwtBearer; |
|||
using Volo.Abp.AspNetCore.Mvc; |
|||
using Volo.Abp.AspNetCore.Mvc.Localization; |
|||
using Volo.Abp.AspNetCore.Mvc.UI.Bundling; |
|||
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; |
|||
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling; |
|||
using Volo.Abp.AspNetCore.Serilog; |
|||
using Volo.Abp.Autofac; |
|||
using Volo.Abp.AutoMapper; |
|||
using Volo.Abp.Localization; |
|||
using Volo.Abp.Modularity; |
|||
using Lsw.Abp.SettingManagement.Blazor.AntDesignUI; |
|||
using Lsw.Abp.SettingManagement.Blazor.Server.AntDesignUI; |
|||
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Bundling; |
|||
using Volo.Abp.Swashbuckle; |
|||
using Volo.Abp.UI.Navigation; |
|||
using Volo.Abp.UI.Navigation.Urls; |
|||
using Volo.Abp.VirtualFileSystem; |
|||
using Volo.Abp.Timing; |
|||
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme; |
|||
|
|||
namespace BookStore.Blazor; |
|||
|
|||
[DependsOn( |
|||
typeof(BookStoreApplicationModule), |
|||
typeof(BookStoreEntityFrameworkCoreModule), |
|||
typeof(BookStoreHttpApiModule), |
|||
typeof(AbpAspNetCoreMvcUiBasicThemeModule), |
|||
typeof(AbpAutofacModule), |
|||
typeof(AbpSwashbuckleModule), |
|||
typeof(AbpAspNetCoreAuthenticationJwtBearerModule), |
|||
typeof(AbpAspNetCoreSerilogModule), |
|||
typeof(AbpAccountWebIdentityServerModule), |
|||
typeof(AbpIdentityBlazorServerAntDesignModule), |
|||
typeof(AbpTenantManagementBlazorServerAntDesignModule), |
|||
typeof(AbpSettingManagementBlazorServerAntDesignModule) |
|||
)] |
|||
public class BookStoreBlazorModule : AbpModule |
|||
{ |
|||
public override void PreConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options => |
|||
{ |
|||
options.AddAssemblyResource( |
|||
typeof(BookStoreResource), |
|||
typeof(BookStoreDomainModule).Assembly, |
|||
typeof(BookStoreDomainSharedModule).Assembly, |
|||
typeof(BookStoreApplicationModule).Assembly, |
|||
typeof(BookStoreApplicationContractsModule).Assembly, |
|||
typeof(BookStoreBlazorModule).Assembly |
|||
); |
|||
}); |
|||
} |
|||
|
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
var hostingEnvironment = context.Services.GetHostingEnvironment(); |
|||
var configuration = context.Services.GetConfiguration(); |
|||
|
|||
Configure<AbpClockOptions>(options => options.Kind = DateTimeKind.Utc); |
|||
Configure<AbpAntDesignThemeOptions>(options=> options.EnableMultipleTabs=true); |
|||
ConfigureUrls(configuration); |
|||
ConfigureBundles(); |
|||
ConfigureAuthentication(context, configuration); |
|||
ConfigureAutoMapper(); |
|||
ConfigureLocalizationServices(); |
|||
ConfigureSwaggerServices(context.Services); |
|||
ConfigureAutoApiControllers(); |
|||
ConfigureRouter(context); |
|||
ConfigureMenu(context); |
|||
} |
|||
|
|||
private void ConfigureUrls(IConfiguration configuration) |
|||
{ |
|||
Configure<AppUrlOptions>(options => |
|||
{ |
|||
options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; |
|||
options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"].Split(',')); |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureBundles() |
|||
{ |
|||
Configure<AbpBundlingOptions>(options => |
|||
{ |
|||
// MVC UI
|
|||
options.StyleBundles.Configure( |
|||
BasicThemeBundles.Styles.Global, |
|||
bundle => |
|||
{ |
|||
bundle.AddFiles("/global-styles.css"); |
|||
} |
|||
); |
|||
|
|||
//BLAZOR UI
|
|||
options.StyleBundles.Configure( |
|||
BlazorAntDesignThemeBundles.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("/BookStore.BlazorServer.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 = "BookStore"; |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureLocalizationServices() |
|||
{ |
|||
Configure<AbpLocalizationOptions>(options => |
|||
{ |
|||
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")); |
|||
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic")); |
|||
options.Languages.Add(new LanguageInfo("it", "it", "Italiano")); |
|||
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")); |
|||
options.Languages.Add(new LanguageInfo("es", "es", "Español")); |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureSwaggerServices(IServiceCollection services) |
|||
{ |
|||
services.AddAbpSwaggerGen( |
|||
options => |
|||
{ |
|||
options.SwaggerDoc("v1", new OpenApiInfo { Title = "BookStore API", Version = "v1" }); |
|||
options.DocInclusionPredicate((docName, description) => true); |
|||
options.CustomSchemaIds(type => type.FullName); |
|||
} |
|||
); |
|||
} |
|||
private void ConfigureMenu(ServiceConfigurationContext context) |
|||
{ |
|||
Configure<AbpNavigationOptions>(options => |
|||
{ |
|||
options.MenuContributors.Add(new BookStoreMenuContributor()); |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureRouter(ServiceConfigurationContext context) |
|||
{ |
|||
Configure<AbpRouterOptions>(options => |
|||
{ |
|||
options.AppAssembly = typeof(BookStoreBlazorModule).Assembly; |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureAutoApiControllers() |
|||
{ |
|||
Configure<AbpAspNetCoreMvcOptions>(options => |
|||
{ |
|||
options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly); |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureAutoMapper() |
|||
{ |
|||
Configure<AbpAutoMapperOptions>(options => |
|||
{ |
|||
options.AddMaps<BookStoreBlazorModule>(); |
|||
}); |
|||
} |
|||
|
|||
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.MapAbpStaticAssets(); |
|||
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", "BookStore API"); |
|||
}); |
|||
app.UseConfiguredEndpoints(); |
|||
} |
|||
} |
|||
@ -1,10 +0,0 @@ |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Ui.Branding; |
|||
|
|||
namespace BookStore.Blazor; |
|||
|
|||
[Dependency(ReplaceServices = true)] |
|||
public class BookStoreBrandingProvider : DefaultBrandingProvider |
|||
{ |
|||
public override string AppName => "BookStore"; |
|||
} |
|||
@ -1,52 +0,0 @@ |
|||
using System.Threading.Tasks; |
|||
using AntDesign; |
|||
using BookStore.Localization; |
|||
using BookStore.MultiTenancy; |
|||
using Lsw.Abp.IdentityManagement.Blazor.AntDesignUI; |
|||
using Lsw.Abp.TenantManagement.Blazor.AntDesignUI; |
|||
using Lsw.Abp.SettingManagement.Blazor.AntDesignUI; |
|||
using Volo.Abp.UI.Navigation; |
|||
|
|||
namespace BookStore.Blazor.Menus; |
|||
|
|||
public class BookStoreMenuContributor : IMenuContributor |
|||
{ |
|||
public async Task ConfigureMenuAsync(MenuConfigurationContext context) |
|||
{ |
|||
if (context.Menu.Name == StandardMenus.Main) |
|||
{ |
|||
await ConfigureMainMenuAsync(context); |
|||
} |
|||
} |
|||
|
|||
private Task ConfigureMainMenuAsync(MenuConfigurationContext context) |
|||
{ |
|||
var administration = context.Menu.GetAdministration(); |
|||
var l = context.GetLocalizer<BookStoreResource>(); |
|||
|
|||
context.Menu.Items.Insert( |
|||
0, |
|||
new ApplicationMenuItem( |
|||
BookStoreMenus.Home, |
|||
l["Menu:Home"], |
|||
"/", |
|||
icon: IconType.Outline.Home, |
|||
order: 0 |
|||
) |
|||
); |
|||
|
|||
if (MultiTenancyConsts.IsEnabled) |
|||
{ |
|||
administration.SetSubItemOrder(TenantManagementMenuNames.GroupName, 1); |
|||
} |
|||
else |
|||
{ |
|||
administration.TryRemoveMenuItem(TenantManagementMenuNames.GroupName); |
|||
} |
|||
|
|||
administration.SetSubItemOrder(IdentityMenuNames.GroupName, 2); |
|||
administration.SetSubItemOrder(SettingManagementMenus.GroupName, 3); |
|||
|
|||
return Task.CompletedTask; |
|||
} |
|||
} |
|||
@ -1,24 +0,0 @@ |
|||
@page "/" |
|||
@using Volo.Abp.MultiTenancy |
|||
@inherits BookStoreComponentBase |
|||
@inject ICurrentTenant CurrentTenant |
|||
@inject AuthenticationStateProvider AuthenticationStateProvider |
|||
|
|||
<div class="page-content"> |
|||
<div style="text-align: center"> |
|||
|
|||
<Alert Type="@AlertType.Success" |
|||
Message="Success" |
|||
Description=" Congratulations, BookStore is successfully running!" |
|||
ShowIcon="true"/> |
|||
|
|||
<Divider/> |
|||
|
|||
<p>@L["LongWelcomeMessage"]</p> |
|||
|
|||
@if (!CurrentUser.IsAuthenticated) |
|||
{ |
|||
<a class="btn btn-primary" href="Account/Login" ><i class="fa fa-sign-in"></i> @L["Login"]</a> |
|||
} |
|||
</div> |
|||
</div> |
|||
@ -1,15 +0,0 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.ComponentModel; |
|||
using System.Linq; |
|||
using System.Text.Json; |
|||
using System.Threading.Tasks; |
|||
using AntDesign; |
|||
using AntDesign.TableModels; |
|||
|
|||
namespace BookStore.BlazorServer.Pages; |
|||
|
|||
public partial class Index |
|||
{ |
|||
|
|||
} |
|||
@ -1 +0,0 @@ |
|||
/* Write here your styles for the Index page */ |
|||
@ -1,40 +0,0 @@ |
|||
@page "/" |
|||
@namespace BookStore.Blazor.Pages |
|||
@using System.Globalization |
|||
@using Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.Bundling |
|||
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesignTheme |
|||
@using Microsoft.AspNetCore.Mvc.TagHelpers |
|||
@using Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers |
|||
@using Volo.Abp.Localization |
|||
@{ |
|||
Layout = null; |
|||
var rtl = CultureHelper.IsRtl ? "rtl" : string.Empty; |
|||
} |
|||
|
|||
<!DOCTYPE html> |
|||
<html lang="@CultureInfo.CurrentCulture.Name" dir="@rtl"> |
|||
<head> |
|||
<meta charset="utf-8" /> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
|||
<title>BookStore.Blazor</title> |
|||
<base href="~/" /> |
|||
|
|||
<abp-style-bundle name="@BlazorAntDesignThemeBundles.Styles.Global" /> |
|||
</head> |
|||
<body class="abp-application-layout bg-light @rtl"> |
|||
<component type="typeof(App)" render-mode="Server" /> |
|||
|
|||
<div id="blazor-error-ui"> |
|||
<environment include="Staging,Production"> |
|||
An error has occurred. This application may no longer respond until reloaded. |
|||
</environment> |
|||
<environment include="Development"> |
|||
An unhandled exception has occurred. See browser dev tools for details. |
|||
</environment> |
|||
<a href="" class="reload">Reload</a> |
|||
<a class="dismiss">🗙</a> |
|||
</div> |
|||
|
|||
<abp-script-bundle name="@BlazorAntDesignThemeBundles.Scripts.Global" /> |
|||
</body> |
|||
</html> |
|||
@ -1,4 +0,0 @@ |
|||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers |
|||
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI |
|||
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap |
|||
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling |
|||
@ -1,12 +0,0 @@ |
|||
@using System.Net.Http |
|||
@using Microsoft.AspNetCore.Authorization |
|||
@using Microsoft.AspNetCore.Components.Authorization |
|||
@using Microsoft.AspNetCore.Components.Forms |
|||
@using Microsoft.AspNetCore.Components.Routing |
|||
@using Microsoft.AspNetCore.Components.Web |
|||
@using Microsoft.AspNetCore.Components.Web.Virtualization |
|||
@using Microsoft.JSInterop |
|||
@using BookStore.Blazor |
|||
@using AntDesign |
|||
@using Lsw.Abp.AntDesignUI |
|||
@using Lsw.Abp.AntDesignUI.Components |
|||
@ -1,16 +0,0 @@ |
|||
{ |
|||
"App": { |
|||
"SelfUrl": "https://localhost:44313", |
|||
"RedirectAllowedUrls": "https://localhost:44313" |
|||
}, |
|||
"ConnectionStrings": { |
|||
"Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=AntBlazorDemo;Trusted_Connection=True" |
|||
}, |
|||
"AuthServer": { |
|||
"Authority": "https://localhost:44313", |
|||
"RequireHttpsMetadata": "false" |
|||
}, |
|||
"StringEncryption": { |
|||
"DefaultPassPhrase": "PkQhKQMtlOiqySK3" |
|||
} |
|||
} |
|||
@ -1,424 +0,0 @@ |
|||
{ |
|||
"name": "my-app", |
|||
"version": "1.0.0", |
|||
"lockfileVersion": 3, |
|||
"requires": true, |
|||
"packages": { |
|||
"": { |
|||
"name": "my-app", |
|||
"version": "1.0.0", |
|||
"dependencies": { |
|||
"@abp/aspnetcore.components.server.basictheme": "~9.0.0", |
|||
"@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.0" |
|||
} |
|||
}, |
|||
"node_modules/@abp/aspnetcore.components.server.basictheme": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/aspnetcore.components.server.basictheme/-/aspnetcore.components.server.basictheme-9.0.1.tgz", |
|||
"integrity": "sha512-9nRzZuHteVxUKwDdbKeOiU4j01S9lknZg+FpVeDGYnhJwLi6ssdyDvAi6uL8F+sWKhAh8JcmwfmPBqwzuwq9CQ==", |
|||
"dependencies": { |
|||
"@abp/aspnetcore.components.server.theming": "~9.0.1" |
|||
} |
|||
}, |
|||
"node_modules/@abp/aspnetcore.components.server.theming": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/aspnetcore.components.server.theming/-/aspnetcore.components.server.theming-9.0.1.tgz", |
|||
"integrity": "sha512-PEvkCxlL+pYS6wdzIznghN+t0tIpr8ipuVK0zTFK4yFIFWDw+LzOPADGv1UcmlO7nxC6DGUxye5JatjX61Cocg==", |
|||
"dependencies": { |
|||
"@abp/bootstrap": "~9.0.1", |
|||
"@abp/font-awesome": "~9.0.1" |
|||
} |
|||
}, |
|||
"node_modules/@abp/aspnetcore.mvc.ui": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.1.tgz", |
|||
"integrity": "sha512-KVbWCpBV7S1ViHYQP/hn4gSMzSiA2e8/zC0HND1fjE+1zXJqJyEWto1eg2DaKSOs/rmHD8WtFVMU4hCLQTCuIA==", |
|||
"dependencies": { |
|||
"ansi-colors": "^4.1.3" |
|||
} |
|||
}, |
|||
"node_modules/@abp/aspnetcore.mvc.ui.theme.basic": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.1.tgz", |
|||
"integrity": "sha512-JaxuDH8WTnZYX6C7CX7ZVHfhTDR/SxfwRvtJaGGijSX8QKd1DXpfi9lYEF4Y9k5b48YT/0slBqU5g0sLmBd3+g==", |
|||
"dependencies": { |
|||
"@abp/aspnetcore.mvc.ui.theme.shared": "~9.0.1" |
|||
} |
|||
}, |
|||
"node_modules/@abp/aspnetcore.mvc.ui.theme.shared": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.1.tgz", |
|||
"integrity": "sha512-vrgRYKNctdZYhPCQ2I6Z10gUI1S5ynDj+DgnV7x7a7G/juuHaOSbkRXgwrmJsmYLfGA7KFCoJcbpER8mmXQeHQ==", |
|||
"dependencies": { |
|||
"@abp/aspnetcore.mvc.ui": "~9.0.1", |
|||
"@abp/bootstrap": "~9.0.1", |
|||
"@abp/bootstrap-datepicker": "~9.0.1", |
|||
"@abp/bootstrap-daterangepicker": "~9.0.1", |
|||
"@abp/datatables.net-bs5": "~9.0.1", |
|||
"@abp/font-awesome": "~9.0.1", |
|||
"@abp/jquery-form": "~9.0.1", |
|||
"@abp/jquery-validation-unobtrusive": "~9.0.1", |
|||
"@abp/lodash": "~9.0.1", |
|||
"@abp/luxon": "~9.0.1", |
|||
"@abp/malihu-custom-scrollbar-plugin": "~9.0.1", |
|||
"@abp/moment": "~9.0.1", |
|||
"@abp/select2": "~9.0.1", |
|||
"@abp/sweetalert2": "~9.0.1", |
|||
"@abp/timeago": "~9.0.1", |
|||
"@abp/toastr": "~9.0.1" |
|||
} |
|||
}, |
|||
"node_modules/@abp/bootstrap": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/bootstrap/-/bootstrap-9.0.1.tgz", |
|||
"integrity": "sha512-uAfVNsUYSsRqgeO9JMnhJJlFoDmO3/lTvER/iYOqerF0X03KQnR8HZy2V3MD1D+fSh/4JuU6aAZFl6IQLinMKQ==", |
|||
"dependencies": { |
|||
"@abp/core": "~9.0.1", |
|||
"bootstrap": "^5.3.3" |
|||
} |
|||
}, |
|||
"node_modules/@abp/bootstrap-datepicker": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.1.tgz", |
|||
"integrity": "sha512-LhgqBRr66x9gGTAyv1FuPAw8u8N77WQK2AfDkNgLueurM2+xMYQzH3pWWLhcN676/JXafxfALCfBoM8U7CfXLg==", |
|||
"dependencies": { |
|||
"bootstrap-datepicker": "^1.10.0" |
|||
} |
|||
}, |
|||
"node_modules/@abp/bootstrap-daterangepicker": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.1.tgz", |
|||
"integrity": "sha512-SlBVgiYa75uQyaGt5EVjduren7Po5UP26A1tXEQQr0hDia1+1TK0qxmJ2YxjeJpB7FwtcmJiofv5fngvJqhxIA==", |
|||
"dependencies": { |
|||
"bootstrap-daterangepicker": "^3.1.0" |
|||
} |
|||
}, |
|||
"node_modules/@abp/core": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/core/-/core-9.0.1.tgz", |
|||
"integrity": "sha512-NWXDVCIJePbcKCrRvGxAlaA2MrOF2IZox37bQkW7/mTeOPpNoTa6lhowksNNcTpFq2YdD8bG0i0kfskkp3EZ2w==", |
|||
"dependencies": { |
|||
"@abp/utils": "~9.0.1" |
|||
} |
|||
}, |
|||
"node_modules/@abp/datatables.net": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/datatables.net/-/datatables.net-9.0.1.tgz", |
|||
"integrity": "sha512-JY53zVQPluRrBiKwtgk4gfSgD8VDs/VU8LWizhGCprXt3h9vXx0SQL4My6zvXVkv4hUjaq4+MYo84OI8EwFvsg==", |
|||
"dependencies": { |
|||
"@abp/jquery": "~9.0.1", |
|||
"datatables.net": "^2.1.8" |
|||
} |
|||
}, |
|||
"node_modules/@abp/datatables.net-bs5": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.1.tgz", |
|||
"integrity": "sha512-tAHdf4TBAS0bVRcvovDKS0OHFyeRSPYbiSIwDn8AIWzW9Weav31jhZ5jL3HEtBKVdb7zqUQ8/3dYPufjDuDdDA==", |
|||
"dependencies": { |
|||
"@abp/datatables.net": "~9.0.1", |
|||
"datatables.net-bs5": "^2.1.8" |
|||
} |
|||
}, |
|||
"node_modules/@abp/font-awesome": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/font-awesome/-/font-awesome-9.0.1.tgz", |
|||
"integrity": "sha512-7NnYBmk0plLVElUWR1zohul87vE9wKJItemWT5Kskf/IJirKOvXwSSu+7Jg1LmnVtIxcH6qgRpJMmzuAJgawnQ==", |
|||
"dependencies": { |
|||
"@abp/core": "~9.0.1", |
|||
"@fortawesome/fontawesome-free": "^6.6.0" |
|||
} |
|||
}, |
|||
"node_modules/@abp/jquery": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/jquery/-/jquery-9.0.1.tgz", |
|||
"integrity": "sha512-z8EcnOveItAszbTsM9GFFDQSlcIg/ym6+WZME9uldLoetdxkmI9ij0knVeGj5eqMjQaHvTWwrVLObiBbZwYFWw==", |
|||
"dependencies": { |
|||
"@abp/core": "~9.0.1", |
|||
"jquery": "~3.7.1" |
|||
} |
|||
}, |
|||
"node_modules/@abp/jquery-form": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/jquery-form/-/jquery-form-9.0.1.tgz", |
|||
"integrity": "sha512-9co0+Cver+RUSOpfuukSWQhR+TCnO9Dly4RTVRIKFksGVfN8hA70NqRrVxaASNNFv42ynK88FQK+2bLPswz/iw==", |
|||
"dependencies": { |
|||
"@abp/jquery": "~9.0.1", |
|||
"jquery-form": "^4.3.0" |
|||
} |
|||
}, |
|||
"node_modules/@abp/jquery-validation": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/jquery-validation/-/jquery-validation-9.0.1.tgz", |
|||
"integrity": "sha512-uFSxiPMEkaPlcuyXIoKbeOIIRHo4IrgRbmnlHwI1uETrW60ENUdE2LJAVcYS77JROrjVtv8FPlaffWuva6sGeQ==", |
|||
"dependencies": { |
|||
"@abp/jquery": "~9.0.1", |
|||
"jquery-validation": "^1.21.0" |
|||
} |
|||
}, |
|||
"node_modules/@abp/jquery-validation-unobtrusive": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.1.tgz", |
|||
"integrity": "sha512-Zpz48wIFjq7eIApG/sEVjkfaJWZhcyCnlCtDf5eU3vvh82nRetbiCEAVLpZ4LVjorlyp3VvVAxReUSeeWflu8A==", |
|||
"dependencies": { |
|||
"@abp/jquery-validation": "~9.0.1", |
|||
"jquery-validation-unobtrusive": "^4.0.0" |
|||
} |
|||
}, |
|||
"node_modules/@abp/lodash": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/lodash/-/lodash-9.0.1.tgz", |
|||
"integrity": "sha512-D+/iOyh/O+jV80bK5vWxyn++IVmeRbZq/UaXanA4RKpzigxJUsgOiSD9lUj85BkfKn2YyFmoR39xwaAqkWoyRA==", |
|||
"dependencies": { |
|||
"@abp/core": "~9.0.1", |
|||
"lodash": "^4.17.21" |
|||
} |
|||
}, |
|||
"node_modules/@abp/luxon": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/luxon/-/luxon-9.0.1.tgz", |
|||
"integrity": "sha512-1ZHXP5SGz05tQ1tzYmPcRiZwmkCKGX0KWFoV0zF3ATRaevzku9nXvSy7K6GIFkkgTb9f9XNx4/OBBF/GXkuRqw==", |
|||
"dependencies": { |
|||
"@abp/core": "~9.0.1", |
|||
"luxon": "^3.5.0" |
|||
} |
|||
}, |
|||
"node_modules/@abp/malihu-custom-scrollbar-plugin": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.1.tgz", |
|||
"integrity": "sha512-GkKPLg9Z9UTTSSpW2hYZYZ9IgCvDSOYJmyRSl/h4fG8cWMgGCPVpv8MPPu0+WtIfwW/mT4SPX9X+sjUlRL5XRQ==", |
|||
"dependencies": { |
|||
"@abp/core": "~9.0.1", |
|||
"malihu-custom-scrollbar-plugin": "^3.1.5" |
|||
} |
|||
}, |
|||
"node_modules/@abp/moment": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/moment/-/moment-9.0.1.tgz", |
|||
"integrity": "sha512-bTuCc7pi/DCtgz7t96UBU0wn9UGt4b50JhDCVeTKquh+gP1sgWoI5hyvEBkmgE4dcffO0yzZU2opHYTKYGl/OQ==", |
|||
"dependencies": { |
|||
"moment": "^2.30.1" |
|||
} |
|||
}, |
|||
"node_modules/@abp/select2": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/select2/-/select2-9.0.1.tgz", |
|||
"integrity": "sha512-epyYJH2gAOU2UvGn5FD6372hbW3fL7uZIgGpvfgEfa+l6HPdlV9B1OweU2xkONNCoylShAcP/y8qf+bUh8WDEA==", |
|||
"dependencies": { |
|||
"@abp/core": "~9.0.1", |
|||
"select2": "^4.0.13" |
|||
} |
|||
}, |
|||
"node_modules/@abp/sweetalert2": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/sweetalert2/-/sweetalert2-9.0.1.tgz", |
|||
"integrity": "sha512-0RXR/lzy3qMJLisGUz4qrcA9Clu/Tt1ABGzB64ynG1t/l5XessQsIB5Hkt6MbSyOEsprRsq+ZtKH35CwTRPdAw==", |
|||
"dependencies": { |
|||
"@abp/core": "~9.0.1", |
|||
"sweetalert2": "^11.14.1" |
|||
} |
|||
}, |
|||
"node_modules/@abp/timeago": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/timeago/-/timeago-9.0.1.tgz", |
|||
"integrity": "sha512-dNfUQwilrY+JHxL5lwJ++ixYDGAs5lF1EDxKMQMIXD/ak5L8rkdLns8Otta7FhgDDny9UJ7XWQjYsG8ZxxybRQ==", |
|||
"dependencies": { |
|||
"@abp/jquery": "~9.0.1", |
|||
"timeago": "^1.6.7" |
|||
} |
|||
}, |
|||
"node_modules/@abp/toastr": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/toastr/-/toastr-9.0.1.tgz", |
|||
"integrity": "sha512-10KuHnSJOxkvzqs6Aim6GJp8xBuT+TsZqBE1KaXQnERPawmOo4+ME28kA/7lq8fvgFUNO3K41T2uuA1GPHVQcg==", |
|||
"dependencies": { |
|||
"@abp/jquery": "~9.0.1", |
|||
"toastr": "^2.1.4" |
|||
} |
|||
}, |
|||
"node_modules/@abp/utils": { |
|||
"version": "9.0.1", |
|||
"resolved": "https://registry.npmjs.org/@abp/utils/-/utils-9.0.1.tgz", |
|||
"integrity": "sha512-7eOKT0ciKNdtuASck1kifyc4dC6CeebgxV+rx/EAi3YwPMDkqie6YwLGUqKdGW2N/MZ15JuDR6gkuZxKHEb0NQ==", |
|||
"dependencies": { |
|||
"just-compare": "^2.3.0" |
|||
} |
|||
}, |
|||
"node_modules/@fortawesome/fontawesome-free": { |
|||
"version": "6.7.1", |
|||
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.1.tgz", |
|||
"integrity": "sha512-ALIk/MOh5gYe1TG/ieS5mVUsk7VUIJTJKPMK9rFFqOgfp0Q3d5QiBXbcOMwUvs37fyZVCz46YjOE6IFeOAXCHA==", |
|||
"engines": { |
|||
"node": ">=6" |
|||
} |
|||
}, |
|||
"node_modules/@popperjs/core": { |
|||
"version": "2.11.8", |
|||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", |
|||
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", |
|||
"peer": true, |
|||
"funding": { |
|||
"type": "opencollective", |
|||
"url": "https://opencollective.com/popperjs" |
|||
} |
|||
}, |
|||
"node_modules/ansi-colors": { |
|||
"version": "4.1.3", |
|||
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", |
|||
"integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", |
|||
"engines": { |
|||
"node": ">=6" |
|||
} |
|||
}, |
|||
"node_modules/bootstrap": { |
|||
"version": "5.3.3", |
|||
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", |
|||
"integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", |
|||
"funding": [ |
|||
{ |
|||
"type": "github", |
|||
"url": "https://github.com/sponsors/twbs" |
|||
}, |
|||
{ |
|||
"type": "opencollective", |
|||
"url": "https://opencollective.com/bootstrap" |
|||
} |
|||
], |
|||
"peerDependencies": { |
|||
"@popperjs/core": "^2.11.8" |
|||
} |
|||
}, |
|||
"node_modules/bootstrap-datepicker": { |
|||
"version": "1.10.0", |
|||
"resolved": "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.10.0.tgz", |
|||
"integrity": "sha512-lWxtSYddAQOpbAO8UhYhHLcK6425eWoSjb5JDvZU3ePHEPF6A3eUr51WKaFy4PccU19JRxUG6wEU3KdhtKfvpg==", |
|||
"dependencies": { |
|||
"jquery": ">=3.4.0 <4.0.0" |
|||
} |
|||
}, |
|||
"node_modules/bootstrap-daterangepicker": { |
|||
"version": "3.1.0", |
|||
"resolved": "https://registry.npmjs.org/bootstrap-daterangepicker/-/bootstrap-daterangepicker-3.1.0.tgz", |
|||
"integrity": "sha512-oaQZx6ZBDo/dZNyXGVi2rx5GmFXThyQLAxdtIqjtLlYVaQUfQALl5JZMJJZzyDIX7blfy4ppZPAJ10g8Ma4d/g==", |
|||
"dependencies": { |
|||
"jquery": ">=1.10", |
|||
"moment": "^2.9.0" |
|||
} |
|||
}, |
|||
"node_modules/datatables.net": { |
|||
"version": "2.1.8", |
|||
"resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-2.1.8.tgz", |
|||
"integrity": "sha512-47ULt+U4bcjbuGTpTlT6SnCuSFVRBxxdWa6X3NfvTObBJ2BZU0o+JUIl05wQ6cABNIavjbAV51gpgvFsMHL9zA==", |
|||
"dependencies": { |
|||
"jquery": ">=1.7" |
|||
} |
|||
}, |
|||
"node_modules/datatables.net-bs5": { |
|||
"version": "2.1.8", |
|||
"resolved": "https://registry.npmjs.org/datatables.net-bs5/-/datatables.net-bs5-2.1.8.tgz", |
|||
"integrity": "sha512-YlGws8eI3iw/1AmKJH18+YMzm/UgGb6o9s14KAC24QT1/8anolm8GnVAgGcwUcvHm3hn1i8A5QXqgbqeMRINeg==", |
|||
"dependencies": { |
|||
"datatables.net": "2.1.8", |
|||
"jquery": ">=1.7" |
|||
} |
|||
}, |
|||
"node_modules/jquery": { |
|||
"version": "3.7.1", |
|||
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", |
|||
"integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" |
|||
}, |
|||
"node_modules/jquery-form": { |
|||
"version": "4.3.0", |
|||
"resolved": "https://registry.npmjs.org/jquery-form/-/jquery-form-4.3.0.tgz", |
|||
"integrity": "sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ==", |
|||
"dependencies": { |
|||
"jquery": ">=1.7.2" |
|||
} |
|||
}, |
|||
"node_modules/jquery-mousewheel": { |
|||
"version": "3.1.13", |
|||
"resolved": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz", |
|||
"integrity": "sha512-GXhSjfOPyDemM005YCEHvzrEALhKDIswtxSHSR2e4K/suHVJKJxxRCGz3skPjNxjJjQa9AVSGGlYjv1M3VLIPg==" |
|||
}, |
|||
"node_modules/jquery-validation": { |
|||
"version": "1.21.0", |
|||
"resolved": "https://registry.npmjs.org/jquery-validation/-/jquery-validation-1.21.0.tgz", |
|||
"integrity": "sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w==", |
|||
"peerDependencies": { |
|||
"jquery": "^1.7 || ^2.0 || ^3.1" |
|||
} |
|||
}, |
|||
"node_modules/jquery-validation-unobtrusive": { |
|||
"version": "4.0.0", |
|||
"resolved": "https://registry.npmjs.org/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz", |
|||
"integrity": "sha512-1ervYFFv6LX/rp7ktuLnMakHNG0piNRDyROI8Ir3hL1vPIwylAehB1AY3BPrYJnzW3WmwWryZq+Bz4sazZK9iQ==", |
|||
"dependencies": { |
|||
"jquery": "^3.6.0", |
|||
"jquery-validation": ">=1.19" |
|||
} |
|||
}, |
|||
"node_modules/just-compare": { |
|||
"version": "2.3.0", |
|||
"resolved": "https://registry.npmjs.org/just-compare/-/just-compare-2.3.0.tgz", |
|||
"integrity": "sha512-6shoR7HDT+fzfL3gBahx1jZG3hWLrhPAf+l7nCwahDdT9XDtosB9kIF0ZrzUp5QY8dJWfQVr5rnsPqsbvflDzg==" |
|||
}, |
|||
"node_modules/lodash": { |
|||
"version": "4.17.21", |
|||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", |
|||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" |
|||
}, |
|||
"node_modules/luxon": { |
|||
"version": "3.5.0", |
|||
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", |
|||
"integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", |
|||
"engines": { |
|||
"node": ">=12" |
|||
} |
|||
}, |
|||
"node_modules/malihu-custom-scrollbar-plugin": { |
|||
"version": "3.1.5", |
|||
"resolved": "https://registry.npmjs.org/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.5.tgz", |
|||
"integrity": "sha512-lwW3LgI+CNDMPnP4ED2la6oYxWMkCXlnhex+s2wuOLhFDFGnGmQuTQVdRK9bvDLpxs10sGlfErVufJy9ztfgJQ==", |
|||
"dependencies": { |
|||
"jquery-mousewheel": ">=3.0.6" |
|||
} |
|||
}, |
|||
"node_modules/moment": { |
|||
"version": "2.30.1", |
|||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", |
|||
"integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", |
|||
"engines": { |
|||
"node": "*" |
|||
} |
|||
}, |
|||
"node_modules/select2": { |
|||
"version": "4.0.13", |
|||
"resolved": "https://registry.npmjs.org/select2/-/select2-4.0.13.tgz", |
|||
"integrity": "sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw==" |
|||
}, |
|||
"node_modules/sweetalert2": { |
|||
"version": "11.14.5", |
|||
"resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.14.5.tgz", |
|||
"integrity": "sha512-8MWk5uc/r6bWhiJWkUXyEuApfXAhSCZT8FFX7pZXL7YwaPxq+9Ynhi2dUzWkOFn9jvLjKj22CXuccZ+IHcnjvQ==", |
|||
"funding": { |
|||
"type": "individual", |
|||
"url": "https://github.com/sponsors/limonte" |
|||
} |
|||
}, |
|||
"node_modules/timeago": { |
|||
"version": "1.6.7", |
|||
"resolved": "https://registry.npmjs.org/timeago/-/timeago-1.6.7.tgz", |
|||
"integrity": "sha512-FikcjN98+ij0siKH4VO4dZ358PR3oDDq4Vdl1+sN9gWz1/+JXGr3uZbUShYH/hL7bMhcTpPbplJU5Tej4b4jbQ==", |
|||
"dependencies": { |
|||
"jquery": ">=1.5.0 <4.0" |
|||
} |
|||
}, |
|||
"node_modules/toastr": { |
|||
"version": "2.1.4", |
|||
"resolved": "https://registry.npmjs.org/toastr/-/toastr-2.1.4.tgz", |
|||
"integrity": "sha512-LIy77F5n+sz4tefMmFOntcJ6HL0Fv3k1TDnNmFZ0bU/GcvIIfy6eG2v7zQmMiYgaalAiUv75ttFrPn5s0gyqlA==", |
|||
"dependencies": { |
|||
"jquery": ">=1.12.0" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1,9 +0,0 @@ |
|||
{ |
|||
"version": "1.0.0", |
|||
"name": "my-app", |
|||
"private": true, |
|||
"dependencies": { |
|||
"@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.0", |
|||
"@abp/aspnetcore.components.server.basictheme": "~9.0.0" |
|||
} |
|||
} |
|||
@ -1 +0,0 @@ |
|||
{"AdditionalData":{},"Alg":"RS256","Crv":null,"D":"EJxSLqek1F97IN_FQrqH6tHTXj96D1sWsdrAG09HT4GPrg_FJUYhSOL5LDRaSTg8j_o72Id9NnBWMlCFtEEhRqqTm8JcnkSYFFcOCWDCmwhkcgQuQi9JXDWFDgEcyDTvvn-XT2eszrUifnXfaLArM6LiHApEMv_Q3rUFhuHfPM-fBn5-r_oyvY8ISU-dHzD7c8EHCvfG8U8GsyEDUKBVjxyDLZa6awoq5jG0TlXgAH73zYrIdhNlSDVAaxH6fYRbLMe0sDBmM5PEuWAh5XKsaeOyeXi2VcB-5vGzBkw0GbtPdtCE0t9IE6BBMjJZcn3qS-D65b3zKM1KsD-B64yArQ","DP":"Hp93c--dv_2o00kZnlGDloIGgo3t6VEHf1vxOHBXNEW6TxIV91zvVk7O9nWG5Gf9FRCGkT6B-dKuUXkTvS6iLrcONxdvTtZVTgb8tb5-gZRiWhnfPg3gE-fM-Kg5zWtDfXA1TZOIrAc4nQxws5Fv0_l9R5Yx6EVqhADZwkHaNk8","DQ":"cmc0f_Hn8zMzHZOpg8lcdAPd8E-o3oAGPUI86ksDDQgjdJEMDedm_L5ozmlM_rl1wX93xCPn_5dlIQCkQ7ggKYigwSzdmubz_xqicpbuzWZKMy0n-uovFOcY9e-RBR9bmEY8_l_X7xQ0Mt2wTsbtxhJUKIRjEDH5U26rNIptvs8","E":"AQAB","K":null,"KeyId":"E69CCEFDB17CF66EB573EDE9F6C97D25","Kid":"E69CCEFDB17CF66EB573EDE9F6C97D25","Kty":"RSA","N":"wXZHBDkeQUD9VPrdffdLWwYPMts1Z0e_cKpsGURoOBbkdVoW4s4Gx41ySpcQxKcjc0ZfZGCHTHTcIlX8fJpjcVI4yv8-Zvb2WiGu8p2AshzR7qZAQWapTyfdlYypHoOo_Ovtkwn5GiguYuw0Kad2O4LgmuHBusHkuhHA8IzES9cl8biO1vuF2C7OZ7QGNOQURcJ0DCRMuhNhw4duek4Qv20X3q4FP-GEj3TBPU8WrRaXWdvvnE5uYbKHlktzO8i90N-4LcaafjF5ybJKfhO_yJLg4VrOMp6d8N0Vvp82KKpuPOdxw9PtlzTClGhEEwhB_OV65uHJtQ0OTo-6dlZBaQ","Oth":null,"P":"4qTn9VWJSITHggHRjan14c56MPySufpMn5F2zZjHusIP7HfVfG0-OMisdQrwLyYs9PlPpBi5f15Wj8guNL41_EcHx_Y9acWpzNZcl3dvc3bZEmwa8TOM_SJmTC8jDs3PKXo5lTrW5-oplKhseKzdm9XTzGiyvIhr0X55r60ZW-M","Q":"2oUdKMsP8BYh1a-i8LQk5fSZV9oqcLcK9IGDHnagq0W-Phh2WygM-8eqM-aRY3A2R5dvCqUG7Xv8z0EnIvGL_cR97ZVAYXJsdLZVJBmWVmS81oxl3D9QvtAqW3Z_dO09kwGNzdKMg_lefRujL8SkoW4159_p8vsFE52IRbMQB0M","QI":"xD4LuaygDVMFans9eqP38Vonv7bpWe5oDVJaPzFTscbiwURTERzv7WhIZKZdPCG01MRiwwXCcMWqCrGZpTmcqwZVaeREcEd11qmVfQYvZKj_-8s8kmIQzXipPlTUFEaoGLJ0ipUoymmkGDTGXurkwR_dTX_d43PwQq6eMWKpBP8","Use":null,"X":null,"X5t":null,"X5tS256":null,"X5u":null,"Y":null,"KeySize":2048,"HasPrivateKey":true,"CryptoProviderFactory":{"CryptoProviderCache":{},"CustomCryptoProvider":null,"CacheSignatureProviders":true,"SignatureProviderObjectPoolCacheSize":64}} |
|||
|
Before Width: | Height: | Size: 31 KiB |
@ -1,3 +0,0 @@ |
|||
body { |
|||
|
|||
} |
|||
@ -1,335 +0,0 @@ |
|||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. |
|||
# yarn lockfile v1 |
|||
|
|||
|
|||
"@abp/aspnetcore.components.server.basictheme@~9.0.0": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/aspnetcore.components.server.basictheme/-/aspnetcore.components.server.basictheme-9.0.1.tgz" |
|||
integrity sha512-9nRzZuHteVxUKwDdbKeOiU4j01S9lknZg+FpVeDGYnhJwLi6ssdyDvAi6uL8F+sWKhAh8JcmwfmPBqwzuwq9CQ== |
|||
dependencies: |
|||
"@abp/aspnetcore.components.server.theming" "~9.0.1" |
|||
|
|||
"@abp/aspnetcore.components.server.theming@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/aspnetcore.components.server.theming/-/aspnetcore.components.server.theming-9.0.1.tgz" |
|||
integrity sha512-PEvkCxlL+pYS6wdzIznghN+t0tIpr8ipuVK0zTFK4yFIFWDw+LzOPADGv1UcmlO7nxC6DGUxye5JatjX61Cocg== |
|||
dependencies: |
|||
"@abp/bootstrap" "~9.0.1" |
|||
"@abp/font-awesome" "~9.0.1" |
|||
|
|||
"@abp/aspnetcore.mvc.ui.theme.basic@~9.0.0": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.1.tgz" |
|||
integrity sha512-JaxuDH8WTnZYX6C7CX7ZVHfhTDR/SxfwRvtJaGGijSX8QKd1DXpfi9lYEF4Y9k5b48YT/0slBqU5g0sLmBd3+g== |
|||
dependencies: |
|||
"@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.1" |
|||
|
|||
"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.1.tgz" |
|||
integrity sha512-vrgRYKNctdZYhPCQ2I6Z10gUI1S5ynDj+DgnV7x7a7G/juuHaOSbkRXgwrmJsmYLfGA7KFCoJcbpER8mmXQeHQ== |
|||
dependencies: |
|||
"@abp/aspnetcore.mvc.ui" "~9.0.1" |
|||
"@abp/bootstrap" "~9.0.1" |
|||
"@abp/bootstrap-datepicker" "~9.0.1" |
|||
"@abp/bootstrap-daterangepicker" "~9.0.1" |
|||
"@abp/datatables.net-bs5" "~9.0.1" |
|||
"@abp/font-awesome" "~9.0.1" |
|||
"@abp/jquery-form" "~9.0.1" |
|||
"@abp/jquery-validation-unobtrusive" "~9.0.1" |
|||
"@abp/lodash" "~9.0.1" |
|||
"@abp/luxon" "~9.0.1" |
|||
"@abp/malihu-custom-scrollbar-plugin" "~9.0.1" |
|||
"@abp/moment" "~9.0.1" |
|||
"@abp/select2" "~9.0.1" |
|||
"@abp/sweetalert2" "~9.0.1" |
|||
"@abp/timeago" "~9.0.1" |
|||
"@abp/toastr" "~9.0.1" |
|||
|
|||
"@abp/aspnetcore.mvc.ui@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.1.tgz" |
|||
integrity sha512-KVbWCpBV7S1ViHYQP/hn4gSMzSiA2e8/zC0HND1fjE+1zXJqJyEWto1eg2DaKSOs/rmHD8WtFVMU4hCLQTCuIA== |
|||
dependencies: |
|||
ansi-colors "^4.1.3" |
|||
|
|||
"@abp/bootstrap-datepicker@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.1.tgz" |
|||
integrity sha512-LhgqBRr66x9gGTAyv1FuPAw8u8N77WQK2AfDkNgLueurM2+xMYQzH3pWWLhcN676/JXafxfALCfBoM8U7CfXLg== |
|||
dependencies: |
|||
bootstrap-datepicker "^1.10.0" |
|||
|
|||
"@abp/bootstrap-daterangepicker@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.1.tgz" |
|||
integrity sha512-SlBVgiYa75uQyaGt5EVjduren7Po5UP26A1tXEQQr0hDia1+1TK0qxmJ2YxjeJpB7FwtcmJiofv5fngvJqhxIA== |
|||
dependencies: |
|||
bootstrap-daterangepicker "^3.1.0" |
|||
|
|||
"@abp/bootstrap@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/bootstrap/-/bootstrap-9.0.1.tgz" |
|||
integrity sha512-uAfVNsUYSsRqgeO9JMnhJJlFoDmO3/lTvER/iYOqerF0X03KQnR8HZy2V3MD1D+fSh/4JuU6aAZFl6IQLinMKQ== |
|||
dependencies: |
|||
"@abp/core" "~9.0.1" |
|||
bootstrap "^5.3.3" |
|||
|
|||
"@abp/core@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/core/-/core-9.0.1.tgz" |
|||
integrity sha512-NWXDVCIJePbcKCrRvGxAlaA2MrOF2IZox37bQkW7/mTeOPpNoTa6lhowksNNcTpFq2YdD8bG0i0kfskkp3EZ2w== |
|||
dependencies: |
|||
"@abp/utils" "~9.0.1" |
|||
|
|||
"@abp/datatables.net-bs5@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.1.tgz" |
|||
integrity sha512-tAHdf4TBAS0bVRcvovDKS0OHFyeRSPYbiSIwDn8AIWzW9Weav31jhZ5jL3HEtBKVdb7zqUQ8/3dYPufjDuDdDA== |
|||
dependencies: |
|||
"@abp/datatables.net" "~9.0.1" |
|||
datatables.net-bs5 "^2.1.8" |
|||
|
|||
"@abp/datatables.net@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/datatables.net/-/datatables.net-9.0.1.tgz" |
|||
integrity sha512-JY53zVQPluRrBiKwtgk4gfSgD8VDs/VU8LWizhGCprXt3h9vXx0SQL4My6zvXVkv4hUjaq4+MYo84OI8EwFvsg== |
|||
dependencies: |
|||
"@abp/jquery" "~9.0.1" |
|||
datatables.net "^2.1.8" |
|||
|
|||
"@abp/font-awesome@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/font-awesome/-/font-awesome-9.0.1.tgz" |
|||
integrity sha512-7NnYBmk0plLVElUWR1zohul87vE9wKJItemWT5Kskf/IJirKOvXwSSu+7Jg1LmnVtIxcH6qgRpJMmzuAJgawnQ== |
|||
dependencies: |
|||
"@abp/core" "~9.0.1" |
|||
"@fortawesome/fontawesome-free" "^6.6.0" |
|||
|
|||
"@abp/jquery-form@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/jquery-form/-/jquery-form-9.0.1.tgz" |
|||
integrity sha512-9co0+Cver+RUSOpfuukSWQhR+TCnO9Dly4RTVRIKFksGVfN8hA70NqRrVxaASNNFv42ynK88FQK+2bLPswz/iw== |
|||
dependencies: |
|||
"@abp/jquery" "~9.0.1" |
|||
jquery-form "^4.3.0" |
|||
|
|||
"@abp/jquery-validation-unobtrusive@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.1.tgz" |
|||
integrity sha512-Zpz48wIFjq7eIApG/sEVjkfaJWZhcyCnlCtDf5eU3vvh82nRetbiCEAVLpZ4LVjorlyp3VvVAxReUSeeWflu8A== |
|||
dependencies: |
|||
"@abp/jquery-validation" "~9.0.1" |
|||
jquery-validation-unobtrusive "^4.0.0" |
|||
|
|||
"@abp/jquery-validation@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/jquery-validation/-/jquery-validation-9.0.1.tgz" |
|||
integrity sha512-uFSxiPMEkaPlcuyXIoKbeOIIRHo4IrgRbmnlHwI1uETrW60ENUdE2LJAVcYS77JROrjVtv8FPlaffWuva6sGeQ== |
|||
dependencies: |
|||
"@abp/jquery" "~9.0.1" |
|||
jquery-validation "^1.21.0" |
|||
|
|||
"@abp/jquery@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/jquery/-/jquery-9.0.1.tgz" |
|||
integrity sha512-z8EcnOveItAszbTsM9GFFDQSlcIg/ym6+WZME9uldLoetdxkmI9ij0knVeGj5eqMjQaHvTWwrVLObiBbZwYFWw== |
|||
dependencies: |
|||
"@abp/core" "~9.0.1" |
|||
jquery "~3.7.1" |
|||
|
|||
"@abp/lodash@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/lodash/-/lodash-9.0.1.tgz" |
|||
integrity sha512-D+/iOyh/O+jV80bK5vWxyn++IVmeRbZq/UaXanA4RKpzigxJUsgOiSD9lUj85BkfKn2YyFmoR39xwaAqkWoyRA== |
|||
dependencies: |
|||
"@abp/core" "~9.0.1" |
|||
lodash "^4.17.21" |
|||
|
|||
"@abp/luxon@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/luxon/-/luxon-9.0.1.tgz" |
|||
integrity sha512-1ZHXP5SGz05tQ1tzYmPcRiZwmkCKGX0KWFoV0zF3ATRaevzku9nXvSy7K6GIFkkgTb9f9XNx4/OBBF/GXkuRqw== |
|||
dependencies: |
|||
"@abp/core" "~9.0.1" |
|||
luxon "^3.5.0" |
|||
|
|||
"@abp/malihu-custom-scrollbar-plugin@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.1.tgz" |
|||
integrity sha512-GkKPLg9Z9UTTSSpW2hYZYZ9IgCvDSOYJmyRSl/h4fG8cWMgGCPVpv8MPPu0+WtIfwW/mT4SPX9X+sjUlRL5XRQ== |
|||
dependencies: |
|||
"@abp/core" "~9.0.1" |
|||
malihu-custom-scrollbar-plugin "^3.1.5" |
|||
|
|||
"@abp/moment@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/moment/-/moment-9.0.1.tgz" |
|||
integrity sha512-bTuCc7pi/DCtgz7t96UBU0wn9UGt4b50JhDCVeTKquh+gP1sgWoI5hyvEBkmgE4dcffO0yzZU2opHYTKYGl/OQ== |
|||
dependencies: |
|||
moment "^2.30.1" |
|||
|
|||
"@abp/select2@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/select2/-/select2-9.0.1.tgz" |
|||
integrity sha512-epyYJH2gAOU2UvGn5FD6372hbW3fL7uZIgGpvfgEfa+l6HPdlV9B1OweU2xkONNCoylShAcP/y8qf+bUh8WDEA== |
|||
dependencies: |
|||
"@abp/core" "~9.0.1" |
|||
select2 "^4.0.13" |
|||
|
|||
"@abp/sweetalert2@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/sweetalert2/-/sweetalert2-9.0.1.tgz" |
|||
integrity sha512-0RXR/lzy3qMJLisGUz4qrcA9Clu/Tt1ABGzB64ynG1t/l5XessQsIB5Hkt6MbSyOEsprRsq+ZtKH35CwTRPdAw== |
|||
dependencies: |
|||
"@abp/core" "~9.0.1" |
|||
sweetalert2 "^11.14.1" |
|||
|
|||
"@abp/timeago@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/timeago/-/timeago-9.0.1.tgz" |
|||
integrity sha512-dNfUQwilrY+JHxL5lwJ++ixYDGAs5lF1EDxKMQMIXD/ak5L8rkdLns8Otta7FhgDDny9UJ7XWQjYsG8ZxxybRQ== |
|||
dependencies: |
|||
"@abp/jquery" "~9.0.1" |
|||
timeago "^1.6.7" |
|||
|
|||
"@abp/toastr@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/toastr/-/toastr-9.0.1.tgz" |
|||
integrity sha512-10KuHnSJOxkvzqs6Aim6GJp8xBuT+TsZqBE1KaXQnERPawmOo4+ME28kA/7lq8fvgFUNO3K41T2uuA1GPHVQcg== |
|||
dependencies: |
|||
"@abp/jquery" "~9.0.1" |
|||
toastr "^2.1.4" |
|||
|
|||
"@abp/utils@~9.0.1": |
|||
version "9.0.1" |
|||
resolved "https://registry.npmjs.org/@abp/utils/-/utils-9.0.1.tgz" |
|||
integrity sha512-7eOKT0ciKNdtuASck1kifyc4dC6CeebgxV+rx/EAi3YwPMDkqie6YwLGUqKdGW2N/MZ15JuDR6gkuZxKHEb0NQ== |
|||
dependencies: |
|||
just-compare "^2.3.0" |
|||
|
|||
"@fortawesome/fontawesome-free@^6.6.0": |
|||
version "6.7.1" |
|||
resolved "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.1.tgz" |
|||
integrity sha512-ALIk/MOh5gYe1TG/ieS5mVUsk7VUIJTJKPMK9rFFqOgfp0Q3d5QiBXbcOMwUvs37fyZVCz46YjOE6IFeOAXCHA== |
|||
|
|||
ansi-colors@^4.1.3: |
|||
version "4.1.3" |
|||
resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" |
|||
integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== |
|||
|
|||
bootstrap-datepicker@^1.10.0: |
|||
version "1.10.0" |
|||
resolved "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.10.0.tgz" |
|||
integrity sha512-lWxtSYddAQOpbAO8UhYhHLcK6425eWoSjb5JDvZU3ePHEPF6A3eUr51WKaFy4PccU19JRxUG6wEU3KdhtKfvpg== |
|||
dependencies: |
|||
jquery ">=3.4.0 <4.0.0" |
|||
|
|||
bootstrap-daterangepicker@^3.1.0: |
|||
version "3.1.0" |
|||
resolved "https://registry.npmjs.org/bootstrap-daterangepicker/-/bootstrap-daterangepicker-3.1.0.tgz" |
|||
integrity sha512-oaQZx6ZBDo/dZNyXGVi2rx5GmFXThyQLAxdtIqjtLlYVaQUfQALl5JZMJJZzyDIX7blfy4ppZPAJ10g8Ma4d/g== |
|||
dependencies: |
|||
jquery ">=1.10" |
|||
moment "^2.9.0" |
|||
|
|||
bootstrap@^5.3.3: |
|||
version "5.3.3" |
|||
resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz" |
|||
integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== |
|||
|
|||
datatables.net-bs5@^2.1.8: |
|||
version "2.1.8" |
|||
resolved "https://registry.npmjs.org/datatables.net-bs5/-/datatables.net-bs5-2.1.8.tgz" |
|||
integrity sha512-YlGws8eI3iw/1AmKJH18+YMzm/UgGb6o9s14KAC24QT1/8anolm8GnVAgGcwUcvHm3hn1i8A5QXqgbqeMRINeg== |
|||
dependencies: |
|||
datatables.net "2.1.8" |
|||
jquery ">=1.7" |
|||
|
|||
datatables.net@2.1.8, datatables.net@^2.1.8: |
|||
version "2.1.8" |
|||
resolved "https://registry.npmjs.org/datatables.net/-/datatables.net-2.1.8.tgz" |
|||
integrity sha512-47ULt+U4bcjbuGTpTlT6SnCuSFVRBxxdWa6X3NfvTObBJ2BZU0o+JUIl05wQ6cABNIavjbAV51gpgvFsMHL9zA== |
|||
dependencies: |
|||
jquery ">=1.7" |
|||
|
|||
jquery-form@^4.3.0: |
|||
version "4.3.0" |
|||
resolved "https://registry.npmjs.org/jquery-form/-/jquery-form-4.3.0.tgz" |
|||
integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== |
|||
dependencies: |
|||
jquery ">=1.7.2" |
|||
|
|||
jquery-mousewheel@>=3.0.6: |
|||
version "3.1.13" |
|||
resolved "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz" |
|||
integrity sha512-GXhSjfOPyDemM005YCEHvzrEALhKDIswtxSHSR2e4K/suHVJKJxxRCGz3skPjNxjJjQa9AVSGGlYjv1M3VLIPg== |
|||
|
|||
jquery-validation-unobtrusive@^4.0.0: |
|||
version "4.0.0" |
|||
resolved "https://registry.npmjs.org/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz" |
|||
integrity sha512-1ervYFFv6LX/rp7ktuLnMakHNG0piNRDyROI8Ir3hL1vPIwylAehB1AY3BPrYJnzW3WmwWryZq+Bz4sazZK9iQ== |
|||
dependencies: |
|||
jquery "^3.6.0" |
|||
jquery-validation ">=1.19" |
|||
|
|||
jquery-validation@>=1.19, jquery-validation@^1.21.0: |
|||
version "1.21.0" |
|||
resolved "https://registry.npmjs.org/jquery-validation/-/jquery-validation-1.21.0.tgz" |
|||
integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w== |
|||
|
|||
jquery@>=1.10, jquery@>=1.12.0, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2, "jquery@>=3.4.0 <4.0.0", jquery@^3.6.0, jquery@~3.7.1: |
|||
version "3.7.1" |
|||
resolved "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz" |
|||
integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== |
|||
|
|||
just-compare@^2.3.0: |
|||
version "2.3.0" |
|||
resolved "https://registry.npmjs.org/just-compare/-/just-compare-2.3.0.tgz" |
|||
integrity sha512-6shoR7HDT+fzfL3gBahx1jZG3hWLrhPAf+l7nCwahDdT9XDtosB9kIF0ZrzUp5QY8dJWfQVr5rnsPqsbvflDzg== |
|||
|
|||
lodash@^4.17.21: |
|||
version "4.17.21" |
|||
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" |
|||
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== |
|||
|
|||
luxon@^3.5.0: |
|||
version "3.5.0" |
|||
resolved "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz" |
|||
integrity sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ== |
|||
|
|||
malihu-custom-scrollbar-plugin@^3.1.5: |
|||
version "3.1.5" |
|||
resolved "https://registry.npmjs.org/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.5.tgz" |
|||
integrity sha512-lwW3LgI+CNDMPnP4ED2la6oYxWMkCXlnhex+s2wuOLhFDFGnGmQuTQVdRK9bvDLpxs10sGlfErVufJy9ztfgJQ== |
|||
dependencies: |
|||
jquery-mousewheel ">=3.0.6" |
|||
|
|||
moment@^2.30.1, moment@^2.9.0: |
|||
version "2.30.1" |
|||
resolved "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz" |
|||
integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== |
|||
|
|||
select2@^4.0.13: |
|||
version "4.0.13" |
|||
resolved "https://registry.npmjs.org/select2/-/select2-4.0.13.tgz" |
|||
integrity sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw== |
|||
|
|||
sweetalert2@^11.14.1: |
|||
version "11.14.5" |
|||
resolved "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.14.5.tgz" |
|||
integrity sha512-8MWk5uc/r6bWhiJWkUXyEuApfXAhSCZT8FFX7pZXL7YwaPxq+9Ynhi2dUzWkOFn9jvLjKj22CXuccZ+IHcnjvQ== |
|||
|
|||
timeago@^1.6.7: |
|||
version "1.6.7" |
|||
resolved "https://registry.npmjs.org/timeago/-/timeago-1.6.7.tgz" |
|||
integrity sha512-FikcjN98+ij0siKH4VO4dZ358PR3oDDq4Vdl1+sN9gWz1/+JXGr3uZbUShYH/hL7bMhcTpPbplJU5Tej4b4jbQ== |
|||
dependencies: |
|||
jquery ">=1.5.0 <4.0" |
|||
|
|||
toastr@^2.1.4: |
|||
version "2.1.4" |
|||
resolved "https://registry.npmjs.org/toastr/-/toastr-2.1.4.tgz" |
|||
integrity sha512-LIy77F5n+sz4tefMmFOntcJ6HL0Fv3k1TDnNmFZ0bU/GcvIIfy6eG2v7zQmMiYgaalAiUv75ttFrPn5s0gyqlA== |
|||
dependencies: |
|||
jquery ">=1.12.0" |
|||
@ -1,53 +0,0 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<Import Project="..\..\common.props" /> |
|||
|
|||
<PropertyGroup> |
|||
<OutputType>Exe</OutputType> |
|||
<TargetFramework>net9.0</TargetFramework> |
|||
<UserSecretsId>BookStore-4681b4fd-151f-4221-84a4-929d86723e4c</UserSecretsId> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<None Remove="appsettings.json" /> |
|||
<Content Include="appsettings.json"> |
|||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> |
|||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> |
|||
</Content> |
|||
<None Remove="appsettings.secrets.json" /> |
|||
<Content Include="appsettings.secrets.json"> |
|||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> |
|||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> |
|||
</Content> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Microsoft.Data.SqlClient" /> |
|||
|
|||
<PackageReference Include="Serilog.Extensions.Logging" /> |
|||
<PackageReference Include="Serilog.Sinks.Async" /> |
|||
<PackageReference Include="Serilog.Sinks.File" /> |
|||
<PackageReference Include="Serilog.Sinks.Console" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Volo.Abp.Autofac" /> |
|||
<ProjectReference Include="..\BookStore.Application.Contracts\BookStore.Application.Contracts.csproj" /> |
|||
<ProjectReference Include="..\BookStore.EntityFrameworkCore\BookStore.EntityFrameworkCore.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<Compile Remove="Logs\**" /> |
|||
<Content Remove="Logs\**" /> |
|||
<EmbeddedResource Remove="Logs\**" /> |
|||
<None Remove="Logs\**" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<None Update="Properties\launchSettings.json"> |
|||
<ExcludeFromSingleFile>true</ExcludeFromSingleFile> |
|||
<CopyToPublishDirectory>Never</CopyToPublishDirectory> |
|||
</None> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -1,19 +0,0 @@ |
|||
using BookStore.EntityFrameworkCore; |
|||
using Volo.Abp.Autofac; |
|||
using Volo.Abp.BackgroundJobs; |
|||
using Volo.Abp.Modularity; |
|||
|
|||
namespace BookStore.DbMigrator; |
|||
|
|||
[DependsOn( |
|||
typeof(AbpAutofacModule), |
|||
typeof(BookStoreEntityFrameworkCoreModule), |
|||
typeof(BookStoreApplicationContractsModule) |
|||
)] |
|||
public class BookStoreDbMigratorModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
Configure<AbpBackgroundJobOptions>(options => options.IsJobExecutionEnabled = false); |
|||
} |
|||
} |
|||
@ -1,10 +0,0 @@ |
|||
{ |
|||
"profiles": { |
|||
"BookStore.DbMigrator": { |
|||
"commandName": "Project", |
|||
"environmentVariables": { |
|||
"DOTNET_ENVIRONMENT": "Development" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1,33 +0,0 @@ |
|||
{ |
|||
"ConnectionStrings": { |
|||
"Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=AntBlazorDemo;Trusted_Connection=True" |
|||
}, |
|||
"IdentityServer": { |
|||
"Clients": { |
|||
"BookStore_Web": { |
|||
"ClientId": "BookStore_Web", |
|||
"ClientSecret": "1q2w3e*", |
|||
"RootUrl": "https://localhost:44364" |
|||
}, |
|||
"BookStore_App": { |
|||
"ClientId": "BookStore_App", |
|||
"ClientSecret": "1q2w3e*", |
|||
"RootUrl": "http://localhost:4200" |
|||
}, |
|||
"BookStore_Blazor": { |
|||
"ClientId": "BookStore_Blazor", |
|||
"RootUrl": "https://localhost:44307" |
|||
}, |
|||
"BookStore_BlazorServerTiered": { |
|||
"ClientId": "BookStore_BlazorServerTiered", |
|||
"ClientSecret": "1q2w3e*", |
|||
"RootUrl": "https://localhost:44314" |
|||
}, |
|||
"BookStore_Swagger": { |
|||
"ClientId": "BookStore_Swagger", |
|||
"ClientSecret": "1q2w3e*", |
|||
"RootUrl": "https://localhost:44306" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1,2 +0,0 @@ |
|||
{ |
|||
} |
|||
@ -1 +0,0 @@ |
|||
{"AdditionalData":{},"Alg":"RS256","Crv":null,"D":"RQqr8Z8ir1NA_0eRG_JqM5joAE6Pt-fxInYHa1F10YI4LHzU9NBRK3-xqimQgBUZYQs_YsZWi4GVKg1fu4Zlj86iYLVv39dNMLLPK7gFyv3EzwT4Z3Fm_kddRyavOKPF8zku_lIhj45BEpVA0aCd4vd9e3WiV6l8_Ig3MYaA2xukt0MbuhoB9VvWCYeC3vTvsGGweAxrMVjtrmTorLR0EMC8uv9dEkentmmAd2_DI7lYHIbD58TKGa9oCNQIVPRryPtJoRmqNqd9wvXUk01mBNaSnuRap2VM_2XmNQZAaet5X8q02b9dGJOOrv82Ypc_o8enZhO6JKrD8B7M2k69cQ","DP":"Yzr8OPucm3GvZYdREv2_5cd1QbmLzyXBQJxu201e4ko3rP5SP-nNygG2Uh8DLHiyUgElL5NF-wrfXH7kvvPCbh5I1DVp_-FfU9nFT1_9nNaesWNyeJ2L1AdaQQ5KW0h3bhvm5lDtTLIX3VRrPdmSVEeWJb4ptwb15P0tlidmGTU","DQ":"KtvbqSOmGaZlNHWd6SyY0elBLQSQTBYRFqMNcwQO66vvqI0cg-9xg6sFBtTE66jQ_tqfjCAycr1FAoPgZtV47AG9-9bBthDNrhQ8UnFIbzLWk1z7NVcfycitI2BQRIo5Os6DJRbIOs4Z8G0XDP_IubVzHSi_iEQKa0Mm73h8HIs","E":"AQAB","K":null,"KeyId":"FF8EFB08BDDF8DB9A9746ED51EE4D47B","Kid":"FF8EFB08BDDF8DB9A9746ED51EE4D47B","Kty":"RSA","N":"l9vattvq0RJAbPLFo_7QzAeF3rhp5_CuZiGyIsl4I2X7PwmrZwsVTlRzJT9K5mA9gENc8iFqhO7JsmvKU5CFz024_fiDU9BpGCj24U2l6mEel-rkyOzYGN4cPKhQ01Bw6-NJyCD9x9e6LGNH_UNSIjT_cOwmvia8ugn_mkD5YYs_YQKa18Re0b1d1P5x_YofFdVfJB6t0mYtDBHbPqVVPCCOSRX0NkJ2bn7RLhs9TqiNbGhOWRQGj1wujiz73ab0szSJ-DZjR9n9qhzbkWeoQUZvihJuABTIQd_0_mWOVq30aFHfMgQHz8_Nd0BY4CKjLIBcSDtwOL5pmI1zix_PPQ","Oth":null,"P":"xgREcF60bc0bGsH1Eu6zxx-Xzpop8SO4JkU-5xrY2fQywRRetbcNk8WSbwJ9Jp1qk8l95Ki5kVms9r3cuBaVtTSrcd6nsaQLk8DG31F-3FEYLgmqIcSDR0Eq5AVDx_YLLq-sdLwqcrR4yQRaoCUK8WBJMFirpyS4nStIIPbpwhM","Q":"xFN_5ss4DBrRy_salfSMVCLEsD6mdJl5azy_2oXE-6Gngh3CABtLnobSIv7ncKtuDlf4iLNWWiQ_Vqxdc6R0DAAbcN3VZI1IAC1ro_xCEiF-BsF5FwjgnQpOH43ViVcVL65epgyDXZH4IukRu-CJ4ILHfF_HC7ZmKJMNDi3V028","QI":"mCMDSsxX8z7QAU_giIlKscCQVquPFT8coR_eqs4nu4DBnUbu1R5qYWIm0EQ00OhSEokiys__AxpJmb0NL5QH-UQJYHPcKIhJLkcfGQd2Rt_hGH54rw3bhRNMPwnekv_jkzqGKG9lf8hlA7Z3gMawztjU2zLnUMcuQy0AsQ0YWbs","Use":null,"X":null,"X5t":null,"X5tS256":null,"X5u":null,"Y":null,"KeySize":2048,"HasPrivateKey":true,"CryptoProviderFactory":{"CryptoProviderCache":{},"CustomCryptoProvider":null,"CacheSignatureProviders":true,"SignatureProviderObjectPoolCacheSize":64}} |
|||
@ -1,13 +0,0 @@ |
|||
{ |
|||
"KeyId": "f788zGVUZh9H-HbWL1S-Mg", |
|||
"Parameters": { |
|||
"D": "F19hbC5PLO872DszGiJnVoU55ee7XGXmNf0KEKndJ/uGBv5lWklXA0QF80h1ytWXde0jV5isQPB1t7mPhRQlDoDTkywLi1CeOgBPbxzHEfLjZZ5c4olfeX0IJX9BDqgUntY0H1a/+Om/eDu4OZUz3EIJFFZBgz46YZSyTT6ZDvAEdpC/o66sNJmxvJIp+8zVoVDSqBUzxmc+oEamXLg7r2jdymxJMxau1kQFxEGLOrJnNxGsEe8UrYA3qSsm8m/Xg4uOh7RYgnuEEt88+KTvRq+CAMWhN3YNLtOJ3NmXowwE7e1Ma+jih9+UVfxZn14P5+SOJbQ2bYV2sCV+2vBiCQ==", |
|||
"DP": "oPiGO/qdOQfFEAS9fMInQnsrNylIZVpDYEVoDJ6/jQfE/IpuwxGcmsaGvCob3SKxZiJRLCWpwJYo1hCh/JOSVGWMkVyELky56nbbkkV5ymKLSGZ4JoetdQs+GchnPdR+k2P9Ij1Kjk13ylubN3htzNhcBASJpOfSEv5pPVzGKX0=", |
|||
"DQ": "z6imxLABHkyftbfUUtpeOlPanEHgpuIjmUdp3T1Ju1jziE63UEhuj0GPAXOF17uYxixwYE8JhOJ7+TyIK9oZeI3zH2OzJqQh8f5PCQ/E+0ULXZDeNV/ShDLCTufu3Fis9Rt64uTp/H/l21oMQ79jc0ysa8DTz1ReJLRc5qjL41U=", |
|||
"Exponent": "AQAB", |
|||
"InverseQ": "ieZcvSt5XYukKJKhXpv5Dm/1RD7iH88cZnhLSTEVTMoOUHoYWmApY5pNLGahbfjA9bxnkBWDYex/i7wE9uNNY5CsA6ovUaQLVJDt3kHvR9W+9QtN8D6jjG2TuRbbOdEg4RqhfjUaDfDIgTJX2Wxc8U98FOvOyGw1HzwUPFZKecM=", |
|||
"Modulus": "vk4z1Bmtmbo+gxITcY+FIlXzcO2wTOGlOXK5GMYj/6PUMFt7lbqkc72AkPsrAo5/JE8LYLhWj7fzSKbjvtowHCz5m2t+FlUYmuiKpvvnJsTqvQrckNlbZ1nm071q5PhP3Dar/OksfBhPtAX+c3+NjDnM/w53ccJJNaBDO/s9JYoN7vH5n6ed1pMSK71hmg4MPsxChcnc1f1PpnG2mqyJ253+GEUbj/kRyeBSmCCr9aadov2ZzxIKVaFNagJEHOzanQmorSLpP25GfOHCuy27Zkef94V/qU9elzjbH4uIKslVGx5T6H99TYh0sUGu11NytYJa5WNAZWow95CzurC2vw==", |
|||
"P": "4GMCQy+XTNzR5TsgFcdAZv2K6TcQR13fHVvPoxQp/b32V5YUJOBFEUAtqociy5ro4+KzpXP5WPSk1ZtznGKuNZyLq8gTnhpB3rwd0sdo4zxKnQ5nu+n1UhlhWNxg5A9V5TaciUAyPrHWJfLoYTQWygNTgJELQH5zZXi2ihC2uiU=", |
|||
"Q": "2R36pamnLAJggkPJxiW5qH6HizZ+bkQVg0BBftMLzkAM8Y9CwTW75GRUzGEJFpMckkw0GZSYb1Uwl3DVUpkcQ8LZ91IPYdPpDlYUshhIxl184M55pnO14besKxJtMZ64zhHKVAR2pBMO0n6W4/1iBXkkQqyPViJxdfvXPJMBbhM=" |
|||
} |
|||
} |
|||
@ -1,58 +0,0 @@ |
|||
using BookStore.Localization; |
|||
using Volo.Abp.AuditLogging; |
|||
using Volo.Abp.BackgroundJobs; |
|||
using Volo.Abp.FeatureManagement; |
|||
using Volo.Abp.Identity; |
|||
using Volo.Abp.IdentityServer; |
|||
using Volo.Abp.Localization; |
|||
using Volo.Abp.Localization.ExceptionHandling; |
|||
using Volo.Abp.Modularity; |
|||
using Volo.Abp.PermissionManagement; |
|||
using Volo.Abp.SettingManagement; |
|||
using Volo.Abp.TenantManagement; |
|||
using Volo.Abp.Validation.Localization; |
|||
using Volo.Abp.VirtualFileSystem; |
|||
|
|||
namespace BookStore; |
|||
|
|||
[DependsOn( |
|||
typeof(AbpAuditLoggingDomainSharedModule), |
|||
typeof(AbpBackgroundJobsDomainSharedModule), |
|||
typeof(AbpFeatureManagementDomainSharedModule), |
|||
typeof(AbpIdentityDomainSharedModule), |
|||
typeof(AbpIdentityServerDomainSharedModule), |
|||
typeof(AbpPermissionManagementDomainSharedModule), |
|||
typeof(AbpSettingManagementDomainSharedModule), |
|||
typeof(AbpTenantManagementDomainSharedModule) |
|||
)] |
|||
public class BookStoreDomainSharedModule : AbpModule |
|||
{ |
|||
public override void PreConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
BookStoreGlobalFeatureConfigurator.Configure(); |
|||
BookStoreModuleExtensionConfigurator.Configure(); |
|||
} |
|||
|
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
Configure<AbpVirtualFileSystemOptions>(options => |
|||
{ |
|||
options.FileSets.AddEmbedded<BookStoreDomainSharedModule>(); |
|||
}); |
|||
|
|||
Configure<AbpLocalizationOptions>(options => |
|||
{ |
|||
options.Resources |
|||
.Add<BookStoreResource>("en") |
|||
.AddBaseTypes(typeof(AbpValidationResource)) |
|||
.AddVirtualJson("/Localization/BookStore"); |
|||
|
|||
options.DefaultResourceType = typeof(BookStoreResource); |
|||
}); |
|||
|
|||
Configure<AbpExceptionLocalizationOptions>(options => |
|||
{ |
|||
options.MapCodeNamespace("BookStore", typeof(BookStoreResource)); |
|||
}); |
|||
} |
|||
} |
|||
@ -1,82 +0,0 @@ |
|||
using BookStore.Identity; |
|||
using Volo.Abp.Identity; |
|||
using Volo.Abp.ObjectExtending; |
|||
using Volo.Abp.Threading; |
|||
|
|||
namespace BookStore; |
|||
|
|||
public static class BookStoreModuleExtensionConfigurator |
|||
{ |
|||
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); |
|||
|
|||
public static void Configure() |
|||
{ |
|||
OneTimeRunner.Run(() => |
|||
{ |
|||
ConfigureExistingProperties(); |
|||
ConfigureExtraProperties(); |
|||
}); |
|||
} |
|||
|
|||
private static void ConfigureExistingProperties() |
|||
{ |
|||
/* You can change max lengths for properties of the |
|||
* entities defined in the modules used by your application. |
|||
* |
|||
* Example: Change user and role name max lengths |
|||
|
|||
IdentityUserConsts.MaxNameLength = 99; |
|||
IdentityRoleConsts.MaxNameLength = 99; |
|||
|
|||
* Notice: It is not suggested to change property lengths |
|||
* unless you really need it. Go with the standard values wherever possible. |
|||
* |
|||
* If you are using EF Core, you will need to run the add-migration command after your changes. |
|||
*/ |
|||
} |
|||
|
|||
private static void ConfigureExtraProperties() |
|||
{ |
|||
/* You can configure extra properties for the |
|||
* entities defined in the modules used by your application. |
|||
* |
|||
* This class can be used to define these extra properties |
|||
* with a high level, easy to use API. |
|||
* |
|||
* Example: Add a new property to the user entity of the identity module |
|||
|
|||
ObjectExtensionManager.Instance.Modules() |
|||
.ConfigureIdentity(identity => |
|||
{ |
|||
identity.ConfigureUser(user => |
|||
{ |
|||
user.AddOrUpdateProperty<string>( //property type: string
|
|||
"SocialSecurityNumber", //property name
|
|||
property => |
|||
{ |
|||
//validation rules
|
|||
property.Attributes.Add(new RequiredAttribute()); |
|||
property.Attributes.Add(new StringLengthAttribute(64) {MinimumLength = 4}); |
|||
|
|||
//...other configurations for this property
|
|||
} |
|||
); |
|||
}); |
|||
}); |
|||
|
|||
* See the documentation for more: |
|||
* https://docs.abp.io/en/abp/latest/Module-Entity-Extensions
|
|||
*/ |
|||
|
|||
ObjectExtensionManager.Instance.Modules() |
|||
.ConfigureIdentity(identity => { |
|||
identity.ConfigureUser(user => |
|||
{ |
|||
user.AddOrUpdateProperty<IdentityUserType>("IdentityUserType", property => |
|||
{ |
|||
property.DefaultValue = IdentityUserType.Normal; |
|||
}); |
|||
}); |
|||
}); |
|||
} |
|||
} |
|||
@ -1,7 +0,0 @@ |
|||
namespace BookStore.Identity; |
|||
|
|||
public enum IdentityUserType |
|||
{ |
|||
Normal, |
|||
Basic |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "ar", |
|||
"texts": { |
|||
"Menu:Home": "الرئيسية", |
|||
"Welcome": "مرحبا", |
|||
"LongWelcomeMessage": "مرحبا بكم في التطبيق. هذا مشروع بدء تشغيل يعتمد على إطار عمل ABP. لمزيد من المعلومات ، يرجى زيارة abp.io." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "cs", |
|||
"texts": { |
|||
"Menu:Home": "Úvod", |
|||
"Welcome": "Vítejte", |
|||
"LongWelcomeMessage": "Vítejte v aplikaci. Toto je startovací projekt založený na ABP frameworku. Pro více informací, navštivte abp.io." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "de-DE", |
|||
"texts": { |
|||
"Menu:Home": "Home", |
|||
"Welcome": "Willkommen", |
|||
"LongWelcomeMessage": "Willkommen bei der Anwendung. Dies ist ein Startup-Projekt, das auf dem ABP-Framework basiert. Weitere Informationen finden Sie unter abp.io." |
|||
} |
|||
} |
|||
@ -1,11 +0,0 @@ |
|||
{ |
|||
"culture": "en", |
|||
"texts": { |
|||
"Menu:Home": "Home", |
|||
"Welcome": "Welcome", |
|||
"LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io.", |
|||
"IdentityUserType": "User Type", |
|||
"Enum:IdentityUserType.Normal": "Normal User", |
|||
"Enum:IdentityUserType.Basic": "Basic User" |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "es", |
|||
"texts": { |
|||
"Menu:Home": "Inicio", |
|||
"Welcome": "Bienvenido", |
|||
"LongWelcomeMessage": "Bienvenido a la aplicación, este es un proyecto base basado en el framework ABP. Para más información, visita abp.io." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "fi", |
|||
"texts": { |
|||
"Menu:Home": "Koti", |
|||
"Welcome": "Tervetuloa", |
|||
"LongWelcomeMessage": "Tervetuloa sovellukseen. Tämä on ABP-kehykseen perustuva käynnistysprojekti. Lisätietoja on osoitteessa abp.io." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "fr", |
|||
"texts": { |
|||
"Menu:Home": "Accueil", |
|||
"Welcome": "Bienvenue", |
|||
"LongWelcomeMessage": "Bienvenue dans l'application. Il s'agit d'un projet de démarrage basé sur le framework ABP. Pour plus d'informations, visitez abp.io." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "hi", |
|||
"texts": { |
|||
"Menu:Home": "घर", |
|||
"Welcome": "स्वागत हे", |
|||
"LongWelcomeMessage": "आवेदन करने के लिए आपका स्वागत है। यह एबीपी ढांचे पर आधारित एक स्टार्टअप परियोजना है। अधिक जानकारी के लिए, abp.io पर जाएं।" |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "hu", |
|||
"texts": { |
|||
"Menu:Home": "Kezdőlap", |
|||
"Welcome": "Üdvözlöm", |
|||
"LongWelcomeMessage": "Üdvözöljük az alkalmazásban. Ez egy ABP keretrendszeren alapuló startup projekt. További információkért látogasson el az abp.io oldalra." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "is", |
|||
"texts": { |
|||
"Menu:Home": "Heim", |
|||
"Welcome": "Velkomin", |
|||
"LongWelcomeMessage": "Verið velkomin í forritið. Þetta er startup verkefni sem byggir á ABP. Nánari upplýsingar er að finna á abp.io." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "it", |
|||
"texts": { |
|||
"Menu:Home": "Home", |
|||
"Welcome": "Benvenuto", |
|||
"LongWelcomeMessage": "Benvenuto nell'applicazione. Questo è un progetto di avvio basato sul framework ABP. Per ulteriori informazioni, visita abp.io." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "nl", |
|||
"texts": { |
|||
"Menu:Home": "Home", |
|||
"Welcome": "Welkom", |
|||
"LongWelcomeMessage": "Welkom bij de applicatie. Dit is een startup-project gebaseerd op het ABP-framework. Bezoek abp.io voor meer informatie." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "pl-PL", |
|||
"texts": { |
|||
"Menu:Home": "Home", |
|||
"Welcome": "Witaj", |
|||
"LongWelcomeMessage": "Witaj w aplikacji. To jest inicjalny projekt bazujący na ABP framework. Po więcej informacji odwiedź stronę abp.io." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "pt-BR", |
|||
"texts": { |
|||
"Menu:Home": "Principal", |
|||
"Welcome": "Seja bem-vindo!", |
|||
"LongWelcomeMessage": "Bem-vindo a esta aplicação. Este é um projeto inicial baseado no ABP framework. Para mais informações, visite abp.io." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "ro-RO", |
|||
"texts": { |
|||
"Menu:Home": "Acasă", |
|||
"Welcome": "Bun venit", |
|||
"LongWelcomeMessage": "Bun venit la aplicaţie. Acesta este un proiect de pornire bazat pe framework-ul ABP. Pentru mai multe informaţii, vizitaţi, visit abp.io." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "ru", |
|||
"texts": { |
|||
"Menu:Home": "Главная", |
|||
"Welcome": "Добро пожаловать", |
|||
"LongWelcomeMessage": "Добро пожаловать в приложение. Этот запущенный проект основан на фреймворке ABP. Для получения дополнительной информации посетите сайт abp.io." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "sk", |
|||
"texts": { |
|||
"Menu:Home": "Domov", |
|||
"Welcome": "Vitajte", |
|||
"LongWelcomeMessage": "Vitajte v aplikácii. Toto je štartovací projekt založený na ABP frameworku. Viac informácií nájdete na stránke abp.io." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "sl", |
|||
"texts": { |
|||
"Menu:Home": "Domov", |
|||
"Welcome": "Dobrodošli", |
|||
"LongWelcomeMessage": "Dobrodošli v aplikaciji. To je začetni projekt na osnovi okolja ABP. Za več informacij obiščite abp.io." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "tr", |
|||
"texts": { |
|||
"Menu:Home": "Ana sayfa", |
|||
"Welcome": "Hoşgeldiniz", |
|||
"LongWelcomeMessage": "Uygulamaya hoşgeldiniz. Bu, ABP framework'ü üzerine bina edilmiş bir başlangıç projesidir. Daha fazla bilgi için abp.io adresini ziyaret edebilirsiniz." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "vi", |
|||
"texts": { |
|||
"Menu:Home": "Trang chủ", |
|||
"Welcome": "Chào mừng bạn", |
|||
"LongWelcomeMessage": "Chào mừng bạn đến ứng dụng. Đây là một dự án khởi nghiệp dựa trên khung ABP. Để biết thêm thông tin, hãy truy cập abp.io." |
|||
} |
|||
} |
|||
@ -1,11 +0,0 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"Menu:Home": "首页", |
|||
"Welcome": "欢迎", |
|||
"LongWelcomeMessage": "欢迎来到该应用程序. 这是一个基于ABP框架的启动项目. 有关更多信息, 请访问 abp.io.", |
|||
"IdentityUserType": "用户类型", |
|||
"Enum:IdentityUserType.Normal": "标准用户", |
|||
"Enum:IdentityUserType.Basic": "基础用户" |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"culture": "zh-Hant", |
|||
"texts": { |
|||
"Menu:Home": "首頁", |
|||
"Welcome": "歡迎", |
|||
"LongWelcomeMessage": "歡迎來到此應用程式. 這是一個基於ABP框架的起始專案. 有關更多訊息, 請瀏覽 abp.io." |
|||
} |
|||
} |
|||
@ -1,8 +0,0 @@ |
|||
namespace BookStore; |
|||
|
|||
public static class BookStoreConsts |
|||
{ |
|||
public const string DbTablePrefix = "App"; |
|||
|
|||
public const string DbSchema = null; |
|||
} |
|||
@ -1,219 +0,0 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Diagnostics; |
|||
using System.IO; |
|||
using System.Linq; |
|||
using System.Runtime.InteropServices; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.Logging; |
|||
using Microsoft.Extensions.Logging.Abstractions; |
|||
using Volo.Abp.Data; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Identity; |
|||
using Volo.Abp.MultiTenancy; |
|||
using Volo.Abp.TenantManagement; |
|||
|
|||
namespace BookStore.Data; |
|||
|
|||
public class BookStoreDbMigrationService : ITransientDependency |
|||
{ |
|||
public ILogger<BookStoreDbMigrationService> Logger { get; set; } |
|||
|
|||
private readonly IDataSeeder _dataSeeder; |
|||
private readonly IEnumerable<IBookStoreDbSchemaMigrator> _dbSchemaMigrators; |
|||
private readonly ITenantRepository _tenantRepository; |
|||
private readonly ICurrentTenant _currentTenant; |
|||
|
|||
public BookStoreDbMigrationService( |
|||
IDataSeeder dataSeeder, |
|||
IEnumerable<IBookStoreDbSchemaMigrator> dbSchemaMigrators, |
|||
ITenantRepository tenantRepository, |
|||
ICurrentTenant currentTenant) |
|||
{ |
|||
_dataSeeder = dataSeeder; |
|||
_dbSchemaMigrators = dbSchemaMigrators; |
|||
_tenantRepository = tenantRepository; |
|||
_currentTenant = currentTenant; |
|||
|
|||
Logger = NullLogger<BookStoreDbMigrationService>.Instance; |
|||
} |
|||
|
|||
public async Task MigrateAsync() |
|||
{ |
|||
var initialMigrationAdded = AddInitialMigrationIfNotExist(); |
|||
|
|||
if (initialMigrationAdded) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
Logger.LogInformation("Started database migrations..."); |
|||
|
|||
await MigrateDatabaseSchemaAsync(); |
|||
await SeedDataAsync(); |
|||
|
|||
Logger.LogInformation($"Successfully completed host database migrations."); |
|||
|
|||
var tenants = await _tenantRepository.GetListAsync(includeDetails: true); |
|||
|
|||
var migratedDatabaseSchemas = new HashSet<string>(); |
|||
foreach (var tenant in tenants) |
|||
{ |
|||
using (_currentTenant.Change(tenant.Id)) |
|||
{ |
|||
if (tenant.ConnectionStrings.Any()) |
|||
{ |
|||
var tenantConnectionStrings = tenant.ConnectionStrings |
|||
.Select(x => x.Value) |
|||
.ToList(); |
|||
|
|||
if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings)) |
|||
{ |
|||
await MigrateDatabaseSchemaAsync(tenant); |
|||
|
|||
migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings); |
|||
} |
|||
} |
|||
|
|||
await SeedDataAsync(tenant); |
|||
} |
|||
|
|||
Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations."); |
|||
} |
|||
|
|||
Logger.LogInformation("Successfully completed all database migrations."); |
|||
Logger.LogInformation("You can safely end this process..."); |
|||
} |
|||
|
|||
private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) |
|||
{ |
|||
Logger.LogInformation( |
|||
$"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); |
|||
|
|||
foreach (var migrator in _dbSchemaMigrators) |
|||
{ |
|||
await migrator.MigrateAsync(); |
|||
} |
|||
} |
|||
|
|||
private async Task SeedDataAsync(Tenant tenant = null) |
|||
{ |
|||
Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); |
|||
|
|||
await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id) |
|||
.WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue) |
|||
.WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue) |
|||
); |
|||
} |
|||
|
|||
private bool AddInitialMigrationIfNotExist() |
|||
{ |
|||
try |
|||
{ |
|||
if (!DbMigrationsProjectExists()) |
|||
{ |
|||
return false; |
|||
} |
|||
} |
|||
catch (Exception) |
|||
{ |
|||
return false; |
|||
} |
|||
|
|||
try |
|||
{ |
|||
if (!MigrationsFolderExists()) |
|||
{ |
|||
AddInitialMigration(); |
|||
return true; |
|||
} |
|||
else |
|||
{ |
|||
return false; |
|||
} |
|||
} |
|||
catch (Exception e) |
|||
{ |
|||
Logger.LogWarning("Couldn't determinate if any migrations exist : " + e.Message); |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
private bool DbMigrationsProjectExists() |
|||
{ |
|||
var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); |
|||
|
|||
return dbMigrationsProjectFolder != null; |
|||
} |
|||
|
|||
private bool MigrationsFolderExists() |
|||
{ |
|||
var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); |
|||
|
|||
return Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "Migrations")); |
|||
} |
|||
|
|||
private void AddInitialMigration() |
|||
{ |
|||
Logger.LogInformation("Creating initial migration..."); |
|||
|
|||
string argumentPrefix; |
|||
string fileName; |
|||
|
|||
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) |
|||
{ |
|||
argumentPrefix = "-c"; |
|||
fileName = "/bin/bash"; |
|||
} |
|||
else |
|||
{ |
|||
argumentPrefix = "/C"; |
|||
fileName = "cmd.exe"; |
|||
} |
|||
|
|||
var procStartInfo = new ProcessStartInfo(fileName, |
|||
$"{argumentPrefix} \"abp create-migration-and-run-migrator \"{GetEntityFrameworkCoreProjectFolderPath()}\"\"" |
|||
); |
|||
|
|||
try |
|||
{ |
|||
Process.Start(procStartInfo); |
|||
} |
|||
catch (Exception) |
|||
{ |
|||
throw new Exception("Couldn't run ABP CLI..."); |
|||
} |
|||
} |
|||
|
|||
private string GetEntityFrameworkCoreProjectFolderPath() |
|||
{ |
|||
var slnDirectoryPath = GetSolutionDirectoryPath(); |
|||
|
|||
if (slnDirectoryPath == null) |
|||
{ |
|||
throw new Exception("Solution folder not found!"); |
|||
} |
|||
|
|||
var srcDirectoryPath = Path.Combine(slnDirectoryPath, "src"); |
|||
|
|||
return Directory.GetDirectories(srcDirectoryPath) |
|||
.FirstOrDefault(d => d.EndsWith(".EntityFrameworkCore")); |
|||
} |
|||
|
|||
private string GetSolutionDirectoryPath() |
|||
{ |
|||
var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); |
|||
|
|||
while (Directory.GetParent(currentDirectory.FullName) != null) |
|||
{ |
|||
currentDirectory = Directory.GetParent(currentDirectory.FullName); |
|||
|
|||
if (Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) |
|||
{ |
|||
return currentDirectory.FullName; |
|||
} |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
} |
|||
@ -1,306 +0,0 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using IdentityServer4.Models; |
|||
using Microsoft.Extensions.Configuration; |
|||
using Volo.Abp.Authorization.Permissions; |
|||
using Volo.Abp.Data; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Guids; |
|||
using Volo.Abp.IdentityServer.ApiResources; |
|||
using Volo.Abp.IdentityServer.ApiScopes; |
|||
using Volo.Abp.IdentityServer.Clients; |
|||
using Volo.Abp.IdentityServer.IdentityResources; |
|||
using Volo.Abp.MultiTenancy; |
|||
using Volo.Abp.PermissionManagement; |
|||
using Volo.Abp.Uow; |
|||
using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource; |
|||
using ApiScope = Volo.Abp.IdentityServer.ApiScopes.ApiScope; |
|||
using Client = Volo.Abp.IdentityServer.Clients.Client; |
|||
|
|||
namespace BookStore.IdentityServer; |
|||
|
|||
public class IdentityServerDataSeedContributor : IDataSeedContributor, ITransientDependency |
|||
{ |
|||
private readonly IApiResourceRepository _apiResourceRepository; |
|||
private readonly IApiScopeRepository _apiScopeRepository; |
|||
private readonly IClientRepository _clientRepository; |
|||
private readonly IIdentityResourceDataSeeder _identityResourceDataSeeder; |
|||
private readonly IGuidGenerator _guidGenerator; |
|||
private readonly IPermissionDataSeeder _permissionDataSeeder; |
|||
private readonly IConfiguration _configuration; |
|||
private readonly ICurrentTenant _currentTenant; |
|||
|
|||
public IdentityServerDataSeedContributor( |
|||
IClientRepository clientRepository, |
|||
IApiResourceRepository apiResourceRepository, |
|||
IApiScopeRepository apiScopeRepository, |
|||
IIdentityResourceDataSeeder identityResourceDataSeeder, |
|||
IGuidGenerator guidGenerator, |
|||
IPermissionDataSeeder permissionDataSeeder, |
|||
IConfiguration configuration, |
|||
ICurrentTenant currentTenant) |
|||
{ |
|||
_clientRepository = clientRepository; |
|||
_apiResourceRepository = apiResourceRepository; |
|||
_apiScopeRepository = apiScopeRepository; |
|||
_identityResourceDataSeeder = identityResourceDataSeeder; |
|||
_guidGenerator = guidGenerator; |
|||
_permissionDataSeeder = permissionDataSeeder; |
|||
_configuration = configuration; |
|||
_currentTenant = currentTenant; |
|||
} |
|||
|
|||
[UnitOfWork] |
|||
public virtual async Task SeedAsync(DataSeedContext context) |
|||
{ |
|||
using (_currentTenant.Change(context?.TenantId)) |
|||
{ |
|||
await _identityResourceDataSeeder.CreateStandardResourcesAsync(); |
|||
await CreateApiResourcesAsync(); |
|||
await CreateApiScopesAsync(); |
|||
await CreateClientsAsync(); |
|||
} |
|||
} |
|||
|
|||
private async Task CreateApiScopesAsync() |
|||
{ |
|||
await CreateApiScopeAsync("BookStore"); |
|||
} |
|||
|
|||
private async Task CreateApiResourcesAsync() |
|||
{ |
|||
var commonApiUserClaims = new[] |
|||
{ |
|||
"email", |
|||
"email_verified", |
|||
"name", |
|||
"phone_number", |
|||
"phone_number_verified", |
|||
"role" |
|||
}; |
|||
|
|||
await CreateApiResourceAsync("BookStore", commonApiUserClaims); |
|||
} |
|||
|
|||
private async Task<ApiResource> CreateApiResourceAsync(string name, IEnumerable<string> claims) |
|||
{ |
|||
var apiResource = await _apiResourceRepository.FindByNameAsync(name); |
|||
if (apiResource == null) |
|||
{ |
|||
apiResource = await _apiResourceRepository.InsertAsync( |
|||
new ApiResource( |
|||
_guidGenerator.Create(), |
|||
name, |
|||
name + " API" |
|||
), |
|||
autoSave: true |
|||
); |
|||
} |
|||
|
|||
foreach (var claim in claims) |
|||
{ |
|||
if (apiResource.FindClaim(claim) == null) |
|||
{ |
|||
apiResource.AddUserClaim(claim); |
|||
} |
|||
} |
|||
|
|||
return await _apiResourceRepository.UpdateAsync(apiResource); |
|||
} |
|||
|
|||
private async Task<ApiScope> CreateApiScopeAsync(string name) |
|||
{ |
|||
var apiScope = await _apiScopeRepository.FindByNameAsync(name); |
|||
if (apiScope == null) |
|||
{ |
|||
apiScope = await _apiScopeRepository.InsertAsync( |
|||
new ApiScope( |
|||
_guidGenerator.Create(), |
|||
name, |
|||
name + " API" |
|||
), |
|||
autoSave: true |
|||
); |
|||
} |
|||
|
|||
return apiScope; |
|||
} |
|||
|
|||
private async Task CreateClientsAsync() |
|||
{ |
|||
var commonScopes = new[] |
|||
{ |
|||
"email", |
|||
"openid", |
|||
"profile", |
|||
"role", |
|||
"phone", |
|||
"address", |
|||
"BookStore" |
|||
}; |
|||
|
|||
var configurationSection = _configuration.GetSection("IdentityServer:Clients"); |
|||
|
|||
|
|||
//Console Test / Angular Client
|
|||
var consoleAndAngularClientId = configurationSection["BookStore_App:ClientId"]; |
|||
if (!consoleAndAngularClientId.IsNullOrWhiteSpace()) |
|||
{ |
|||
var webClientRootUrl = configurationSection["BookStore_App:RootUrl"]?.TrimEnd('/'); |
|||
|
|||
await CreateClientAsync( |
|||
name: consoleAndAngularClientId, |
|||
scopes: commonScopes, |
|||
grantTypes: new[] { "password", "client_credentials", "authorization_code" }, |
|||
secret: (configurationSection["BookStore_App:ClientSecret"] ?? "1q2w3e*").Sha256(), |
|||
requireClientSecret: false, |
|||
redirectUri: webClientRootUrl, |
|||
postLogoutRedirectUri: webClientRootUrl, |
|||
corsOrigins: new[] { webClientRootUrl.RemovePostFix("/") } |
|||
); |
|||
} |
|||
|
|||
|
|||
// Blazor Client
|
|||
var blazorClientId = configurationSection["BookStore_Blazor:ClientId"]; |
|||
if (!blazorClientId.IsNullOrWhiteSpace()) |
|||
{ |
|||
var blazorRootUrl = configurationSection["BookStore_Blazor:RootUrl"].TrimEnd('/'); |
|||
|
|||
await CreateClientAsync( |
|||
name: blazorClientId, |
|||
scopes: commonScopes, |
|||
grantTypes: new[] { "authorization_code" }, |
|||
secret: configurationSection["BookStore_Blazor:ClientSecret"]?.Sha256(), |
|||
requireClientSecret: false, |
|||
redirectUri: $"{blazorRootUrl}/authentication/login-callback", |
|||
postLogoutRedirectUri: $"{blazorRootUrl}/authentication/logout-callback", |
|||
corsOrigins: new[] { blazorRootUrl.RemovePostFix("/") } |
|||
); |
|||
} |
|||
|
|||
|
|||
|
|||
// Swagger Client
|
|||
var swaggerClientId = configurationSection["BookStore_Swagger:ClientId"]; |
|||
if (!swaggerClientId.IsNullOrWhiteSpace()) |
|||
{ |
|||
var swaggerRootUrl = configurationSection["BookStore_Swagger:RootUrl"].TrimEnd('/'); |
|||
|
|||
await CreateClientAsync( |
|||
name: swaggerClientId, |
|||
scopes: commonScopes, |
|||
grantTypes: new[] { "authorization_code" }, |
|||
secret: configurationSection["BookStore_Swagger:ClientSecret"]?.Sha256(), |
|||
requireClientSecret: false, |
|||
redirectUri: $"{swaggerRootUrl}/swagger/oauth2-redirect.html", |
|||
corsOrigins: new[] { swaggerRootUrl.RemovePostFix("/") } |
|||
); |
|||
} |
|||
} |
|||
|
|||
private async Task<Client> CreateClientAsync( |
|||
string name, |
|||
IEnumerable<string> scopes, |
|||
IEnumerable<string> grantTypes, |
|||
string secret = null, |
|||
string redirectUri = null, |
|||
string postLogoutRedirectUri = null, |
|||
string frontChannelLogoutUri = null, |
|||
bool requireClientSecret = true, |
|||
bool requirePkce = false, |
|||
IEnumerable<string> permissions = null, |
|||
IEnumerable<string> corsOrigins = null) |
|||
{ |
|||
var client = await _clientRepository.FindByClientIdAsync(name); |
|||
if (client == null) |
|||
{ |
|||
client = await _clientRepository.InsertAsync( |
|||
new Client( |
|||
_guidGenerator.Create(), |
|||
name |
|||
) |
|||
{ |
|||
ClientName = name, |
|||
ProtocolType = "oidc", |
|||
Description = name, |
|||
AlwaysIncludeUserClaimsInIdToken = true, |
|||
AllowOfflineAccess = true, |
|||
AbsoluteRefreshTokenLifetime = 31536000, //365 days
|
|||
AccessTokenLifetime = 31536000, //365 days
|
|||
AuthorizationCodeLifetime = 300, |
|||
IdentityTokenLifetime = 300, |
|||
RequireConsent = false, |
|||
FrontChannelLogoutUri = frontChannelLogoutUri, |
|||
RequireClientSecret = requireClientSecret, |
|||
RequirePkce = requirePkce |
|||
}, |
|||
autoSave: true |
|||
); |
|||
} |
|||
|
|||
foreach (var scope in scopes) |
|||
{ |
|||
if (client.FindScope(scope) == null) |
|||
{ |
|||
client.AddScope(scope); |
|||
} |
|||
} |
|||
|
|||
foreach (var grantType in grantTypes) |
|||
{ |
|||
if (client.FindGrantType(grantType) == null) |
|||
{ |
|||
client.AddGrantType(grantType); |
|||
} |
|||
} |
|||
|
|||
if (!secret.IsNullOrEmpty()) |
|||
{ |
|||
if (client.FindSecret(secret) == null) |
|||
{ |
|||
client.AddSecret(secret); |
|||
} |
|||
} |
|||
|
|||
if (redirectUri != null) |
|||
{ |
|||
if (client.FindRedirectUri(redirectUri) == null) |
|||
{ |
|||
client.AddRedirectUri(redirectUri); |
|||
} |
|||
} |
|||
|
|||
if (postLogoutRedirectUri != null) |
|||
{ |
|||
if (client.FindPostLogoutRedirectUri(postLogoutRedirectUri) == null) |
|||
{ |
|||
client.AddPostLogoutRedirectUri(postLogoutRedirectUri); |
|||
} |
|||
} |
|||
|
|||
if (permissions != null) |
|||
{ |
|||
await _permissionDataSeeder.SeedAsync( |
|||
ClientPermissionValueProvider.ProviderName, |
|||
name, |
|||
permissions, |
|||
null |
|||
); |
|||
} |
|||
|
|||
if (corsOrigins != null) |
|||
{ |
|||
foreach (var origin in corsOrigins) |
|||
{ |
|||
if (!origin.IsNullOrWhiteSpace() && client.FindCorsOrigin(origin) == null) |
|||
{ |
|||
client.AddCorsOrigin(origin); |
|||
} |
|||
} |
|||
} |
|||
|
|||
return await _clientRepository.UpdateAsync(client); |
|||
} |
|||
} |
|||
@ -1,30 +0,0 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<Import Project="..\..\common.props" /> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net9.0</TargetFramework> |
|||
<RootNamespace>BookStore</RootNamespace> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\BookStore.Domain\BookStore.Domain.csproj" /> |
|||
<PackageReference Include="Volo.Abp.EntityFrameworkCore.SqlServer" /> |
|||
<PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" /> |
|||
<PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" /> |
|||
<PackageReference Include="Volo.Abp.Identity.EntityFrameworkCore" /> |
|||
<PackageReference Include="Volo.Abp.IdentityServer.EntityFrameworkCore" /> |
|||
<PackageReference Include="Volo.Abp.BackgroundJobs.EntityFrameworkCore" /> |
|||
<PackageReference Include="Volo.Abp.AuditLogging.EntityFrameworkCore" /> |
|||
<PackageReference Include="Volo.Abp.TenantManagement.EntityFrameworkCore" /> |
|||
<PackageReference Include="Volo.Abp.FeatureManagement.EntityFrameworkCore" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools"> |
|||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> |
|||
<PrivateAssets>compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native</PrivateAssets> |
|||
</PackageReference> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -1,87 +0,0 @@ |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Volo.Abp.AuditLogging.EntityFrameworkCore; |
|||
using Volo.Abp.BackgroundJobs.EntityFrameworkCore; |
|||
using Volo.Abp.Data; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.EntityFrameworkCore; |
|||
using Volo.Abp.FeatureManagement.EntityFrameworkCore; |
|||
using Volo.Abp.Identity; |
|||
using Volo.Abp.Identity.EntityFrameworkCore; |
|||
using Volo.Abp.IdentityServer.EntityFrameworkCore; |
|||
using Volo.Abp.PermissionManagement.EntityFrameworkCore; |
|||
using Volo.Abp.SettingManagement.EntityFrameworkCore; |
|||
using Volo.Abp.TenantManagement; |
|||
using Volo.Abp.TenantManagement.EntityFrameworkCore; |
|||
|
|||
namespace BookStore.EntityFrameworkCore; |
|||
|
|||
[ReplaceDbContext(typeof(IIdentityDbContext))] |
|||
[ReplaceDbContext(typeof(ITenantManagementDbContext))] |
|||
[ConnectionStringName("Default")] |
|||
public class BookStoreDbContext : |
|||
AbpDbContext<BookStoreDbContext>, |
|||
IIdentityDbContext, |
|||
ITenantManagementDbContext |
|||
{ |
|||
/* Add DbSet properties for your Aggregate Roots / Entities here. */ |
|||
|
|||
#region Entities from the modules
|
|||
|
|||
/* Notice: We only implemented IIdentityDbContext and ITenantManagementDbContext |
|||
* and replaced them for this DbContext. This allows you to perform JOIN |
|||
* queries for the entities of these modules over the repositories easily. You |
|||
* typically don't need that for other modules. But, if you need, you can |
|||
* implement the DbContext interface of the needed module and use ReplaceDbContext |
|||
* attribute just like IIdentityDbContext and ITenantManagementDbContext. |
|||
* |
|||
* More info: Replacing a DbContext of a module ensures that the related module |
|||
* uses this DbContext on runtime. Otherwise, it will use its own DbContext class. |
|||
*/ |
|||
|
|||
//Identity
|
|||
public DbSet<IdentityUser> Users { get; set; } |
|||
public DbSet<IdentityRole> Roles { get; set; } |
|||
public DbSet<IdentityClaimType> ClaimTypes { get; set; } |
|||
public DbSet<OrganizationUnit> OrganizationUnits { get; set; } |
|||
public DbSet<IdentitySecurityLog> SecurityLogs { get; set; } |
|||
public DbSet<IdentityLinkUser> LinkUsers { get; set; } |
|||
public DbSet<IdentityUserDelegation> UserDelegations { get; set;} |
|||
public DbSet<IdentitySession> Sessions { get; set; } |
|||
|
|||
// Tenant Management
|
|||
public DbSet<Tenant> Tenants { get; set; } |
|||
public DbSet<TenantConnectionString> TenantConnectionStrings { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
public BookStoreDbContext(DbContextOptions<BookStoreDbContext> options) |
|||
: base(options) |
|||
{ |
|||
|
|||
} |
|||
|
|||
protected override void OnModelCreating(ModelBuilder builder) |
|||
{ |
|||
base.OnModelCreating(builder); |
|||
|
|||
/* Include modules to your migration db context */ |
|||
|
|||
builder.ConfigurePermissionManagement(); |
|||
builder.ConfigureSettingManagement(); |
|||
builder.ConfigureBackgroundJobs(); |
|||
builder.ConfigureAuditLogging(); |
|||
builder.ConfigureIdentity(); |
|||
builder.ConfigureIdentityServer(); |
|||
builder.ConfigureFeatureManagement(); |
|||
builder.ConfigureTenantManagement(); |
|||
|
|||
/* Configure your own tables/entities inside here */ |
|||
|
|||
//builder.Entity<YourEntity>(b =>
|
|||
//{
|
|||
// b.ToTable(BookStoreConsts.DbTablePrefix + "YourEntities", BookStoreConsts.DbSchema);
|
|||
// b.ConfigureByConvention(); //auto configure for the base class props
|
|||
// //...
|
|||
//});
|
|||
} |
|||
} |
|||
@ -1,32 +0,0 @@ |
|||
using System.IO; |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Microsoft.EntityFrameworkCore.Design; |
|||
using Microsoft.Extensions.Configuration; |
|||
|
|||
namespace BookStore.EntityFrameworkCore; |
|||
|
|||
/* This class is needed for EF Core console commands |
|||
* (like Add-Migration and Update-Database commands) */ |
|||
public class BookStoreDbContextFactory : IDesignTimeDbContextFactory<BookStoreDbContext> |
|||
{ |
|||
public BookStoreDbContext CreateDbContext(string[] args) |
|||
{ |
|||
BookStoreEfCoreEntityExtensionMappings.Configure(); |
|||
|
|||
var configuration = BuildConfiguration(); |
|||
|
|||
var builder = new DbContextOptionsBuilder<BookStoreDbContext>() |
|||
.UseSqlServer(configuration.GetConnectionString("Default")); |
|||
|
|||
return new BookStoreDbContext(builder.Options); |
|||
} |
|||
|
|||
private static IConfigurationRoot BuildConfiguration() |
|||
{ |
|||
var builder = new ConfigurationBuilder() |
|||
.SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../BookStore.DbMigrator/")) |
|||
.AddJsonFile("appsettings.json", optional: false); |
|||
|
|||
return builder.Build(); |
|||
} |
|||
} |
|||
@ -1,44 +0,0 @@ |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Volo.Abp.Identity; |
|||
using Volo.Abp.ObjectExtending; |
|||
using Volo.Abp.Threading; |
|||
|
|||
namespace BookStore.EntityFrameworkCore; |
|||
|
|||
public static class BookStoreEfCoreEntityExtensionMappings |
|||
{ |
|||
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); |
|||
|
|||
public static void Configure() |
|||
{ |
|||
BookStoreGlobalFeatureConfigurator.Configure(); |
|||
BookStoreModuleExtensionConfigurator.Configure(); |
|||
|
|||
OneTimeRunner.Run(() => |
|||
{ |
|||
/* You can configure extra properties for the |
|||
* entities defined in the modules used by your application. |
|||
* |
|||
* This class can be used to map these extra properties to table fields in the database. |
|||
* |
|||
* USE THIS CLASS ONLY TO CONFIGURE EF CORE RELATED MAPPING. |
|||
* USE BookStoreModuleExtensionConfigurator CLASS (in the Domain.Shared project) |
|||
* FOR A HIGH LEVEL API TO DEFINE EXTRA PROPERTIES TO ENTITIES OF THE USED MODULES |
|||
* |
|||
* Example: Map a property to a table field: |
|||
|
|||
ObjectExtensionManager.Instance |
|||
.MapEfCoreProperty<IdentityUser, string>( |
|||
"MyProperty", |
|||
(entityBuilder, propertyBuilder) => |
|||
{ |
|||
propertyBuilder.HasMaxLength(128); |
|||
} |
|||
); |
|||
|
|||
* See the documentation for more: |
|||
* https://docs.abp.io/en/abp/latest/Customizing-Application-Modules-Extending-Entities
|
|||
*/ |
|||
}); |
|||
} |
|||
} |
|||
@ -1,51 +0,0 @@ |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Volo.Abp.AuditLogging.EntityFrameworkCore; |
|||
using Volo.Abp.BackgroundJobs.EntityFrameworkCore; |
|||
using Volo.Abp.EntityFrameworkCore; |
|||
using Volo.Abp.EntityFrameworkCore.SqlServer; |
|||
using Volo.Abp.FeatureManagement.EntityFrameworkCore; |
|||
using Volo.Abp.Identity.EntityFrameworkCore; |
|||
using Volo.Abp.IdentityServer.EntityFrameworkCore; |
|||
using Volo.Abp.Modularity; |
|||
using Volo.Abp.PermissionManagement.EntityFrameworkCore; |
|||
using Volo.Abp.SettingManagement.EntityFrameworkCore; |
|||
using Volo.Abp.TenantManagement.EntityFrameworkCore; |
|||
|
|||
namespace BookStore.EntityFrameworkCore; |
|||
|
|||
[DependsOn( |
|||
typeof(BookStoreDomainModule), |
|||
typeof(AbpIdentityEntityFrameworkCoreModule), |
|||
typeof(AbpIdentityServerEntityFrameworkCoreModule), |
|||
typeof(AbpPermissionManagementEntityFrameworkCoreModule), |
|||
typeof(AbpSettingManagementEntityFrameworkCoreModule), |
|||
typeof(AbpEntityFrameworkCoreSqlServerModule), |
|||
typeof(AbpBackgroundJobsEntityFrameworkCoreModule), |
|||
typeof(AbpAuditLoggingEntityFrameworkCoreModule), |
|||
typeof(AbpTenantManagementEntityFrameworkCoreModule), |
|||
typeof(AbpFeatureManagementEntityFrameworkCoreModule) |
|||
)] |
|||
public class BookStoreEntityFrameworkCoreModule : AbpModule |
|||
{ |
|||
public override void PreConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
BookStoreEfCoreEntityExtensionMappings.Configure(); |
|||
} |
|||
|
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
context.Services.AddAbpDbContext<BookStoreDbContext>(options => |
|||
{ |
|||
/* Remove "includeAllEntities: true" to create |
|||
* default repositories only for aggregate roots */ |
|||
options.AddDefaultRepositories(includeAllEntities: true); |
|||
}); |
|||
|
|||
Configure<AbpDbContextOptions>(options => |
|||
{ |
|||
/* The main point to change your DBMS. |
|||
* See also BookStoreMigrationsDbContextFactory for EF Core tooling. */ |
|||
options.UseSqlServer(); |
|||
}); |
|||
} |
|||
} |
|||
@ -1,34 +0,0 @@ |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using BookStore.Data; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace BookStore.EntityFrameworkCore; |
|||
|
|||
public class EntityFrameworkCoreBookStoreDbSchemaMigrator |
|||
: IBookStoreDbSchemaMigrator, ITransientDependency |
|||
{ |
|||
private readonly IServiceProvider _serviceProvider; |
|||
|
|||
public EntityFrameworkCoreBookStoreDbSchemaMigrator( |
|||
IServiceProvider serviceProvider) |
|||
{ |
|||
_serviceProvider = serviceProvider; |
|||
} |
|||
|
|||
public async Task MigrateAsync() |
|||
{ |
|||
/* We intentionally resolving the BookStoreDbContext |
|||
* from IServiceProvider (instead of directly injecting it) |
|||
* to properly get the connection string of the current tenant in the |
|||
* current scope. |
|||
*/ |
|||
|
|||
await _serviceProvider |
|||
.GetRequiredService<BookStoreDbContext>() |
|||
.Database |
|||
.MigrateAsync(); |
|||
} |
|||
} |
|||
File diff suppressed because it is too large
File diff suppressed because it is too large
File diff suppressed because it is too large
@ -1,2 +0,0 @@ |
|||
using System.Runtime.CompilerServices; |
|||
[assembly:InternalsVisibleToAttribute("BookStore.EntityFrameworkCore.Tests")] |
|||
@ -1,39 +0,0 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk.Web"> |
|||
|
|||
<Import Project="..\..\common.props" /> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net9.0</TargetFramework> |
|||
<RootNamespace>BookStore</RootNamespace> |
|||
<PreserveCompilationReferences>true</PreserveCompilationReferences> |
|||
<UserSecretsId>BookStore-4681b4fd-151f-4221-84a4-929d86723e4c</UserSecretsId> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Microsoft.Data.SqlClient" /> |
|||
|
|||
<PackageReference Include="Serilog.AspNetCore" /> |
|||
<PackageReference Include="Serilog.Sinks.Async" /> |
|||
<PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" /> |
|||
<PackageReference Include="Volo.Abp.Autofac" /> |
|||
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic" /> |
|||
<PackageReference Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" /> |
|||
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" /> |
|||
<PackageReference Include="Volo.Abp.Swashbuckle" /> |
|||
<PackageReference Include="Volo.Abp.Account.Web.IdentityServer" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\BookStore.Application\BookStore.Application.csproj" /> |
|||
<ProjectReference Include="..\BookStore.EntityFrameworkCore\BookStore.EntityFrameworkCore.csproj" /> |
|||
<ProjectReference Include="..\BookStore.HttpApi\BookStore.HttpApi.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<Compile Remove="Logs\**" /> |
|||
<Content Remove="Logs\**" /> |
|||
<EmbeddedResource Remove="Logs\**" /> |
|||
<None Remove="Logs\**" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -1,10 +0,0 @@ |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Ui.Branding; |
|||
|
|||
namespace BookStore; |
|||
|
|||
[Dependency(ReplaceServices = true)] |
|||
public class BookStoreBrandingProvider : DefaultBrandingProvider |
|||
{ |
|||
public override string AppName => "BookStore"; |
|||
} |
|||
@ -1,250 +0,0 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.IO; |
|||
using System.Linq; |
|||
using System.Net.Http; |
|||
using Microsoft.AspNetCore.Builder; |
|||
using Microsoft.AspNetCore.Cors; |
|||
using Microsoft.Extensions.Configuration; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Microsoft.Extensions.Hosting; |
|||
using BookStore.EntityFrameworkCore; |
|||
using BookStore.MultiTenancy; |
|||
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; |
|||
using Microsoft.OpenApi.Models; |
|||
using Volo.Abp; |
|||
using Volo.Abp.Account; |
|||
using Volo.Abp.Account.Web; |
|||
using Volo.Abp.AspNetCore.Authentication.JwtBearer; |
|||
using Volo.Abp.AspNetCore.MultiTenancy; |
|||
using Volo.Abp.AspNetCore.Mvc; |
|||
using Volo.Abp.AspNetCore.Mvc.UI.Bundling; |
|||
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.Localization; |
|||
using Volo.Abp.Modularity; |
|||
using Volo.Abp.Swashbuckle; |
|||
using Volo.Abp.UI.Navigation.Urls; |
|||
using Volo.Abp.VirtualFileSystem; |
|||
|
|||
namespace BookStore; |
|||
|
|||
[DependsOn( |
|||
typeof(BookStoreHttpApiModule), |
|||
typeof(AbpAutofacModule), |
|||
typeof(AbpAspNetCoreMultiTenancyModule), |
|||
typeof(BookStoreApplicationModule), |
|||
typeof(BookStoreEntityFrameworkCoreModule), |
|||
typeof(AbpAspNetCoreMvcUiBasicThemeModule), |
|||
typeof(AbpAspNetCoreAuthenticationJwtBearerModule), |
|||
typeof(AbpAccountWebIdentityServerModule), |
|||
typeof(AbpAspNetCoreSerilogModule), |
|||
typeof(AbpSwashbuckleModule) |
|||
)] |
|||
public class BookStoreHttpApiHostModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
var configuration = context.Services.GetConfiguration(); |
|||
var hostingEnvironment = context.Services.GetHostingEnvironment(); |
|||
|
|||
ConfigureBundles(); |
|||
ConfigureUrls(configuration); |
|||
ConfigureConventionalControllers(); |
|||
ConfigureAuthentication(context, configuration); |
|||
ConfigureLocalization(); |
|||
ConfigureVirtualFileSystem(context); |
|||
ConfigureCors(context, configuration); |
|||
ConfigureSwaggerServices(context, configuration); |
|||
} |
|||
|
|||
private void ConfigureBundles() |
|||
{ |
|||
Configure<AbpBundlingOptions>(options => |
|||
{ |
|||
options.StyleBundles.Configure( |
|||
BasicThemeBundles.Styles.Global, |
|||
bundle => { bundle.AddFiles("/global-styles.css"); } |
|||
); |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureUrls(IConfiguration configuration) |
|||
{ |
|||
Configure<AppUrlOptions>(options => |
|||
{ |
|||
options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; |
|||
options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"].Split(',')); |
|||
|
|||
options.Applications["Angular"].RootUrl = configuration["App:ClientUrl"]; |
|||
options.Applications["Angular"].Urls[AccountUrlNames.PasswordReset] = "account/reset-password"; |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureVirtualFileSystem(ServiceConfigurationContext context) |
|||
{ |
|||
var hostingEnvironment = context.Services.GetHostingEnvironment(); |
|||
|
|||
if (hostingEnvironment.IsDevelopment()) |
|||
{ |
|||
Configure<AbpVirtualFileSystemOptions>(options => |
|||
{ |
|||
options.FileSets.ReplaceEmbeddedByPhysical<BookStoreDomainSharedModule>( |
|||
Path.Combine(hostingEnvironment.ContentRootPath, |
|||
$"..{Path.DirectorySeparatorChar}BookStore.Domain.Shared")); |
|||
options.FileSets.ReplaceEmbeddedByPhysical<BookStoreDomainModule>( |
|||
Path.Combine(hostingEnvironment.ContentRootPath, |
|||
$"..{Path.DirectorySeparatorChar}BookStore.Domain")); |
|||
options.FileSets.ReplaceEmbeddedByPhysical<BookStoreApplicationContractsModule>( |
|||
Path.Combine(hostingEnvironment.ContentRootPath, |
|||
$"..{Path.DirectorySeparatorChar}BookStore.Application.Contracts")); |
|||
options.FileSets.ReplaceEmbeddedByPhysical<BookStoreApplicationModule>( |
|||
Path.Combine(hostingEnvironment.ContentRootPath, |
|||
$"..{Path.DirectorySeparatorChar}BookStore.Application")); |
|||
}); |
|||
} |
|||
} |
|||
|
|||
private void ConfigureConventionalControllers() |
|||
{ |
|||
Configure<AbpAspNetCoreMvcOptions>(options => |
|||
{ |
|||
options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly); |
|||
}); |
|||
} |
|||
|
|||
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 = "BookStore"; |
|||
options.UseSecurityTokenValidators = true; |
|||
options.BackchannelHttpHandler = new HttpClientHandler |
|||
{ |
|||
ServerCertificateCustomValidationCallback = |
|||
HttpClientHandler.DangerousAcceptAnyServerCertificateValidator |
|||
}; |
|||
#if DEBUG
|
|||
options.IncludeErrorDetails = true; |
|||
#endif
|
|||
}); |
|||
} |
|||
|
|||
private static void ConfigureSwaggerServices(ServiceConfigurationContext context, IConfiguration configuration) |
|||
{ |
|||
context.Services.AddAbpSwaggerGenWithOAuth( |
|||
configuration["AuthServer:Authority"], |
|||
new Dictionary<string, string> |
|||
{ |
|||
{"BookStore", "BookStore API"} |
|||
}, |
|||
options => |
|||
{ |
|||
options.SwaggerDoc("v1", new OpenApiInfo { Title = "BookStore API", Version = "v1" }); |
|||
options.DocInclusionPredicate((docName, description) => true); |
|||
options.CustomSchemaIds(type => type.FullName); |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureLocalization() |
|||
{ |
|||
Configure<AbpLocalizationOptions>(options => |
|||
{ |
|||
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("fi", "fi", "Finnish")); |
|||
options.Languages.Add(new LanguageInfo("fr", "fr", "Français")); |
|||
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi")); |
|||
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic")); |
|||
options.Languages.Add(new LanguageInfo("it", "it", "Italiano")); |
|||
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar")); |
|||
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")); |
|||
options.Languages.Add(new LanguageInfo("es", "es", "Español")); |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration) |
|||
{ |
|||
context.Services.AddCors(options => |
|||
{ |
|||
options.AddDefaultPolicy(builder => |
|||
{ |
|||
builder |
|||
.WithOrigins( |
|||
configuration["App:CorsOrigins"] |
|||
.Split(",", StringSplitOptions.RemoveEmptyEntries) |
|||
.Select(o => o.RemovePostFix("/")) |
|||
.ToArray() |
|||
) |
|||
.WithAbpExposedHeaders() |
|||
.SetIsOriginAllowedToAllowWildcardSubdomains() |
|||
.AllowAnyHeader() |
|||
.AllowAnyMethod() |
|||
.AllowCredentials(); |
|||
}); |
|||
}); |
|||
} |
|||
|
|||
public override void OnApplicationInitialization(ApplicationInitializationContext context) |
|||
{ |
|||
var app = context.GetApplicationBuilder(); |
|||
var env = context.GetEnvironment(); |
|||
|
|||
if (env.IsDevelopment()) |
|||
{ |
|||
app.UseDeveloperExceptionPage(); |
|||
} |
|||
|
|||
app.UseAbpRequestLocalization(); |
|||
|
|||
if (!env.IsDevelopment()) |
|||
{ |
|||
app.UseErrorPage(); |
|||
} |
|||
|
|||
app.UseCorrelationId(); |
|||
app.MapAbpStaticAssets(); |
|||
app.UseRouting(); |
|||
app.UseCors(); |
|||
app.UseAuthentication(); |
|||
app.UseJwtTokenMiddleware(); |
|||
|
|||
if (MultiTenancyConsts.IsEnabled) |
|||
{ |
|||
app.UseMultiTenancy(); |
|||
} |
|||
|
|||
app.UseUnitOfWork(); |
|||
app.UseIdentityServer(); |
|||
app.UseAuthorization(); |
|||
|
|||
app.UseSwagger(); |
|||
app.UseAbpSwaggerUI(c => |
|||
{ |
|||
c.SwaggerEndpoint("/swagger/v1/swagger.json", "BookStore API"); |
|||
|
|||
var configuration = context.ServiceProvider.GetRequiredService<IConfiguration>(); |
|||
c.OAuthClientId(configuration["AuthServer:SwaggerClientId"]); |
|||
c.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]); |
|||
c.OAuthScopes("BookStore"); |
|||
}); |
|||
|
|||
app.UseAuditing(); |
|||
app.UseAbpSerilogEnrichers(); |
|||
app.UseConfiguredEndpoints(); |
|||
} |
|||
} |
|||
@ -1,12 +0,0 @@ |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using Volo.Abp.AspNetCore.Mvc; |
|||
|
|||
namespace BookStore.Controllers; |
|||
|
|||
public class HomeController : AbpController |
|||
{ |
|||
public ActionResult Index() |
|||
{ |
|||
return Redirect("~/swagger"); |
|||
} |
|||
} |
|||
@ -1,53 +0,0 @@ |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.AspNetCore.Builder; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Microsoft.Extensions.Hosting; |
|||
using Serilog; |
|||
using Serilog.Events; |
|||
|
|||
namespace BookStore; |
|||
|
|||
public class Program |
|||
{ |
|||
public async static Task<int> Main(string[] args) |
|||
{ |
|||
Log.Logger = new LoggerConfiguration() |
|||
#if DEBUG
|
|||
.MinimumLevel.Debug() |
|||
#else
|
|||
.MinimumLevel.Information() |
|||
#endif
|
|||
.MinimumLevel.Override("Microsoft", LogEventLevel.Information) |
|||
.MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) |
|||
.Enrich.FromLogContext() |
|||
.WriteTo.Async(c => c.File("Logs/logs.txt")) |
|||
#if DEBUG
|
|||
.WriteTo.Async(c => c.Console()) |
|||
#endif
|
|||
.CreateLogger(); |
|||
|
|||
try |
|||
{ |
|||
Log.Information("Starting BookStore.HttpApi.Host."); |
|||
var builder = WebApplication.CreateBuilder(args); |
|||
builder.Host.AddAppSettingsSecretsJson() |
|||
.UseAutofac() |
|||
.UseSerilog(); |
|||
await builder.AddApplicationAsync<BookStoreHttpApiHostModule>(); |
|||
var app = builder.Build(); |
|||
await app.InitializeApplicationAsync(); |
|||
await app.RunAsync(); |
|||
return 0; |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
Log.Fatal(ex, "Host terminated unexpectedly!"); |
|||
return 1; |
|||
} |
|||
finally |
|||
{ |
|||
Log.CloseAndFlush(); |
|||
} |
|||
} |
|||
} |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue