浏览器自带的IndexDB的简单使用示例--小型学生管理系统

news2024/11/17 22:38:38

浏览器自带的IndexDB的简单使用示例--小型学生管理系统

    • 文章说明
    • 代码
    • 效果展示

文章说明

本文主要为了简单学习IndexDB数据库的使用,写了一个简单的增删改查功能

代码

App.vue(界面的源码)

<template>
  <div style="padding: 30px">
    <el-button type="primary" @click="openAddDialog" style="float: left; margin-bottom: 20px; margin-right: 20px">新增
    </el-button>
    <el-input placeholder="输入姓名查找" v-model="data.nameSearchInput" @change="findAllData"
              style="float: left; width: 400px; margin-bottom: 20px"/>

    <el-table
        :data="data.dataList"
        border
        style="width: 100%"
        :header-cell-style="{ 'text-align': 'center' }"
        :cell-style="{ 'text-align': 'center' }"
    >
      <el-table-column prop="id" label="编号"/>
      <el-table-column prop="name" label="姓名"/>
      <el-table-column prop="age" label="年龄"/>
      <el-table-column prop="sex" label="性别"/>
      <el-table-column prop="tel" label="电话"/>
      <el-table-column label="操作">
        <template #default="scope">
          <el-popconfirm
              title="确定修改该菜单吗?"
              @confirm="openEditDialog(scope.row)"
          >
            <template #reference>
              <el-button size="small" type="danger">修改</el-button>
            </template>
          </el-popconfirm>
          <el-popconfirm
              title="确定删除该菜单吗?"
              @confirm="handleDelete(scope.row)"
          >
            <template #reference>
              <el-button size="small" type="danger">删除</el-button>
            </template>
          </el-popconfirm>
        </template>
      </el-table-column>
    </el-table>

    <el-dialog v-model="data.addDialogVisible" title="修改" width="30%">
      <el-input
          v-model="data.form.name"
          placeholder="姓名"
          maxlength="50"
          style="margin-bottom: 20px"
      />
      <el-input
          v-model="data.form.age"
          placeholder="年龄"
          maxlength="50"
          style="margin-bottom: 20px"
      />
      <el-input
          v-model="data.form.sex"
          placeholder="性别"
          maxlength="50"
          style="margin-bottom: 20px"
      />
      <el-input
          v-model="data.form.tel"
          placeholder="电话"
          maxlength="50"
          style="margin-bottom: 20px"
      />
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="data.addDialogVisible = false">Cancel</el-button>
          <el-button type="primary" @click="insertData">Confirm</el-button>
        </span>
      </template>
    </el-dialog>

    <el-dialog v-model="data.editDialogVisible" title="修改" width="30%">
      <el-input
          v-model="data.form.name"
          placeholder="姓名"
          maxlength="50"
          style="margin-bottom: 20px"
      />
      <el-input
          v-model="data.form.age"
          placeholder="年龄"
          maxlength="50"
          style="margin-bottom: 20px"
      />
      <el-input
          v-model="data.form.sex"
          placeholder="性别"
          maxlength="50"
          style="margin-bottom: 20px"
      />
      <el-input
          v-model="data.form.tel"
          placeholder="电话"
          maxlength="50"
          style="margin-bottom: 20px"
      />
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="data.editDialogVisible = false">Cancel</el-button>
          <el-button type="primary" @click="updateData">Confirm</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>

<script>
import {onBeforeMount, reactive} from "vue";
import {db_operation, message} from "@/db_operation";

