vue+elementUi+IndexedDB完整代码浏览器本地存储缓存数据库openaddgetAllopenCursorputdeletewindowobjectStore

Posted web半晨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue+elementUi+IndexedDB完整代码浏览器本地存储缓存数据库openaddgetAllopenCursorputdeletewindowobjectStore相关的知识,希望对你有一定的参考价值。

目录


1、main文件

import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue';
// indexedDB数据库
import indexedDB from '@/utils/indexedDB.js';
// 功能模块文件
import functionalModule from '@/utils/index.js';

Vue.prototype.$functionalModule = functionalModule;
Vue.prototype.$indexedDB = indexedDB;
// myDB:数据库 mySurface:数据表 1:数据库版本
indexedDB.openDB('myDB', 'mySurface', 1).then((res) => 
  // 两种方式实现无处访问db实例
  // 封装文件夹时使用
  window.$db = res;
  // 页面单独请求使用
  Vue.prototype.$db = res;
);
Vue.use(ElementUI);
Vue.config.productionTip = false;

// 如果不阻塞
// 页面打开会报错
// 因为数据库实例还未完全创建
setTimeout(() => 
  new Vue(
    render: h => h(App),
  ).$mount('#app');
, 0);

2、indexedDB文件

// 引入elementUi的Message组件
import  Message  from "element-ui";

/*
 * 打开数据库
 * @param object dbName 数据库的名字
 * @param string storeName 仓库名称/表名称
 * @param string version 数据库的版本
 * @return object 该函数会返回一个数据库实例
 */
function openDB(dbName, storeName, version = 1) 
    return new Promise((resolve, reject) => 
        //  兼容浏览器
        let indexedDB =
            window.indexedDB ||
            window.mozIndexedDB ||
            window.webkitIndexedDB ||
            window.msIndexedDB,
            db;

        // 打开数据库,若没有则会创建
        const request = indexedDB.open(dbName, version);

        // 数据库打开成功回调
        request.onsuccess = function (result) 
            // 数据库对象
            db = result.target.result;
            resolve(db);
        ;

        // 数据库打开失败的回调
        request.onerror = function (result) 
            reject(result);
        ;

        // 数据库有更新时候的回调
        request.onupgradeneeded = function (result) 
            // 数据库创建或升级的时候会触发
            // 数据库对象
            db = result.target.result;
            // 创建存储库/也就是数据表
            let objectStore = db.createObjectStore(storeName, 
                // 这是主键
                // 主键使用的是数据表里的id值
                keyPath: "id",
                // 实现自增
                // autoIncrement: false

                // 如果有keyPath属性
                // 定义autoIncrement属性无效
                // 当没有keyPath属性时
                // 定义autIncrement属性有效
                // 且值必须为true
                // 否则报错
            );

            // 创建索引/属性,在后面查询数据的时候可以根据索引/属性查
            // 不能缺少的索引
            objectStore.createIndex("id", "id",  unique: false );
            objectStore.createIndex("name", "name",  unique: false );
            objectStore.createIndex("age", "age",  unique: false );
        ;
    );


/*
 * 新增数据
 * @param string storeName 仓库名称/表名称
 * @param string data 数据
 */
function addData(storeName, data) 
    return new Promise((resolve, reject) => 
        let request = window.$db
            // 事务对象 指定表格名称和操作模式("只读"或"读写")
            .transaction([storeName], "readwrite")
            // 仓库对象
            .objectStore(storeName)
            .add(data);

        request.onsuccess = function (result) 
            Message(
                message: '添加成功',
                type: 'success'
            );
            resolve(result);
        ;

        request.onerror = function (result) 
            Message(
                message: '添加失败',
                type: 'error'
            );
            reject(result);
        ;
    );


/*
 * 通过getAll读取数据
 * @param string storeName 仓库名称/表名称
 */
function getAll(storeName) 
    return new Promise((resolve, reject) => 
        let request = window.$db
            // 事务
            .transaction(storeName, "readwrite")
            // 仓库对象
            .objectStore(storeName)
            // 指针对象
            .getAll();

        // 游标开启成功,逐行读数据
        request.onsuccess = function (result) 
            Message(
                message: '获取成功',
                type: 'success'
            );
            resolve(result);
        ;

        request.onerror = function (result) 
            Message(
                message: '获取失败',
                type: 'error'
            );
            reject(result);
        ;
    );


/*
 * 通过游标读取数据
 * @param string storeName 仓库名称/表名称
 */
function cursorGetData(storeName) 
    return new Promise((resolve, reject) => 
        let list = [],
            request = window.$db
                // 事务
                .transaction(storeName, "readwrite")
                // 仓库对象
                .objectStore(storeName)
                // 指针对象
                .openCursor();

        // 游标开启成功,逐行读数据
        request.onsuccess = function (result) 
            let cursor = result.target.result;
            if (cursor) 
                // 必须要检查
                list.push(cursor.value);
                // 遍历了存储对象中的所有内容
                cursor.continue();
             else 
                Message(
                    message: '获取成功',
                    type: 'success'
                );
                resolve(list);
            
        ;

        request.onerror = function (result) 
            Message(
                message: '获取失败',
                type: 'error'
            );
            reject(result);
        ;
    );


/*
 * 通过索引和游标查询记录/全值搜索
 * @param string storeName 仓库名称/表名称
 * @param string indexName 索引名/属性名
 * @param string indexValue 索引值/属性值
 */
