LayUI是一款非常好用的动态前端库

  • 主要提供丰富的动作组件,区别于Boostrap静态库缺乏js支持

1.首先聊聊前后端交互的几种方式:

    1. 前后端耦合开发,后端根据请求生成在前端模板。
    1. 半耦合,我现在大部分的状态,后端根据用户请求生成在前端模板,但是没有数据。前端利用ajax再获取数据填充页面。
    1. 前后端分离,纯RestFul风格开发。用户和前端交互,前端使用三大框架(vue,aj,react),通过http协议向后端请求数据填充页面,同时完成权限管理和用户的交互。后端只负责根据请求返回对应的数据(多用一个公用的包装类进行包装,传输json)

2.所以,我们今天聊到的LayUI就是属于半耦合开发

  • 用户请求 —> 后端渲染前端模板 —> LayUI利用ajax获取数据,并填充生成页面 —> 返回用户

使用LayUI和Springboot实现作业的显示和删除

1.首先是后端返回模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 某个项目详情页面
* @param model
* @param userId
* @param workId
* @return
*/
@GetMapping("/deatils")
String Test(Model model,
@RequestParam(value = "userid") int userId,
@RequestParam(value = "workid") int workId){
HomeWork homeWork = homeworkService.findUserIdByWorkId(workId);
if(homeWork.getUserId() == userId){
model.addAttribute("workid",workId);
return "homeworks/homeworkDetails";
}else{
return "index";
}
}

2.前端初始化时,ajax获取数据

  • 此处是LayUI自己封装的请求,默认是get请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<script th:inline="JavaScript">
// 加载表
layui.use('table', function(){
var table = layui.table;
// 加载表
table.render({
elem: '#test'
,url:'/api/homeworks'
,id: 'TestId'
,where: {
userid: [[${session.user.getId()}]],
workid: [[${workid}]]
}
,title: '学生上传信息'
,totalRow: true
,totalRowText: '合计:'
,toolbar: '#toolbarDemo'
,cols: [
[
{type: 'checkbox', fixed: 'left'}
,{field:'id', title:'学号',sort: true}
,{field:'name', title:'姓名'}
,{field:'classname', title:'班级',sort: true}
,{field:'uptime', title:'上传时间',sort: true}
,{field:'filename', title:'文件名'}
,{field:'filesize', title:'文件大小(kb)',sort: true}
,{fixed: 'right', align:'center', toolbar: '#barDemo'} //这里的toolbar值是模板元素的选择器
]
]
,page: true
});

//监听头工具栏事件
table.on('toolbar(test)', function(obj){
var checkStatus = table.checkStatus(obj.config.id)
,data = checkStatus.data; //获取选中的数据
switch(obj.event){
case 'download':
console.info(data);
console.info(data.length)
if(data.length == 0){
layer.msg('请选择需要下载的文件!');
}else{
layer.msg('开始下载!');
download(data);
}
}
});

//监听行工具事件
table.on('tool(test)', function(obj){ //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
var data = obj.data //获得当前行数据
,layEvent = obj.event; //获得 lay-event 对应的值
console.info(data);
if(layEvent === 'detail'){
layer.msg('查看操作');
} else if(layEvent === 'del'){
layer.confirm('真的删除行吗?', function(index){
obj.del(); //删除对应行(tr)的DOM结构
layer.close(index);
//向服务端发送删除指令
deleteHomeWork(data);
table.reload('TestId', {
where: {
userid: [[${session.user.getId()}]],
worktitle: [[${worktitle}]],
page : 1,
pageSize: 10
}
}); //只重载数据
});
} else if(layEvent === 'edit'){
layer.msg('编辑操作');
}
});
});
</script>

3.后端返回ajax数据,带包装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 获取homework列表
*/
@GetMapping("/homeworks")
@ResponseBody
Layui getHomeworks(@RequestParam(value = "workid") String workid,
@RequestParam(value = "userid") int userid,
@RequestParam(value = "limit",defaultValue = "10") int limit,
@RequestParam(value = "page",defaultValue = "1") int page
){
log.info("获取homeworks");
List<Student> students = studentService.getStudentsByWorkId(workid,page,limit);
return Layui.data(1,students); // 使用包装类包装返回结果
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package kid1999.upload.utils;

import java.util.HashMap;
import java.util.List;

/**
* @desc: LayUI 的工具类
* @auther: kid1999
* @date: 2019/12/21 22:05
**/
public class Layui extends HashMap<String, Object> {
public static Layui data(Integer count, List<?> data){
Layui r = new Layui();
r.put("code", 0);
r.put("msg", "");
r.put("count", count);
r.put("data", data);
return r;
}
}

4.前端解包装

  • 如上,安装此类包装会被LayUI自动解包:
  • code:0 为正确返回
  • msg: 信息
  • data:数据(核心)
  • 5.前端发出ajax请求

  • jq的ajax请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 删除作业
function deleteHomeWork(data){
$.ajax({
url: '/api/homework',
type: "delete",
async: true, // 是否异步请求(此处需这只为异步请求true,否则bootstrap的modal不会顺序显示)
cache: false, // 是否缓存此页面,每次都请求服务器
contentType: "application/json", //"application/x-www-form-urlencoded", // 内容编码类型,默认
dataType: "json", // 预期服务器返回数据格式
timeout: 3000, // 超时时间,60s
data: JSON.stringify(data), // 请求参数
success: function(data){
if(data.code === 200){
layer.msg(data.info);
}else{
layer.msg(data.info);
}
},
error: function(xhr, errMsg, e){
console.info(JSON.stringify(data));
layer.msg(errMsg)
}
});
}

6.后端返回

1
2
3
4
5
6
7
8
9
10
/**
* 删除student记录
*/
@DeleteMapping("/homework")
Result deleteHomeWork(@RequestBody Student student){
log.info("删除student记录");
fastDFSClientUtils.deleteFile(student.getFileurl());
studentService.deleteStudentById(student.getId());
return Result.success("删除成功");
}

….后面都类似了

更多LayUI的问题参考其 官方文档示例