已經(jīng)2018年,本章不在介紹什么是前后端分離,什么是MVC架構(gòu),什么是Restful約定,而是用基本的ES6和ES7語法,以NodeJS項目從MVC分層的角度來搭建一個API節(jié)點
本章知識點?
1、項目配置
2、項目分層架構(gòu)
3、抽離BaseDAO
4、編寫DAO層
5、抽離BaseService
6、編寫Service層
7、編寫Controller層
8、Mysql建立關(guān)聯(lián)表結(jié)構(gòu)
9、測試基本業(yè)務(wù)的增刪改查接口
10、測試特殊業(yè)務(wù)接口
一、項目配置
編程語言:NodeJS+ES6/ES7
數(shù)據(jù)庫:mysql
第三方庫:Express+Sequelize
二、項目分層架構(gòu)
bin:啟動http/https服務(wù)
commons:存放公共方法文件
config:存放配置文件
model:存放dao文件, 負責和數(shù)據(jù)庫交互
service:存放service文件, 負責和dao交互
routers:存放controller文件,負責和service交互
public:存放前端js/cssimage等文件(廢棄,由于是前后端分離,已完全用不到)
view:存放前端模板頁面( 廢棄,由于是前后端分離,已完全用不到)
app.js:項目入口文件
babelrc:babel配置文件
package.json:包依賴管理文件
三、抽離BaseDAO
假設(shè)我們有N個Model文件,而每一個Model文件都要基礎(chǔ)的方法集,我們不愿意在每一個Model文件里都重寫這些基本方法,而是希望將這些基礎(chǔ)的方法提取出來,然后采用繼承的思想去獲得它們,就像數(shù)學里的提取公因式,為此,我們抽離這些公共基礎(chǔ)方法到BaseDAO文件
操作數(shù)據(jù)庫無非增、刪、改、查四大類方法,只是關(guān)聯(lián)表的復雜度不同,查詢分精確查詢,模糊查詢,是否排序,分組,更新/添加/刪除是否批量等,這里,我封裝的公共方法查找方法為:
findAll:不帶過濾條件的查詢
findByFilter:帶過濾條件的精確查詢
findByFilterOrder:帶過濾條件的排序精確查詢
findLikeByFilter:帶過濾條件的模糊查詢
findLikeByFilterOrder:帶過濾條件的排序模糊查詢
封裝的更新方法為:
update:批量更新/條件更新
封裝的刪除方法為:
delete:條件刪除
封裝的插入方法為:
create:插入單個實體
createBatch:批量插入實體集
而我們希望通過BaseDAO的構(gòu)造方法來實例化Sequelize的model實例
可以看到后端的代碼基本是一個方法一行,返回值都是promise,方便我們用async和await接受,非常優(yōu)美!
四、編寫DAO層
當編寫具體DAO實體文件時,顯然,我們需要繼承BaseDAO讓其具有基礎(chǔ)方法集
假設(shè)我們有兩個Model,分別是CompanyModel和PersonModel,下面我們編寫CompanyModel文件
通過友好的繼承,CompanyModel已經(jīng)擁有所有BaseDAO的調(diào)用權(quán)限
考慮另一個PersonModel,從業(yè)務(wù)上,一個公司擁有多個員工,所以CompanyModel和PersonModel是1 :N的關(guān)系,現(xiàn)在需要PersonModel擁有一個關(guān)聯(lián)查找CompanyModel的接口,那么對于這種針對其自身的業(yè)務(wù)接口,我們會將其寫入其本身的方法里,保證只有它本身持有這個方法
可以看到PersonModel類持有自身的業(yè)務(wù)接口specialDAO2
五、抽離BaseService
同理,在編寫service層是,我們也構(gòu)造出BaseService來調(diào)用BaseDAO
我們讓具體的dao實例,通過形參傳入BaseService的構(gòu)造函數(shù)里,編寫出base***的方法集合來通過dao實例調(diào)用BaseDAO的方法集
六、編寫Service層
和DAO層一樣,我們編寫具體的service文件時需要繼承BaseService,讓其擁有調(diào)用BaseDAO的方法
可以看到CompanyService可以調(diào)用所有baseDAO的方法,同理,dao自身的方法需要在其service里申明
可以看到PersonService單獨暴露出了調(diào)用PersonModel里自身的方法接口
順便說一下@AutoWritedPersonModel是利用了es7的裝飾器功能,可以給實例注入對象,這里我給每個service類注入了對應的dao對象方便調(diào)用
七、編寫Controller層
現(xiàn)在,我們可以封裝出Controller層接收路由請求來調(diào)用service,通過service調(diào)用dao來完成請求對數(shù)據(jù)庫的交互過程
可以看到對于任何一個客戶端請求,我們都通過service調(diào)用dao,并用await接收數(shù)據(jù)后最后輸出到客戶端
八、Mysql建立關(guān)聯(lián)表結(jié)構(gòu)
下面我們?yōu)檠菔綿emo,新建person表和company表,person表里存放company表的外鍵
九、測試基本業(yè)務(wù)的增刪改查接口
下面來測試基本的person的baseDAO方法結(jié)果
查找所有person,返回所有屬性
查找所有person,只返回id和姓名屬性
按照條件過濾出性別是0的person
模糊查詢過濾出符合條件姓名包含z的person
更新id=2的person的性別為1
添加一個person
刪除id=5的person
十、測試特殊業(yè)務(wù)接口
演示兩個person的業(yè)務(wù)場景
場景一:單表操作,模糊查詢姓名包含z,年紀小于18歲,性別為男的person
場景二:多表(inner join)操作,查詢公司是阿里巴巴的person,并展開company
項目源碼地址:前后端分離之NodeJS+mysql分層之美