Browse Source

Add new BlazorWebassembly example

pull/41/head
liangshiwei 7 months ago
parent
commit
68478c7c29
  1. 22
      README.BlazorWebAssembly.md
  2. 6
      README.md
  3. 2
      samples/WebAppBlazorWebAssembly/.editorconfig
  4. 1
      samples/WebAppBlazorWebAssembly/.gitattributes
  5. 274
      samples/WebAppBlazorWebAssembly/.gitignore
  6. 109
      samples/WebAppBlazorWebAssembly/BookStore.abpmdl
  7. 53
      samples/WebAppBlazorWebAssembly/BookStore.abpsln
  8. 137
      samples/WebAppBlazorWebAssembly/BookStore.sln
  9. 23
      samples/WebAppBlazorWebAssembly/BookStore.sln.DotSettings
  10. 13
      samples/WebAppBlazorWebAssembly/NuGet.Config
  11. 59
      samples/WebAppBlazorWebAssembly/README.md
  12. 19
      samples/WebAppBlazorWebAssembly/common.props
  13. 28
      samples/WebAppBlazorWebAssembly/etc/abp-studio/run-profiles/Default.abprun.json
  14. 3
      samples/WebAppBlazorWebAssembly/src/BookStore.Application.Contracts/BookStore.Application.Contracts.abppkg
  15. 118
      samples/WebAppBlazorWebAssembly/src/BookStore.Application.Contracts/BookStore.Application.Contracts.abppkg.analyze.json
  16. 24
      samples/WebAppBlazorWebAssembly/src/BookStore.Application.Contracts/BookStore.Application.Contracts.csproj
  17. 26
      samples/WebAppBlazorWebAssembly/src/BookStore.Application.Contracts/BookStoreApplicationContractsModule.cs
  18. 28
      samples/WebAppBlazorWebAssembly/src/BookStore.Application.Contracts/BookStoreDtoExtensions.cs
  19. 22
      samples/WebAppBlazorWebAssembly/src/BookStore.Application.Contracts/Permissions/BookStorePermissionDefinitionProvider.cs
  20. 11
      samples/WebAppBlazorWebAssembly/src/BookStore.Application.Contracts/Permissions/BookStorePermissions.cs
  21. 3
      samples/WebAppBlazorWebAssembly/src/BookStore.Application/BookStore.Application.abppkg
  22. 123
      samples/WebAppBlazorWebAssembly/src/BookStore.Application/BookStore.Application.abppkg.analyze.json
  23. 25
      samples/WebAppBlazorWebAssembly/src/BookStore.Application/BookStore.Application.csproj
  24. 14
      samples/WebAppBlazorWebAssembly/src/BookStore.Application/BookStoreAppService.cs
  25. 13
      samples/WebAppBlazorWebAssembly/src/BookStore.Application/BookStoreApplicationAutoMapperProfile.cs
  26. 31
      samples/WebAppBlazorWebAssembly/src/BookStore.Application/BookStoreApplicationModule.cs
  27. 2
      samples/WebAppBlazorWebAssembly/src/BookStore.Application/Properties/AssemblyInfo.cs
  28. 3
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStore.Blazor.Client.abppkg
  29. 38
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStore.Blazor.Client.csproj
  30. 11
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStoreBlazorAutoMapperProfile.cs
  31. 112
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStoreBlazorClientModule.cs
  32. 21
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStoreBrandingProvider.cs
  33. 12
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStoreComponentBase.cs
  34. 81
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/Navigation/BookStoreMenuContributor.cs
  35. 8
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/Navigation/BookStoreMenus.cs
  36. 17
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/Pages/Index.razor
  37. 6
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/Pages/Index.razor.cs
  38. 17
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/Pages/Index.razor.css
  39. 23
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/Program.cs
  40. 14
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/Routes.razor
  41. 16
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/_Imports.razor
  42. 3
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/appsettings.Development.json
  43. 18
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/appsettings.json
  44. BIN
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/favicon.ico
  45. BIN
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/icon-192.png
  46. BIN
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/icon-512.png
  47. BIN
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/bg-01.png
  48. BIN
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/book.png
  49. 7
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/discord.svg
  50. BIN
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/img-blog.png
  51. BIN
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/img-community.png
  52. BIN
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/img-support.png
  53. 23
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/instagram.svg
  54. 4
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/stack-overflow.svg
  55. 3
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/x-white.svg
  56. 11
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/youtube.svg
  57. BIN
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/logo/leptonxlite/logo-dark-thumbnail.png
  58. BIN
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/logo/leptonxlite/logo-dark.png
  59. BIN
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/logo/leptonxlite/logo-light-thumbnail.png
  60. BIN
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/logo/leptonxlite/logo-light.png
  61. 45
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/main.css
  62. 21
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/manifest.json
  63. 4
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/service-worker.js
  64. 48
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/service-worker.published.js
  65. 3
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/BookStore.Blazor.abppkg
  66. 27
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/BookStore.Blazor.csproj
  67. 76
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/BookStoreBlazorModule.cs
  68. 11
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/BookStoreScriptBundleContributor.cs
  69. 11
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/BookStoreStyleBundleContributor.cs
  70. 38
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/Components/App.razor
  71. 5
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/Dockerfile
  72. 8
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/Dockerfile.local
  73. 56
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/Program.cs
  74. 29
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/Properties/launchSettings.json
  75. 9
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/_Imports.razor
  76. 1
      samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/BookStore.DbMigrator.abppkg
  77. 46
      samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/BookStore.DbMigrator.csproj
  78. 14
      samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/BookStoreDbMigratorModule.cs
  79. 51
      samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/DbMigratorHostedService.cs
  80. 5
      samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/Dockerfile
  81. 6
      samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/Dockerfile.local
  82. 39
      samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/Program.cs
  83. 19
      samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/appsettings.json
  84. 2
      samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/appsettings.secrets.json
  85. 3
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/BookStore.Domain.Shared.abppkg
  86. 118
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/BookStore.Domain.Shared.abppkg.analyze.json
  87. 37
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/BookStore.Domain.Shared.csproj
  88. 6
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/BookStoreDomainErrorCodes.cs
  89. 82
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/BookStoreDomainSharedModule.cs
  90. 20
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/BookStoreGlobalFeatureConfigurator.cs
  91. 71
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/BookStoreModuleExtensionConfigurator.cs
  92. 42
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/ar.json
  93. 9
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/cs.json
  94. 42
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/de-DE.json
  95. 9
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/en-GB.json
  96. 9
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/en.json
  97. 42
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/es.json
  98. 42
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/fi.json
  99. 42
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/fr.json
  100. 42
      samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/hi.json

22
README.BlazorWebAssembly.md

