(超详细)spring-boot+layui实现根据条件查询+异步加载分页查询+数据操作

简介: (超详细)spring-boot+layui实现根据条件查询+异步加载分页查询+数据操作

一、效果展示:

1、第一页

image.png

2、第二页

image.png

二、实现步骤:

1、到官网下载layui,把layui的js和css文件引入到自己的项目中,地址:

https://www.layui.com/

2、前台所需要的html

(1)显示表格的html

<table class="layui-hide" id="test"  lay-filter="demo"></table>

(2)查询条件的form表单,在这里,我们只需要把我们的查询条件显示处理,不需要通过form表单提交,是没有action地址的,表单的代码不需理会,只要根据自己所需要的查询条件,写几个input标签就行了,所有的input需要name属性。

 <div class="row">
                <div class="layui-form layui-form-pane demoTable">
                    <div class="layui-form-item">
                        <div class="layui-inline">
                            <label class="layui-form-label">课程名称</label>
                            <div class="layui-input-inline">
                                <input name="coursename" class="layui-input" type="text" id="coursename">
                            </div>
                        </div>
                        <div class="layui-inline">
                            <label class="layui-form-label">课程状态</label>
                            <div class="layui-input-inline">
                                <select name="coursestatusid" id="coursestatusid">
                                    <option value=""></option>
                                    <option th:each="ccc:${Coursestatuss}"
                                            th:value="${ccc.coursestatusid}"
                                            th:text="${ccc.statusname}">
                                    </option>
                                </select>
                            </div>
                        </div>
                        <div class="layui-inline">
                            <label class="layui-form-label">所属类别</label>
                            <div class="layui-input-inline">
                                <select name="categoryid" id="categoryid">
                                    <option value=""></option>
                                    <option th:each="u:${categorylists}"
                                            th:value="${u.categoryid}"
                                            th:text="${u.categoryname}">
                                    </option>
                                </select>
                            </div>
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <div class="layui-inline">
                            <label class="layui-form-label">难度等级</label>
                            <div class="layui-input-inline">
                                <select name="differentid" id="differentid" lay-filter="differentid">
                                    <option value=""></option>
                                    <option th:each="cd:${CourseDifferents}"
                                            th:value="${cd.differentid}"
                                            th:text="${cd.differentname}">
                                    </option>
                                </select>
                            </div>
                        </div>
                        <div class="layui-inline">
                            <label class="layui-form-label">起始时间</label>
                            <div class="layui-input-inline">
                                <input type="date" name="starttime" id="starttime" class="layui-input">
                            </div>
                        </div>
                        <div class="layui-inline">
                            <label class="layui-form-label">终止时间</label>
                            <div class="layui-input-inline">
                                <input type="date" name="endtime" id="endtime" class="layui-input">
                            </div>
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <div class="layui-input-block">
                            <button class="layui-btn " data-type="reload">查询</button>
                            <a href="back">
                                <button class="layui-btn layui-btn-primary " type="reset" id="reset">重置</button>
                            </a>
                        </div>
                    </div>
                </div>
            </div>

3、前台通过js实现table数据的展示和后台获取。

