Node.js 博客实例(七)分页功能

原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第七章,由于版本等的原因,在原教程基础上稍加改动即可实现。

给博客的主页和用户页面增加分页功能。设定:主页和用户页面每页最多显示十篇文章。

这里要用到 mongodb 的 skip 和 limit 操作。

打开 post.js ,把 Post.getAll 函数修改如下:

//读取文章及其相关信息
Post.getTen = function(name,page,callback) {
  //打开数据库
  mongodb.open(function (err, db) {
    if (err) {
      return callback(err);
    }
    //读取 posts 集合
    db.collection('posts', function(err, collection) {
      if (err) {
        mongodb.close();
        return callback(err);
      }
      var query = {};
      if (name) {
        query.name = name;
      }
	  //使用count返回特定查询的文档数
      collection.count(query,function(err,total){
		//根据 query 对象查询,并跳过前 (page-1)*10 个结果,返回之后的 10 个结果
		collection.find(query,{
			skip:(page-1)*10,
			limit:10
		}).sort({
				time: -1
			}).toArray(function (err, docs) {
				mongodb.close();
				if (err) {
					return callback(err);//失败!返回 err
				}
				//解析 markdown 为 html
				docs.forEach(function (doc) {
					doc.post = markdown.toHTML(doc.post);
				});
				callback(null, docs,total);//成功!以数组形式返回查询的结果
			});
		});
	});
});
};