@ -7,9 +7,11 @@ The first step is to use ABP CLI to create a new project.
**Replace LeptonXLiteTheme with AntBlazorTheme packages**
* Replace `Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme` with `Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme`
* Replace `Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme.Bundling` with `Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling`
* Replace `Volo.Abp.Identity.Blazor.WebAssembly` with `Lsw.Abp.IdentityManagement.Blazor.WebAssembly.AntDesignUI`
* Replace `Volo.Abp.SettingManagement.Blazor.WebAssembly` with `Lsw.Abp.SettingManagement.Blazor.WebAssembly.AntDesignUI`
* Replace `Volo.Abp.TenantManagement.Blazor.WebAssembly` with `Lsw.Abp.TenantManagement.Blazor.WebAssembly.AntDesignUI`
* Replace `Volo.Abp.FeatureManagement.Blazor.WebAssembly` with `Lsw.Abp.FeatureManagement.Blazor.WebAssembly.AntDesignUI`
```
@ -23,7 +25,7 @@ The first step is to use ABP CLI to create a new project.
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Bundling
```
**Open `BookStoreBlazorModule` make the following changes:**
**Open `BookStoreBlazorClientModule` make the following changes:**
* Remove the `ConfigureBlazorise` method
* Fix wrong using namespace
@ -55,7 +57,25 @@ The first step is to use ABP CLI to create a new project.
</div>
</div>
```
**Open `Routes.razor` and replace with the following:**
```csharp
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Routing
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesignTheme
@using Microsoft.Extensions.Options
@using Volo.Abp.AspNetCore.Components.WebAssembly.WebApp
<Router AppAssembly="typeof(Program).Assembly" AdditionalAssemblies="WebAppAdditionalAssembliesHelper.GetAssemblies<BookStoreBlazorClientModule>()">
<Found Context="routeData">
<AuthorizeRouteView RouteData="routeData" DefaultLayout="typeof(DefaultLayout)">
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
</AuthorizeRouteView>
</Found>
</Router>
```
Run the `dotnet build` & `abp bundle` command in the `BookStore.Blazor` folder.

6
README.md

@ -16,9 +16,9 @@
## Quick Start
[Change the theme of the ABP project to AntBlazorTheme for Blazor WebApp.](./README.WebApp.md)
[Change the theme of the ABP project to AntBlazorTheme for Blazor Server.](./README.BlazorServer.md)
* [Change the theme of the ABP project to AntBlazorTheme for Blazor WebApp.](./README.WebApp.md)
* [Change the theme of the ABP project to AntBlazorTheme for Blazor Server.](./README.BlazorServer.md)
* [Change the theme of the ABP project to AntBlazorTheme for Blazor WebAssembly.](./README.BlazorWebAssembly.md)
## Road map

2
samples/WebAppBlazorWebAssembly/.editorconfig

@ -0,0 +1,2 @@
[*.csproj]
indent_size = 2

1
samples/WebAppBlazorWebAssembly/.gitattributes

@ -0,0 +1 @@
**/wwwroot/libs/** linguist-vendored

274
samples/WebAppBlazorWebAssembly/.gitignore

@ -0,0 +1,274 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
**/.idea/
*.sln.iml
# ABP Studio
**/.abpstudio/
# BookStore
src/BookStore.Web/Logs/*
src/BookStore.Web.Host/Logs/*
src/BookStore.Web.Public/Logs/*
src/BookStore.Web.Public.Host/Logs/*
src/BookStore.AuthServer/Logs/*
src/BookStore.HttpApi.Host/Logs/*
src/BookStore.HttpApi.Host/Logs/*
src/BookStore.DbMigrator/Logs/*
src/BookStore.Blazor.Server/Logs/*
src/BookStore.Blazor.Server.Tiered/Logs/*
# Use abp install-libs to restore.
**/wwwroot/libs/*
# IdentityServer temp files
tempkey.rsa
tempkey.jwk

109
samples/WebAppBlazorWebAssembly/BookStore.abpmdl

@ -0,0 +1,109 @@
{
"template": "app",
"imports": {
"Volo.Abp.LeptonXLiteTheme": {
"version": "4.2.0",
"isInstalled": true
},
"Volo.Abp.Account": {
"version": "9.2.0",
"isInstalled": true
},
"Volo.Abp.OpenIddict": {
"version": "9.2.0",
"isInstalled": true
},
"Volo.Abp.Identity": {
"version": "9.2.0",
"isInstalled": true
},
"Volo.Abp.TenantManagement": {
"version": "9.2.0",
"isInstalled": true
},
"Volo.Abp.SettingManagement": {
"version": "9.2.0",
"isInstalled": true
},
"Volo.Abp.PermissionManagement": {
"version": "9.2.0",
"isInstalled": true
},
"Volo.Abp.FeatureManagement": {
"version": "9.2.0",
"isInstalled": true
}
},
"folders": {
"items": {
"src": {},
"test": {}
}
},
"packages": {
"BookStore.Application": {
"path": "src/BookStore.Application/BookStore.Application.abppkg",
"folder": "src"
},
"BookStore.Application.Tests": {
"path": "test/BookStore.Application.Tests/BookStore.Application.Tests.abppkg",
"folder": "test"
},
"BookStore.MongoDB": {
"path": "src/BookStore.MongoDB/BookStore.MongoDB.abppkg",
"folder": "src"
},
"BookStore.MongoDB.Tests": {
"path": "test/BookStore.MongoDB.Tests/BookStore.MongoDB.Tests.abppkg",
"folder": "test"
},
"BookStore.Domain.Shared": {
"path": "src/BookStore.Domain.Shared/BookStore.Domain.Shared.abppkg",
"folder": "src"
},
"BookStore.Application.Contracts": {
"path": "src/BookStore.Application.Contracts/BookStore.Application.Contracts.abppkg",
"folder": "src"
},
"BookStore.HttpApi": {
"path": "src/BookStore.HttpApi/BookStore.HttpApi.abppkg",
"folder": "src"
},
"BookStore.HttpApi.Client": {
"path": "src/BookStore.HttpApi.Client/BookStore.HttpApi.Client.abppkg",
"folder": "src"
},
"BookStore.TestBase": {
"path": "test/BookStore.TestBase/BookStore.TestBase.abppkg",
"folder": "test"
},
"BookStore.Domain.Tests": {
"path": "test/BookStore.Domain.Tests/BookStore.Domain.Tests.abppkg",
"folder": "test"
},
"BookStore.HttpApi.Client.ConsoleTestApp": {
"path": "test/BookStore.HttpApi.Client.ConsoleTestApp/BookStore.HttpApi.Client.ConsoleTestApp.abppkg",
"folder": "test"
},
"BookStore.DbMigrator": {
"path": "src/BookStore.DbMigrator/BookStore.DbMigrator.abppkg",
"folder": "src"
},
"BookStore.HttpApi.Host": {
"path": "src/BookStore.HttpApi.Host/BookStore.HttpApi.Host.abppkg",
"folder": "src"
},
"BookStore.Blazor": {
"path": "src/BookStore.Blazor/BookStore.Blazor.abppkg",
"folder": "src"
},
"BookStore.Blazor.Client": {
"path": "src/BookStore.Blazor.Client/BookStore.Blazor.Client.abppkg",
"folder": "src"
},
"BookStore.Domain": {
"path": "src/BookStore.Domain/BookStore.Domain.abppkg",
"folder": "src"
}
}
}

53
samples/WebAppBlazorWebAssembly/BookStore.abpsln

@ -0,0 +1,53 @@
{
"id": "9776757a-16f5-4a1a-8449-62909978bb39",
"template": "app",
"versions": {
"AbpFramework": "9.2.0",
"AbpStudio": "1.0.1",
"TargetDotnetFramework": "net9.0"
},
"modules": {
"BookStore": {
"path": "BookStore.abpmdl"
}
},
"runProfiles": {
"Default": {
"path": "etc/abp-studio/run-profiles/Default.abprun.json"
}
},
"options": {
"httpRequests": {
"ignoredUrls": [
]
}
},
"creatingStudioConfiguration": {
"template": "app",
"createdAbpStudioVersion": "1.0.1",
"tiered": "false",
"runInstallLibs": "true",
"runBundling": "true",
"useLocalReferences": "false",
"multiTenancy": "true",
"includeTests": "true",
"kubernetesConfiguration": "false",
"uiFramework": "blazor",
"mobileFramework": "none",
"distributedEventBus": "none",
"databaseProvider": "mongodb",
"runDbMigrator": "true",
"theme": "leptonx-lite",
"themeStyle": "",
"themeMenuPlacement": "",
"mobileFramework": "none",
"progressiveWebApp": "false",
"runProgressiveWebAppSupport": "false",
"publicWebsite": "false",
"socialLogin": "true",
"selectedLanguages": ["English", "English (United Kingdom)", "简体中文", "Español", "العربية", "हिन्दी", "Português (Brasil)", "Français", "Русский", "Deutsch (Deuthschland)", "Türkçe", "Italiano", "Čeština", "Magyar", "Română (România)", "Svenska", "Suomi", "Slovenčina", "Íslenska", "繁體中z文", ],
"defaultLanguage": "English",
"createCommand": "abp new BookStore -t app --ui-framework blazor --database-provider mongodb --theme leptonx-lite --skip-migration --without-cms-kit -no-file-management"
}
}

137
samples/WebAppBlazorWebAssembly/BookStore.sln

@ -0,0 +1,137 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.3.32611.2
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.Domain", "src\BookStore.Domain\BookStore.Domain.csproj", "{554AD327-6DBA-4F8F-96F8-81CE7A0C863F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.Application", "src\BookStore.Application\BookStore.Application.csproj", "{1A94A50E-06DC-43C1-80B5-B662820EC3EB}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{CA9AC87F-097E-4F15-8393-4BC07735A5B0}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{04DBDB01-70F4-4E06-B468-8F87850B22BE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.Application.Tests", "test\BookStore.Application.Tests\BookStore.Application.Tests.csproj", "{50B2631D-129C-47B3-A587-029CCD6099BC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.MongoDB", "src\BookStore.MongoDB\BookStore.MongoDB.csproj", "{E3444355-D47E-431E-BDD0-DD3A7113B2AE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.Domain.Shared", "src\BookStore.Domain.Shared\BookStore.Domain.Shared.csproj", "{42F719ED-8413-4895-B5B4-5AB56079BC66}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.Application.Contracts", "src\BookStore.Application.Contracts\BookStore.Application.Contracts.csproj", "{520659C8-C734-4298-A3DA-B539DB9DFC0B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.HttpApi", "src\BookStore.HttpApi\BookStore.HttpApi.csproj", "{4164BDF7-F527-4E85-9CE6-E3C2D7426A27}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.HttpApi.Client", "src\BookStore.HttpApi.Client\BookStore.HttpApi.Client.csproj", "{3B5A0094-670D-4BB1-BFDD-61B88A8773DC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.TestBase", "test\BookStore.TestBase\BookStore.TestBase.csproj", "{91853F21-9CD9-4132-BC29-A7D5D84FFFE7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.Domain.Tests", "test\BookStore.Domain.Tests\BookStore.Domain.Tests.csproj", "{E512F4D9-9375-480F-A2F6-A46509F9D824}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.MongoDB.Tests", "test\BookStore.MongoDB.Tests\BookStore.MongoDB.Tests.csproj", "{6015D17B-104B-4EC2-A9B7-D8A40C891458}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.HttpApi.Client.ConsoleTestApp", "test\BookStore.HttpApi.Client.ConsoleTestApp\BookStore.HttpApi.Client.ConsoleTestApp.csproj", "{EF480016-9127-4916-8735-D2466BDBC582}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.DbMigrator", "src\BookStore.DbMigrator\BookStore.DbMigrator.csproj", "{70680696-BB1E-4383-BCB2-42C3767171FB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.HttpApi.Host", "src\BookStore.HttpApi.Host\BookStore.HttpApi.Host.csproj", "{96E5259E-59A3-4FAF-BCD1-5BF8E74EF82C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.Blazor", "src\BookStore.Blazor\BookStore.Blazor.csproj", "{2DC842B5-1705-4097-AD37-E889C1B97950}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookStore.Blazor.Client", "src\BookStore.Blazor.Client\BookStore.Blazor.Client.csproj", "{9df63919-581a-488b-bfe3-0622a500a56c}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Release|Any CPU.Build.0 = Release|Any CPU
{1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Release|Any CPU.Build.0 = Release|Any CPU
{50B2631D-129C-47B3-A587-029CCD6099BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{50B2631D-129C-47B3-A587-029CCD6099BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{50B2631D-129C-47B3-A587-029CCD6099BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{50B2631D-129C-47B3-A587-029CCD6099BC}.Release|Any CPU.Build.0 = Release|Any CPU
{E3444355-D47E-431E-BDD0-DD3A7113B2AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E3444355-D47E-431E-BDD0-DD3A7113B2AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E3444355-D47E-431E-BDD0-DD3A7113B2AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E3444355-D47E-431E-BDD0-DD3A7113B2AE}.Release|Any CPU.Build.0 = Release|Any CPU
{42F719ED-8413-4895-B5B4-5AB56079BC66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{42F719ED-8413-4895-B5B4-5AB56079BC66}.Debug|Any CPU.Build.0 = Debug|Any CPU
{42F719ED-8413-4895-B5B4-5AB56079BC66}.Release|Any CPU.ActiveCfg = Release|Any CPU
{42F719ED-8413-4895-B5B4-5AB56079BC66}.Release|Any CPU.Build.0 = Release|Any CPU
{520659C8-C734-4298-A3DA-B539DB9DFC0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{520659C8-C734-4298-A3DA-B539DB9DFC0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{520659C8-C734-4298-A3DA-B539DB9DFC0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{520659C8-C734-4298-A3DA-B539DB9DFC0B}.Release|Any CPU.Build.0 = Release|Any CPU
{4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Release|Any CPU.Build.0 = Release|Any CPU
{3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Release|Any CPU.Build.0 = Release|Any CPU
{91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Release|Any CPU.Build.0 = Release|Any CPU
{E512F4D9-9375-480F-A2F6-A46509F9D824}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E512F4D9-9375-480F-A2F6-A46509F9D824}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E512F4D9-9375-480F-A2F6-A46509F9D824}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E512F4D9-9375-480F-A2F6-A46509F9D824}.Release|Any CPU.Build.0 = Release|Any CPU
{6015D17B-104B-4EC2-A9B7-D8A40C891458}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6015D17B-104B-4EC2-A9B7-D8A40C891458}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6015D17B-104B-4EC2-A9B7-D8A40C891458}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6015D17B-104B-4EC2-A9B7-D8A40C891458}.Release|Any CPU.Build.0 = Release|Any CPU
{EF480016-9127-4916-8735-D2466BDBC582}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EF480016-9127-4916-8735-D2466BDBC582}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EF480016-9127-4916-8735-D2466BDBC582}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EF480016-9127-4916-8735-D2466BDBC582}.Release|Any CPU.Build.0 = Release|Any CPU
{70680696-BB1E-4383-BCB2-42C3767171FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{70680696-BB1E-4383-BCB2-42C3767171FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{70680696-BB1E-4383-BCB2-42C3767171FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{70680696-BB1E-4383-BCB2-42C3767171FB}.Release|Any CPU.Build.0 = Release|Any CPU
{96E5259E-59A3-4FAF-BCD1-5BF8E74EF82C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{96E5259E-59A3-4FAF-BCD1-5BF8E74EF82C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{96E5259E-59A3-4FAF-BCD1-5BF8E74EF82C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{96E5259E-59A3-4FAF-BCD1-5BF8E74EF82C}.Release|Any CPU.Build.0 = Release|Any CPU
{2DC842B5-1705-4097-AD37-E889C1B97950}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2DC842B5-1705-4097-AD37-E889C1B97950}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2DC842B5-1705-4097-AD37-E889C1B97950}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2DC842B5-1705-4097-AD37-E889C1B97950}.Release|Any CPU.Build.0 = Release|Any CPU
{9df63919-581a-488b-bfe3-0622a500a56c}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9df63919-581a-488b-bfe3-0622a500a56c}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9df63919-581a-488b-bfe3-0622a500a56c}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9df63919-581a-488b-bfe3-0622a500a56c}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{554AD327-6DBA-4F8F-96F8-81CE7A0C863F} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
{1A94A50E-06DC-43C1-80B5-B662820EC3EB} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
{50B2631D-129C-47B3-A587-029CCD6099BC} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
{E3444355-D47E-431E-BDD0-DD3A7113B2AE} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
{42F719ED-8413-4895-B5B4-5AB56079BC66} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
{520659C8-C734-4298-A3DA-B539DB9DFC0B} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
{4164BDF7-F527-4E85-9CE6-E3C2D7426A27} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
{3B5A0094-670D-4BB1-BFDD-61B88A8773DC} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
{91853F21-9CD9-4132-BC29-A7D5D84FFFE7} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
{E512F4D9-9375-480F-A2F6-A46509F9D824} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
{6015D17B-104B-4EC2-A9B7-D8A40C891458} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
{EF480016-9127-4916-8735-D2466BDBC582} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
{70680696-BB1E-4383-BCB2-42C3767171FB} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
{96E5259E-59A3-4FAF-BCD1-5BF8E74EF82C} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
{2DC842B5-1705-4097-AD37-E889C1B97950} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
{9df63919-581a-488b-bfe3-0622a500a56c} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F}
EndGlobalSection
EndGlobal

23
samples/WebAppBlazorWebAssembly/BookStore.sln.DotSettings

@ -0,0 +1,23 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/CodeEditing/Intellisense/CodeCompletion/IntelliSenseCompletingCharacters/CSharpCompletingCharacters/UpgradedFromVSSettings/@EntryValue">True</s:Boolean>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceDoWhileStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceFixedStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceForeachStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceForStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceIfStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceLockStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceUsingStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceWhileStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_FOR/@EntryValue">Required</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_FOREACH/@EntryValue">Required</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_IFELSE/@EntryValue">Required</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_WHILE/@EntryValue">Required</s:String>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_REDUNDANT/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/Generate/=Implementations/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/CodeStyle/Generate/=Implementations/Options/=Async/@EntryIndexedValue">False</s:String>
<s:String x:Key="/Default/CodeStyle/Generate/=Implementations/Options/=Mutable/@EntryIndexedValue">False</s:String>
<s:Boolean x:Key="/Default/CodeStyle/Generate/=Overrides/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Async/@EntryIndexedValue">False</s:String>
<s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Mutable/@EntryIndexedValue">False</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SQL/@EntryIndexedValue">SQL</s:String>
</wpf:ResourceDictionary>

13
samples/WebAppBlazorWebAssembly/NuGet.Config

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</packageSources>
<packageSourceMapping>
<packageSource key="nuget.org">
<package pattern="*" />
<package pattern="Microsoft.*" />
<package pattern="Volo.*" />
</packageSource>
</packageSourceMapping>
</configuration>

59
samples/WebAppBlazorWebAssembly/README.md

@ -0,0 +1,59 @@
# BookStore
## About this solution
This is a layered startup solution based on [Domain Driven Design (DDD)](https://abp.io/docs/latest/framework/architecture/domain-driven-design) practises. All the fundamental ABP modules are already installed. Check the [Application Startup Template](https://abp.io/docs/latest/solution-templates/layered-web-application) documentation for more info.
### Pre-requirements
* [.NET9.0+ SDK](https://dotnet.microsoft.com/download/dotnet)
* [Node v18 or 20](https://nodejs.org/en)
### Configurations
The solution comes with a default configuration that works out of the box. However, you may consider to change the following configuration before running your solution:
* Check the `ConnectionStrings` in `appsettings.json` files under the `BookStore.HttpApi.Host` and `BookStore.DbMigrator` projects and change it if you need.
### Before running the application
* Run `abp install-libs` command on your solution folder to install client-side package dependencies. This step is automatically done when you create a new solution, if you didn't especially disabled it. However, you should run it yourself if you have first cloned this solution from your source control, or added a new client-side package dependency to your solution.
* Run `BookStore.DbMigrator` to create the initial database. This step is also automatically done when you create a new solution, if you didn't especially disabled it. This should be done in the first run. It is also needed if a new database migration is added to the solution later.
#### Generating a Signing Certificate
In the production environment, you need to use a production signing certificate. ABP Framework sets up signing and encryption certificates in your application and expects an `openiddict.pfx` file in your application.
To generate a signing certificate, you can use the following command:
```bash
dotnet dev-certs https -v -ep openiddict.pfx -p 2dae3a4f-9e73-4cb7-b7b9-7ec95c44e1a3
```
> `2dae3a4f-9e73-4cb7-b7b9-7ec95c44e1a3` is the password of the certificate, you can change it to any password you want.
It is recommended to use **two** RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing.
For more information, please refer to: [OpenIddict Certificate Configuration](https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html#registering-a-certificate-recommended-for-production-ready-scenarios)
> Also, see the [Configuring OpenIddict](https://abp.io/docs/latest/Deployment/Configuring-OpenIddict#production-environment) documentation for more information.
### Solution structure
This is a layered monolith application that consists of the following applications:
* `BookStore.DbMigrator`: A console application which applies the migrations and also seeds the initial data. It is useful on development as well as on production environment.
* `BookStore.HttpApi.Host`: ASP.NET Core API application that is used to expose the APIs to the clients.
* `BookStore.Blazor`: ASP.NET Core Blazor Server application that is the essential web application of the solution.
## Deploying the application
Deploying an ABP application follows the same process as deploying any .NET or ASP.NET Core application. However, there are important considerations to keep in mind. For detailed guidance, refer to ABP's [deployment documentation](https://abp.io/docs/latest/Deployment/Index).
### Additional resources
You can see the following resources to learn more about your solution and the ABP Framework:
* [Web Application Development Tutorial](https://abp.io/docs/latest/tutorials/book-store/part-1)
* [Application Startup Template](https://abp.io/docs/latest/startup-templates/application/index)

19
samples/WebAppBlazorWebAssembly/common.props

@ -0,0 +1,19 @@
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<Version>1.0.0</Version>
<NoWarn>$(NoWarn);CS1591</NoWarn>
<AbpProjectType>app</AbpProjectType>
</PropertyGroup>
<Target Name="NoWarnOnRazorViewImportedTypeConflicts" BeforeTargets="RazorCoreCompile">
<PropertyGroup>
<NoWarn>$(NoWarn);0436</NoWarn>
</PropertyGroup>
</Target>
<ItemGroup>
<Content Remove="$(UserProfile)\.nuget\packages\*\*\contentFiles\any\*\*.abppkg*" />
</ItemGroup>
</Project>

28
samples/WebAppBlazorWebAssembly/etc/abp-studio/run-profiles/Default.abprun.json

@ -0,0 +1,28 @@
{
"applications": {
"BookStore.HttpApi.Host": {
"type": "dotnet-project",
"launchUrl": "https://localhost:44318",
"path": "../../../src/BookStore.HttpApi.Host/BookStore.HttpApi.Host.csproj",
"kubernetesService": ".*-httpapihost$",
"healthCheckEndpoint": "/health-status",
"healthUiEndpoint": "/health-ui",
"execution": {
"order": 4
}
},
"BookStore.Blazor": {
"type": "dotnet-project",
"launchUrl": "https://localhost:44376",
"path": "../../../src/BookStore.Blazor/BookStore.Blazor.csproj",
"healthCheckEndpoint": "/",
"kubernetesService": ".*-blazor$",
"execution": {
"order": 2
}
}
},
"containers": {
"serviceName": "BookStore-Containers",
}
}

3
samples/WebAppBlazorWebAssembly/src/BookStore.Application.Contracts/BookStore.Application.Contracts.abppkg

@ -0,0 +1,3 @@
{
"role": "lib.application-contracts"
}

118
samples/WebAppBlazorWebAssembly/src/BookStore.Application.Contracts/BookStore.Application.Contracts.abppkg.analyze.json

@ -0,0 +1,118 @@
{
"name": "BookStore.Application.Contracts",
"hash": "",
"contents": [
{
"namespace": "BookStore",
"dependsOnModules": [
{
"declaringAssemblyName": "BookStore.Domain.Shared",
"namespace": "BookStore",
"name": "BookStoreDomainSharedModule"
},
{
"declaringAssemblyName": "Volo.Abp.FeatureManagement.Application.Contracts",
"namespace": "Volo.Abp.FeatureManagement",
"name": "AbpFeatureManagementApplicationContractsModule"
},
{
"declaringAssemblyName": "Volo.Abp.SettingManagement.Application.Contracts",
"namespace": "Volo.Abp.SettingManagement",
"name": "AbpSettingManagementApplicationContractsModule"
},
{
"declaringAssemblyName": "Volo.Abp.Identity.Pro.Application.Contracts",
"namespace": "Volo.Abp.Identity",
"name": "AbpIdentityApplicationContractsModule"
},
{
"declaringAssemblyName": "Volo.Abp.Account.Pro.Public.Application.Contracts",
"namespace": "Volo.Abp.Account",
"name": "AbpAccountPublicApplicationContractsModule"
},
{
"declaringAssemblyName": "Volo.Abp.Account.Pro.Admin.Application.Contracts",
"namespace": "Volo.Abp.Account",
"name": "AbpAccountAdminApplicationContractsModule"
},
{
"declaringAssemblyName": "Volo.Abp.AuditLogging.Application.Contracts",
"namespace": "Volo.Abp.AuditLogging",
"name": "AbpAuditLoggingApplicationContractsModule"
},
{
"declaringAssemblyName": "Volo.Abp.OpenIddict.Pro.Application.Contracts",
"namespace": "Volo.Abp.OpenIddict",
"name": "AbpOpenIddictProApplicationContractsModule"
},
{
"declaringAssemblyName": "Volo.Abp.TextTemplateManagement.Application.Contracts",
"namespace": "Volo.Abp.TextTemplateManagement",
"name": "TextTemplateManagementApplicationContractsModule"
},
{
"declaringAssemblyName": "Volo.Abp.LanguageManagement.Application.Contracts",
"namespace": "Volo.Abp.LanguageManagement",
"name": "LanguageManagementApplicationContractsModule"
},
{
"declaringAssemblyName": "Volo.Abp.Gdpr.Application.Contracts",
"namespace": "Volo.Abp.Gdpr",
"name": "AbpGdprApplicationContractsModule"
},
{
"declaringAssemblyName": "Volo.Abp.PermissionManagement.Application.Contracts",
"namespace": "Volo.Abp.PermissionManagement",
"name": "AbpPermissionManagementApplicationContractsModule"
}
],
"implementingInterfaces": [
{
"name": "IAbpModule",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IAbpModule"
},
{
"name": "IOnPreApplicationInitialization",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IOnPreApplicationInitialization"
},
{
"name": "IOnApplicationInitialization",
"namespace": "Volo.Abp",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.IOnApplicationInitialization"
},
{
"name": "IOnPostApplicationInitialization",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IOnPostApplicationInitialization"
},
{
"name": "IOnApplicationShutdown",
"namespace": "Volo.Abp",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.IOnApplicationShutdown"
},
{
"name": "IPreConfigureServices",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IPreConfigureServices"
},
{
"name": "IPostConfigureServices",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IPostConfigureServices"
}
],
"contentType": "abpModule",
"name": "BookStoreApplicationContractsModule",
"summary": null
}
]
}

24
samples/WebAppBlazorWebAssembly/src/BookStore.Application.Contracts/BookStore.Application.Contracts.csproj

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<RootNamespace>BookStore</RootNamespace>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\BookStore.Domain.Shared\BookStore.Domain.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.PermissionManagement.Application.Contracts" />
<PackageReference Include="Volo.Abp.FeatureManagement.Application.Contracts" />
<PackageReference Include="Volo.Abp.SettingManagement.Application.Contracts" />
<PackageReference Include="Volo.Abp.Identity.Application.Contracts" />
<PackageReference Include="Volo.Abp.Account.Application.Contracts" />
<PackageReference Include="Volo.Abp.TenantManagement.Application.Contracts" />
</ItemGroup>
</Project>

26
samples/WebAppBlazorWebAssembly/src/BookStore.Application.Contracts/BookStoreApplicationContractsModule.cs

@ -0,0 +1,26 @@
using Volo.Abp.Account;
using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement;
using Volo.Abp.SettingManagement;
using Volo.Abp.FeatureManagement;
using Volo.Abp.Identity;
using Volo.Abp.TenantManagement;
namespace BookStore;
[DependsOn(
typeof(BookStoreDomainSharedModule),
typeof(AbpFeatureManagementApplicationContractsModule),
typeof(AbpSettingManagementApplicationContractsModule),
typeof(AbpIdentityApplicationContractsModule),
typeof(AbpAccountApplicationContractsModule),
typeof(AbpTenantManagementApplicationContractsModule),
typeof(AbpPermissionManagementApplicationContractsModule)
)]
public class BookStoreApplicationContractsModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
BookStoreDtoExtensions.Configure();
}
}

28
samples/WebAppBlazorWebAssembly/src/BookStore.Application.Contracts/BookStoreDtoExtensions.cs

@ -0,0 +1,28 @@
using Volo.Abp.Identity;
using Volo.Abp.ObjectExtending;
using Volo.Abp.Threading;
namespace BookStore;
public static class BookStoreDtoExtensions
{
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();
public static void Configure()
{
OneTimeRunner.Run(() =>
{
/* You can add extension properties to DTOs
* defined in the depended modules.
*
* Example:
*
* ObjectExtensionManager.Instance
* .AddOrUpdateProperty<IdentityRoleDto, string>("Title");
*
* See the documentation for more:
* https://docs.abp.io/en/abp/latest/Object-Extensions
*/
});
}
}

22
samples/WebAppBlazorWebAssembly/src/BookStore.Application.Contracts/Permissions/BookStorePermissionDefinitionProvider.cs

@ -0,0 +1,22 @@
using BookStore.Localization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization;
using Volo.Abp.MultiTenancy;
namespace BookStore.Permissions;
public class BookStorePermissionDefinitionProvider : PermissionDefinitionProvider
{
public override void Define(IPermissionDefinitionContext context)
{
var myGroup = context.AddGroup(BookStorePermissions.GroupName);
//Define your own permissions here. Example:
//myGroup.AddPermission(BookStorePermissions.MyPermission1, L("Permission:MyPermission1"));
}
private static LocalizableString L(string name)
{
return LocalizableString.Create<BookStoreResource>(name);
}
}

11
samples/WebAppBlazorWebAssembly/src/BookStore.Application.Contracts/Permissions/BookStorePermissions.cs

@ -0,0 +1,11 @@
namespace BookStore.Permissions;
public static class BookStorePermissions
{
public const string GroupName = "BookStore";
//Add your own permission names. Example:
//public const string MyPermission1 = GroupName + ".MyPermission1";
}

3
samples/WebAppBlazorWebAssembly/src/BookStore.Application/BookStore.Application.abppkg

@ -0,0 +1,3 @@
{
"role": "lib.application"
}

123
samples/WebAppBlazorWebAssembly/src/BookStore.Application/BookStore.Application.abppkg.analyze.json

@ -0,0 +1,123 @@
{
"name": "BookStore.Application",
"hash": "",
"contents": [
{
"namespace": "BookStore",
"dependsOnModules": [
{
"declaringAssemblyName": "BookStore.Domain",
"namespace": "BookStore",
"name": "BookStoreDomainModule"
},
{
"declaringAssemblyName": "BookStore.Application.Contracts",
"namespace": "BookStore",
"name": "BookStoreApplicationContractsModule"
},
{
"declaringAssemblyName": "Volo.Abp.PermissionManagement.Application",
"namespace": "Volo.Abp.PermissionManagement",
"name": "AbpPermissionManagementApplicationModule"
},
{
"declaringAssemblyName": "Volo.Abp.FeatureManagement.Application",
"namespace": "Volo.Abp.FeatureManagement",
"name": "AbpFeatureManagementApplicationModule"
},
{
"declaringAssemblyName": "Volo.Abp.Identity.Pro.Application",
"namespace": "Volo.Abp.Identity",
"name": "AbpIdentityApplicationModule"
},
{
"declaringAssemblyName": "Volo.Abp.Account.Pro.Public.Application",
"namespace": "Volo.Abp.Account",
"name": "AbpAccountPublicApplicationModule"
},
{
"declaringAssemblyName": "Volo.Abp.Account.Pro.Admin.Application",
"namespace": "Volo.Abp.Account",
"name": "AbpAccountAdminApplicationModule"
},
{
"declaringAssemblyName": "Volo.Abp.AuditLogging.Application",
"namespace": "Volo.Abp.AuditLogging",
"name": "AbpAuditLoggingApplicationModule"
},
{
"declaringAssemblyName": "Volo.Abp.TextTemplateManagement.Application",
"namespace": "Volo.Abp.TextTemplateManagement",
"name": "TextTemplateManagementApplicationModule"
},
{
"declaringAssemblyName": "Volo.Abp.OpenIddict.Pro.Application",
"namespace": "Volo.Abp.OpenIddict",
"name": "AbpOpenIddictProApplicationModule"
},
{
"declaringAssemblyName": "Volo.Abp.LanguageManagement.Application",
"namespace": "Volo.Abp.LanguageManagement",
"name": "LanguageManagementApplicationModule"
},
{
"declaringAssemblyName": "Volo.Abp.Gdpr.Application",
"namespace": "Volo.Abp.Gdpr",
"name": "AbpGdprApplicationModule"
},
{
"declaringAssemblyName": "Volo.Abp.SettingManagement.Application",
"namespace": "Volo.Abp.SettingManagement",
"name": "AbpSettingManagementApplicationModule"
}
],
"implementingInterfaces": [
{
"name": "IAbpModule",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IAbpModule"
},
{
"name": "IOnPreApplicationInitialization",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IOnPreApplicationInitialization"
},
{
"name": "IOnApplicationInitialization",
"namespace": "Volo.Abp",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.IOnApplicationInitialization"
},
{
"name": "IOnPostApplicationInitialization",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IOnPostApplicationInitialization"
},
{
"name": "IOnApplicationShutdown",
"namespace": "Volo.Abp",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.IOnApplicationShutdown"
},
{
"name": "IPreConfigureServices",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IPreConfigureServices"
},
{
"name": "IPostConfigureServices",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IPostConfigureServices"
}
],
"contentType": "abpModule",
"name": "BookStoreApplicationModule",
"summary": null
}
]
}

25
samples/WebAppBlazorWebAssembly/src/BookStore.Application/BookStore.Application.csproj

@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<RootNamespace>BookStore</RootNamespace>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\BookStore.Domain\BookStore.Domain.csproj" />
<ProjectReference Include="..\BookStore.Application.Contracts\BookStore.Application.Contracts.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.PermissionManagement.Application" />
<PackageReference Include="Volo.Abp.FeatureManagement.Application" />
<PackageReference Include="Volo.Abp.SettingManagement.Application" />
<PackageReference Include="Volo.Abp.Account.Application" />
<PackageReference Include="Volo.Abp.Identity.Application" />
<PackageReference Include="Volo.Abp.TenantManagement.Application" />
</ItemGroup>
</Project>

14
samples/WebAppBlazorWebAssembly/src/BookStore.Application/BookStoreAppService.cs

@ -0,0 +1,14 @@
using BookStore.Localization;
using Volo.Abp.Application.Services;
namespace BookStore;
/* Inherit your application services from this class.
*/
public abstract class BookStoreAppService : ApplicationService
{
protected BookStoreAppService()
{
LocalizationResource = typeof(BookStoreResource);
}
}

13
samples/WebAppBlazorWebAssembly/src/BookStore.Application/BookStoreApplicationAutoMapperProfile.cs

@ -0,0 +1,13 @@
using AutoMapper;
namespace BookStore;
public class BookStoreApplicationAutoMapperProfile : Profile
{
public BookStoreApplicationAutoMapperProfile()
{
/* You can configure your AutoMapper mapping configuration here.
* Alternatively, you can split your mapping configurations
* into multiple profile classes for a better organization. */
}
}

31
samples/WebAppBlazorWebAssembly/src/BookStore.Application/BookStoreApplicationModule.cs

@ -0,0 +1,31 @@
using Volo.Abp.PermissionManagement;
using Volo.Abp.SettingManagement;
using Volo.Abp.Account;
using Volo.Abp.Identity;
using Volo.Abp.AutoMapper;
using Volo.Abp.FeatureManagement;
using Volo.Abp.Modularity;
using Volo.Abp.TenantManagement;
namespace BookStore;
[DependsOn(
typeof(BookStoreDomainModule),
typeof(BookStoreApplicationContractsModule),
typeof(AbpPermissionManagementApplicationModule),
typeof(AbpFeatureManagementApplicationModule),
typeof(AbpIdentityApplicationModule),
typeof(AbpAccountApplicationModule),
typeof(AbpTenantManagementApplicationModule),
typeof(AbpSettingManagementApplicationModule)
)]
public class BookStoreApplicationModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpAutoMapperOptions>(options =>
{
options.AddMaps<BookStoreApplicationModule>();
});
}
}

2
samples/WebAppBlazorWebAssembly/src/BookStore.Application/Properties/AssemblyInfo.cs

@ -0,0 +1,2 @@
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleToAttribute("BookStore.Application.Tests")]

3
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStore.Blazor.Client.abppkg

@ -0,0 +1,3 @@
{
"role": "lib.blazor-wasm-client"
}

38
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStore.Blazor.Client.csproj

@ -0,0 +1,38 @@
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
</PropertyGroup>
<ItemGroup>
<!-- <PackageReference Include="Blazorise.Bootstrap5" Version="1.7.6" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.7.6" />
<PackageReference Include="Blazorise.Components" Version="1.7.6" /> -->
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Autofac.WebAssembly" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\modules\AntDesignTheme\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.csproj" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\modules\IdentityManagement\Lsw.Abp.IdentityManagement.Blazor.WebAssembly.AntDesignUI\Lsw.Abp.IdentityManagement.Blazor.WebAssembly.AntDesignUI.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="..\..\..\..\modules\FeatureManagement\Lsw.Abp.FeatureManagement.Blazor.WebAssembly.AntDesignUI\Lsw.Abp.FeatureManagement.Blazor.WebAssembly.AntDesignUI.csproj" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\BookStore.HttpApi.Client\BookStore.HttpApi.Client.csproj" />
</ItemGroup>
</Project>

11
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStoreBlazorAutoMapperProfile.cs

@ -0,0 +1,11 @@
using AutoMapper;
namespace BookStore.Blazor.Client;
public class BookStoreBlazorAutoMapperProfile : Profile
{
public BookStoreBlazorAutoMapperProfile()
{
//Define your AutoMapper configuration here for the Blazor project.
}
}

112
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStoreBlazorClientModule.cs

@ -0,0 +1,112 @@
using System;
using System.Net.Http;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using BookStore.Blazor.Client.Navigation;
using Localization.Resources.AbpUi;
using Volo.Abp.Localization;
using BookStore.Localization;
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Routing;
using Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme;
using Lsw.Abp.FeatureManagement.Blazor.WebAssembly.AntDesignUI;
using Lsw.Abp.IdentityManagement.Blazor.WebAssembly.AntDesignUI;
using Lsw.Abp.SettingManagement.Blazor.WebAssembly.AntDesignUI;
using Lsw.Abp.TenantManagement.Blazor.WebAssembly.AntDesignUI;
using OpenIddict.Abstractions;
using Volo.Abp.Autofac.WebAssembly;
using Volo.Abp.AutoMapper;
using Volo.Abp.Modularity;
using Volo.Abp.UI.Navigation;
namespace BookStore.Blazor.Client;
[DependsOn(
typeof(AbpAutofacWebAssemblyModule),
typeof(AbpIdentityBlazorWebAssemblyAntDesignModule),
typeof(AbpSettingManagementBlazorWebAssemblyAntDesignModule),
typeof(AbpFeatureManagementBlazorWebAssemblyAntDesignModule),
typeof(AbpTenantManagementBlazorWebAssemblyAntDesignModule),
typeof(AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule),
typeof(BookStoreHttpApiClientModule)
)]
public class BookStoreBlazorClientModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var environment = context.Services.GetSingletonInstance<IWebAssemblyHostEnvironment>();
var builder = context.Services.GetSingletonInstance<WebAssemblyHostBuilder>();
ConfigureLocalization();
ConfigureAuthentication(builder);
ConfigureHttpClient(context, environment);
//ConfigureBlazorise(context);
ConfigureRouter(context);
ConfigureMenu(context);
ConfigureAutoMapper(context);
}
private void ConfigureLocalization()
{
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Get<BookStoreResource>()
.AddBaseTypes(typeof(AbpUiResource));
});
}
private void ConfigureRouter(ServiceConfigurationContext context)
{
Configure<AbpRouterOptions>(options =>
{
options.AppAssembly = typeof(BookStoreBlazorClientModule).Assembly;
});
}
private void ConfigureMenu(ServiceConfigurationContext context)
{
Configure<AbpNavigationOptions>(options =>
{
options.MenuContributors.Add(new BookStoreMenuContributor(context.Services.GetConfiguration()));
});
}
// private void ConfigureBlazorise(ServiceConfigurationContext context)
// {
// context.Services
// .AddBootstrap5Providers()
// .AddFontAwesomeIcons();
// }
private static void ConfigureAuthentication(WebAssemblyHostBuilder builder)
{
builder.Services.AddOidcAuthentication(options =>
{
builder.Configuration.Bind("AuthServer", options.ProviderOptions);
options.UserOptions.NameClaim = OpenIddictConstants.Claims.Name;
options.UserOptions.RoleClaim = OpenIddictConstants.Claims.Role;
options.ProviderOptions.DefaultScopes.Add("BookStore");
options.ProviderOptions.DefaultScopes.Add("roles");
options.ProviderOptions.DefaultScopes.Add("email");
options.ProviderOptions.DefaultScopes.Add("phone");
});
}
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<BookStoreBlazorClientModule>();
});
}
}

21
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStoreBrandingProvider.cs

@ -0,0 +1,21 @@
using Microsoft.Extensions.Localization;
using BookStore.Localization;
using Microsoft.Extensions.Localization;
using BookStore.Localization;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Ui.Branding;
namespace BookStore.Blazor.Client;
[Dependency(ReplaceServices = true)]
public class BookStoreBrandingProvider : DefaultBrandingProvider
{
private IStringLocalizer<BookStoreResource> _localizer;
public BookStoreBrandingProvider(IStringLocalizer<BookStoreResource> localizer)
{
_localizer = localizer;
}
public override string AppName => _localizer["AppName"];
}

12
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStoreComponentBase.cs

@ -0,0 +1,12 @@
using BookStore.Localization;
using Volo.Abp.AspNetCore.Components;
namespace BookStore.Blazor.Client;
public abstract class BookStoreComponentBase : AbpComponentBase
{
protected BookStoreComponentBase()
{
LocalizationResource = typeof(BookStoreResource);
}
}

81
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/Navigation/BookStoreMenuContributor.cs

@ -0,0 +1,81 @@
using System;
using System.Threading.Tasks;
using AntDesign;
using Microsoft.Extensions.Configuration;
using BookStore.Localization;
using BookStore.Permissions;
using BookStore.MultiTenancy;
using Lsw.Abp.IdentityManagement.Blazor.AntDesignUI;
using Lsw.Abp.SettingManagement.Blazor.AntDesignUI;
using Lsw.Abp.TenantManagement.Blazor.AntDesignUI;
using Volo.Abp.Account.Localization;
using Volo.Abp.UI.Navigation;
using Volo.Abp.Authorization.Permissions;
namespace BookStore.Blazor.Client.Navigation;
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 static async Task ConfigureMainMenuAsync(MenuConfigurationContext context)
{
var l = context.GetLocalizer<BookStoreResource>();
//Administration
var administration = context.Menu.GetAdministration();
administration.Order = 6;
context.Menu.AddItem(new ApplicationMenuItem(
BookStoreMenus.Home,
l["Menu:Home"],
"/",
icon: IconType.Outline.Home,
order: 1
));
if (MultiTenancyConsts.IsEnabled)
{
administration.SetSubItemOrder(TenantManagementMenuNames.GroupName, 1);
}
else
{
administration.TryRemoveMenuItem(TenantManagementMenuNames.GroupName);
}
administration.SetSubItemOrder(IdentityMenuNames.GroupName, 2);
administration.SetSubItemOrder(SettingManagementMenus.GroupName, 3);
}
private async Task ConfigureUserMenuAsync(MenuConfigurationContext context)
{
var accountStringLocalizer = context.GetLocalizer<AccountResource>();
var authServerUrl = _configuration["AuthServer:Authority"] ?? "";
context.Menu.AddItem(new ApplicationMenuItem(
"Account.Manage",
accountStringLocalizer["MyAccount"],
$"{authServerUrl.EnsureEndsWith('/')}Account/Manage",
icon: IconType.Outline.Setting,
order: 1000,
target: "_blank").RequireAuthenticated());
await Task.CompletedTask;
}
}

8
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/Navigation/BookStoreMenus.cs

@ -0,0 +1,8 @@
namespace BookStore.Blazor.Client.Navigation;
public class BookStoreMenus
{
private const string Prefix = "BookStore";
public const string Home = Prefix + ".Home";
}

17
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/Pages/Index.razor

@ -0,0 +1,17 @@
@page "/"
@inherits BookStoreComponentBase
<AbpPageHeader Title="Index"></AbpPageHeader>
<div class="page-content">
<div style="text-align: center">
<Alert Type="@AlertType.Success"
Message="Success"
Description=" Congratulations, BookStore is successfully running!"
ShowIcon="true"/>
<Divider/>
</div>
</div>

6
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/Pages/Index.razor.cs

@ -0,0 +1,6 @@
namespace BookStore.Blazor.Client.Pages;
public partial class Index
{
}

17
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/Pages/Index.razor.css

@ -0,0 +1,17 @@
/* Getting-Started */
.card-bg-image {
pointer-events: none;
position: absolute;
width: 630px;
height: auto;
bottom: 0;
right: 0;
z-index: 1;
}
.starting-content {
position: relative;
z-index: 2;
}
/* Getting-Started End */
/* Write here your styles for the Index page */

23
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/Program.cs

@ -0,0 +1,23 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
namespace BookStore.Blazor.Client;
public class Program
{
public async static Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
var application = await builder.AddApplicationAsync<BookStoreBlazorClientModule>(options =>
{
options.UseAutofac();
});
var host = builder.Build();
await application.InitializeApplicationAsync(host.Services);
await host.RunAsync();
}
}

14
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/Routes.razor

@ -0,0 +1,14 @@
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Routing
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesignTheme
@using Microsoft.Extensions.Options
@using Volo.Abp.AspNetCore.Components.WebAssembly.WebApp
<Router AppAssembly="typeof(Program).Assembly" AdditionalAssemblies="WebAppAdditionalAssembliesHelper.GetAssemblies<BookStoreBlazorClientModule>()">
<Found Context="routeData">
<AuthorizeRouteView RouteData="routeData" DefaultLayout="typeof(DefaultLayout)">
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
</AuthorizeRouteView>
</Found>
</Router>

16
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/_Imports.razor

@ -0,0 +1,16 @@
@using System.Net.Http
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using static Microsoft.AspNetCore.Components.Web.RenderMode
@using Microsoft.JSInterop
@using Volo.Abp.AspNetCore.Components
@using Volo.Abp.AspNetCore.Components.WebAssembly
@using BookStore.Blazor.Client
@using AntDesign
@using Lsw.Abp.AntDesignUI
@using Lsw.Abp.AntDesignUI.Components
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Layout
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Bundling

3
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/appsettings.Development.json

@ -0,0 +1,3 @@
{
}

18
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/appsettings.json

@ -0,0 +1,18 @@
{
"App": {
"SelfUrl": "https://localhost:44376"
},
"AuthServer": {
"Authority": "https://localhost:44318",
"ClientId": "BookStore_Blazor",
"ResponseType": "code"
},
"RemoteServices": {
"Default": {
"BaseUrl": "https://localhost:44318"
},
"AbpAccountPublic": {
"BaseUrl": "https://localhost:44318"
}
}
}

BIN
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/favicon.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/icon-192.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/icon-512.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/bg-01.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/book.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

7
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/discord.svg

@ -0,0 +1,7 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame 1416">
<g id="Group">
<path id="Vector" d="M16.9419 3.29661C15.6473 2.69088 14.263 2.25066 12.8157 2C12.638 2.32134 12.4304 2.75355 12.2872 3.09738C10.7487 2.86601 9.22445 2.86601 7.7143 3.09738C7.57116 2.75355 7.3588 2.32134 7.17947 2C5.73067 2.25066 4.3448 2.6925 3.05016 3.29982C0.438869 7.24582 -0.269009 11.0938 0.0849305 14.8872C1.81688 16.1805 3.49534 16.9662 5.14548 17.4804C5.55291 16.9196 5.91628 16.3235 6.22931 15.6953C5.63313 15.4688 5.06211 15.1892 4.52256 14.8647C4.6657 14.7586 4.80571 14.6478 4.94098 14.5337C8.23183 16.0729 11.8074 16.0729 15.0589 14.5337C15.1958 14.6478 15.3358 14.7586 15.4774 14.8647C14.9362 15.1908 14.3637 15.4704 13.7675 15.697C14.0805 16.3235 14.4423 16.9212 14.8513 17.4819C16.503 16.9678 18.183 16.1822 19.915 14.8872C20.3303 10.4897 19.2056 6.67705 16.9419 3.29661ZM6.67765 12.5543C5.68977 12.5543 4.87963 11.632 4.87963 10.509C4.87963 9.38591 5.67247 8.46208 6.67765 8.46208C7.68285 8.46208 8.49297 9.38429 8.47567 10.509C8.47723 11.632 7.68285 12.5543 6.67765 12.5543ZM13.3223 12.5543C12.3344 12.5543 11.5243 11.632 11.5243 10.509C11.5243 9.38591 12.3171 8.46208 13.3223 8.46208C14.3275 8.46208 15.1376 9.38429 15.1203 10.509C15.1203 11.632 14.3275 12.5543 13.3223 12.5543Z" fill="#5865F2"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/img-blog.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/img-community.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/img-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

23
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/instagram.svg

@ -0,0 +1,23 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_425_4536)">
<path d="M10.014 -0.00549316C5.8391 -0.00549316 4.6181 -0.00118628 4.38076 0.0185023C3.524 0.0897197 2.99087 0.224617 2.41005 0.513794C1.96244 0.73606 1.60943 0.993704 1.26104 1.35487C0.626541 2.01351 0.241998 2.82382 0.102793 3.78702C0.0351137 4.25463 0.0154251 4.35 0.0114258 6.73847C0.00988765 7.53463 0.0114258 8.58243 0.0114258 9.98786C0.0114258 14.1594 0.0160403 15.3792 0.0360366 15.616C0.105254 16.4497 0.235999 16.9742 0.51287 17.548C1.042 18.6462 2.05258 19.4707 3.24313 19.7783C3.65536 19.8845 4.11066 19.9429 4.69516 19.9706C4.94281 19.9814 7.46695 19.9891 9.99263 19.9891C12.5183 19.9891 15.044 19.986 15.2855 19.9737C15.9623 19.9418 16.3553 19.8891 16.7898 19.7768C17.988 19.4676 18.9802 18.6555 19.5201 17.5418C19.7916 16.9819 19.9292 16.4374 19.9915 15.6473C20.0051 15.475 20.0107 12.7283 20.0107 9.98524C20.0107 7.24176 20.0046 4.50012 19.9911 4.32785C19.928 3.52492 19.7903 2.98502 19.5101 2.41436C19.2801 1.94722 19.0248 1.59836 18.6541 1.24166C17.9925 0.609776 17.1834 0.225233 16.2193 0.0861819C15.7522 0.0186561 15.6591 -0.0013401 13.2688 -0.00549316H10.014Z" fill="url(#paint0_radial_425_4536)"/>
<path d="M10.014 -0.00549316C5.8391 -0.00549316 4.6181 -0.00118628 4.38076 0.0185023C3.524 0.0897197 2.99087 0.224617 2.41005 0.513794C1.96244 0.73606 1.60943 0.993704 1.26104 1.35487C0.626541 2.01351 0.241998 2.82382 0.102793 3.78702C0.0351137 4.25463 0.0154251 4.35 0.0114258 6.73847C0.00988765 7.53463 0.0114258 8.58243 0.0114258 9.98786C0.0114258 14.1594 0.0160403 15.3792 0.0360366 15.616C0.105254 16.4497 0.235999 16.9742 0.51287 17.548C1.042 18.6462 2.05258 19.4707 3.24313 19.7783C3.65536 19.8845 4.11066 19.9429 4.69516 19.9706C4.94281 19.9814 7.46695 19.9891 9.99263 19.9891C12.5183 19.9891 15.044 19.986 15.2855 19.9737C15.9623 19.9418 16.3553 19.8891 16.7898 19.7768C17.988 19.4676 18.9802 18.6555 19.5201 17.5418C19.7916 16.9819 19.9292 16.4374 19.9915 15.6473C20.0051 15.475 20.0107 12.7283 20.0107 9.98524C20.0107 7.24176 20.0046 4.50012 19.9911 4.32785C19.928 3.52492 19.7903 2.98502 19.5101 2.41436C19.2801 1.94722 19.0248 1.59836 18.6541 1.24166C17.9925 0.609776 17.1834 0.225233 16.2193 0.0861819C15.7522 0.0186561 15.6591 -0.0013401 13.2688 -0.00549316H10.014Z" fill="url(#paint1_radial_425_4536)"/>
<path d="M10.0093 2.60938C8.00417 2.60938 7.75252 2.61814 6.96498 2.65398C6.17897 2.68998 5.64246 2.81441 5.17301 2.99699C4.68741 3.18557 4.27549 3.43783 3.8651 3.84837C3.45441 4.25876 3.20215 4.67068 3.01295 5.15613C2.82991 5.62573 2.70532 6.1624 2.66994 6.9481C2.63472 7.73564 2.62549 7.98744 2.62549 9.9926C2.62549 11.9978 2.63441 12.2486 2.6701 13.0362C2.70624 13.8222 2.83068 14.3587 3.01311 14.8282C3.20184 15.3138 3.4541 15.7257 3.86464 16.1361C4.27487 16.5468 4.68679 16.7996 5.17209 16.9882C5.64184 17.1708 6.17851 17.2952 6.96436 17.3312C7.75191 17.3671 8.0034 17.3758 10.0084 17.3758C12.0137 17.3758 12.2646 17.3671 13.0521 17.3312C13.8381 17.2952 14.3753 17.1708 14.845 16.9882C15.3305 16.7996 15.7418 16.5468 16.152 16.1361C16.5627 15.7257 16.815 15.3138 17.0042 14.8283C17.1857 14.3587 17.3103 13.822 17.3472 13.0363C17.3826 12.2488 17.3918 11.9978 17.3918 9.9926C17.3918 7.98744 17.3826 7.7358 17.3472 6.94825C17.3103 6.16225 17.1857 5.62573 17.0042 5.15628C16.815 4.67068 16.5627 4.25876 16.152 3.84837C15.7413 3.43768 15.3306 3.18542 14.8446 2.99699C14.3739 2.81441 13.8371 2.68998 13.0511 2.65398C12.2635 2.61814 12.0128 2.60938 10.007 2.60938H10.0093ZM9.34699 3.93989C9.54357 3.93959 9.76291 3.93989 10.0093 3.93989C11.9807 3.93989 12.2143 3.94697 12.9928 3.98235C13.7126 4.01526 14.1033 4.13555 14.3636 4.23661C14.7081 4.37043 14.9538 4.5304 15.212 4.78881C15.4705 5.04722 15.6304 5.29333 15.7646 5.63788C15.8656 5.89783 15.9861 6.28853 16.0188 7.00839C16.0542 7.78671 16.0619 8.02051 16.0619 9.99091C16.0619 11.9613 16.0542 12.1951 16.0188 12.9734C15.9859 13.6933 15.8656 14.084 15.7646 14.3439C15.6307 14.6885 15.4705 14.9338 15.212 15.1921C14.9536 15.4505 14.7083 15.6105 14.3636 15.7443C14.1036 15.8458 13.7126 15.9658 12.9928 15.9987C12.2145 16.0341 11.9807 16.0418 10.0093 16.0418C8.03785 16.0418 7.80421 16.0341 7.02589 15.9987C6.30603 15.9655 5.91533 15.8452 5.65492 15.7441C5.31037 15.6103 5.06426 15.4503 4.80585 15.1919C4.54743 14.9335 4.38746 14.688 4.25334 14.3433C4.15228 14.0834 4.03184 13.6927 3.99908 12.9728C3.9637 12.1945 3.95662 11.9607 3.95662 9.98906C3.95662 8.01744 3.9637 7.78486 3.99908 7.00655C4.03199 6.28668 4.15228 5.89599 4.25334 5.63573C4.38716 5.29118 4.54743 5.04507 4.80585 4.78666C5.06426 4.52824 5.31037 4.36828 5.65492 4.23415C5.91518 4.13263 6.30603 4.01265 7.02589 3.97958C7.70699 3.94882 7.97094 3.93959 9.34699 3.93805V3.93989ZM13.9504 5.16582C13.4613 5.16582 13.0644 5.5622 13.0644 6.0515C13.0644 6.54064 13.4613 6.93748 13.9504 6.93748C14.4396 6.93748 14.8364 6.54064 14.8364 6.0515C14.8364 5.56236 14.4396 5.16551 13.9504 5.16551V5.16582ZM10.0093 6.20101C7.91542 6.20101 6.21774 7.89869 6.21774 9.9926C6.21774 12.0865 7.91542 13.7834 10.0093 13.7834C12.1032 13.7834 13.8003 12.0865 13.8003 9.9926C13.8003 7.89869 12.1032 6.20101 10.0093 6.20101ZM10.0093 7.53153C11.3685 7.53153 12.4704 8.63332 12.4704 9.9926C12.4704 11.3517 11.3685 12.4537 10.0093 12.4537C8.65005 12.4537 7.54825 11.3517 7.54825 9.9926C7.54825 8.63332 8.65005 7.53153 10.0093 7.53153Z" fill="white"/>
</g>
<defs>
<radialGradient id="paint0_radial_425_4536" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(5.32327 21.5291) rotate(-90) scale(19.8161 18.4355)">
<stop stop-color="#FFDD55"/>
<stop offset="0.1" stop-color="#FFDD55"/>
<stop offset="0.5" stop-color="#FF543E"/>
<stop offset="1" stop-color="#C837AB"/>
</radialGradient>
<radialGradient id="paint1_radial_425_4536" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(-3.33936 1.43488) rotate(78.6776) scale(8.85796 36.5221)">
<stop stop-color="#3771C8"/>
<stop offset="0.128" stop-color="#3771C8"/>
<stop offset="1" stop-color="#6600FF" stop-opacity="0"/>
</radialGradient>
<clipPath id="clip0_425_4536">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

4
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/stack-overflow.svg

@ -0,0 +1,4 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.418 16.5774V12.291H15.8406V18H3V12.291H4.42263V16.5774H14.418Z" fill="#BCBBBB"/>
<path d="M5.99302 11.8845L12.9769 13.3441L13.2725 11.94L6.28863 10.4804L5.99302 11.8845ZM6.91681 8.55889L13.3833 11.5704L13.9745 10.2771L7.50803 7.24711L6.91681 8.55889ZM8.70896 5.38106L14.1963 9.94457L15.1016 8.8545L9.61427 4.29099L8.70896 5.38106ZM12.2563 2L11.1108 2.84988L15.3602 8.57737L16.5057 7.72748L12.2563 2ZM5.84521 15.1363H12.9769V13.7136H5.84521V15.1363Z" fill="#F48023"/>
</svg>

After

Width:  |  Height:  |  Size: 583 B

3
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/x-white.svg

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.5158 8.77569L17.4682 2H16.0582L10.8875 7.88203L6.76083 2H2L8.24173 10.8955L2 18H3.41003L8.86681 11.787L13.2258 18H17.9867M3.91893 3.04127H6.08513L16.0571 17.0099H13.8904" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 302 B

11
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/getting-started/youtube.svg

@ -0,0 +1,11 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_425_4528)">
<path d="M19.5818 5.18637C19.3513 4.32532 18.6746 3.64867 17.8136 3.41818C16.2545 3 9.99996 3 9.99996 3C9.99996 3 3.74547 3 2.18636 3.41818C1.32532 3.64867 0.648666 4.32532 0.418176 5.18637C1.25176e-07 6.74547 0 10.0003 0 10.0003C0 10.0003 1.25176e-07 13.2552 0.418176 14.8143C0.648666 15.6753 1.32532 16.352 2.18636 16.5825C3.74547 17.0007 9.99996 17.0007 9.99996 17.0007C9.99996 17.0007 16.2545 17.0007 17.8136 16.5825C18.6746 16.352 19.3513 15.6753 19.5818 14.8143C20 13.2552 20 10.0003 20 10.0003C20 10.0003 19.9983 6.74547 19.5818 5.18637Z" fill="#FF0000"/>
<path d="M7.99854 13.0003L13.1945 10.0007L7.99854 7.00098V13.0003Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_425_4528">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 893 B

BIN
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/logo/leptonxlite/logo-dark-thumbnail.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/logo/leptonxlite/logo-dark.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/logo/leptonxlite/logo-light-thumbnail.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

BIN
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/images/logo/leptonxlite/logo-light.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

45
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/main.css

@ -0,0 +1,45 @@
/*
loader
*/
.loader {
position: fixed;
top: 0;
right: 0;
left: 0;
bottom: 0;
width: 100vw;
height: 100vh;
z-index: 999;
background-color: #f1f1f2;
}
#ApplicationContainer > div:first-child:not(:only-child) {
display: none !important;
}
#blazor-error-ui {
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}
:root {
--lpx-logo: url('/images/logo/leptonxlite/logo-light.png');
--lpx-logo-icon: url('/images/logo/leptonxlite/logo-light-thumbnail.png');
}
:root .abp-account-layout .lpx-brand-logo{
--lpx-logo: url('/images/logo/leptonxlite/logo-dark.png');
}

21
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/manifest.json

@ -0,0 +1,21 @@
{
"name": "BookStore",
"short_name": "BookStore",
"start_url": "./",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#03173d",
"prefer_related_applications": false,
"icons": [
{
"src": "icon-512.png",
"type": "image/png",
"sizes": "512x512"
},
{
"src": "icon-192.png",
"type": "image/png",
"sizes": "192x192"
}
]
}

4
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/service-worker.js

@ -0,0 +1,4 @@
// In development, always fetch from the network and do not enable offline support.
// This is because caching would make development more difficult (changes would not
// be reflected on the first load after each change).
self.addEventListener('fetch', () => { });

48
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/wwwroot/service-worker.published.js

@ -0,0 +1,48 @@
// Caution! Be sure you understand the caveats before publishing an application with
// offline support. See https://aka.ms/blazor-offline-considerations
self.importScripts('./service-worker-assets.js');
self.addEventListener('install', event => event.waitUntil(onInstall(event)));
self.addEventListener('activate', event => event.waitUntil(onActivate(event)));
self.addEventListener('fetch', event => event.respondWith(onFetch(event)));
const cacheNamePrefix = 'offline-cache-';
const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`;
const offlineAssetsInclude = [ /\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/, /\.blat$/, /\.dat$/ ];
const offlineAssetsExclude = [ /^service-worker\.js$/ ];
async function onInstall(event) {
console.info('Service worker: Install');
// Fetch and cache all matching items from the assets manifest
const assetsRequests = self.assetsManifest.assets
.filter(asset => offlineAssetsInclude.some(pattern => pattern.test(asset.url)))
.filter(asset => !offlineAssetsExclude.some(pattern => pattern.test(asset.url)))
.map(asset => new Request(asset.url, { integrity: asset.hash, cache: 'no-cache' }));
await caches.open(cacheName).then(cache => cache.addAll(assetsRequests));
}
async function onActivate(event) {
console.info('Service worker: Activate');
// Delete unused caches
const cacheKeys = await caches.keys();
await Promise.all(cacheKeys
.filter(key => key.startsWith(cacheNamePrefix) && key !== cacheName)
.map(key => caches.delete(key)));
}
async function onFetch(event) {
let cachedResponse = null;
if (event.request.method === 'GET') {
// For all navigation requests, try to serve index.html from cache
// If you need some URLs to be server-rendered, edit the following check to exclude those URLs
const shouldServeIndexHtml = event.request.mode === 'navigate';
const request = shouldServeIndexHtml ? 'index.html' : event.request;
const cache = await caches.open(cacheName);
cachedResponse = await cache.match(request);
}
return cachedResponse || fetch(event.request);
}

