精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

前端要革命?看我在 JS 里寫 SQL

新聞 前端
在日新月異的前端領域中,前端工程師能做的事情越來越多,自從nodejs出現后,前端越來越有革了傳統后端命的趨勢,本文就再補一刀,詳細解讀如何在js代碼中執行標準的SQL語句

在日新月異的前端領域中,前端工程師能做的事情越來越多,自從nodejs出現后,前端越來越有革了傳統后端命的趨勢,本文就再補一刀,詳細解讀如何在js代碼中執行標準的SQL語句

為什么要在JS里寫SQL?

隨著業務復雜度的增長,前端頁面可能出現一些數據邏輯復雜的頁面,傳統的js邏輯處理起來比較復雜,我們先看兩個例子:

比如多規格多庫存商品界面,難點在于顏色分類、尺碼、價格、庫存、限購數量以及對應的圖片展示之間有復雜的邏輯關系,用戶進行不同的選擇時,js要經過多次復雜的查詢才能算出結果

比如地區聯動查詢界面,難點在于:

  1. 如何在本地存儲地區數據,顯然每次拉接口是不現實的,如果存儲在storage里,每次使用時,需要有類似JSON.parse類的字符串轉化為數組或對象的過程,這個操作在數據量大的時候,會造成頁面卡頓,性能極差

  2. 三級地區聯動查詢復雜,如果要從一個縣級地區查詢到所屬的城市和省份,邏輯會比較復雜

上面兩個例子,如果用傳統js邏輯來寫,大家頭腦中必定已經設計好了算法,免不了用forEach、filter、some、find等各種ES678新方法,筆者開始也是用了各種酷炫的新方法寫出來發現有兩個問題:

  1. 寫完之后邏輯很復雜,似乎沒有100行代碼實現不了(當然有大神比我活兒好)

  2. 即使寫了一大堆注釋,同事們看起來還是一頭霧水(因為邏輯確實很復雜。。。)

筆者做過一段時間php開發(還做過PM、UI、QA等)忽然想能不能用SQL的方式實現呢?經過一番研究,筆者寫了這樣一個庫:

Database.js

Database.js基于Web SQL Database,那么Web SQL Database又是啥?

Web SQL Database是WHATWG(Web 超文本應用技術工作組,HTML5草案提出方)在2008 年 1 月提出的***份正式草案,但并未包含在 HTML 5 規范之中,它是一個獨立的規范,它引入了一套使用 SQL 操作客戶端數據庫的 API。由于提出時間較早,盡管 W3C 官方在 2011 年 11 月聲明已經不再維護 Web SQL Database 規范,但這些 API 已經被廣泛的實現在了不同的瀏覽器里,尤其是手機端瀏覽器。

兼容情況

Web SQL Database 和 Indexed Database有啥區別?

Indexed Database 更類似于 NoSQL 的形式來操作數據庫 , 其中最重要的是 Indexed Database 不使用 SQL 作為查詢語言。

筆者為了實現在js里面寫SQL的需求,果斷采用了前者作為底層技術。

Web SQL Database 三個核心方法:

  • openDatabase:這個方法使用現有數據庫或新建數據庫來創建數據庫對象

  • transaction:這個方法允許我們根據情況控制事務提交或回滾

  • executeSql:這個方法用于執行SQL 查詢

代碼示例:

   var db = openDatabase('testDB', '1.0', 'Test DB', 2 * 1024 * 1024);

   var msg;

   db.transaction(function (context) {

      context.executeSql('CREATE TABLE IF NOT EXISTS testTable (id unique, name)');

      context.executeSql('INSERT INTO testTable (id, name) VALUES (0, "Byron")');

      context.executeSql('INSERT INTO testTable (id, name) VALUES (1, "Casper")');

      context.executeSql('INSERT INTO testTable (id, name) VALUES (2, "Frank")');

    });

