一,在后台路由 /router/admin.js 中

1,限制获取的数据条数 : User.find().limit(Number)

2,忽略数据的前(Number)条数据 : skip(Number)

3,思路: 如果每页显示两条,忽略条数与每页显示的数据相关 : (当前页)* limit

(1)第一页: 1-2 skip(0)

(2)第二页: 2-4 skip(2)

4,具体代码:

var page = 1
var limit = 2
var skip = (page-1)*limit
User.find().limit(limit).skip(skip).then((users) => {
 
})
 
5,处理 page =》 使用 http 请求中的 get 方式  =》【 ?page=Number  】=》【   req.query.String 】
  
此处 req.query.page 为字符串 ,需要转换成 数值 ,如果没有传值,默认为1
var page = Number(req.query.page || 1) 
 
6,怎样知道当前是哪一页? 通过模板将 page 传送
 
7,按钮切换页面  /views/user.html
<div class="btn-group" role="group" aria-label="...">
<a href="/admin/user?page={{page-1}}" class="btn btn-default">上一页</a>
<a href="/admin/user?page={{page+1}}" class="btn btn-default">下一页</a>
</div>
 
8,优化分页,查询总记录数量
User.count().then((count)=>{
  console.log(count)  
})
 
 
9,所有代码   /router/admin.js
 
