LayUI与SSM
一、考卷与作业
修改功能
<a href="/user/selectOne/${u.id}">修改</a>
@RequestMapping("/selectOne/{id}")
public String selectOne(@PathVariable Integer id,HttpServletRequest request){
User user = userService.selectById(id);
request.setAttribute("u",user);
return "update";
}
@RequestMapping("/update")
public String update(User user){
int res = userService.updateUser(user);
System.out.println("修改:"+res);
return "redirect:/user/pages";
}
二、LayUI介绍
概述
类似于bootstrap的前端框架库,内部整合了css与js的用法
引入css外部样式,可以改变页面效果
引入js文件,可以动态使用js的触发及传值功能
应用:
导入文件后,即可使用layui
栅格系统
<!-- 引入css文件 -->
<link rel="stylesheet" type="text/css" href="layui/css/layui.css"/>
<!-- 引入js文件 jquery需要放前面,因为layui中会使用到jquery-->
<script src="js/jquery-1.11.min.js"></script>
<script src="layui/layui.js"></script>
<style>
.a{
background-color: red;
}
.b{
background-color: green;
}
.c{
background-color: blue;
}
.d{
background-color: yellow;
}
.e{
background-color: gray;
}
</style>
<!-- layui-container居中显示有固定尺寸;layui-fluid占满行宽 -->
<!--<div class="layui-container">-->
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md9 layui-col-lg6 layui-bg-orange">
你的内容 9/12b
</div>
<div class="layui-col-md3 layui-col-lg6 layui-bg-gray">
你的内容 3/12
</div>
</div>
<div class="layui-row">
<div class="layui-col-xs6 layui-col-sm6 layui-col-md4 layui-col-lg3 a">
移动:6/12 | 平板:6/12 | 桌面:4/12;
</div>
<div class="layui-col-xs6 layui-col-sm6 layui-col-md4 layui-col-lg3 b">
移动:6/12 | 平板:6/12 | 桌面:4/12;
</div>
<div class="layui-col-xs4 layui-col-sm12 layui-col-md4 layui-col-lg3 c">
移动:4/12 | 平板:12/12 | 桌面:4/12;
</div>
<div class="layui-col-xs4 layui-col-sm7 layui-col-md8 layui-col-lg3 d">
移动:4/12 | 平板:7/12 | 桌面:8/12;
</div>
<div class="layui-col-xs4 layui-col-sm5 layui-col-md4 layui-col-lg3 e">
移动:4/12 | 平板:5/12 | 桌面:4/12;
</div>
</div>
</div>
表单
<!-- 引入css文件 -->
<link rel="stylesheet" type="text/css" href="layui/css/layui.css"/>
<!-- 引入js文件 jquery需要放前面,因为layui中会使用到jquery-->
<script src="js/jquery-1.11.min.js"></script>
<script src="layui/layui.js"></script>
<form class="layui-form" action="">
<div class="layui-form-item">
<label class="layui-form-label">输入框</label>
<div class="layui-input-block">
<input type="text" name="title" required 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-inline">
<input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux">辅助文字</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">选择框</label>
<div class="layui-input-block">
<select name="city" lay-verify="required">
<option value=""></option>
<option value="0">北京</option>
<option value="1">上海</option>
<option value="2">广州</option>
<option value="3">深圳</option>
<option value="4">杭州</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">复选框</label>
<div class="layui-input-block">
<input type="checkbox" name="like[write]" title="写作">
<input type="checkbox" name="like[read]" title="阅读" checked>
<input type="checkbox" name="like[dai]" title="发呆">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">开关</label>
<div class="layui-input-block">
<input type="checkbox" name="switch" lay-skin="switch">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">单选框</label>
<div class="layui-input-block">
<input type="radio" name="sex" value="男" title="男">
<input type="radio" name="sex" value="女" title="女" checked>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">文本域</label>
<div class="layui-input-block">
<textarea name="desc" placeholder="请输入内容" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<!-- lay-filter:js中的触发事件(标记) -->
<button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
<script>
//Demo 使用指定的模块--form js相关
layui.use(['form','layer'], function(){
var form = layui.form;
var layer = layui.layer; //弹出模块 定义局部变量
//监听提交 监听formDemo
form.on('submit(formDemo)', function(data){ //data是表单中的数据(数据的结构)
//layer.msg:类似弹窗的警告框
layer.msg(JSON.stringify(data.field)); //(类似java实体)
return false; //不提交到后台
});
});
</script>
三、布局
主页布局
<!-- 引入css文件 -->
<link rel="stylesheet" type="text/css" href="layui/css/layui.css"/>
<!-- 引入js文件 jquery需要放前面,因为layui中会使用到jquery-->
<script src="js/jquery-1.11.min.js"></script>
<script src="layui/layui.js"></script>
<div class="layui-header">
<div class="layui-logo">layui 后台布局</div>
<!-- 头部区域(可配合layui已有的水平导航) -->
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item">
<a href="javascript:;">
<img src="http://t.cn/RCzsdCq" class="layui-nav-img">
贤心
</a>
<dl class="layui-nav-child">
<dd><a href="">基本资料</a></dd>
<dd><a href="">安全设置</a></dd>
</dl>
</li>
<li class="layui-nav-item"><a href="">退了</a></li>
</ul>
</div>
<div class="layui-side layui-bg-black">
<div class="layui-side-scroll">
<!-- 左侧导航区域(可配合layui已有的垂直导航) -->
<ul class="layui-nav layui-nav-tree" lay-filter="test">
<li class="layui-nav-item layui-nav-itemed">
<a class="" href="javascript:;">所有商品</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;" onclick="openRight('users.html')">用户列表</a></dd>
<dd><a href="javascript:;">列表二</a></dd>
<dd><a href="javascript:;">列表三</a></dd>
<dd><a href="">超链接</a></dd>
</dl>
</li>
</ul>
</div>
</div>
<div class="layui-body" id="main">
<!-- 内容主体区域 -->
</div>
<div class="layui-footer">
<!-- 底部固定区域 -->
© layui.com - 底部固定区域
</div>
</div>
<script>
//JavaScript代码区域
layui.use('element', function(){
var element = layui.element;
});
//在当前页面加载目标页面,以免在新窗口打开
function openRight(url) {
//加载传入的users.html到主体区域
$("#main").load(url); //main就是用于显示数据的div的id
}
</script>
动态数据表格
点击“用户列表”,将数据展示
<table id="demo" lay-filter="test"></table><!-- lay-filter 触发事件标记 -->
<script>
/* 使用的模块有:table*/
layui.use(['table'], function(){
var table = layui.table;
//第一个实例
table.render({ //填充table标签中的数据 json对象
elem: '#demo' //指定的匹配元素
,height: 480 //表格高度
,url: '/user/pages' //数据接口 访问后端服务器路径
,page: true //开启分页
,cols: [[ //表头
/* field:属性名 */
{field: 'id', title: 'ID', width:90, sort: true, fixed: 'left'}
,{field: 'name', title: '用户名'} /* 去掉width表示平均分配 */
,{field: 'password', title: '密码'}
,{field: 'sex', title: '性别'}
,{field: 'birthday', title: '生日'}
]]
});
});
</script>
四、数据回调
回调内容
展示的数据出现异常,因为访问springMVC后,获取到数据,但无法返回到动态数据表格中,需要遵循动态数据表格的接口规则。规则格式如下:
{
"code": 0,
"msg": "",
"count": 1000,
"data": [{}, {}]
}
需要对返回的数据进行封装,再转成json字符串
创建实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TableData <T>{ //表格数据的实体类,遵循json格式规则返回
private Integer code; //返回响应码:0-成功 1-失败
private String msg; //返回的提示信息
private Long count; //条数
private List<T> data;
}
控制层封装
@RestController //返回字符串或json数据(jackson包)
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;
@RequestMapping("/pages")
public TableData<User> pages(HttpServletRequest request){
System.out.println("展示分页...");
String pageNum = request.getParameter("pageNum");
String pageSize = request.getParameter("pageSize");
PageInfo<User> pageInfo = userService.selectPage(pageNum,pageSize);
request.setAttribute("p",pageInfo);
long count = pageInfo.getTotal();
TableData<User> td = new TableData<>(0,"成功状态",count,pageInfo.getList());
System.out.println("返回封装:"+td);
return td;
}
}
五、分页功能
在动态数据展示时,有默认的分页模板,由如下配置决定的
,page: true //开启分页
定制分页
如果需要自己定制分页模板,需要自定义配置规则,自定义格式如下
page:{limit:5//每页显示5条
,limits:[1,2,3] //可选每页条数
,first: '首页' //首页显示文字,默认显示页号
,last: '尾页'
,prev: '<em>←</em>' //上一页显示内容,默认显示 > <
,next: '<i class="layui-icon layui-icon-next"></i>'
,layout:['prev', 'page', 'next','count','limit','skip','refresh'] //自定义分页布局
}
控制层调整
@RequestMapping("/pages") //page-当前页 limit-页大小
public TableData<User> pages(HttpServletRequest request,int page,int limit){
System.out.println("展示分页...");
PageInfo<User> pageInfo = userService.selectPage(page,limit);
request.setAttribute("p",pageInfo);
long count = pageInfo.getTotal();
TableData<User> td = new TableData<>(0,"成功状态",count,pageInfo.getList());
System.out.println("返回封装:"+td);
return td;
}
六、操作功能
工具栏
只需要在table的渲染中,加入工具类配置即可
//第一个实例
table.render({ //填充table标签中的数据 json对象
elem: '#demo' //指定的匹配元素
,height: 480 //表格高度
,url: '/user/pages' //数据接口 访问后端服务器路径
,page: true //开启分页
,toolbar:true //设置工具栏
})
操作功能显示
在table渲染中,加入操作表头
,{field:"right",title:"操作",toolbar: '#barDemo'}
在表头下面绑定编辑和删除按钮;通过id=“barDemo"进行绑定的
<!-- 如下script可以定义在页面的任何位置 -->
<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>
删除功能
//注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
table.on('tool(test)', function(obj){
var data = obj.data; //获得当前行数据
//获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)
var layEvent = obj.event;
if(layEvent === 'del'){ //删除
layer.confirm('真的删除行么', function(index){
// 向服务端发送删除请求
// 此处可以发送ajax
$.ajax({
type:"delete",
url:"/user/delete/"+data.id,
success:function(res){
console.log(res);
table.reload('demo');//重载父页表格,参数为表格ID
}
});
obj.del(); //删除对应行(tr)的DOM结构
layer.close(index); //当前弹窗索引标记删除
});
}
});
修改功能
修改的触发弹窗
//注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
table.on('tool(test)', function(obj){
var data = obj.data; //获得当前行数据
//获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)
var layEvent = obj.event;
if(layEvent === 'del'){ //删除
} else if(layEvent === 'edit'){ //编辑
layer.open({ //打开弹窗
area:['500px','420px'], /* 弹窗的宽高 */
shadeClose:true, /* 是否遮罩 */
anim:2, /* 动画效果 */
type:2, /* 弹窗类型-以小窗口形式弹出 */
content:'/update.html',
success:function(layero,index){
//获取弹出的子窗口的body标签
var body = layer.getChildFrame('body',index);
//查找#id的标签,并将值注入
body.find("#id").val(data.id);
body.find("#name").val(data.name);
body.find("#password").val(data.password);
body.find("#sex").val(data.sex);
}
})
}
});
创建update.html页面
<!-- 引入css文件 -->
<link rel="stylesheet" type="text/css" href="layui/css/layui.css"/>
<!-- 引入js文件 jquery需要放前面,因为layui中会使用到jquery-->
<script src="js/jquery-1.11.min.js"></script>
<script src="layui/layui.js"></script>
<form class="layui-form" action="">
<div class="layui-form-item">
<label class="layui-form-label">ID号</label>
<div class="layui-input-block">
<input type="text" name="id" readonly id="id" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">姓名</label>
<div class="layui-input-block">
<input type="text" name="name" id="name" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">密码</label>
<div class="layui-input-block">
<input type="text" name="password" id="password" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">性别</label>
<div class="layui-input-block">
<input type="text" name="sex" id="sex" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<!-- lay-filter:js中的触发事件(标记) -->
<button class="layui-btn" lay-submit lay-filter="formDemo">修改</button>
</div>
</div>
</form>
<script>
//Demo 使用指定的模块--form js相关
layui.use(['form','layer'], function(){
var form = layui.form;
var layer = layui.layer; //弹出模块 定义局部变量
//监听提交 监听formDemo
form.on('submit(formDemo)', function(data){ //data是表单中的数据(数据的结构)
$.ajax({
type:"put", //修改功能
async:false, //同步方式
url:"/user/update",
contentType:"application/json", //发送数据为json数据
data:JSON.stringify(data.field), //data中的json数据
success:function (res) {
console.log(res);
//update小弹窗作为子窗口
var index = parent.layer.getFrameIndex(window.name); //获取子级窗口索引
parent.layer.close(index); //父关闭子窗口
parent.layui.table.reload('demo');//重载父页表格,参数为表格ID
return false; //不触发表单的action
}
})
});
});
</script>
后端控制层的修改处理:
@PutMapping("/update")
public String update(@RequestBody User user){
System.out.println("user-->"+user);
int res = userService.updateUser(user);
System.out.println("修改:"+res);
return res+"";
}
七、总结与作业
总结
1.SSM的修改功能
根据id匹配,返回对象,再修改
2.layui介绍
概述-前端框架;应用:栅格系统,表单----查看文档
3.局部
主页布局-布局结构; 动态数据表格结构
4.数据回调(重点)
前后端交互的接口;回调内容;控制层封装-TableData实体
5.分页功能
定制分页,控制层调整接收分页参数
6.操作功能(重点)
功能栏;操作功能的显示
删除功能-ajax方式与后台交互
修改功能-模态框展示,修改的调整-ajax--rest风格
作业
完成student表的动态数据展示,表字段有:id-int,name-varchar,sex-varchar,height-double