function fullValueSearch(storeName, indexName, indexValue) 
    return new Promise((resolve, reject) => 
        let list = [],
            // 仓库对象
            request = window.$db
                .transaction(storeName, "readwrite")
                .objectStore(storeName)
                // 索引对象
                .index(indexName)
                // 指针对象
                .openCursor(IDBKeyRange.only(indexValue));

        request.onsuccess = function (result) 
            let cursor = result.target.result;
            if (cursor) 
                // 必须要检查
                list.push(cursor.value);
                // 遍历了存储对象中的所有内容
                cursor.continue();
             else 
                Message(
                    message: '搜索成功',
                    type: 'success'
                );
                resolve(list);
            
        ;

        request.onerror = function (result) 
            Message(
                message: '搜索失败',
                type: 'error'
            );
            reject(result);
        ;
    );


/*
 * 通过getAll实现模糊查找/查询/搜索/分页
 * @param string storeName 仓库名称/表名称
 * @param string searchName 搜索的字段/属性
 * @param string searchValue 搜索的值
 * @param string page 当前页数
 * @param string pageSize 每页大小
 */
function vagueLookup(storeName, searchName, searchValue, page, pageSize) 
    return new Promise((resolve, reject) => 
        let list = [],
            total = 0,
            len = 0,
            request = window.$db
                // 事务
                .transaction(storeName, "readwrite")
                // 仓库对象
                .objectStore(storeName)
                // 指针对象
                .getAll();

        request.onsuccess = function (result) 
            let res = result.target.result;
            Message(
                message: '查询成功',
                type: 'success'
            );
            // 倒序b-a
            res = res.sort((a, b) => new Date(b.updateDate) - new Date(a.updateDate));
            // 总数
            total = res.length;

            // 搜索
            if (searchValue != '') 
                res.forEach(item =>  if (item[searchName].indexOf(searchValue) !== -1) list.push(item); );
             else 
                // 正常请求数据
                list = res;
            

            // 每页大小
            // 如果大小大于数组长度
            // 就使用数组长度
            len = list.length > pageSize ? pageSize : list.length;
            // 第几页
            page = page == 1 ? 0 : (page - 1) * pageSize;

            resolve(
                total,
                list: list.splice(page, len)
            );
        ;

        request.onerror = function (result) 
            Message(
                message: '查询失败',
                type: 'error'
            );
            reject(result);
        ;
    );


/*
 * 更新数据
 * @param string storeName 仓库名称/表名称
 * @param object data 数据
 */
function updateDB(storeName, data) 
    return new Promise((resolve, reject) => 
        let request = window.$db
            // 事务对象
            .transaction([storeName], "readwrite")
            // 仓库对象
            .objectStore(storeName)
            .put(data);

        request.onsuccess = function (result) 
            Message(
                message: '更新成功',
                type: 'success'
            );
            resolve(result);
        ;

        request.onerror = function (result) 
            Message(
                message: '更新失败',
                type: 'error'
            );
            reject(result);
        ;
    );


/*
 * 通过主键删除数据
 * @param string storeName 仓库名称/表名称
 * @param object id 主键值
 */
function deleteDB(storeName, id) 
    return new Promise((resolve, reject) => 
        let request = window.$db
            .transaction([storeName], "readwrite")
            .objectStore(storeName)
            .delete(id);

        request.onsuccess = function (result) 
            Message(
                message: '删除成功',
                type: 'success'
            );
            resolve(result);
        ;

        request.onerror = function (result) 
            Message(
                message: '删除失败',
                type: 'error'
            );
            reject(result);
        ;
    );


let indexedDB = 
    deleteDB,
    updateDB,
    vagueLookup,
    fullValueSearch,
    cursorGetData,
    getAll,
    addData,
    openDB,
;

export default indexedDB;

3、使用

3.1、查/删

methods: 
	// 清空搜索框
	inputSearch(event) 
		if (!event) this.getData();
	,
	
	// 搜索
	async clickSearc() 
		if (!this.searchName.replace(/\\s*/g, "")) return this.$message.warning("请输入内容");
		
		// 通过getAll实现模糊查找/查询/搜索/分页
		this.getData();
		
		// 通过索引和游标查询记录/全值搜索
		// this.dataList = await this.$indexedDB.fullValueSearch(
		//   "mySurface",
		//   "name",
		//   searchName
		// );
		
		this.total = this.dataList.length;
	,
	
	// 删除
	clickDelete(row) 
		this.$confirm("此操作将永久删除该数据, 是否继续?", "删除数据", 
			confirmButtonText: "确定",
			cancelButtonText: "取消",
			type: "warning",
		)
		.then(() => 
			this.$indexedDB.deleteDB("mySurface", row.id);
			this.getData();
		)
		.catch(() => 
			this.$message(
				type: "info",
				message: "已取消删除",
			);
		);
	,
	
	// 获取数据
	async getData() 
		// 通过getAll实现模糊查找/查询/搜索/分页
		let  total, list  = 以上是关于vue+elementUi+IndexedDB完整代码浏览器本地存储缓存数据库openaddgetAllopenCursorputdeletewindowobjectStore的主要内容,如果未能解决你的问题,请参考以下文章

从 indexedDB 在 Vue 中返回未定义的数组

Vue2.0+ElementUI实现表格翻页

Laravel9+Vue+ElementUI管理后台源码

一款Laravel9+Vue+ElementUI后台管理框架

Laravel9+Vue+ElementUI后台快速开发框架

Laravel9+Vue+ElementUI入门基础框架搭建