已經(jīng)2018年衡蚂,本章不在介紹什么是前后端分離括细,什么是MVC架構(gòu),什么是Restful約定搓萧,而是用基本的ES6和ES7語法杂数,以NodeJS項(xiàng)目從MVC分層的角度來搭建一個API節(jié)點(diǎn)
本章知識點(diǎn)?
1、項(xiàng)目配置
2瘸洛、項(xiàng)目分層架構(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ù)接口
一养距、項(xiàng)目配置
編程語言:NodeJS+ES6/ES7
數(shù)據(jù)庫:mysql
第三方庫:Express+Sequelize
二诉探、項(xiàng)目分層架構(gòu)
bin:啟動http/https服務(wù)
commons:存放公共方法文件
config:存放配置文件
model:存放dao文件, 負(fù)責(zé)和數(shù)據(jù)庫交互
service:存放service文件棍厌, 負(fù)責(zé)和dao交互
routers:存放controller文件肾胯,負(fù)責(zé)和service交互
public:存放前端js/cssimage等文件(廢棄,由于是前后端分離定铜,已完全用不到)
view:存放前端模板頁面( 廢棄阳液,由于是前后端分離,已完全用不到)
app.js:項(xiàng)目入口文件
babelrc:babel配置文件
package.json:包依賴管理文件
三揣炕、抽離BaseDAO
假設(shè)我們有N個Model文件帘皿,而每一個Model文件都要基礎(chǔ)的方法集,我們不愿意在每一個Model文件里都重寫這些基本方法畸陡,而是希望將這些基礎(chǔ)的方法提取出來鹰溜,然后采用繼承的思想去獲得它們虽填,就像數(shù)學(xué)里的提取公因式,為此曹动,我們抽離這些公共基礎(chǔ)方法到BaseDAO文件
操作數(shù)據(jù)庫無非增斋日、刪、改墓陈、查四大類方法恶守,只是關(guān)聯(lián)表的復(fù)雜度不同,查詢分精確查詢贡必,模糊查詢兔港,是否排序,分組仔拟,更新/添加/刪除是否批量等衫樊,這里,我封裝的公共方法查找方法為:
findAll:不帶過濾條件的查詢
findByFilter:帶過濾條件的精確查詢
findByFilterOrder:帶過濾條件的排序精確查詢
findLikeByFilter:帶過濾條件的模糊查詢
findLikeByFilterOrder:帶過濾條件的排序模糊查詢
封裝的更新方法為:
update:批量更新/條件更新
封裝的刪除方法為:
delete:條件刪除
封裝的插入方法為:
create:插入單個實(shí)體
createBatch:批量插入實(shí)體集
而我們希望通過BaseDAO的構(gòu)造方法來實(shí)例化Sequelize的model實(shí)例
可以看到后端的代碼基本是一個方法一行利花,返回值都是promise科侈,方便我們用async和await接受,非常優(yōu)美炒事!
四臀栈、編寫DAO層
當(dāng)編寫具體DAO實(shí)體文件時,顯然羡洛,我們需要繼承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實(shí)例宪哩,通過形參傳入BaseService的構(gòu)造函數(shù)里娩贷,編寫出base***的方法集合來通過dao實(shí)例調(diào)用BaseDAO的方法集
六、編寫Service層
和DAO層一樣锁孟,我們編寫具體的service文件時需要繼承BaseService彬祖,讓其擁有調(diào)用BaseDAO的方法
可以看到CompanyService可以調(diào)用所有baseDAO的方法茁瘦,同理,dao自身的方法需要在其service里申明
可以看到PersonService單獨(dú)暴露出了調(diào)用PersonModel里自身的方法接口
順便說一下@AutoWritedPersonModel是利用了es7的裝飾器功能储笑,可以給實(shí)例注入對象甜熔,這里我給每個service類注入了對應(yīng)的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币叹,年紀(jì)小于18歲润歉,性別為男的person
場景二:多表(inner join)操作,查詢公司是阿里巴巴的person颈抚,并展開company
項(xiàng)目源碼地址:前后端分離之NodeJS+mysql分層之美