forked from ccsens_fe/tall-mui-3
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
5.7 KiB
163 lines
5.7 KiB
import { name } from '@/config/db';
|
|
import { curry } from 'lodash';
|
|
|
|
// 创建表
|
|
const createCollection = (Vue, db) => {
|
|
// projects项目表
|
|
!db.objectStoreNames.contains('projects') && db.createObjectStore('projects', { keyPath: 'id' });
|
|
// roles 角色表
|
|
!db.objectStoreNames.contains('roles') && db.createObjectStore('roles', { keyPath: 'id' });
|
|
// plan_tasks 定期任务
|
|
!db.objectStoreNames.contains('plan_tasks') && db.createObjectStore('plan_tasks', { keyPath: 'id' });
|
|
// fixed_tasks 固定全局任务
|
|
Vue.prototype.$db.fixed_tasks = !db.objectStoreNames.contains('fixed_tasks') && db.createObjectStore('fixed_tasks', { keyPath: 'id' });
|
|
// variable_tasks 可变全局任务
|
|
Vue.prototype.$db.variable_tasks =
|
|
!db.objectStoreNames.contains('variable_tasks') && db.createObjectStore('variable_tasks', { keyPath: 'id' });
|
|
// plugins 插件表
|
|
Vue.prototype.$db.plugins = !db.objectStoreNames.contains('plugins') && db.createObjectStore('plugins', { keyPath: 'id' });
|
|
};
|
|
|
|
/**
|
|
* 新增数据
|
|
*
|
|
* @param {object} db 数据库database
|
|
* @param {string} collection 集合/表
|
|
* @param {object} data 数据
|
|
*/
|
|
const create = (db, collection, data) => {
|
|
return new Promise((resolve, reject) => {
|
|
const request = db.transaction([collection], 'readwrite').objectStore(collection).add(data);
|
|
request.onsuccess = () => resolve();
|
|
|
|
request.onerror = event => {
|
|
const { name, message } = event.target.error;
|
|
if (name === 'ConstraintError') {
|
|
reject('数据已存在');
|
|
} else {
|
|
reject(message);
|
|
}
|
|
};
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 找到1条数据
|
|
*
|
|
* @param {object} db 数据库database
|
|
* @param {string} collection 集合/表
|
|
* @param {string} key 索引关键字 一般是id
|
|
*/
|
|
const findOne = (db, collection, key) => {
|
|
return new Promise((resolve, reject) => {
|
|
const request = db.transaction([collection]).objectStore(collection).get(key);
|
|
request.onerror = event => reject(event.target.error.message);
|
|
request.onsuccess = event => resolve(event.target.result);
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 找到所有数据
|
|
*
|
|
* @param {object} db 数据库database
|
|
* @param {string} collection 集合/表
|
|
*/
|
|
const find = (db, collection) => {
|
|
return new Promise((resolve, reject) => {
|
|
const request = db.transaction(collection).objectStore(collection).openCursor();
|
|
let result = [];
|
|
|
|
request.onerror = event => reject(event.target.error.message);
|
|
request.onsuccess = event => {
|
|
const cursor = event.target.result;
|
|
if (cursor) {
|
|
result.push(cursor.value);
|
|
cursor.continue();
|
|
} else {
|
|
resolve(result);
|
|
}
|
|
};
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 更新数据
|
|
*
|
|
* @param {object} db 数据库database
|
|
* @param {string} collection 集合/表
|
|
* @param {object} newData 新数据
|
|
*/
|
|
const update = (db, collection, newData) => {
|
|
return new Promise((resolve, reject) => {
|
|
const request = db.transaction([collection], 'readwrite').objectStore(collection).put(newData);
|
|
request.onerror = event => reject(event.target.error.message);
|
|
request.onsuccess = () => resolve(newData);
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 移除数据 通过关键字
|
|
*
|
|
* @param {object} db 数据库database
|
|
* @param {string} collection 集合/表
|
|
* @param {string} key 关键字
|
|
*/
|
|
const remove = (db, collection, key) => {
|
|
return new Promise((resolve, reject) => {
|
|
const request = db.transaction([collection], 'readwrite').objectStore(collection).delete(key);
|
|
request.onerror = event => reject(event.target.error.message);
|
|
request.onsuccess = () => resolve();
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 创建索引
|
|
*
|
|
* @param {object} db 数据库database
|
|
* @param {string} collection 集合/表
|
|
* @param {string} field 创建索引的字段名称
|
|
* @param {string} key 关键字
|
|
*/
|
|
const createIndexAndFind = (db, collection, field, key) => {
|
|
return new Promise((resolve, reject) => {
|
|
const store = db.transaction([collection], 'readonly').objectStore(collection);
|
|
store.createIndex(field, field);
|
|
const index = store.index(field);
|
|
const request = index.get(key);
|
|
request.onerror = event => reject(event.target.error.message);
|
|
request.onsuccess = event => resolve(event.target.result);
|
|
});
|
|
};
|
|
|
|
const curriedCreate = curry(create);
|
|
export const curriedFindOne = curry(findOne);
|
|
export const curriedFind = curry(find);
|
|
export const curriedRemove = curry(remove);
|
|
export const curriedUpdate = curry(update);
|
|
export const curriedIndex = curry(createIndexAndFind);
|
|
|
|
const install = Vue => {
|
|
uni.$db = Vue.prototype.$db = {};
|
|
Vue.prototype.$db.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
|
|
const request = Vue.prototype.$db.indexedDB.open(name, Date.now()); // IDBRequest 对象
|
|
request.onerror = error => console.error('打开数据库失败', error);
|
|
request.onsuccess = event => {
|
|
console.log('INDEXED_DB OPEN SUCCESS');
|
|
Vue.prototype.$db.db = event.target.result;
|
|
};
|
|
request.onupgradeneeded = event => {
|
|
console.log('INDEXED_DB OPEN onupgradeneeded');
|
|
Vue.prototype.$db.db = event.target.result;
|
|
// 创建表
|
|
createCollection(Vue, Vue.prototype.$db.db);
|
|
|
|
Vue.prototype.$db.create = curriedCreate(Vue.prototype.$db.db); // create 新增数据,颗粒化以后就不用再传db数据了
|
|
Vue.prototype.$db.findOne = curriedFindOne(Vue.prototype.$db.db); // 查一条
|
|
Vue.prototype.$db.find = curriedFind(Vue.prototype.$db.db); // 查集合里的所有数据
|
|
Vue.prototype.$db.update = curriedUpdate(Vue.prototype.$db.db); // 更新某条数据
|
|
Vue.prototype.$db.remove = curriedRemove(Vue.prototype.$db.db); // 删除某条数据
|
|
// Vue.prototype.$db.createIndex = curriedIndex(Vue.prototype.$db.db); // 创建索引
|
|
};
|
|
};
|
|
|
|
export default { install };
|
|
|