public Sort bulidSort() {
Order order2=new Order(Direction.fromString(order), sort);
Sort sort2=Sort.by(order2);
return sort2;
}
}
返回的DataGridUtils类中的方法是处理返回的数据为指定的JSON格式数据。
指定的JSON格式为。
DataGridUtils类代码如下。
public class DataGridUtils {
public static HashMap<String, Object> buildResult(Page page) {
HashMap<String, Object> result=new HashMap<>();
result.put(“code”, 0);
result.put(“msg”,“”);
result.put(“number”, page.getNumberOfElements());
result.put(“count”, page.getTotalElements());
result.put(“data”, page.getContent());
return result;
}
}
返回的JSON数据(只有返回的JSON数据格式一样数据就可以显示出来了)。
{
“msg”: “”,
“number”: 3,
“code”: 0,
“data”: [
{
“id”: 2,
“isUsed”: true,
“name”: “张三”,
“username”: “123456”,
“tbClass”: {
“id”: 1,
“name”: “软件工程1班”,
“teacher”: “张老师”
},
“grade”: 99.0
}, {
“id”: 3,
“isUsed”: null,
“name”: “刘备”,
“username”: “admin”,
“tbClass”: {
“id”: 1,
“name”: “软件工程1班”,
“teacher”: “张老师”
},
“grade”: null
}, {
“id”: 4,
“isUsed”: null,
“name”: “诸葛亮”,
“username”: “admin1”,
“tbClass”: {
“id”: 2,
“name”: “软件工程2班”,
“teacher”: “李老师”
},
“grade”: null
}
],
“count”: 3
}
数据返回后,就可以看到页面上显示的页面了。
上面是显示的单表数据,在实际开发中,常遇到关联表的数据显示。用以下方法可以显示关联表数据。
{field : ‘tbClass’, title : ‘班级’,
templet : function(d) { //d表格当前行的所有数据,如果班级对象不为空,就返回班级名称
return d.tbClass ? d.tbClass.name : ‘’;
}
},
数据显示完成后,下一步就是对数据的操作了(增删改查)。LayUI数据表格支持在表格上方自定义工具栏,也可以在每行后面定义操作按钮,先来看一下在表格上方定义工具栏。
定义增删改查工具栏代码。
注意:需要用script表格包裹起来,id用于绑定时使用,按钮上的lay-event属性用于监听按钮的操作。
之后在JS渲染代码中,通过toolbar属性绑定自定义的工具栏。
工具栏加载完成,页面显示。
工具栏添加后,可以通过以下方法,监听工具栏的点击事件,test为表格的id。
table.on(‘toolbar(test)’, function(obj){});
点击工具栏按钮,在控制台输出obj,可以发现,event的值,正是工具栏按钮中lay-event属性的值,可以通过他来判断点击的是哪个按钮,执行什么操作。
可以通过下面的代码获取到选中的数据,进行操作(删除修改)。
var checkStatus = table.checkStatus(‘student’);
var data = checkStatus.data;
点击新增按钮方法,打开一个layer弹框,显示新增表单,先请求后台拿到新增页面代码,之后弹框显示。弹框定义了两个按钮,确定取消,点击确定按钮会提交表单内容到后台进行保存操作。
$.post(“student/edit”, function(data){
layui.use(‘layer’, function(){
layer.open({
title: ‘学生管理’,
type: 1,
shade: 0.3,
maxmin: true,
content: data,
area: [‘500px’],
btn: [‘确定’, ‘取消’],
yes:function(){ //虚拟化表单参数类型不是json,所以这里用的是回调提交
},
//弹出层打开回调
success: function(layero, index){
var form=layui.form;
//找到确定按钮,添加属性,变成提交按钮
layero.addClass(‘layui-form’);
var submitBtn=layero.find(‘.layui-layer-btn0’);
submitBtn.attr(‘lay-filter’,‘formVerify’).attr(‘lay-submit’,‘’);
layero.keydown(function(e){
if(e.keyCode==13){
submitBtn.click();
}
});
form.on(‘submit(formVerify)’, function(data){
$.post(“student/save”, data.field, function(result){
if(result.success){
layer.close(index);
table.reload(‘student’,{where:that.where});
}
layer.msg(result.msg,{offset:‘rb’});
});
});
}
})
})
})
后台edit方法,请求新增修改页面代码,因为关联的有班级,所以把所有的班级查询出来传递到前台。新增和修改公用的一个方法和页面,用id作为区分的。
@Override
public void edit(StudentForm form, ModelMap map) throws InstantiationException, IllegalAccessException {
map.put(“tbClass”, tbClassService.findAll());
Student model = new Student();
Integer id = form.getId();
if(id!=null) {
model=studentService.findById(id);
}
map.put(“model”, model);
}
edit页面代码,model为传递过来的对象,如果是新增就为null,修改就显示修改的值。
后台保存方法。
@RequestMapping(value=“/save”)
@ResponseBody
public Object save(StudentForm form) throws InstantiationException, IllegalAccessException {
try {
Student model=new Student();
Integer id = form.getId();
if(id!=null) {
model=studentService.findById(id);
}
BeanUtils.copyProperties(form, model,“id”);
studentService.save(model);
return new AjaxResult(“数据保存成功”);
} catch (Exception e) {
return new AjaxResult(false,“数据保存失败”);
}
}
其中接收参数的StudentForm类中和实体类字段一样,通过id是否为null来判断是修改还是新增。AjaxResult是方法执行完成后,返回前台的一个类代码如下。
public class AjaxResult {
private Boolean success;
private String msg;
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public AjaxResult(String msg) {
super();
this.success=true;
this.msg = msg;
}
public AjaxResult(Boolean success, String msg) {
super();
this.success = success;
this.msg = msg;
}
public AjaxResult(boolean success) {
this.success=success;
}
@SuppressWarnings(“rawtypes”)
public static HashMap<String, Object> bulidPageResult(Page page) {
HashMap<String, Object> result=new HashMap<>();
result.put(“total”, page.getTotalElements());
result.put(“rows”, page.getContent());
return result;
}
}
效果如下。
修改部分JS代码,修改需要先判断一下是否勾选了,勾选一行才能执行修改操作。
if(data.length != 1){
layer.msg(‘请选择一行进行编辑’, {offset: ‘rb’});
}else{
var id = data[0].id;
$.post(“student/edit”, {id: id}, function(data){
layui.use(‘layer’, function(){
layer.open({
title: ‘学生管理’,
type: 1,
shade: 0.3,
maxmin: true,
content: data,
area: [‘500px’],
btn: [‘确定’, ‘取消’],
yes:function(){
},
success: function(layero, index){
var form=layui.form;
layero.addClass(‘layui-form’);
var submitBtn=layero.find(‘.layui-layer-btn0’);
submitBtn.attr(‘lay-filter’,‘formVerify’).attr(‘lay-submit’,‘’);
layero.keydown(function(e){
if(e.keyCode==13){
submitBtn.click();
}
});
form.on(‘submit(formVerify)’, function(data){
$.post(“student/save”, data.field, function(result){
if(result.success){
layer.close(index);
table.reload(‘student’,{where:that.where});
}
layer.msg(result.msg,{offset:‘rb’});
});
});
}
})
})
});
}
因为修改和新增都是公用的一个方法,所以后台,页面都和新增的方法一样,下面看一下效果图。
删除方法,JS部分代码,删除相对来说就简单很多了,只需要把选中的行id拼接起来,传递到后台进行删除就可以了。
if(data.length < 1){
layer.msg(‘请选择需要删除的行’, {offset: ‘rb’});
}else{
layer.confirm(‘确定要删除选中的’+data.length+‘条数据吗?’, function(index) {
var str = “”;
for(i = 0; i < data.length; i++){
str += data[i].id+“,”;
}
str = str.substring(0, str.length-1);
$.post(“student/delete1”, {ids: str}, function(result){
table.reload(‘student’,{where:that.where});
layer.close(index);
layer.msg(result.msg,{offset:‘rb’});
});
});
}
后台删除方法。
@RequestMapping(value = “delete1”)
@ResponseBody
public Object delete(String ids) {
try {
String[] split = ids.split(“,”);
for(int i = 0; i < split.length; i++) {
studentService.deleteById(Integer.parseInt(split[i]));
}
return new AjaxResult(“数据删除成功”);
} catch (Exception e) {
return new AjaxResult(false,“数据删除失败”);
}
}
最后就是刷新方法了,刷新也是最简单的。只有执行table.reload(‘student’, {where:that.where});方法,刷新表格,重新加载一下数据就可以了。
增删改查,就差一个查询了查询方法你可以同上面新增和修改方法一样用一个弹框显示查询条件也可以,也可以在表格上方定义查询表单,这里案例是在表格上方定义的查询表单。
在表格上方加上下面的代码,查询表单。
查询
清空
效果如下。
查询方法,查询只需要把查询条件带上,之后刷新表格,后台加载表格数据时,判断查询条件是否为null,不为null就条件查询数据返回即可。查询条件放在where变量中,刷新表格时带上where参数即可。
$.fn.serializeObject = function(){ //序列化表单数据
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || ‘’);
} else {
o[this.name] = this.value || ‘’;
}
});
return o;
};
function search(){
layui.use(“table”, function(){
var table = layui.table;
where = $(“#myForm”).serializeObject();
table.reload(‘student’, {where: where});
});
}
清空查询方法,把查询条件where清空,不带参数刷新表格就是全部数据了,之后还需要把查询表单的数据清空一下。
function empty(){
where=“”;
$(“input”).val(“”);
layui.use([‘form’, ‘table’], function(){
var form = layui.form;
var table = layui.table;
form.render();
table.reload(‘student’, {where: ‘’});
});
}
增删改查基本都实现了。但操作按钮都是是表格上方工具栏中,下面来看一下在表格中定义操作按钮。
和在表格上面工具栏中定义一样,需要先定义显示在表格中的操作按钮。
注意:需要用script表格包裹起来,id用于绑定时使用,按钮上的lay-event属性用于监听按钮的操作。
在JS渲染表格时,添加操作列,通过id绑定操作代码块。
{field: ‘relationName’, toolbar: ‘#barDemo’, title: ‘操作’ }
页面显示效果如图。
通过table.on(‘tool(student)’, function(obj) {});方法监听表格内工具栏的点击事件。
通过var data = obj.data;获取当前行的数据。
JS部分代码。
table.on(‘tool(student)’, function(obj) {
var data = obj.data;
if (obj.event === ‘updata’) {
$.post(“student/edit”, {id: data.id}, function(data){
layui.use(‘layer’, function(){
layer.open({
title: ‘学生管理’,
type: 1,
shade: 0.3,
maxmin: true,
content: data,
area: [‘500px’],
btn: [‘确定’, ‘取消’],
yes:function(){
},
success: function(layero, index){
var form=layui.form;
layero.addClass(‘layui-form’);
var submitBtn=layero.find(‘.layui-layer-btn0’);
submitBtn.attr(‘lay-filter’,‘formVerify’).attr(‘lay-submit’,‘’);
layero.keydown(function(e){
if(e.keyCode==13){
submitBtn.click();
}
});
form.on(‘submit(formVerify)’, function(data){
$.post(“student/save”, data.field, function(result){
if(result.success){
layer.close(index);
table.reload(‘student’,{where:that.where});
}
layer.msg(result.msg,{offset:‘rb’});
});
});
}
})
})
});
}else if(obj.event === ‘delete’){
layer.confirm(‘确定要删除吗?’, function(index) {
$.post(“student/delete”, {id: data.id}, function(result){
table.reload(‘student’,{where:that.where});
layer.close(index);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后希望可以帮助到大家!
千千万万要记得:多刷题!!多刷题!!
之前算法是我的硬伤,后面硬啃了好长一段时间才补回来,算法才是程序员的灵魂!!!!
篇幅有限,以下只能截图分享部分的资源!!
(1)多线程(这里以多线程为代表,其实整理了一本JAVA核心架构笔记集)
(2)刷的算法题(还有左神的算法笔记)
(3)面经+真题解析+对应的相关笔记(很全面)
(4)视频学习(部分)
ps:当你觉得学不进或者累了的时候,视频是个不错的选择
在这里,最后只一句话:祝大家offer拿到手软!!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
入阿里一直到现在。**
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-ZMU6zDVX-1713461639530)]
[外链图片转存中…(img-OSckVrUF-1713461639532)]
[外链图片转存中…(img-FCzIawJI-1713461639532)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后希望可以帮助到大家!
千千万万要记得:多刷题!!多刷题!!
之前算法是我的硬伤,后面硬啃了好长一段时间才补回来,算法才是程序员的灵魂!!!!
篇幅有限,以下只能截图分享部分的资源!!
(1)多线程(这里以多线程为代表,其实整理了一本JAVA核心架构笔记集)
[外链图片转存中…(img-1Cop96nJ-1713461639533)]
(2)刷的算法题(还有左神的算法笔记)
[外链图片转存中…(img-mnmVPnwC-1713461639534)]
(3)面经+真题解析+对应的相关笔记(很全面)
[外链图片转存中…(img-w9miIaob-1713461639535)]
(4)视频学习(部分)
ps:当你觉得学不进或者累了的时候,视频是个不错的选择
在这里,最后只一句话:祝大家offer拿到手软!!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!