311 lines
10 KiB
JavaScript
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;
|
|
}; |