node-red 商品管理

數(shù)據(jù)庫結構

商品相關的表比較多,而且都是多對多關聯(lián)


image.png

列表查詢

先看下界面棕硫,可以通過商品名稱髓涯、商品編碼、商品分類哈扮、商品的上下架狀態(tài)和售罄狀態(tài)查詢
這些屬性涉及兩個表纬纪,其中yoshop_goods 包含查詢商品的基本屬性,但商品和分類分類是多對多關系滑肉,要通過 yoshop_goods_category_rel 這個關聯(lián)表查詢


image.png

增加一個sqlbuilder節(jié)點包各,根據(jù)前端查詢的參數(shù)組裝對應sql

(function(query) {
    var {listType = 'all', goodsName='', goodsNo='', categoryId=''} = msg.req.query
    
    var q = query.from("yoshop_goods").where({
        "store_id": msg.store_id,
        "is_delete": 0
    })
        
    if (goodsName) q.where("goods_name", 'like', `%${goodsName}%`)
    if (goodsNo) q.where("goods_no", 'like', `%${goodsNo}%`)
    if (listType == 'sold_out') q.where("stock_total", 0)
    if (listType == 'on_sale') q.where("status", 10)
    if (listType == 'off_sale') q.where("status", 20)
    if (parseInt(categoryId)) {
        q.whereExists(function() {
            this.from('yoshop_goods_category_rel')
            .whereRaw('yoshop_goods_category_rel.goods_id = yoshop_goods.goods_id')
            .where("category_id", categoryId)
        })
    }
    
    return q
    
})(query)

因為需要根據(jù)每個篩選條件是否傳值來拼sql,這里用閉包的方式處理
在處理根據(jù)商品分類查詢時赦邻,用到了exists子查詢

保存代碼并部署髓棋,在界面根據(jù)不同條件查詢,可以看到后臺打印的調試sql和接口返回的數(shù)據(jù)


image.png

但實際上前端代碼會報錯惶洲,因為只返回了列表數(shù)據(jù)按声,缺少分頁的信息

分頁查詢

涉及到分頁的table,前端需要的數(shù)據(jù)結構大概是這樣的

{
    "code": 0, 
    "message": "success", 
    "data": {
        "list": {
            "current_page": 1, 
            "last_page": 1, 
            "per_page": 15, 
            "total": 1, 
            "data": [
                {
                    "goods_id": 3
                    "...": "..."
                }
            ]
        }
    }
}

系統(tǒng)中大量頁面都用到了分頁查詢恬吕,我們先建立一個分頁查詢的子流程


image.png

思路很簡單
1签则、先根據(jù)查詢的sql,把 SELECT 和 FROM 之間的內容替換為 COUNT(*)铐料, 查詢出該查詢語句命中的總行數(shù)
PS:只處理最普遍的情況渐裂,沒有對性能進行優(yōu)化,比如去掉 sql 里的 ORDER BY 語句等

msg.topic = msg.topic.trim().replace(/(select)\s+(.*?)\s+(from\s+)(.*)/img, "$1 COUNT(*) AS _count $3 $4")

2钠惩、根據(jù)記錄總數(shù)柒凉,和每頁的查詢行數(shù),計算總頁數(shù)
這里的 msg.paginate 是按前端需要的結構組裝的

const {page=1, pagesize = 15} = msg.req.query
const per_page = parseInt(pagesize) || 10
const total = msg.payload[0]._count
msg.paginate = {
    current_page: parseInt(page) || 1,
    last_page: Math.ceil(total / per_page),
    per_page,
    total
}
return msg;

3篓跛、根據(jù)前端傳遞的page和per_page參數(shù)膝捞,計算本次查詢的數(shù)據(jù),起始位置愧沟,拼到查詢sql后

const {current_page, per_page} = msg.paginate
const offset = (current_page - 1) * per_page
msg.topic = msg.sql + ` LIMIT ${offset}, ${per_page}`
return msg;

4蔬咬、最后組裝返回的數(shù)據(jù)

商品明細查詢

商品明細涉及的表很多鲤遥,參考最上面示意的er圖……
接口返回的結構參考下面截圖,基本上和商品關聯(lián)的信息都需要查詢出來了


image.png

下面拆解下接口的處理流程


image.png

1林艘、首先根據(jù)id查詢商品信息


image.png

2盖奈、查詢到商品后,就是分別查詢關聯(lián)的圖片狐援、分類钢坦、服務承諾、規(guī)格啥酱、sku等數(shù)據(jù)场钉,并組裝到一起返回前端


image.png

這里的每個查詢都很簡單,但每個查詢之間沒有太大關聯(lián)懈涛,如果按串行的方式,把一大坨拼湊到一起就會很難看泳猬。
出于審美批钠,到市場找了個join-wait的插件,該插件每次接收到消息后得封,會判斷是否在等待列表中埋心,如果等待的消息全部到達后,把消息進行合并處理忙上,并發(fā)送到下游節(jié)點
PS:支持指定消息到達的順序拷呆,支持超時


image.png

編排完的流程長這樣


image.png

小結

1、有一說一疫粥,knex還是偏底層茬斧,處理復雜的關聯(lián)查詢能力比較弱。類似的場景梗逮,截一段用laravel實現(xiàn)的代碼项秉,可以直觀看到兩種方式的差別
后面等有時間了把 knex 換成 Prisma 和 Sequelize 試下


image.png

2、從流程編排角度看慷彤,node-red某種程度實現(xiàn)了邏輯的所見即所得娄蔼,至少不需要額外寫注釋了

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市底哗,隨后出現(xiàn)的幾起案子岁诉,更是在濱河造成了極大的恐慌,老刑警劉巖跋选,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涕癣,死亡現(xiàn)場離奇詭異,居然都是意外死亡野建,警方通過查閱死者的電腦和手機属划,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門恬叹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人同眯,你說我怎么就攤上這事绽昼。” “怎么了须蜗?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵硅确,是天一觀的道長。 經(jīng)常有香客問我明肮,道長菱农,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任柿估,我火速辦了婚禮循未,結果婚禮上,老公的妹妹穿的比我還像新娘秫舌。我一直安慰自己的妖,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布足陨。 她就那樣靜靜地躺著嫂粟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪墨缘。 梳的紋絲不亂的頭發(fā)上星虹,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音镊讼,去河邊找鬼宽涌。 笑死,一個胖子當著我的面吹牛蝶棋,可吹牛的內容都是我干的护糖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼嚼松,長吁一口氣:“原來是場噩夢啊……” “哼嫡良!你這毒婦竟也來了?” 一聲冷哼從身側響起献酗,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤寝受,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后罕偎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體很澄,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甩苛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹂楣。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情吓笙,我是刑警寧澤张弛,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布拗馒,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜酌呆,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搔耕。 院中可真熱鬧隙袁,春花似錦、人聲如沸弃榨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惭墓。三九已至,卻和暖如春而姐,著一層夾襖步出監(jiān)牢的瞬間腊凶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工拴念, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钧萍,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓政鼠,卻偏偏與公主長得像风瘦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子公般,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容