kefu/public/static/common/js/indexedDB.js

311 lines
10 KiB
JavaScript

/**
* 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;
};