在實際業務開發中,會遇到這樣一種需求,使用VUE的頁面須要支持SEO,同時對首屏有指標性要求,目前市面上廣泛使用的是Nuxt.js解決方案,在引入的同時還須要考慮與現有的全棧工程結合,本系列文章探討的是此類全棧工程的解決方案,同時使用的是TypeScript應用於先後端編程,文章中介紹的工程與技術要點源碼已上傳至Github,有須要的朋友可自行下載:
Nuxt.js和Nest.js同構工程html
複製代碼
文章意在拋磚引玉,先後端使用同一種語言TypeScript編寫,示例已包含基本接口請求,數據庫鏈接應用,公用模塊封裝等實際開發中使用到的內容。前端
TypeScript全棧工程實戰-(Nuxt. js & Nest. js) - 2、《框架融合》git
TypeScript全棧工程實戰-(Nuxt. js & Nest. js) - 3、《配置服務》github
TypeScript全棧工程實戰-(Nuxt. js & Nest. js) - 4、《UI系統》mongodb
TypeScript全棧工程實戰-(Nuxt. js & Nest. js) - 5、《API服務設計》數據庫
TypeScript全棧工程實戰-(Nuxt. js & Nest. js) - 6、《SEO功能實現》編程
TypeScript全棧工程實戰-(Nuxt. js & Nest. js) - 7、《Vuex使用》後端
TypeScript全棧工程實戰-(Nuxt. js & Nest. js) - 8、《接入Mongo DB服務》緩存
TypeScript全棧工程實戰-(Nuxt. js & Nest. js) - 9、《TypeScript》安全
TypeScript全棧工程實戰-(Nuxt. js & Nest. js) - 10、《工程化部署》
創建本地MongoDB服務
參考官網安裝配置 Install MongoDB ,注意設置的帳號和密碼,最終在 Robo 3T 可視化管理工具 中顯示效果以下:
在本示例中,分別建立了 購物車、產品、用戶等文結構。
獨立配置
前文提到,本示例使用了先後端一體化配置,但特例狀況是,對於數據庫等敏感配置內容,不適合先後端共用,因此在本示例中,須要將其單獨抽離。
創建鏈接
Nest.js使用MongoDB,默認集成Mongoose, 在使用時經過import的方式引入。 以示例中的本地模塊爲例:
1.創建LocalModule,LocalModule再導入DataBaseModule
交互:
在首頁中,綁定數據庫中用戶擁有的購物車產品數量,當點擊【個人購物車】時,跳轉至【購物車】頁面,用戶點擊+或者-進行購物車物品數量增減操做,同時藉助Vuex系統,進行多頁面狀態共享,最後更新至數據庫中的【isomorphism.carts】文檔中的num字段中進行數據持久化。
文檔設計
本示例中,從上圖效果圖來看用戶首頁顯示當前購物車數量,點擊進入可修改購物車數量。抽象成數據庫表現爲:
須要有一個文檔,用於存放用戶信息。
須要有一個文檔,用於存放用戶購物車信息,購物車信息由用戶,用戶存放的物品ID,每一個物品在購物車中的數量構成。
須要有一個文檔,用於存放商品原始SKU信息。
交互形式爲:
用戶界面中操做購物車數量,依據用戶ID和產品ID將更新結果存放於存放用戶購物車數量信息的文檔中。
控制器實現
這裏以更新購物車爲例,截取部份代碼片段,基礎思路是使用POST接口,接收前端傳入參數,再傳入SERVICE服務層,同時接口層對傳入和返回處理做統一的封裝。
1.定義接口:
使用@Post('xxx')定義訪問接口,Post爲RESTful關鍵方法之一。@Body()獲取傳入參數。
AddCartsDto
,那麼框架層面將會對參數進行完整性校驗,即按類型定義的內容,傳少參數將會有接口錯誤信息拋出。
code
, message
, success
用於標識接口狀態碼,成功或失敗字符串描述,接口成功與否狀態。
Controller
子類繼承自父類,這樣子便擁用返回結構的兩種方法,進行代碼複用。
4.服務實現
在服務層,一樣遵循與Controller
相同的機制,這裏基礎的增刪改查,若是不是因特殊需求,是能夠概括封裝在父類實現的。
遵循Mongoose調用,在構造體中加入註冊用到的文檔Model結構:
Model結構須要在Provider中創建聯接。
Schema結構。
這裏的collection
創建與實體文檔isomorphism.cats
的鏈接。
5.自定義功能實現
以依據ID獲取已添加入購物車的列表數據項
爲例,model負責實際的MongoDB語句操做,整個過程都是異步的,因此須要使用async
服務端完成相關功能後,客戶端則須要創建相關的單獨服務類調用來承接該功能,例如本示例中的LocalService
:
登陸功能
以上實現的是業務當中功能實現,在現實中,每每須要加上權限驗證功能。這裏做了一下簡單示例實現。即
1.用戶登陸,存取TOKEN
2.每次請求時頭部帶上TOKEN信息
3.服務端進行合法性校驗。
固然,與JAVA服務端等交互時可能會引入JWT等框架機制實現,在此不另做討論
客戶端登陸
避免密碼明文傳輸
。
統一攔截器
登陸完成以後,須要攔截器中統一處理登陸合法性校驗,避免在各個業務邏輯中重複使用相同代碼。在這裏統一放至middleware
中進行處理。
1.服務端攔截
在業務中依據頭部傳入內容,檢測用戶合法性,不合法狀況下返回錯誤信息。