var express = require('express')
var router = express.Router()
var User = require('../models/User')
/** 验证用户是否为管理员 ,防止其他用户通过 /admin 路径访问 */
router.use((req, res, next) => {
if (!req.userInfo.isAdmin) {
  res.send('对不起,你不是管理员,不能进入')
    return
  }
  next()
})
/** 首页 */
router.get('/', (req, res) => {
  console.log(('admin ---- req.userInfo 数据 :' + JSON.stringify(req.userInfo)).yellow)
  res.render('admin/index', {
    userInfo: req.userInfo
  })
})
/** 用户管理 */
router.get('/user', (req, res) => {
/**通过类或构造函数的方法读取 => 所有用户的信息
*
* 分页:
*
*/
var page = Number(req.query.page || 1) // 如果没有传值,默认为1
var limit = 10
var pages = 1
User.count().then((count)=>{
// 计算总页数,向上取整数,去最大值
pages = Math.ceil(count / limit)
 
// 页数取值不能超过总页数的值
page = Math.min(page,pages)
 
// 取值不能小于1
page = Math.max(page,1)
var skip = (page-1)*limit
User.find().limit(limit).skip(skip).then((users) => {
  // console.log((' 所有用户 : ' + users).red)
 
/**
* 【 重点 : 数据到模板的传输 】
* 不要删除 userInfo , 会影响到cookie .
* 在数据中添加 users 即可
*/
 
res.render('admin/user', {
userInfo: req.userInfo,
users:users,
page:page,
pages:pages,
count:count,
limit:limit
})
 
})
})
 
module.exports = router
 
——————————————————————
封装模板:
1,   /views/admin/page.html
<!-- 被包含即可 -->
<div class="btn-group" role="group" aria-label="...">
<a href="/admin/user?page={{page-1}}" class="btn btn-default">上一页</a>
<a href="/admin/user?page={{page+1}}" class="btn btn-default">下一页</a>
<li>一共有 {{count}} 条数据</li>
<li>每页显示 {{limit}} 条数据</li>
<li>一共有 {{pages}} 页</li>
<li>当前是在 {{page}} 页</li>
</div>
 
2,用户列表页  /views/admin/user.html
 
{% extends 'layout.html' %}
{% block main %}
<ol class="breadcrumb">
<li><a href="/admin">管理首页</a></li>
<li><span href="/user">用户列表</span></li>
</ol>
<h3>用户列表</h3>
<table class="table table-bordered">
<tr>
<th>用户名</th>
<th>id</th>
<th>密码</th>
<th>是否是管理员</th>
</tr>
<!-- 循环输出数组 . id是对象,需要转换成字符串 -->
 
{% for user in users %}
<tr><td> {{user.username}}</td>
<td> {{user._id.toString()}}</td>
<td> {{user.password}}</td>
{% if user.isAdmin %}
<td> 管理员 <td>
{% else %}
<td> 普通用户</td>
{% endif %}
{% endfor %}
</tr>
</table>
{% include 'page.html' %}
{% endblock %}
 
 
______________________________________
 
10, 弊端:当页数达到一定量之后,分页速度会严重下降。
  
      解决方案: 可以采用这种方式 : 采用Seek Method加速分页   https://segmentfault.com/a/1190000008306966
 

15 ~ express ~ 用户数据分页原理和实现的更多相关文章

  1. 七.数据分页原理,paginator与page对象

    1.分页: Paginator对象 Page对象 2.Paginator: class Paginator(object_list, per_page, orphans=0, allow_empty_ ...

  2. 在pycharm中批量插入表数据、分页原理、cookie和session介绍、django操作cookie

    昨日内容回顾 ajax发送json格式数据 ''' 1. urlencoded 2. form-data 3. json ''' 1. ajax $.ajax({ data: JSON.stringi ...

  3. SMACH(五)----用户数据UserData类和重映射Remapper类的原理和例子

    用户数据UserData类和重映射Remapper类包含在smach中的user_data.py文件中实现,该博文主要介绍其原理和例子 UserData主要用于状态之间的数据传递,包括数据的输入inp ...

  4. php数据分页显示基础

    一:分页原理: 所谓分页显示,也就是将数据库中的结果集认为的分成一段一段的来显示,需要两个初始的参数: 每页多少条记录 ($PageSize)? 当前是第几页($CurrentPageID)? 还有其 ...

  5. 网站统计中的数据收集原理及实现(share)

    转载自:http://blog.codinglabs.org/articles/how-web-analytics-data-collection-system-work.html 网站数据统计分析工 ...

  6. 转:SQL SERVER数据库中实现快速的数据提取和数据分页

    探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...

  7. Android应用程序组件Content Provider在应用程序之间共享数据的原理分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6967204 在Android系统中,不同的应用 ...

  8. 【机器学习实战】第15章 大数据与MapReduce

    第15章 大数据与MapReduce 大数据 概述 大数据: 收集到的数据已经远远超出了我们的处理能力. 大数据 场景 假如你为一家网络购物商店工作,很多用户访问该网站,其中有些人会购买商品,有些人则 ...

  9. 04: Form 验证用户数据 & 生成html

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

随机推荐

  1. 如何利用TableView显示自定义nib中创建的UITableViewCell或子类?

    1.创建nib文件 cell.xib 2.在nib中拖一个UITableView出来,设置其reuse Identifier,再根据cell UI需要拖出view摆放好 3.创建ViewControl ...

  2. PHP获取远程图片

    <?php // // Function: 获取远程图片并把它保存到本地 // // // 确定您有把文件写入本地服务器的权限 // // // 变量说明: // $url 是远程图片的完整UR ...

  3. JAVA实现单例模式的四种方法和一些特点

    JAVA实现单例模式的四种方法和一些特点,需要的朋友可以参考一下     一.饿汉式单例类 复制代码 代码如下: public class Singleton  {      private Sing ...

  4. sklearn调用逻辑回归算法

    1.逻辑回归算法即可以看做是回归算法,也可以看作是分类算法,通常用来解决分类问题,主要是二分类问题,对于多分类问题并不适合,也可以通过一定的技巧变形来间接解决. 2.决策边界是指不同分类结果之间的边界 ...

  5. Linux关于文件处理命令

    一.登陆用户和机器名称 示例:[root@hadoop01 ~]# root:表示用户名 @hadoop01表示机器名称 ~表示当前文件目录是家目录 #表示输入命令提示符,用户可以在其后输入命令:非r ...

  6. spring中的@Transactional注解

    前几天灿哥问我,在做程序的时候,有没有考虑到事务,如果一个函数在中间执行过程中报错了,它会回滚么?我查了一查,spring确实有这样一个注解,能快速帮助我们配置事务管理.下面我就简单介绍一下这个注解. ...

  7. ffmpeg 学习: 003-关键函数介绍

    背景 了解一些关键函数对于开发的帮助比较大. avformat_open_input FFMPEG 打开媒体的过程开始于 avformat_open_input,因此该函数的重要性不可忽视. 在该函数 ...

  8. 使用Zabbix监控Nginx服务实战案例

    使用Zabbix监控Nginx服务实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.编译安装nginx步骤详解并开启状态页 博主推荐阅读: https://www.cn ...

  9. k8s解析service地址方式

    [root@k8s-master ~]# dig -t A kubernetes.default.svc.cluster.local. @10.96.0.10 ; <<>> D ...

  10. /etc/fstab 只读无法修改的解决办法

    在做saltstack的时候不小心误把/etc/fstab给注释了 在命令补全的时候开始报错:[root@kafka2 ~]# cat /et-bash: cannot create temp fil ...