一,在后台路由 /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. Day9 - J - 吉哥系列故事——恨7不成妻 HDU - 4507

    单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 77=7 ...

  2. Day3-Q-修补木桶 HihoCoder1362

    一只木桶能盛多少水,并不取决于桶壁上最高的那块木板,而恰恰取决于桶壁上最短的那块. 已知一个木桶的桶壁由N块木板组成,第i块木板的长度为Ai. 现在小Hi有一个快捷修补工具,每次可以使用修补工具将连续 ...

  3. 前端学习笔记系列一:13new Date()的参数

    前两天发现手机页面的倒计时在Android上正常显示,在iPhone却不能显示. 后来又发现在ff和ie里也不显示.(以前只在chrome里看过,显示正常). 后来同事改了new Date()里字符串 ...

  4. 基于PIL模块创建验证码图片

    def get_valid_img(request): # 方式2:基于PIL模块创建验证码图片 from PIL import Image, ImageDraw, ImageFont from io ...

  5. JAVA地址栏重写很详细

    这几天蛋疼.看看别人url重写是怎么搞的..1.解释下什么事url重写,以及它的优缺点: URL重写,其实就是把带一大堆参数的url,变成一个看上去很规矩的url.例:/viewthread.jsp? ...

  6. php 键值数组搜索查询

    php  键值数组查询 ,需要先将其转换为纯数组,然后才能用in_array 进行搜索. $arr_combos = [ ['id' => '1001', 'value' => 'zs' ...

  7. Jquery制作插件---内容切换

    //需求:点击左右导航箭头,实现内容的切换 //代码如下 <!DOCTYPE html> <html lang="en"> <head> < ...

  8. 使用Vue 和 内网穿透:返回 invalid host header

    原因:新版的webpack-dev-server出于安全考虑,默认检查hostname,如果它不是配置内的,将会中断访问. -------------------------------------- ...

  9. C++字符集和词法记号以及符号常量

    C++字符集 大小写的英文字母:A~Z,a~z 数字符号:0~9 特殊字符:!#%*()等 关键字:C++预定义的单词 标识符:程序员声明的单词,它命名程序正文中的一些实体 文字:在程序中直接使用符号 ...

  10. 51nod 1444:破坏道路 广度优先搜索

    1444 破坏道路 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  取消关注 在某一个国家,那儿有n个城市,他们通过 ...