diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
index 7bb8f4d109..9720354d99 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
@@ -193,7 +193,7 @@
"WhatHappensWhenLicenseEnds": "What happens when my license period ends?",
"WhatHappensWhenLicenseEndsExplanation1": "ABP Commercial license type is perpetual license. After your license expires, you can continue developing your project. And you are not obliged to renew your license. Your license comes with a one-year Updates and Support plan out of the box. To continue to receive new features, performance enhancements, bug fixes, support and continue to use ABP Suite, make sure to renew your plan each year. When your license expires, you will not be able to get more of the following benefits;",
"WhatHappensWhenLicenseEndsExplanation2": "You can not create new solutions using the ABP Commercial, but you can continue to develop your existing applications forever.",
- "WhatHappensWhenLicenseEndsExplanation3": "You will be able to get updates for the modules and themes within your MAJOR version. For example; if you are using v3.2.0 of a module, you can still get updates for v3.x.x (v3.3.0, v3.5.2... etc.) of that module. But you cannot get updates for the next major version (like v4.x, v5.x)",
+ "WhatHappensWhenLicenseEndsExplanation3": "You will be able to get updates for the modules and themes within your MAJOR version (except RC or Preview versions). For example; if you are using v3.2.0 of a module, you can still get updates for v3.x.x (v3.3.0, v3.5.2... etc.) of that module. But you cannot get updates for the next major version (like v4.x, v5.x). Let's say, when your license expired, the latest release was v4.4.3 and the latest preview version was v5.0.0-rc.2, you can only access the v4.X.X but you cannot access the v5.X.X.",
"WhatHappensWhenLicenseEndsExplanation4": "You can not install new modules and themes added to the ABP Commercial platform after your license ends.",
"WhatHappensWhenLicenseEndsExplanation5": "You can not use the ABP Suite.",
"WhatHappensWhenLicenseEndsExplanation6": "You can not get the premium support anymore.",
diff --git a/docs/en/CLI.md b/docs/en/CLI.md
index b8f69b1ee4..7db562a66e 100644
--- a/docs/en/CLI.md
+++ b/docs/en/CLI.md
@@ -29,6 +29,7 @@ Here, the list of all available commands before explaining their details:
* **`help`**: Shows help on the usage of the ABP CLI.
* **`new`**: Generates a new solution based on the ABP [startup templates](Startup-Templates/Index.md).
* **`update`**: Automatically updates all ABP related NuGet and NPM packages in a solution.
+* **`clean`**: Deletes all `BIN` and `OBJ` folders in the current folder.
* **`add-package`**: Adds an ABP package to a project.
* **`add-module`**: Adds a [multi-package application module](https://docs.abp.io/en/abp/latest/Modules/Index) to a solution.
* **`list-modules`**: Lists names of open-source application modules.
@@ -145,6 +146,17 @@ abp update [options]
* `--check-all`: Check the new version of each package separately. Default is `false`.
* `--version` or `-v`: Specifies the version to use for update. If not specified, latest version is used.
+### clean
+
+Deletes all `BIN` and `OBJ` folders in the current folder.
+
+Usage:
+
+````bash
+abp clean
+````
+
+
### add-package
Adds an ABP package to a project by,
diff --git a/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md b/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md
index a1c63529a2..c82365efee 100644
--- a/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md
+++ b/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md
@@ -12,7 +12,7 @@ The most common question is;
The answer is, **you don't**. ABP Angular application is integrated with the backend (HttpApi.Host project) where it loads the configurations, **permissions** etc. For none-tiered angular applications, **HttpApi.Host** project also has IdentityServer4 embedded; also serving as **Authorization Server**. Angular application authentication flow is shown below.
-
+
> What if I want Azure AD as my authorization server and not IdentityServer?
@@ -80,7 +80,7 @@ Navigate to Manage Azure Active Directory in [azure portal](https://portal.azure
Enter a name for your application and **App.SelfUrl** + **AzureAd.CallbackPath** as redirect uri then register.
-
+
Now navigate to **Authentication** on the left menu and enable **ID tokens**.
diff --git a/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/POST.md b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/POST.md
new file mode 100644
index 0000000000..edaeaf46db
--- /dev/null
+++ b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/POST.md
@@ -0,0 +1,321 @@
+# Integrating the Syncfusion MVC Components to the ABP MVC UI
+
+## Introduction
+
+In this article we will see how we can integrate the Syncfusion MVC Components into our ABP application.
+
+## Source Code
+
+You can find the source code of the application at https://github.com/EngincanV/ABP-Syncfusion-Components-Demo.
+
+## Prerequisites
+
+* [.NET 6](https://dotnet.microsoft.com/en-us/download/dotnet/6.0)
+
+ * In this article, we will create a new startup template in v5.0.0-rc.2 and if you follow this article from top to bottom and create a new startup template with me, you need to install the [.NET 6 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) before starting.
+
+**NOTE:** ABP v5.X stable version has been released. You can replace v5.0.0-rc.2 with the latest stable version in your steps.
+
+Also, you need to update your ABP CLI to the v5.0.0-rc.2, you can use the command below to update your CLI version:
+
+```bash
+dotnet tool update Volo.Abp.Cli -g --version 5.0.0-rc.2
+```
+
+or install it if you haven't installed it before:
+
+```bash
+dotnet tool install Volo.Abp.Cli -g --version 5.0.0-rc.2
+```
+
+## Creating the Solution
+
+In this article, we will create a new startup template with EF Core as a database provider and MVC for the UI framework. But if you already have a project with MVC UI, you don't need to create a new startup template, you can directly implement the following steps to your existing project.
+
+> If you already have a project with MVC/Razor Pages UI, you can skip this section.
+
+We can create a new startup template by using the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI):
+
+```bash
+abp new SyncfusionComponentsDemo -t app --preview
+```
+
+Our project boilerplate will be ready after the download is finished. Then, we can open the solution and start developing.
+
+## Starting the Development
+
+### Pre-requisite
+
+> If you've already had a license from Syncfusion, you can skip this section.
+
+* The first thing we need to do is create an account to be able to get a license from Syncfusion.
+
+* So, let's navigate to https://www.syncfusion.com/aspnet-core-ui-controls and click the "Download Free Trial" button.
+
+* Then fill the form and start your 30-day free trial.
+
+* After that, navigate to https://www.syncfusion.com/account/manage-trials/downloads to get our license key that will be used in our application.
+
+
+
+Click the "Get License Key" link for "ASP.NET Core (Essential JS 2)".
+
+
+
+Then a modal will be opened like in the above image, select a version and click the "Get License Key" button.
+
+
+
+Lastly, copy the generated license key value.
+
+In order to use the relevant components, Syncfusion needs to check this license key to know that our license is valid.
+
+### Configurations
+
+After providing a license key from Syncfusion, we can start with the configuration that needs to be done in our application.
+
+#### 1-) Install the Syncfusion.EJ2.AspNet.Core package
+
+We need to install the `Syncfusion.EJ2.AspNet.Core` Nuget package to our Web project (*.Web).
+
+We can install it via **Visual Studio's Nuget Package Manager**:
+
+
+
+or via dotnet cli:
+
+```bash
+dotnet add package Syncfusion.EJ2.AspNet.Core --version 19.3.0.57
+```
+
+> In this article, I've used the package in version 19.3.0.57.
+
+#### 2-) Register the License Key
+
+* After installing the package, we need to register our license key to be able to use the Syncfusion Components.
+
+* To register the license key, open your web module class and update the `ConfigureServices` method as follows:
+
+```csharp
+public override void ConfigureServices(ServiceConfigurationContext context)
+{
+ var hostingEnvironment = context.Services.GetHostingEnvironment();
+ var configuration = context.Services.GetConfiguration();
+
+ //Register Syncfusion license
+ Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense(licenseKey: configuration["Syncfusion:LicenseKey"].ToString());
+
+ ConfigureUrls(configuration);
+ ConfigureBundles();
+ ConfigureAuthentication(context, configuration);
+ ConfigureAutoMapper();
+ ConfigureVirtualFileSystem(hostingEnvironment);
+ ConfigureLocalizationServices();
+ ConfigureNavigationServices();
+ ConfigureAutoApiControllers();
+ ConfigureSwaggerServices(context.Services);
+}
+```
+
+Instead of writing the license key directly in here we can define it in the **appsettings.json** file and use it here by using the Configuration system of .NET.
+
+
+* Open your **appsettings.json** file and add a new section named "Syncfusion" as below:
+
+```json
+{
+ //...
+
+ "Syncfusion": {
+ "LicenseKey": ""
+ }
+}
+```
+
+> Replace the ` part with your license key that we've obtained in the previous section.`
+
+* To be able to use the Syncfusion Components we need to define them in our **_ViewImports.cshtml** file. By doing that we can use the Syncfusion components everywhere in our application.
+
+* Open your **/Pages/_ViewImports.cshtml** file and add a new tag helper:
+
+```cshtml
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI
+@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap
+@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling
+@addTagHelper *, Syncfusion.EJ2 //use Syncfusion components
+```
+
+#### 3-) Adding Syncfusion styles and scripts to our application
+
+Firstly, let's install the `@syncfusion/ej2` package from **npm**.
+
+* Open your **package.json** file and add the `@syncfusion/ej2` package with version **19.3.57**:
+
+```json
+{
+ "version": "1.0.0",
+ "name": "my-app",
+ "private": true,
+ "dependencies": {
+ "@abp/aspnetcore.mvc.ui.theme.basic": "^5.0.0-rc.2",
+ "@syncfusion/ej2": "^19.3.57"
+ }
+}
+```
+
+* Then, open the **abp.resourcemapping.js** file and update the **mappings** section:
+
+```js
+module.exports = {
+ aliases: {
+
+ },
+ mappings: {
+ "@node_modules/@syncfusion/ej2/dist/ej2.min.js": "@libs/syncfusion/",
+ "@node_modules/@syncfusion/ej2/material.css": "@libs/syncfusion/"
+ }
+};
+```
+
+> ABP copies related packages from **node_modules** folder to the **libs** folder by examining this file. You can read this [document](docs.abp.io/en/abp/latest/UI/AspNetCore/Client-Side-Package-Management#mapping-the-library-resources) for more info.
+
+* Then run the `abp install-libs` to install the dependencies and copy them into the libs folder by your mappings configuration. After running this command, in your **libs** folder it should be a folder named **syncfusion** folder.
+
+
+
+The last thing we need to do is, add some style and script files provided by Syncfusion, between our head-body tags.
+
+* We can do this by creating two view components (one for Styles and the other for Scripts). Let's do that.
+
+First, create a folder structure as shown below under the **Components** folder.
+
+
+
+Then open the related files and add the following codes to each of these files.
+
+* **Default.cshtml** (/Components/Syncfusion/Script/Default.cshtml)
+
+```cshtml
+@addTagHelper *, Syncfusion.EJ2 //add this line
+
+
+
+
+
+
+```
+
+* **SyncfusionScriptComponent.cs**
+
+```csharp
+using Microsoft.AspNetCore.Mvc;
+using Volo.Abp.AspNetCore.Mvc;
+
+namespace SyncfusionComponentsDemo.Web.Components.Syncfusion.Script
+{
+ public class SyncfusionScriptComponent : AbpViewComponent
+ {
+ public IViewComponentResult Invoke()
+ {
+ return View("~/Components/Syncfusion/Script/Default.cshtml");
+ }
+ }
+}
+```
+
+* **Default.cshtml** (/Components/Syncfusion/Style/Default.cshtml)
+
+```cshtml
+
+
+```
+
+* SyncfusionStyleComponent.cs
+
+```csharp
+using Microsoft.AspNetCore.Mvc;
+using Volo.Abp.AspNetCore.Mvc;
+
+namespace SyncfusionComponentsDemo.Web.Components.Syncfusion.Style
+{
+ public class SyncfusionStyleComponent : AbpViewComponent
+ {
+ public IViewComponentResult Invoke()
+ {
+ return View("~/Components/Syncfusion/Style/Default.cshtml");
+ }
+ }
+}
+```
+
+After creating these two components, we can use the [**Layout Hooks**](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Layout-Hooks) system of ABP to inject these two components between head and script tags.
+
+To do this, open your web module class and update the `ConfigureServices` method as below:
+
+
+```csharp
+public override void ConfigureServices(ServiceConfigurationContext context)
+{
+ var hostingEnvironment = context.Services.GetHostingEnvironment();
+ var configuration = context.Services.GetConfiguration();
+
+ //Register Syncfusion license
+ var licenseKey = configuration["Syncfusion:LicenseKey"].ToString();
+ Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense(licenseKey: licenseKey);
+
+ Configure(options =>
+ {
+ //Now, the SyncfusionStyleComponent code will be inserted in the head of the page as the last item.
+ options.Add(LayoutHooks.Head.Last, typeof(SyncfusionStyleComponent));
+
+ //the SyncfusionScriptComponent will be inserted in the body of the page as the last item.
+ options.Add(LayoutHooks.Body.Last, typeof(SyncfusionScriptComponent));
+ });
+
+ ConfigureUrls(configuration);
+ ConfigureBundles();
+ ConfigureAuthentication(context, configuration);
+ ConfigureAutoMapper();
+ ConfigureVirtualFileSystem(hostingEnvironment);
+ ConfigureLocalizationServices();
+ ConfigureNavigationServices();
+ ConfigureAutoApiControllers();
+ ConfigureSwaggerServices(context.Services);
+}
+```
+
+After injecting the Syncfusion style and script into our application, our configurations have been completed. We can try with a simple component to see if it works as we expected.
+
+* Let's try with the [Calendar](https://www.syncfusion.com/aspnet-core-ui-controls/calendar) component. Open your **Index.cshtml** file and update with the below content:
+
+```cshtml
+@page
+@using Microsoft.AspNetCore.Mvc.Localization
+@using SyncfusionComponentsDemo.Localization
+@using Volo.Abp.Users
+@model SyncfusionComponentsDemo.Web.Pages.IndexModel
+
+@section styles {
+
+}
+
+@section scripts {
+
+}
+
+
+
Syncfusion - Calendar Component
+
+
+```
+
+* Then when we run the application, we need to see the relevant calendar component as below.
+
+
+
+### Conclusion
+
+In this article, we've explained how to integrate the **Syncfusion Components** into our applications. After following this article, you can use the Syncfusion components in your application.
+
+Thanks for reading the article, I hope you've found it useful :)
diff --git a/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/calendar-component.png b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/calendar-component.png
new file mode 100644
index 0000000000..8e7f36367a
Binary files /dev/null and b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/calendar-component.png differ
diff --git a/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/component-folder-structure.png b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/component-folder-structure.png
new file mode 100644
index 0000000000..0dabbe0a06
Binary files /dev/null and b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/component-folder-structure.png differ
diff --git a/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/copy-license-key.png b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/copy-license-key.png
new file mode 100644
index 0000000000..847be0363d
Binary files /dev/null and b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/copy-license-key.png differ
diff --git a/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/manage-trial-1.png b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/manage-trial-1.png
new file mode 100644
index 0000000000..8e84229549
Binary files /dev/null and b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/manage-trial-1.png differ
diff --git a/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/manage-trial-2.png b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/manage-trial-2.png
new file mode 100644
index 0000000000..57ef370bdb
Binary files /dev/null and b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/manage-trial-2.png differ
diff --git a/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/syncfusion-libs.png b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/syncfusion-libs.png
new file mode 100644
index 0000000000..d75935d8fd
Binary files /dev/null and b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/syncfusion-libs.png differ
diff --git a/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/syncfusion-package.png b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/syncfusion-package.png
new file mode 100644
index 0000000000..6792ea0c32
Binary files /dev/null and b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/syncfusion-package.png differ
diff --git a/docs/en/Index.md b/docs/en/Index.md
index 84e1155b9c..3f5c3dbf44 100644
--- a/docs/en/Index.md
+++ b/docs/en/Index.md
@@ -1,6 +1,6 @@
# ABP Documentation
-ABP Framework is a complete **infrastructure** based on the **ASP.NET Core** to create **modern web applications** and **APIs** by following the software development **best practices** and the **latest technologies**.
+ABP Framework offers an **opinionated architecture** to build enterprise software solutions with **best practices** on top of the **.NET** and the **ASP.NET Core** platforms. It provides the fundamental infrastructure, production-ready startup templates, modules, themes, tooling, guides and documentation to implement that architecture properly and **automate the details** and repetitive works as much as possible.
## Getting Started
@@ -56,13 +56,23 @@ See the [Application Modules](Modules/Index.md) document for all pre-built modul
The [Startup templates](Startup-Templates/Index.md) are pre-built Visual Studio solution templates. You can create your own solution based on these templates to **immediately start your development**.
-## Free E-Book: Implementing Domain Driven Design
+## Books
+
+### Mastering ABP Framework
+
+
+
+*Mastering ABP Framework* is an ultimate guide to get started and expertise with the ABP Framework. It is authored by Halil İbrahim Kalkan, the creator and the lead developer of the ABP Framework.
+
+**[You can order it from Amazon now](https://www.amazon.com/Mastering-ABP-Framework-maintainable-implementing-dp-1801079242/dp/1801079242)!**
+
+### Free E-Book: Implementing Domain Driven Design

A **practical guide** for implementing Domain Driven Design (DDD). While the implementation details are **based on the ABP Framework** infrastructure, the basic concepts, principles and models can be applied to any solution, even if it is not a .NET solution.
-[Click here to get your free copy](https://abp.io/books/implementing-domain-driven-design?ref=doc).
+**[Click here to get your free copy](https://abp.io/books/implementing-domain-driven-design?ref=doc).**
## ABP Community
diff --git a/docs/en/Migration-Guides/Abp-5-0-Blazor.md b/docs/en/Migration-Guides/Abp-5-0-Blazor.md
index f0c69b679a..326bac55d5 100644
--- a/docs/en/Migration-Guides/Abp-5-0-Blazor.md
+++ b/docs/en/Migration-Guides/Abp-5-0-Blazor.md
@@ -4,4 +4,16 @@
## Upgrading to the latest Blazorise
-ABP 5.0 uses the latest version of the [Blazorise](https://blazorise.com/) library. Please upgrade the Blazorise NuGet packages in your solution.
\ No newline at end of file
+ABP 5.0 uses the latest version of the [Blazorise](https://blazorise.com/) library. Please upgrade the Blazorise NuGet packages in your solution.
+
+## Bootstrap 5
+
+ABP 5.0 now works with Bootstrap 5. For details, please refer to the official [migration guide](https://getbootstrap.com/docs/5.0/migration/) provided by Bootstrap.
+
+Replace `Blazorise.Bootstrap` with `Blazorise.Bootstrap5` package.
+
+Replace `AddBootstrapProviders()` with `AddBootstrap5Providers()`.
+
+## Update Bundle
+
+Use `abp bundle` command to update bundles if you are using Blazor WebAssembly.
\ No newline at end of file
diff --git a/docs/en/Tutorials/Part-10.md b/docs/en/Tutorials/Part-10.md
index 5d5ea9618b..563de95d68 100644
--- a/docs/en/Tutorials/Part-10.md
+++ b/docs/en/Tutorials/Part-10.md
@@ -948,7 +948,7 @@ Since the HTTP APIs have been changed, you need to update Angular client side [s
Run the following command in the `angular` folder (you may need to stop the angular application):
```bash
-abp generate-proxy
+abp generate-proxy -t ng
```
This command will update the service proxy files under the `/src/app/proxy/` folder.
diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md
index b84ece9e97..4b29231164 100644
--- a/docs/en/Tutorials/Part-2.md
+++ b/docs/en/Tutorials/Part-2.md
@@ -10,7 +10,7 @@
In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies:
-* **{{DB_Value}}** as the ORM provider.
+* **{{DB_Value}}** as the ORM provider.
* **{{UI_Value}}** as the UI Framework.
This tutorial is organized as the following parts;
@@ -80,13 +80,13 @@ You can see the **book list** returned from the server. You can also check the *
Let's **create a new book** using the `create` function:
````js
-acme.bookStore.books.book.create({
- name: 'Foundation',
- type: 7,
- publishDate: '1951-05-24',
- price: 21.5
- }).then(function (result) {
- console.log('successfully created the book with id: ' + result.id);
+acme.bookStore.books.book.create({
+ name: 'Foundation',
+ type: 7,
+ publishDate: '1951-05-24',
+ price: 21.5
+ }).then(function (result) {
+ console.log('successfully created the book with id: ' + result.id);
});
````
@@ -187,7 +187,7 @@ namespace Acme.BookStore.Web.Pages.Books
{
public void OnGet()
{
-
+
}
}
}
@@ -461,7 +461,7 @@ For more information, see the [RoutesService document](../UI/Angular/Modifying-t
Once the host application is running, execute the following command in the `angular` folder:
```bash
-abp generate-proxy
+abp generate-proxy -t ng
```
This command will create the following files under the `/src/app/proxy/books` folder:
@@ -654,7 +654,7 @@ Open the `Books.razor` and replace the content as the following:
> If you see some syntax errors, you can ignore them if your application properly built and run. Visual Studio still has some bugs with Blazor.
* Inherited from the `AbpCrudPageBase` which implements all the CRUD details for us.
-* `Entities`, `TotalCount`, `PageSize`, `OnDataGridReadAsync` are defined in the base blass.
+* `Entities`, `TotalCount`, `PageSize`, `OnDataGridReadAsync` are defined in the base class.
* Injected `IStringLocalizer` (as `L` object) and used for localization.
While the code above pretty easy to understand, you can check the Blazorise [Card](https://blazorise.com/docs/components/card/) and [DataGrid](https://blazorise.com/docs/extensions/datagrid/) documents to understand them better.
diff --git a/docs/en/Tutorials/Part-9.md b/docs/en/Tutorials/Part-9.md
index d6fa004596..0e271a5e4e 100644
--- a/docs/en/Tutorials/Part-9.md
+++ b/docs/en/Tutorials/Part-9.md
@@ -605,7 +605,7 @@ function configureRoutes(routes: RoutesService) {
Run the following command in the `angular` folder:
```bash
-abp generate-proxy
+abp generate-proxy -t ng
```
This command generates the service proxy for the author service and the related model (DTO) classes:
diff --git a/docs/en/UI/Angular/Service-Proxies.md b/docs/en/UI/Angular/Service-Proxies.md
index 18e5a3a0cc..dc8433f7de 100644
--- a/docs/en/UI/Angular/Service-Proxies.md
+++ b/docs/en/UI/Angular/Service-Proxies.md
@@ -15,7 +15,7 @@ ABP introduces an endpoint that exposes server-side method contracts. When the `
Run the following command in the **root folder** of the angular application:
```bash
-abp generate-proxy
+abp generate-proxy -t ng
```
The command without any parameters creates proxies only for your own application's services and places them in your default Angular application. There are several parameters you may use to modify this behavior. See the [CLI documentation](../../CLI) for details.
diff --git a/docs/en/images/abp-book.png b/docs/en/images/abp-book.png
new file mode 100644
index 0000000000..7fd6c34c90
Binary files /dev/null and b/docs/en/images/abp-book.png differ
diff --git a/docs/zh-Hans/CLI.md b/docs/zh-Hans/CLI.md
index b310f96b2c..b2f3825c64 100644
--- a/docs/zh-Hans/CLI.md
+++ b/docs/zh-Hans/CLI.md
@@ -29,6 +29,7 @@ dotnet tool update -g Volo.Abp.Cli
* **`help`**: 展示ABP CLI的用法帮助信息.
* **`new`**:生成基于ABP的[启动模板](Startup-Templates/Index.md).
* **`update`**:自动更新的ABP解决方案ABP相关的NuGet和NPM包.
+* **`clean`**: 删除当前目录下所有的 `BIN` 和 `OBJ` 子目录.
* **`add-package`**: 添加ABP包到项目.
* **`add-module`**: 添加[应用模块](https://docs.abp.io/en/abp/latest/Modules/Index)到解决方案.
* **`generate-proxy`**: 生成客户端代理以使用HTTP API端点.
@@ -129,6 +130,16 @@ abp update [options]
* `--check-all`: 分别检查每个包的新版本. 默认是 `false`.
* `--version` or `-v`: 指定用于升级的版本. 如果没有指定,则使用最新版本.
+### clean
+
+删除当前目录下所有的 `BIN` 和 `OBJ` 子目录.
+
+用法:
+
+````bash
+abp clean
+````
+
### add-package
通过以下方式将ABP包添加到项目中
diff --git a/docs/zh-Hans/Distributed-Event-Bus.md b/docs/zh-Hans/Distributed-Event-Bus.md
index 720560b4be..f16aa0610f 100644
--- a/docs/zh-Hans/Distributed-Event-Bus.md
+++ b/docs/zh-Hans/Distributed-Event-Bus.md
@@ -45,7 +45,7 @@ namespace AbpDemo
public virtual async Task ChangeStockCountAsync(Guid productId, int newCount)
{
await _distributedEventBus.PublishAsync(
- new StockCountChangedEvent
+ new StockCountChangedEto
{
ProductId = productId,
NewCount = newCount
@@ -299,4 +299,4 @@ namespace AbpDemo
}
````
-此示例使用AutoMapper的 `AutoMap` 属性配置的映射. 你可以创建一个配置文件类代替. 请参阅AutoMapper文档了解更多选项.
\ No newline at end of file
+此示例使用AutoMapper的 `AutoMap` 属性配置的映射. 你可以创建一个配置文件类代替. 请参阅AutoMapper文档了解更多选项.
diff --git a/docs/zh-Hans/Modules/IdentityServer.md b/docs/zh-Hans/Modules/IdentityServer.md
index cb82a640d5..838cdfe3ed 100644
--- a/docs/zh-Hans/Modules/IdentityServer.md
+++ b/docs/zh-Hans/Modules/IdentityServer.md
@@ -1 +1,173 @@
-TODO...
\ No newline at end of file
+# 身份服务器模块
+
+身份服务器模块提供了一个 [IdentityServer](https://github.com/IdentityServer/IdentityServer4) (IDS) 的完全集成,该框架提供高级身份验证功能,如单点登录和API访问控制.此模块将客户端,资源以及其他 IDS 相关的对象保存到数据库中.
+
+## 如何安装
+
+当你使用 ABP 框架 [创建一个新的解决方案](https://abp.io/get-started) 时,此模块将被预安装(作为 NuGet/NPM 包).你可以继续用其作为包并轻松地获取更新,也可以将其源代码包含在解决方案中(请参阅 `get-source` [CLI](../CLI.md))以开发自定义模块.
+
+### 源代码
+
+可以 [在此处](https://github.com/abpframework/abp/tree/dev/modules/identityserver) 访问源代码.源代码使用 [MIT](https://choosealicense.com/licenses/mit/) 许可,所以你可以免费使用和自定义它.
+
+## 用户界面
+
+此模块使用了领域逻辑和数据库集成,但没有提供任何 UI.如果你需要动态添加客户端和资源, 管理 UI 是非常有用的.在这种情况下,你可以自己构建管理 UI,或者考虑购买为此模块提供了管理 UI 的 [ABP 商业版](https://commercial.abp.io/).
+
+## 与其他模块的关系
+
+此模块基于 [身份模块](Identity.md) 并且[账户模块](Account.md) 有一个 [集成包](https://www.nuget.org/packages/Volo.Abp.Account.Web.IdentityServer).
+
+## 选项
+
+### AbpIdentityServerBuilderOptions
+
+`AbpIdentityServerBuilderOptions` 在你的身份服务器 [模块](https://docs.abp.io/en/abp/latest/Module-Development-Basics) 中的 `PreConfigureServices` 方法中配置.例如:
+
+````csharp
+public override void PreConfigureServices(ServiceConfigurationContext context)
+{
+ PreConfigure(builder =>
+ {
+ //Set options here...
+ });
+}
+````
+
+`AbpIdentityServerBuilderOptions` 属性:
+
+* `UpdateJwtSecurityTokenHandlerDefaultInboundClaimTypeMap` (默认值:true):更新 `JwtSecurityTokenHandler.DefaultInboundClaimTypeMap` 使其与身份服务器声明兼容.
+* `UpdateAbpClaimTypes` (默认值:true):更新 `AbpClaimTypes` 与身份服务器声明兼容.
+* `IntegrateToAspNetIdentity` (默认值:true):集成到 ASP.NET Identity.
+* `AddDeveloperSigningCredential` (默认值:true):设置为 false 禁止调用 IIdentityServerBuilder 中的 `AddDeveloperSigningCredential()`.
+
+`IIdentityServerBuilder` 可以在你的身份服务器 [模块](https://docs.abp.io/en/abp/latest/Module-Development-Basics) 中的 `PreConfigureServices` 方法中配置.例如:
+
+````csharp
+public override void PreConfigureServices(ServiceConfigurationContext context)
+{
+ PreConfigure(builder =>
+ {
+ builder.AddSigningCredential(...);
+ });
+}
+````
+
+## 内部结构
+
+### 领域层
+
+#### 聚合
+
+##### API 资源
+
+需要 API 资源来允许客户端请求访问令牌.
+
+* `ApiResource` (聚合根):表示系统中的 API 资源.
+ * `ApiSecret` (集合):API 资源的密钥.
+ * `ApiScope` (集合):API 资源的作用域.
+ * `ApiResourceClaim` (集合):API 资源的声明.
+
+##### 客户端
+
+客户端表示可以从你的身份服务器请求令牌的应用程序.
+
+* `Client` (聚合根):表示一个身份服务器的客户端应用程序.
+ * `ClientScope` (集合):客户端的作用域.
+ * `ClientSecret` (集合):客户端的密钥.
+ * `ClientGrantType` (集合):客户端的授权类型.
+ * `ClientCorsOrigin` (集合):客户端的 CORS 源.
+ * `ClientRedirectUri` (集合):客户端的重定向 URIs.
+ * `ClientPostLogoutRedirectUri` (集合):客户端的登出重定向 URIs.
+ * `ClientIdPRestriction` (集合):客户端的提供程序约束.
+ * `ClientClaim` (集合):客户端的声明.
+ * `ClientProperty` (集合):客户端的自定义属性.
+
+##### 持续化授权
+
+持续化授权存储了授权码,刷新令牌和用户准许.
+
+* `PersistedGrant` (聚合根):表示为身份服务器持续化授权.
+
+##### 身份资源
+
+身份资源是用户的用户 ID ,名称或邮件地址等数据.
+
+* `IdentityResource` (聚合根):表示与身份服务器的身份资源.
+ * `IdentityClaim` (集合):身份资源的声明.
+
+#### 仓储
+
+为此模块定义了以下自定义仓储:
+
+* `IApiResourceRepository`
+* `IClientRepository`
+* `IPersistentGrantRepository`
+* `IIdentityResourceRepository`
+
+#### 领域服务
+
+此模块不包含任何领域服务,但重写了下面的服务;
+
+* `AbpProfileService` (当 `AbpIdentityServerBuilderOptions.IntegrateToAspNetIdentity` 为 true 时使用)
+* `AbpClaimsService`
+* `AbpCorsPolicyService`
+
+### 设置
+
+此模块未定义任何设置.
+
+### 应用层
+
+#### 应用服务
+
+* `ApiResourceAppService` (实现 `IApiResourceAppService`):实现了 API 资源管理 UI 的用例.
+* `IdentityServerClaimTypeAppService` (实现 `IIdentityServerClaimTypeAppService`):用于获取声明列表.
+* `ApiResourceAppService` (实现 `IApiResourceAppService`):实现了 API 管理资源 UI 的用例.
+* `IdentityResourceAppService` (实现 `IIdentityResourceAppService`):实现了身份资源管理 UI 的用例.
+
+### 数据库提供程序
+
+#### 公共
+
+##### 表/集合 前缀 & 架构
+
+所有表/集合都使用 `IdentityServer` 作为默认前缀.如果你需要改变表的前缀或设置一个架构名称(如果你的数据库提供程序支持),请设置 `AbpIdentityServerDbProperties` 类的静态属性.
+
+##### 连接字符串
+
+此模块使用 `AbpIdentityServer` 作为连接字符串的名称.如果你没有用这个名称定义连接字符串,它将回退到 `Default` 连接字符串.
+
+有关详细信息,请参阅 [连接字符串](https://docs.abp.io/en/abp/latest/Connection-Strings) 文档.
+
+#### EF Core
+
+##### 表
+
+* **IdentityServerApiResources**
+ * IdentityServerApiSecrets
+ * IdentityServerApiScopes
+ * IdentityServerApiScopeClaims
+ * IdentityServerApiClaims
+* **IdentityServerClients**
+ * IdentityServerClientScopes
+ * IdentityServerClientSecrets
+ * IdentityServerClientGrantTypes
+ * IdentityServerClientCorsOrigins
+ * IdentityServerClientRedirectUris
+ * IdentityServerClientPostLogoutRedirectUris
+ * IdentityServerClientIdPRestrictions
+ * IdentityServerClientClaims
+ * IdentityServerClientProperties
+* **IdentityServerPersistedGrants**
+* **IdentityServerIdentityResources**
+ * IdentityServerIdentityClaims
+
+#### MongoDB
+
+##### 集合
+
+* **IdentityServerApiResources**
+* **IdentityServerClients**
+* **IdentityServerPersistedGrants**
+* **IdentityServerIdentityResources**
diff --git a/docs/zh-Hans/Tutorials/Part-2.md b/docs/zh-Hans/Tutorials/Part-2.md
index decddfebff..fe0dd84c45 100644
--- a/docs/zh-Hans/Tutorials/Part-2.md
+++ b/docs/zh-Hans/Tutorials/Part-2.md
@@ -2,26 +2,10 @@
````json
//[doc-params]
{
- "UI": ["MVC","NG"],
+ "UI": ["MVC","Blazor","BlazorServer","NG"],
"DB": ["EF","Mongo"]
}
````
-
-{{
-if UI == "MVC"
- DB="ef"
- DB_Text="Entity Framework Core"
- UI_Text="mvc"
-else if UI == "NG"
- DB="mongodb"
- DB_Text="MongoDB"
- UI_Text="angular"
-else
- DB ="?"
- UI_Text="?"
-end
-}}
-
## 关于本教程
在本系列教程中, 你将构建一个名为 `Acme.BookStore` 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以下技术开发的:
@@ -44,16 +28,30 @@ end
## 下载源码
-本教程根据你的**UI** 和 **Database**偏好有多个版,我们准备了两种可供下载的源码组合:
+本教程根据你的**UI** 和 **数据库**偏好有多个版本,我们准备了几种可供下载的源码组合:
* [MVC (Razor Pages) UI 与 EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore)
+* [Blazor UI 与 EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore)
* [Angular UI 与 MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb)
+> 如果你在Windows中遇到 "文件名太长" or "解压错误", 很可能与Windows最大文件路径限制有关. Windows文件路径的最大长度为250字符. 为了解决这个问题,参阅 [在Windows 10中启用长路径](https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd#enable-long-paths-in-windows-10-version-1607-and-later).
+
+> 如果你遇到与Git相关的长路径错误, 尝试使用下面的命令在Windows中启用长路径. 参阅 https://github.com/msysgit/msysgit/wiki/Git-cannot-create-a-file-or-directory-with-a-long-path
+> `git config --system core.longpaths true`
+
+{{if UI == "MVC" && DB == "EF"}}
+
+### 视频教程
+
+本章也被录制为视频教程 **发布在YouTube**.
+
+{{end}}
+
{{if UI == "MVC"}}
## 动态JavaScript代理
-通常在 **JavaScript** 端通过AJAX调用HTTP API端点. 你可以使用 `$.ajax` 或其他工具来调用端点. 但是ABP提供了更好的方法.
+在 **JavaScript** 端通过AJAX调用HTTP API端点是常见的做法. 你可以使用 `$.ajax` 或其他工具来调用端点. 但是ABP提供了更好的方法.
ABP**动态**为所有API端点创建 **[JavaScript代理](../UI/AspNetCore/Dynamic-JavaScript-Proxies.md)**. 所以你可以像调用**Javascript本地方法**一样使用任何**端点**.
@@ -79,21 +77,21 @@ acme.bookStore.books.book.getList({}).done(function (result) { console.log(resul

-Let's **create a new book** using the `create` function:
-
让我们使用 `create` 函数**创建一本书**:
````js
-acme.bookStore.books.book.create({
- name: 'Foundation',
- type: 7,
- publishDate: '1951-05-24',
- price: 21.5
- }).then(function (result) {
- console.log('successfully created the book with id: ' + result.id);
+acme.bookStore.books.book.create({
+ name: 'Foundation',
+ type: 7,
+ publishDate: '1951-05-24',
+ price: 21.5
+ }).then(function (result) {
+ console.log('successfully created the book with id: ' + result.id);
});
````
+> 如果你下载了本教程的源代码并按照示例中的步骤操作,你需要传递`authorId`参数给创建方法以**创建一本新书**.
+
您应该在控制台中看到类似以下的消息:
````text
@@ -102,7 +100,7 @@ successfully created the book with id: 439b0ea8-923e-8e1e-5d97-39f2c7ac4246
检查数据库中的 `Books` 表你会看到新的一行. 你可以自己尝试使用 `get`, `update` 和 `delete` 函数.
-我们将利用这些动态代理功能在接下来的章节来与服务器通信.
+在接下来的章节,我们将利用这些动态代理函数与服务器通信.
{{end}}
@@ -112,7 +110,7 @@ successfully created the book with id: 439b0ea8-923e-8e1e-5d97-39f2c7ac4246
本地化文本位于 `Acme.BookStore.Domain.Shared` 项目的 `Localization/BookStore` 文件夹下:
-
+
打开 `en.json` (*英文翻译*)文件并更改内容,如下所示:
@@ -154,7 +152,7 @@ successfully created the book with id: 439b0ea8-923e-8e1e-5d97-39f2c7ac4246
* 为按钮项添加 `Menu:` 前缀.
* 使用 `Enum::` 命名约定来本地化枚举成员. 当您这样做时ABP可以在某些适当的情况下自动将枚举本地化.
-如果未在本地化文件中定义文本,则文本将**回退**到本地化键(作为ASP.NET Core的标准行为).
+如果未在本地化文件中定义文本,则文本将**回退**到本地化键(ASP.NET Core的标准行为).
> ABP本地化系统建立在[ASP.NET Core标准本地化](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization)系统之上,并以多种方式进行了扩展. 有关详细信息请参见[本地化文档](../Localization.md).
@@ -162,7 +160,7 @@ successfully created the book with id: 439b0ea8-923e-8e1e-5d97-39f2c7ac4246
## 创建图书页面
-是时候创建可见的和可用的东西了! 代替经典的MVC,我们将使用微软推荐的[Razor Pages UI](https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/razor-pages-start).
+是时候创建可见的和可用的东西了! 我们将使用微软推荐的[Razor Pages UI](https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/razor-pages-start),而不是经典的MVC.
在 `Acme.BookStore.Web` 项目的 `Pages` 文件夹下创建一个名为新的 `Books` 的文件夹. 然后在文件夹右键选择 **添加 > Razor Page** 菜单. 输入名称 `Index`:
@@ -189,13 +187,13 @@ namespace Acme.BookStore.Web.Pages.Books
{
public void OnGet()
{
-
+
}
}
}
```
-### 将Book页面添加到主菜单
+### 将图书页面添加到主菜单
打开 `Menus` 文件夹中的 `BookStoreMenuContributor` 类,在 `ConfigureMainMenuAsync` 方法的底部添加如下代码:
@@ -223,9 +221,7 @@ context.Menu.AddItem(
### 图书列表
-We will use the [Datatables.net](https://datatables.net/) jQuery library to show the book list. Datatables library completely work via AJAX, it is fast, popular and provides a good user experience.
-
-我们将使用[Datatables.net](https://datatables.net/)JQuery插件来显示页面上的表格列表. [Datatables](https://datatables.net/)可以完全通过AJAX工作,速度快,并提供良好的用户体验.
+我们将使用[Datatables.net](https://datatables.net/)JQuery插件来显示图书列表. [Datatables](https://datatables.net/)可以完全通过AJAX工作,速度快,并提供良好的用户体验.
> Datatables插件在启动模板中配置,因此你可以直接在任何页面中使用它,无需在页面中引用样式和脚本文件.
@@ -261,7 +257,7 @@ We will use the [Datatables.net](https://datatables.net/) jQuery library to show
在 `Pages/Books/` 文件夹中创建 `index.js`文件
-
+
`index.js` 的内容如下:
@@ -321,8 +317,8 @@ $(function () {
````
* `abp.localization.getResource` 获取一个函数,该函数用于使用服务器端定义的相同JSON文件对文本进行本地化. 通过这种方式你可以与客户端共享本地化值.
-* `abp.libs.datatables.normalizeConfiguration`是另一个辅助方法.不是必须的, 但是它通过为缺少的选项提供常规值来简化数据表配置.
-* `abp.libs.datatables.createAjax`是帮助ABP的动态JavaScript API代理跟[Datatable](https://datatables.net/)的格式相适应的辅助方法.
+* `abp.libs.datatables.normalizeConfiguration`是一个辅助方法.不是必须的, 但是它通过为缺省的选项提供约定的值来简化[Datatables](https://datatables.net/)配置.
+* `abp.libs.datatables.createAjax`是另一个辅助方法,用来适配ABP的动态JavaScript API代理和[Datatable](https://datatables.net/)期望的参数格式.
* `acme.bookStore.books.book.getList` 是动态JavaScript代理函数(上面已经介绍过了)
* [luxon](https://moment.github.io/luxon/) 库也是该解决方案中预先配置的标准库,你可以轻松地执行日期/时间操作.
@@ -334,15 +330,13 @@ $(function () {

-这是一个完全正常工作的服务端分页,排序和本地化的图书列表.
-
-{{end}}
+这是一个可以正常工作的,服务端分页,排序和本地化的图书列表.
{{if UI == "NG"}}
## 安装NPM包
->注意: 本教程基于ABP Framework v3.0.3+. 如果你的项目版本较旧,请升级您的解决方案. 如果要升级现有的v2.x项目,请参阅[迁移指南](../UI/Angular/Migration-Guide-v3.md).
+>注意: 本教程基于ABP Framework v3.1.0+. 如果你的项目版本较旧,请升级您的解决方案. 如果要升级现有的v2.x项目,请参阅[迁移指南](../UI/Angular/Migration-Guide-v3.md).
在 `angular` 目录下打开命令行窗口,选择 `yarn` 命令安装NPM包:
@@ -357,9 +351,7 @@ yarn
- [Ng Bootstrap](https://ng-bootstrap.github.io/#/home) 用做UI组件库.
- [ngx-datatable](https://swimlane.gitbook.io/ngx-datatable/) 用做 datatable 类库.
-### BookModule
-
-运行以下命令创建一个名为 `BookModule` 的新模块:
+运行以下命令在angular应用程序根目录创建一个名为 `BookModule` 的新模块:
```bash
yarn ng generate module book --module app --routing --route books
@@ -417,7 +409,7 @@ const routes: Routes = [
];
````
-现在打开 `src/app/route.provider.ts` 以下替换 `configureRoutes` 函数:
+现在打开 `src/app/route.provider.ts` 替换 `configureRoutes` 函数为以下代码:
```js
function configureRoutes(routes: RoutesService) {
@@ -450,27 +442,31 @@ function configureRoutes(routes: RoutesService) {
`RoutesService` 是ABP框架提供的用于配置主菜单和路由的服务.
-* `path` 路由的URL.
+* `path` 路由的URL.
* `name` 菜单项的名称(参阅[本地化文档](../UI/Angular/Localization.md)了解更多).
-* `iconClass` 菜单项的图标(你可以使用默认的[Font Awesome](https://fontawesome.com/)图标).
-* `order` 菜单项的排序.我们定义了101,它显示在 "Administration" 项的后面.
-* `layout` BooksModule路由的布局. 可以定义 `eLayoutType.application`, `eLayoutType.account` 或 `eLayoutType.empty`.
+* `iconClass` 菜单项的图标(你可以使用默认的[Font Awesome](https://fontawesome.com/)图标).
+* `order` 菜单项的排序.
+* `layout` BooksModule路由的布局. (有三个预定义的布局类型: `eLayoutType.application`, `eLayoutType.account` 或 `eLayoutType.empty`).
+
+更多信息请参阅[RoutesService 文档](../UI/Angular/Modifying-the-Menu.md#via-routesservice).
-更多信息请参阅[RoutesService 文档](https://docs.abp.io/en/abp/latest/UI/Angular/Modifying-the-Menu.md#via-routesservice).
+### 生成服务代理
-### 生成代理
+[ABP CLI](../CLI.md) 提供 `generate-proxy` 命令为HTTP APIs生成客户端代理.有了这些代理,在客户端使用HTTP APIs变得更加方便. 运行 `generate-proxy` 命令前, 你的 host 必须正在运行.
-ABP CLI提供了 `generate-proxy` 命令为你的服务HTTP API生成客户端代理简化客户端使用服务的成本. 运行 `generate-proxy` 命令前你的host必须正在运行. 参阅 [CLI 文档](../CLI.md).
+> **警告**: 使用IIS Express时有一个问题; 它不允许从另一个进程连接应用程序. 如果你使用Visual Studio, 在运行按钮的下拉框中选择`Acme.BookStore.HttpApi.Host`,不要选择IIS Express, 如下图:
-在 `angular` 文件夹下运行以下命令:
+
+
+启动host应用程序后,在 `angular` 文件夹下运行以下命令:
```bash
-abp generate-proxy
+abp generate-proxy -t ng
```
-生成的文件如下:
+这个命令将在`/src/app/proxy/books`文件夹下产生以下文件:
-
+
### BookComponent
@@ -479,8 +475,7 @@ abp generate-proxy
```js
import { ListService, PagedResultDto } from '@abp/ng.core';
import { Component, OnInit } from '@angular/core';
-import { BookDto } from './models';
-import { BookService } from './services';
+import { BookService, BookDto } from '@proxy/books';
@Component({
selector: 'app-book',
@@ -494,7 +489,7 @@ export class BookComponent implements OnInit {
constructor(public readonly list: ListService, private bookService: BookService) {}
ngOnInit() {
- const bookStreamCreator = (query) => this.bookService.getListByInput(query);
+ const bookStreamCreator = (query) => this.bookService.getList(query);
this.list.hookToQuery(bookStreamCreator).subscribe((response) => {
this.book = response;
@@ -503,8 +498,8 @@ export class BookComponent implements OnInit {
}
```
-* 我们注入了生成的 `BookService`.
-* 我们实现了 [ListService](https://docs.abp.io/en/abp/latest/UI/Angular/List-Service),它是一个公用服务,提供了简单的分页,排序和搜索.
+* 我们引入并注入了生成的 `BookService`.
+* 我们使用 [ListService](../UI/Angular/List-Service.md),它是一个工具服务,提供了易用的分页,排序和搜索.
打开 `/src/app/book/book.component.html` 用以下内容替换它:
@@ -545,9 +540,138 @@ export class BookComponent implements OnInit {
现在你可以在浏览器看到最终结果:
-
+
-{{end}}
+{{else if UI == "Blazor" || UI == "BlazorServer"}}
+
+## 创建图书页面
+
+是时候创建可见和可用的东西了! 右击`Acme.BookStore.Blazor`项目下的`Pages`文件夹,新建一个名为`Books.razor`的**razor组件**.
+
+
+
+用以下内容替换这个组件的内容:
+
+````html
+@page "/books"
+
+