3
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/BookStore.Blazor.abppkg

@ -0,0 +1,3 @@
{
"role": "host.blazor-wasm"
}

27
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/BookStore.Blazor.csproj

@ -0,0 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Serilog.AspNetCore" />
<PackageReference Include="Serilog.Sinks.Async" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" />
<PackageReference Include="Volo.Abp.Autofac" />
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Bundling" />
<ProjectReference Include="..\BookStore.Blazor.Client\BookStore.Blazor.Client.csproj" />
</ItemGroup>
<ItemGroup>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\modules\AntDesignTheme\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling.csproj" />
</ItemGroup>
</Project>

76
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/BookStoreBlazorModule.cs

@ -0,0 +1,76 @@
using BookStore.Blazor.Components;
using BookStore.Blazor.Client;
using Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling;
using Volo.Abp;
using Volo.Abp.AspNetCore.Components.WebAssembly.WebApp;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
using Volo.Abp.AspNetCore.Mvc.Libs;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
namespace BookStore.Blazor;
[DependsOn(
typeof(AbpAutofacModule),
typeof(AbpAspNetCoreComponentsWebAssemblyAntDesignThemeBundlingModule),
typeof(AbpAspNetCoreMvcUiBundlingModule)
)]
public class BookStoreBlazorModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
//https://github.com/dotnet/aspnetcore/issues/52530
Configure<RouteOptions>(options =>
{
options.SuppressCheckForUnhandledSecurityMetadata = true;
});
// Add services to the container.
context.Services.AddRazorComponents()
.AddInteractiveWebAssemblyComponents();
Configure<AbpMvcLibsOptions>(options =>
{
options.CheckLibs = false;
});
Configure<AbpBundlingOptions>(options =>
{
var globalStyles = options.StyleBundles.Get(BlazorWebAssemblyStandardBundles.Styles.Global);
globalStyles.AddContributors(typeof(BookStoreStyleBundleContributor));
var globalScripts = options.ScriptBundles.Get(BlazorWebAssemblyStandardBundles.Scripts.Global);
globalScripts.AddContributors(typeof(BookStoreScriptBundleContributor));
});
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var env = context.GetEnvironment();
var app = context.GetApplicationBuilder();
// Configure the HTTP request pipeline.
if (env.IsDevelopment())
{
app.UseWebAssemblyDebugging();
}
else
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseRouting();
app.MapAbpStaticAssets();
app.UseAntiforgery();
app.UseConfiguredEndpoints(builder =>
{
builder.MapRazorComponents<App>()
.AddInteractiveWebAssemblyRenderMode()
.AddAdditionalAssemblies(WebAppAdditionalAssembliesHelper.GetAssemblies<BookStoreBlazorClientModule>());
});
}
}

