ABP-Book Store Application中文讲解 - Part 2: The Book List Page

本章用于介绍如何创建Book List Page。

 TBD

1. 汇总

ABP-Book Store Application中文讲解-汇总-CSDN博客

2. 前一章 

ABP-Book Store Application中文讲解 - Part 1: Creating the Server Side

项目之间的引用关系。

目录

1. 多语言配置 

1.1 zh-Hans.json 

1.2 en.json

2. 添加proxy

2.1 前置条件

2.2 利用abp自动生成angular端的service

3. 创建Books页面

3.1 利用ng generate生成页面组件

3.2 在route.provider.ts中配置菜单

3.2 添加页面内容到BookComponent

3.2.1 book.component.ts 

3.2.1.1 非standalone模式

3.2.1.2 standalone 模式 (推荐此模式)

 3.2.2 book.component.html

4.启动项目

5. Angular推荐使用全独立模式避免NgModule的干扰

 6. 继续学习


1. 多语言配置 

在开始做UI的开发前,我们需要对UI端的一些信息做多语言处理。Localization\BookStore里面有很多json文件。

zh-Hans.json简体中文

zh-Hant.json繁体中文

en.json English

此处根据自己需要自行添加。不用的语言可以自行删除。

需要注意的是要保证你所更改的json文件里面的key一一对应。

1.1 zh-Hans.json 

