Welcome Huihui's Code World ! !
接下来看看由辉辉所写的关于LayUi的相关操作吧
目录
Welcome Huihui's Code World ! !
一.数据表格是什么
二.数据表格在什么时候使用(常见使用场景)
三.怎么完成数据表格与数据库进行数据交互
效果展示
①新增
②删除
③修改
项目层级
表结构
实体类
工具类
userManage.jsp(数据展示&模糊查询&删除界面)
userManage.js(对应界面的js)
userEdit.jsp(新增和修改)
userEdit.js(对应界面的js)
dao层
servlet
四.温馨提示
- layui是一个基于web前端的UI框架,它提供了一系列简洁、易用的UI组件,包括数据表格(table)组件。数据表格是layui框架中用于展示和处理表格数据的组件
- 在layui中,数据表格(table)组件可以通过简单的HTML结构和一些配置参数来创建。你可以在HTML中定义表格的基本结构,然后使用JavaScript代码初始化并配置表格组件。同时,你也可以通过代码动态地添加、修改和删除表格中的数据
- 数据表格组件支持多种功能和样式配置,例如:分页、排序、筛选、编辑、格式化等。你可以根据自己的需求和设计要求,选择合适的配置参数来展示和处理表格数据
- 1. 数据管理和浏览:
- 数据表格常用于展示和管理后台系统的数据,如用户管理、订单管理、商品管理等。它可以以表格形式呈现数据,同时提供分页、排序、筛选等功能,方便用户快速浏览和操作数据
- 2. 报表和统计:
- 数据表格也是生成报表和统计数据的常见工具。它可以将复杂的数据按照规定的行和列格式化展示,帮助用户更直观地理解和分析数据
- 3. 数据导出和导入:
- 数据表格组件通常提供了导出和导入数据的功能,可以将表格中的数据以Excel、CSV等格式导出,也可以通过导入功能将外部数据导入到表格中进行处理和展示
- 4. 数据编辑和操作:
- 数据表格可以支持用户对表格中的数据进行编辑和操作,比如修改数据、删除数据、批量操作等。通过配置相应的列类型和操作按钮,可以实现表格的交互性和数据处理功能
- 5. 数据展示和比较:
- 数据表格可以将多个数据源或多个维度的数据进行对比和展示。它可以根据需求设置可排序、可筛选的列,帮助用户对数据进行比较和分析
总的来说,数据表格在许多需要展示、管理、分析和操作大量数据的场景下非常有用。它提供了一种直观、交互式的方式来处理和展示数据,让用户能够高效地进行数据管理和数据分析工作
效果展示
①新增
②删除
③修改
项目层级
表结构
还记得我们之前所讲到的行转列吗 这一篇将用到它啦!在此表中有一个rid,但是我们在界面上需要展示的是角色名,而不是id。所以我们用到行转列来将其进行转换(效果如下图)
实体类
package com.wh.entity; public class User { private long id; private String name; private String loginName; private String pwd; private long rid; public User() { // TODO Auto-generated constructor stub } public User(long id, String name, String loginName, String pwd, long rid) { super(); this.id = id; this.name = name; this.loginName = loginName; this.pwd = pwd; this.rid = rid; } public User(String name, String loginName, String pwd, long rid) { super(); this.name = name; this.loginName = loginName; this.pwd = pwd; this.rid = rid; } public User(String name, String loginName, String pwd) { super(); this.name = name; this.loginName = loginName; this.pwd = pwd; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public long getRid() { return rid; } public void setRid(long rid) { this.rid = rid; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", loginName=" + loginName + ", pwd=" + pwd + ", rid=" + rid + "]"; } }
工具类
还有一部分工具类在layui入门的那一篇博文中!!!
LayUi基础入门【附有案例从0到1详解】http://t.csdn.cn/JeBe0
为什么我们需要用到下面这个叫做'R'的工具类呢?我们可以
先观察一下数据表格中用到的数据, 其中有’code‘,’msg‘以及data,于是在这个工具类中我便重载了多个方法,用来回显适合的数据!!
package com.zking.util; import java.util.HashMap; /** * 输出符合数据表格的数据的工具类 * @author W * */ public class R extends HashMap{ public R data(String key, Object value) { this.put(key, value); return this; } public static R ok(int code, String msg) { R r = new R(); r.data("success", true).data("code", code).data("msg", msg); return r; } public static R error(int code, String msg) { R r = new R(); r.data("success", false).data("code", code).data("msg", msg); return r; } public static R ok(int code, String msg,Object data) { R r = new R(); r.data("success", true).data("code", code).data("msg", msg).data("data", data); return r; } public static R ok(int code, String msg, long count, Object data) { R r = new R(); r.data("success", true).data("code", code).data("msg", msg).data("count", count).data("data", data); return r; } }
这个BaseDao中有两个重载的查询方法,其原因与用途如下
1.当实体类的属性与数据库的字段相同的时候使用 ➡List
BaseDao中的这一个方法
2.当实体类的属性与数据库的字段不同使用➡Listpackage com.zking.util; import java.lang.reflect.Field; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 所有Dao层的父类 BookDao UserDao OrderDao ... * * @author W * * @param
*/ public class BaseDao { /** * 适合多表联查的数据返回 * @param sql * @param pageBean * @return * @throws SQLException * @throws InstantiationException * @throws IllegalAccessException */ public List 配置文件以及公共页面都在layui入门的那一篇博文中
LayUi基础入门【附有案例从0到1详解】http://t.csdn.cn/JeBe0
userManage.jsp(数据展示&模糊查询&删除界面)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="/common/head.jsp" %>
用户管理
userManage.js(对应界面的js)
//把需要用到的模块定义成全局变量 let layer,$,table; var row; layui.use(['jquery','layer','table'],function(){ layer=layui.layer, $=layui.jquery, table=layui.table; //初始化表格 initTable(); //查询按钮的点击事件 $('#btn_search').click(function(){ select();//调用写好的查询的方法 }); //绑定新增按钮的点击事件 $('#btn_add').click(function(){ row=null; open('新增'); }); }); //1.初始化数据表格 function initTable(){ table.render({ //执行渲染 elem: '#tb', //指定原始表格元素选择器(推荐id选择器) url: 'user.action?methodName=listUserRole', //请求地址 height: 820, //自定义高度 loading: false, //是否显示加载条(默认 true) cols: [[ //设置表头 field是数据库的字段名,title是显示在页面中的值 {field: 'id', title: '用户编号', width: 210}, {field: 'name', title: '用户名', width: 210}, {field: 'loginName', title: '登录账号', width: 210}, {field: 'rname', title: '用户角色名', width: 210}, {field: '', title: '操作', width: 220,toolbar:'#toolbar'},//#toolbar是工具栏的id ]] }); //在页面中的
中必须配置lay-filter="tb_goods"属性才能触发属性!!! table.on('tool(tb)', function (obj) {//obj是指这张表中的数据 row = obj.data;//将这张表中的数据赋给row这个变量 //obj.event:获取触发事件的元素的 event 值,用于区分不同的操作 if (obj.event == "edit") {//如果这个值等于edit,那么调用open("编辑"); open("编辑"); }else if(obj.event == "del"){//如果这个值等于del,那么跳到user.action调用删除的方法 layer.confirm('确认删除吗?', {icon: 3, title:'提示'}, function(index){ $.post('user.action?methodName=del&id='+row.id,{ },function(del){ if(rs.success){ //调用查询方法刷新数据 select(); }else{ layer.msg(rs.msg,function(){}); } },'json'); layer.close(index); }); }else{ } }); } //2.点击查询 function select(){ //reload中填写的‘tb’是表格的id table.reload('tb', { url: 'user.action', //请求地址 method: 'POST', //请求方式,GET或者POST loading: true, //是否显示加载条(默认 true) page: true, //是否分页 where: { //设定异步数据接口的额外参数,任意设 'methodName':'listUserRole', 'name':$('#name').val()//获取输入框输入的值 }, request: { //自定义分页请求参数名 pageName: 'page', //页码的参数名称,默认:page limitName: 'rows' //每页数据量的参数名,默认:limit } }); } //3.对话框 function open(title){ layer.open({ type: 2, //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层) title:title, area: ['660px', '340px'], //宽高 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="upd"; $.post('user.action?methodName='+methodName, data,function(rs){ if(rs.success){ //关闭对话框 layer.closeAll(); //调用查询方法刷新数据 select(); }else{ layer.msg(rs.msg,function(){}); } },'json'); }, btn2: function(index, layero){ layer.closeAll(); }, }); }
userEdit.jsp(新增和修改)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="/common/head.jsp"%>
用户新增 userEdit.js(对应界面的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){//子调父 //点击编辑按钮的时候 //$.extend({}, parent.row || {}) 的作用是创建一个新的对象,并将 parent.row 中的键值对复制到该新对象中,达到给表单赋值的目的 form.val('user',$.extend({}, parent.row||{}));//将父页面传递的行数据赋值到名为 'user' 的表单中 $('#name').attr('readonly','readonly');//readonly:设置为只读状态 } } function getData(){ //
dao层
package com.wh.dao; import java.util.List; import java.util.Map; import com.wh.entity.User; import com.zking.util.BaseDao; import com.zking.util.PageBean; import com.zking.util.StringUtils; /** * dao层 * @author W * */ public class UserDao extends BaseDao
{ //增加 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 del(User user) throws Exception { String sql = "delete from t_oa_user where id = ?";// 定义sql语句 return super.executeUpdate(sql, user,new String[] {"id"}); } // 修改 public int upd(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"}); } //查询角色的信息 //当实体类的属性与数据库的字段相同的时候使用 ➡List BaseDao中的这一个方法 //当实体类的属性与数据库的字段不同使用➡List >(可能有一个数据库中没有的字段,比如下面的这个给通过行转列查出角色名的方法,也可能是连表查询出来的字段,总之就是数据库字段与实体类属性值不对等的情况下使用) public List > listUserRole(User user, PageBean pageBean) throws Exception { String sql = "select *,\r\n" + "(case rid\r\n" + "when 1 then '管理人员'\r\n" + "when 4 then '参与者'\r\n" + "else '其他角色' end) as rname\r\n" + "from t_oa_user where 1=1 "; String name = user.getName(); if (StringUtils.isNotBlank(name)) sql += " and name like '%" +name+ "%' "; return super.executeQuery(sql, pageBean); } //查询所有 public List list( User user, PageBean pageBean) throws Exception { String sql="select * from t_oa_user"; return super.executeQuery(sql, User.class, pageBean); } //登录 public User login( User user) throws Exception { String sql="select * from t_oa_user where loginName = '"+user.getLoginName()+"' and pwd = '"+user.getPwd()+"' "; List 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"}); } } servlet
package com.wh.web; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.wh.dao.UserDao; import com.wh.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; public class UserAction extends ActionSupport implements ModelDriver
{ 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 String 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(); try { ResponseUtil.writeJson(resp, R.error(0, "用户数据查询失败")); } catch (Exception e2) { e2.printStackTrace(); } } return null; } // 删除 public String 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.error(0, "用户数据删除失败")); } } catch (Exception e) { e.printStackTrace(); try { ResponseUtil.writeJson(resp, R.error(0, "用户数据删除失败")); } catch (Exception e2) { e2.printStackTrace(); } } return null; } // 修改 public String upd(HttpServletRequest req, HttpServletResponse resp) { try { // 影响行数 int upd = ud.upd(user); if (upd > 0) { ResponseUtil.writeJson(resp, R.ok(0, "用户数据修改成功")); } else { ResponseUtil.writeJson(resp, R.error(0, "用户数据修改失败")); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); try { ResponseUtil.writeJson(resp, R.error(0, "用户数据修改失败")); } catch (Exception e2) { // TODO: handle exception e2.printStackTrace(); } } return null; } //查询用户的角色(权限) public String listUserRole(HttpServletRequest req, HttpServletResponse resp) { try { PageBean pageBean = new PageBean(); pageBean.setRequest(req); List > users = ud.listUserRole(user, pageBean); // layui 的code 返回一定要是 0,不能是200,否者返回不了数据 ResponseUtil.writeJson(resp, R.ok(0, "查询成功", pageBean.getTotal(), users)); } catch (Exception e) { e.printStackTrace(); try { ResponseUtil.writeJson(resp, R.error(0, "查询失败")); } catch (Exception e1) { e1.printStackTrace(); } } return null; } //查询所有 public String list(HttpServletRequest req, HttpServletResponse resp) { try { PageBean pageBean = new PageBean(); pageBean.setRequest(req); List list = ud.list(user, pageBean); // layui 的code 返回一定要是 0,不能是200,否者返回不了数据 ResponseUtil.writeJson(resp, R.ok(0, "查询成功", pageBean.getTotal(), list)); } catch (Exception e) { e.printStackTrace(); try { ResponseUtil.writeJson(resp, R.error(0, "查询失败")); } catch (Exception e1) { e1.printStackTrace(); } } return null; } @Override public User getModel() { return user; } } 四.温馨提示
本文章中的layui需要引入2.4.5及以上版本的才能够运行,如果版本过低,则会报出下列错误
那为什么会报出这个错误呢?
因为`form.val()` 方法是在 layui 2.4.5 版本中引入的
在早期版本的 layui 中,并没有名为 `form.val()` 的方法。该方法的主要功能是用于为表单填充或获取数据。它接受两个参数,第一个参数是表单的 lay-filter 属性值,第二个参数是一个 json 对象,用于设置表单字段的值或获取表单字段的值。
如果你的 layui 版本较旧,或者你的代码中未正确引入 layui.form.js 文件,可能会出现 `form.val is not a function` 的错误。请检查你所使用的 layui 版本,并确保引入了正确的 layui.form.js 文件
好啦,今天的分享就到这了,希望能够帮到你呢!