Node.js中Bootstrap-table的两种分页的实现方法


Posted in Javascript onSeptember 18, 2017

1、Bootstrap-table使用

github:https://github.com/wenzhixin/bootstrap-table
官方文档:http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/
bootstrap-table是一个基于bootstrap的表格插件,在使用上有点类似于easyui中的datagrid,但是样式上要比easyui美观一些,而且更加符合现代网站或者系统的前端要求。

不仅如此,bootstrap-table在使用中还有诸多独特之处:

自带前端搜索功能,还能定制搜索
前端列表详情展示,不仅仅是表格的形式
分页更加自由、更加多样化。可以根据不同的需求选择不同的分页方式。
bootstrap-table的使用通过查看官方文档就可掌握,现在主要记录bootstrap-table中独特的、强大的分页功能。

注意: 文中后台逻辑使用Node.js实现,数据库为mongodb

2、bootstrap-table中两种分页

bootstrap-table的分页方式是有bootstrap-table中sidePagination属性决定,此属性有两个值,client,server,分别代表前端分页和服务器后端分页。默认值为client 前端分页。

首先在页面中引入必须的插件包,如下:

<link rel="stylesheet" href="bootstrap.min.css" rel="external nofollow" >
<link rel="stylesheet" href="bootstrap-table.css" rel="external nofollow" >

<script src="jquery.min.js"></script>
<script src="bootstrap.min.js"></script>
<script src="bootstrap-table.js"></script>
<-- 本地化js -->
<script src="bootstrap-table-zh-CN.js"></script>

2.1 前端分页

前端页面代码如下:

$("#gridList").bootstrapTable({ 
      url:'/user/getUserList',//url获取数据 
      method:'get',//方法 
      cache:false,//缓存 
      pagination:true,//分页 
      sidePagination:'client',//指定在前端客户端分页 
      pageNumber:1,//页号 
      pageSize:10,//页面数据条数 
      pageList:[10,20,30,40,50],//分页列表 
      uniqueId:'_id',//唯一id 
      toolbar:'#toolbar',//工具栏 
      showColumns:true,//显示选择列 
      showRefresh:true,//显示刷新按钮 
      showToggle:true,//显示切换视图:列表和详情视图切换 
      search:true,//显示搜索框 
      columns:[ 
        {checkbox:true}, 
        {field:'user_no',title:'用户编码',width:'10%'}, 
        {field:'user_name',title:'用户姓名',width:'20%' 
        }, 
        {field:'user_sex',title:'用户性别',width:'8%',align:'center', 
          formatter:function(value,row,index){ 
            if(value == '1'){ 
              return '男'; 
            }else{ 
              return '女'; 
            } 
          }}, 
        {field:'user_account',title:'登录账号',width:'10%'}, 
        {field:'user_role',title:'所属角色',width:'10%'}, 
        {field:'user_sys',title:'所属系统',width:'10%'}, 
        {field:'create_time',title:'创建时间',width:'20%', 
          formatter:function(value,row,index){ 
            return dateTimeFormatter(value,'yyyy-MM-dd hh:mm:ss'); 
          } 
        } 
      ] 
    });

注意: 在前端页面分页中,sidePagination 必须设置为client

部分后台逻辑代码如下:

/******user_route.js*********/
/**
 * 获取用户列表
 */
router.get('/getUserList',function(req,res){
  userServices.getUserList(req,res,function(err,users){
    if(err){
      res.send({success:false,msg:err,data:null});
    }else{
      res.send({'success':true,'msg':"获取用户列表成功",'total':users.length,'data':users});
    }
  });
});

/*******user_services.js********/
/**
 * 获取用户列表
 * @param req
 * @param res
 * @param callback
 */
exports.getUserList = function(req,res,callback){
  userModel.$user.find(function(err,users){
    if(err){
      callback('获取用户列表失败!',null);
    }else{
      callback(null,users);
    }
  })
}

注意: 返回到前端的数据中,必须有 data 参数,bootstrap-table会根据返回的data参数,设置前端分页。data参数值须为一个数组,数组中包含返回的数据。

前端分页在数据较少的时候非常适用,可以减少浏览器请求数,数据库访问此数,从而提高系统性能。但是不适合非常庞大的万级数据量,返回的数据会放在内存中保存,庞大的数据量会消耗不少内存。

2.2 后端分页

前端页面js:

