Node.js?連接?MySql?統(tǒng)計(jì)組件屬性的使用情況解析
背景
團(tuán)隊(duì)研發(fā)了一個(gè) 「低代碼工具」,主要應(yīng)用在公司的業(yè)務(wù)上,用于解決一些重復(fù)低效的工作,提高開(kāi)發(fā)效率,降低開(kāi)發(fā)成本。工具的頁(yè)面在 相關(guān)文章 中有,在此就不貼圖啦。
哪些是低效重復(fù)的工作?比如:
- 簡(jiǎn)單的增刪改查
- 字段與頁(yè)面的綁定,比如某些管理類型的頁(yè)面,一個(gè)表單動(dòng)不動(dòng)上百個(gè)字段,邏輯簡(jiǎn)單,但全是搬磚的活。
- 不舉例子了,太多啦
工具提供了什么能力?
- 快速根據(jù)數(shù)據(jù)庫(kù)表、
API
接口、元數(shù)據(jù)平臺(tái)接口、mock
接口生成增刪改查頁(yè)面,直接就能預(yù)覽了 - 封裝了大量的業(yè)務(wù)組件,比如 金額,百分比,千分比,數(shù)值,地址,下拉樹(shù),彈出樹(shù)……
- 提供了可視化配置頁(yè)面的能力,拖拽組件構(gòu)建頁(yè)面,選中組件可視化配置組件的屬性,事件,代碼邏輯的編寫(xiě)
- 快速預(yù)覽,批量生成
vue
文件…… - 先說(shuō)這些吧,跟今天的主題不相關(guān),少扯點(diǎn)犢子。
最近工具研發(fā)也到了一個(gè)復(fù)盤(pán)總結(jié)的階段,就想著統(tǒng)計(jì)下用戶在使用過(guò)程中用了哪些組件,用了哪些組件的哪些屬性。前面也提到,工具是通過(guò)可視化的方式來(lái)實(shí)現(xiàn)組件,組件屬性的一個(gè)配置,配置數(shù)據(jù)是存在數(shù)據(jù)庫(kù)中。需要用到 SQL
語(yǔ)句,然后再對(duì)數(shù)據(jù)進(jìn)行一個(gè)分析輸出。
講道理這應(yīng)該讓后端的同事來(lái)搞,但想想咱前端Node.js
也可以連接數(shù)據(jù)庫(kù)的嘛,只要把數(shù)據(jù)查回來(lái),前端整理數(shù)據(jù)那不是小case
嘛,那搞起。
思路
在搞一個(gè)需求之前,我的個(gè)人習(xí)慣是先捋清楚,想好了再寫(xiě)。不然可能掉坑里,或者走彎路。
那要實(shí)現(xiàn)這個(gè)需求,如何下手?我是這么做的:
- 先寫(xiě)
SQL
啊,把統(tǒng)計(jì)的SQL
編寫(xiě)好,調(diào)試通過(guò) - 寫(xiě)個(gè)腳本,創(chuàng)建
SQL
連接 - 執(zhí)行寫(xiě)好的
SQL
- 拿到數(shù)據(jù),處理
- 輸出數(shù)據(jù)
- 關(guān)閉連接
那一步一步來(lái)吧……
SQL編寫(xiě)
這里就是用到了基本的SQL
語(yǔ)法,連表查詢,個(gè)人覺(jué)得前端的同學(xué)還是要會(huì)寫(xiě)簡(jiǎn)單的SQL
的,比如:
- 條件查詢
- 關(guān)聯(lián)查詢
- 自查詢
- 左連接,右連接
- 分組
- ……
由于此處涉及到多張表的關(guān)系,在此不過(guò)多介紹,直接寫(xiě)出來(lái)了。一共需要4個(gè)SQL
語(yǔ)句。
查詢頁(yè)面節(jié)點(diǎn)上配置的屬性
const QUERY_LAYOUT_CMPPROPS = `select xplt.CMP_CODE as code, xplt.CMP_PROPS as props from xp_page_layout_tree xplt where PAGE_ID in (select PAGE_ID from xp_page) and CMP_PROPS != '{}'`
查詢到的數(shù)據(jù)如下:
從圖中不難看出,code
代表組件,props
代表配置的屬性對(duì)象,就像下面這樣:
組件 | 配置的屬性有 |
---|---|
container | {"direction":{"propDataType":"0","propValue":"horizontal"}} |
查詢節(jié)點(diǎn)事件的配置
const QUERY_LAYOUT_CMPEVENTS = `select xplt1.CMP_CODE as code, xplo.BIND_EVENT as props from xp_page_layout_operate xplo, xp_page_layout_tree xplt1, xp_page p where xplt1.PAGE_NODE_ID = xplo .BIND_PAGE_NODE_ID and p.PAGE_ID = xplt1.PAGE_ID and xplo.BIND_EVENT is not NULL and xplo.OPERATE_TYPE in ('1', '2') group by xplt1.CMP_CODE,xplo.BIND_EVENT;`
查詢到的結(jié)果如下:
code
代表組件,props
代表配置的事件名。
表單字段配置的屬性
const QUERY_MODEL_FIELD_FORMUIPROPS = ` select xmf.FORM_UI_TYPE as code, xmf.FORM_UI_PROPS as props from xp_model xm , xp_model_field xmf where xmf.MODEL_ID = xm.MODEL_ID and xmf.FORM_UI_PROPS is not null and xmf.FORM_UI_PROPS != '{}' and xmf.FORM_UI_PROPS != 'null';`
查詢結(jié)果的格式與第一個(gè)的SQL
的一致,不貼圖了。
查詢區(qū)域表單字段配置的屬性
const QUERY_MODEL_FIELD_QUERYUIPROPS = ` select xmf.FORM_UI_TYPE as code, xmf.QUERY_UI_PROPS as props from xp_model xm , xp_model_field xmf where xmf.MODEL_ID = xm.MODEL_ID and xmf.QUERY_UI_PROPS is not null and xmf.QUERY_UI_PROPS != '{}' and xmf.QUERY_UI_PROPS != 'null';`
查詢結(jié)果的格式與第一個(gè)的SQL
的一致,不貼圖了。只需要知道有兩種格式的數(shù)據(jù),在處理數(shù)據(jù)的時(shí)候要注意。
創(chuàng)建SQL連接
- 先初始化一個(gè)項(xiàng)目
mkdir countprops cd countprops npm init -y npm i mysql code .
借助mysql
這個(gè)包來(lái)連接數(shù)據(jù)庫(kù),進(jìn)行查詢操作。
- 新建
config/index.js
,用于配置數(shù)據(jù)庫(kù)連接信息
module.exports = { host: '192.168.50.49', // IP user: 'root', // 用戶名 password: '********', // 密碼 database: 'database', // 數(shù)據(jù)庫(kù)名 port: 3306 // 端口 }
- 新建一個(gè)
index.js
文件
// #!/usr/bin/env node // 導(dǎo)入數(shù)據(jù)庫(kù)連接信息 const connectionConfig = require('../config/index.js') const mysql = require('mysql') // 創(chuàng)建連接 const connection = mysql.createConnection(connectionConfig) connection.connect()
執(zhí)行SQL & 處理數(shù)據(jù)
這里一共有4個(gè)SQL
需要執(zhí)行,每個(gè)執(zhí)行完了都有返回?cái)?shù)據(jù),返回的數(shù)據(jù)結(jié)構(gòu)有兩種,要分別處理,并且還要去重。 執(zhí)行查詢SQL
的方法是:
connection.query(sql, callback(error, result){ // 回調(diào) })
只能通過(guò)回調(diào)的方式一個(gè)一個(gè)的執(zhí)行,不支持 Promise
。
在此通過(guò)遞歸來(lái)實(shí)現(xiàn):
const result = {} // 放結(jié)果 const quene = [QUERY_LAYOUT_CMPPROPS, QUERY_MODEL_FIELD_FORMUIPROPS, QUERY_MODEL_FIELD_QUERYUIPROPS, QUERY_LAYOUT_CMPEVENTS] // 等待執(zhí)行的SQL function handleProps(props) { // 遞歸調(diào)用執(zhí)行并處理返回?cái)?shù)據(jù) props.forEach(prop => { // 處理數(shù)據(jù) const { code, props } = prop const propArray = [] try { // 這里處理返回的 props 是對(duì)象 / 字符串的情況 const objProps = JSON.parse(props) propArray.push(...Object.keys(objProps)) } catch (error) { propArray.push(props) } ;(result[code] || (result[code] = new Set())).add(...propArray) // 去重 }) const next = quene.shift() // 按順序,一個(gè)一個(gè)的執(zhí)行 if (next) { connection.query(next, function (error, results, fields) { if (error) throw error handleProps(results) }) } else { console.log(result) // 輸出結(jié)果 /** * 關(guān)閉連接 */ connection.end() } } handleProps([]) // 調(diào)用
輸出
最終執(zhí)行輸出內(nèi)容如下:
總結(jié)
好了,到此,這個(gè)需求就被筆者簡(jiǎn)單的實(shí)現(xiàn)了,個(gè)人認(rèn)為實(shí)現(xiàn)的還算比較優(yōu)雅,主要是一勞永逸了,指不定過(guò)多久又要統(tǒng)計(jì)一次,到時(shí)再執(zhí)行一次就OK。如果我們不這樣去實(shí)現(xiàn),去用眼睛觀察,用手去統(tǒng)計(jì)的話,那不得瘋了啊。假如下次需要把統(tǒng)計(jì)數(shù)據(jù)的結(jié)果用圖表可視化展示,我們只需要去構(gòu)造圖表的初始化數(shù)據(jù)就OK了,非常方便!其實(shí)我們工作中有很多類似的工作,都可以通過(guò)編碼來(lái)實(shí)現(xiàn),只要你想,就沒(méi)有啥困難能擋住你。 「只要思想不滑坡,方法總比困難多??????」
以上就是Node.js 連接 MySql 統(tǒng)計(jì)組件屬性的使用情況解析的詳細(xì)內(nèi)容,更多關(guān)于Node.js連接MySql統(tǒng)計(jì)組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
nodejs使用redis作為緩存介質(zhì)實(shí)現(xiàn)的封裝緩存類示例
這篇文章主要介紹了nodejs使用redis作為緩存介質(zhì)實(shí)現(xiàn)的封裝緩存類,涉及nodejs操作redis進(jìn)行緩存設(shè)置相關(guān)操作技巧,需要的朋友可以參考下2018-02-02Node.js中的npm單獨(dú)與批量升級(jí)依賴包的方式超詳細(xì)講解
npm outdated僅檢查所有已安裝包的依賴關(guān)系,并將當(dāng)前版本遠(yuǎn)程倉(cāng)庫(kù)中的最新版本進(jìn)行對(duì)比,不會(huì)升級(jí),這篇文章主要介紹了Node.js中的npm單獨(dú)與批量升級(jí)依賴包的方式超詳細(xì)講解,需要的朋友可以參考下2024-02-02在node中使用jwt簽發(fā)與驗(yàn)證token的方法
這篇文章主要介紹了在node中使用jwt簽發(fā)與驗(yàn)證token的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04nodejs實(shí)現(xiàn)大文件(在線視頻)的讀取
這篇文章主要為大家詳細(xì)介紹了nodejs實(shí)現(xiàn)大文件的讀取,比如在線視頻,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12npm dose not support Node.js v10.15
這篇文章主要給大家介紹了關(guān)npm dose not support Node.js v10.15.3的解決方法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-11-11nodejs實(shí)現(xiàn)截取上傳視頻中一幀作為預(yù)覽圖片
這篇文章主要為大家詳細(xì)介紹了nodejs實(shí)現(xiàn)截取上傳視頻中一幀作為預(yù)覽圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Node.js 學(xué)習(xí)筆記之簡(jiǎn)介、安裝及配置
本文是Node.js學(xué)習(xí)筆記系列文章的第一篇,主要給大家講解的是在Windows和Linux上安裝Node.js的方法。軟件安裝版本以0.12.0為例。希望大家能夠喜歡。2015-03-03