LayUI之CRUD(增删改查)

目录

一、前期准备

1.数据表格

2.弹出层

3.用户表数据查询

 二、用户管理后台编写

三、前端JS编写

四、效果展示


一、前期准备

1.数据表格

在layui官网找到我们需要的数据表格

 根据需求复制修改代码,再找到表单复制一个输入框和按钮,做一个搜索功能

用户管理JSP页面---userManage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ include file="/common/header.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript"src="static/js/system/userManage.js"></script>
</head>
<body><!-- 搜索栏 --><div class="layui-form-item"><div class="layui-inline"><label class="layui-form-label">用户名:</label><div class="layui-input-inline"><input type="text" id="name" placeholder="请输入用户名" autocomplete="off" class="layui-input"></div></div><div class="layui-inline"><div class="layui-input-inline"><button id="btn_search" type="button" class="layui-btn layui-btn-normal"><i class="layui-icon layui-icon-search"></i>查询</button><button id="btn_add" type="button" class="layui-btn">新增</button></div></div></div><table class="layui-hide" id="test" lay-filter="test"></table><script type="text/html" id="barDemo"><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script><script></script></body>
</html>

2.弹出层

在数据显示页面上,我们做新增修改无非两种方法,一种是页面跳转,一种是以弹出层的方法显示

 

用户新增修改通用JSP页面---userEdit.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@include file="/common/header.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="static/js/system/userEdit.js"></script>
<title></title>
</head>
<style>
.layui-form-select dl{max-height:150px;
}
</style>
<body>
<div style="padding:10px;"><form class="layui-form layui-form-pane" lay-filter="user"><input type="hidden" name="id"/><div class="layui-form-item"><label class="layui-form-label">用户名称</label><div class="layui-input-block"><input type="text" id="name" name="name" autocomplete="off" placeholder="请输入用户名" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">用户角色</label><div class="layui-input-block"><select name="rid"><option value="">---请选择---</option><option value="1">管理员</option><option value="2">发起者</option><option value="3">审批者</option><option value="4">参与者</option><option value="5">会议管理员</option></select></div></div><div class="layui-form-item"><label class="layui-form-label">登录账号</label><div class="layui-input-block"><input type="text" name="loginName" lay-verify="required" placeholder="请输入账号" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">登录密码</label><div class="layui-input-block"><input type="password" name="pwd" placeholder="请输入密码" autocomplete="off" class="layui-input"></div></div></form>
</div>
</body>
</html>

3.用户表数据查询

准备一张用户管理的数据表

因为rid分别代表着不同用户的权限,在数据显示时不可能去显示rid,所以需要给对应的值进行诠释

SELECT u.*,
(CASE WHEN u.rid = '1' THEN '管理员'WHEN u.rid = '2' THEN '发起者'WHEN u.rid = '3' THEN '审批者'WHEN u.rid = '4' THEN '参与者'WHEN u.rid = '5' THEN '会议室管理员'ELSE'其它'
END) rname
FROM t_oa_user u 

 二、用户管理后台编写

        UserDao类增删改查方法,同样是继承了basedao,basedao在这就不过多讲解了,有兴趣的可以看Lay UI入门