$("#gridList").bootstrapTable({
      url:'/user/getUserListPagination',//设置后台分页,必须设置URL获取数据,或是重写ajax方法
      method:'get',
      cache:false,
      pagination:true,
      sidePagination:'server',//设置为后台服务器分页
      pageNumber:1,
      pageSize:10,
      pageList:[10,20,30,40,50],
      queryParamsType:'',//请求参数类型,默认为`limit`,使用默认值不会向后台出入分页所需的页号,页数据数等必须值,所以需要设置为空串
      queryParams:function(params){//向后台传输参数。params为bootstrap-table的options.
        var param = {
          page:params.pageNumber,//获取页号
          size:params.pageSize//获取页面数据量大小
        }
        return param;
      },
      uniqueId:'_id',
      toolbar:'#toolbar',
      showColumns:true,
      showRefresh:true,
      showToggle:true,
      search:true,
      columns:[
        {checkbox:true},
        {field:'user_no',title:'用户编码',width:'10%'},
        {field:'user_name',title:'用户姓名',width:'20%'
        },
        {field:'user_sex',title:'用户性别',width:'8%',align:'center',
          formatter:function(value,row,index){
            if(value == '1'){
              return '男';
            }else{
              return '女';
            }
          }},
        {field:'user_account',title:'登录账号',width:'10%'},
        {field:'user_role',title:'所属角色',width:'10%'},
        {field:'user_sys',title:'所属系统',width:'10%'},
        {field:'create_time',title:'创建时间',width:'20%',
          formatter:function(value,row,index){
            return dateTimeFormatter(value,'yyyy-MM-dd hh:mm:ss');
          }
        }
      ]
    });

注意: 代码中注释不分为在后台分页中所必须设置的
后端逻辑代码:

/********user_route.js*******/
/**
 * 后台分页获取数据列表
 */
router.get('/getUserListPagination',function(req,res){
  var queryParams = req.query;
  var params= {
    page:queryParams.page,
    size:queryParams.size
  };
  userServices.getUserListPagination(params,function(err,users){//根据分页条件查询数据条数
    if(err){
      res.send({success:false,msg:err,data:null});
    }else{
      userServices.getUserList(req,res,function(err,allUsers){//查询所有数据总条数
        if(err){
          res.send({success:false,msg:err,data:null});
        }else{
          res.send({'success':true,'msg':"获取用户列表成功",'total':allUsers.length,'rows':users});
        }
      });
    }
  });
});

/**********user_services.js********/
/**
 * 分页查询
 * @param params
 * @param callback
 */
exports.getUserListPagination = function(params,callback){

  var index = (params.page-1)*params.size;//设置分页起点下标
  var size = parseInt(params.size);
  //设置分页条件
  var query = userModel.$user.find({});
  query.limit(size);//条数
  query.skip(index);//下标

  //执行查询
  query.exec(function(err,users){
    callback(err,users);
  });
}

注意: 选择后台分页,返回到前台的数据必须包含 total rows 两个参数,total为数据总数;rows为返回的数据数,也是一个数组对象

Javascript 相关文章推荐
不用ajax实现点击文字即可编辑的方法
Dec 16 Javascript
遍历jquery对象的代码分享
Nov 02 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
Jul 14 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
Aug 27 Javascript
js+css实现导航效果实例
Feb 10 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
May 03 Javascript
jQuery接受后台传递的List的实例详解
Aug 02 jQuery
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
Aug 24 Javascript
Vue Components 数字键盘的实现
Sep 18 Javascript
vue实现鼠标经过动画
Oct 16 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 Javascript
原生JS封装拖动验证滑块的实现代码示例
Jun 01 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
Sep 18 #Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
Sep 18 #Javascript
为什么我们要做三份 Webpack 配置文件
Sep 18 #Javascript
分析javascript中9 个常见错误阻碍你进步
Sep 18 #Javascript
十个免费的web前端开发工具详细整理
Sep 18 #Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
Sep 18 #Javascript
HTML5开发Kinect体感游戏的实例应用
Sep 18 #Javascript
You might like
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
2007/05/03 PHP
实用函数7
2007/11/08 PHP
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
PHP stream_context_create()作用和用法分析
2011/03/29 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
js的闭包的一个示例说明
2008/11/18 Javascript
jquery中子元素和后代元素的区别示例介绍
2014/04/02 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
Ajax和Comet技术总结
2017/02/19 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
JS实现移动端按首字母检索城市列表附源码下载
2017/07/05 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
Vue.js中的图片引用路径的方式
2017/07/28 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
python读写ini文件示例(python读写文件)
2014/03/25 Python
django model去掉unique_together报错的解决方案
2016/10/18 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
纯css3实现的竖形无限级导航
2014/12/10 HTML / CSS
DAWGS鞋官方网站:鞋,凉鞋,靴子
2016/10/04 全球购物
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
小学生开学感言
2014/02/28 职场文书
《在家里》教后反思
2014/03/01 职场文书
乡镇党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
幼儿园辞职书
2015/02/26 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
纪检监察立案决定书
2015/06/24 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
python基础之while循环语句的使用
2021/04/20 Python
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电
Win11跳过联网界面创建本地管理账户的3种方法
2022/04/20 数码科技
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers