• LayUI之CRUD


    目录

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

     二、用户管理后台代码

    1.开始写dao方法 UserDao

    2.编写UserAction

     三、用户新增

     四、用户编辑

     代码格式:userManage.jsp,userManage.js——userEdit.jsp,userEdit.js


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

    首先是官网网址: Layui 开发使用文档 - 入门指南https://layui.org.cn/doc/index.html

     我们主要关于的是用户管理的增删改查

    我们最终要实现的效果如图所示:

    我们去官网里找到跟这个相类似的效果 

    把这个代码赋值到我们新建的userManage.jsp里面body的开始和body结尾中间

    1. <table class="layui-hide" id="test" lay-filter="test">table>
    2. <script type="text/html" id="toolbarDemo">
    3. <div class="layui-btn-container">
    4. <button class="layui-btn layui-btn-sm" lay-event="getCheckData">获取选中行数据button>
    5. <button class="layui-btn layui-btn-sm" lay-event="getCheckLength">获取选中数目button>
    6. <button class="layui-btn layui-btn-sm" lay-event="isAll">验证是否全选button>
    7. div>
    8. script>
    9. <script type="text/html" id="barDemo">
    10. <a class="layui-btn layui-btn-xs" lay-event="edit">编辑a>
    11. <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除a>
    12. script>
    13. <script src="//res/layui/dist/layui.js" charset="utf-8">script>
    14. <script>
    15. layui.use('table', function(){
    16. var table = layui.table;
    17. table.render({
    18. elem: '#test'
    19. ,url:'../../test/table/demo1.json.js'
    20. ,toolbar: '#toolbarDemo' //开启头部工具栏,并为其绑定左侧模板
    21. ,defaultToolbar: ['filter', 'exports', 'print', { //自定义头部工具栏右侧图标。如无需自定义,去除该参数即可
    22. title: '提示'
    23. ,layEvent: 'LAYTABLE_TIPS'
    24. ,icon: 'layui-icon-tips'
    25. }]
    26. ,title: '用户数据表'
    27. ,cols: [[
    28. {type: 'checkbox', fixed: 'left'}
    29. ,{field:'id', title:'ID', width:80, fixed: 'left', unresize: true, sort: true}
    30. ,{field:'username', title:'用户名', width:120, edit: 'text'}
    31. ,{field:'email', title:'邮箱', width:150, edit: 'text', templet: function(res){
    32. return ''+ res.email +''
    33. }}
    34. ,{field:'sex', title:'性别', width:80, edit: 'text', sort: true}
    35. ,{field:'city', title:'城市', width:100}
    36. ,{field:'sign', title:'签名'}
    37. ,{field:'experience', title:'积分', width:80, sort: true}
    38. ,{field:'ip', title:'IP', width:120}
    39. ,{field:'logins', title:'登入次数', width:100, sort: true}
    40. ,{field:'joinTime', title:'加入时间', width:120}
    41. ,{fixed: 'right', title:'操作', toolbar: '#barDemo', width:150}
    42. ]]
    43. ,page: true
    44. });
    45. //头工具栏事件
    46. table.on('toolbar(test)', function(obj){
    47. var checkStatus = table.checkStatus(obj.config.id);
    48. switch(obj.event){
    49. case 'getCheckData':
    50. var data = checkStatus.data;
    51. layer.alert(JSON.stringify(data));
    52. break;
    53. case 'getCheckLength':
    54. var data = checkStatus.data;
    55. layer.msg('选中了:'+ data.length + ' 个');
    56. break;
    57. case 'isAll':
    58. layer.msg(checkStatus.isAll ? '全选': '未全选');
    59. break;
    60. //自定义头工具栏右侧图标 - 提示
    61. case 'LAYTABLE_TIPS':
    62. layer.alert('这是工具栏右侧自定义的一个图标按钮');
    63. break;
    64. };
    65. });
    66. //监听行工具事件
    67. table.on('tool(test)', function(obj){
    68. var data = obj.data;
    69. //console.log(obj)
    70. if(obj.event === 'del'){
    71. layer.confirm('真的删除行么', function(index){
    72. obj.del();
    73. layer.close(index);
    74. });
    75. } else if(obj.event === 'edit'){
    76. layer.prompt({
    77. formType: 2
    78. ,value: data.email
    79. }, function(value, index){
    80. obj.update({
    81. email: value
    82. });
    83. layer.close(index);
    84. });
    85. }
    86. });
    87. });
    88. script>

    引入我们的header.jsp

    <%@include file="/common/header.jsp" %>

    然后在找个表单这个验证手机的把这段代码复制到body开始后面

     代码块:

    1. class="layui-form-item">
    2. <div class="layui-inline">
    3. <label class="layui-form-label">验证手机label>
    4. <div class="layui-input-inline">
    5. <input type="tel" name="phone" lay-verify="required|phone" autocomplete="off" class="layui-input">
    6. div>
    7. div>
    8. <div class="layui-inline">
    9. <label class="layui-form-label">验证邮箱label>
    10. <div class="layui-input-inline">
    11. <input type="text" name="email" lay-verify="email" autocomplete="off" class="layui-input">
    12. div>
    13. div>
    14. div>

    是不是直接把后面的验证邮箱改为按钮就可以了,我们在去官网里找到按钮,也在表单里面

     代码块:

     <button type="submit" class="layui-btn" lay-submit="" lay-filter="demo1">立即提交button>

    在把之前的代码块改为:

    1. class="layui-form-item">
    2. <div class="layui-inline">
    3. <label class="layui-form-label">验证手机label>
    4. <div class="layui-input-inline">
    5. <input type="tel" name="phone" lay-verify="required|phone" autocomplete="off" class="layui-input">
    6. div>
    7. div>
    8. <div class="layui-inline">
    9. <button class="layui-btn" lay-submit="" lay-filter="demo1">立即提交button>
    10. div>
    11. div>

    最终运行结果为:

     二、用户管理后台代码

    我们要用到的mysql数据库表是t_oa_user表如图所示:

    里面的数据如图所示:

     我们要查询出用户信息及对应的用户角色(用户角色:1 管理员 2 发起者 3 审批者 4 参与者 5 会议室管理员)

    mysql里的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) roleName
    9. from
    10. t_oa_user

     运行出来的结果如图所示:

    1.开始写dao方法 UserDao

    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{
    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. // 根据sql查询符合条件的用户,通常只会返回一条数据
    13. List users = super.executeQuery(sql, User.class, null);
    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> 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) roleName \r\n" +
    27. "from \r\n" +
    28. "t_oa_user where 1 = 1 ";
    29. // 有可能根据搜索的名字查询
    30. String name = user.getName();
    31. //判断是否为空
    32. if(StringUtils.isNotBlank(name)) {
    33. // 不为空然后就拼接上sql语句
    34. sql+=" and name like '%"+name+"%'";
    35. }
    36. // 当实体类的属性完全包含数据库查询出来的列段的时候使用
    37. // super.executeQuery(sql, User.class, pageBean)
    38. // 返回List>,对应的是链表查询,单个实体类对象不完全包含查询的列段
    39. return super.executeQuery(sql, pageBean);
    40. }
    41. // 新增
    42. public int add(User user) throws Exception {
    43. String sql="insert into t_oa_user(name,loginName,pwd) values(?,?,?)";
    44. return super.executeUpdate(sql, user, new String[] {"name","loginName","pwd"});
    45. }
    46. // 删除
    47. public int del(User user) throws Exception {
    48. String sql="delete from t_oa_user where id=?";
    49. return super.executeUpdate(sql, user, new String[] {"id"});
    50. }
    51. // 修改
    52. public int edit(User user) throws Exception {
    53. String sql="update t_oa_user set name=?,loginName=?,pwd=? where id=?";
    54. return super.executeUpdate(sql, user, new String[] {"name","loginName","pwd","id"});
    55. }
    56. }

     记得要先测试一下否则都不知道能不能出来数据:我们Ctrl+n输入junit选择junit 4 其他下一步然后勾选我们要测试的方法即可:serDaoText代码块:

    1. package com.zking.dao;
    2. import static org.junit.Assert.*;
    3. import java.sql.SQLException;
    4. import java.util.List;
    5. import java.util.Map;
    6. import org.junit.After;
    7. import org.junit.Before;
    8. import org.junit.Test;
    9. import com.zking.entity.User;
    10. import com.zking.util.PageBean;
    11. public class UserDaoTest {
    12. private UserDao userDao = new UserDao();
    13. @Before
    14. public void setUp() throws Exception {
    15. }
    16. @After
    17. public void tearDown() throws Exception {
    18. }
    19. @Test
    20. public void testList() {
    21. User user = new User();
    22. PageBean pageBean = new PageBean();
    23. try {
    24. List> list = userDao.list(user, pageBean);
    25. for (Map map : list) {
    26. System.out.println(map);
    27. }
    28. } catch (Exception e) {
    29. e.printStackTrace();
    30. }
    31. }
    32. @Test
    33. public void testAdd() {
    34. User user = new User();
    35. user.setName("蒋文娟");
    36. user.setLoginName("jwj");
    37. user.setPwd("1234");
    38. try {
    39. userDao.add(user);
    40. } catch (Exception e) {
    41. // TODO Auto-generated catch block
    42. e.printStackTrace();
    43. }
    44. }
    45. @Test
    46. public void testDel() {
    47. User user = new User();
    48. user.setId(14L);
    49. try {
    50. userDao.del(user);
    51. } catch (Exception e) {
    52. // TODO Auto-generated catch block
    53. e.printStackTrace();
    54. }
    55. }
    56. @Test
    57. public void testEdit() {
    58. User user = new User();
    59. user.setName("蒋文娟2");
    60. user.setLoginName("jwj2");
    61. user.setPwd("12342");
    62. user.setId(14L);
    63. try {
    64. userDao.edit(user);
    65. } catch (Exception e) {
    66. // TODO Auto-generated catch block
    67. e.printStackTrace();
    68. }
    69. }
    70. }

    我们先测试能不能查询出来所有数据如图所示:

    我们在测试增加方法如图所示:

    我们去mysql数据库里查询一下如图所示:

    2.编写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{
    15. private User user = new User();
    16. private UserDao userDao = new UserDao();
    17. // 写一个方法处理前台的请求
    18. // public String login(HttpServletRequest req, HttpServletResponse resp) {
    19. // Map map = new HashMap();
    20. // if("zhangsan".equals(user.getUsername())&&"123456".equals(user.getPassword())) {
    21. 登录成功
    22. // map.put("code", 200);
    23. // map.put("msg", "登录成功");
    24. // }
    25. // else {
    26. 登录失败
    27. // map.put("code", 0);
    28. // map.put("msg", "账户密码有误");
    29. // }
    30. // try {
    31. // ResponseUtil.writeJson(resp, map);
    32. // } catch (Exception e) {
    33. // // TODO Auto-generated catch block
    34. // e.printStackTrace();
    35. // }
    36. // return null;
    37. // }
    38. public String login(HttpServletRequest req, HttpServletResponse resp) {
    39. try {
    40. // 调用我们的login方法
    41. User u = userDao.login(user);
    42. // 通过账户名密码查到了用户记录
    43. if(u!=null) {
    44. // ResponseUtil.writeJson(resp, new R()
    45. // .data("code",200)
    46. // .data("msg","登录成功"));
    47. // 这个就是我们刚刚为什么要更换util所以数据我举例的R().java
    48. // 上面的就等价于下面这段代码
    49. ResponseUtil.writeJson(resp, R.ok(200, "登录成功"));
    50. // 此时我们的session中是包含了我们当前登录的用户id
    51. req.getSession().setAttribute("user", u);
    52. }
    53. else {
    54. ResponseUtil.writeJson(resp, R.error(0, "用户名密码错误"));
    55. }
    56. } catch (Exception e) {
    57. e.printStackTrace();
    58. try {
    59. ResponseUtil.writeJson(resp, R.error(0, "用户名密码错误"));
    60. } catch (Exception e1) {
    61. // TODO Auto-generated catch block
    62. e1.printStackTrace();
    63. }
    64. }
    65. return null;
    66. }
    67. // 用户查询
    68. public String list(HttpServletRequest req, HttpServletResponse resp) {
    69. try {
    70. PageBean pageBean = new PageBean();
    71. pageBean.setRequest(req);
    72. List> users = userDao.list(user, pageBean);
    73. // 注意:layui中的数据格式
    74. ResponseUtil.writeJson(resp, R.ok(0, "用户数据查询成功", pageBean.getTotal(), users));
    75. } catch (Exception e) {
    76. e.printStackTrace();
    77. try {
    78. ResponseUtil.writeJson(resp, R.error(0, "用户数据查询错误"));
    79. } catch (Exception e1) {
    80. // TODO Auto-generated catch block
    81. e1.printStackTrace();
    82. }
    83. }
    84. return null;
    85. }
    86. // 用户增加
    87. public String add(HttpServletRequest req, HttpServletResponse resp) {
    88. try {
    89. // n是sql语句执行的影响行数
    90. int n=userDao.add(user);
    91. // 如果大于0说明可以新增
    92. if(n>0) {
    93. ResponseUtil.writeJson(resp, R.ok(200, "用户数据新增成功"));
    94. }
    95. else {
    96. ResponseUtil.writeJson(resp, R.ok(0, "用户数据新增失败"));
    97. }
    98. } catch (Exception e) {
    99. e.printStackTrace();
    100. try {
    101. ResponseUtil.writeJson(resp, R.error(0, "用户数据新增失败"));
    102. } catch (Exception e1) {
    103. // TODO Auto-generated catch block
    104. e1.printStackTrace();
    105. }
    106. }
    107. return null;
    108. }
    109. // 用户删除
    110. public String del(HttpServletRequest req, HttpServletResponse resp) {
    111. try {
    112. // n是sql语句执行的影响行数
    113. int n=userDao.del(user);
    114. // 如果大于0说明可以删除
    115. if(n>0) {
    116. ResponseUtil.writeJson(resp, R.ok(200, "用户数据删除成功"));
    117. }
    118. else {
    119. ResponseUtil.writeJson(resp, R.ok(0, "用户数据删除失败"));
    120. }
    121. } catch (Exception e) {
    122. e.printStackTrace();
    123. try {
    124. ResponseUtil.writeJson(resp, R.error(0, "用户数据删除失败"));
    125. } catch (Exception e1) {
    126. // TODO Auto-generated catch block
    127. e1.printStackTrace();
    128. }
    129. }
    130. return null;
    131. }
    132. // 用户修改
    133. public String edit(HttpServletRequest req, HttpServletResponse resp) {
    134. try {
    135. // n是sql语句执行的影响行数
    136. int n=userDao.edit(user);
    137. // 如果大于0说明可以修改
    138. if(n>0) {
    139. ResponseUtil.writeJson(resp, R.ok(200, "用户数据修改成功"));
    140. }
    141. else {
    142. ResponseUtil.writeJson(resp, R.ok(0, "用户数据修改失败"));
    143. }
    144. } catch (Exception e) {
    145. e.printStackTrace();
    146. try {
    147. ResponseUtil.writeJson(resp, R.error(0, "用户数据修改失败"));
    148. } catch (Exception e1) {
    149. // TODO Auto-generated catch block
    150. e1.printStackTrace();
    151. }
    152. }
    153. return null;
    154. }
    155. @Override
    156. public User getModel() {
    157. // TODO Auto-generated method stub
    158. return user;
    159. }
    160. }

     三、用户新增

     1.改userManage.jsp,目前我们的userManage.jsp是官网上的还没有改然后我们备份一份到时候用的上,下面这段代码块是改好了的直接复制过去就可以了 注意引入的header.jsp要跟你原有的对应

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

    当我们运行的时候会出错因为没有js文件所以我们要去写一个js文件然后把我们之前的js复制到userManage.js里面去并且记得userManage.jsp要引入userManage.js

    <script type="text/javascript" src="static/js/system/userManage.js">script>

    注意不要建错位置

    这个userManage.js写什么就写script里面这个我们写好了直接复制

    1. let layer,$,table;
    2. layui.use(['jquery', 'layer', 'table'], function(){
    3. layer = layui.layer
    4. ,$ = layui.jquery
    5. ,table = layui.table;
    6. //初始化数据表格
    7. initTable();
    8. //绑定查询按钮的点击事件
    9. $('#btn_search').click(function(){
    10. query();
    11. });
    12. });
    13. //1.初始化数据表格
    14. function initTable(){
    15. table.render({ //执行渲染
    16. elem: '#tb', //指定原始表格元素选择器(推荐id选择器)
    17. // url: 'user.action?methodName=list', //请求地址
    18. height: 340, //自定义高度
    19. loading: false, //是否显示加载条(默认 true)
    20. cols: [[ //设置表头
    21. {field: 'id', title: '用户编号', width: 120},
    22. {field: 'name', title: '用户名', width: 120},
    23. {field: 'loginName', title: '登录账号', width: 140},
    24. {field: '', title: '操作', width: 220,toolbar:'#toolbar'},
    25. ]]
    26. });
    27. }
    28. //2.点击查询
    29. function query(){
    30. table.reload('tb', {
    31. url: $("#ctx").val()+'/user.action', //请求地址
    32. method: 'POST', //请求方式,GET或者POST
    33. loading: true, //是否显示加载条(默认 true)
    34. page: true, //是否分页
    35. where: { //设定异步数据接口的额外参数,任意设
    36. 'methodName':'listUserRole',
    37. 'name':$('#name').val()
    38. },
    39. request: { //自定义分页请求参数名
    40. pageName: 'page', //页码的参数名称,默认:page
    41. limitName: 'rows' //每页数据量的参数名,默认:limit
    42. }
    43. });
    44. }

     注意:这个url我们为什么是注释的因为我们有可能是带条件查询的,如果我们打开的话那么服务器就多请求了一次,所以我们点击查询按钮的时候在查询。

    当我们点击查询的时候出现了一个错误如图所示:

    而我们写的方法是list,所以要把这里改掉

     运行的时候也是可以查询的如图所示:

     这个是什么呢我们为什么要加这个,就是因为可以获取我们的项目名称

    $("#ctx").val()

    我们打印一下如图所示:

    console.log($("#ctx").val());

    接下来就是我们的新增按钮 

    1. //绑定新增按钮的点击事件
    2. $('#btn_add').click(function(){
    3. row=null;
    4. open('新增');
    5. });

     把这个复制到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. });

    我们在去官网里找弹出层这个我们写好了直接复制到usermanage.js里面最后面即可

    1. //3.对话框
    2. function open(title){
    3. layer.open({
    4. type: 2, //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
    5. title:title,
    6. area: ['660px', '340px'], //宽高
    7. skin: 'layui-layer-rim', //样式类名
    8. content: $("#ctx").val()+'/jsp/system/userEdit.jsp', //书本编辑页面
    9. btn:['保存','关闭'],
    10. yes: function(index, layero){
    11. //调用子页面中提供的getData方法,快速获取子页面的form表单数据
    12. let data= $(layero).find("iframe")[0].contentWindow.getData();
    13. console.log(data);
    14. //判断title标题
    15. let methodName="add";
    16. if(title=="编辑")
    17. methodName="edit";
    18. $.post($("#ctx").val()+'/user.action?methodName='+methodName,
    19. data,function(rs){
    20. if(rs.success){
    21. //关闭对话框
    22. layer.closeAll();
    23. //调用查询方法刷新数据
    24. query();
    25. }else{
    26. layer.msg(rs.msg,function(){});
    27. }
    28. },'json');
    29. },
    30. btn2: function(index, layero){
    31. layer.closeAll();
    32. }
    33. });
    34. }

     如果想要一个一个改的话我们就官网里面复制一个表单即可,但这里我们提前写好,注意引入的header.jsp

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@include file="/common/header.jsp"%>
    4. html>
    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上面的也要引入userEdit.js

     当我们点击新增或者编辑的时候是不是要做数据回显是不是当我们点击那个编辑就要拿到哪一行的值,我们可以看官网如图所示:

     对应我们也写好了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. form.val('user',$.extend({}, parent.row||{}));
    12. $('#name').attr('readonly','readonly');
    13. }
    14. }
    15. function getData(){
    16. return form.val('user');
    17. }

    这个什么官方是form.val('example'),我们Ctrl+F,官方取的是form表单里面的值如图所示:

    而我们这个也同理:

     

    1. function getData(){
    2. //
    3. // 取user是取的form表单里面的值
    4. return form.val('user');
    5. }

    当我们点击新增按钮或者编辑按钮是不是打开对话框open把新增界面打开了那么说这个userManage.js是userEdit.jsp父界面,当我们点击编辑的时候是不是要把值给复制上去并且复制给userManage.js里面定义的row

    我们新增一下看看能不能新增

    我们就把原来的删掉换成2.6的版本 

     记得清楚一下缓存Ctrl+shift+delete,我们在新增一下如图所示:

    注意:这里我们就是父页面调用子页面的形式

      jqyery在线手册网址:jQuery API 中文文档 | jQuery API 中文在线手册 | jquery api 下载 | jquery api chm

     这个layero就是弹出层里面包含了iframe如图所示: 

     当我点击新增如果这里有多个按钮如图所示:

    看官网如图所示:

    userManage.jsp代码块:

    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: 340, //自定义高度
    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. //在页面中的中必须配置lay-filter="tb_goods"属性才能触发属性!!!
    34. table.on('tool(tb)', function (obj) {
    35. row = obj.data;
    36. if (obj.event == "edit") {
    37. open("编辑");
    38. }else if(obj.event == "del"){
    39. layer.confirm('确认删除吗?', {icon: 3, title:'提示'}, function(index){
    40. $.post($("#ctx").val()+'/user.action',{
    41. 'methodName':'del',
    42. 'id':row.id
    43. },function(rs){
    44. if(rs.success){
    45. //调用查询方法刷新数据
    46. query();
    47. }else{
    48. layer.msg(rs.msg,function(){});
    49. }
    50. },'json');
    51. layer.close(index);
    52. });
    53. }else{
    54. }
    55. });
    56. }
    57. //2.点击查询
    58. function query(){
    59. // console.log($("#ctx").val());
    60. table.reload('tb', {
    61. url: $("#ctx").val()+'/user.action', //请求地址
    62. method: 'POST', //请求方式,GET或者POST
    63. loading: true, //是否显示加载条(默认 true)
    64. page: true, //是否分页
    65. where: { //设定异步数据接口的额外参数,任意设
    66. 'methodName':'list',
    67. 'name':$('#name').val()
    68. },
    69. request: { //自定义分页请求参数名
    70. pageName: 'page', //页码的参数名称,默认:page
    71. limitName: 'rows' //每页数据量的参数名,默认:limit
    72. }
    73. });
    74. }
    75. //3.对话框
    76. function open(title){
    77. layer.open({
    78. type: 2, //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
    79. title:title,
    80. area: ['660px', '340px'], //宽高
    81. skin: 'layui-layer-rim', //样式类名
    82. content: $("#ctx").val()+'/jsp/system/userEdit.jsp', //书本编辑页面
    83. btn:['保存','关闭','批量新增','不关闭'],
    84. yes: function(index, layero){
    85. //调用子页面中提供的getData方法,快速获取子页面的form表单数据
    86. // jquery.find
    87. let data= $(layero).find("iframe")[0].contentWindow.getData();
    88. console.log(data);
    89. //判断title标题
    90. let methodName="add";
    91. if(title=="编辑")
    92. methodName="edit";
    93. $.post($("#ctx").val()+'/user.action?methodName='+methodName,
    94. data,function(rs){
    95. if(rs.success){
    96. //关闭对话框
    97. layer.closeAll();
    98. //调用查询方法刷新数据
    99. query();
    100. }else{
    101. layer.msg(rs.msg,function(){});
    102. }
    103. },'json');
    104. },
    105. btn2: function(index, layero){
    106. layer.closeAll();
    107. }
    108. ,
    109. btn3: function(index, layero){
    110. layer.msg("批量新增");
    111. }
    112. ,
    113. btn4: function(index, layero){
    114. layer.msg("不关闭");
    115. return false;
    116. }
    117. });
    118. }
    119.  运行结果为:

      如果不想关闭就在下面加一个

      return false;

       如图所示:

       四、用户编辑

      这个是我们最早从官网里面备份了一份的下来的吧

      这个我们写好了一份复制到userManage.js里面的initTable里面去

      1. //1.初始化数据表格
      2. function initTable(){
      3. table.render({ //执行渲染
      4. elem: '#tb', //指定原始表格元素选择器(推荐id选择器)
      5. // url: 'user.action?methodName=list', //请求地址
      6. height: 340, //自定义高度
      7. loading: false, //是否显示加载条(默认 true)
      8. cols: [[ //设置表头
      9. {field: 'id', title: '用户编号', width: 120},
      10. {field: 'name', title: '用户名', width: 120},
      11. {field: 'loginName', title: '登录账号', width: 140},
      12. {field: '', title: '操作', width: 220,toolbar:'#toolbar'},
      13. ]]
      14. });
      15. //在页面中的
      中必须配置lay-filter="tb_goods"属性才能触发属性!!!
    120. table.on('tool(tb)', function (obj) {
    121. row = obj.data;
    122. if (obj.event == "edit") {
    123. open("编辑");
    124. }else if(obj.event == "del"){
    125. layer.confirm('确认删除吗?', {icon: 3, title:'提示'}, function(index){
    126. $.post($("#ctx").val()+'/user.action',{
    127. 'methodName':'del',
    128. 'id':row.id
    129. },function(rs){
    130. if(rs.success){
    131. //调用查询方法刷新数据
    132. query();
    133. }else{
    134. layer.msg(rs.msg,function(){});
    135. }
    136. },'json');
    137. layer.close(index);
    138. });
    139. }else{
    140. }
    141. });
    142. }
    143.  

       当我们点击编辑的时候如图所示:数据给我们回显了

      这个用户名称不能改的原因是:

       我们修改一下看看能不能修改如图所示:

      这个删除也是用的 

       

      运行一下删除如图所示:

       代码格式:userManage.jsp,userManage.js——userEdit.jsp,userEdit.js

      userManage.jsp代码块:

      1. <%@ page language="java" contentType="text/html; charset=UTF-8"
      2. pageEncoding="UTF-8"%>
      3. <%@include file="/common/header.jsp" %>
      4. html>
      5. <html>
      6. <head>
      7. <meta charset="UTF-8">
      8. <script type="text/javascript" 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: 340, //自定义高度
      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. //在页面中的
      中必须配置lay-filter="tb_goods"属性才能触发属性!!!
    144. table.on('tool(tb)', function (obj) {
    145. row = obj.data;
    146. if (obj.event == "edit") {
    147. open("编辑");
    148. }else if(obj.event == "del"){
    149. layer.confirm('确认删除吗?', {icon: 3, title:'提示'}, function(index){
    150. $.post($("#ctx").val()+'/user.action',{
    151. 'methodName':'del',
    152. 'id':row.id
    153. },function(rs){
    154. if(rs.success){
    155. //调用查询方法刷新数据
    156. query();
    157. }else{
    158. layer.msg(rs.msg,function(){});
    159. }
    160. },'json');
    161. layer.close(index);
    162. });
    163. }else{
    164. }
    165. });
    166. }
    167. //2.点击查询
    168. function query(){
    169. // console.log($("#ctx").val());
    170. table.reload('tb', {
    171. url: $("#ctx").val()+'/user.action', //请求地址
    172. method: 'POST', //请求方式,GET或者POST
    173. loading: true, //是否显示加载条(默认 true)
    174. page: true, //是否分页
    175. where: { //设定异步数据接口的额外参数,任意设
    176. 'methodName':'list',
    177. 'name':$('#name').val()
    178. },
    179. request: { //自定义分页请求参数名
    180. pageName: 'page', //页码的参数名称,默认:page
    181. limitName: 'rows' //每页数据量的参数名,默认:limit
    182. }
    183. });
    184. }
    185. //3.对话框
    186. function open(title){
    187. layer.open({
    188. type: 2, //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
    189. title:title,
    190. area: ['660px', '340px'], //宽高
    191. skin: 'layui-layer-rim', //样式类名
    192. content: $("#ctx").val()+'/jsp/system/userEdit.jsp', //书本编辑页面
    193. btn:['保存','关闭'],
    194. yes: function(index, layero){
    195. //调用子页面中提供的getData方法,快速获取子页面的form表单数据
    196. // jquery.find
    197. let data= $(layero).find("iframe")[0].contentWindow.getData();
    198. console.log(data);
    199. //判断title标题
    200. let methodName="add";
    201. if(title=="编辑")
    202. methodName="edit";
    203. $.post($("#ctx").val()+'/user.action?methodName='+methodName,
    204. data,function(rs){
    205. if(rs.success){
    206. //关闭对话框
    207. layer.closeAll();
    208. //调用查询方法刷新数据
    209. query();
    210. }else{
    211. layer.msg(rs.msg,function(){});
    212. }
    213. },'json');
    214. },
    215. btn2: function(index, layero){
    216. layer.closeAll();
    217. }
    218. // ,
    219. // btn3: function(index, layero){
    220. // layer.msg("批量新增");
    221. // }
    222. // ,
    223. // btn4: function(index, layero){
    224. // layer.msg("不关闭");
    225. // return false;
    226. // }
    227. });
    228. }
    229. userEdit.jsp代码块:

      1. <%@ page language="java" contentType="text/html; charset=UTF-8"
      2. pageEncoding="UTF-8"%>
      3. <%@include file="/common/header.jsp"%>
      4. html>
      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的数据在父页面 userManage.jsp
      12. // 点击编辑按钮的时候,当前行赋值给子页面userEdit.jsp
      13. form.val('user',$.extend({}, parent.row||{}));// null或{name:zs} || {}
      14. $('#name').attr('readonly','readonly');
      15. }
      16. }
      17. function getData(){
      18. //
      19. // 取user是取的form表单里面的值
      20. return form.val('user');
      21. }

      结构表的方法:————

      结构表的页面: 

    230. 相关阅读:
      矩阵分析学习笔记(四):λ矩阵及其Smith标准型
      可观测性神器之 Micrometer
      【2024最新精简版】Redis面试篇
      java入门,登录注册案例
      【Docker Compose】
      go-channel
      自定义类加载器
      基于移动互联网的订餐APP系统设计与实现
      RK3399平台开发系列讲解(FLASH篇)为什么数据要延迟写入FLASH
      StarCoder2-Instruct: 完全透明和可自我对齐的代码生成
    231. 原文地址:https://blog.csdn.net/weixin_67465673/article/details/125890089