11
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/BookStoreScriptBundleContributor.cs

@ -0,0 +1,11 @@
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
namespace BookStore.Blazor;
public class BookStoreScriptBundleContributor : BundleContributor
{
public override void ConfigureBundle(BundleConfigurationContext context)
{
}
}

11
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/BookStoreStyleBundleContributor.cs

@ -0,0 +1,11 @@
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
namespace BookStore.Blazor;
public class BookStoreStyleBundleContributor : BundleContributor
{
public override void ConfigureBundle(BundleConfigurationContext context)
{
context.Files.Add(new BundleFile("main.css", true));
}
}

38
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/Components/App.razor

@ -0,0 +1,38 @@
<!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>MyCompanyName</title>
<base href="/" />
<!--ABP:Styles-->
<link href="global.css" rel="stylesheet"/>
<!--/ABP:Styles-->
@* <link href="BookStore.Blazor.Client.styles.css" rel="stylesheet"/> *@
<HeadOutlet @rendermode="new InteractiveWebAssemblyRenderMode(prerender: false)" />
</head>
<body class="abp-application-layout bg-light">
<script src="_framework/blazor.web.js"></script>
<div id="ApplicationContainer">
<div class="spinner">
<div class="double-bounce1"></div>
<div class="double-bounce2"></div>
</div>
<Routes @rendermode="new InteractiveWebAssemblyRenderMode(prerender: false)"/>
</div>
<!--ABP:Scripts-->
<script src="global.js"></script>
<!--/ABP:Scripts-->
</body>
</html>