`對于沒有SQL經驗的前端同學來講,上面代碼看起來顯然有點陌生,也不太友好,于是Database.js誕生了:

筆者以業務當中的一個需求舉例: 轉轉游戲業務列表頁 篩選菜單是一個三級聯動菜單,每個菜單變動都會影響其他菜單數據,如圖:

[[206332]]

原始JSON數據結構

可以看出是3級嵌套結構,筆者處理成了扁平化的數據結構(過程略),并分別存入三個數據庫,分別存儲游戲名稱、游戲平臺、商品類型,如下圖:

舉例游戲名稱數據結構如下圖:

通過chrome控制臺Application面板可以直接看到數據庫,結構、數據清晰可見

核心代碼如下:

    /**

      * 打開數據庫

      * @returns {Promise.<void>}

      */

     openDataBase(){

       //打開數據庫,沒有則創建

       db.openDatabase('GameMenu',1,'zzOpenGameMenu').then(res=>{

         //檢測數據庫是否存在

         db.isExists('game').then(res=>{

           //數據庫已經存在,直接使用,將數據交付給頁面UI組件

           this.setSelectData()

         }).catch(e=>{

           //數據庫不存在,請求接口并處理數據,然后存入數據庫

           this.getData()

         })

       }).catch(e=>{

         console.err(e)

       })

     },

    /**

      * 獲取分類數據并存儲到數據庫

      * @returns {Promise.<void>}

      */

     async getData(){

       //接口請求數據并處理成三個扁平數組

       let data =  await this.getMenuData()

       for(let i in data){

         //創建表并存儲數據

         db.create(i,data[i])

       }

       //將數據交付給頁面UI組件

       this.setSelectData()

     },

當任意菜單選擇變更時,三列數據將重新查詢,核心代碼如下:

    /**

      * 重新查詢數據

      * @param data 點擊菜單攜帶的數據

      * @param index 點擊菜單的序號

      * @param all 三個菜單當前選中數據

      */

    async onSelect(data,index,all){

       let target = [],condition = {}

       //業務邏輯:處理查詢條件

       if(all['0'] && all['0']['name']!=defaultData[0].default.name)condition['gameName'] =all['0']['name']

       if(all['1'] && all['1']['name']!=defaultData[1].default.name)condition['platName'] =all['1']['name']

       if(all['2'] && all['2']['name']!=defaultData[2].default.name)condition['typeName'] =all['2']['name']

 

       //創建三個查詢任務

       let tasks = ['game','plat','type'].map((v,k)=>{

           //使用db.select方法查詢

           return db.select(v,this.formatCondition(v,condition),'name,value','rowid desc','name').then((res)=>{

             target.push({

               options:res.data,

               defaultOption:defaultData[k].default,

               clickHandle:this.onSelect

             })

           })

       })

     //執行查詢

     await Promise.all(tasks)

       //將數據交付給聯動菜單組件使用

       this.selectData = target

     }

以上代碼即可完成聯動菜單所需要的數據管理工作,看起來是不是比較清晰?

使用Database.js的優勢

1.將數據結構化存儲于Storage中,避免了以文本形式存入Storage或cookie中再解析的性能消耗流程。

2.將復雜數據清晰的在前端進行管理和使用,代碼邏輯更清晰,數據查詢更簡潔!

Database.js使用文檔

openDatabase

  • 功能:打開數據庫,不存在則創建

  • 語法:openDatabase(dbName,dbVersion,dbDescription,dbSize,callback)

  • 參數:

    • dbName:數據庫名

    • dbVersion:數據庫版本(打開已存在數據庫時,版本號必須一致,否則會報錯)

    • dbDescription:數據庫描述

    • dbSize:數據庫預設大小,默認1M

    • callback:回調函數

query

  • 功能:執行sql語句,支持多表查詢

  • 語法:query(sqlStr,args = [],callback,errorCallback)

  • 參數:

    • sqlStr:sql語句

    • args(Array):傳入的數據,替換sql中的?符號

    • callback:成功回調

    • errorCallback:失敗回調

  • 示例:

   //插入數據

   db.query('INSERT INTO testTable(id,title) VALUES (?,?)',[1,'這是title'])

 

   //多表查詢

   db.query('select game.*,plat.* from game left join plat on game.name = plat.gameName')

isExists

  • 功能:檢測表是否存在

  • 語法:isExists(tableName)

  • 參數:

    • tableName:表名

createTable

  • 功能:創建一張表

  • 語法:createTable(tableName,fields)

  • 參數:

    • tableName:表名

    • fields:表結構(需指定字段類型)

  • 示例:

   db.createTable('testTable',{

       name:'varchar(200)',

       price:'int(100)'

   })

insert

  • 功能:插入一條或多條數據

  • 語法:insert(tableName,data)

  • 參數:

    • tableName:表名

    • data(Object or Array):插入的數據,多條數據請傳入數組類型

  • 示例:

   //插入單條

   db.insert('testTable',{

       name:'商品1',

       price:10

   })

   //插入多條

   db.insert('testTable',[

       {name:'商品1',price:10},

       {name:'商品2',price:20},

       {name:'商品3',price:30},

   ])

將數據存入數據庫的常規流程是先createTable,然后再insert,如果你覺得這樣麻煩,可以試一下create方法:

create

  • 功能:直接創建數據庫并存入數據

  • 注意:類庫會根據傳入的數據類型自動設置數據庫的字段類型,這樣可以覆蓋大多數需求,但如果你的數據中,同一個字段中有不同的數據類型,有可能不能兼容,建議還是使用常規流程手動設置類型

  • 語法:create(tableName,data)

  • 參數:

    • tableName:表名

    • data(Object or Array):插入的數據,多條數據請傳入數組類型

  • 示例:

   //直接創建表并存儲

   db.create('testTable',[

       {name:'商品1',price:10},

       {name:'商品2',price:20},

       {name:'商品3',price:30},

   ])

delete

  • 功能:刪除數據

  • 語法:delete(tableName,condition)

  • 參數:

    • tableName:表名

    • condition(String or Obejct):查詢條件

  • 示例:

   //刪除一條數據

   db.delete('testTable',{name:'商品1'})

關于condition: 1、傳入array形式時,默認查詢條件連接方式是AND,如果需要用OR等方式,可以在condition中傳入 logic設定,例如{ logic:'OR'} 2、如果查詢條件有AND、OR等多種方式,建議使用string方式傳入

select

  • 功能:查詢數據

  • 注意:如果需要多表查詢,可參照query方法

  • 語法:select(tableName,condition = '',fields = '*',order = '',group = '',limit = '')

  • 參數:

    • tableName:表名

    • condition(String or Obejct):查詢條件

    • fields(String or Array):返回字段,默認*,支持distinct

    • order(String or Array):排序規則

    • group(String or Array):分組規則

    • limit(String or Array):分頁規則

  • 示例:

   //查詢name=商品1的數據,并按照price倒序

   db.select('testTable',{

         name:'商品1'

     },'*','price desc')

 

   //查詢價格大于0的商品,并用distinct關鍵字去重

   db.select('testTable',{

         price:'>0'

     },'distinct name,pirce','price desc')

update

  • 功能:更新數據

  • 語法:update(tableName,data,condition = '')

  • 參數:

    • tableName:表名

    • data(String or Obejct):更改數據

    • condition(String or Obejct):查詢條件

  • 示例:

   //將商品1的價格改為99

   db.update('testTable',{

         price:99

     },{

         name:'商品1'

   })

truncate

  • 功能:清空表

  • 語法:truncate(tableName)

  • 參數:

    • tableName:表名

drop

  • 功能:刪除表

  • 語法:drop(tableName)

  • 參數:

    • tableName:表名

如何使用Database.js

Github地址:https://github.com/zhangsuoyong/Database.js

如果你有更好的想法,歡迎與我交流,個人微信號:king109400214

責任編輯:張燕妮 來源: king109400214
相關推薦

2022-03-13 23:26:29

JavaScript編程語言開發

2021-09-16 09:38:12

開發項目代碼

2013-08-20 09:36:40

易信革命前行

2022-11-14 21:34:17

2023-03-17 16:02:36

2022-10-30 17:32:25

設計模式單例模式

2023-10-30 07:13:56

2018-12-04 13:30:28

Javascript編譯原理前端

2011-05-25 17:17:54

前端開發

2022-06-28 10:58:48

協議通信加密

2023-04-26 08:43:28

GoCGO語言

2022-08-23 08:53:31

Go項目語言

2020-07-31 13:35:34

Node.js應用分析前端

2025-07-01 10:00:00

forEachawait

2025-09-04 10:29:04

VueCSS

2012-12-20 09:28:18

2017-06-12 10:50:20

2015-10-15 09:53:46

SQL恢復

2017-01-16 13:26:39

2017寫前端

2024-09-29 18:04:10

點贊
收藏

51CTO技術棧公眾號

毛片不卡一区二区| 亚洲最好看的视频| 亚洲最新在线观看| 国产精品一区二区不卡视频| 亚洲欧美精品一区二区三区| 精品国产精品国产偷麻豆| 91.成人天堂一区| 日韩视频在线视频| www 日韩| 成人国产亚洲欧美成人综合网 | 麻豆亚洲av熟女国产一区二 | 国产精品亲子伦av一区二区三区| 亚洲六月丁香色婷婷综合久久 | 国产女人18毛片水18精品| 澳门黄色一级片| 国产精品亚洲片在线播放| 欧美一级夜夜爽| 久久综合久久色| 丁香花电影在线观看完整版| 国产精品毛片高清在线完整版| 国产精选在线观看91| 一区二区三区午夜| 老鸭窝亚洲一区二区三区| 欧美成人四级hd版| 五月婷婷婷婷婷| 久久av资源| 精品国产乱码久久久久久蜜臀| 777视频在线| 涩涩在线视频| 亚洲va欧美va天堂v国产综合| 亚洲国产精品视频一区| 日本午夜在线| 99精品久久只有精品| 97se国产在线视频| 亚洲一级黄色大片| 日韩电影免费在线看| 午夜精品一区二区三区在线视| 日韩欧美国产成人精品免费| 亚洲人和日本人hd| 日韩精品在线免费| 99免费观看视频| 97久久亚洲| 日韩午夜在线播放| 亚洲一区二区图片| 精品入口麻豆88视频| 欧美男同性恋视频网站| 在线免费视频a| 久久毛片亚洲| 色欧美片视频在线观看在线视频| 毛片在线视频播放| 涩涩视频在线| 色狠狠桃花综合| 最近免费中文字幕中文高清百度| 中文在线免费二区三区| 色婷婷狠狠综合| www.四虎成人| 播放一区二区| 欧美三级午夜理伦三级中视频| 日本熟妇人妻中出| 国产一区影院| 91精品国产一区二区三区| 日本激情视频在线| 国产第一亚洲| 91精品国产入口| 中文字幕制服丝袜| 国产精品久久久久av蜜臀| 亚洲国产精品成人一区二区| a级在线观看视频| 亚洲人成精品久久久| 国产亚洲欧洲高清| 极品色av影院| 欧美日韩中文| 欧美一区二区三区图| 波多野结衣爱爱| 国产主播一区二区| 国产91精品一区二区绿帽| 天堂网2014av| 欧美激情一区二区在线| 日韩video| 国内激情视频在线观看| 91黄色小视频| 特种兵之深入敌后| 欧美亚洲tv| 少妇高潮久久久久久潘金莲| 欧美国产精品一二三| 国产日韩综合| 国产欧美一区二区三区久久人妖| www.成人在线观看| 久久午夜国产精品| 天天爱天天做天天操| 超碰中文在线| 欧美日韩一区二区三区免费看| 精产国品一二三区| 九一成人免费视频| 欧美成在线视频| 97久久久久久久| 激情图片小说一区| 精品久久一区二区三区蜜桃| 婷婷在线视频| 欧美日韩午夜剧场| 亚洲精品免费一区亚洲精品免费精品一区 | 欧美三级三级| 欧美激情久久久| 国产一级片免费视频| 成人av资源站| 亚洲天堂av免费在线观看| 欧美a级在线观看| 欧美日韩精品免费观看视频| 最近中文字幕无免费| 国产精品久久久久9999赢消| 91超碰中文字幕久久精品| 国产乱色精品成人免费视频| 久久影院视频免费| 国产九色porny| **日韩最新| 夜夜嗨av色一区二区不卡| 精品亚洲永久免费| 精油按摩中文字幕久久| 欧美一区二区三区在线播放| 24小时免费看片在线观看| 欧美精品v国产精品v日韩精品 | 久热在线视频观看| 精品在线手机视频| 97精品久久久中文字幕免费| 国产情侣av在线| 亚洲国产精品精华液ab| 欧美日韩在线中文| 老牛国内精品亚洲成av人片| 欧美日本高清视频| 国产精品视频第一页| 国产精品色噜噜| 黄色a级片免费| 亚洲亚洲免费| 欧美怡春院一区二区三区| 日批免费在线观看| 亚洲国产欧美另类丝袜| 国产在线a视频| 欧美1区2区视频| 91情侣偷在线精品国产| 日本美女高清在线观看免费| 欧美影视一区二区三区| 蜜桃无码一区二区三区| 免费久久99精品国产自在现线| 精品欧美日韩| 2021天堂中文幕一二区在线观| 精品成人a区在线观看| 欧产日产国产v| 国产99久久久国产精品潘金网站| 中文字幕在线中文| 日韩中文字幕| 欧美黑人视频一区| 女人18毛片水真多18精品| 亚洲国产一区二区视频| www.17c.com喷水少妇| 伊人天天综合| 欧美视频观看一区| 先锋欧美三级| 久久精品国产久精国产一老狼| 国产精品久久免费| 亚洲一二三四在线观看| 欧美双性人妖o0| 国产一级久久| 亚洲日本欧美在线| 精品视频91| 91成人国产在线观看| 国产系列电影在线播放网址| 在线视频国内自拍亚洲视频| 麻豆一区在线观看| 国产精品一区三区| 久色视频在线播放| 成人a'v在线播放| 91精品综合视频| 国产后进白嫩翘臀在线观看视频| 日韩成人在线视频| 五月天中文字幕| 亚洲精品成人少妇| 99re久久精品国产| 日韩精品一二区| a级网站在线观看| 麻豆视频一区| 国产精品一区二区三区久久| 91最新在线视频| 日韩av最新在线| 一级特黄aaa大片| 亚洲成a人v欧美综合天堂 | 亚洲精品久久久蜜桃| 星空大象在线观看免费播放| 日韩电影在线一区| 日本阿v视频在线观看| 青青视频一区二区| 成人久久18免费网站图片| gogo高清在线播放免费| 一区二区三区视频观看| 国 产 黄 色 大 片| 欧美丝袜自拍制服另类| 精品在线视频观看| 国产精品三级在线观看| 欧美无人区码suv| 国产一区二区在线免费观看| 国自产拍偷拍精品啪啪一区二区| 手机在线一区二区三区| 精品福利影视| 欧美a级大片在线| 国产成人+综合亚洲+天堂| 97caopron在线视频| 永久555www成人免费| 天天干天天舔天天射| 欧美一区二区三区男人的天堂| 尤物视频免费观看| 亚洲丶国产丶欧美一区二区三区| 911国产在线| 久久久久国产成人精品亚洲午夜| 日本少妇xxxx软件| 狠狠色丁香久久婷婷综合丁香| 免费无码国产v片在线观看| 欧美三级第一页| 中文字幕久久综合| 欧美老女人另类| 麻豆亚洲一区| 久久综合社区| 国产传媒一区二区| 欧美日本三级| 成人精品一区二区三区| 国产国产一区| 国产精品第一第二| 第84页国产精品| 911国产网站尤物在线观看| 日本三级在线观看网站| 大胆人体色综合| 成人黄视频在线观看| 视频在线一区二区| 99青草视频在线播放视| 尤物精品国产第一福利三区| 黄色毛片在线看| 亚洲欧美一区二区三区久久| 人妻一区二区三区四区| 欧美精品一区在线观看| 亚洲va久久久噜噜噜无码久久| 欧美一级淫片007| 国产麻豆精品一区| 91麻豆精品国产91久久久 | 中文字幕人成一区| 日韩免费特黄一二三区| 日韩免费电影一区二区| 欧美日韩老妇| 午夜精品一区二区在线观看| 日韩av大片| 在线视频不卡国产| 久久久9色精品国产一区二区三区| 中文字幕av日韩精品| 欧美aaaa视频| 一本—道久久a久久精品蜜桃| 国产精品精品国产一区二区| 99re6这里有精品热视频| 欧美大片专区| 人妻夜夜添夜夜无码av| 国产欧美激情| www.涩涩涩| 国模一区二区三区白浆 | 久久奇米777| 阿v天堂2014| 亚洲欧洲韩国日本视频| 全网免费在线播放视频入口 | 国产主播自拍av| 国产精品久久777777毛茸茸 | 欧日韩免费视频| 99亚洲视频| wwwwxxxx日韩| 国产精品99久久不卡二区| 亚洲欧美高清在线| 国产亚洲一区二区三区四区| 人与动物性xxxx| 亚洲午夜久久久久中文字幕久| 免费观看一区二区三区毛片| 欧美影院午夜播放| 亚洲AV无码一区二区三区少妇| 亚洲精品xxxx| se在线电影| 久久久亚洲精选| 日本精品网站| av日韩免费电影| 美女久久久久| 亚洲国产精品女人| 国产欧美欧美| 天天操精品视频| 久久只精品国产| av激情在线观看| 色婷婷久久久综合中文字幕| 99国产精品99| 亚洲香蕉成人av网站在线观看| 麻豆网在线观看| 欧美在线一级va免费观看| 亚洲综合资源| 欧美人xxxxx| 欧美日韩一区自拍| 日韩精品你懂的| 99re亚洲国产精品| 精品国产欧美日韩不卡在线观看| 精品久久久国产| 国产美女三级无套内谢| 亚洲欧美中文日韩在线| 久草在线新免费首页资源站| 国产精品狼人色视频一区| 懂色av一区二区| 日韩中文在线字幕| 青青草原综合久久大伊人精品优势| 伊人av在线播放| 中文字幕一区日韩精品欧美| 国产精品第5页| 亚洲精品在线观看视频| 国产精品va在线观看视色| 国产精品福利无圣光在线一区| 国产精品男女| 国产精品日韩三级| 久久成人精品无人区| 中文字幕网站在线观看| 精品国产精品三级精品av网址| 超碰在线人人干| 久久精品精品电影网| 99只有精品| 日本一区二区三区免费观看| 在线视频免费在线观看一区二区| 美女日批在线观看| 亚洲欧美日韩一区二区| 在线不卡免费视频| 正在播放亚洲1区| 美女一区网站| 开心色怡人综合网站| 9国产精品视频| 四虎精品一区二区| 亚洲一区在线观看视频| 精品国产18久久久久久| 久久久黄色av| 国产精品国产亚洲精品| 中国成人在线视频| 久久99精品国产.久久久久久 | 可以直接在线观看的av| 日本sm极度另类视频| 小嫩嫩12欧美| 欧美成人免费高清视频| 久久精品一区八戒影视| 欧美一区二区三区网站| 亚洲图中文字幕| 国产在线|日韩| 日韩精品成人一区二区在线观看| 免费在线成人| 人人爽人人爽人人片| 欧美天堂亚洲电影院在线播放| 风间由美一区| 国产日韩精品一区二区| 亚洲色图二区| 成人欧美精品一区二区| 精品日本高清在线播放| 日本啊v在线| 国产精品久久久久久五月尺| 日韩久久久久| 999久久久精品视频| 亚洲自拍偷拍欧美| 日韩有码第一页| 日本精品视频网站| 91亚洲人成网污www| 在线成人免费av| 午夜精品久久久久久久 | 国产精品视频线看| 国产理论视频在线观看| 欧美黄色www| 西野翔中文久久精品字幕| 成人性做爰aaa片免费看不忠| 亚洲欧洲av在线| 成人精品在线播放| 热久久美女精品天天吊色| 日韩精品第一区| 欧美一级片在线免费观看| 精品国产91久久久久久| 亚洲xxxxxx| 国产一区二区三区四区hd| 丝袜美腿亚洲色图| 极品久久久久久| 亚洲精品视频久久| 国产乱码精品一区二区三区亚洲人| www.夜夜爱| 国产欧美精品一区二区三区四区| 国产视频在线观看视频| 91av国产在线| 国产精品99一区二区三| 免费无码一区二区三区| 欧美女孩性生活视频| 国模精品视频| 免费观看中文字幕| 久久免费偷拍视频| 99热这里只有精品66| 青青在线视频一区二区三区| 国产精品成人一区二区不卡| 亚洲精品在线视频免费观看| 欧美日韩免费视频| 性国裸体高清亚洲| 亚洲天堂第一区| 欧美激情一区二区在线| 天堂中文网在线| 3d精品h动漫啪啪一区二区|