打开 index.js ,修改 app.get(‘/‘, function(req,res){ 如下:

<span style="white-space:pre">	</span>app.get('/', function (req, res) {
		//判断是否是第一页,并把请求的页数转换成 number 类型
		var page=req.query.p?parseInt(req.query.p):1;
		//查询并返回第 page 页的 10 篇文章
		Post.getTen(null,page, function (err, posts,total) {
			if (err) {
				posts = [];
			}
			res.render('index', {
				title: '主页',
				page:page,
				isFirstPage: (page - 1) == 0,
				isLastPage: ((page - 1) * 10 + posts.length) == total,
				user: req.session.user,
				posts: posts,
				success: req.flash('success').toString(),
				error: req.flash('error').toString()
    		});
  		});
    });

注意:这里通过 req.query.p 获取的页数为字符串形式,我们需要通过 parseInt() 把它转换成数字以作后用。同时把 Post.getAll 改成了 Post.getTen 。

修改 index.js中的app.get(‘/u/:name‘) 如下:

<span style="white-space:pre">	</span>app.get('/u/:name', function (req, res) {
		var page=req.query.p?parseInt(req.query.p):1;
		//检查用户是否存在
		User.get(req.params.name, function (err, user) {
			if (!user) {
				req.flash('error', '用户不存在!');
				return res.redirect('/');//用户不存在则跳转到主页
			}
			//查询并返回该用户第 page 页的 10 篇文章
			Post.getTen(user.name,page, function (err, posts,total) {
				if (err) {
					req.flash('error', err);
					return res.redirect('/');
				}
				res.render('user', {
					title: user.name,
					posts: posts,
					page:page,
					isFirstPage: (page - 1) == 0,
					isLastPage: ((page - 1) * 10 + posts.length) == total,
					user : req.session.user,
					success : req.flash('success').toString(),
					error : req.flash('error').toString()
				});
			});
		});
	});

在 blog/views/ 文件夹下新建 paging.ejs ,添加如下代码:

<br />
<div>
  <% if (!isFirstPage) { %>
    <span class="prepage"><a title="上一页" href="?p=<%= page-1 %>">上一页</a></span>
  <% } %>

  <% if (!isLastPage) { %>
    <span class="nextpage"><a title="下一页" href="?p=<%= page+1 %>">下一页</a></span>
  <% } %>
</div>

这里通过 if(!isFirstPage) 判断是否为第一页,不是第一页则显示 “上一页” ;通过 if(!isLastPage) 判断是否为最后一页,不是最后一页则显示 “下一页” 。

接下来在主页和用户页引入分页。修改 index.ejs 和 user.ejs ,在 <%- include footer %> 前添加一行代码:

<%- include paging %>

在 style.css 中添加以下样式:

.prepage a{float:left;text-decoration:none;padding:.5em 1em;color:#ff0000;font-weight:bold;}
.nextpage a{float:right;text-decoration:none;padding:.5em 1em;color:#ff0000;font-weight:bold;}
.prepage a:hover,.nextpage a:hover{text-decoration:none;background-color:#ff0000;color:#f9f9f9;-webkit-transition:color .2s linear;}

效果:

上面发布了11篇文章==

点击下一页

撸代码要多活动活动,多喝水。

时间: 2024-10-08 10:28:34

Node.js 博客实例(七)分页功能的相关文章

Node.js 博客实例(十一)文章检索功能

原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第十一章,由于版本等的原因,在原教程基础上稍加改动即可实现. 现在我们来给博客增加文章检索功能,即根据关键字模糊查询文章标题,且字母不区分大小写. 首先,我们修改 header.ejs ,在 </nav> 前添加一行代码: <span><form action="/search" method="GET"><input type

Node.js 博客实例(九)标签和标签页面

原教程https://github.com/nswbmw/N-blog/wiki/_pages的第九章,由于版本等的原因,在原教程基础上稍加改动即可实现. 每篇文章最多有三个标签(少于三个也可以),当点击主页左侧标签页链接时,跳转到标签页并列出所有已存在标签:当点击任意一个标签链接时,跳转到该标签页并列出所有含有该标签的文章. 首先我们来实现给文章添加标签的功能. 打开 post.ejs ,在 <input type="text" name="title" /

Node.js 博客实例(五)编辑与删除功能

原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第五章,由于版本等的原因,在原教程基础上稍加改动即可实现. 现在给博客添加编辑文章与删除文章的功能. 当一个用户在线时,只允许他在自己发表的文章页进行编辑或删除,编辑时,只能编辑文章内容,不能编辑文章标题. 在style.css ,添加如下样式: .edit{margin:3px;padding:2px 5px;border-radius:3px;background-color:#f3f3f3;c

Node.js 博客实例(三)添加文件上传功能

原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第三章 上传文件眼下有三种方法: 使用 Express 自带的文件上传功能,不涉及数据库 使用 Formidable 外部模块,不涉及数据库 上传到 MongoDB ,涉及数据库 这里使用第一种,用户将文件上,存储于:blog/public/images/文件夹下. blog/views/header.ejs  在<span><a title="发表" href=&quo

Node.js 博客实例(三)增加文件上传功能

原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第三章 上传文件目前有三种方法: 使用 Express 自带的文件上传功能,不涉及数据库 使用 Formidable 外部模块,不涉及数据库 上传到 MongoDB ,涉及数据库 这里使用第一种,用户将文件上,存储于:blog/public/images/目录下. blog/views/header.ejs  在<span><a title="发表" href="

Node.js 博客实例(六)留言功能

原教程https://github.com/nswbmw/N-blog/wiki/_pages的第五章,由于版本等的原因,在原教程基础上稍加改动即可实现. 实现用户给文章留言的功能,留言保存在数据库中. post.js ,修改 Post.prototype.save 中要存入的文档为: //要存入数据库的文档 var post = { name: this.name, time: time, title: this.title, post: this.post, comments:[] }; 我

Node.js 博客实例(一)简单博客

原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第一章.因为版本号等的原因,在原教程基础上稍加修改就可以实现. 环境: win7旗舰版64位 Node.js:0.10.31 mongodb:2.6.4 express:3.× 效果: 注冊界面: 登录界面: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZG9uZ3NoYW9zaHVhaQ==/font/5a6L5L2T/fontsize/400/fil

Node.js 博客实例(四)实现用户页面和文章页面

原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第四章,由于版本等的原因,在原教程基础上稍加改动即可实现. 现在,我们来给博客添加用户页面和文章页面. 所谓用户页面就是当点击某个用户名链接时,跳转到:域名/u/用户名 ,并列出该用户的所有文章. 同理,文章页面就是当点击某篇文章标题时,跳转到:域名/u/用户名/时间/文章名 ,进入到该文章的页面. post.js: 将 Post.get 修改为 Post.getAll ,同时将 index.js

Node.js 博客实例(十)pv统计和留言统计

原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第十章,因为版本号等的原因,在原教程基础上稍加修改就可以实现. post.js中将var post={...}修改为(每次修改此处之后都要将e:/mongodb/blog/清空): //要存入数据库的文档 var post = { name: this.name, time: time, title: this.title, post: this.post, tags:this.tags, comm