export default {
  name: "App",
  setup() {
    const data = reactive({
      dbName: "bbyh",
      tableName: "user",
      fieldList: ["id", "name", "age", "sex", "tel"],
      dataList: [],
      nameSearchInput: "",
      form: {
        id: 0,
        name: "",
        age: "",
        sex: "",
        tel: ""
      },
      addDialogVisible: false,
      editDialogVisible: false,
    });

    onBeforeMount(() => {
      db_operation.open(data.dbName, data.tableName, data.fieldList);
      setTimeout(() => {
        findAllData();
      }, 1000);
    });

    function findAllData() {
      data.dataList = [];
      db_operation.findAllData((event) => {
        const row = event.target["result"];
        if (row) {
          if (row.value["name"].indexOf(data.nameSearchInput.trim()) > -1) {
            data.dataList.push(row.value);
          }
          row.continue();
        }
      });
    }

    function openAddDialog() {
      data.form.name = "";
      data.form.age = "";
      data.form.sex = "";
      data.form.tel = "";
      data.addDialogVisible = true;
    }

    function openEditDialog(row) {
      data.form.id = row.id;
      data.form.name = row.name;
      data.form.age = row.age;
      data.form.sex = row.sex;
      data.form.tel = row.tel;
      data.editDialogVisible = true;
    }

    function handleDelete(row) {
      db_operation.delete(row.id);
      findAllData();
    }

    function insertData() {
      if (db_operation.add({
        name: data.form.name.trim(),
        age: data.form.age.trim(),
        sex: data.form.sex.trim(),
        tel: data.form.tel.trim()
      })) {
        data.addDialogVisible = false;
        message("数据添加成功", "success");
        findAllData();
      }
    }

    function updateData() {
      db_operation.update(data.form.id, {
        id: data.form.id,
        name: data.form.name.trim(),
        age: data.form.age.trim(),
        sex: data.form.sex.trim(),
        tel: data.form.tel.trim()
      });
      data.editDialogVisible = false;
      message("数据更新成功", "success");
      findAllData();
    }

    return {
      data,
      findAllData,
      openAddDialog,
      openEditDialog,
      handleDelete,
      insertData,
      updateData,
    }
  }
};
</script>

<style>
* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
}
</style>

IndexDB封装的工具类

import {ElMessage} from 'element-plus';

export function message(msg, type) {
    ElMessage({
        message: msg,
        showClose: true,
        type: type,
        center: true
    })
}

class Db_operation {
    request = undefined;
    db = undefined;
    dbName = undefined;
    tableName = undefined;
    fieldList = undefined;

    open(dbName, tableName, fieldList, version = 1) {
        db_operation.dbName = dbName;
        db_operation.tableName = tableName;
        db_operation.fieldList = fieldList;

        const request = window.indexedDB.open(dbName, version);
        db_operation.request = request;

        request.onsuccess = function (event) {
            db_operation.db = event.target["result"];
        };

        request.onupgradeneeded = function (event) {
            const db = event.target.result;
            db_operation.db = db;

            if (!db.objectStoreNames.contains(tableName)) {
                const objectStore = db.createObjectStore(tableName, {
                    keyPath: "id",
                    autoIncrement: true
                });
                for (let i = 0; i < fieldList.length; i++) {
                    objectStore.createIndex(fieldList[i], fieldList[i]);
                }
            }
        };
    }

    getObjectStore() {
        const transaction = db_operation.db.transaction(db_operation.tableName, "readwrite");
        return transaction.objectStore(db_operation.tableName);
    }

    add(data) {
        if (db_operation.dbName === undefined) {
            message("数据库还未打开", "error");
            return false;
        }
        db_operation.getObjectStore().add(data);
        return true;
    }

    find(field, value, success) {
        if (db_operation.dbName === undefined) {
            message("数据库还未打开", "error");
            return;
        }

        const men = db_operation.getObjectStore().index(field);
        men.get(value).onsuccess = function (event) {
            success(event);
        };
    }

    findAllData(success) {
        if (db_operation.dbName === undefined) {
            message("数据库还未打开", "error");
            return;
        }

        const men = db_operation.getObjectStore().openCursor();
        men.onsuccess = function (event) {
            success(event)
        };
    }

    update(idValue, newData) {
        if (db_operation.dbName === undefined) {
            message("数据库还未打开", "error");
            return;
        }

        const objectStore = db_operation.getObjectStore();
        const men1 = objectStore.get(idValue);
        men1.onsuccess = function () {
            objectStore.put(newData);
        };
    }

