官方文档:https://www.runoob.com/html/html5-web-sql.html
Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个独立的规范,引入了一组使用 SQL 操作客户端数据库的 APIs。如果你是一个 Web 后端程序员,应该很容易理解 SQL 的操作。你也可以参考我们的 SQL 教程,了解更多数据库操作知识。Web SQL 数据库可以在最新版的 Safari, Chrome 和 Opera 浏览器中工作。
以下是规范中定义的三个核心方法:
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
var msg;
db.transaction(function (tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');
tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "菜鸟教程")');
tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "www.runoob.com")');
msg = '<p>数据表已创建,且插入了两条数据。</p>';
document.querySelector('#status').innerHTML = msg;
});
db.transaction(function (tx) {
tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) {
var len = results.rows.length, i;
msg = "<p>查询记录条数: " + len + "</p>";
document.querySelector('#status').innerHTML += msg;
for (i = 0; i < len; i++){
msg = "<p><b>" + results.rows.item(i).log + "</b></p>";
document.querySelector('#status').innerHTML += msg;
}
}, null);
});
使用 localStorage 创建一个本地存储的 name/value 对,name=“lastname” value=“Smith”, 然后检索 “lastname” 的值,并插入到 id=“result” 的元素上:、
// 存储
localStorage.setItem("lastname", "Smith");
// 检索
document.getElementById("result").innerHTML = localStorage.getItem("lastname");
localStorage 和 sessionStorage 属性允许在浏览器中存储 key/value 对的数据。
localStorage 用于长久保存整个网站的数据,保存的数据没有过期时间,直到手动去删除。
localStorage 属性是只读的。
window.localStorage
保存数据语法:
localStorage.setItem("key", "value");
读取数据语法:
var lastname = localStorage.getItem("key");
删除数据语法:
localStorage.removeItem("key");
新建js文件,单独存放websql相关操作,类似于数据访问层操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dARhH7BK-1619427775097)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210419145144056.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BDze2ebt-1619427775100)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210419145217266.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3i08keoo-1619427775101)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210419145237141.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wf68pHkH-1619427775104)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210419145306701.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nSzVJRK8-1619427775105)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210419145344698.png)]
/**
* WebSql数据访问层
*/
var webSqlDao = {
/* 添加用户信息 */
addEmp(emp,callback){
var sql = "INSERT INTO EMP(ID,NAME,GENDER,TEL,EMAIL,STATUS,AUTH,USER_IMAGE,CREATE_TIME,REMARK) "
+"VALUES(?,?,?,?,?,?,?,?,?,?)";
webSqlDao.dbUtils.execSQL(sql,[emp.ID,emp.NAME,emp.GENDER,emp.TEL,emp.EMAIL,emp.STATUS,emp.AUTH,emp.USER_IMAGE,emp.CREATE_TIME,emp.REMARK],callback);
},
/* 修改用户信息 */
modifyEmp(emp,callback){
var sql = "UPDATE EMP SET NAME=?,GENDER=?,TEL=?,EMAIL=?,STATUS=?,AUTH=?,USER_IMAGE=?,CREATE_TIME=?,REMARK=? WHERE ID=?";
webSqlDao.dbUtils.execSQL(sql,[emp.NAME,emp.GENDER,emp.TEL,emp.EMAIL,emp.STATUS,emp.AUTH,emp.USER_IMAGE,emp.CREATE_TIME,emp.REMARK,emp.ID],callback);
},
/* 删除用户信息 */
removeEmp(id,callback){
var sql = "DELETE FROM EMP WHERE ID=?";
webSqlDao.dbUtils.execSQL(sql,[id],callback);
},
/* 查询所有用户信息*/
listEmps(callback){
var sql = "SELECT * FROM EMP";
webSqlDao.dbUtils.execSQL(sql,[],function(tx,results){
callback(results.rows);
});
},
/* 根据ID查询用户信息*/
listEmpsId(id,callback){
var sql = "SELECT * FROM EMP WHERE ID=?";
webSqlDao.dbUtils.execSQL(sql,[id],function(tx,results){
if(results.rows.length > 0){
callback(results.rows[0]);
}
});
},
/* 数据库操作工具类 */
dbUtils : {
// 打开数据库连接
getConnection(){
var db = openDatabase('test', '1.0', 'Test DB', 2 * 1024 * 1024);
//创建表,字段(id,姓名,性别,电话,电子邮件,状态,权限,头像,创建时间,备注)
db.transaction(function (tx) {
tx.executeSql("CREATE TABLE IF NOT EXISTS EMP(ID unique,NAME,GENDER,TEL,EMAIL,STATUS,AUTH,USER_IMAGE,CREATE_TIME,REMARK)");
})
return db;
},
// 执行sql语句
execSQL(sql,param,callback){
var db = webSqlDao.dbUtils.getConnection();
db.transaction(function (tx) {
tx.executeSql(sql,param,callback,function(e){
console.log(e)
});
})
}
}
}
官方文档:https://www.runoob.com/jsref/prop-win-localstorage.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-STQap9t3-1619427775107)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210419145501053.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N30uebyY-1619427775108)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210419145555936.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ROcaGUbl-1619427775109)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210419145611498.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dl5OLvuv-1619427775109)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210419145629900.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ueOaM2gv-1619427775110)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210419145720135.png)]
新建js文件,调用相应的数据访问层接口
function saveEmp() {
//用户id
var empId = document.getElementById("empId").value;
//用户姓名
var empName = document.getElementById("empName").value;
//用户性别
var empGender = getGenderRadioVal(); //调用函数获取性别
//用户电话
var empTel = document.getElementById("empTel").value;
//用户电子邮件
var empEmail = document.getElementById("empEmail").value;
//用户状态
var empStatus = getStatusRadioVal(); //调用函数获取状态
//用户权限
var empAuth = getAuthCheckboxVal(); //调用函数获取权限
//用户头像
var empImg = document.getElementById("empImg").value;
//用户创建时间
var empCreateTime = document.getElementById("empCreateTime").value;
var nowDate = new Date();
empCreateTime = nowDate.format("yyyy-M-d h:m:s");
//用户备注
var empRemark = document.getElementById("empRemark").value;
//封装对象,将用户信息提交到数据库
var emp = {
ID: empId,
NAME: empName,
GENDER: empGender,
TEL: empTel,
EMAIL: empEmail,
STATUS: empStatus,
AUTH: empAuth,
USER_IMAGE: empImg,
CREATE_TIME: empCreateTime,
REMARK: empRemark
}
//
dao.addEmp(emp, function() {
alert("添加成功");
//添加成功关闭模态框
closeAddDialog()
//回显数据
getListEmps();
})
}
function handleModify(id) {
//1.根据id获取对话框DOM对象
var dialogDOM = document.getElementById("modifyDialog");
//2.设置对象样式
dialogDOM.style.visibility = "visible";
//回显数据
dao.listEmpsId(id + "", function(emps) {
var modifyFromDom = document.modifyForm;
modifyFromDom.id.value = emps.ID;
modifyFromDom.name.value = emps.NAME;
modifyFromDom.gender.value = emps.GENDER;
modifyFromDom.tel.value = emps.TEL;
modifyFromDom.email.value = emps.EMAIL;
modifyFromDom.status.value = emps.STATUS;
modifyFromDom.auth.value = emps.AUTH;
modifyFromDom.upload_img.value = emps.USER_IMAGE;
modifyFromDom.create_time.value = emps.CREATE_TIME;
modifyFromDom.remark.value = emps.REMARK;
})
}
function updateEmp() {
var empId = document.getElementById("empIdModify").value;
var empName = document.getElementById("empNameModify").value;
var empGender = getGenderRadioVal();
var empTel = document.getElementById("empTelModify").value;
var empEmail = document.getElementById("empEmailModify").value;
var empStatus = getStatusRadioVal();
var empAuth = getAuthCheckboxVal();
var empImg = document.getElementById("empImgModify").value;
var empCreateTime = document.getElementById("empCreateTimeModify").value;
var empRemark = document.getElementById("empRemarkModify").value;
var emp = {
ID: empId,
NAME: empName,
GENDER: empGender,
TEL: empTel,
EMAIL: empEmail,
STATUS: empStatus,
AUTH: empAuth,
USER_IMAGE: empImg,
CREATE_TIME: empCreateTime,
REMARK: empRemark
}
//
dao.modifyEmp(emp, function() {
alert("修改成功");
//修改成功关闭模态框
closeModifyDialog()
//回显数据
getListEmps();
})
}
function deleteEmpData(id) {
if (confirm("是否删除")) {
dao.removeEmp(id + "", function() {
alert("删除成功");
getListEmps();
})
}
}
function getListEmps() {
dao.listEmps(function(emps) {
//每次数据回显之前清空数据
var tableDOM = document.getElementsByTagName("table")[0];
var rows = tableDOM.rows;
for (var i = 1; i < rows.length;) {
tableDOM.deleteRow(i);
}
//向表格中重新加入数据
for (var i = 0; i < emps.length; i++) {
var row = tableDOM.insertRow(i + 1);
//新建单元格
var idCell = row.insertCell(0);
var nameCell = row.insertCell(1);
var genderCell = row.insertCell(2);
var telCell = row.insertCell(3);
var emailCell = row.insertCell(4);
var statusCell = row.insertCell(5);
var authCell = row.insertCell(6);
var imgCell = row.insertCell(7);
var createTimeCell = row.insertCell(8);
var remarkCell = row.insertCell(9);
var optionCell = row.insertCell(10);
//向单元格中添加数据
idCell.innerHTML = emps[i].ID;
nameCell.innerHTML = emps[i].NAME;
genderCell.innerHTML = emps[i].GENDER;
telCell.innerHTML = emps[i].TEL;
emailCell.innerHTML = emps[i].EMAIL;
statusCell.innerHTML = emps[i].STATUS;
authCell.innerHTML = emps[i].AUTH;
imgCell.innerHTML = emps[i].USER_IMAGE;
createTimeCell.innerHTML = emps[i].CREATE_TIME;
remarkCell.innerHTML = emps[i].REMARK;
optionCell.innerHTML = "<button οnclick='handleModify(" + emps[i].ID +
")'>编辑</button><button οnclick='deleteEmpData(" + emps[i].ID + ")'>删除</button>";
}
})
}
function getEmpByID() {
var empId = document.getElementById("empId").value;
dao.listEmpsId.execSQL(sql, [empId], function() {
return empId;
})
}
根据单选按钮切换数据的存储方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dgdFtLFw-1619427775112)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210419150916778.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GTk7MRVh-1619427775113)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210419150951084.png)]
点击编辑按钮后打开原生模态框,回显数据信息(些许bug未修复),点击删除按钮根据当前ID删除该条数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eTWXaWE5-1619427775114)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210419151331204.png)]
本文仅作为个人学习总结、分享,希望各位大佬前辈可以多多指点,这也是我的第一篇正式博客。
界面或者功能上有很多不足的地方并未修正,这里仅简单实现增删改查功能。
有兴趣的朋友,可以一起交流探讨。如果觉得有用需要源码的朋友可以去我的个人中心免费下载
eturn empId;
})
}
## 三、效果预览
### 1、数据源切换
根据单选按钮切换数据的存储方式
[外链图片转存中...(img-dgdFtLFw-1619427775112)]
[外链图片转存中...(img-GTk7MRVh-1619427775113)]
### 2、编辑效果
点击编辑按钮后打开原生模态框,回显数据信息(些许bug未修复),点击删除按钮根据当前ID删除该条数据
[外链图片转存中...(img-eTWXaWE5-1619427775114)]
## 四、备注说明
1. 本文仅作为个人学习总结、分享,希望各位大佬前辈可以多多指点,这也是我的第一篇正式博客。
2. 界面或者功能上有很多不足的地方并未修正,这里仅简单实现增删改查功能。
3. 有兴趣的朋友,可以一起交流探讨。如果觉得有用需要源码的朋友可以去我的个人中心免费下载
https://download.csdn.net/download/qq_38197458/16754960