5
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/Dockerfile

@ -0,0 +1,5 @@
FROM mcr.microsoft.com/dotnet/aspnet:9.0
COPY bin/Release/net9.0/publish/ app/
WORKDIR /app
ENV ASPNETCORE_URLS=http://+:80
ENTRYPOINT ["dotnet", "BookStore.Blazor.dll"]

8
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/Dockerfile.local

@ -0,0 +1,8 @@
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS build
USER $APP_UID
EXPOSE 8080
EXPOSE 8081
COPY bin/Release/net9.0/publish/ app/
WORKDIR /app
ENTRYPOINT ["dotnet", "BookStore.Blazor.dll"]

56
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/Program.cs

@ -0,0 +1,56 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using BookStore.Blazor;
using Serilog;
using Serilog.Events;
namespace BookStore.Blazor;
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)
.Enrich.FromLogContext()
.WriteTo.Async(c => c.File("Logs/logs.txt"))
.WriteTo.Async(c => c.Console())
.CreateLogger();
try
{
Log.Information("Starting web host.");
var builder = WebApplication.CreateBuilder(args);
builder.Host.AddAppSettingsSecretsJson()
.UseAutofac()
.UseSerilog();
await builder.AddApplicationAsync<BookStoreBlazorModule>();
var app = builder.Build();
await app.InitializeApplicationAsync();
await app.RunAsync();
return 0;
}
catch (Exception ex)
{
if (ex is HostAbortedException)
{
throw;
}
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
}

