• LayUI之CRUD


    目录

    一、layui数据表格相关组件官网介绍

    二、用户管理后台代码

    三、用户新增

    四、用户编辑及删除


    一、layui数据表格相关组件官网介绍

    今日要讲的是关于LayUi之用户管理:增删改查

     我们可以官网,找到弹出层内你需要的效果的代码(如下):

     新建一个 userManage.jsp ,把源代码复制到body标签内:

    然后再找个表单并且复制源代码: 

     

     接着增加一个提交按钮:

     userManager.jsp:

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@ include file="/common/header.jsp" %>
    4. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    5. <html>
    6. <head>
    7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    8. <title>Insert title heretitle>
    9. head>
    10. <body>
    11. <div class="layui-form-item">
    12. <div class="layui-inline">
    13. <label class="layui-form-label">验证手机label>
    14. <div class="layui-input-inline">
    15. <input type="tel" name="phone" lay-verify="required|phone" autocomplete="off" class="layui-input">
    16. div>
    17. div>
    18. <div class="layui-inline">
    19. <div class="layui-input-inline">
    20. <button type="submit" class="layui-btn" lay-submit="" lay-filter="demo1">立即提交button>
    21. div>
    22. div>
    23. div>
    24. <table class="layui-hide" id="test" lay-filter="test">table>
    25. <script type="text/html" id="toolbarDemo">
    26. <div class="layui-btn-container">
    27. <button class="layui-btn layui-btn-sm" lay-event="getCheckData">获取选中行数据button>
    28. <button class="layui-btn layui-btn-sm" lay-event="getCheckLength">获取选中数目button>
    29. <button class="layui-btn layui-btn-sm" lay-event="isAll">验证是否全选button>
    30. div>
    31. script>
    32. <script type="text/html" id="barDemo">
    33. <a class="layui-btn layui-btn-xs" lay-event="edit">编辑a>
    34. <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除a>
    35. script>
    36. <script>
    37. layui.use('table', function(){
    38. var table = layui.table;
    39. table.render({
    40. elem: '#test'
    41. ,url:'../../test/table/demo1.json.js'
    42. ,toolbar: '#toolbarDemo' //开启头部工具栏,并为其绑定左侧模板
    43. ,defaultToolbar: ['filter', 'exports', 'print', { //自定义头部工具栏右侧图标。如无需自定义,去除该参数即可
    44. title: '提示'
    45. ,layEvent: 'LAYTABLE_TIPS'
    46. ,icon: 'layui-icon-tips'
    47. }]
    48. ,title: '用户数据表'
    49. ,cols: [[
    50. {type: 'checkbox', fixed: 'left'}
    51. ,{field:'id', title:'ID', width:80, fixed: 'left', unresize: true, sort: true}
    52. ,{field:'username', title:'用户名', width:120, edit: 'text'}
    53. ,{field:'email', title:'邮箱', width:150, edit: 'text', templet: function(res){
    54. return ''+ res.email +''
    55. }}
    56. ,{field:'sex', title:'性别', width:80, edit: 'text', sort: true}
    57. ,{field:'city', title:'城市', width:100}
    58. ,{field:'sign', title:'签名'}
    59. ,{field:'experience', title:'积分', width:80, sort: true}
    60. ,{field:'ip', title:'IP', width:120}
    61. ,{field:'logins', title:'登入次数', width:100, sort: true}
    62. ,{field:'joinTime', title:'加入时间', width:120}
    63. ,{fixed: 'right', title:'操作', toolbar: '#barDemo', width:150}
    64. ]]
    65. ,page: true
    66. });
    67. //头工具栏事件
    68. table.on('toolbar(test)', function(obj){
    69. var checkStatus = table.checkStatus(obj.config.id);
    70. switch(obj.event){
    71. case 'getCheckData':
    72. var data = checkStatus.data;
    73. layer.alert(JSON.stringify(data));
    74. break;
    75. case 'getCheckLength':
    76. var data = checkStatus.data;
    77. layer.msg('选中了:'+ data.length + ' 个');
    78. break;
    79. case 'isAll':
    80. layer.msg(checkStatus.isAll ? '全选': '未全选');
    81. break;
    82. //自定义头工具栏右侧图标 - 提示
    83. case 'LAYTABLE_TIPS':
    84. layer.alert('这是工具栏右侧自定义的一个图标按钮');
    85. break;
    86. };
    87. });
    88. //监听行工具事件
    89. table.on('tool(test)', function(obj){
    90. var data = obj.data;
    91. //console.log(obj)
    92. if(obj.event === 'del'){
    93. layer.confirm('真的删除么', function(index){
    94. obj.del();
    95. layer.close(index);
    96. });
    97. } else if(obj.event === 'edit'){
    98. layer.prompt({
    99. formType: 2
    100. ,value: data.email
    101. }, function(value, index){
    102. obj.update({
    103. email: value
    104. });
    105. layer.close(index);
    106. });
    107. }
    108. });
    109. });
    110. /* layer.open({
    111. title: '在线调试'
    112. ,content: '配置各种参数,试试效果'
    113. }); */
    114. script>
    115. body>
    116. html>

    运行效果: 

    二、用户管理后台代码

    今天要涉及到的是t_oa_user表: 

     其中数据如下:

    要查询出用户信息及对应的角色

    SQL语句: 

    1. select *
    2. , (case rid
    3. when 1 then '管理员'
    4. when 2 then '发起者'
    5. when 3 then '审批者'
    6. when 4 then '参与者'
    7. when 5 then '会议室管理员'
    8. else '其他' end
    9. ) roleName
    10. from
    11. t_oa_user

     运行SQL语句结果如下:

     UserDao:

    1. package com.zking.dao;
    2. import java.sql.SQLException;
    3. import java.util.List;
    4. import java.util.Map;
    5. import com.zking.entity.User;
    6. import com.zking.util.BaseDao;
    7. import com.zking.util.PageBean;
    8. import com.zking.util.StringUtils;
    9. public class UserDao extends BaseDao<User>{
    10. public User login(User user) throws Exception {
    11. String sql="select * from t_oa_user where loginName='"+user.getLoginName()+"' and pwd='"+user.getPwd()+"'";
    12. List<User> users = super.executeQuery(sql, User.class,null);
    13. //根据sql查询符合条件的用户,通常只会返回一条数据
    14. return users==null||users.size()==0?null:users.get(0);
    15. // return super.executeQuery(sql, clz, pageBean);
    16. }
    17. //查询用户信息及对应的角色,角色通过case when得来的
    18. public List<Map<String, Object>> list(User user,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{
    19. String sql="select * \r\n" +
    20. ", (case rid \r\n" +
    21. "when 1 then '管理员' \r\n" +
    22. "when 2 then '发起者' \r\n" +
    23. "when 3 then '审批者' \r\n" +
    24. "when 4 then '参与者' \r\n" +
    25. "when 5 then '会议室管理员' \r\n" +
    26. "else '其他' end \r\n" +
    27. ") roleName \r\n" +
    28. "from \r\n" +
    29. "t_oa_user where 1=1 ";
    30. String name = user.getName();
    31. if(StringUtils.isNotBlank(name)) {
    32. sql+=" and name like '%"+name+"%'";
    33. }
    34. // 当实体类的属性完全包含数据库查询出来的列段的时候使用
    35. // super.executeQuery(sql,User.class, pageBean)
    36. // 返回 List>,对应的是连表查询,单个实体类对象不完全包括查询的列段
    37. return super.executeQuery(sql, pageBean);
    38. }
    39. public int add(User user) throws Exception {
    40. String sql="insert into t_oa_user(name,loginName,pwd) values(?,?,?)";
    41. return super.executeUpdate(sql, user, new String[] {"name","loginName","pwd"});
    42. }
    43. public int del(User user) throws Exception {
    44. String sql="delete from t_oa_user where id=?";
    45. return super.executeUpdate(sql, user, new String[] {"id"});
    46. }
    47. public int edit(User user) throws Exception {
    48. String sql="update t_oa_user set name=?,loginName=?,pwd=? where id=?";
    49. return super.executeUpdate(sql, user, new String[] {"name","loginName","pwd"});
    50. }
    51. }

     UserDaoTest:

    测试查询所有

    1. public class UserDaoTest {
    2. private UserDao UserDao=new UserDao();
    3. @Test
    4. public void testList() {
    5. User user=new User();
    6. PageBean pageBean=new PageBean();
    7. try {
    8. List<Map<String, Object>> list = UserDao.list(user, pageBean);
    9. for (Map<String, Object> map : list) {
    10. System.out.println(map);
    11. }
    12. } catch (Exception e) {
    13. // TODO Auto-generated catch block
    14. e.printStackTrace();
    15. }
    16. }
    17. }

    打印结果: 

     测试增加方法:

    1. @Test
    2. public void testAdd() {
    3. User user=new User();
    4. user.setName("颜家阳");
    5. user.setLoginName("yjy");
    6. user.setPwd("1108");
    7. try {
    8. UserDao.add(user);
    9. } catch (Exception e) {
    10. // TODO Auto-generated catch block
    11. e.printStackTrace();
    12. }
    13. }

    运行: 

     去数据库进行核实:

     测试修改方法:

    1. @Test
    2. public void testEdit() {
    3. User user=new User();
    4. user.setName("love颜家阳");
    5. user.setLoginName("loveyjy");
    6. user.setPwd("20021108");
    7. user.setId(19L);
    8. try {
    9. UserDao.add(user);
    10. } catch (Exception e) {
    11. // TODO Auto-generated catch block
    12. e.printStackTrace();
    13. }
    14. }

    运行: 

      进数据库核实数据:

     测试删除方法:

    1. @Test
    2. public void testDel() {
    3. User user=new User();
    4. user.setId(13L);
    5. try {
    6. UserDao.del(user);
    7. } catch (Exception e) {
    8. // TODO Auto-generated catch block
    9. e.printStackTrace();
    10. }
    11. }

    运行: 

     进数据库核实:

    编写  UserAction:

    1. package com.zking.web;
    2. import java.util.HashMap;
    3. import java.util.List;
    4. import java.util.Map;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import com.zking.dao.UserDao;
    8. import com.zking.entity.User;
    9. import com.zking.framework.ActionSupport;
    10. import com.zking.framework.ModelDriver;
    11. import com.zking.util.PageBean;
    12. import com.zking.util.R;
    13. import com.zking.util.ResponseUtil;
    14. public class UserAction extends ActionSupport implements ModelDriver<User>{
    15. private User user=new User();
    16. private UserDao userDao=new UserDao();
    17. // 写一个方法处理前台的请求
    18. public String login(HttpServletRequest req, HttpServletResponse resp) {
    19. try {
    20. User u = userDao.login(user);
    21. //通过账户名密码查到了用户记录
    22. if(u!=null) {
    23. // 登录成功
    24. // ResponseUtil.writeJson(resp, new R()
    25. // .data("code", 200)
    26. // .data("msg", "登录成功"));
    27. ResponseUtil.writeJson(resp, R.ok(200, "登录成功"));
    28. req.getSession().setAttribute("user", u);
    29. }else {
    30. // 登录失败
    31. // ResponseUtil.writeJson(resp, new R()
    32. // .data("code", 0)
    33. // .data("msg", "账户密码错误"));
    34. ResponseUtil.writeJson(resp, R.error(0, "用户名密码错误"));
    35. }
    36. } catch (Exception e) {
    37. e.printStackTrace();
    38. try {
    39. ResponseUtil.writeJson(resp, R.error(0, "用户名密码错误"));
    40. } catch (Exception e2) {
    41. e2.printStackTrace();
    42. }
    43. }
    44. return null;
    45. }
    46. // 用户查询
    47. public String list(HttpServletRequest req, HttpServletResponse resp) {
    48. try {
    49. PageBean pageBean=new PageBean();
    50. pageBean.setRequest(req);
    51. List<Map<String, Object>> users = userDao.list(user, pageBean);
    52. // 注意:layui中的数据表格的格式
    53. ResponseUtil.writeJson(resp, R.ok(0, "用户数据查询成功",pageBean.getTotal(),users));
    54. } catch (Exception e) {
    55. e.printStackTrace();
    56. try {
    57. ResponseUtil.writeJson(resp, R.error(0, "用户数据查询失败"));
    58. } catch (Exception e2) {
    59. e2.printStackTrace();
    60. }
    61. }
    62. return null;
    63. }
    64. // 增加用户
    65. public String add(HttpServletRequest req, HttpServletResponse resp) {
    66. try {
    67. // rs是sql语句执行的影响行数
    68. int rs = userDao.add(user);
    69. if(rs>0) {
    70. ResponseUtil.writeJson(resp, R.ok(200, "用户数据增加成功"));
    71. }else {
    72. ResponseUtil.writeJson(resp, R.error(0, "用户数据增加失败"));
    73. }
    74. } catch (Exception e) {
    75. e.printStackTrace();
    76. try {
    77. ResponseUtil.writeJson(resp, R.error(0, "用户数据查询失败"));
    78. } catch (Exception e2) {
    79. e2.printStackTrace();
    80. }
    81. }
    82. return null;
    83. }
    84. // 删除用户
    85. public String del(HttpServletRequest req, HttpServletResponse resp) {
    86. try {
    87. // rs是sql语句执行的影响行数
    88. int rs = userDao.add(user);
    89. if(rs>0) {
    90. ResponseUtil.writeJson(resp, R.ok(200, "用户数据删除成功"));
    91. }else {
    92. ResponseUtil.writeJson(resp, R.error(0, "用户数据删除失败"));
    93. }
    94. } catch (Exception e) {
    95. e.printStackTrace();
    96. try {
    97. ResponseUtil.writeJson(resp, R.error(0, "用户数据删除失败"));
    98. } catch (Exception e2) {
    99. e2.printStackTrace();
    100. }
    101. }
    102. return null;
    103. }
    104. // 修改用户
    105. public String edit(HttpServletRequest req, HttpServletResponse resp) {
    106. try {
    107. // rs是sql语句执行的影响行数
    108. int rs = userDao.add(user);
    109. if(rs>0) {
    110. ResponseUtil.writeJson(resp, R.ok(200, "用户数据修改成功"));
    111. }else {
    112. ResponseUtil.writeJson(resp, R.error(0, "用户数据修改失败"));
    113. }
    114. } catch (Exception e) {
    115. e.printStackTrace();
    116. try {
    117. ResponseUtil.writeJson(resp, R.error(0, "用户数据修改失败"));
    118. } catch (Exception e2) {
    119. e2.printStackTrace();
    120. }
    121. }
    122. return null;
    123. }
    124. @Override
    125. public User getModel() {
    126. return user;
    127. }
    128. }

    三、用户新增

    userManage.jsp:

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@ include file="/common/header.jsp" %>
    4. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    5. <html>
    6. <head>
    7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    8. <script src="static/js/system/userManage.js">script>
    9. head>
    10. <body>
    11. <div class="layui-form-item">
    12. <div class="layui-inline">
    13. <label class="layui-form-label">用户名:label>
    14. <div class="layui-input-inline">
    15. <input type="text" id="name" placeholder="请输入用户名" autocomplete="off" class="layui-input">
    16. div>
    17. div>
    18. <div class="layui-inline">
    19. <div class="layui-input-inline">
    20. <button id="btn_search" type="button" class="layui-btn layui-btn-normal">
    21. <i class="layui-icon layui-icon-search">i>
    22. 查询
    23. button>
    24. <button id="btn_add" type="button" class="layui-btn">新增button>
    25. div>
    26. div>
    27. div>
    28. <table id="tb" lay-filter="tb" class="layui-table" style="margin-top:-15px;">table>
    29. <script type="text/html" id="toolbar">
    30. <button class="layui-btn layui-btn-sm" lay-event="edit">编辑button>
    31. <button class="layui-btn layui-btn-sm" lay-event="del">删除button>
    32. <button class="layui-btn layui-btn-sm" lay-event="reset">重置密码button>
    33. script>
    34. body>
    35. html>

     userManage.js:

    1. let layer,$,table;
    2. var row;
    3. layui.use(['jquery', 'layer', 'table'], function(){
    4. layer = layui.layer
    5. ,$ = layui.jquery
    6. ,table = layui.table;
    7. //初始化数据表格
    8. initTable();
    9. //绑定查询按钮的点击事件
    10. $('#btn_search').click(function(){
    11. query();
    12. });
    13. //绑定新增按钮的点击事件
    14. $('#btn_add').click(function(){
    15. row=null;
    16. open('新增');
    17. });
    18. });
    19. //1.初始化数据表格
    20. function initTable(){
    21. table.render({ //执行渲染
    22. elem: '#tb', //指定原始表格元素选择器(推荐id选择器)
    23. // url: 'user.action?methodName=list', //请求地址
    24. height:500, //自定义高度
    25. loading: false, //是否显示加载条(默认 true)
    26. cols: [[ //设置表头
    27. {field: 'id', title: '用户编号', width: 120},
    28. {field: 'name', title: '用户名', width: 120},
    29. {field: 'loginName', title: '登录账号', width: 140},
    30. {field: '', title: '操作', width: 220,toolbar:'#toolbar'},
    31. ]]
    32. });
    33. }
    34. //2.点击查询
    35. function query(){
    36. table.reload('tb', {
    37. url: $("#ctx").val()+'/user.action', //请求地址
    38. method: 'POST', //请求方式,GET或者POST
    39. loading: true, //是否显示加载条(默认 true)
    40. page: true, //是否分页
    41. where: { //设定异步数据接口的额外参数,任意设
    42. 'methodName':'list',
    43. 'name':$('#name').val()
    44. },
    45. request: { //自定义分页请求参数名
    46. pageName: 'page', //页码的参数名称,默认:page
    47. limitName: 'rows' //每页数据量的参数名,默认:limit
    48. }
    49. });
    50. }
    51. //3.对话框
    52. function open(title){
    53. layer.open({
    54. type: 2, //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
    55. title:title,
    56. area: ['660px', '340px'], //宽高
    57. skin: 'layui-layer-rim', //样式类名
    58. content: $("#ctx").val()+'/jsp/system/userEdit.jsp', //书本编辑页面
    59. btn:['保存','关闭'],
    60. yes: function(index, layero){
    61. //调用子页面中提供的getData方法,快速获取子页面的form表单数据
    62. //
    63. let data= $(layero).find("iframe")[0].contentWindow.getData();
    64. console.log(data);
    65. //判断title标题
    66. let methodName="add";
    67. if(title=="编辑")
    68. methodName="edit";
    69. $.post($("#ctx").val()+'/user.action?methodName='+methodName,
    70. data,function(rs){
    71. if(rs.success){
    72. //关闭对话框
    73. layer.closeAll();
    74. //调用查询方法刷新数据
    75. query();
    76. }else{
    77. layer.msg(rs.msg,function(){});
    78. }
    79. },'json');
    80. },
    81. btn2: function(index, layero){
    82. layer.closeAll();
    83. },
    84. /* btn3: function(index, layero){
    85. layer.msg("批量新增");
    86. return false;
    87. }*/
    88. });
    89. }

    userEdit.jsp: 

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@ include file="/common/header.jsp" %>
    4. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    5. <html>
    6. <head>
    7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    8. <script type="text/javascript" src="${pageContext.request.contextPath }/static/js/system/userEdit.js">script>
    9. <title>用户新增title>
    10. head>
    11. <style>
    12. .layui-form-select dl{
    13. max-height:150px;
    14. }
    15. style>
    16. <body>
    17. <div style="padding:10px;">
    18. <form class="layui-form layui-form-pane" lay-filter="user">
    19. <input type="hidden" name="id"/>
    20. <div class="layui-form-item">
    21. <label class="layui-form-label">用户名称label>
    22. <div class="layui-input-block">
    23. <input type="text" id="name" name="name" autocomplete="off" placeholder="请输入用户名" class="layui-input">
    24. div>
    25. div>
    26. <div class="layui-form-item">
    27. <label class="layui-form-label">用户角色label>
    28. <div class="layui-input-block">
    29. <select name="rid">
    30. <option value="">---请选择---option>
    31. <option value="1">管理员option>
    32. <option value="2">发起者option>
    33. <option value="3">审批者option>
    34. <option value="4">参与者option>
    35. <option value="5">会议管理员option>
    36. select>
    37. div>
    38. div>
    39. <div class="layui-form-item">
    40. <label class="layui-form-label">登录账号label>
    41. <div class="layui-input-block">
    42. <input type="text" name="loginName" lay-verify="required" placeholder="请输入账号" autocomplete="off" class="layui-input">
    43. div>
    44. div>
    45. <div class="layui-form-item">
    46. <label class="layui-form-label">登录密码label>
    47. <div class="layui-input-block">
    48. <input type="password" name="pwd" placeholder="请输入密码" autocomplete="off" class="layui-input">
    49. div>
    50. div>
    51. form>
    52. div>
    53. body>
    54. html>

     

     userEdit.js:

    1. let layer,form,$;
    2. layui.use(['layer','form','jquery'],function(){
    3. layer=layui.layer,form=layui.form,$=layui.jquery;
    4. initData();
    5. });
    6. function initData(){
    7. console.log(parent.row);
    8. if(null!=parent.row){
    9. //因为layui.each内部的逻辑问题导致的所以要先深拷贝一份然后再去val
    10. //parent.row:表格行对象
    11. // table的数据在父页面userManger.jsp
    12. // 点击编辑按钮的时候,当前行赋值给子页面userEdit.jsp
    13. form.val('user',$.extend({}, parent.row||{}));//null||{}
    14. $('#name').attr('readonly','readonly');
    15. }
    16. }
    17. function getData(){
    18. //
    19. // 取user form中的值
    20. return form.val('user');
    21. }

    运行效果: 

     

    点击新增: 

     

     新增成功!!!(如下图)

     

    四、用户编辑及删除

    userManage.js:

    1. //在页面中的中必须配置lay-filter="tb_goods"属性才能触发属性!!!
    2. table.on('tool(tb)', function (obj) {
    3. row = obj.data;
    4. if (obj.event == "edit") {
    5. open("编辑");
    6. }else if(obj.event == "del"){
    7. layer.confirm('确认删除吗?', {icon: 3, title:'提示'}, function(index){
    8. $.post($("#ctx").val()+'/user.action',{
    9. 'methodName':'del',
    10. 'id':row.id
    11. },function(rs){
    12. if(rs.success){
    13. //调用查询方法刷新数据
    14. query();
    15. }else{
    16. layer.msg(rs.msg,function(){});
    17. }
    18. },'json');
    19. layer.close(index);
    20. });
    21. }else{
    22. }
    23. });
    24.  

    25. 相关阅读:
      Vue-3.1缓存组件keep-alive
      Window对象的说明》
      Vue Class Component在项目中的使用
      Java项目:SSM课堂听课记录管理系统
      MySQL 安装报错的解决方法
      python开发环境搭建——pycharm和jupyternotebook
      nodejs--开发自己的项目——2.1——注册用户信息
      SpringCloud系列:服务网关组件Gateway
      python进阶(25)协程
      zabbix监控
    26. 原文地址:https://blog.csdn.net/weixin_65808248/article/details/125878173