美文网首页
Jquery DataTables

Jquery DataTables

作者: 七月_JulyFY | 来源:发表于2019-08-22 11:22 被阅读0次

DataTables 是一款 jQuery 表格插件 主要用于分页

文档参考

配置选项:http://www.datatables.club/reference/option/

服务器处理:http://www.datatables.club/manual/server-side.html

设置列的数据源:https://datatables.net/reference/option/columns.data

国际化:http://www.datatables.club/manual/i18n.html

页面引用

<!-- DataTables  css-->
<link rel="stylesheet" href="/static/assets/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css">
<!-- DataTables  js-->
<script src="/static/assets/bower_components/datatables.net/js/jquery.dataTables.min.js"></script>
<script src="/static/assets/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>

使用,启用 0 配置模式 初始化DataTables

$('#dataTable').DataTable({});

分页查询前端代码 抽取后的

//分页工具
var Page=function () {
    var dataTablesInit=function (formId,url,columns) {
        var tables=$("#"+formId).DataTable({
            // 是否开启本地分页
            "paging": true,
            // 是否开启本地排序
            "ordering": false,
            // 是否显示左下角信息
            "info": true,
            // 是否允许用户改变表格每页显示的记录数
            "lengthChange": true,
            // 是否显示处理状态(排序的时候,数据很多耗费时间长的话,也会显示这个)
            "processing": true,
            // 是否允许 DataTables 开启本地搜索
            "searching": false,
            // 是否开启服务器模式
            "serverSide": true,
            // 控制 DataTables 的延迟渲染,可以提高初始化的速度
            "deferRender": true,
            //设置每页显示数量
            "aLengthMenu": [15, 25, 35, 50],
            // 增加或修改通过 Ajax 提交到服务端的请求数据
            "ajax": {
                "url": url
            },
            // 分页按钮显示选项
            "pagingType": "full_numbers",
            // 设置列的数据源
            "columns": columns ,
            // 国际化
            "language": {
                "sProcessing": "处理中...",
                "sLengthMenu": "显示 _MENU_ 项结果",
                "sZeroRecords": "没有匹配结果",
                "sInfo": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
                "sInfoEmpty": "显示第 0 至 0 项结果,共 0 项",
                "sInfoFiltered": "(由 _MAX_ 项结果过滤)",
                "sInfoPostFix": "",
                "sSearch": "搜索:",
                "sUrl": "",
                "sEmptyTable": "表中数据为空",
                "sLoadingRecords": "载入中...",
                "sInfoThousands": ",",
                "oPaginate": {
                    "sFirst": "首页",
                    "sPrevious": "上页",
                    "sNext": "下页",
                    "sLast": "末页"
                },
                "oAria": {
                    "sSortAscending": ": 以升序排列此列",
                    "sSortDescending": ": 以降序排列此列"
                }
            },
            // 表格重绘的回调函数  tbody表格内的所有方法都必须重绘(注意:dataTable 数据是在所有样式之后出来  有关tbody的数据 必须重绘)
            "drawCallback":function (settings) {
               // ICheck.init();
               // SweetAlert.initSweetAlert();
            }
        });
        //ajax请求需要传递参数时 要返回对象
        return tables;
    };

    return{
        init:function (formId,url,columns) {
           return dataTablesInit(formId,url,columns)
        }
    }
}();

Example

<script>
    var table=Page.init("tables1","/user/page",[
              {
                  "data": function (row, type, val, meta) {
                      return '<input id="'+row.id+'" type="checkbox" class="icheck each">';
                  }
              },
            {"data": "id"},
            {"data": "username"},
            {"data": "email"},
            {"data": "phone"},
            {
                "data": function (row, type, val, meta) {
                    return DateTime.format(row.updateDate,"yyyy-MM-dd HH:mm:ss");
                }
            },
            {
                "data": function (row, type, val, meta) {
                    return '<button class="btn btn-sm btn yellow" onclick="detail()"><i class="fa fa-search"></i> 查看</button>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' +
                        '<a href="/user/form?id='+ row.id +'" type="button" class="btn btn-sm btn-primary"><i class="fa fa-edit"></i> 编辑</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' +
                        '<a id="'+row.id+'" type="button" class="btn btn-sm btn-danger" onclick="ICheck.delCheck(\'/user/delete\',\''+row.id+'\')"><i class="fa fa-trash"></i> 删除</a>'
                }
            }
        ]
    );
    //传递ajax参数 通过查询点击事件获取数据
    function search() {
        var username = $("#username").val();
        var email = $("#email").val();
        var phone = $("#phone").val();
        var params = {
            "username": username,
            "email": email,
            "phone": phone
        };
        table.settings()[0].ajax.data = params;
        table.ajax.reload();
    }
    //查找所有
    function searchAll() {
        var obj={};
        table.settings()[0].ajax.data =obj;
        table.ajax.reload();
    }
