vue中indexDB的应用

Posted 欢欢11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue中indexDB的应用相关的知识,希望对你有一定的参考价值。

// indexedDB.js,浏览器本地数据库操作

export default {
    // indexedDB兼容
    indexedDB: window.indexedDB || window.webkitindexedDB || window.msIndexedDB || mozIndexedDB,
    // 打开数据库
    // 新对象储存空间newStore参数:newStore.name、newStore.key
    // 新增对象存储空间要更改数据库版本
    openDB: function (dbname, version, db, newStore, callback) {
        var version = version || 1;
        var request = this.indexedDB.open(dbname, version);
        request.onerror = function (event) {
            console.log(IndexedDB数据库打开错误);
        };
        request.onsuccess = function (event) {
            db = event.target.result;
            if (callback && (typeof callback === function)) {
                callback(db);
            }
        };
        // onupgradeneeded,调用创建新的储存空间
        request.onupgradeneeded = function (event) {
            var db = event.target.result;
            if (newStore) {
                if (!db.objectStoreNames.contains(newStore.name)) {
                    var objectStore = db.createObjectStore(newStore.name, {
                        keyPath: newStore.key,
                    });
                    objectStore.createIndex(counter_index, counter, { unique: false });
                    objectStore.createIndex(barcode_index, barcode, { unique: false });
                    objectStore.createIndex(qty_index, qty, { unique: false });
                    objectStore.createIndex(counter_code, [counter, barcode], { unique: false });
                }
            }
        };
    },
    // 删除数据库
    deleteDB: function (dbname, callback) {
        var deleteQuest = this.indexedDB.deleteDatabase(dbname);
        deleteQuest.onerror = function () {
            console.log(删除数据库出错);
        };
        deleteQuest.onsuccess = function () {
            if (callback && (typeof callback === function)) {
                callback();
            }
        }
    },
    // 关闭数据库
    closeDB: function (dbname) {
        dbname.close();
        console.log(数据库已关闭);
    },
    // 更新旧值,针对输入数量
    putData: function (db, storename, dataArr, callback) {
        let mybarcode = "";
        let QTY = "";
        let key = "";
        let counter = "";
        let barcode = "";
        let addtime = "";
        dataArr.forEach(item => {
            mybarcode = item.barcode;
            QTY = item.qty;
            barcode = item.barcode;
            counter = item.counter;
            key = item.counterCode;
            addtime = item.addtime;

        });
        this.getdatabycursor(db, storename).then(arr => {
            if (arr.length == 0) {
                //console.log("添加")
                var store = db.transaction(storename, readwrite).objectStore(storename),
                    request;
                for (var i = 0, len = dataArr.length; i < len; i++) {
                    request = store.put(dataArr[i]);
                    request.onerror = function () {
                        console.error(PUT添加数据报错);
                    };
                    request.onsuccess = function (result) {
                        if (callback && (typeof callback === function)) {
                            callback();
                        }
                    };
                }
            }
            else {
                this.read(db, storename, counter, barcode).then(x => {
                    if (x) {
                        //console.log("最新的值是" + QTY)
                        this.updateDataByKey(db, storename, key, QTY, addtime).then(x => {
                            if (callback && (typeof callback === function)) {
                                callback();
                            }

                        });

                    }
                    else {
                        //console.log("再次添加")
                        var store = db.transaction(storename, readwrite).objectStore(storename),
                            request;
                        for (var i = 0, len = dataArr.length; i < len; i++) {
                            request = store.put(dataArr[i]);
                            request.onerror = function () {
                                console.error(PUT添加数据报错);
                            };
                            request.onsuccess = function (result) {
                                if (callback && (typeof callback === function)) {
                                    callback();
                                }
                            };
                        }
                    }
                })
            }
        })
    },
    // 更新旧值
    putDatas: function (db, storename, dataArr, callback) {
        let mybarcode = "";
        let QTY = "";
        let key = "";
        let counter = "";
        let barcode = "";
        let addtime = "";
        dataArr.forEach(item => {
            mybarcode = item.barcode;
            QTY = item.qty;
            key = item.counterCode;
            counter = item.counter;
            barcode = item.barcode;
            addtime = item.addtime;

        });
        this.getdatabycursor(db, storename).then(arr => {
            if (arr.length == 0) {
                //console.log("添加")
                var store = db.transaction(storename, readwrite).objectStore(storename),
                    request;
                for (var i = 0, len = dataArr.length; i < len; i++) {
                    request = store.add(dataArr[i]);
                    request.onerror = function () {
                        console.error(PUT添加数据报错);
                    };
                    request.onsuccess = function (result) {
                        if (callback && (typeof callback === function)) {
                            callback();
                        }
                    };
                }
            }
            else {
                this.read(db, storename, counter, barcode).then(x => {
                    if (x) {
                        this.updateDataByKeys(db, storename, key, addtime).then(x => {
                            this.getdata(db, storename).then(result => {
                                if (callback && (typeof callback === function)) {
                                    callback();
                                }
                            });
                        });

                    }
                    else {
                        //console.log("再次添加")
                        //console.log("当前的值是"+barcode)
                        var store = db.transaction(storename, readwrite).objectStore(storename),
                            request;
                        for (var i = 0, len = dataArr.length; i < len; i++) {
                            request = store.add(dataArr[i]);
                            request.onerror = function () {
                                console.error(PUT添加数据报错);
                            };
                            request.onsuccess = function (result) {
                                if (callback && (typeof callback === function)) {
                                    callback();
                                }
                            };
                        }

                    }
                })
            }
        })
    },
    //根据key修改数量
    updateDataByKey: function (db, storeName, value, QTY, addtime) {
        var transaction = db.transaction(storeName, readwrite);
        var store = transaction.objectStore(storeName);
        var request = store.get(value);
        return new Promise((resolve, reject) => {
            request.onsuccess = function (e) {
                var stocktable = e.target.result;
                if (stocktable) {
                    stocktable.qty = QTY;
                    stocktable.addtime = addtime;
                    resolve(store.put(stocktable));
                }
                else {
                    reject(false);
                }

            };

        })


    },
  
      updateDataBycode: function (db, storeName, value, QTY) {
        var transaction = db.transaction(storeName, readwrite);
        var store = transaction.objectStore(storeName);
        var request = store.get(value);
        return new Promise((resolve, reject) => {
            request.onsuccess = function (e) {
                var stocktable = e.target.result;
                if (stocktable) {
                    stocktable.qty = QTY;
                  
                    resolve(store.put(stocktable));
                }
                else {
                    reject(false);
                }

            };

        })


    },
    //根据key修改数量
    updateDataByKeys: function (db, storeName, value, addtime, callback) {
        var transaction = db.transaction(storeName, readwrite);
        var store = transaction.objectStore(storeName);
        var request = store.get(value);

        return new Promise((resolve, reject) => {
            //console.log(addtime)
            request.onsuccess = function (e) {
                var stocktable = e.target.result;
                if (stocktable) {
                    stocktable.qty += 1;
                    stocktable.addtime = addtime;
                    resolve(store.put(stocktable));
                }
                else {
                    reject(false);
                }

            };
        })

    },
    // 删除数据
    deleteData: function (db, storename, key, callback) {
        var store = db.transaction(storename, readwrite).objectStore(storename);
        store.delete(key);
        if (callback && (typeof callback === function)) {
            callback();
        }

    },
    // 清空数据
    clearData: function (db, storename, callback) {
        var store = db.transaction(storename, readwrite).objectStore(storename);
        store.clear();
        if (callback && (typeof callback === function)) {
            callback();
        }
    },
    // 通过key获取数据
    read: function (db, storeName, counter, barcode) {
        var transaction = db.transaction(storeName);
        var objectStore = transaction.objectStore(storeName);
        var currentdata = [counter, barcode];
        var indexs = objectStore.index(counter_code);
        var request = indexs.openCursor(IDBKeyRange.only(currentdata));
        return new Promise((resolve, reject) => {
            request.onsuccess = function (e) {
                var cursor = e.target.result;
                if (cursor) {
                    resolve(true);
                }
                else {
                    resolve(false);
                }
            }
        })


    },
    // 通过barcode获取数据
    reads: function (db, storeName, values) {
        var transaction = db.transaction(storeName);
        var objectStore = transaction.objectStore(storeName);
        var indexs = objectStore.index(barcode_index);
        var data = [];
        var request = indexs.openCursor(IDBKeyRange.only(values));
        return new Promise((resolve, reject) => {
            request.onsuccess = function (e) {
                var cursor = e.target.result;
                if (cursor) {
                    data.push(cursor.value);
                    // resolve(data);
                    cursor.continue();
                }
                else {
                    resolve(data)
                }
            };
        })

    },
    //根据counter索引查询数据
    getdatabyCounter: function (db, storeName, values) {
        var transaction = db.transaction(storeName);
        var store = transaction.objectStore(storeName);
        var indexs = store.index(counter_index);
        var datas = [];
        var request = indexs.openCursor(IDBKeyRange.only(values))
        return new Promise((resolve, reject) => {
            request.onsuccess = function (e) {
                var cursor = e.target.result;
                if (cursor) {
                    datas.push(cursor.value);
                    cursor.continue();
                }
                else {
                    resolve(datas)
                }
            }
        })


    },
    //根据主键和索引查询
    getAll: function (db, storeName, counter, barcode) {
        var transaction = db.transaction(storeName);
        var objectStore = transaction.objectStore(storeName);
        var counterCode = [counter, barcode];
        var indexs = objectStore.index(counter_code);
        var request = indexs.openCursor(IDBKeyRange.only(counterCode));
        var data = [];
        return new Promise((resolve, reject) => {
            request.onsuccess = function (e) {
                var cursor = e.target.result;
                if (cursor) {
                    data.push(cursor.value);
                    //resolve(data);
                    cursor.continue();
                }
                else {
                    resolve(data)
                }

            }
        })
    },
    //根据key查询数量是否存在
    getqtyBykey: function (db, storeName, key) {
        var transaction = db.transaction(storeName);
        var objectStore = transaction.objectStore(storeName);
        var request = objectStore.get(key);
        request.onerror = function (event) {
            console.log(事务失败);
        };
        return new Promise((resolve, reject) => {
            request.onsuccess = function (event) {
                if (request.result) {
                    //console.log(request.result.qty)
                    resolve(request.result);
                } else {
                    resolve(false);
                }
            };
        })

    },
    // //通过游标遍历数据
    getdatabycursor: function (db, storename) {
        var objectStore = db.transaction(storename).objectStore(storename);
        var dataList = [];
        var i = 0;
        return new Promise((resolve, reject) => {
            objectStore.openCursor().onsuccess = function (event) {
                var cursor = event.target.result;
                if (cursor) {
                    dataList.push(cursor.value)
                    cursor.continue();
                } else {
                    resolve(dataList);
                }

            };
        })

    },
    //查询所有的柜台
    getAllCounter: function (db, storename) {
        var transaction = db.transaction(storename);
        var store = transaction.objectStore(storename);
        var indexs = store.index(counter_index);
        var data = [];
        return new Promise((resolve, reject) => {
            indexs.openCursor().onsuccess = function (e) {
                var cursor = e.target.result;
                if (cursor) {
                    //    console.log(cursor.value.counter);
                    data.push(cursor.value.counter);
                    resolve(data);
                    cursor.continue();
                }
            }
        })
    },
    getdata: function (db, storename) {
        var objectStore = db.transaction(storename).objectStore(storename);
        var data = [];
        return new Promise((resolve, reject) => {
            objectStore.openCursor().onsuccess = function (event) {
                var cursor = event.target.result;
                if (cursor) {
                    data.push(cursor.value)

                    resolve(data)
                }
                else {
                    reject(false)
                }

            };
        })
    },
    getqtybyqtyindex: function (db, storename) {
        var transaction = db.transaction(storename);
        var store = transaction.objectStore(storename);
        var indexs = store.index(qty_index);
        var sum = 0;
        return new Promise((resolve, reject) => {
            indexs.openCursor().onsuccess = function (e) {
                var cursor = e.target.result;
                if (cursor) {
                    sum += cursor.value.qty
                    cursor.continue();
                }
                else {
                    resolve(sum)
                }
            }
        })
    }




}
 handSumit() {
      if (this.barcode == "") {
        this.$createDialog({
          type: "alert",
          content: "條碼為空",
          confirmBtn: "確定",
          icon: "cubeic-alert"
        }).show();
      } else {
        let that = this;
        let Counter = localStorage.getItem("counter");
        let barcodes = this.barcode;
        let shopDB = null;
        let QTY = parseInt(this.qty);
        let CounterCode = Counter + "-" + barcodes;
        var now = new Date();
        this.addtime = now;
        IndexedDB.openDB(
          "shopDB",
          1,
          shopDB,
          {
            name: "stockTable",
            key: "counterCode"
          },
          function(db) {
            let newQty = "";
            IndexedDB.getqtyBykey(db, "stockTable", CounterCode).then(x => {
              if (x == false) {
                let shopDB = db;
                IndexedDB.putDatas(
                  shopDB,
                  "stockTable",
                  [
                    {
                      counterCode: CounterCode,
                      counter: Counter,
                      barcode: barcodes,
                      qty: QTY,
                      addtime: that.addtime
                    }
                  ],
                  function() {
                    that.flag = true;
                    that.getdata();
                    that.serchbyArecode();
                  }
                );
              } else {
                let newCounter = x.counter;
                if (newCounter == Counter) {
                  let oldqty = parseInt(x.qty);
                  let newQty = QTY + oldqty;

                  IndexedDB.putDatas(
                    db,
                    "stockTable",
                    [
                      {
                        counterCode: CounterCode,
                        counter: Counter,
                        barcode: barcodes,
                        qty: newQty,
                        addtime: that.addtime
                      }
                    ],
                    function() {
                      that.flag = true;
                      that.getdata();
                      that.serchbyArecode();
                    }
                  );
                }
              }
            });
          }
        );
        this.barcode = "";
      }
    },

 

以上是关于vue中indexDB的应用的主要内容,如果未能解决你的问题,请参考以下文章

vue —— VSCode代码片段

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段1——vue主模板

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置