第1篇 初识MEAN
第1章 MEAN架构概述 2
1.1 MEAN架构核心技术栈的组成 2
| 1.1.1 MongoDB 2
| 1.1.2 Express 3
| 1.1.3 Angular 3
| 1.1.4 Node.js 3
1.2 MEAN架构周边技术栈的组成 4
| 1.2.1 NG.ZORRO 4
| 1.2.2 ngx.Markdown 4
| 1.2.3 NGINX 5
| 1.2.4 basic.auth 5
1.3 MEAN架构的优势 5
1.4 开发工具的选择 8
第2篇 Node.js——全栈开发平台
第2章 Node.js基础 10
2.1 Node.js简介 10
| 2.1.1 Node.js简史 10
| 2.1.2 为什么叫Node.js 12
2.2 Node.js的特点 13
2.3 安装Node.js 17
| 2.3.1 安装Node.js和NPM 17
| 2.3.2 Node.js与NPM的关系 17
| 2.3.3 安装NPM镜像 18
2.4 第1个Node.js应用 18
| 2.4.1 【实例1】创建Node.js应用 18
| 2.4.2 【实例2】运行Node.js应用 18
| 2.4.3 总结 19
.
第3章 Node.js模块——大型项目管理之道 20
3.1 理解模块化机制 20
| 3.1.1 理解CommonJS规范 20
| 3.1.2 理解ES 6模块 22
| 3.1.3 CommonJS和ES 6模块的异同点 24
| 3.1.4 Node.js的模块实现 25
3.2 使用NPM管理模块 26
| 3.2.1 用npm命令安装模块 27
| 3.2.2 全局安装与本地安装 27
| 3.2.3 查看安装信息 28
| 3.2.4 卸载模块 28
| 3.2.5 更新模块 29
| 3.2.6 搜索模块 29
| 3.2.7 创建模块 29
3.3 Node.js的核心模块 29
.
第4章 Node.js测试 31
4.1 严格模式和遗留模式 31
4.2 【实例3】断言的使用 32
4.3 了解AssertionError 33
4.4 【实例4】使用deepStrictEqual 34
.
第5章 Node.js缓冲区——高性能I/O处理的秘诀 38
5.1 了解Buffer类 38
| 5.1.1 TypedArray对象 39
| 5.1.2 Buffer类 39
5.2 创建缓冲区 40
| 5.2.1 初始化缓冲区的API 41
| 5.2.2 理解数据的安全性 41
| 5.2.3 启用零填充 42
| 5.2.4 指定字符编码 43
5.3 切分缓冲区 43
5.4 链接缓冲区 45
5.5 比较缓冲区 46
5.6 缓冲区编/解码 46
| 5.6.1 解码器和编码器 47
| 5.6.2 缓冲区解码 47
| 5.6.3 缓冲区编码 48
.
第6章 Node.js事件处理 50
6.1 理解事件和回调 50
| 6.1.1 事件循环 51
| 6.1.2 事件驱动 51
6.2 事件发射器 52
| 6.2.1 将参数传给监听器 52
| 6.2.2 异步与同步 53
| 6.2.3 仅处理事件一次 53
6.3 事件类型 54
| 6.3.1 事件类型的定义 54
| 6.3.2 内置的事件类型 55
| 6.3.3 error事件 55
6.4 事件的操作 57
| 6.4.1 【实例5】设置最大监听器 58
| 6.4.2 【实例6】获取已注册事件的名称 58
| 6.4.3 【实例7】获取监听器数组的副本 59
| 6.4.4 【实例8】将事件监听器添加到监听器数组的开头 59
| 6.4.5 【实例9】移除监听器 60
.
第7章 Node.js文件处理 63
7.1 了解fs模块 63
| 7.1.1 同步与异步操作文件 63
| 7.1.2 文件描述符 65
7.2 处理文件路径 66
| 7.2.1 字符串形式的路径 66
| 7.2.2 Buffer形式的路径 67
| 7.2.3 URL对象的路径 68
7.3 打开文件 69
| 7.3.1 文件系统标志 69
| 7.3.2 【实例10】打开文件的例子 71
7.4 读取文件 72
| 7.4.1 【实例11】用fs.read()方法读取文件 72
| 7.4.2 【实例12】用fs.readdir()方法读取文件 73
| 7.4.3 【实例13】用fs.readFile()方法读取文件 74
7.5 写入文件 75
| 7.5.1 【实例14】将Buffer写入文件 75
| 7.5.2 【实例15】将字符串写入文件 77
| 7.5.3 【实例16】将数据写入文件 78
.
第8章 Node.js HTTP编程 80
8.1 创建HTTP服务器 80
| 8.1.1 【实例17】用http.Server创建服务器 80
| 8.1.2 理解http.Server事件的用法 81
8.2 处理HTTP的常用操作 83
8.3 请求对象和响应对象 84
| 8.3.1 理解http.ClientRequest类 84
| 8.3.2 理解http.ServerResponse类 88
8.4 REST概述 91
| 8.4.1 REST的定义 92
| 8.4.2 REST的设计原则 92
8.5 成熟度模型 94
| 8.5.1 第0级:用HTTP作为传输方式 94
| 8.5.2 第1级:引入了资源的概念 96
| 8.5.3 第2级:根据语义使用HTTP动词 97
| 8.5.4 第3级:使用HATEOAS 98
8.6 【实例18】构建REST服务的例子 100
| 8.6.1 新增用户 101
| 8.6.2 修改用户 102
| 8.6.3 删除用户 103
| 8.6.4 响应请求 104
| 8.6.5 运行应用 105
第3篇 Express——Web服务器
.
第9章 Express基础 110
9.1 安装Express 110
9.2 【实例19】编写“Hello World”应用 112
9.3 【实例20】运行“Hello World”应用 112
.
第10章 Express路由——页面的导航员 114
10.1 路由方法 114
10.2 路由路径 115
| 10.2.1 【实例21】基于字符串的路由路径 116
| 10.2.2 【实例22】基于字符串模式的路由路径 116
| 10.2.3 【实例23】基于正则表达式的路由路径 117
10.3 路由参数 117
10.4 路由处理器 118
| 10.4.1 【实例24】单个回调函数 118
| 10.4.2 【实例25】多个回调函数 118
| 10.4.3 【实例26】一组回调函数 118
| 10.4.4 【实例27】独立函数和函数数组的组合 119
10.5 响应方法 119
10.6 【实例28】基于Express构建REST API 120
10.7 测试Express的REST API 122
| 10.7.1 测试用于创建用户的API 122
| 10.7.2 测试用于删除用户的API 122
| 10.7.3 测试用于修改用户的API 123
| 10.7.4 测试用于查询用户的API 124
.
第11章 Express错误处理器 125
11.1 捕获错误 125
11.2 默认错误处理器 127
11.3 自定义错误处理器 128
第4篇 MongoDB篇——NoSQL数据库
第12章 MongoDB基础 132
12.1 MongoDB简介 132
12.2 安装MongoDB 133
12.3 启动MongoDB服务 134
12.4 链接MongoDB服务器 135
.
第13章 MongoDB的常用操作 136
13.1 显示已有的数据库 136
13.2 创建、使用数据库 136
13.3 插入文档 137
| 13.3.1 【实例29】插入单个文档 137
| 13.3.2 【实例30】插入多个文档 138
13.4 查询文档 139
| 13.4.1 嵌套文档查询 139
| 13.4.2 嵌套字段查询 139
| 13.4.3 使用查询运算符 140
| 13.4.4 多条件查询 140
13.5 修改文档 140
| 13.5.1 修改单个文档 141
| 13.5.2 修改多个文档 141
| 13.5.3 替换单个文档 142
13.6 删除文档 142
| 13.6.1 删除单个文档 143
| 13.6.2 删除多个文档 143
.
第14章 【实例31】使用Node.js操作MongoDB 144
14.1 安装mongodb模块 144
14.2 访问MongoDB 145
14.3 运行应用 146
.
第15章 mongodb模块的综合应用 148
15.1 【实例32】建立连接 148
15.2 【实例33】插入文档 149
15.3 【实例34】查找文档 150
15.4 修改文档 152
| 15.4.1 【实例35】修改单个文档 153
| 15.4.2 【实例36】修改多个文档 157
15.5 删除文档 158
| 15.5.1 【实例37】删除单个文档 158
| 15.5.2 【实例38】删除多个文档 159
第5篇 Angular——前端应用开发平台
第16章 Angular基础 162
16.1 常见的UI编程框架 162
| 16.1.1 Angular与jQuery的不同 162
| 16.1.2 Angular与React、Vue.js优势对比 164
| 16.1.3 Angular、React、Vue.js三者怎么选 165
16.2 Angular的安装 165
16.3 Angular CLI的常用操作 166
| 16.3.1 获取帮助 166
| 16.3.2 创建应用 167
| 16.3.3 创建组件 167
| 16.3.4 创建服务 167
| 16.3.5 启动应用 167
| 16.3.6 添加依赖 167
| 16.3.7 升级依赖 167
16.3.8 自动化测试 167
| 16.3.9 下载依赖 168
| 16.3.10 编译 168
16.4 Angular架构概览 168
| 16.4.1 模块 169
| 16.4.2 组件 170
| 16.4.3 模板、指令和数据绑定 170
| 16.4.4 服务与依赖注入 170
| 16.4.5 路由 170
16.5 【实例39】创建第1个Angular应用 171
| 16.5.1 使用Angular CLI初始化应用 171
| 16.5.2 运行Angular应用 173
| 16.5.3 了解src文件夹 174
| 16.5.4 了解根目录 175
.
第17章 Angular模块——大型前端应用管理之道 178
17.1 模块概述 178
| 17.1.1 什么是模块化 178
| 17.1.2 认识基本模块 179
| 17.1.3 认识特性模块 180
17.2 引导启动 180
| 17.2.1 了解declarations数组 181
| 17.2.2 了解imports数组 182
| 17.2.3 了解providers数组 182
| 17.2.4 了解bootstrap数组 182
17.3 常用模块 182
| 17.3.1 常用模块 182
| 17.3.2 BrowserModule和CommonModule 183
17.4 特性模块 183
| 17.4.1 领域特性模块 183
| 17.4.2 带路由的特性模块 184
| 17.4.3 路由模块 184
| 17.4.4 服务特性模块 184
| 17.4.5 可视部件特性模块 185
17.5 入口组件 185
| 17.5.1 引导用的入口组件 185
| 17.5.2 路由用的入口组件 186
| 17.5.3 entryComponents 186
| 17.5.4 编译优化 186
.
第18章 Angular组件——独立的开发单元 187
18.1 数据展示 187
| 18.1.1 【实例40】数据展示的例子 187
| 18.1.2 使用插值表达式显示组件属性 189
| 18.1.3 组件关联模板的两种方式 189
| 18.1.4 在模板中使用指令 190
18.2 生命周期 190
| 18.2.1 生命周期钩子 190
| 18.2.2 【实例41】生命周期钩子的例子 191
| 18.2.3 生命周期钩子的顺序 193
| 18.2.4 了解OnInit()钩子 194
| 18.2.5 了解OnDestroy()钩子 195
| 18.2.6 了解OnChanges()钩子 196
| 18.2.7 了解DoCheck()钩子 196
| 18.2.8 了解AfterView钩子 197
| 18.2.9 了解AfterContent钩子 197
18.3 组件的交互方式 197
| 18.3.1 【实例42】通过@Input把数据从父组件传到子组件 197
| 18.3.2 【实例43】通过set()方法截听输入属性值的变化 199
| 18.3.3 【实例44】通过ngOnChanges()方法截听输入属性值的变化 200
| 18.3.4 【实例45】用父组件监听子组件的事件 202
| 18.3.5 【实例46】父组件与子组件通过本地变量进行交互 204
| 18.3.6 【实例47】父组件调用@ViewChild()方法获取子组件的值 206
| 18.3.7 【实例48】父组件和子组件通过服务来通信 207
18.4 样式 210
| 18.4.1 【实例49】使用组件样式的例子 211
| 18.4.2 样式的作用域 211
| 18.4.3 特殊的样式选择器 213
| 18.4.4 把样式加载进组件的几种方式 213
.
第19章 Angular模板和数据绑定 216
19.1 模板表达式 216
| 19.1.1 模板表达式上下文 217
| 19.1.2 编写模板表达式的最佳实践 217
| 19.1.3 管道操作符 218
| 19.1.4 安全导航操作符和空属性路径 218
| 19.1.5 非空断言操作符 218
19.2 模板语句 219
19.3 数据绑定 220
| 19.3.1 从数据源到视图 220
| 19.3.2 从视图到数据源 220
| 19.3.3 双向绑定 221
19.4 属性绑定 221
| 19.4.1 单向输入 221
| 19.4.2 绑定目标 221
| 19.4.3 一次性字符串初始化 221
| 19.4.4 选择“插值表达式”还是“属性绑定” 222
| 19.5 事件绑定 222
| 19.5.1 目标事件 222
| 19.5.2 $event和事件处理语句 222
| 19.5.3 使用EventEmitter类自定义事件 223
.
第20章 Angular指令——组件行为改变器 225
20.1 指令类型 225
20.2 属性型指令 225
| 20.2.1 了解NgClass、NgStyle、NgModel指令 226
| 20.2.2 【实例50】创建并使用属性型指令 227
| 20.2.3 【实例51】响应用户引发的事件 228
| 20.2.4 【实例52】使用@Input数据绑定向指令传递值 229
| 20.2.5 【实例53】绑定多个属性 231
20.3 结构型指令 232
| 20.3.1 了解NgIf指令 232
| 20.3.2 了解NgSwitch指令 232
| 20.3.3 了解NgFor指令 233
| 20.3.4 了解<ng.template>标签 234
| 20.3.5 了解<ng.container>标签 234
| 20.3.6 【实例54】自定义结构型指令 235
.
第21章 Angular服务与依赖注入 238
21.1 初识依赖注入 238
21.2 在Angular中实现依赖注入 239
| 21.2.1 观察初始的应用 240
| 21.2.2 创建服务 242
| 21.2.3 理解注入器 242
| 21.2.4 理解服务提供商 245
| 21.2.5 注入服务 249
| 21.2.6 单例服务 250
| 21.2.7 组件的子注入器 250
| 21.2.8 测试组件 250
| 21.2.9 服务依赖服务 251
| 21.2.10 依赖注入令牌 252
| 21.2.11 可选依赖 252
21.3 多级依赖注入 252
| 21.3.1 注入器树 252
| 21.3.2 注入器冒泡 253
| 21.3.3 在不同层级提供同一个服务 253
| 21.3.4 组件注入器 253
.
第22章 Angular路由 254
22.1 配置路由 254
| 22.1.1 【实例55】配置路由器 254
| 22.1.2 输出导航生命周期中的事件 256
| 22.1.3 【实例56】设置路由出口 256
22.2 理解路由器链接 257
| 22.2.1 路由器状态 257
| 22.2.2 激活的路由 257
22.3 路由事件 258
22.4 重定向URL 258
22.5 【实例57】一个路由器的例子 259
| 22.5.1 创建应用及组件 259
| 22.5.2 修改组件的模板 260
| 22.5.3 导入并设置路由器 260
| 22.5.4 添加路由出口 261
| 22.5.5 美化界面 262
| 22.5.6 定义通配符路由 264
.
第23章 Angular响应式编程 266
23.1 了解Observable机制 266
| 23.1.1 Observable的基本概念 266
| 23.1.2 定义观察者 267
| 23.1.3 执行订阅 268
| 23.1.4 创建Observable对象 269
| 23.1.5 实现多播 270
| 23.1.6 处理错误 273
23.2 了解RxJS技术 273
| 23.2.1 创建Observable对象的函数 274
| 23.2.2 了解操作符 275
| 23.2.3 处理错误 276
23.3 了解Angular中的Observable 277
| 23.3.1 在EventEmitter类上的应用 278
| 23.3.2 在调用HTTP方法时的应用 278
| 23.3.3 在AsyncPipe管道上的应用 279
| 23.3.4 在Router路由器上的应用 279
| 23.3.5 在响应式表单上的应用 280
.
第24章 Angular HTTP客户端 282
24.1 初识HttpClient 282
24.2 认识网络资源 282
24.3 【实例58】获取天气数据 284
| 24.3.1 导入HttpClient 284
| 24.3.2 编写空气质量组件 285
| 24.3.3 编写空气质量服务 285
| 24.3.4 将服务注入组件 286
| 24.3.5 返回带类型检查的响应 288
| 24.3.6 读取完整的响应体 288
24.4 错误处理 290
| 24.4.1 获取错误详情 291
| 24.4.2 重试 292
.
第6篇 综合应用——构建一个完整的互联网应用
第25章 总体设计 294
25.1 应用概述 294
| 25.1.1 mean.news的核心功能 295
| 25.1.2 初始化数据库 295
25.2 模型设计 295
| 25.2.1 用户模型设计 295
| 25.2.2 新闻模型设计 296
25.3 接口设计 296
25.4 权限管理 296
.
第26章 客户端应用 298
26.1 UI设计 298
| 26.1.1 首页UI设计 298
| 26.1.2 新闻详情页UI设计 299
26.2 实现UI原型 299
| 26.2.1 初始化mean.news.ui 300
| 26.2.2 添加NG.ZORRO 300
| 26.2.3 创建新闻列表组件 303
| 26.2.4 设计新闻列表原型 304
| 26.2.5 设计新闻详情页原型 306
26.3 实现路由器 309
| 26.3.1 创建路由 309
| 26.3.2 添加路由出口 309
| 26.3.3 修改新闻列表组件 309
| 26.3.4 给“返回”按钮添加事件 310
| 26.3.5 运行应用 311
.
第27章 服务器端应用 312
27.1 初始化服务器端应用 312
| 27.1.1 创建应用目录 312
| 27.1.2 初始化应用结构 312
| 27.1.3 在应用中安装Express 313
| 27.1.4 编写“Hello World”应用 314
| 27.1.5 运行“Hello World”应用 314
27.2 初步实现用户登录认证功能 314
| 27.2.1 创建服务器端管理组件 314
| 27.2.2 添加组件到路由器 315
| 27.2.3 使用HttpClient 315
| 27.2.4 访问服务器端接口 316
| 27.2.5 给服务器端接口设置安全认证 318
27.3 实现新闻编辑器 320
| 27.3.1 集成ngx.Markdown插件 320
| 27.3.2 导入MarkdownModule模块 321
| 27.3.3 编写编辑器界面 321
| 27.3.4 在服务器端新增创建新闻的接口 325
| 27.3.5 运行应用 327
27.4 实现新闻列表展示 328
| 27.4.1 在服务器端实现新闻列表查询的接口 328
| 27.4.2 在客户端实现客户端访问新闻列表的REST接口 329
| 27.4.3 运行应用 330
27.5 实现新闻详情展示 331
| 27.5.1 在服务器端实现新闻详情查询的接口 331
| 27.5.2 在客户端实现调用新闻详情页的REST接口 333
| 27.5.3 设置路由 334
| 27.5.4 运行应用 334
27.6 实现认证信息的存储及读取 335
| 27.6.1 实现认证信息的存储 335
| 27.6.2 实现认证信息的读取 336
| 27.6.3 改造认证方法 336
| 27.6.4 改造对外的接口 337
27.7 总结 339
.
第28章 用NGINX实现高可用 340
28.1 NGINX概述 340
| 28.1.1 NGINX特性 340
| 28.1.2 安装、运行NGINX 340
| 28.1.3 验证安装 343
| 28.1.4 常用命令 344
28.2 部署客户端应用 345
| 28.2.1 编译客户端应用 345
| 28.2.2 部署客户端应用的编译文件 346
| 28.2.3 配置NGINX 346
28.3 实现负载均衡及高可用 347
| 28.3.1 配置负载均衡 348
| 28.3.2 负载均衡常用算法 349
| 28.3.3 实现服务器端服务器的高可用 350
| 28.3.4 运行应用 351
参考文献 353
· · · · · · (
收起)