</script>

分页查询服务端代码

服务端接收ajax代码 Controller
/**
     * dataTables分页 ajax 请求
     * draw  确保Ajax从服务器返回的是对应的  必须int
     * start 起始位置
     * length 每页显示数
     * entity 模糊查询时需要查询的条件
     * 服务器返回数据时
     *     确保Ajax从服务器返回的是对应的  draw
     *     需要返回的数据  data
     *     数据库里总共记录数 recordsTotal
     *     过滤后的记录数  recordsFiltered
     *     可选 定义一个错误来描述服务器出了问题后的友好提示  error
     * @return map
     */
    @ResponseBody
    @GetMapping(value = "/page")   //get 请求查询 保证幂等性
    public PageInfo<T> page(int draw, int start, int length ,T entity){
        PageInfo pageInfo = service.page(entity,start,length,draw);
        return pageInfo;
    }
分页类 PageInfo
package com.funtl.my.shop.admin.dto;
import com.funtl.my.shop.admin.abstracts.AbstractBaseEntity;
import lombok.Data;
import java.util.List;
/**
 * 数据传输对象包下 用来保存分页ajax请求后返回的数据
 * @param <T>
 */
@Data
public class PageInfo<T extends AbstractBaseEntity>{
    /**
     * 保证返回的数据到同一请求
     */
    private int draw;
    /**
     * 分页的总数
     */
    private int recordsTotal;
    /**
     * 过滤后的分页总数
     */
    private int recordsFiltered;
    /**
     * 保存数据的集合
     */
    private List<T> data;
    /**
     * 错误提示信息(可选)
     */
    private String error;
}

MyBatis 映射文件关键代码
DataTables 分页需要提供查询数据的总笔数,以下为查询总笔数的关键代码:
<select id="count" resultType="java.lang.Integer">
  SELECT COUNT(*) FROM tb_user
</select>
这里我们使用 MySQL 作为数据库,由于需要传入分页参数,这里我们还使用了 Map 作为查询参数类型,以下为 MySQL 分页查询的关键代码:
<select id="page" resultType="TbUser" parameterType="java.util.Map">
    SELECT
    <include refid="tbUserColumns" />
    FROM
    tb_user AS a LIMIT #{page}, #{pageSize}
</select>
数据访问接口
/**
 * 分页
 * @param params 需要2参数 start/数据的起始位置  length/每页的数据数
 *               如需模糊查询 则还需要entity对象传入参数给mapper
 * @return
 */
public List<T> page(Map<String,Object> params);

/**查询总条数
 * @param  entity 模糊查询时的对象
 * @return
 */
public int count(T entity);
业务层接口
 /**
 * 分页  entity/模糊查询传递参数 start/数据其实位置 length/每页数据数 draw/保证请求是同一次
 * @param entity
 * @param start
 * @param length
 * @param draw
 * @return
 */
public PageInfo page(T entity, int start, int length, int draw);
业务实现层
/**
 * 分页  entity/模糊查询传递参数 start/数据其实位置 length/每页数据数 draw/保证请求是同一次
 * @param entity
 * @param start
 * @param length
 * @param draw
 * @return
 */
@Override
public PageInfo page(T entity, int start, int length, int draw) {
    Map<String,Object> map= Maps.newHashMap();
    map.put("start",start);
    map.put("length",length);
    map.put(StringUtils.toLowerCaseFirstOne(entity.getClass().getSimpleName()),entity);
    //获取分页的数据
    List list = mapper.page(map);
    //获取总数据数
    int count=mapper.count(entity);
    //设置分页对象
    PageInfo pageInfo=new PageInfo();
    pageInfo.setDraw(draw);
    pageInfo.setData(list);
    pageInfo.setRecordsTotal(count);
    pageInfo.setRecordsFiltered(count);
    return pageInfo;
}

相关文章

网友评论

      本文标题:Jquery DataTables

      本文链接:https://www.haomeiwen.com/subject/thxnsctx.html