    delete(idValue) {
        if (db_operation.dbName === undefined) {
            message("数据库还未打开", "error");
            return;
        }

        const men1 = db_operation.getObjectStore().delete(idValue);
        men1.onsuccess = function () {
            message("删除成功", "success");
        };
    }
}

export const db_operation = new Db_operation();

main.js(引入ElementPlus )

import { createApp } from 'vue'
import App from './App.vue'

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

const app = createApp(App);

app.use(ElementPlus);

app.mount("#app");

效果展示

简单的增删改查演示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1858544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BC64 牛牛的快递(c++)

牛牛的快递 题目描述输入描述输出描述示例代码 解题思路例如 题目描述 牛牛正在寄快递&#xff0c;他了解到快递在 1kg 以内的按起步价 20 元计算&#xff0c;超出部分按每 kg 1元计算&#xff0c;不足 1kg 部分按 1kg计算。如果加急的话要额外付五元&#xff0c;请问牛牛总共要…

GNSS接收机的工作原理

GNSS接收机的工作原理如下&#xff1a; 信号接收&#xff1a;GNSS接收机通过天线接收来自卫星导航系统的信号&#xff0c;这些信号包含卫星的位置、时间和健康状态等信息。 信号处理&#xff1a;接收的信号首先经过前置放大器放大&#xff0c;然后经过滤波器滤除噪声。接收机会…

2024年现代化教育与新媒体发展国际会议(MENMDIC 2024)

2024年现代化教育与新媒体发展国际会议 2024 International Conference on Modern Education and New Media Development 会议简介 2024年现代化教育与新媒体发展国际会议为教育领域的研究者和实践者提供了一个宝贵的学习和交流平台。通过参与本次会议&#xff0c;与会者不仅可…

信息学奥赛初赛天天练-34-CSP-J2021完善程序-按位异或、模拟算法、数组模拟环、约瑟夫问题应用