29
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/Properties/launchSettings.json

@ -0,0 +1,29 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "https://localhost:44376",
"sslPort": 44376
}
},
"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:44376",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

9
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor/_Imports.razor

@ -0,0 +1,9 @@
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using static Microsoft.AspNetCore.Components.Web.RenderMode
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using BookStore.Blazor.Client

1
samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/BookStore.DbMigrator.abppkg

@ -0,0 +1 @@
{}

46
samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/BookStore.DbMigrator.csproj

@ -0,0 +1,46 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Serilog.Extensions.Logging" />
<PackageReference Include="Serilog.Sinks.Async" />
<PackageReference Include="Serilog.Sinks.File" />
<PackageReference Include="Serilog.Sinks.Console" />
<PackageReference Include="Microsoft.Extensions.Hosting" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Autofac" />
<ProjectReference Include="..\BookStore.MongoDB\BookStore.MongoDB.csproj" />
<ProjectReference Include="..\BookStore.Application.Contracts\BookStore.Application.Contracts.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Remove="Logs\**" />
<Content Remove="Logs\**" />
<EmbeddedResource Remove="Logs\**" />
<None Remove="Logs\**" />
</ItemGroup>
<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>
</Project>

14
samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/BookStoreDbMigratorModule.cs

@ -0,0 +1,14 @@
using BookStore.MongoDB;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
namespace BookStore.DbMigrator;
[DependsOn(
typeof(AbpAutofacModule),
typeof(BookStoreMongoDbModule),
typeof(BookStoreApplicationContractsModule)
)]
public class BookStoreDbMigratorModule : AbpModule
{
}