(1)使用layui的js实现后台获取数据,并渲染到table中。这里只需要复制后改表格的title和自己传过来的类的属性名即可。

 layui.use('table', function () {
        var table = layui.table;
        table.render({
            elem: '#test'  //html中渲染table的id
            , url: '/educationquerycourse'   //后台获取数据集合的地址
            , cellMinWidth: 80
            , page: { //支持传入 laypage 组件的所有参数(某些参数除外,如:jump/elem) - 详见文档
                layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局
                //,curr: 5 //设定初始在第 5 页
                , groups: 1 //只显示 1 个连续页码
                , first: false//不显示首页
                , last: false //不显示尾页
            }, cols: [[
            //表单显示的title以及返回的需要显示的数据,field值与获取集合中的类的字段名一致。
                {field: 'coursename', title: '课程名'}
                , {field: 'simpledescribe', title: '简单描述'}
                , {field: 'createtime', title: '创建时间'}
                , {field: 'statusname', title: '课程状态'}
                , {field: 'differentname', title: '难度级别'}
                , {field: 'categoryname', title: '所属分类'}
                , {width: 178, title: '操作', toolbar: "#barDemo"}
            ]]
        });

(2)根据不同条件传到后台获取对应数据的js实现。这里只需要获取自己查询条件中的name值,然后在where条件中使用,最后跳转到后台根据条件获取对应的list集合。

// /*条件*/
        var $ = layui.$, active = {
            reload: function () {
                var coursename = $('#coursename');
                var coursestatusid = $('#coursestatusid');
                var categoryid = $('#categoryid');
                var differentid = $('#differentid');
                var starttime = $('#starttime');
                var endtime = $('#endtime');
                table.reload('test', {
                    page: {
                        curr: 1//重新从第一页开始
                    },
                    where: {
                        coursename: coursename.val(),
                        coursestatusid: coursestatusid.val(),
                        categoryid: categoryid.val(),
                        differentid: differentid.val(),
                        starttime: starttime.val(),
                        endtime: endtime.val()
                    },
                    url: 'educationquerycourse',
                    method: 'post'
                });
            }
        };

(3)使用layui语法的创建点击事件,粘贴在js中即可,layui提供的通用的代码。

$('.demoTable .layui-btn').on('click', function () {
            var type = $(this).data('type');
            active[type] ? active[type].call(this) : '';
        });

注意:以上的js是对table的渲染和操作,一定要写在layui的js中。下面的监听表格都如此。

    layui.use('table', function () {
        var table = layui.table;
        table.render({
            //对table操作和渲染的内容
            //~~ ~~~ ~~~
 });

(4)操作每行数据的按钮内容,id与渲染表格的title为“操作”列的id一致。

<script id="barDemo" type="text/html">
    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看</a>
    <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>

(5)对不同按钮的监听,完成不同的具体操作实现。代码中有用法的注释,写在layui提供的table语法中。

<script>
    layui.use('table', function(){
        var table = layui.table;
        //监听工具条
        table.on('tool(demo)', function(obj){
            var data = obj.data;
            if(obj.event === 'detail'){
                //根据需要修改下面自己查看的操作即可。
                $.ajax({
                    url: "decidecourse",
                    data:{"courseid":data.courseid},
                    type: "POST",
                    success: function (result) {
                        if(result!="0"){
                            window.location.href="intereditcourse/"+data.courseid;
                        }else{
                            layer.alert("还未发布课节,无法查看!");
                        }
                    }
                });
            } else if(obj.event === 'del'){
                layer.confirm('真的删除行么', function(index){
                    //点击删除按钮后的操作写在下面
                });
            } else if(obj.event === 'edit'){
                //点击编辑按钮后的操作写在下面
                window.location.href="editcoursecontentindex/"+data.courseid;
            }
        });
    });
</script>

4、后台实现的代码


(1)前面一直提到后台获取的集合,我们需要自己新建一个类来存放layui分页需要的数据格式。该类使用泛型,可以根据前台分页所需数据的不同,在后台参数化泛型获取符合要求的内容。该通用类如下:code为layui需要的值,赋值为0即可,msg我们不需要赋值,但是这个类中必须有该字段,只有这样才符合分页需要的数据的格式。count是我们查询到的总条数,data为数据内容的list集合。

import java.util.List;
public class Layui<T> {
    private int code;
    private String msg;
    private int count;
    private List<T> data;
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    public List<T> getData() {
        return data;
    }
    public void setData(List<T> data) {
        this.data = data;
    }
}

(2)后台Controller获取前台传过来的条件值,获取具体的数据返回前台。

/**
     * layui所需数据
     */
    @RequestMapping("/querycoursecontentbycourseid")
    @ResponseBody
    public Layui<CourseContent> querygnum2(@Param("courseid") String courseid,
                                           @Param("limit") int limit,
                                           @Param("page") int page) {
        int courseid1 = 0;
        if (courseid != null && !courseid.equals("")) {
            courseid1 = Integer.valueOf(courseid);
        }
        int page1 = (page - 1) * limit;
        //获取list集合
        List<CourseContent> list = cs.querySelectCourseContent(limit, page1, courseid1);
        //获取数量    
        int count = cs.queryCourseContentCount(courseid1);
        //新建layui分页需要的返回数据类型。
        Layui<CourseContent> lists = new Layui<CourseContent>();
        lists.setCode(0);
        lists.setCount(count);
        lists.setData(list);
        return lists;
    }

三、总结:

通过以上步骤,我们可以轻松实现分页查询,

目录
相关文章
|
2月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
3508 48
|
2月前
|
NoSQL Java 数据库连接
《深入理解Spring》Spring Data——数据访问的统一抽象与极致简化
Spring Data通过Repository抽象和方法名派生查询,简化数据访问层开发,告别冗余CRUD代码。支持JPA、MongoDB、Redis等多种存储,统一编程模型,提升开发效率与架构灵活性,是Java开发者必备利器。(238字)
|
9月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult&lt;T&gt;`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码&quot;0&quot;和消息&quot;操作成功!&quot;,有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
711 0
|
9月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
457 0
|
9月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
1348 0
|
5月前
|
JSON Java 数据格式
Spring Boot返回Json数据及数据封装
在Spring Boot中,接口间及前后端的数据传输通常使用JSON格式。通过@RestController注解,可轻松实现Controller返回JSON数据。该注解是Spring Boot新增的组合注解,结合了@Controller和@ResponseBody的功能,默认将返回值转换为JSON格式。Spring Boot底层默认采用Jackson作为JSON解析框架,并通过spring-boot-starter-json依赖集成了相关库,包括jackson-databind、jackson-datatype-jdk8等常用模块,简化了开发者对依赖的手动管理。
558 3
|
6月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
254 1
|
11月前
|
人工智能 安全 Dubbo
Spring AI 智能体通过 MCP 集成本地文件数据
MCP 作为一款开放协议,直接规范了应用程序如何向 LLM 提供上下文。MCP 就像是面向 AI 应用程序的 USB-C 端口,正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP 提供了一个将 AI 模型连接到不同数据源和工具的标准化方法。
4656 96
|
存储 运维 Java
使用 @Audited 增强Spring Boot 应用程序的数据审计能力
【7月更文挑战第19天】在Spring Boot应用中使用`@Audited`增强数据审计能力涉及在相关实体或方法上添加该注解以标记需审计的操作。例如,在`User`类的`updateUser`方法上使用`@Audited`可记录更新操作的详情。此外,还需配置审计日志存储方式(如数据库)及事件过滤规则等。这有助于满足合规性需求、故障排查及数据分析,对数据安全和完整至关重要。
281 1
|
11月前
|
存储 NoSQL Java
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
239 21