PDF文档公众号回复关键字:20240624 2021 CSP-J 完善程序3 1 完善程序 (单选题 &#xff0c;每小题3分&#xff0c;共30分) &#xff08;Josephus问题&#xff09;有n个人围成一个圈&#xff0c;依次标号0至n-1。从0号开始&#xff0c;依次 0&#xff0c;1&#xff0c;0&#…

uni-starter:云端一体应用快速开发的新选择

一、引言 随着移动互联网的快速发展&#xff0c;应用开发面临着日益增长的效率挑战。如何在保证应用功能丰富性的同时&#xff0c;快速迭代和上线&#xff0c;成为了众多开发者关注的焦点。在这样的背景下&#xff0c;uni-starter作为一款集成商用项目常见功能的云端一体应用快…

C++初学者指南-2.输入和输出---命令行参数

C初学者指南-2.输入和输出—命令行参数 文章目录 C初学者指南-2.输入和输出---命令行参数1.这是什么&为什么这样&#xff1f;2.如何在C中访问3.转换为std::string、int......4.字符串到数字的转换函数5.命令行参数解析库 1.这是什么&为什么这样&#xff1f; 程序调用后…

Halcon 根据霍夫变换在图像中寻找直线

一 霍夫变换 1 定义 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一.几何形状包括圆&#xff0c;椭圆&#xff0c;直线等等. 2 直线方程 直线的方程可以用yk*xb 来表示&#xff0c;其中k和b是参数&#xff0c;分别是斜率和截距; 3 霍夫变换原理&#xff1a; 设…

本地服务怎么发布成rpc服务

目录 1.引入 2.user.proto 3.userservice.cc 1.引入 example文件夹作为我们框架项目的使用实例&#xff0c;在example文件夹下创建callee和caller两个文件夹 callee是RPC服务的提供者。在callee创建一个文件&#xff1a;userservice.cc 我们有没有这样一个框架&#xff0c;把…

VMware Workstation安装Windows Server2019系统详细操作步骤

虚拟机版本 VMware Workstation 16 Prp 16.2.5 build-20904516 实现操作 创建虚拟机 创建新的虚拟机 自定义->下一步 默认即可&#xff0c;下一步 稍后安装操作系统->下一步 按照图下所示选择好系统->下一步 设置好虚拟机名称和位置->下一步 默认即可&#xff0…

ONLYOFFICE桌面编辑器8.1版:个性化编辑和功能强化的全面升级

ONLYOFFICE是一款全面的办公套件&#xff0c;由Ascensio System SIA开发。该软件提供了一系列与微软Office系列产品相似的办公工具&#xff0c;包括处理文档&#xff08;ONLYOFFICE Document Editor&#xff09;、电子表格&#xff08;ONLYOFFICE Spreadsheet Editor&#xff0…

React+TS 从零开始教程(3):useState

源码链接&#xff1a;下载 在开始今天的内容之前呢&#xff0c;我们需要先看一个上一节遗留的问题&#xff0c;就是给属性设置默认值。 我们不难发现&#xff0c;这个defaultProps已经被废弃了&#xff0c;说明官方并不推荐这样做。其实&#xff0c;这个写法是之前类组件的时候…

Excel 宏录制与VBA编程 —— 12、文本字符串类型相关(附示例)

字符串分割&#xff0c;文末示例&#xff08;文末代码3附有源码&#xff09; 代码1 - 基础字符串 代码2 - 字符串拆分 代码3 - 字符串分割 Option ExplicitSub WorkbooksClear()Dim DataRange As RangeSet DataRange Range("C2:E12")DataRange.Clear End SubSub Wo…

QGIS在VS2019开发

QGIS二次开发&#xff08;1&#xff09;—加载矢量、栅格图层&#xff08;QGIS 2.14.16 && Qt-4.8.6 && VS2010 &#xff09;_qgis开发教程-CSDN博客 VS2019QT5.15.2QGIS二次开发环境搭建&#xff08;非源码方式&#xff09;_qt qgis-CSDN博客 也许面向对象课…

MVVM——CommunityToolKit第三方详情

CommunityToolkit是微软推出的轻量级工具包&#xff0c;它集成了现代、快速和模块化的 MVVM 库。 安装 在NuGet 工具箱上搜索CommunityToolKit进行下载 观测对象 ObservableObject ObservableObject 是通过实现 INotifyPropertyChanged 和 INotifyPropertyChanging 接口可观…

单门户上集成多种数据库查询入口

&#xff08;作者&#xff1a;陈玓玏&#xff09; 开源项目&#xff0c;欢迎star哦&#xff0c;https://github.com/tencentmusic/cube-studio 在一家公司&#xff0c;我们通常会有多种数据库&#xff0c;每种数据库因为其特性承担不同的角色&#xff0c;比如mysql这种轻量…

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇域控系统提权NetLogonADCSPACKDC永恒之蓝CVE漏洞

红队内网攻防渗透 1. 内网横向移动1.1 横向移动-域控提权-CVE-2020-1472 NetLogon1.2 横向移动-域控提权-CVE-2021-422871.3 横向移动-域控提权-CVE-2022-269231.4 横向移动-系统漏洞-CVE-2017-01461.5 横向移动-域控提权-CVE-2014-63241. 内网横向移动 1、横向移动-域控提权-…

LeetCode.32最长有效括号详解

问题描述 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 解题思路1 有效的括号字符串意味着每一个左括号 ( 都可以找到一个相匹配的右括号 )。栈可以帮助我们追踪尚未匹配的括号&#xff0c;并有效地处理…

缓存雪崩、穿透、击穿的概念和如何避免

雪崩 概念 高并发请求多个key&#xff0c;此时多个key同时失效、不在缓存中&#xff0c;请求全部打到数据库&#xff0c;使数据库无法处理这么多的连接&#xff0c;导致数据库死机 如何避免 防止多个key同时过期&#xff0c;设置随机的过期时间不设置过期时间&#xff0c;有…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 08:剩下的就是态度问题

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

chatglm系列知识

一、目录 chatglm 是什么语言模型与transformer decoder 的区别解释prefix LM与Cause LMchatglm&#xff08;prefix LM&#xff09;与decoder-only LM 核心区别glm 架构chatglm 预训练方式chatglm 微调chatglm与chatglm2、chatglm3的区别chatglm 激活函数采用gelu, 为什么chat…