51
samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/DbMigratorHostedService.cs

@ -0,0 +1,51 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using BookStore.Data;
using Serilog;
using Volo.Abp;
using Volo.Abp.Data;
namespace BookStore.DbMigrator;
public class DbMigratorHostedService : IHostedService
{
private readonly IHostApplicationLifetime _hostApplicationLifetime;
private readonly IConfiguration _configuration;
public DbMigratorHostedService(IHostApplicationLifetime hostApplicationLifetime, IConfiguration configuration)
{
_hostApplicationLifetime = hostApplicationLifetime;
_configuration = configuration;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
using (var application = await AbpApplicationFactory.CreateAsync<BookStoreDbMigratorModule>(options =>
{
options.Services.ReplaceConfiguration(_configuration);
options.UseAutofac();
options.Services.AddLogging(c => c.AddSerilog());
options.AddDataMigrationEnvironment();
}))
{
await application.InitializeAsync();
await application
.ServiceProvider
.GetRequiredService<BookStoreDbMigrationService>()
.MigrateAsync();
await application.ShutdownAsync();
_hostApplicationLifetime.StopApplication();
}
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}

5
samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/Dockerfile

@ -0,0 +1,5 @@
FROM mcr.microsoft.com/dotnet/aspnet:9.0
COPY bin/Release/net9.0/publish/ app/
WORKDIR /app
ENV ASPNETCORE_URLS=http://+:80
ENTRYPOINT ["dotnet", "BookStore.DbMigrator.dll"]

6
samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/Dockerfile.local

@ -0,0 +1,6 @@
FROM mcr.microsoft.com/dotnet/aspnet:9.0
USER $APP_UID
COPY bin/Release/net9.0/publish/ app/
WORKDIR /app
ENTRYPOINT ["dotnet", "BookStore.DbMigrator.dll"]

39
samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/Program.cs

@ -0,0 +1,39 @@
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Serilog;
using Serilog.Events;
namespace BookStore.DbMigrator;
class Program
{
static async Task Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning)
#if DEBUG
.MinimumLevel.Override("BookStore", LogEventLevel.Debug)
#else
.MinimumLevel.Override("BookStore", LogEventLevel.Information)
#endif
.Enrich.FromLogContext()
.WriteTo.Async(c => c.File("Logs/logs.txt"))
.WriteTo.Async(c => c.Console())
.CreateLogger();
await CreateHostBuilder(args).RunConsoleAsync();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.AddAppSettingsSecretsJson()
.ConfigureLogging((context, logging) => logging.ClearProviders())
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<DbMigratorHostedService>();
});
}

19
samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/appsettings.json

@ -0,0 +1,19 @@
{
"ConnectionStrings": {
"Default": "mongodb://localhost:27017/BookStore"
},
"OpenIddict": {
"Applications": {
"BookStore_App": {
"ClientId": "BookStore_App" },
"BookStore_Blazor": {
"ClientId": "BookStore_Blazor",
"RootUrl": "https://localhost:44376"
},
"BookStore_Swagger": {
"ClientId": "BookStore_Swagger",
"RootUrl": "https://localhost:44318/"
}
}
}
}

2
samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/appsettings.secrets.json

@ -0,0 +1,2 @@
{
}

3
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/BookStore.Domain.Shared.abppkg

@ -0,0 +1,3 @@
{
"role": "lib.domain-shared"
}

118
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/BookStore.Domain.Shared.abppkg.analyze.json

@ -0,0 +1,118 @@
{
"name": "BookStore.Domain.Shared",
"hash": "",
"contents": [
{
"namespace": "BookStore",
"dependsOnModules": [
{
"declaringAssemblyName": "Volo.Abp.AuditLogging.Domain.Shared",
"namespace": "Volo.Abp.AuditLogging",
"name": "AbpAuditLoggingDomainSharedModule"
},
{
"declaringAssemblyName": "Volo.Abp.BackgroundJobs.Domain.Shared",
"namespace": "Volo.Abp.BackgroundJobs",
"name": "AbpBackgroundJobsDomainSharedModule"
},
{
"declaringAssemblyName": "Volo.Abp.FeatureManagement.Domain.Shared",
"namespace": "Volo.Abp.FeatureManagement",
"name": "AbpFeatureManagementDomainSharedModule"
},
{
"declaringAssemblyName": "Volo.Abp.PermissionManagement.Domain.Shared",
"namespace": "Volo.Abp.PermissionManagement",
"name": "AbpPermissionManagementDomainSharedModule"
},
{
"declaringAssemblyName": "Volo.Abp.SettingManagement.Domain.Shared",
"namespace": "Volo.Abp.SettingManagement",
"name": "AbpSettingManagementDomainSharedModule"
},
{
"declaringAssemblyName": "Volo.Abp.Identity.Pro.Domain.Shared",
"namespace": "Volo.Abp.Identity",
"name": "AbpIdentityProDomainSharedModule"
},
{
"declaringAssemblyName": "Volo.Abp.OpenIddict.Pro.Domain.Shared",
"namespace": "Volo.Abp.OpenIddict",
"name": "AbpOpenIddictProDomainSharedModule"
},
{
"declaringAssemblyName": "Volo.Abp.LanguageManagement.Domain.Shared",
"namespace": "Volo.Abp.LanguageManagement",
"name": "LanguageManagementDomainSharedModule"
},
{
"declaringAssemblyName": "Volo.Abp.TextTemplateManagement.Domain.Shared",
"namespace": "Volo.Abp.TextTemplateManagement",
"name": "TextTemplateManagementDomainSharedModule"
},
{
"declaringAssemblyName": "Volo.Abp.Gdpr.Domain.Shared",
"namespace": "Volo.Abp.Gdpr",
"name": "AbpGdprDomainSharedModule"
},
{
"declaringAssemblyName": "Volo.Abp.GlobalFeatures",
"namespace": "Volo.Abp.GlobalFeatures",
"name": "AbpGlobalFeaturesModule"
},
{
"declaringAssemblyName": "Volo.Abp.BlobStoring.Database.Domain.Shared",
"namespace": "Volo.Abp.BlobStoring.Database",
"name": "BlobStoringDatabaseDomainSharedModule"
}
],
"implementingInterfaces": [
{
"name": "IAbpModule",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IAbpModule"
},
{
"name": "IOnPreApplicationInitialization",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IOnPreApplicationInitialization"
},
{
"name": "IOnApplicationInitialization",
"namespace": "Volo.Abp",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.IOnApplicationInitialization"
},
{
"name": "IOnPostApplicationInitialization",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IOnPostApplicationInitialization"
},
{
"name": "IOnApplicationShutdown",
"namespace": "Volo.Abp",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.IOnApplicationShutdown"
},
{
"name": "IPreConfigureServices",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IPreConfigureServices"
},
{
"name": "IPostConfigureServices",
"namespace": "Volo.Abp.Modularity",
"declaringAssemblyName": "Volo.Abp.Core",
"fullName": "Volo.Abp.Modularity.IPostConfigureServices"
}
],
"contentType": "abpModule",
"name": "BookStoreDomainSharedModule",
"summary": null
}
]
}

37
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/BookStore.Domain.Shared.csproj

@ -0,0 +1,37 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<RootNamespace>BookStore</RootNamespace>
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.BackgroundJobs.Domain.Shared" />
<PackageReference Include="Volo.Abp.AuditLogging.Domain.Shared" />
<PackageReference Include="Volo.Abp.FeatureManagement.Domain.Shared" />
<PackageReference Include="Volo.Abp.PermissionManagement.Domain.Shared" />
<PackageReference Include="Volo.Abp.SettingManagement.Domain.Shared" />
<PackageReference Include="Volo.Abp.BlobStoring.Database.Domain.Shared" />
<PackageReference Include="Volo.Abp.GlobalFeatures" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.OpenIddict.Domain.Shared" />
<PackageReference Include="Volo.Abp.Identity.Domain.Shared" />
<PackageReference Include="Volo.Abp.TenantManagement.Domain.Shared" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Localization\BookStore\*.json" />
<Content Remove="Localization\BookStore\*.json" />
</ItemGroup>
</Project>

6
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/BookStoreDomainErrorCodes.cs

@ -0,0 +1,6 @@
namespace BookStore;
public static class BookStoreDomainErrorCodes
{
/* You can add your business exception error codes here, as constants */
}

82
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/BookStoreDomainSharedModule.cs

@ -0,0 +1,82 @@
using BookStore.Localization;
using Volo.Abp.AuditLogging;
using Volo.Abp.BackgroundJobs;
using Volo.Abp.FeatureManagement;
using Volo.Abp.Identity;
using Volo.Abp.Localization;
using Volo.Abp.Localization.ExceptionHandling;
using Volo.Abp.Validation.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement;
using Volo.Abp.SettingManagement;
using Volo.Abp.VirtualFileSystem;
using Volo.Abp.OpenIddict;
using Volo.Abp.BlobStoring.Database;
using Volo.Abp.TenantManagement;
namespace BookStore;
[DependsOn(
typeof(AbpAuditLoggingDomainSharedModule),
typeof(AbpBackgroundJobsDomainSharedModule),
typeof(AbpFeatureManagementDomainSharedModule),
typeof(AbpPermissionManagementDomainSharedModule),
typeof(AbpSettingManagementDomainSharedModule),
typeof(AbpIdentityDomainSharedModule),
typeof(AbpOpenIddictDomainSharedModule),
typeof(AbpTenantManagementDomainSharedModule),
typeof(BlobStoringDatabaseDomainSharedModule)
)]
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);
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (United Kingdom)"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("es", "es", "Español"));
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
options.Languages.Add(new LanguageInfo("hi", "hi", "हिन्दी"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português (Brasil)"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch (Deuthschland)"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("it", "it", "Italiano"));
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română (România)"));
options.Languages.Add(new LanguageInfo("sv", "sv", "Svenska"));
options.Languages.Add(new LanguageInfo("fi", "fi", "Suomi"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovenčina"));
options.Languages.Add(new LanguageInfo("is", "is", "Íslenska"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中z文"));
});
Configure<AbpExceptionLocalizationOptions>(options =>
{
options.MapCodeNamespace("BookStore", typeof(BookStoreResource));
});
}
}

20
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/BookStoreGlobalFeatureConfigurator.cs

@ -0,0 +1,20 @@
using Volo.Abp.GlobalFeatures;
using Volo.Abp.Threading;
namespace BookStore;
public static class BookStoreGlobalFeatureConfigurator
{
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();
public static void Configure()
{
OneTimeRunner.Run(() =>
{
/* You can configure (enable/disable) global features of the used modules here.
* Please refer to the documentation to learn more about the Global Features System:
* https://docs.abp.io/en/abp/latest/Global-Features
*/
});
}
}

71
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/BookStoreModuleExtensionConfigurator.cs

@ -0,0 +1,71 @@
using System.ComponentModel.DataAnnotations;
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
AbpUserConsts.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
*/
}
}

42
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/ar.json

