From f6d42115b9c88b58db92240ca26d69a44d2edfe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E9=A3=8E?= <46520648+hrx521@users.noreply.github.com> Date: Sun, 25 Apr 2021 20:11:05 +0800 Subject: [PATCH 1/3] Create Index.md --- docs/zh-Hans/Tutorials/todo/Index.md | 819 +++++++++++++++++++++++++++ 1 file changed, 819 insertions(+) create mode 100644 docs/zh-Hans/Tutorials/todo/Index.md diff --git a/docs/zh-Hans/Tutorials/todo/Index.md b/docs/zh-Hans/Tutorials/todo/Index.md new file mode 100644 index 0000000000..58b0a8426f --- /dev/null +++ b/docs/zh-Hans/Tutorials/todo/Index.md @@ -0,0 +1,819 @@ +# 快速入门 + +````json +//[doc-params] +{ + "UI": ["MVC", "Blazor", "BlazorServer", "NG"], + "DB": ["EF", "Mongo"] +} +```` + +这是一个单独的部分,使用ABP框架构建简单todo应用程序的快速入门教程。这是一个最终应用的截图: + +![todo-list](todo-list.png) + +您可以从已完成的项目里找到源代码,[这里](https://github.com/abpframework/abp-samples/tree/master/TodoApp)。 +## 先决条件 + +* 一个集成开发环境 (比如: [Visual Studio](https://visualstudio.microsoft.com/vs/)) 它需要支持 [.NET 5.0+](https://dotnet.microsoft.com/download/dotnet) 的开发. + +{{if DB=="Mongo"}} + +* [MongoDB Server 4.0+](https://docs.mongodb.com/manual/administration/install-community/) + +{{end}} + +{{if UI=="NG"}} + +* [Node v14.x](https://nodejs.org/) + +{{end}} + +## 创建新的解决方案 + +我们将使用[ABP CLI](../../CLI.md) 创建带有ABP框架的新解决方案。 您可以在命令行终端中运行以下命令来安装它: + +````bash +dotnet tool install -g Volo.Abp.Cli +```` + +然后创建一个空文件夹,打开命令行终端并以打开的文件夹为路径在终端中执行以下命令: + +````bash +abp new TodoApp{{if UI=="Blazor"}} -u blazor{{else if UI=="BlazorServer"}} -u blazor-server{{else if UI=="NG"}} -u angular{{end}}{{if DB=="Mongo"}} -d mongodb{{end}} +```` + +{{if UI=="NG"}} + +这将创建一个名为*TodoApp*的新解决方案,其中包含`angular`和`aspnet core`文件夹。解决方案就绪后,在你的IDE中打开ASP.NET Core 解决方案。 + +{{else}} + +这将创建一个名为*TodoApp*的新解决方案。解决方案准备好后,在您的IDE中打开它。 + +{{end}} + +### 创建数据库 + +如果您使用的是visual studio,请右键单击`TodoApp.DbMigrator`项目,选择*设置为启动项目*,然后按*Ctrl+F5*运行它而不进行调试。它将创建初始数据库并播种初始数据。 + +{{if DB=="EF"}} + +> 由于*DbMigrator*添加初始迁移并重新编译项目,一些ide(例如Rider)在第一次运行时可能会出现问题。在这种情况下,请打开`.DbMigrator`项目文件夹中的命令行终端,然后执行`dotnet run`命令。 + +{{end}} + +### 运行应用程序 + +{{if UI=="MVC" || UI=="BlazorServer"}} + +最好在开始开发之前运行一下应用程序。确保 {{if UI=="BlazorServer"}}`TodoApp.Blazor`{{else}}`TodoApp.Web`{{end}} 是启动项目,然后运行应用程序(Visual Studio中是Ctrl+F5)以查看查看初始UI: + +{{else if UI=="Blazor"}} + +最好在开始开发之前运行一下应用程序。该解决方案有两个主要应用: + +* `TodoApp.HttpApi.Host` 托管服务器端的 HTTP API。 +* `TodoApp.Blazor` 客户端托管的 Blazor WebAssembly 应用. + +确保 `TodoApp.HttpApi.Host` 是启动项目,然后运行应用程序(Visual Studio中的Ctrl+F5)以查看[Swagger UI](https://swagger.io/tools/swagger-ui/)上server-side 的 HTTP API: + +![todo-swagger-ui-initial](todo-swagger-ui-initial.png) + +您可以使用此UI查看和测试您的HTTP API。现在,我们可以将 `TodoApp.Blazor` 设置为启动项目,并运行它来打开实际的Blazor应用程序UI: + +{{else if UI=="NG"}} + +最好在开始开发之前运行应用程序。该解决方案有两个主要应用: + +* `TodoApp.HttpApi.Host` (在.NET解决方案中)承载服务器端HTTP API。 +* `angular` 文件夹包含 Angular 应用程序。 + +确保`TodoApp.HttpApi.Host`project是启动项目,然后运行应用程序(visual studio中是Ctrl+F5)以查看[Swagger UI](https://swagger.io/tools/swagger-ui/)上server-side HTTP API: + +![todo-swagger-ui-initial](todo-swagger-ui-initial.png) + +您可以使用这个UI查看和测试您的HTTP API。如果可以的话,我们可以运行Angular客户端应用程序。 + +首先,运行以下命令来还原NPM包: + +````bash +npm install +```` + +安装所有软件包需要一些时间。然后可以使用以下命令运行应用程序: + +````bash +npm start +```` + +此命令需要一点时间,但最终会在默认浏览器中运行并打开应用程序: + +{{end}} + +![todo-ui-initial](todo-ui-initial.png) + +您可以单击 *登录* 按钮,以`admin`作为用户名,`1q2w3E*` 作为密码登录到应用程序。 + +一切就绪。我们可以开始编码了! + +## Domain Layer 领域层 + +此应用程序只有一个 [entity](../../Entities.md) and we are starting by creating it. Create a new `TodoItem` class inside the *TodoApp.Domain* project: +我们开始创建它。 在*TodoApp.Domain*项目中创建一个新的 `TodoItem` 类: +````csharp +using System; +using Volo.Abp.Domain.Entities; + +namespace TodoApp +{ + public class TodoItem : BasicAggregateRoot + { + public string Text { get; set; } + } +} +```` + +`BasicAggregateRoot` 是创建根实体的最简单的基类之一,`Guid` 是这里实体的主键 (`Id`)。 +## Database Integration 数据库集成 + +{{if DB=="EF"}} + +下一步是设置 [Entity Framework Core](../../Entity-Framework-Core.md) 配置。 + +### Mapping Configuration 映射配置 + +在 *TodoApp.EntityFrameworkCore* 项目的 `EntityFrameworkCore` 文件夹中打开 `TodoAppDbContext` 类,并向该类添加一个新的 `DbSet` 属性: + +````csharp +public DbSet TodoItems { get; set; } +```` + +然后在同一文件夹中打开 `TodoAppDbContextModelCreatingExtensions` 类,并为 `TodoItem` 类添加映射配置,如下所示: + +````csharp +public static void ConfigureTodoApp(this ModelBuilder builder) +{ + Check.NotNull(builder, nameof(builder)); + + builder.Entity(b => + { + b.ToTable("TodoItems"); + }); +} +```` + +我们已经将 `TodoItem` 实体映射到数据库中的 `TodoItems` 表。 + +### Code First Migrations 代码优先迁移 + +解决方案启动模版已经配置为使用Entity Framework Core [Code First 迁移](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations)。由于我们已经更改了数据库映射配置,因此我们应该创建一个新的迁移并将更改应用于数据库。 + +在 *TodoApp.EntityFrameworkCore.DbMigrations* 项目的目录中打开一个命令行终端,然后键入以下命令: + +````bash +dotnet ef migrations add Added_TodoItem +```` + +这将向项目添加一个新的迁移类: + +![todo-efcore-migration](todo-efcore-migration.png) + +您可以在同一命令行终端中使用以下命令将更改应用于数据库: + +````bash +dotnet ef database update +```` + +> 如果您使用的是Visual Studio,*则可能希望在包管理器控制台 (PMC)* 中使用 `Add-Migration Added_TodoItem` 和 `Update-Database` 命令。在这种情况下,请确保 {{if UI=="MVC"}}`TodoApp.Web`{{else if UI=="BlazorServer"}}`TodoApp.Blazor`{{else if UI=="Blazor" || UI=="NG"}}`TodoApp.HttpApi.Host`{{end}} 是启动项目,并且 `TodoApp.EntityFrameworkCore.DbMigrations` 是PMC中的 *默认项目*。 +{{else if DB=="Mongo"}} + +下一步是设置 [MongoDB](../MongoDB.md) 配置。在 *TodoApp.MongoDB* 项目的 `MongoDb` 文件夹中打开 `TodoAppMongoDbContext` 类,并进行以下更改; +1. 向类添加新属性: + +````csharp +public IMongoCollection TodoItems => Collection(); +```` + +2. 在 `CreateModel` 方法中添加以下代码: + +````csharp +modelBuilder.Entity(b => +{ + b.CollectionName = "TodoItems"; +}); +```` + +{{end}} + +现在,我们可以使用ABP仓储来保存和检索todo列表项了,就像我们将在下一节中做的那样。 + +## Application Layer 应用层 + +[Application Service应用服务](../../Application-Services.md) 用于执行应用程序的用例。我们需要执行以下用例; + +* 获取待办事项列表 +* 创建新的todo项 +* 删除现有的todo项目 + +### Application Service Interface 应用服务接口 + +我们可以从为应用程序服务定义一个接口开始。在 *TodoApp.Application.Contracts* 项目中创建一个新的 `ITodoAppService` 接口,如下所示: + +````csharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace TodoApp +{ + public interface ITodoAppService : IApplicationService + { + Task> GetListAsync(); + Task CreateAsync(string text); + Task DeleteAsync(Guid id); + } +} +```` + +### Data Transfer Object 数据传输对象 + +`GetListAsync` and `CreateAsync` methods return `TodoItemDto`. Applications Services typically gets and returns DTOs ([Data Transfer Objects](../../Data-Transfer-Objects.md)) instead of entities. So, we should define the DTO class here. Create a new `TodoItemDto` class inside the *TodoApp.Application.Contracts* project: + +````csharp +using System; + +namespace TodoApp +{ + public class TodoItemDto + { + public Guid Id { get; set; } + public string Text { get; set; } + } +} +```` + +这是一个非常简单的DTO类,与我们的 `TodoItem` 实体匹配。我们接下来实现 `ITodoAppService` 接口。 + +### Application Service Implementation 应用服务实现 + +在 *TodoApp.Application* 项目内部创建一个 `TodoAppService` 类,如下所示: + +````csharp +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Repositories; + +namespace TodoApp +{ + public class TodoAppService : ApplicationService, ITodoAppService + { + private readonly IRepository _todoItemRepository; + + public TodoAppService(IRepository todoItemRepository) + { + _todoItemRepository = todoItemRepository; + } + + // TODO: Implement the methods here... + } +} +```` + +该类继承自ABP框架的 `ApplicationService` 类,并实现之前定义的 `ITodoAppService`接口。ABP为实体提供默认的通用 [repositories存储库](../repositories.md)。我们可以使用它们来执行基本的数据库操作。此类 [injects 注入](../Dependency-Injection.md) `IRepository` 是 `TodoItem` 实体的默认存储库。我们将使用它来实现之前描述的用例。 + +#### 获取所有Todo项列表 + +Let's start by implementing the `GetListAsync` method: + +````csharp +public async Task> GetListAsync() +{ + var items = await _todoItemRepository.GetListAsync(); + return items + .Select(item => new TodoItemDto + { + Id = item.Id, + Text = item.Text + }).ToList(); +} +```` + +我们只是简单的从数据库中获取完整的 `TodoItem` 列表,将它们映射到 `TodoItemDto` 对象并作为结果返回。 + +#### 创建一个新的Todo项 + +下一个方法是 `CreateAsync`,我们可以像如下所示来实现: + +````csharp +public async Task CreateAsync(string text) +{ + var todoItem = await _todoItemRepository.InsertAsync( + new TodoItem {Text = text} + ); + + return new TodoItemDto + { + Id = todoItem.Id, + Text = todoItem.Text + }; +} +```` + +Repository的 `InsertAsync` 方法将给定的 `TodoItem` 插入数据库,并返回相同的 `TodoItem` 对象。它还设置 `Id`,因此我们可以在返回对象上使用它。我们只是通过从新的 `TodoItem` 实体创建返回 `TodoItemDto`。 + +#### 删除一个子项 + +最后,我们可以将 `DeleteAsync` 实现为以下代码块: + +````csharp +public async Task DeleteAsync(Guid id) +{ + await _todoItemRepository.DeleteAsync(id); +} +```` + +应用程序服务已准备好从UI层使用。 + +## User Interface Layer 用户界面层 + +是时候在UI上显示待办事项了!在开始编写代码之前,最好记住我们正在尝试构建的内容。这是最终UI的示例屏幕截图: + +![todo-list](todo-list.png) + +> **我们将在本教程中保持最简洁轻量的UI端,以使本教程简单且重点突出。请参阅[web应用程序开发教程](../Part-1.md) 以构建包含各个方面的真实页面。** + +{{if UI=="MVC"}} + +### Index.cshtml.cs + +在 *TodoApp.Web* 项目的 `Pages` 文件夹中打开 `Index.cshtml.cs` 文件,并用以下代码块替换它的默认内容: + +````csharp +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace TodoApp.Web.Pages +{ + public class IndexModel : TodoAppPageModel + { + public List TodoItems { get; set; } + + private readonly ITodoAppService _todoAppService; + + public IndexModel(ITodoAppService todoAppService) + { + _todoAppService = todoAppService; + } + + public async Task OnGetAsync() + { + TodoItems = await _todoAppService.GetListAsync(); + } + } +} +```` + +此类使用 `ITodoAppService` 获取todo项目列表并分配 `TodoItems` 属性。我们将用它来渲染razor页面上的待办事项。 + +### Index.cshtml + +在 *TodoApp.Web* 项目的 `Pages` 文件夹中打开 `Index.cshtml` 文件,并替换为以下内容: + +````xml +@page +@model TodoApp.Web.Pages.IndexModel +@section styles { + +} +@section scripts { + +} +
+ + + + TODO LIST + + + + +
+ + +
+ + +
    + @foreach (var todoItem in Model.TodoItems) + { +
  • + @todoItem.Text +
  • + } +
