基于IndexedDB的HTML5数据库列表设计与实现

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="../lib/bootstrap.css" />
</head>
<style>
    .container {
        width: 1000px;
    }

    .info {
        margin-top: 20px;
    }

    .itemList {
        margin-left: 50px;
    }

    .item {
        margin-top: 5px;
    }

    .info .btn-info {
        width: 70px;
        margin: 10px 0 10px 130px;
    }

    .btn-success {
        margin-bottom: 5px;
    }
</style>

<body>
    <div class="container">
        <fieldset class="info">
            <legend>学生成绩信息</legend>
            <div class="itemList">
                <div class="item">
                    <label for="stuNo">学号:</label><input type="text" id="stuNo">
                </div>
                <div class="item">
                    <label for="stuName">姓名:</input></label><input type="text" id="stuName">
                </div>
                <div class="item">
                    <label for="stuClass">班级:</label><input type="text" id="stuClass">
                </div>
                <div class="item">
                    <label for="course">课程:</label><input type="text" id="course">
                </div>
                <div class="item">
                    <label for="birth">生日:</label><input type="text" id="birth">
                </div>
                <div class="item">
                    <label for="score">成绩:</label><input type="text" id="score">
                </div>
            </div>
            <button class="btn btn-info" onclick="save()">保存</button>
        </fieldset>
        <div class="show">
            <button class="btn btn-success" onclick="queryAll()">查询所有</button>
            <table class="table table-striped table-dark">
                <thead>
                    <tr>
                        <th scope="col">#</th>
                        <th scope="col">学号</th>
                        <th scope="col">姓名</th>
                        <th scope="col">班级</th>
                        <th scope="col">课程</th>
                        <th scope="col">生日</th>
                        <th scope="col">成绩</th>
                        <th scope="col">操作</th>
                    </tr>
                </thead>
                <tbody class="tbody">

                </tbody>
            </table>
        </div>
    </div>
</body>
<script>
    //获取所有input盒子
    const inputs = document.querySelectorAll('input')
    let tbody = document.querySelector('.tbody')//获取元素
    let bool = false//控制更新阀门
    let sid = ''//存储 key值
    //打开数据库
    function openDB() {
        let db = null
        let req = indexedDB.open('mydb')

        return new Promise((resolve, reject) => {
            req.onerror = () => {
                console.log('打开/创建失败')
                reject('打开/创建失败')
            }
            req.onsuccess = (e) => {
                db = e.target.result
                console.log('打开成功')
                resolve(db)
            }
            req.onupgradeneeded = (e) => {
                db = e.target.result
                if (!db.objectStoreNames.contains('students')) {
                    //返回对象仓库
                    let store = db.createObjectStore('students', { keyPath: 'sid', autoIncrement: true })
                    //创建唯一索引 学号
                    store.createIndex('stuNo', 'stuNo', { unique: true })
                    //关闭数据库
                    db.close()
                }
            }
        })
    }
    //保存学生信息
    function save(e) {
        //打开数据库
        let result = openDB().then((db) => {
            //存储学生信息对象
            let datas = {}
            //获取input值
            for (let i of inputs) {
                datas[i.id] = i.value
            }
            //学号必填
            if (!datas.stuNo) return
            //添加事务
            let tx = db.transaction('students', "readwrite");
            let store = tx.objectStore('students');
            let reqAdd
            //保存数据
            if (!bool) {//添加数据
                reqAdd = store.add(datas)
            } else {//修改数据
                datas.sid = sid * 1
                reqAdd = store.put(datas);
            }
            reqAdd.onsuccess = e => {
                console.log("添加数据成功");
            };
            reqAdd.onerror = e => {
                console.log("添加数据失败");
            }
            //重置表单
            for (let a of inputs) {
                a.value = ''
            }
            bool = false
            //关闭数据库
            db.close()
        })
        //若已经查询所有 再次创建更新数据
        if (tbody.children.length > 0) {
            queryAll()
        }
    }
    //查询学生信息
    function queryAll() {
        //每次点击先清空
        tbody.innerHTML = ''
        //打开数据库
        let result = openDB().then((db) => {
            //开启事务
            let tx = db.transaction('students', "readwrite");
            //获取对象仓库
            let store = tx.objectStore('students');
            //创建游标
            let curReq = store.openCursor()
            //游标请求成功
            curReq.onsuccess = function (e) {
                //游标变量
                let cursor = this.result
                //获取游标的值
                if (cursor) {
                    // console.log(cursor.value)
                    let { value } = cursor
                    //将数据挂载到dom上
                    tbody.innerHTML += ` <tr>
                        <th scope="row">${value.sid}</th>
                        <td>${value.stuNo}</td>
                        <td>${value.stuName}</td>
                        <td>${value.stuClass}</td>
                        <td>${value.course}</td>
                        <td>${value.birth}</td>
                        <td>${value.score}</td>
                        <td>
                            <button type="button" class="btn btn-info" onclick="Thedelete(event)">删除</button>
                            <button type="button" class="btn btn-info" onclick="change(event)">修改</button>
                        </td>
                        </tr>`
                    cursor.continue()//获取成功移到下一个
                } else {//数据没有了
                    console.log('游标数据结束')
                }
            }
            //关闭数据库
            db.close()
        })
    }
    //修改某行数据
    function change(e) {
        //拿到当前行的 sid
        // console.log(e.target.parentNode.parentNode.children[0].innerHTML)
        sid = e.target.parentNode.parentNode.children[0].innerHTML
        bool = true//更新开启
        let result = openDB().then((db) => {
            //开启事务
            let tx = db.transaction('students', "readwrite");
            //获取对象仓库
            let store = tx.objectStore('students');
            let obj = store.get(sid * 1)//拿到点击数据对象
            obj.onsuccess = () => {
                //将数据放在input里
                for (let a of inputs) {
                    a.value = obj.result[a.id]
                }
                //关闭数据库
                db.close()
            }
        })
    }
    //删除某行数据
    function Thedelete(e) {
        let sid = e.target.parentNode.parentNode.children[0].innerHTML//获取key值
        let result = openDB().then((db) => {
            //开启事务
            let tx = db.transaction('students', "readwrite");
            //获取对象仓库
            let store = tx.objectStore('students');
            let delReq = store.delete(sid * 1)//删除数据
            delReq.onsuccess = () => {
                //更新数据
                queryAll()
                //关闭数据库
                db.close()
            }
        })
    }
</script>

</html>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值