{"culture": "zh-Hans","texts": {"AppName": "BookStore","Menu:Home": "首页","Welcome": "欢迎","LongWelcomeMessage": "欢迎使用本应用程序。这是一个基于 ABP 框架的启动项目。更多信息,请访问 abp.io。",// 以下内容是新增内容"Menu:BookStore": "Book Store","Menu:Books": "Books","Actions": "操作","Close": "关闭","Delete": "删除","Edit": "编辑","PublishDate": "发布日期","NewBook": "新增书","Name": "名字","Type": "类型","Price": "价格","CreationTime": "新建日期","AreYouSure": "你确定吗?","AreYouSureToDelete": "你确定你要删除此条目吗?","Enum:BookType.0": "未定义","Enum:BookType.1": "冒险","Enum:BookType.2": "传记","Enum:BookType.3": "反乌托邦","Enum:BookType.4": "奇幻","Enum:BookType.5": "恐怖","Enum:BookType.6": "科学","Enum:BookType.7": "科幻","Enum:BookType.8": "诗歌"}
}

1.2 en.json

{"Culture": "en","Texts": {"Menu:Home": "Home","Welcome": "Welcome","LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP. For more information, visit abp.io.",// 以下内容是新增内容"Menu:BookStore": "Book Store","Menu:Books": "Books","Actions": "Actions","Close": "Close","Delete": "Delete","Edit": "Edit","PublishDate": "Publish date","NewBook": "New book","Name": "Name","Type": "Type","Price": "Price","CreationTime": "Creation time","AreYouSure": "Are you sure?","AreYouSureToDelete": "Are you sure you want to delete this item?","Enum:BookType.0": "Undefined","Enum:BookType.1": "Adventure","Enum:BookType.2": "Biography","Enum:BookType.3": "Dystopia","Enum:BookType.4": "Fantastic","Enum:BookType.5": "Horror","Enum:BookType.6": "Science","Enum:BookType.7": "Science fiction","Enum:BookType.8": "Poetry"}
}

2. 添加proxy

2.1 前置条件

打开cmd.exe,输入ng --version查看是否安装了@angular/cli,如果没安装,可通过以下命令安装。

npm install -g @angular/cli

利用abp的命令自动生成proxy。此时有个前置条件是abp的命令只能调用dotnet tool下的API启动方式,无法调用基于IIS Express启动下的API。

即需要将Acme.BookStore.HttpApi.Host启动模式选择Acme.BookStore.HttpApi.Host

 设置好后,点击F5启动程序。

2.2 利用abp自动生成angular端的service

vs code 打开angular目录,ctrl+`打开Terminal window, 然后输入一下命令敲回车。

3. 创建Books页面

此处UI组件用的是Ng Bootstrap, datatable组件用的是Ngx-Datatable.或者你可以使用PrimeNG - Angular UI Component Library

3.1 利用ng generate生成页面组件

此处利用ng命令去自动生成相关的ts文件。

ng generate module book --module app --routing --route books

以上代码创建book module和routing并指定route是books,并自动创建book相关的component,module和router,router会被自动添加到app-routing.module.ts中。

如果是你手动创建的component或者module,需要自己手动添加到app-routing.module.ts中。

loadChildren: () => import('./book/book.module').then(m => m.BookModule)这种方式是lazy-load的方式,只有在用户点击对应的页面的时候才会加载对应页面的js、css、html等。

3.2 在route.provider.ts中配置菜单

打开src/app/route.provider.ts,添加book-store 和books.

RoutesService是ABP用于配置主菜单和路径的,不是angualr原生。

  • path 访问此页面的URL
  • name 本地化菜单名字(localization document ).如果你不需要本地化,直接写死也可以的
  • iconClass 菜单图标 (你可以从Font Awesome 上面找到你需要的icons).
  • order 菜单的顺序.
  • layout BooksModule's routes布局方式 (提供了三种布局方式: eLayoutType.applicationeLayoutType.account or eLayoutType.empty).

后面我会单独针对ABP的前端UI-Angular UI写一系列的文章ABP User Interface-Angular UI中文详解-CSDN博客。

import { RoutesService, eLayoutType } from '@abp/ng.core';
import { APP_INITIALIZER } from '@angular/core';export const APP_ROUTE_PROVIDER = [{ provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true },
];function configureRoutes(routesService: RoutesService) {return () => {routesService.add([{path: '/',name: '::Menu:Home',iconClass: 'fas fa-home',order: 1,layout: eLayoutType.application,},{path: '/book-store',name: '::Menu:BookStore',iconClass: 'fas fa-book',order: 2,layout: eLayoutType.application,},{path: '/books',name: '::Menu:Books',// iconClass: 'fas fa-user',parentName: '::Menu:BookStore',order: 3,layout: eLayoutType.application,}]);};
}

3.2 添加页面内容到BookComponent

添加页面内容。

导入并注册BookService和ListService.

BookService是利用ng generate-proxy生成的服务

ListService是ABP团队创建的,提供了分页、排序和查询。ListService不是注册在root级别,他是component级别的,即component销毁后,当前页面的ListService会同步销毁。

具体可以在Working with Lists | ABP.IO Documentation中找到,后序我会在ABP User Interface-Angular UI中文详解-CSDN博客提供中文版本的使用说明。

3.2.1 book.component.ts 

3.2.1.1 非standalone模式
import { Component, OnInit } from '@angular/core';
import { ListService, PagedResultDto } from '@abp/ng.core';  // Import ListService and PagedResultDto
import { BookService, BookDto } from '../proxy/books';  // Import your BookService and BookDto model
import { SharedModule } from '../shared/shared.module';@Component({selector: 'app-book',templateUrl: './book.component.html',styleUrl: './book.component.scss',standalone: false, // 标记为独立组件// imports: [SharedModule], // 导入需要的模块providers: [ListService]  // Provide ListService for this component
})
export class BookComponent implements OnInit {book = { items: [], totalCount: 0 } as PagedResultDto<BookDto>;  // Initialize books as an empty PagedResultDtoconstructor(private bookService: BookService, public readonly list: ListService) { }  // Inject BookService and ListServicengOnInit() {  // Use ngOnInit to fetch books when the component initializesthis.list.hookToQuery(this.bookService.getList).subscribe((response) => {  // Hook to the query and subscribe to the responsethis.book = response;  // Assign the response to books});}
}

还需要在book.module.ts声明BookComponent

import { NgModule } from '@angular/core';
// import { CommonModule } from '@angular/common';import { SharedModule } from '../shared/shared.module';
import { BookRoutingModule } from './book-routing.module';
import { BookComponent } from './book.component';@NgModule({declarations: [BookComponent],imports: [BookRoutingModule,SharedModule// shared module already export CommonModule, so we don't need to import it again.]
})
export class BookModule { }
3.2.1.2 standalone 模式 (推荐此模式)

如果使用的是Angualr 14+, 则需要改成如下所示:

import { Component, OnInit } from '@angular/core';
import { ListService, PagedResultDto } from '@abp/ng.core';  // Import ListService and PagedResultDto
import { BookService, BookDto } from '../proxy/books';  // Import your BookService and BookDto model
import { SharedModule } from '../shared/shared.module';@Component({selector: 'app-book',templateUrl: './book.component.html',styleUrl: './book.component.scss',standalone: true, // 标记为独立组件imports: [SharedModule], // standalone: true导入需要的模块providers: [ListService]  // Provide ListService for this component
})
export class BookComponent implements OnInit {book = { items: [], totalCount: 0 } as PagedResultDto<BookDto>;  // Initialize books as an empty PagedResultDtoconstructor(private bookService: BookService, public readonly list: ListService) { }  // Inject BookService and ListServicengOnInit() {  // Use ngOnInit to fetch books when the component initializesthis.list.hookToQuery(this.bookService.getList).subscribe((response) => {  // Hook to the query and subscribe to the responsethis.book = response;  // Assign the response to books});}
}

 book.module.ts移除BookComponent声明

import { NgModule } from '@angular/core';
import { SharedModule } from '../shared/shared.module';
import { BookRoutingModule } from './book-routing.module';@NgModule({declarations: [],imports: [BookRoutingModule,SharedModule// shared module already export CommonModule, so we don't need to import it again.]
})
export class BookModule { }

 3.2.2 book.component.html

Tips: 比如你想实现<div class="card"></div>, 此时你只需要输入div.card然后直接敲Tab,vs code可以帮你自动生成。

类似的输入h5.card-title敲Tab自动生成<h5 class="card-title"></h5>

4.启动项目

后端API需要先启动。

npm start重新编译后,浏览器会自动打开,然后左侧会显示Book Store菜单。

展开后选择Books,加载数据完成如下图所示:

5. Angular推荐使用全独立模式避免NgModule的干扰

// AppComponent.ts(独立根组件)
import { Component } from '@angular/core';
import { BookComponent } from './book/book.component';
import { BrowserModule } from '@angular/platform-browser'; // 若需导入模块,需在 imports 中声明@Component({selector: 'app-root',template: `<app-book></app-book>`,imports: [BrowserModule, BookComponent], // 导入依赖的模块和独立组件。类似把app.module.ts中的imports都放在此处standalone: true // 根组件标记为独立
})
export class AppComponent { }

 6. 继续学习

ABP-Book Store Application中文讲解 - Part 3: Creating, Updating and Deleting Books

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/80973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6、登录功能后端开发

6、登录功能后端开发 https://xiaoxueblog.com/ai/%E7%99%BB%E5%BD%95%E5%8A%9F%E8%83%BD%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91.html 1、新建用户表SQL脚本 -- CREATE DATABASE aicloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;-- 创建用户表 drop table if exi…

随机矩阵放大的方式 生成相位数据集,用于相位展开

import os import numpy as np import matplotlib.pyplot as plt from scipy.ndimage import zoom import gc from tqdm import tqdm from zernike import RZerndef wrap_phase(phase):"""将相位包裹到[-π, π]区间"""return np.angle(np.exp(1…

Java面试全记录:Spring Cloud+Kafka+Redis实战解析

Java面试全记录&#xff1a;Spring CloudKafkaRedis实战解析 人物设定 姓名&#xff1a;张伟&#xff08;随机生成唯一姓名&#xff09; 年龄&#xff1a;28岁 学历&#xff1a;硕士 工作年限&#xff1a;5年 工作内容&#xff1a; 基于Spring Cloud搭建微服务架构使用Kafka…

Java Socket编程完全指南:从基础到实战应用

Socket编程是构建网络应用的基石&#xff0c;Java通过java.net包提供了强大的Socket API。本文将深入解析Java Socket类的核心用法&#xff0c;涵盖TCP/UDP协议实现、多线程通信及性能优化技巧&#xff0c;助您快速掌握网络编程精髓。 一、Socket编程核心概念 1.1 网络通信模型…

vue实现导出echarts图片和table表格

安装依赖 "xlsx": "^0.18.5","xlsx-style": "^0.8.13""file-saver": "^2.0.5",工具类 toolUtil const autoHeight () > {let winHeight 0if (window.innerHeight) {winHeight window.innerHeight} else if…

AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月15日第78弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀6-8个和值&#xff0c;可以做到100-300注左右。 (1)定…

兰亭妙微B端UI设计:融合多元风格,点亮品牌魅力

在B端产品市场&#xff0c;独特的品牌形象是企业脱颖而出的关键。兰亭妙微专注于B端UI设计&#xff0c;通过融合多元风格&#xff0c;为企业点亮品牌魅力&#xff0c;助力品牌价值提升。 兰亭妙微主创团队源自清华&#xff0c;历经多年沉淀&#xff0c;积累了丰富的设计经验。…

MMTEA-DTS--用于多目标多任务优化的基于分解的迁移选择

MMTEA-DTS–用于多目标多任务优化的基于分解的迁移选择 title&#xff1a; Multiobjective Multitasking Optimization With Decomposition-Based Transfer Selection author&#xff1a; Qiuzhen Lin, Zhongjian Wu, Lijia Ma, Maoguo Gong , Jianqiang Li, and Carlos A. C…

Python机器学习笔记(二十三 模型评估与改进-网格搜索)

上一次学习了评估一个模型的泛化能力,现在继续学习通过调参来提升模型的泛化性能。scikit-learn中许多算法的参数设置,在尝试调参之前,重要的是要理解参数的含义。找到一个模型的重要参数(提供最佳泛化性能的参数)的取值是一项棘手的任务,但对于几乎所有模型和数据集来说…

集成DHTMLX 预订排期调度组件实践指南:如何实现后端数据格式转换

在企业级应用中&#xff0c;预订系统&#xff08;Booking System&#xff09;作为典型的调度类应用&#xff0c;广泛用于酒店、会议室、设备预约、医疗排班等业务场景。而DHTMLX Scheduler作为一款功能强大且高度可定制的 JavaScript 日程安排控件&#xff0c;已成为众多开发者…

35页AI应用PPT《DeepSeek如何赋能职场应用》DeepSeek本地化部署与应用案例合集

这份名为《DeepSeek如何赋能职场应用》的PPT文档详细介绍了DeepSeek这一人工智能工具在职场中的多样化应用场景和操作技巧。内容涵盖了从基础模型到深度思考模型的不同功能&#xff0c;以及如何通过提示语技巧实现高效的人机协作。文档还展示了DeepSeek在制作可视化图表、PPT、…

Axure疑难杂症:母版菜单设置打开链接后菜单选中效果

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:菜单打开链接后子菜单选中效果 主要内容:母版设计、选中效果 应用场景:页面赋值 案例展示: 案例视频:

1.1 认识编程与C++

认识编程与C教程 目标 理解程序、指令、数据的概念。了解C在现实中的应用场景。学会搭建编程环境&#xff0c;迈出第一步。 一、编程是什么&#xff1f;——给计算机写“魔法指令” 1. 基本概念 程序&#xff1a;一系列指令的集合&#xff0c;像一本“魔法食谱”。 &#x…

centos7部署mysql5.7

1.下载mysql的官方yum源 wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm2.安装yum源 yum -y install mysql57-community-release-el7-11.noarch.rpm3.安装秘钥文件 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-20224.安装mysql5.7…

javascript —— ! 和 !! 的区别与作用

javascript —— ! 和 !! 的区别与作用 在 JavaScript 里&#xff0c;! 和 !! 是两种不同的逻辑运算符&#xff0c;它们的功能和使用场景有明显区别。 1、 !&#xff08;逻辑非运算符&#xff09; 它的主要作用是 对操作数进行布尔值取反。具体来说&#xff0c;就是 先把操作…

基于互联网和LabVIEW的多通道数据采集系统仿真设计

标题:基于互联网和LabVIEW的多通道数据采集系统仿真设计 内容:1.摘要 在当今科技飞速发展的背景下&#xff0c;多通道数据采集在众多领域有着广泛需求。本研究的目的是设计一个基于互联网和LabVIEW的多通道数据采集系统仿真方案。采用互联网技术实现数据的远程传输与共享&…

前后端设置跨域并从后端允许发送cookie

在java后端创建config文件 package com.zf.demo.config;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigur…

【Java ee】关于抓包软件Fiddler Classic的安装与使用

Web Debugging Proxy Tool | Fiddler Classic 安装网站↑ 下载好安装包之后&#xff0c;双击一路next就可以了 一、抓包软件 电脑上安装了抓包软件之后&#xff0c;抓包软件就可以监听你的网卡上通过的数据。 本来是你的客户端通过网卡&#xff0c;把数据发给目标服务器&a…

【Java ee初阶】http(1)

HTTP 全称为“超文本传输协议”&#xff0c;由名字可知&#xff0c;这是一个基于文本格式的协议&#xff0c;而TCP&#xff0c;UDP&#xff0c;以太网&#xff0c;IP...都是基于二进制格式的协议。 如何区别该协议是基于哪种格式的协议&#xff1f; 形如这种协议格式&#xf…

登录接口中图片验证码Tesseract-OCR识别Java脚本

项目上移植了研发部的产品&#xff0c;文档不全&#xff0c;项目上验证码功能无法关闭&#xff0c;又要做接口/性能测试&#xff0c;开发不配合&#xff08;作为测试多么无奈&#xff09;&#xff0c;此方法识别命中率不高&#xff0c;仅作借鉴。 版本JDK11 import io.restass…