+
+
+
+```` + +我们使用ABP的 [card tag helper 卡片标签助手](../UI/AspNetCore/标签助手/Cards.md) 创建一个简单的卡片视图。您可以直接使用标准的bootstrap HTML,不过ABP的 [tag helpers 标签助手]() 使它更容易并且类型安全。 + +这个页面要导入一个CSS和一个JavaScript文件,所以我们也应该创建它们。 + +### Index.js + +在 *TodoApp.Web* 项目的 `Pages` 文件夹中打开 `Index.js` 文件,并替换为以下内容: + +````js +$(function () { + + // DELETING ITEMS ///////////////////////////////////////// + $('#TodoList').on('click', 'li i', function(){ + var $li = $(this).parent(); + var id = $li.attr('data-id'); + + todoApp.todo.delete(id).then(function(){ + $li.remove(); + abp.notify.info('Deleted the todo item.'); + }); + }); + + // CREATING NEW ITEMS ///////////////////////////////////// + $('#NewItemForm').submit(function(e){ + e.preventDefault(); + + var todoText = $('#NewItemText').val(); + todoApp.todo.create(todoText).then(function(result){ + $('
  • ') + .html(' ' + result.text) + .appendTo($('#TodoList')); + $('#NewItemText').val(''); + }); + }); +}); +```` + +在第一部分中,我们在todo项目附近注册点击垃圾图标的事件,删除服务器上的相关项目并在UI上显示通知。另外,我们从DOM中删除已删除的项目,因此我们不需要刷新页面。 + +在第二部分中,我们在服务器上创建一个新的todo事项。如果成功,我们将操纵DOM以将新的 `
  • ` 元素插入todo列表。这样,创建新的todo条目后就不用刷新整个页面了。 + +这里有趣的部分是我们如何与服务器通信。请参阅 *Dynamic JavaScript Proxies & Auto API Controllers 动态JavaScript代理和自动API控制器* 部分,以了解其工作原理。但是现在让我们继续并完成申请。 + +### Index.css + +最后要做的,请打开 *TodoApp.Web* 项目的 `Pages` 文件夹中的 `Index.css` 文件,并替换为以下内容: + +````css +#TodoList{ + list-style: none; + margin: 0; + padding: 0; +} + +#TodoList li { + padding: 5px; + margin: 5px 0px; + border: 1px solid #cccccc; + background-color: #f5f5f5; +} + +#TodoList li i +{ + opacity: 0.5; +} + +#TodoList li i:hover +{ + opacity: 1; + color: #ff0000; + cursor: pointer; +} +```` + +这是todo页面的简单样式。我们相信你可以做得更好 :) + +现在,您可以再次运行应用程序以查看结果。 + +### Dynamic JavaScript Proxies & Auto API Controllers 动态JavaScript代理和自动应用编程接口控制器 + +在 `Index.js` 文件中,我们使用了 `todoApp.todo.delete(...)` 和 `todoApp.todo.create(...)` 函数与服务器通信。这些函数是由ABP框架动态创建的,这要归功于 [Dynamic JavaScript Client Proxy 动态JavaScript客户端代理](../UI/AspNetCore/Dynamic-JavaScript-Proxies.md) 系统。他们对服务器执行HTTP API调用并返回承诺,因此您可以像上面所做的那样注册对 `then` 函数的回调。 + +但是,您可能会问我们还没有创建任何API控制器,那么服务器如何处理这些请求?这个问题给我们带来了ABP框架的 [Auto API Controller 自动API控制器](../API/Auto-API-Controllers.md) 功能。它通过约定自动将应用程序服务转换为API Controllers(API控制器)。 + +如果通过在应用程序中输入 `/swagger` URL来打开 [swagger UI](https://swagger.io/tools/ Swagger-ui/),则可以看到Todo API: + +![todo-api](todo-api.png) + +{{else if UI=="Blazor" || UI=="BlazorServer"}} + +### Index.razor.cs + +在 *TodoApp.Blazor* 项目的 `Pages` 文件夹中打开 `Index.razor.cs` 文件,并用以下代码块替换内容: + +````csharp +using Microsoft.AspNetCore.Components; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace TodoApp.Blazor.Pages +{ + public partial class Index + { + [Inject] + private ITodoAppService TodoAppService { get; set; } + + private List TodoItems { get; set; } = new List(); + private string NewTodoText { get; set; } + + protected async override Task OnInitializedAsync() + { + TodoItems = await TodoAppService.GetListAsync(); + } + + private async Task Create() + { + var result = await TodoAppService.CreateAsync(NewTodoText); + TodoItems.Add(result); + NewTodoText = null; + } + + private async Task Delete(TodoItemDto todoItem) + { + await TodoAppService.DeleteAsync(todoItem.Id); + await Notify.Info("Deleted the todo item."); + TodoItems.Remove(todoItem); + } + } +} +```` + +这个类使用 `ITodoAppService` 对todo项执行操作。它在创建和删除操作后操纵 `TodoItems` 列表。这样,我们不需要从服务器刷新整个todo列表。 + +{{if UI=="Blazor"}} + +请参阅下面的 *Dynamic C# Proxies & Auto API Controllers 动态C # 代理和自动API控制器* 部分,以了解如何从浏览器上运行的Blazor应用程序注入和使用应用程序服务接口!但是现在,让我们继续并完成这个应用。 + +{{end # Blazor}} + +### Index.razor + +在 *TodoApp.Blazor* 项目的 `Pages` 文件夹中打开 `Index.razor` 文件,并用以下代码块替换内容: + +````xml +@page "/" +@inherits TodoAppComponentBase +
    + + + + TODO LIST + + + + +
    + + +
    + + +
      + @foreach (var todoItem in TodoItems) + { +
    • + @todoItem.Text +
    • + } +
    +
    +
    +
    +```` + +### Index.razor.css + +最后,请在 *TodoApp.Web* 项目的 `Pages` 文件夹中打开 `Index.razor.css` 文件,并替换为以下内容: + +````css +#TodoList{ + list-style: none; + margin: 0; + padding: 0; +} + +#TodoList li { + padding: 5px; + margin: 5px 0px; + border: 1px solid #cccccc; + background-color: #f5f5f5; +} + +#TodoList li i +{ + opacity: 0.5; +} + +#TodoList li i:hover +{ + opacity: 1; + color: #ff0000; + cursor: pointer; +} +```` + +这是todo页面的简单样式。我们相信你可以做得更好 :) + +现在,您可以再次运行应用程序以查看结果。 + +{{if UI=="Blazor"}} + +### Dynamic C# Proxies & Auto API Controllers 动态C#代理和自动应用编程接口控制器 + +在 `Index.razor.cs` 文件中,我们已经注入 (使用 `[Inject]` 特性),并像使用本地服务一样使用 `ITodoAppService`。请记住,当此应用程序服务的实现在服务器上运行时,Blazor应用程序正在浏览器上运行。 + +这个神奇的过程是由ABP框架的 [Dynamic C# Client Proxy 动态C#客户端代理](../API/Dynamic-CSharp-API-Clients.md) 系统完成的。它使用标准的 `HttpClient` 并向远程服务器执行HTTP API请求。它还为我们处理所有标准任务,包括授权,JSON序列化和异常处理。 + +但是,您可能会问我们还没有创建任何API控制器,那么服务器如何处理这些请求?这个问题给我们带来了ABP框架的 [Auto API Controller 自动API控制器](../API/Auto-API-Controllers.md) 功能。它通过约定自动将应用程序服务转换为API控制器。 + +如果你运行 `TodoApp.HttpApi.Host` 应用程序,你可以看到Todo API: + +![todo-api](todo-api.png) + +{{end # Blazor}} + +{{else if UI=="NG"}} + +### Service Proxy Generation 服务代理生成 + +ABP提供了一个方便的功能,可以自动创建客户端服务,轻松使用服务器提供的HTTP APIs。 + +您首先需要运行 `TodoApp.HttpApi.Host` 项目,因为代理生成器从服务器应用程序读取API定义。 + +> **请注意**: IIS Express有问题; 它不允许从另一个进程连接到应用程序。如果您使用的是Visual Studio,请在 “运行” 按钮下拉列表中选择 `TodoApp.HttpApi.Host` 而不是IIS Express,如下图所示: +![run-without-iisexpress](run-without-iisexpress.png) + +运行 `TodoApp.HttpApi.Host` 项目后,在 `angular` 文件夹中打开命令行终端,然后键入以下命令: + +````bash +abp generate-proxy +```` + +如果一切顺利,应该生成如下所示的输出: + +````bash +CREATE src/app/proxy/generate-proxy.json (170978 bytes) +CREATE src/app/proxy/README.md (1000 bytes) +CREATE src/app/proxy/todo.service.ts (794 bytes) +CREATE src/app/proxy/models.ts (66 bytes) +CREATE src/app/proxy/index.ts (58 bytes) +```` + +然后,我们可以使用 `todoService` 来使用服务器端HTTP APIs,就像我们将在下一节中做的那样。 + +### home.component.ts + +打开 `/angular/src/app/home/home.component.ts` 文件,并用以下代码块替换其内容: + +````js +import { ToasterService } from '@abp/ng.theme.shared'; +import { Component, OnInit } from '@angular/core'; +import { TodoItemDto, TodoService } from '@proxy'; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.scss'] +}) +export class HomeComponent implements OnInit { + + todoItems: TodoItemDto[]; + newTodoText: string; + + constructor( + private todoService: TodoService, + private toasterService: ToasterService) + { } + + ngOnInit(): void { + this.todoService.getList().subscribe(response => { + this.todoItems = response; + }); + } + + create(): void{ + this.todoService.create(this.newTodoText).subscribe((result) => { + this.todoItems = this.todoItems.concat(result); + this.newTodoText = null; + }); + } + + delete(id: string): void { + this.todoService.delete(id).subscribe(() => { + this.todoItems = this.todoItems.filter(item => item.id !== id); + this.toasterService.info('Deleted the todo item.'); + }); + } +} + +```` + +我们已经使用 `todoService` 来获取todo项目的列表,并将返回值分配给 `todoItems` 数组。我们还添加了 `create`和 `delete` 方法。这些方法将在视图端使用。 + +### home.component.html + +打开 `/angular/src/app/home/home.component.html` 文件,并用以下代码块替换其内容: + +````html +
    +
    +
    +
    TODO LIST
    +
    +
    + +
    + + +
    + + +
      +
    • + {%{{{ todoItem.text }}}%} +
    • +
    +
    +
    +
    +```` + +### home.component.scss + +最后的最后,打开 `/angular/src/app/home/home.component.scss` 文件,并用以下代码块替换其内容: + +````css +#TodoList{ + list-style: none; + margin: 0; + padding: 0; +} + +#TodoList li { + padding: 5px; + margin: 5px 0px; + border: 1px solid #cccccc; + background-color: #f5f5f5; +} + +#TodoList li i +{ + opacity: 0.5; +} + +#TodoList li i:hover +{ + opacity: 1; + color: #ff0000; + cursor: pointer; +} +```` + +这是todo页面的简单样式。我们相信你可以做得更好 :) + +现在,您可以再次运行应用程序以查看结果。 + +{{end}} + +## 总结 + +在本教程中,我们构建了一个非常简单的应用程序来抢先探究ABP框架的新特性。如果您想构建一个严肃的应用程序,请查看 [web application development tutorial web应用程序开发教程](../Part-1.md),其中涵盖了实际web应用程序开发的所有方面。 + +## 源代码 + +您可以找到完成的应用程序的源代码 [这里](https://github.com/abpframework/ abp-samples/tree/master/TodoApp)。 + +## 另请参见 + +* [Web Application Development Tutorial Web应用程序开发教程](../Part-1.md) From 7ab8168a7a7bbf9cda88d47614b31a09cefcc04a Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 26 Apr 2021 11:20:44 +0800 Subject: [PATCH 2/3] Update Index.md --- docs/zh-Hans/Tutorials/todo/Index.md | 180 +++++++++++++-------------- 1 file changed, 90 insertions(+), 90 deletions(-) diff --git a/docs/zh-Hans/Tutorials/todo/Index.md b/docs/zh-Hans/Tutorials/todo/Index.md index 58b0a8426f..48d615b683 100644 --- a/docs/zh-Hans/Tutorials/todo/Index.md +++ b/docs/zh-Hans/Tutorials/todo/Index.md @@ -8,14 +8,14 @@ } ```` -这是一个单独的部分,使用ABP框架构建简单todo应用程序的快速入门教程。这是一个最终应用的截图: +这是一个单独的部分,使用ABP框架构建简单todo应用程序的快速入门教程.这是一个最终应用的截图: ![todo-list](todo-list.png) -您可以从已完成的项目里找到源代码,[这里](https://github.com/abpframework/abp-samples/tree/master/TodoApp)。 +你可以从已完成的项目里找到源代码,[这里](https://github.com/abpframework/abp-samples/tree/master/TodoApp). ## 先决条件 -* 一个集成开发环境 (比如: [Visual Studio](https://visualstudio.microsoft.com/vs/)) 它需要支持 [.NET 5.0+](https://dotnet.microsoft.com/download/dotnet) 的开发. +* 一个集成开发环境 (比如: [Visual Studio](https://visualstudio.microsoft.com/vs/)) 它需要支持 [.NET 5.0+](https://dotnet.microsoft.com/download/dotnet) 的开发. {{if DB=="Mongo"}} @@ -31,13 +31,13 @@ ## 创建新的解决方案 -我们将使用[ABP CLI](../../CLI.md) 创建带有ABP框架的新解决方案。 您可以在命令行终端中运行以下命令来安装它: +我们将使用[ABP CLI](../../CLI.md) 创建带有ABP框架的新解决方案. 你可以在命令行终端中运行以下命令来安装它: ````bash dotnet tool install -g Volo.Abp.Cli ```` -然后创建一个空文件夹,打开命令行终端并以打开的文件夹为路径在终端中执行以下命令: +然后创建一个空文件夹,打开命令行终端并以打开的文件夹为路径在终端中执行以下命令: ````bash abp new TodoApp{{if UI=="Blazor"}} -u blazor{{else if UI=="BlazorServer"}} -u blazor-server{{else if UI=="NG"}} -u angular{{end}}{{if DB=="Mongo"}} -d mongodb{{end}} @@ -45,21 +45,21 @@ abp new TodoApp{{if UI=="Blazor"}} -u blazor{{else if UI=="BlazorServer"}} -u bl {{if UI=="NG"}} -这将创建一个名为*TodoApp*的新解决方案,其中包含`angular`和`aspnet core`文件夹。解决方案就绪后,在你的IDE中打开ASP.NET Core 解决方案。 +这将创建一个名为*TodoApp*的新解决方案,其中包含`angular`和`aspnet core`文件夹.解决方案就绪后,在你的IDE中打开ASP.NET Core 解决方案. {{else}} -这将创建一个名为*TodoApp*的新解决方案。解决方案准备好后,在您的IDE中打开它。 +这将创建一个名为*TodoApp*的新解决方案.解决方案准备好后,在你的IDE中打开它. {{end}} ### 创建数据库 -如果您使用的是visual studio,请右键单击`TodoApp.DbMigrator`项目,选择*设置为启动项目*,然后按*Ctrl+F5*运行它而不进行调试。它将创建初始数据库并播种初始数据。 +如果你使用的是visual studio,请右键单击`TodoApp.DbMigrator`项目,选择*设置为启动项目*,然后按*Ctrl+F5*运行它而不进行调试.它将创建初始数据库并播种初始数据. {{if DB=="EF"}} -> 由于*DbMigrator*添加初始迁移并重新编译项目,一些ide(例如Rider)在第一次运行时可能会出现问题。在这种情况下,请打开`.DbMigrator`项目文件夹中的命令行终端,然后执行`dotnet run`命令。 +> 由于*DbMigrator*添加初始迁移并重新编译项目,一些ide(例如Rider)在第一次运行时可能会出现问题.在这种情况下,请打开`.DbMigrator`项目文件夹中的命令行终端,然后执行`dotnet run`命令. {{end}} @@ -67,60 +67,60 @@ abp new TodoApp{{if UI=="Blazor"}} -u blazor{{else if UI=="BlazorServer"}} -u bl {{if UI=="MVC" || UI=="BlazorServer"}} -最好在开始开发之前运行一下应用程序。确保 {{if UI=="BlazorServer"}}`TodoApp.Blazor`{{else}}`TodoApp.Web`{{end}} 是启动项目,然后运行应用程序(Visual Studio中是Ctrl+F5)以查看查看初始UI: +最好在开始开发之前运行一下应用程序.确保 {{if UI=="BlazorServer"}}`TodoApp.Blazor`{{else}}`TodoApp.Web`{{end}} 是启动项目,然后运行应用程序(Visual Studio中是Ctrl+F5)以查看查看初始UI: {{else if UI=="Blazor"}} -最好在开始开发之前运行一下应用程序。该解决方案有两个主要应用: +最好在开始开发之前运行一下应用程序.该解决方案有两个主要应用: -* `TodoApp.HttpApi.Host` 托管服务器端的 HTTP API。 +* `TodoApp.HttpApi.Host` 托管服务器端的 HTTP API. * `TodoApp.Blazor` 客户端托管的 Blazor WebAssembly 应用. -确保 `TodoApp.HttpApi.Host` 是启动项目,然后运行应用程序(Visual Studio中的Ctrl+F5)以查看[Swagger UI](https://swagger.io/tools/swagger-ui/)上server-side 的 HTTP API: +确保 `TodoApp.HttpApi.Host` 是启动项目,然后运行应用程序(Visual Studio中的Ctrl+F5)以查看[Swagger UI](https://swagger.io/tools/swagger-ui/)上server-side 的 HTTP API: ![todo-swagger-ui-initial](todo-swagger-ui-initial.png) -您可以使用此UI查看和测试您的HTTP API。现在,我们可以将 `TodoApp.Blazor` 设置为启动项目,并运行它来打开实际的Blazor应用程序UI: +你可以使用此UI查看和测试你的HTTP API.现在,我们可以将 `TodoApp.Blazor` 设置为启动项目,并运行它来打开实际的Blazor应用程序UI: {{else if UI=="NG"}} -最好在开始开发之前运行应用程序。该解决方案有两个主要应用: +最好在开始开发之前运行应用程序.该解决方案有两个主要应用: -* `TodoApp.HttpApi.Host` (在.NET解决方案中)承载服务器端HTTP API。 -* `angular` 文件夹包含 Angular 应用程序。 +* `TodoApp.HttpApi.Host` (在.NET解决方案中)承载服务器端HTTP API. +* `angular` 文件夹包含 Angular 应用程序. -确保`TodoApp.HttpApi.Host`project是启动项目,然后运行应用程序(visual studio中是Ctrl+F5)以查看[Swagger UI](https://swagger.io/tools/swagger-ui/)上server-side HTTP API: +确保`TodoApp.HttpApi.Host`project是启动项目,然后运行应用程序(visual studio中是Ctrl+F5)以查看[Swagger UI](https://swagger.io/tools/swagger-ui/)上server-side HTTP API: ![todo-swagger-ui-initial](todo-swagger-ui-initial.png) -您可以使用这个UI查看和测试您的HTTP API。如果可以的话,我们可以运行Angular客户端应用程序。 +你可以使用这个UI查看和测试你的HTTP API.如果可以的话,我们可以运行Angular客户端应用程序. -首先,运行以下命令来还原NPM包: +首先,运行以下命令来还原NPM包: ````bash npm install ```` -安装所有软件包需要一些时间。然后可以使用以下命令运行应用程序: +安装所有软件包需要一些时间.然后可以使用以下命令运行应用程序: ````bash npm start ```` -此命令需要一点时间,但最终会在默认浏览器中运行并打开应用程序: +此命令需要一点时间,但最终会在默认浏览器中运行并打开应用程序: {{end}} ![todo-ui-initial](todo-ui-initial.png) -您可以单击 *登录* 按钮,以`admin`作为用户名,`1q2w3E*` 作为密码登录到应用程序。 +你可以单击 *登录* 按钮,以`admin`作为用户名,`1q2w3E*` 作为密码登录到应用程序. -一切就绪。我们可以开始编码了! +一切就绪.我们可以开始编码了! ## Domain Layer 领域层 此应用程序只有一个 [entity](../../Entities.md) and we are starting by creating it. Create a new `TodoItem` class inside the *TodoApp.Domain* project: -我们开始创建它。 在*TodoApp.Domain*项目中创建一个新的 `TodoItem` 类: +我们开始创建它. 在*TodoApp.Domain*项目中创建一个新的 `TodoItem` 类: ````csharp using System; using Volo.Abp.Domain.Entities; @@ -134,22 +134,22 @@ namespace TodoApp } ```` -`BasicAggregateRoot` 是创建根实体的最简单的基类之一,`Guid` 是这里实体的主键 (`Id`)。 +`BasicAggregateRoot` 是创建根实体的最简单的基类之一,`Guid` 是这里实体的主键 (`Id`). ## Database Integration 数据库集成 {{if DB=="EF"}} -下一步是设置 [Entity Framework Core](../../Entity-Framework-Core.md) 配置。 +下一步是设置 [Entity Framework Core](../../Entity-Framework-Core.md) 配置. ### Mapping Configuration 映射配置 -在 *TodoApp.EntityFrameworkCore* 项目的 `EntityFrameworkCore` 文件夹中打开 `TodoAppDbContext` 类,并向该类添加一个新的 `DbSet` 属性: +在 *TodoApp.EntityFrameworkCore* 项目的 `EntityFrameworkCore` 文件夹中打开 `TodoAppDbContext` 类,并向该类添加一个新的 `DbSet` 属性: ````csharp public DbSet TodoItems { get; set; } ```` -然后在同一文件夹中打开 `TodoAppDbContextModelCreatingExtensions` 类,并为 `TodoItem` 类添加映射配置,如下所示: +然后在同一文件夹中打开 `TodoAppDbContextModelCreatingExtensions` 类,并为 `TodoItem` 类添加映射配置,如下所示: ````csharp public static void ConfigureTodoApp(this ModelBuilder builder) @@ -163,32 +163,32 @@ public static void ConfigureTodoApp(this ModelBuilder builder) } ```` -我们已经将 `TodoItem` 实体映射到数据库中的 `TodoItems` 表。 +我们已经将 `TodoItem` 实体映射到数据库中的 `TodoItems` 表. ### Code First Migrations 代码优先迁移 -解决方案启动模版已经配置为使用Entity Framework Core [Code First 迁移](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations)。由于我们已经更改了数据库映射配置,因此我们应该创建一个新的迁移并将更改应用于数据库。 +解决方案启动模版已经配置为使用Entity Framework Core [Code First 迁移](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations).由于我们已经更改了数据库映射配置,因此我们应该创建一个新的迁移并将更改应用于数据库. -在 *TodoApp.EntityFrameworkCore.DbMigrations* 项目的目录中打开一个命令行终端,然后键入以下命令: +在 *TodoApp.EntityFrameworkCore.DbMigrations* 项目的目录中打开一个命令行终端,然后键入以下命令: ````bash dotnet ef migrations add Added_TodoItem ```` -这将向项目添加一个新的迁移类: +这将向项目添加一个新的迁移类: ![todo-efcore-migration](todo-efcore-migration.png) -您可以在同一命令行终端中使用以下命令将更改应用于数据库: +你可以在同一命令行终端中使用以下命令将更改应用于数据库: ````bash dotnet ef database update ```` -> 如果您使用的是Visual Studio,*则可能希望在包管理器控制台 (PMC)* 中使用 `Add-Migration Added_TodoItem` 和 `Update-Database` 命令。在这种情况下,请确保 {{if UI=="MVC"}}`TodoApp.Web`{{else if UI=="BlazorServer"}}`TodoApp.Blazor`{{else if UI=="Blazor" || UI=="NG"}}`TodoApp.HttpApi.Host`{{end}} 是启动项目,并且 `TodoApp.EntityFrameworkCore.DbMigrations` 是PMC中的 *默认项目*。 +> 如果你使用的是Visual Studio,*则可能希望在包管理器控制台 (PMC)* 中使用 `Add-Migration Added_TodoItem` 和 `Update-Database` 命令.在这种情况下,请确保 {{if UI=="MVC"}}`TodoApp.Web`{{else if UI=="BlazorServer"}}`TodoApp.Blazor`{{else if UI=="Blazor" || UI=="NG"}}`TodoApp.HttpApi.Host`{{end}} 是启动项目,并且 `TodoApp.EntityFrameworkCore.DbMigrations` 是PMC中的 *默认项目*. {{else if DB=="Mongo"}} -下一步是设置 [MongoDB](../MongoDB.md) 配置。在 *TodoApp.MongoDB* 项目的 `MongoDb` 文件夹中打开 `TodoAppMongoDbContext` 类,并进行以下更改; +下一步是设置 [MongoDB](../MongoDB.md) 配置.在 *TodoApp.MongoDB* 项目的 `MongoDb` 文件夹中打开 `TodoAppMongoDbContext` 类,并进行以下更改; 1. 向类添加新属性: ````csharp @@ -206,11 +206,11 @@ modelBuilder.Entity(b => {{end}} -现在,我们可以使用ABP仓储来保存和检索todo列表项了,就像我们将在下一节中做的那样。 +现在,我们可以使用ABP仓储来保存和检索todo列表项了,就像我们将在下一节中做的那样. ## Application Layer 应用层 -[Application Service应用服务](../../Application-Services.md) 用于执行应用程序的用例。我们需要执行以下用例; +[Application Service应用服务](../../Application-Services.md) 用于执行应用程序的用例.我们需要执行以下用例; * 获取待办事项列表 * 创建新的todo项 @@ -218,7 +218,7 @@ modelBuilder.Entity(b => ### Application Service Interface 应用服务接口 -我们可以从为应用程序服务定义一个接口开始。在 *TodoApp.Application.Contracts* 项目中创建一个新的 `ITodoAppService` 接口,如下所示: +我们可以从为应用程序服务定义一个接口开始.在 *TodoApp.Application.Contracts* 项目中创建一个新的 `ITodoAppService` 接口,如下所示: ````csharp using System; @@ -254,11 +254,11 @@ namespace TodoApp } ```` -这是一个非常简单的DTO类,与我们的 `TodoItem` 实体匹配。我们接下来实现 `ITodoAppService` 接口。 +这是一个非常简单的DTO类,与我们的 `TodoItem` 实体匹配.我们接下来实现 `ITodoAppService` 接口. ### Application Service Implementation 应用服务实现 -在 *TodoApp.Application* 项目内部创建一个 `TodoAppService` 类,如下所示: +在 *TodoApp.Application* 项目内部创建一个 `TodoAppService` 类,如下所示: ````csharp using System; @@ -284,7 +284,7 @@ namespace TodoApp } ```` -该类继承自ABP框架的 `ApplicationService` 类,并实现之前定义的 `ITodoAppService`接口。ABP为实体提供默认的通用 [repositories存储库](../repositories.md)。我们可以使用它们来执行基本的数据库操作。此类 [injects 注入](../Dependency-Injection.md) `IRepository` 是 `TodoItem` 实体的默认存储库。我们将使用它来实现之前描述的用例。 +该类继承自ABP框架的 `ApplicationService` 类,并实现之前定义的 `ITodoAppService`接口.ABP为实体提供默认的通用 [repositories存储库](../repositories.md).我们可以使用它们来执行基本的数据库操作.此类 [injects 注入](../Dependency-Injection.md) `IRepository` 是 `TodoItem` 实体的默认存储库.我们将使用它来实现之前描述的用例. #### 获取所有Todo项列表 @@ -303,11 +303,11 @@ public async Task> GetListAsync() } ```` -我们只是简单的从数据库中获取完整的 `TodoItem` 列表,将它们映射到 `TodoItemDto` 对象并作为结果返回。 +我们只是简单的从数据库中获取完整的 `TodoItem` 列表,将它们映射到 `TodoItemDto` 对象并作为结果返回. #### 创建一个新的Todo项 -下一个方法是 `CreateAsync`,我们可以像如下所示来实现: +下一个方法是 `CreateAsync`,我们可以像如下所示来实现: ````csharp public async Task CreateAsync(string text) @@ -324,11 +324,11 @@ public async Task CreateAsync(string text) } ```` -Repository的 `InsertAsync` 方法将给定的 `TodoItem` 插入数据库,并返回相同的 `TodoItem` 对象。它还设置 `Id`,因此我们可以在返回对象上使用它。我们只是通过从新的 `TodoItem` 实体创建返回 `TodoItemDto`。 +Repository的 `InsertAsync` 方法将给定的 `TodoItem` 插入数据库,并返回相同的 `TodoItem` 对象.它还设置 `Id`,因此我们可以在返回对象上使用它.我们只是通过从新的 `TodoItem` 实体创建返回 `TodoItemDto`. #### 删除一个子项 -最后,我们可以将 `DeleteAsync` 实现为以下代码块: +最后,我们可以将 `DeleteAsync` 实现为以下代码块: ````csharp public async Task DeleteAsync(Guid id) @@ -337,21 +337,21 @@ public async Task DeleteAsync(Guid id) } ```` -应用程序服务已准备好从UI层使用。 +应用程序服务已准备好从UI层使用. ## User Interface Layer 用户界面层 -是时候在UI上显示待办事项了!在开始编写代码之前,最好记住我们正在尝试构建的内容。这是最终UI的示例屏幕截图: +是时候在UI上显示待办事项了!在开始编写代码之前,最好记住我们正在尝试构建的内容.这是最终UI的示例屏幕截图: ![todo-list](todo-list.png) -> **我们将在本教程中保持最简洁轻量的UI端,以使本教程简单且重点突出。请参阅[web应用程序开发教程](../Part-1.md) 以构建包含各个方面的真实页面。** +> **我们将在本教程中保持最简洁轻量的UI端,以使本教程简单且重点突出.请参阅[web应用程序开发教程](../Part-1.md) 以构建包含各个方面的真实页面.** {{if UI=="MVC"}} ### Index.cshtml.cs -在 *TodoApp.Web* 项目的 `Pages` 文件夹中打开 `Index.cshtml.cs` 文件,并用以下代码块替换它的默认内容: +在 *TodoApp.Web* 项目的 `Pages` 文件夹中打开 `Index.cshtml.cs` 文件,并用以下代码块替换它的默认内容: ````csharp using System.Collections.Generic; @@ -378,11 +378,11 @@ namespace TodoApp.Web.Pages } ```` -此类使用 `ITodoAppService` 获取todo项目列表并分配 `TodoItems` 属性。我们将用它来渲染razor页面上的待办事项。 +此类使用 `ITodoAppService` 获取todo项目列表并分配 `TodoItems` 属性.我们将用它来渲染razor页面上的待办事项. ### Index.cshtml -在 *TodoApp.Web* 项目的 `Pages` 文件夹中打开 `Index.cshtml` 文件,并替换为以下内容: +在 *TodoApp.Web* 项目的 `Pages` 文件夹中打开 `Index.cshtml` 文件,并替换为以下内容: ````xml @page @@ -424,13 +424,13 @@ namespace TodoApp.Web.Pages ```` -我们使用ABP的 [card tag helper 卡片标签助手](../UI/AspNetCore/标签助手/Cards.md) 创建一个简单的卡片视图。您可以直接使用标准的bootstrap HTML,不过ABP的 [tag helpers 标签助手]() 使它更容易并且类型安全。 +我们使用ABP的 [card tag helper 卡片标签助手](../UI/AspNetCore/标签助手/Cards.md) 创建一个简单的卡片视图.你可以直接使用标准的bootstrap HTML,不过ABP的 [tag helpers 标签助手]() 使它更容易并且类型安全. -这个页面要导入一个CSS和一个JavaScript文件,所以我们也应该创建它们。 +这个页面要导入一个CSS和一个JavaScript文件,所以我们也应该创建它们. ### Index.js -在 *TodoApp.Web* 项目的 `Pages` 文件夹中打开 `Index.js` 文件,并替换为以下内容: +在 *TodoApp.Web* 项目的 `Pages` 文件夹中打开 `Index.js` 文件,并替换为以下内容: ````js $(function () { @@ -461,15 +461,15 @@ $(function () { }); ```` -在第一部分中,我们在todo项目附近注册点击垃圾图标的事件,删除服务器上的相关项目并在UI上显示通知。另外,我们从DOM中删除已删除的项目,因此我们不需要刷新页面。 +在第一部分中,我们在todo项目附近注册点击垃圾图标的事件,删除服务器上的相关项目并在UI上显示通知.另外,我们从DOM中删除已删除的项目,因此我们不需要刷新页面. -在第二部分中,我们在服务器上创建一个新的todo事项。如果成功,我们将操纵DOM以将新的 `
  • ` 元素插入todo列表。这样,创建新的todo条目后就不用刷新整个页面了。 +在第二部分中,我们在服务器上创建一个新的todo事项.如果成功,我们将操纵DOM以将新的 `
  • ` 元素插入todo列表.这样,创建新的todo条目后就不用刷新整个页面了. -这里有趣的部分是我们如何与服务器通信。请参阅 *Dynamic JavaScript Proxies & Auto API Controllers 动态JavaScript代理和自动API控制器* 部分,以了解其工作原理。但是现在让我们继续并完成申请。 +这里有趣的部分是我们如何与服务器通信.请参阅 *Dynamic JavaScript Proxies & Auto API Controllers 动态JavaScript代理和自动API控制器* 部分,以了解其工作原理.但是现在让我们继续并完成申请. ### Index.css -最后要做的,请打开 *TodoApp.Web* 项目的 `Pages` 文件夹中的 `Index.css` 文件,并替换为以下内容: +最后要做的,请打开 *TodoApp.Web* 项目的 `Pages` 文件夹中的 `Index.css` 文件,并替换为以下内容: ````css #TodoList{ @@ -498,17 +498,17 @@ $(function () { } ```` -这是todo页面的简单样式。我们相信你可以做得更好 :) +这是todo页面的简单样式.我们相信你可以做得更好 :) -现在,您可以再次运行应用程序以查看结果。 +现在,你可以再次运行应用程序以查看结果. ### Dynamic JavaScript Proxies & Auto API Controllers 动态JavaScript代理和自动应用编程接口控制器 -在 `Index.js` 文件中,我们使用了 `todoApp.todo.delete(...)` 和 `todoApp.todo.create(...)` 函数与服务器通信。这些函数是由ABP框架动态创建的,这要归功于 [Dynamic JavaScript Client Proxy 动态JavaScript客户端代理](../UI/AspNetCore/Dynamic-JavaScript-Proxies.md) 系统。他们对服务器执行HTTP API调用并返回承诺,因此您可以像上面所做的那样注册对 `then` 函数的回调。 +在 `Index.js` 文件中,我们使用了 `todoApp.todo.delete(...)` 和 `todoApp.todo.create(...)` 函数与服务器通信.这些函数是由ABP框架动态创建的,这要归功于 [Dynamic JavaScript Client Proxy 动态JavaScript客户端代理](../UI/AspNetCore/Dynamic-JavaScript-Proxies.md) 系统.他们对服务器执行HTTP API调用并返回承诺,因此你可以像上面所做的那样注册对 `then` 函数的回调. -但是,您可能会问我们还没有创建任何API控制器,那么服务器如何处理这些请求?这个问题给我们带来了ABP框架的 [Auto API Controller 自动API控制器](../API/Auto-API-Controllers.md) 功能。它通过约定自动将应用程序服务转换为API Controllers(API控制器)。 +但是,你可能会问我们还没有创建任何API控制器,那么服务器如何处理这些请求?这个问题给我们带来了ABP框架的 [Auto API Controller 自动API控制器](../API/Auto-API-Controllers.md) 功能.它通过约定自动将应用程序服务转换为API Controllers(API控制器). -如果通过在应用程序中输入 `/swagger` URL来打开 [swagger UI](https://swagger.io/tools/ Swagger-ui/),则可以看到Todo API: +如果通过在应用程序中输入 `/swagger` URL来打开 [swagger UI](https://swagger.io/tools/ Swagger-ui/),则可以看到Todo API: ![todo-api](todo-api.png) @@ -516,7 +516,7 @@ $(function () { ### Index.razor.cs -在 *TodoApp.Blazor* 项目的 `Pages` 文件夹中打开 `Index.razor.cs` 文件,并用以下代码块替换内容: +在 *TodoApp.Blazor* 项目的 `Pages` 文件夹中打开 `Index.razor.cs` 文件,并用以下代码块替换内容: ````csharp using Microsoft.AspNetCore.Components; @@ -555,17 +555,17 @@ namespace TodoApp.Blazor.Pages } ```` -这个类使用 `ITodoAppService` 对todo项执行操作。它在创建和删除操作后操纵 `TodoItems` 列表。这样,我们不需要从服务器刷新整个todo列表。 +这个类使用 `ITodoAppService` 对todo项执行操作.它在创建和删除操作后操纵 `TodoItems` 列表.这样,我们不需要从服务器刷新整个todo列表. {{if UI=="Blazor"}} -请参阅下面的 *Dynamic C# Proxies & Auto API Controllers 动态C # 代理和自动API控制器* 部分,以了解如何从浏览器上运行的Blazor应用程序注入和使用应用程序服务接口!但是现在,让我们继续并完成这个应用。 +请参阅下面的 *Dynamic C# Proxies & Auto API Controllers 动态C # 代理和自动API控制器* 部分,以了解如何从浏览器上运行的Blazor应用程序注入和使用应用程序服务接口!但是现在,让我们继续并完成这个应用. {{end # Blazor}} ### Index.razor -在 *TodoApp.Blazor* 项目的 `Pages` 文件夹中打开 `Index.razor` 文件,并用以下代码块替换内容: +在 *TodoApp.Blazor* 项目的 `Pages` 文件夹中打开 `Index.razor` 文件,并用以下代码块替换内容: ````xml @page "/" @@ -608,7 +608,7 @@ namespace TodoApp.Blazor.Pages ### Index.razor.css -最后,请在 *TodoApp.Web* 项目的 `Pages` 文件夹中打开 `Index.razor.css` 文件,并替换为以下内容: +最后,请在 *TodoApp.Web* 项目的 `Pages` 文件夹中打开 `Index.razor.css` 文件,并替换为以下内容: ````css #TodoList{ @@ -637,21 +637,21 @@ namespace TodoApp.Blazor.Pages } ```` -这是todo页面的简单样式。我们相信你可以做得更好 :) +这是todo页面的简单样式.我们相信你可以做得更好 :) -现在,您可以再次运行应用程序以查看结果。 +现在,你可以再次运行应用程序以查看结果. {{if UI=="Blazor"}} ### Dynamic C# Proxies & Auto API Controllers 动态C#代理和自动应用编程接口控制器 -在 `Index.razor.cs` 文件中,我们已经注入 (使用 `[Inject]` 特性),并像使用本地服务一样使用 `ITodoAppService`。请记住,当此应用程序服务的实现在服务器上运行时,Blazor应用程序正在浏览器上运行。 +在 `Index.razor.cs` 文件中,我们已经注入 (使用 `[Inject]` 特性),并像使用本地服务一样使用 `ITodoAppService`.请记住,当此应用程序服务的实现在服务器上运行时,Blazor应用程序正在浏览器上运行. -这个神奇的过程是由ABP框架的 [Dynamic C# Client Proxy 动态C#客户端代理](../API/Dynamic-CSharp-API-Clients.md) 系统完成的。它使用标准的 `HttpClient` 并向远程服务器执行HTTP API请求。它还为我们处理所有标准任务,包括授权,JSON序列化和异常处理。 +这个神奇的过程是由ABP框架的 [Dynamic C# Client Proxy 动态C#客户端代理](../API/Dynamic-CSharp-API-Clients.md) 系统完成的.它使用标准的 `HttpClient` 并向远程服务器执行HTTP API请求.它还为我们处理所有标准任务,包括授权,JSON序列化和异常处理. -但是,您可能会问我们还没有创建任何API控制器,那么服务器如何处理这些请求?这个问题给我们带来了ABP框架的 [Auto API Controller 自动API控制器](../API/Auto-API-Controllers.md) 功能。它通过约定自动将应用程序服务转换为API控制器。 +但是,你可能会问我们还没有创建任何API控制器,那么服务器如何处理这些请求?这个问题给我们带来了ABP框架的 [Auto API Controller 自动API控制器](../API/Auto-API-Controllers.md) 功能.它通过约定自动将应用程序服务转换为API控制器. -如果你运行 `TodoApp.HttpApi.Host` 应用程序,你可以看到Todo API: +如果你运行 `TodoApp.HttpApi.Host` 应用程序,你可以看到Todo API: ![todo-api](todo-api.png) @@ -661,20 +661,20 @@ namespace TodoApp.Blazor.Pages ### Service Proxy Generation 服务代理生成 -ABP提供了一个方便的功能,可以自动创建客户端服务,轻松使用服务器提供的HTTP APIs。 +ABP提供了一个方便的功能,可以自动创建客户端服务,轻松使用服务器提供的HTTP APIs. -您首先需要运行 `TodoApp.HttpApi.Host` 项目,因为代理生成器从服务器应用程序读取API定义。 +你首先需要运行 `TodoApp.HttpApi.Host` 项目,因为代理生成器从服务器应用程序读取API定义. -> **请注意**: IIS Express有问题; 它不允许从另一个进程连接到应用程序。如果您使用的是Visual Studio,请在 “运行” 按钮下拉列表中选择 `TodoApp.HttpApi.Host` 而不是IIS Express,如下图所示: +> **请注意**: IIS Express有问题; 它不允许从另一个进程连接到应用程序.如果你使用的是Visual Studio,请在 “运行” 按钮下拉列表中选择 `TodoApp.HttpApi.Host` 而不是IIS Express,如下图所示: ![run-without-iisexpress](run-without-iisexpress.png) -运行 `TodoApp.HttpApi.Host` 项目后,在 `angular` 文件夹中打开命令行终端,然后键入以下命令: +运行 `TodoApp.HttpApi.Host` 项目后,在 `angular` 文件夹中打开命令行终端,然后键入以下命令: ````bash abp generate-proxy ```` -如果一切顺利,应该生成如下所示的输出: +如果一切顺利,应该生成如下所示的输出: ````bash CREATE src/app/proxy/generate-proxy.json (170978 bytes) @@ -684,11 +684,11 @@ CREATE src/app/proxy/models.ts (66 bytes) CREATE src/app/proxy/index.ts (58 bytes) ```` -然后,我们可以使用 `todoService` 来使用服务器端HTTP APIs,就像我们将在下一节中做的那样。 +然后,我们可以使用 `todoService` 来使用服务器端HTTP APIs,就像我们将在下一节中做的那样. ### home.component.ts -打开 `/angular/src/app/home/home.component.ts` 文件,并用以下代码块替换其内容: +打开 `/angular/src/app/home/home.component.ts` 文件,并用以下代码块替换其内容: ````js import { ToasterService } from '@abp/ng.theme.shared'; @@ -733,11 +733,11 @@ export class HomeComponent implements OnInit { ```` -我们已经使用 `todoService` 来获取todo项目的列表,并将返回值分配给 `todoItems` 数组。我们还添加了 `create`和 `delete` 方法。这些方法将在视图端使用。 +我们已经使用 `todoService` 来获取todo项目的列表,并将返回值分配给 `todoItems` 数组.我们还添加了 `create`和 `delete` 方法.这些方法将在视图端使用. ### home.component.html -打开 `/angular/src/app/home/home.component.html` 文件,并用以下代码块替换其内容: +打开 `/angular/src/app/home/home.component.html` 文件,并用以下代码块替换其内容: ````html
    @@ -771,7 +771,7 @@ export class HomeComponent implements OnInit { ### home.component.scss -最后的最后,打开 `/angular/src/app/home/home.component.scss` 文件,并用以下代码块替换其内容: +最后的最后,打开 `/angular/src/app/home/home.component.scss` 文件,并用以下代码块替换其内容: ````css #TodoList{ @@ -800,20 +800,20 @@ export class HomeComponent implements OnInit { } ```` -这是todo页面的简单样式。我们相信你可以做得更好 :) +这是todo页面的简单样式.我们相信你可以做得更好 :) -现在,您可以再次运行应用程序以查看结果。 +现在,你可以再次运行应用程序以查看结果. {{end}} ## 总结 -在本教程中,我们构建了一个非常简单的应用程序来抢先探究ABP框架的新特性。如果您想构建一个严肃的应用程序,请查看 [web application development tutorial web应用程序开发教程](../Part-1.md),其中涵盖了实际web应用程序开发的所有方面。 +在本教程中,我们构建了一个非常简单的应用程序来抢先探究ABP框架的新特性.如果你想构建一个现实的应用程序,请查看 [应用程序开发教程](../Part-1.md),其中涵盖了实际web应用程序开发的所有方面. ## 源代码 -您可以找到完成的应用程序的源代码 [这里](https://github.com/abpframework/ abp-samples/tree/master/TodoApp)。 +你可以找到完成的应用程序的源代码 [这里](https://github.com/abpframework/abp-samples/tree/master/TodoApp). ## 另请参见 -* [Web Application Development Tutorial Web应用程序开发教程](../Part-1.md) +* [Web应用程序开发教程](../Part-1.md) From df61d3a4cec2ef8f246ed485205704c2f24cdfff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E9=A3=8E?= <46520648+hrx521@users.noreply.github.com> Date: Mon, 26 Apr 2021 13:33:33 +0800 Subject: [PATCH 3/3] Add files via upload --- .../Tutorials/todo/run-without-iisexpress.png | Bin 0 -> 23261 bytes docs/zh-Hans/Tutorials/todo/todo-api.png | Bin 0 -> 11114 bytes .../Tutorials/todo/todo-efcore-migration.png | Bin 0 -> 9490 bytes docs/zh-Hans/Tutorials/todo/todo-list.png | Bin 0 -> 13433 bytes .../Tutorials/todo/todo-swagger-ui-initial.png | Bin 0 -> 16231 bytes docs/zh-Hans/Tutorials/todo/todo-ui-initial.png | Bin 0 -> 29191 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/zh-Hans/Tutorials/todo/run-without-iisexpress.png create mode 100644 docs/zh-Hans/Tutorials/todo/todo-api.png create mode 100644 docs/zh-Hans/Tutorials/todo/todo-efcore-migration.png create mode 100644 docs/zh-Hans/Tutorials/todo/todo-list.png create mode 100644 docs/zh-Hans/Tutorials/todo/todo-swagger-ui-initial.png create mode 100644 docs/zh-Hans/Tutorials/todo/todo-ui-initial.png diff --git a/docs/zh-Hans/Tutorials/todo/run-without-iisexpress.png b/docs/zh-Hans/Tutorials/todo/run-without-iisexpress.png new file mode 100644 index 0000000000000000000000000000000000000000..41898e6c003090de4dcb8ac001bf03fdacee2c17 GIT binary patch literal 23261 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 A+5i9m literal 0 HcmV?d00001 diff --git a/docs/zh-Hans/Tutorials/todo/todo-api.png b/docs/zh-Hans/Tutorials/todo/todo-api.png new file mode 100644 index 0000000000000000000000000000000000000000..f9a25f57b56d8191bb90b1aa676f086b88430d08 GIT binary patch literal 11114 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 OLPb#nS|V@u{yzY2=I+G+ literal 0 HcmV?d00001 diff --git a/docs/zh-Hans/Tutorials/todo/todo-efcore-migration.png b/docs/zh-Hans/Tutorials/todo/todo-efcore-migration.png new file mode 100644 index 0000000000000000000000000000000000000000..df370aebcf44b25ad02ab77df496cc6790690f72 GIT binary patch literal 9490 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 L8Cv?6$@~8S2+WpW literal 0 HcmV?d00001 diff --git a/docs/zh-Hans/Tutorials/todo/todo-swagger-ui-initial.png b/docs/zh-Hans/Tutorials/todo/todo-swagger-ui-initial.png new file mode 100644 index 0000000000000000000000000000000000000000..1d3ed405c79b81f6459958608a731ae680be3c2b GIT binary patch literal 16231 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

    mJ+7wNy5hF0jG-huOZ zKl!lOesJE5yV%i}qDZyMt!z;|x+b8z3B}`z#jW2;0}qZ=apr{ZTFg)-Ca#Y7wbz4)dyqL9Bpm9BbhN47`9T@(8xV!lY!ho%r2La?Egwd^HJ72K1F?dHDFrao@RTe>@Cj zt>Xs{%BL6O%gG~ijr3;(Kk`4@JV(J3z#?qY7xEWAK{cZMREB}_X>*krkURKdM(E;S z-LFqC#F6+93W@~Yf4?GcLY_}v6#uIjCV}@4F+#x;|MNet{om6Fa;!x~`9aKk3d8O# zmyCFX|Mt6guKfa{H}L#9@p#z3%W6ANqNE{2f}-^d35Ahp2%({9aS{3UzXixcw$RyVg`lSxZ zfKeK;iQ7D{EGQjiCrrI;IYP0;_+N*(9$To}o2~_y2J+{W=PQu(yZFNvlS<#IA7Trh zIQj*@UaFza%0LJZ`}}s$8?`nxlnmS*z%#Au$M_pA+Bvx|CYezNSudy_)<~Cuu(-)s zPcVpn{8_tafB_-OJDMEQoiZqoL|k^kEZ3b^jCWIvJUQR^orIwhzuD=^v-vGRVyg%Q4DPWwXIDcPQ$gVB9fB7@R4 z1G|J74^Mt?3#ZiHYAW}zA(O!#o*FM`;~%qfghQaql3{O&ez>AR=~4ETT*eIWGFxL$ zmTdFthibAjc&8@Oh@mO6kgcnz@1TC_y~E7bl)a*wOZZZKQPscZAhh+uiQ_~9Ocdb? zq!RszB4u9-F<||v#ZfVQT-VN%KVlND)G9M*|B_yU6 z#dUJh8^dsr3ucH!9@`f-g47nPb{cP35o<{!EPPdZ zyDRfSUxuCr@hGl^3$Q+VcQ|+rlo>Rnk(GKq z(Z1%1H1+!S&~}%)Z;r@|7Ikc?URrOi%{T%~#7fo0Lq5FK*@Mnmb@H4Mkwur zK_!NZ@)KF9!$?6}r>sBarw-u{01EP<|9|~}?SS0AN2bB(K2BwVktUj!>OZ@+397W2 zId4KOr9+BtCT>!D=5h{nGJ)wLIM_6=jMDyEE3udJM=i_NG{cAE$E4QVeuT`oe>Tr2 zMh3d>jnf>reO^hj8vXC>Ts-la;Xq>K2Vva*z0L^f6Og0)*8%={!Zlm2taAE=`Jc)r NGLniC<)4lG|1SoFqM!f( literal 0 HcmV?d00001