package com.ctb.dao;import java.util.List;
import java.util.Map;import com.ctb.entity.User;
import com.zking.util.BaseDao;
import com.zking.util.PageBean;
import com.zking.util.StringUtils;
/*** * @author biao** 2023年7月10日*/
public class UserDao extends BaseDao<User> {//查询所有public List<User> list( User user, PageBean pageBean) throws Exception {String sql="select * from t_oa_user";return super.executeQuery(sql, User.class, pageBean);}//用户管理查询public List<Map<String, Object>> listUserRole(User user, PageBean pageBean) throws Exception {String sql = "SELECT u.*,\r\n"+ "(CASE \r\n"+ "	WHEN u.rid = '1' THEN '管理员'\r\n"+ "		WHEN u.rid = '2' THEN '发起者'\r\n"+ "		WHEN u.rid = '3' THEN '审批者'\r\n"+ "		WHEN u.rid = '4' THEN '参与者'\r\n"+ "		WHEN u.rid = '5' THEN '会议室管理员'\r\n"+ "	ELSE\r\n"+ "		'其它'\r\n"+ "END) \r\n"+ " rname\r\n"+ "FROM t_oa_user u where 1=1 ";String name = user.getName();if (StringUtils.isNotBlank(name))sql += " and name like '%" + name + "%'";return super.executeQuery(sql, pageBean);}//登录public User login( User user) throws Exception {String sql="select * from t_oa_user where  loginName =  '"+user.getLoginName()+"' and pwd = '"+user.getPwd()+"' ";List<User> list=	super.executeQuery(sql, User.class, null);if(list!=null && list.size()==1) {return list.get(0);}else {return null;}}//注册public int register(User user) throws Exception {String sql = "insert into t_oa_user(name,loginName,pwd,rid) values(?,?,?,0);";// 定义sql语句return super.executeUpdate(sql,user,new String[] {"name","loginName","pwd"});}//增加public int add(User user) throws Exception {String sql = "insert into t_oa_user(name,loginName,pwd) values(?,?,?)";return super.executeUpdate(sql, user, new String[] {"name","loginName","pwd"});}//编辑public int edit(User user) throws Exception {String sql = "update t_oa_user set name = ?,loginName = ?,pwd = ? where id = ?";return super.executeUpdate(sql, user, new String[] {"name","loginName","pwd","id"});}//删除public int del(User user) throws Exception {String sql = "delete from t_oa_user where id = ?";return super.executeUpdate(sql, user, new String[] {"id"});}//	public static void main(String[] args) throws Exception {
//		UserDao u = new UserDao();
//		int register = u.register(new User(12, "彪", "ctb", "123", 0));
//		
//		System.out.println(register);
//	}}

注:在用户查询中,因用户表没有rname这个字段或多表查询,在basedao中写了一个适合多表联查数据返回的方法

/*** 适合多表联查的数据返回* @param sql* @param pageBean* @return* @throws SQLException* @throws InstantiationException* @throws IllegalAccessException*/public List<Map<String, Object>> executeQuery(String sql, PageBean pageBean)throws SQLException, InstantiationException, IllegalAccessException {List<Map<String, Object>> list = new ArrayList<>();Connection con = DBAccess.getConnection();PreparedStatement pst = null;ResultSet rs = null;/** 是否需要分页? 无需分页(项目中的下拉框,查询条件教员下拉框,无须分页) 必须分页(项目中列表类需求、订单列表、商品列表、学生列表...)*/if (pageBean != null && pageBean.isPagination()) {// 必须分页(列表需求)String countSQL = getCountSQL(sql);pst = con.prepareStatement(countSQL);rs = pst.executeQuery();if (rs.next()) {pageBean.setTotal(String.valueOf(rs.getObject(1)));}// 挪动到下面,是因为最后才处理返回的结果集// -- sql=SELECT * FROM t_mvc_book WHERE bname like '%圣墟%'// -- pageSql=sql limit (page-1)*rows,rows 对应某一页的数据// -- countSql=select count(1) from (sql) t 符合条件的总记录数String pageSQL = getPageSQL(sql, pageBean);// 符合条件的某一页数据pst = con.prepareStatement(pageSQL);rs = pst.executeQuery();} else {// 不分页(select需求)pst = con.prepareStatement(sql);// 符合条件的所有数据rs = pst.executeQuery();}// 获取源数据ResultSetMetaData md = rs.getMetaData();int count = md.getColumnCount();Map<String, Object> map = null;while (rs.next()) {map = new HashMap<>();for (int i = 1; i <= count; i++) {
//				map.put(md.getColumnName(i), rs.getObject(i));map.put(md.getColumnLabel(i), rs.getObject(i));}list.add(map);}return list;}

控制器类---UserAction

package com.ctb.web;import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.ctb.dao.UserDao;
import com.ctb.entity.User;
import com.zking.framework.ActionSupport;
import com.zking.framework.ModelDriver;
import com.zking.util.PageBean;
import com.zking.util.R;
import com.zking.util.ResponseUtil;
/*** * @author biao** 2023年7月10日*/
public class UserAction extends ActionSupport implements ModelDriver<User> {private User user = new User();private UserDao ud = new UserDao();//登录public void login(HttpServletRequest req, HttpServletResponse resp) {try {User login = ud.login(user);ResponseUtil.writeJson(resp, login);} catch (Exception e) {e.printStackTrace();}}//注册public void register(HttpServletRequest req, HttpServletResponse resp) {try {int register = ud.register(user);if (register > 0) {ResponseUtil.writeJson(resp, "OK");} else {ResponseUtil.writeJson(resp, "NO");}} catch (Exception e) {e.printStackTrace();}}//用户查询public void userRole(HttpServletRequest req, HttpServletResponse resp) {try {PageBean pageBean =new PageBean();//初始化pageBean.setRequest(req);List<Map<String, Object>> userRole = ud.listUserRole(user, pageBean);//查询方法
//			Map<String, Object> map=new HashMap<String,Object>();
//			map.put("code", 0);
//			map.put("msg", "查询成功");
//			map.put("count", pageBean.getTotal());
//			map.put("data", userRole);
//			ResponseUtil.writeJson(resp, map);ResponseUtil.writeJson(resp, R.ok(0, "查询成功", pageBean.getTotal(), userRole));} catch (Exception e) {e.printStackTrace();}}//新增public void add(HttpServletRequest req, HttpServletResponse resp) {try {int add = ud.add(user);if (add>0) {ResponseUtil.writeJson(resp, R.ok(0, "新增成功"));}else {ResponseUtil.writeJson(resp, R.error(0, "新增失败"));}} catch (Exception e) {e.printStackTrace();}}//编辑public void edit(HttpServletRequest req, HttpServletResponse resp) {try {int edit = ud.edit(user);if (edit>0) {ResponseUtil.writeJson(resp, R.ok(0, "编辑成功"));}else {ResponseUtil.writeJson(resp, R.ok(0, "编辑失败"));}} catch (Exception e) {e.printStackTrace();}}//删除public void del(HttpServletRequest req, HttpServletResponse resp) {try {int del = ud.del(user);if (del>0) {ResponseUtil.writeJson(resp, R.ok(0, "删除成功"));}else {ResponseUtil.writeJson(resp, R.ok(0, "删除失败"));}} catch (Exception e) {e.printStackTrace();}}@Overridepublic User getModel() {return user;}}

注:在用户管理查询中,我们是借助了R工具类

上图所示表格显示数据,是因为前端响应了数据。如果要用Layui框架就必须遵循它的回显数据的原则

R工具类,它继承自 HashMap,可用于构建包含响应数据的格式化结果。

主要方法如下:

1. data 方法 :用于向对象接受一个键和对应的值,并将其存储在R对象中。
2. R对象 受一个状态码`code`和 消息`msg` 作为参数,并通过`data`方法将相关数据存储进去。
3. error 方法:创建一个错误的`R`对象,接受一个状态码`code`和消息`msg`作为参数,并通过`data`方法将相关数据存储进去。

4.三个重载的`ok`方法,用于创建包含更多数据R对象。该类主要用于简化构建统一的响应结果,方便在项目中使用。

三、前端JS编写

userManage.js

var table,layer,$;
var row;
layui.use(['table','jquery','layer'], function(){table = layui.table,layer = layui.layer,$ = layui.jquery;initTable();//查询点击事件$("#btn_search").click(function(){//alert(123)queryall();});$("#btn_add").click(function(){row = null;edit('新增');})});//打开新增页面function edit(title){layer.open({type: 2,                    //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)title:title,area: ['660px', '400px'],   //宽高skin: 'layui-layer-rim',    //样式类名content: 'jsp/system/userEdit.jsp', //书本编辑页面btn:['保存','关闭'],yes: function(index, layero){//调用子页面中提供的getData方法,快速获取子页面的form表单数据let data= $(layero).find("iframe")[0].contentWindow.getData();console.log(data);//判断title标题let methodName="add";if(title=="编辑")methodName="edit";$.post('user.action?methodName='+methodName,data,function(rs){if(rs.success){//关闭对话框layer.closeAll();//调用查询方法刷新数据queryall();}else{layer.msg(rs.msg,function(){});}},'json');},btn2: function(index, layero){layer.closeAll();}});}//表格重载
function queryall(){table.reload('test', {where: { //设定异步数据接口的额外参数,任意设name: $("#name").val()},request: {pageName: 'page' //页码的参数名称,默认:page,limitName: 'rows' //每页数据量的参数名,默认:limit}
}); //只重载数据}
//表格数据初始化查询
function initTable(){table.render({elem: '#test',url:'user.action?methodName=userRole',title: '用户数据表',cols: [[{type: 'checkbox', fixed: 'left'},{field:'id', title:'ID', width:100, fixed: 'left', unresize: true, sort: true},{field:'name', title:'用户名', width:140, edit: 'text'},{field:'loginName', title:'账户名', width:150, edit: 'text', templet: function(res){return '<em>'+ res.loginName +'</em>'}},{field:'pwd', title:'密码', width:110, edit: 'text', sort: true},{field:'rname', title:'角色名', width:130},{fixed: 'right', title:'操作', toolbar: '#barDemo', width:150}]],page: true});//监听行工具事件table.on('tool(test)', function(obj){row = obj.data;//console.log(obj)if(obj.event === 'del'){layer.confirm('确认要删除吗?', {icon: 3, title:'提示'}, function(index){$.post('user.action',{'methodName':'del','id':row.id},function(rs){if(rs.success){//调用查询方法刷新数据queryall();}else{layer.msg(rs.msg,function(){});}},'json');layer.close(index);});} else if(obj.event === 'edit'){edit('编辑');}});}

userEdit.js

let layer,form,$;
layui.use(['layer','form','jquery'],function(){layer=layui.layer,form=layui.form,$=layui.jquery;initData();
});function initData(){console.log(parent.row);if(null!=parent.row){//因为layui.each内部的逻辑问题导致的所以要先深拷贝一份然后再去val//parent.row:表格行对象form.val('user',$.extend({}, parent.row||{}));$('#name').attr('readonly','readonly');}
}function getData(){return form.val('user');
}

在getData发方法中,通过form.val方法来获取表单的值,并返回该值

四、效果展示

1.查询演示

 2.新增演示

 3.修改演示

 4.删除演示

layui数据表格的增删改查到这就结束啦 !!关注博主不迷路😁😁

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

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

相关文章

React Native 解决 TextInput 设置 maxLength 后,拼音输入法无法输入的问题

目前只发现在 iOS 上存在这个问题&#xff0c;这是由于 iOS 系统的问题&#xff0c;需要添加一个 OC 分类来解决&#xff0c;这里有一个封装好的 react-native-textinput-maxlength-fixed &#xff0c;直接安装即可。 npm install react-native-textinput-maxlength-fixed npx…

数字游民 digital nomad 常见问题解答

目录 什么是数字游民&#xff1f;数字游民是怎么产生的&#xff1f;如何向数字游民转型&#xff1f;常见的数字游民网络聚集地数字游民旅居城市推荐国际版柏林(德国)巴塞罗那(西班牙)布达佩斯(匈牙利)里斯本(葡萄牙)首尔/釜山(韩国) 国内版杭州成都三亚大连厦门 什么是数字游民…

数据仓库-拉链算法

数据仓库-拉链算法&#xff0c;如何处理开链、闭链数据 \timing on set client_encodingGBK; /******程序功能说明*********************************//*****以下根据任务不同进行变量设置*****************/SELECT:AUTO_PDMVIEW AS "PDM_VIEW",:20230710 AS &qu…

语言模型的自洽性思维链推理技术

论文标题&#xff1a;Self-Consistency Improves Chain of Thought Reasoning in Language Models 论文链接&#xff1a;https://arxiv.org/abs/2203.11171 论文来源&#xff1a;ICLR 2023 一、概述 尽管语言模型在一系列NLP任务中展现出了显著的成功&#xff0c;但它们在推理能…

QGIS批量将OSM水系进行可视化显示

要批量将OSM水系进行可视化显示&#xff0c;可以使用QGIS软件和Python语言来实现。以下是详细步骤&#xff1a; 1. 打开QGIS软件&#xff0c;导入OSM数据&#xff0c;可以使用插件OSMDownloader下载OSM数据&#xff0c;或者使用OSM数据下载网站下载数据。 2. 在QGIS中创建新图…

进制转换详解(解释原理简单易懂)

前言&#xff1a;在网上看了许多篇关于不同进制之间如何转换的文章&#xff0c;包括很多浏览量上万的博客。大多都只是把转换的规则罗列了出来&#xff0c;例如十进制转二进制&#xff0c;可能大家都知道方法&#xff0c;“除以2反向取余数&#xff0c;直到商为0”。应用该方法…

Kubespray v2.22.1 在线部署 kubernetes v1.26.5 集群

文章目录 1. 介绍2. 预备条件3. 配置 hostname4. yum5. 下载介质5.1 git 下载5.2 下载 kubespray v2.22.1 6. 编写 inventory.ini7. 配置互信8. 安装 ansible9. 关闭防火墙10. 安装 docker11. 配置内核参数12. 启动容器 kubespray13. 部署14. 配置连接集群 1. 介绍 kubespray​…

论文阅读—2023.7.13:遥感图像语义分割空间全局上下文信息网络(主要为unet网络以及改unet)附加个人理解与代码解析

前期看的文章大部分都是深度学习原理含量多一点&#xff0c;一直在纠结怎么改模型&#xff0c;论文看的很吃力&#xff0c;看一篇忘一篇&#xff0c;总感觉摸不到方向。想到自己是遥感专业&#xff0c;所以还是回归遥感影像去谈深度学习&#xff0c;回归问题&#xff0c;再想着…

5月更新,docsify综合漏洞知识库!

项目介绍 一个知识库&#xff0c;集成了Vulhub、Peiqi、EdgeSecurity、0sec、Wooyun等开源漏洞库&#xff0c;涵盖OA、CMS、开发框架、网络设备、开发语言、操作系统、Web应用、Web服务器、应用服务器等多种漏洞。 关注【Hack分享吧】公众号&#xff0c;回复关键字【230428】获…

C#设计模式之---观察者模式

观察者模式&#xff08;Observer Pattern&#xff09; 观察者模式&#xff08;Observer Pattern&#xff09;是一种对象行为模式。它定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。在观察者…

spring boot security自定义认证

前言 前置阅读 spring boot security快速使用示例 spring boot security之前后端分离配置 说明 实际场景&#xff0c;我们一般是把用户信息保存在db中&#xff08;也可能是调用三方接口&#xff09;&#xff0c;需要自定义用户信息加载或认证部分的逻辑&#xff0c;下面提供…

bug:file name too long文件名超出系统最大限制

各操作系统支持最长的文件和目录名称长度&#xff08;Linux、Win、Mac&#xff09; 今天开发需求的时候发现无法新建文件&#xff0c;提示file name too lang&#xff0c;于是翻阅和查询了一些资料&#xff0c;发现不同操作系统下文件名和目录名最长的长度不同。 操作系统文件名…

小程序主包超1.5MB分包处理流程优化方案

"subPackages": [// 分包1 {"root": "src, // 根目录"pages": [{"path": "views/business/index", // 页面路径"name": "business_index","aliasPath": "/business/index",&…

make/makefile的使用

make/makefile 文章目录 make/makefile初步认识makefile的工作流程依赖关系和依赖方法make的使用 总结 make是一个命令&#xff0c;是一个解释makefile中指令的命令工具&#xff0c;makefile是一个文件&#xff0c;当前目录下的文件&#xff0c;两者搭配使用&#xff0c;完成项…

快速上手dva

Dva 是一个基于 redux 和 redux-saga 的前端框架&#xff0c;它简化了 redux 和 redux-saga 的使用&#xff0c;并且内置了 react-router 和 fetch&#xff0c;所以也支持路由和异步操作。以下是一些基本的 Dva 使用方法&#xff1a; 快速上手 安装&#xff1a;首先&#xff…

异常参数处理:如何处理前端传递的非法参数,确保系统安全稳定

当前端将参数传递给后端时&#xff0c;考虑到各种异常情况&#xff0c;以下是对应的解决示例&#xff1a; 缺少必要的参数&#xff1a; 异常情况&#xff1a;前端未传递必要的参数&#xff0c;导致后端无法正常处理请求。 解决方案&#xff1a;在后端进行参数校验&#xff0c;如…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 二)

自定义组件 创建自定义组件 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为系统组件&#xff0c;由开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合使用&#xff0c;而是需要考虑代码可复用性、…

从后验与模型推断视角深入剖析MATLAB中的变分贝叶斯蒙特卡罗(VBMC)算法:理论、代码示例与下载指南

在实践复杂的计算模型时&#xff0c;贝叶斯推断经常被用来进行参数估计和模型比较。其中&#xff0c;变分贝叶斯蒙特卡罗(VBMC)是一种高效的近似推理方法&#xff0c;能够在有限的预算下对具有潜在噪声似然评估的计算模型进行拟合和评估。这种方法并不只提供最优参数向量&#…

Python采集课堂视频教程, m3u8视频解密

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 解释器 Pycharm 编辑器 模块使用&#xff1a; requests >>> pip install requests pycryptodome --> pip install pycryptodome re 第三方模块安装方法&#xff1a; win R 输…

7.14~7.15学习总结

Java的前置知识学习时间截至了&#xff0c;慌的一批~~。 看看自己学的&#xff0c;再看看要求学的&#xff0c;简直&#xff1a; 现在继续&#xff1a;IO流里面的Commons_IO的用法&#xff1a; public class Main {public static void main(String[]args) throws IOException…