第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
· · · · · · (
收起)