@ -0,0 +1,42 @@
{
"culture": "ar",
"texts": {
"AppName": "BookStore",
"Menu:Home": "منزل، بيت",
"Menu:ContactUs": "اتصل بنا",
"Menu:ArticleSample": "عينة المادة",
"Home": "منزل، بيت",
"Welcome": "مرحبا",
"LongWelcomeMessage": "مرحبا بكم في التطبيق. هذا مشروع بدء التشغيل يعتمد على إطار عمل برنامج ABP. لمزيد من المعلومات قم بزيارة",
"Date": "تاريخ",
"Permission:Dashboard": "لوحة القيادة",
"Menu:Dashboard": "لوحة القيادة",
"Menu:HomePage": "الصفحة الرئيسية",
"Dashboard": "لوحة القيادة",
"ExternalProvider:Google": "جوجل",
"ExternalProvider:Google:ClientId": "معرف العميل",
"ExternalProvider:Google:ClientSecret": "سر العميل",
"ExternalProvider:Microsoft": "مايكروسوفت",
"ExternalProvider:Microsoft:ClientId": "معرف العميل",
"ExternalProvider:Microsoft:ClientSecret": "سر العميل",
"ExternalProvider:Twitter": "تويتر",
"ExternalProvider:Twitter:ConsumerKey": "مفتاح المستهلك",
"ExternalProvider:Twitter:ConsumerSecret": "سر المستهلك",
"NewsletterHeader": "اشترك في النشرة الإخبارية!",
"NewsletterInfo": "احصل على معلومات حول آخر الأحداث.",
"NewsletterPreference_Default": "النشرة الإخبارية الافتراضية",
"NewsletterPrivacyAcceptMessage": "أوافق على <a href='/privacy-policy'> سياسة الخصوصية </a>.",
"Language": "لغة",
"Search": "يبحث",
"LoadMore": "تحميل المزيد",
"Settings": "إعدادات",
"Theme": "سمة",
"DeviceTheme": "موضوع الجهاز",
"Dark": "مظلم",
"Light": "ضوء",
"Unspecified": "نظام",
"SeeAllUsers": "رؤية كافة المستخدمين",
"TakePhoto": "تصوير",
"ChoosePhoto": "اختر صورة"
}
}

9
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/cs.json

@ -0,0 +1,9 @@
{
"Culture": "cs",
"Texts": {
"AppName": "BookStore",
"Menu:Home": "Home",
"LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information visit",
"Welcome": "Welcome"
}
}

42
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/de-DE.json

@ -0,0 +1,42 @@
{
"culture": "de-DE",
"texts": {
"AppName": "BookStore",
"Menu:Home": "Home",
"Menu:ContactUs": "Kontaktiere uns",
"Menu:ArticleSample": "Artikelmuster",
"Home": "Home",
"Welcome": "Willkommen",
"LongWelcomeMessage": "Willkommen in der Anwendung. Dies ist ein Startup-Projekt basierend auf dem ABP-Framework. Weitere Informationen finden Sie unter",
"Date": "Datum",
"Permission:Dashboard": "Dashboard",
"Menu:Dashboard": "Dashboard",
"Menu:HomePage": "Startseite",
"Dashboard": "Dashboard",
"ExternalProvider:Google": "Google",
"ExternalProvider:Google:ClientId": "Kunden ID",
"ExternalProvider:Google:ClientSecret": "Client-Geheimnis",
"ExternalProvider:Microsoft": "Microsoft",
"ExternalProvider:Microsoft:ClientId": "Kunden ID",
"ExternalProvider:Microsoft:ClientSecret": "Client-Geheimnis",
"ExternalProvider:Twitter": "Twitter",
"ExternalProvider:Twitter:ConsumerKey": "Verbraucherschlüssel",
"ExternalProvider:Twitter:ConsumerSecret": "Verbrauchergeheimnis",
"NewsletterHeader": "Abonnieren Sie den Newsletter!",
"NewsletterInfo": "Informieren Sie sich über aktuelle Ereignisse.",
"NewsletterPreference_Default": "Standard-Newsletter",
"NewsletterPrivacyAcceptMessage": "Ich akzeptiere die <a href='/privacy-policy'>Datenschutzerklärung</a>.",
"Language": "Sprache",
"Search": "Suchen",
"LoadMore": "Mehr laden",
"Settings": "Einstellungen",
"Theme": "Thema",
"DeviceTheme": "Gerätethema",
"Dark": "Dunkel",
"Light": "Licht",
"Unspecified": "System",
"SeeAllUsers": "Alle Benutzer anzeigen",
"TakePhoto": "Foto machen",
"ChoosePhoto": "Wähle ein Foto aus"
}
}

9
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/en-GB.json

@ -0,0 +1,9 @@
{
"Culture": "en-GB",
"Texts": {
"AppName": "BookStore",
"Menu:Home": "Home",
"LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information visit",
"Welcome": "Welcome"
}
}

9
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/en.json

@ -0,0 +1,9 @@
{
"Culture": "en",
"Texts": {
"AppName": "BookStore",
"Menu:Home": "Home",
"LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information visit",
"Welcome": "Welcome"
}
}

42
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/es.json

@ -0,0 +1,42 @@
{
"culture": "es",
"texts": {
"AppName": "BookStore",
"Menu:Home": "Hogar",
"Menu:ContactUs": "Contáctenos",
"Menu:ArticleSample": "Muestra de artículo",
"Home": "Hogar",
"Welcome": "Bienvenido",
"LongWelcomeMessage": "Bienvenido a la aplicacion. Este es un proyecto de inicio basado en el marco ABP. Para obtener mas informacion, visite",
"Date": "Fecha",
"Permission:Dashboard": "Panel de control",
"Menu:Dashboard": "Panel de control",
"Menu:HomePage": "Página de inicio",
"Dashboard": "Panel de control",
"ExternalProvider:Google": "Google",
"ExternalProvider:Google:ClientId": "ID de cliente",
"ExternalProvider:Google:ClientSecret": "Client Secret",
"ExternalProvider:Microsoft": "Microsoft",
"ExternalProvider:Microsoft:ClientId": "ID de cliente",
"ExternalProvider:Microsoft:ClientSecret": "Client Secret",
"ExternalProvider:Twitter": "Twitter",
"ExternalProvider:Twitter:ConsumerKey": "Clave de consumidor",
"ExternalProvider:Twitter:ConsumerSecret": "Consumer Secret",
"NewsletterHeader": "Suscríbete a la newsletter!",
"NewsletterInfo": "Obtenga información sobre los últimos acontecimientos.",
"NewsletterPreference_Default": "Boletín de noticias predeterminado",
"NewsletterPrivacyAcceptMessage": "Acepto la <a href='/privacy-policy'> Política de privacidad </a>.",
"Language": "Idioma",
"Search": "Buscar",
"LoadMore": "Carga más",
"Settings": "Ajustes",
"Theme": "Tema",
"DeviceTheme": "Tema del dispositivo",
"Dark": "Oscuro",
"Light": "Luz",
"Unspecified": "Sistema",
"SeeAllUsers": "Ver todos los usuarios",
"TakePhoto": "Tomar foto",
"ChoosePhoto": "Escoge una foto"
}
}

42
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/fi.json

@ -0,0 +1,42 @@
{
"culture": "fi",
"texts": {
"AppName": "BookStore",
"Menu:Home": "Koti",
"Menu:ContactUs": "Ota meihin yhteyttä",
"Menu:ArticleSample": "Artikkelinäyte",
"Home": "Koti",
"Welcome": "Tervetuloa",
"LongWelcomeMessage": "Tervetuloa sovellukseen. Tämä on ABP-kehykseen perustuva käynnistysprojekti. Lisätietoja on osoitteessa",
"Date": "Päivämäärä",
"Permission:Dashboard": "Kojelauta",
"Menu:Dashboard": "Kojelauta",
"Menu:HomePage": "Kotisivu",
"Dashboard": "Kojelauta",
"ExternalProvider:Google": "Google",
"ExternalProvider:Google:ClientId": "Asiakastunnus",
"ExternalProvider:Google:ClientSecret": "Asiakkaan salaisuus",
"ExternalProvider:Microsoft": "Microsoft",
"ExternalProvider:Microsoft:ClientId": "Asiakastunnus",
"ExternalProvider:Microsoft:ClientSecret": "Asiakkaan salaisuus",
"ExternalProvider:Twitter": "Viserrys",
"ExternalProvider:Twitter:ConsumerKey": "Kuluttaja-avain",
"ExternalProvider:Twitter:ConsumerSecret": "Kuluttajan salaisuus",
"NewsletterHeader": "Tilaa uutiskirje!",
"NewsletterInfo": "Hanki tietoa viimeisimmistä tapahtumista.",
"NewsletterPreference_Default": "Oletusuutiskirje",
"NewsletterPrivacyAcceptMessage": "Hyväksyn <a href='/privacy-policy'> tietosuojakäytännön </a>.",
"Language": "Kieli",
"Search": "Hae",
"LoadMore": "Lataa lisää",
"Settings": "asetukset",
"Theme": "Teema",
"DeviceTheme": "Laitteen teema",
"Dark": "Tumma",
"Light": "Kevyt",
"Unspecified": "Järjestelmä",
"SeeAllUsers": "Katso Kaikki käyttäjät",
"TakePhoto": "Ota valokuva",
"ChoosePhoto": "Valitse Valokuva"
}
}

42
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/fr.json

@ -0,0 +1,42 @@
{
"culture": "fr",
"texts": {
"AppName": "BookStore",
"Menu:Home": "Acceuil",
"Menu:ContactUs": "Nous contacter",
"Menu:ArticleSample": "Échantillon d'article",
"Home": "Acceuil",
"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",
"Date": "Date",
"Permission:Dashboard": "Tableau de bord",
"Menu:Dashboard": "Tableau de bord",
"Menu:HomePage": "Page d'accueil",
"Dashboard": "Tableau de bord",
"ExternalProvider:Google": "Google",
"ExternalProvider:Google:ClientId": "identité du client",
"ExternalProvider:Google:ClientSecret": "Secret du client",
"ExternalProvider:Microsoft": "Microsoft",
"ExternalProvider:Microsoft:ClientId": "identité du client",
"ExternalProvider:Microsoft:ClientSecret": "Secret du client",
"ExternalProvider:Twitter": "Twitter",
"ExternalProvider:Twitter:ConsumerKey": "La clé du consommateur",
"ExternalProvider:Twitter:ConsumerSecret": "Secret du consommateur",
"NewsletterHeader": "Abonnez-vous à la newsletter!",
"NewsletterInfo": "Obtenez des informations sur les derniers événements.",
"NewsletterPreference_Default": "Newsletter par défaut",
"NewsletterPrivacyAcceptMessage": "J'accepte la <a href='/privacy-policy'> Politique de confidentialité </a>.",
"Language": "Langue",
"Search": "Recherche",
"LoadMore": "Charger plus",
"Settings": "Paramètres",
"Theme": "Thème",
"DeviceTheme": "Thème de l&#39;appareil",
"Dark": "Sombre",
"Light": "Lumière",
"Unspecified": "Système",
"SeeAllUsers": "Voir tous les utilisateurs",
"TakePhoto": "Prendre une photo",
"ChoosePhoto": "Choisissez une photo"
}
}

42
samples/WebAppBlazorWebAssembly/src/BookStore.Domain.Shared/Localization/BookStore/hi.json

@ -0,0 +1,42 @@
{
"culture": "hi",
"texts": {
"AppName": "BookStore",
"Menu:Home": "घर",
"Menu:ContactUs": "संपर्क करें",
"Menu:ArticleSample": "आलेख नमूना",
"Home": "घर",
"Welcome": "स्वागत हे",
"LongWelcomeMessage": "आवेदन करने के लिए आपका स्वागत है। यह एबीपी ढांचे पर आधारित एक स्टार्टअप परियोजना है। अधिक जानकारी के लिए पर जाएँ।",
"Date": "दिनांक",
"Permission:Dashboard": "डैशबोर्ड",
"Menu:Dashboard": "डैशबोर्ड",
"Menu:HomePage": "मुख पृष्ठ",
"Dashboard": "डैशबोर्ड",
"ExternalProvider:Google": "गूगल",
"ExternalProvider:Google:ClientId": "ग्राहक ID",
"ExternalProvider:Google:ClientSecret": "ग्राहक गुप्त",
"ExternalProvider:Microsoft": "माइक्रोसॉफ्ट",
"ExternalProvider:Microsoft:ClientId": "ग्राहक ID",
"ExternalProvider:Microsoft:ClientSecret": "ग्राहक गुप्त",
"ExternalProvider:Twitter": "ट्विटर",
"ExternalProvider:Twitter:ConsumerKey": "उपभोक्ता कुंजी",
"ExternalProvider:Twitter:ConsumerSecret": "उपभोक्ता रहस्य",
"NewsletterHeader": "न्यूज़लेटर की सदस्यता लें!",
"NewsletterInfo": "नवीनतम घटनाओं के बारे में जानकारी प्राप्त करें।",
"NewsletterPreference_Default": "डिफ़ॉल्ट न्यूज़लैटर",
"NewsletterPrivacyAcceptMessage": "मैं <a href='/privacy-policy'> गोपनीयता नीति </a> स्वीकार करता हूं।",
"Language": "भाषा",
"Search": "खोज",
"LoadMore": "और लोड करें",
"Settings": "समायोजन",
"Theme": "विषय",
"DeviceTheme": "डिवाइस थीम",
"Dark": "अँधेरा",
"Light": "रोशनी",
"Unspecified": "प्रणाली",
"SeeAllUsers": "सभी उपयोगकर्ता देखें",
"TakePhoto": "फोटो लो",
"ChoosePhoto": "तस्विर का चयन करो"
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save