diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 99a4772469..984f1c97ab 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -125,7 +125,23 @@ { "text": "1: Creating the Solution", "path": "tutorials/book-store-with-abp-suite/part-01.md" - } + }, + { + "text": "2: Creating the Books", + "path": "tutorials/book-store-with-abp-suite/part-02.md" + }, + { + "text": "3: Creating the Authors", + "path": "tutorials/book-store-with-abp-suite/part-03.md" + }, + { + "text": "4: Book to Author Relation", + "path": "tutorials/book-store-with-abp-suite/part-04.md" + }, + { + "text": "5: Customizing the Generated Code", + "path": "tutorials/book-store-with-abp-suite/part-05.md" + } ] }, { diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-opening.png b/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-opening.png new file mode 100644 index 0000000000..3163a86530 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-opening.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/studio-browser-suite.png b/docs/en/tutorials/book-store-with-abp-suite/images/studio-browser-suite.png new file mode 100644 index 0000000000..227b03a7a5 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/studio-browser-suite.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-1.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-1.png new file mode 100644 index 0000000000..b0743df8bd Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-1.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-2.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-2.png new file mode 100644 index 0000000000..db546d3628 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-2.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-3.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-3.png new file mode 100644 index 0000000000..c6d44202e2 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-3.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-4.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-4.png new file mode 100644 index 0000000000..8e35d06933 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-4.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-5.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-5.png new file mode 100644 index 0000000000..a8755569f7 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-5.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-6.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-6.png new file mode 100644 index 0000000000..f56fc4451b Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-6.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-pages-1.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-pages-1.png new file mode 100644 index 0000000000..77464876a0 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-pages-1.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/index.md b/docs/en/tutorials/book-store-with-abp-suite/index.md index 285e2cca50..b0f24ef6d3 100644 --- a/docs/en/tutorials/book-store-with-abp-suite/index.md +++ b/docs/en/tutorials/book-store-with-abp-suite/index.md @@ -16,12 +16,12 @@ } ```` +> This tutorial is suitable for those who have an ABP Team or a higher [license](https://abp.io/pricing). + ## About This Tutorial > In this tutorial, you will use the [ABP Suite](../../suite/index.md) to generate everything you need to build the **BookStore** application, such as [*Entities*](../../framework/architecture/domain-driven-design/entities.md), [*Domain Services*](../../framework/architecture/domain-driven-design/domain-services.md), [*Application Services*](../../framework/architecture/domain-driven-design/application-services.md), *CRUD pages* and more... -> You must have an **ABP Team** or a higher license to use the ABP Suite. - 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 database provider. @@ -29,7 +29,7 @@ In this tutorial series, you will build an ABP based web application named `Acme This tutorial is organized as the following parts: -- [Part 1: Creating the Solution](part-01.md), +- [Part 1: Creating the Solution](part-01.md) - [Part 2: Creating the Books](part-02.md) - [Part 3: Creating the Authors](part-03.md) - [Part 4: Book to Author Relation](part-04.md) @@ -37,4 +37,4 @@ This tutorial is organized as the following parts: ### Download the Source Code -//TODO: create the sample application in the abp-commercial-samples repository and place the links here!!! \ No newline at end of file +After logging in to the ABP website, you can download the source code from [here](https://abp.io/api/download/samples/suite-bookstore-mvc-ef). \ No newline at end of file diff --git a/docs/en/tutorials/book-store-with-abp-suite/part-01.md b/docs/en/tutorials/book-store-with-abp-suite/part-01.md index f74315afc9..d6dc9cdf24 100644 --- a/docs/en/tutorials/book-store-with-abp-suite/part-01.md +++ b/docs/en/tutorials/book-store-with-abp-suite/part-01.md @@ -16,20 +16,24 @@ } ```` -Before starting the development, create a new solution named `Acme.BookStore` and run it by following the [getting started tutorial](../../get-started/layered-web-application.md) +Before starting the development, create a new solution named `Acme.BookStore` and run it by following the [getting started tutorial](../../get-started/layered-web-application.md). You can use the following configurations: * **Solution Name:** `Acme.BookStore` * **UI Framework:** {{if UI=="MVC}} ASP.NET Core MVC / Razor Pages {{end}} * **UI Theme:** LeptonX -* **Mobile Framwork:** None +* **Mobile Framework:** None * **Database Provider:** {{if DB=="EF"}} Entity Framework Core {{end}} You can select the other options based on your preference. -> **Please complete the [Get Stared](../../get-started/layered-web-application.md) guide and run the web application before going further.** +> **Please complete the [Get Started](../../get-started/layered-web-application.md) guide and run the web application before going further.** The initial solution structure should be like the following in the ABP Studio's [Solution Explorer](../../studio/solution-explorer.md): -![](./images/book-store-suite-solution-explorer.png) \ No newline at end of file +![](./images/book-store-suite-solution-explorer.png) + +## Summary + +We've created the initial layered monolith solution. In the next part, we will learn how to create entities, and generate CRUD pages based on the specified options (including tests, UI, customizable code support etc.) with [ABP Suite](../../suite/index.md). \ No newline at end of file diff --git a/docs/en/tutorials/book-store-with-abp-suite/part-02.md b/docs/en/tutorials/book-store-with-abp-suite/part-02.md new file mode 100644 index 0000000000..971a2693bd --- /dev/null +++ b/docs/en/tutorials/book-store-with-abp-suite/part-02.md @@ -0,0 +1,106 @@ +# Web Application Development (with ABP Suite) Tutorial - Part 2: Creating the Books +````json +//[doc-params] +{ + "UI": ["MVC"], + "DB": ["EF"] +} +```` +````json +//[doc-nav] +{ + "Previous": { + "Name": "Creating the Solution", + "Path": "tutorials/book-store-with-abp-suite/part-01" + }, + "Next": { + "Name": "Creating the Authors", + "Path": "tutorials/book-store-with-abp-suite/part-03" + } +} +```` + +In this part, you will create a new entity named `Book` and generate CRUD pages for the related entities with everything that you would normally implement manually (including application services, tests, CRUD pages, database relations and more...) via [ABP Suite](../../suite/index.md) with few clicks. + +## Opening the ABP Suite + +After creating our solution in the previous part, now we can open the ABP Suite and start generating CRUD pages. You can select the *ABP Suite -> Open* command on the main menu to open ABP Suite: + +![opening the ABP Suite](./images/abp-suite-opening.png) + +After clicking the related command, pre-integrated browser of ABP Studio should be opened, then we can start generating entities and all related codes with a few configurations: + +![](./images/studio-browser-suite.png) + +## Creating the Book Entity + +Let's create a `Book` entity with some properties. First, type `Book` for the *Name* field and leave the other options as is. ABP Suite automatically calculates proper values for the rest of the inputs for you: + +![](./images/suite-book-entity-1.png) + +ABP Suite sets: + +* Entity type as **master** (ABP Suite allows you to establish [master-child relationship](../../suite/creating-master-detail-relationship.md)), +* Base class as **FullAuditedAggregateRoot** ([see other possible values](../../framework/architecture/domain-driven-design/entities.md)), +* Primary key type as **Guid**, +* Plural name, database name, namespace, page title, menu item and more... + +Let's change the menu-item value as **book** to show a proper icon in the generated UI, and also enable **code customization**, **creating unit & integration tests**, and other options as you wish: + +![](./images/suite-book-entity-2.png) + +After, specifying the entity metadata, open the *Properties* tab and create the properties shown in the following figure: + +![](./images/suite-book-entity-3.png) + +Here the details: + +* `Name` is **required**, it's a **string** property and maximum length is **128**. +* `Type` is an **enum** and the enum file path is *\Acme.BookStore.Domain.Shared\Books\BookType.cs* (we will create the file, in the next section). +* `PublishDate` is a **DateTime** property and **not nullable**. +* `Price` is a **float** property and **required**. + +You can leave the other configurations as default. + +> ABP Suite allows you to define properties with a great range of options, for example, you can specify the property type as *string*, *int*, *float*, *Guid*, *DateTime*, and even *File* (for file upload) and also you can set any options by building up your properties, such as specifying it as *required*, or *nullable*, setting *max-min length*, *default value* and more... + +While defining the properties, we defined a *Type* property with the type of *enum*. ABP Suite asks for an enum path to read the enum file, and set the namespace, and enum name in the generated code. + +For that purpose, we should create a `BookType` enum in the `Acme.BookStore.Domain.Shared` project under the **Books** folder as follows: + +```csharp +namespace Acme.BookStore.Books; + +public enum BookType +{ + Undefined, + Adventure, + Biography, + Dystopia, + Fantastic, + Horror, + Science, + ScienceFiction, + Poetry +} +``` + +Then, you can specify the enum path for the `Type` property in ABP Suite like in the following figure: + +![](./images/suite-book-entity-4.png) + +After that, you can click the **Save and Generate** button to start the code generation process: + +![](./images/suite-book-entity-5.png) + +ABP Suite will generate the necessary code for you. It will take some time to complete the process. After the process is completed, you will see a success message, you can click the *Ok* button, and build & start the application by clicking the *Run -> Build & Start* button in the *Solution Runner* panel: + +![](./images/suite-book-entity-6.png) + +After the application is started, you can right-click and *Browse* on the application to open it in the ABP Studio's pre-integrated browser. You can see the Books page in the following figure with a single record: + +![](./images/suite-book-pages-1.png) + +## Summary + +In this part, we've created a new entity named `Book` and generated the necessary code for it with [ABP Suite](../../suite/index.md) within a few clicks. ABP Suite generated the all code for us, including the **entity**, **application service**, **database relations**, **unit & integration tests**, **UI** and **defined the custom hooks for code customization**. \ No newline at end of file