layui-table方法渲染分页+后端PageInfo实现异步分页

layui-table方法渲染+分页+后端PageInfo实现真正异步分页

先看效果

废话不多说,先上效果。

未查询前:

layui-table方法渲染分页+后端PageInfo实现异步分页

查询后:

layui-table方法渲染分页+后端PageInfo实现异步分页

更换每页条数:

layui-table方法渲染分页+后端PageInfo实现异步分页

后端查询语句:

layui-table方法渲染分页+后端PageInfo实现异步分页

前端

基本思路:前端采用form表单提交的方式获取一些查询信息(有记录的状态qstatus,开始时间fromDate和结束时间toDate),然后通过jQuery实现表单提交时间的监控,在表单提交事件中使用table.render()根据需要查询的信息发送异步请求到后端获取记录。

form表单:

//工具栏
<script type="text/html" id="toolbarDemo">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" lay-event="answers">回复</button>
        <button class="layui-btn layui-btn-sm" lay-event="delete">删除</button>
    </div>
</script>

<form class="layui-form">

    <div class="layui-form-item">
        <div class="layui-input-inline">
            <select name="qstatus">
                <option value="">请输入状态</option>
                <option value="0" selected>未回复</option>
                <option value="1">已回复</option>
            </select>
        </div>
        <div class="layui-inline">
            <label class="layui-form-label">开始时间:</label>
            <div class="layui-input-inline">
                <input type="text" name="fromDate" class="layui-input" id="test1" placeholder="yyyy-MM-dd" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline">
            <label class="layui-form-label">结束时间:</label>
            <div class="layui-input-inline">
                <input type="text" name="toDate" class="layui-input" id="test1-1" placeholder="yyyy-MM-dd" autocomplete="off">
            </div>
        </div>

        <div class="layui-inline">
            <div class="layui-input-inline">
                <button class="layui-btn" type="button" lay-submit lay-filter="query">查询</button>
            </div>
        </div>
    </div>

</form>

表单提交监控事件

$.func = {
            formatNestedObj:function(list){
                //由于layui无法处理json中嵌套的对象,在这里将我们需要的嵌套对象的属性,变为该对象的属性,
                for (var i=0;i<list.length;i++)
                {
                    list[i].uname = list[i].user.uname;
                }
                return list;
            },  //end formatNestedObj
}

form.on('submit(query)', function(data){
            var param=data.field;//定义临时变量获取表单提交过来的数据,非json格式

            table.render({
                elem:'#test'
                ,url:'${ctx}/question/queryQuestion'
                ,method:'post'
                ,contentType:"application/json; charset=utf-8"
                ,request: {
                    pageName: 'pageNum' //页码的参数名称,默认:page
                    ,limitName: 'pageSize' //每页数据量的参数名,默认:limit
                }
                ,where:{
                    qstatus:param.qstatus,
                    fromDate:param.fromDate,
                    toDate:param.toDate
                }
                ,parseData: function(res){ //res 即为原始返回的数据
                    return {
                        "code": 0, //解析接口状态
                        "msg": "", //解析提示文本
                        "count": res.total, //解析数据长度
                        "data": $.func.formatNestedObj(res.list) //解析数据列表
                    };
                }
                ,even:true
                ,page: { //支持传入 laypage 组件的所有参数(某些参数除外,如:jump/elem) - 详见文档
                    layout: ['limit', 'count', 'prev', 'page', 'next'] //自定义分页布局
                    ,groups: 3 //只显示 3 个连续页码
                    ,first: '首页' //首页
                    ,prev: '上一页'
                    ,next: '下一页'
                    ,last: '尾页' //尾页
                    ,limit:6
                    ,limits:[6,12,18]
                }
                ,cols: [[
                    {field: 'uname', title: '用户名', width:'10%'}
                    ,{field: 'qtype', title: '类型', width:'10%'}
                    ,{field: 'qdetails', title: '问题详情', width:'45%'}
                    ,{field: 'qdate', title: '添加时间', width:'15%'}
                    ,{field: 'qstatus', title: '是否回复', width: '10%'}
                    ,{fixed: 'right', title:'操作', toolbar: '#toolbarDemo', width:'10%'}
                ]]
            });
        });//end form

需要说明的几点:

  • 使用request来重新设定curr和limit两个字段的名称分别为pageNum和pageSize,这样做的目的是因为我的后端采用DTO对象接收前端数据,而且保证字段的含义与PageInfo里的字段名称相同;
  • 要使用table.render()来实现方法渲染和分页数据异步请求,后端的数据必须满足一定的格式,具体格式可以参见文档,但是我的后端controller直接返回PageInfo对象,和它的格式有一定的差距,所以将数据进行了一定的转换以满足该框架所要求的格式,这里为图方便,状态码与提示文本直接设置为了固定的值;
  • 由于我的POJO类中采用了面向对象的方式,里面包含了另一个对象,而且该对象的属性是需要展示的,但是layui并不支持内嵌对象属性的展示,所以使用formatNestedObj()函数将内嵌对象的属性拿到外面来。

后端

DTO对象

public class QuestionQueryDTO {

    private Integer qstatus;

    @JsonFormat(pattern="yyyy-MM-dd")
    private Date fromDate;

    //解决json转换时区问题
    @JsonFormat(pattern="yyyy-MM-dd")
    private Date toDate;

    private Integer pageSize;

    private Integer pageNum;
    
    //省略的get/set方法
}

controller

@RestController
@RequestMapping("/question")
public class QuestionController {

    @Autowired
    private QuestionService questionService;

    @RequestMapping("/queryQuestion")
    public PageInfo<Question> queryQuestion(@RequestBody QuestionQueryDTO questionQueryDTO){

        PageInfo<Question> pageInfo = questionService.queryQuestion(questionQueryDTO);

        return pageInfo;
    }
}

service

@Service("questionService")
public class QuestionServiceImpl implements QuestionService {

    @Autowired
    private QuestionMapper questionMapper;

    @Override
    public PageInfo<Question> queryQuestion(QuestionQueryDTO questionQueryDTO) {

        PageHelper.startPage(questionQueryDTO.getPageNum(),questionQueryDTO.getPageSize());

        List<Question> l = questionMapper.queryQuestion(questionQueryDTO);

        PageInfo<Question> page = new PageInfo<>(l);

        return page;
    }
}