/** * indexedDB数据库封装 * @param {*} db_name 数据库名称 * @param {*} table_name 表名称 * @param {*} version 数据库版本 */ var inquiryDB = function (db_name, table_name, version = 1) { if (!db_name) { alert('初始化数据库参数错误'); return false; } // 检测是否支持indexDB var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB; if (!indexedDB) { alert('你的浏览器不支持IndexedDB'); return false; } var obj = new Object(); obj.name = db_name; obj.version = version; obj.max_msg_lengt = 100; obj.db = {}; // 初始化表名 obj.tableName = table_name; /** * 新增一条聊天记录 * @param {*} msg 消息内容 * @param {*} cb 回调 */ obj.addMsg = function (msg, cb) { obj.db = window.indexedDB.open(obj.name, version); obj.db.onsuccess = function (evt) { var db = evt.target.result; //使用事务 var store = db.transaction(obj.tableName, "readwrite").objectStore(obj.tableName); var save = store.add(msg); var index = store.index('uid'); var count = index.count(msg.uid); count.onsuccess = function () { // 删除第一个 if (count.result > obj.max_msg_lengt) { var last = index.getKey(msg.uid); last.onsuccess = function () { store.delete(last.result); } } } cb(save); } } /** * 查询全部聊天记录 * @param {*} cb 回调函数 */ obj.getDataAll = function (cb) { //查询到结果 obj.db = window.indexedDB.open(obj.name, version); obj.db.onsuccess = function (e) { var db = e.target.result; var store = db.transaction(obj.tableName, 'readwrite').objectStore(obj.tableName); var rowData = []; store.openCursor().onsuccess = function (event) { var cursor = event.target.result; if (!cursor && cb) { cb({ data: rowData }); return; } rowData.push(cursor.value); cursor.continue(); }; }; } /** * 根据键查询聊天记录 * @param {*} key 查找键值 * @param {*} cb 回调函数 */ obj.getDataKey = function (key, cb) { //查询到结果 obj.db = window.indexedDB.open(obj.name, version); obj.db.onsuccess = function (e) { var db = e.target.result; var store = db.transaction(obj.tableName, 'readwrite').objectStore(obj.tableName); var res = store.get(key); res.onsuccess = function (event) { var data = event.target.result; cb({ data: data }); }; }; } /** * 根据索引查询聊天记录 * @param {*} indexKey 查找索引 * @param {*} value 查找值 * @param {*} cb 回调函数 */ obj.getDataIndexKeys = function (indexKey, value, cb) { //查询到结果 obj.db = window.indexedDB.open(obj.name, version); obj.db.onsuccess = function (e) { var db = e.target.result; var store = db.transaction(obj.tableName, 'readwrite').objectStore(obj.tableName); var res = store.index(indexKey); res.getAll(value).onsuccess = function (event) { var data = event.target.result; cb({ data: data }); }; }; } /** * 根据索引查询聊天记录 * @param {*} indexKey 查找索引 * @param {*} value 查找值 * @param {*} cb 回调函数 */ obj.getDataIndexKey = function (indexKey, value, cb) { //查询到结果 obj.db = window.indexedDB.open(obj.name, version); obj.db.onsuccess = function (e) { var db = e.target.result; var store = db.transaction(obj.tableName, 'readwrite').objectStore(obj.tableName); var res = store.index(indexKey); res.get(value).onsuccess = function (event) { var data = event.target.result; cb({ data: data }); }; }; } /** * 分页显示数据 * @param {*} page 页数 * @param {*} limit 条数 * @param {*} cb 回调 */ obj.getDataByPager = function (page, limit = 15, indexKey, value, cb) { //查询到结果 obj.db = window.indexedDB.open(obj.name, version); obj.db.onsuccess = function (e) { var db = e.target.result; var store = db.transaction(obj.tableName, 'readwrite').objectStore(obj.tableName); // 数据总数 var res = store.index(indexKey); var count = res.count(value); count.onsuccess = function (c_e) { var totalNum = c_e.target.result; console.log(totalNum, value, indexKey); if (totalNum < 1) return; // 第一个键值 var first_key = res.getKey(value); first_key.onsuccess = function () { var cursor = first_key.result; // 正负容错 limit = totalNum < limit ? totalNum : limit; if (!cursor) { cb({ data: [], total_page: 0, r_page: 0, }); return; } var key = cursor; // 结束点 var end = key + (totalNum - 1) - ((page - 1) * limit); // 起始点 var start = end - (limit - 1) - ((page - 1) * limit); // console.log(c_e); // console.log(start, end, page, limit, key, totalNum); // 分页处理, 获取数据 var boundKeyRange = IDBKeyRange.bound(start, end, false, false); // console.log(boundKeyRange, start, end); var rowData = []; store.openCursor(boundKeyRange).onsuccess = function (event) { var cursor_c = event.target.result; if (!cursor_c && cb) { cb({ data: rowData, total_page: Math.ceil(totalNum / limit), r_page: page, }); return; } rowData.push(cursor_c.value); cursor_c.continue(); }; } } }; } /** * 根据索引修改消息的状态 * @param {*} indexKey 索引 * @param {*} value 索引值 * @param {*} cb 回调函数 */ obj.updateMsgStatus = function (indexKey, value, num, cb) { // console.log(num) //查询到结果 obj.db = window.indexedDB.open(obj.name, version); obj.db.onsuccess = function (e) { var db = e.target.result; var store = db.transaction(obj.tableName, 'readwrite').objectStore(obj.tableName); var index = store.index(indexKey); index.get(value).onsuccess = function (event) { var data = event.target.result; data.received = num var update = store.put(data); update.onsuccess = function () { cb({ status: true, }); }; } }; } /** * 删除聊天记录 * @param {*} indexKey 索引 * @param {*} value 索引值 * @param {*} cb 回调函数 */ obj.delUserData = function (indexKey, value, cb) { //查询到结果 obj.db = window.indexedDB.open(obj.name, version); obj.db.onsuccess = function (e) { var db = e.target.result; var store = db.transaction(obj.tableName, 'readwrite').objectStore(obj.tableName); var index = store.index(indexKey); var keys = index.getAllKeys(value); keys.onsuccess = function () { // console.log(keys.result); for (var i = 0; i < keys.result.length; i++) { var del = store.delete(keys.result[i]); } } }; } /** * 创建表 */ obj.addTable = function (result) { if (!result.objectStoreNames.contains(obj.tableName)) { return result.createObjectStore(obj.tableName, { autoIncrement: true, keyPath: "id", }); } } /** * 删除数据库 */ obj.deleteDB = function (db_name, cb) { var db = window.indexedDB.open(db_name, version); // db.close(); db.onsuccess = function (e) { var db = e.target.result; db.close(); }; var del = window.indexedDB.deleteDatabase(db_name); cb(del); } /** * 创建数据库 */ obj.initDB = function () { var version = obj.version || 1; obj.db = window.indexedDB.open(obj.name, version); obj.db.onerror = function (e) { console.log(e.currentTarget.error.message); }; obj.db.onsuccess = function (e) { // db = e.target.result; console.log('数据库连接成功'); }; obj.db.onupgradeneeded = function (e) { console.log(`数据库版本: ${version}`); var store = obj.addTable(e.target.result); var msg_id_index = store.createIndex('msg_id', 'msg_id', { unique: false }); var uid_index = store.createIndex('uid', 'uid', { unique: false }); }; } // 初始化数据库 obj.initDB(); return obj; };