• 一个简单的blog系统(七) 实现分页功能


    1.现在我们给博客的主页和用户界面增加分页功能。设定主页和用户界面最多显示10篇文章。

      这里我们采用mongodb的 limit 和 skip 操作

      1.1 首先打开post.js, 修改Post.getAll函数如下所示:

    Post.getThree = 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);
                }
                //查找name属性为name的文章记录,如果name为null则查找全部记录
                var query = {};
                if(name) {
                    query.name = name;
                }
                // //根据query对象来查询文章,并按照时间排序
                // collection.find(query).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);    //成功,以数组的形式返回查询的结果
                // });
                
                //使用count返回特定查询的文档数total
                collection.count(query, function(err, total) {
                    //根据query对象查询,并跳过前(page-1)*10个结果,返回之后的10个结果
                    collection.find(query, {
                        skip: (page - 1) * 3,
                        limit: 3
                    }).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);    //成功,以数组的形式返回查询的结果
                    });
                })
            });
        });
    };

      1.2  然后打开index.js,修改router.get('/')如下所示,这里通过req.query.p获取的页数为字符串形式,我们把他parseInt() 把它转换成数字以作后用:

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

      1.3 修改router.get('u/name')如下所示:

    //用户页面路由
    router.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页的3篇文章文章
            Post.getThree(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) * 3 + posts.length) == total,                
                    user: req.session.user,
                    success: req.flash('success').toString(),
                    error: req.flash('error').toString()
                });
            });
        });
    });

      1.4 接下来在views文件夹下面新建page.ejs ,添加如下代码:

    <div class='container'>
        <nav>
              <ul class="pagination">
                <% if (!isFirstPage) { %>
                    <li>
                        <a href="?p=<%= page-1 %>" aria-label="Previous" title="上一页">
                          <span aria-hidden="true">上一页</span>
                        </a>
                    </li>
                <% } %>
    
                <% if (!isLastPage) { %>
                    <li>
                        <a href="?p=<%= page+1 %>" aria-label="Next" title="下一页">
                          <span aria-hidden="true">下一页</span>
                        </a>
                    </li>
                <% } %>
            </ul>
        </nav>
    </div>

      1.5 最后,我们在index.ejs 和user.ejs 的添加一行代码:

    <%- include page %>

    至此,我们就实现了博客的分页功能。

  • 相关阅读:
    shell习题第21题:计算数字的个数
    shell习题第20题:统计文件大小
    萌新小白
    编程第一天
    萌新报道
    linux下安装php扩展pdo_oci和oci8
    安装Hadoop伪分布式踩过的坑
    zabbix安装过程
    MySQL_索引
    mysql复制
  • 原文地址:https://www.cnblogs.com/yuity/p/5302388.html
Copyright © 2020-2023  润新知