zoukankan      html  css  js  c++  java
  • 一个简单的blog系统(九) 增加标签和标签页面

    1.现在,我们来给博客添加标签和标签页面。

      假定每篇文章最多只有两个标签,当单机主页左侧标签页链接的时候,跳转到标签页并且列出所有已经有的标签,当单击任意一个标签链接时,跳转到该标签页并列出所有含有该标签的所有文章。

      1.1 添加标签

    首先我们来给文章添加标签的功能。打开post.ejs,添加如下代码:

    <div class="form-group">
        <label class="control-label">标签:</label>
        <input type="text" name="tag1" class="form-inline" /> 
        <input type="text" name="tag2" class="form-inline"/>
    </div>

    然后,打开index.js,修改如下地方,如下所示:

    router.post('/post', checkLogin);
    router.post('/post', function(req, res) {
        var currentUser = req.session.user,
            tags = [req.body.tag1, req.body.tag2],
            post = new Post(currentUser.name, req.body.title, tags, req.body.post);
    
        post.save(function(err) {
            if(err) {
                req.flash('error', err);
                return res.redirect('/');
            }
            req.flash('success', '发布成功!');
            res.redirect('/');    //发表成功即跳转到首页
        });
    });

    打开post.js,修改代码如下所示:

    function Post(name, title, tags, post) {
        this.name = name;
        this.title = title;
        this.tags = tags;
        this.post = post;
    }
    
    var post = {
            name: this.name,
            time: time,
            title: this.title,
            post: this.post,
            tags: this.tags,
            comments: []
        };

    然后,index.ejs、user.ejs和article.ejs,增加代码如下所示:

    标签:
    <% post.tags.forEach(function (tag, index) { %>
        <% if (tag) { %>
                <a class="tag" href="/tags/<%= tag %>"><%= tag %></a>
        <% } %>
        <% }) %>
    </p>

    最后,我们打开style.css,添加如下代码:

    .tag{
        background-color:#f0c;
        border-radius:3px;
        font-size:14px;
        color:#fff;
        display:inline-block;
        padding:0 5px;
        margin-bottom:8px;
    }
    .tag:hover{
        text-decoration:none;
        background-color:#ccc;
        color:#000;
        -webkit-transition:color .2s linear;
    }

      1.2 添加标签页

    首先,我们修改header.ejs,增加一行代码如下所示:

    <li><a href="/tags" title='标签'>标签</a></li>

    然后,修改post.js,增加的代码如下所示:

    //返回所有标签
    Post.getTags = function(callback) {
          mongodb.open(function (err, db) {
            if (err) {
              return callback(err);
            }
            db.collection('posts', function (err, collection) {
                  if (err) {
                    mongodb.close();
                    return callback(err);
                }
                  //distinct 用来找出给定键的所有不同值
                  collection.distinct("tags", function (err, docs) {
                       mongodb.close();
                    if (err) {
                      return callback(err);
                    }
                    callback(null, docs);
                  });
            });
          });
    };

    然后,打开index.js,增加的代码如下所示:

    //标签页面路由
    router.get('/tags', function (req, res) {
          Post.getTags(function (err, posts) {
            if (err) {
              req.flash('error', err); 
              return res.redirect('/');
            }
                res.render('tags', {
                  title: '标签',
                  posts: posts,
                  user: req.session.user,
                  success: req.flash('success').toString(),
                  error: req.flash('error').toString()
            });
          });
    });

    最后,我们在views文件夹下面新建tags.ejs,添加的代码如下所示:

    <%- include common/header %>
    
    <div class='container'>
        <h2>标签页</h2>
        <hr/>
        <% posts.forEach(function (tag, index) { %>
          <a class="tag" href="/tags/<%= tag %>"><%= tag %></a>
        <% }) %>
    </div>
    <%- include common/footer %>

      1.3 添加特定标签的页面

    首先,修改post.js,增加的代码如下所示:

    //返回含有特定标签的所有文章
    Post.getTag = function(tag, callback) {
          mongodb.open(function (err, db) {
            if (err) {
              return callback(err);
            }
            db.collection('posts', function (err, collection) {
                if (err) {
                    mongodb.close();
                    return callback(err);
                  }
                  //查询所有 tags 数组内包含 tag 的文档
                  //并返回只含有 name、time、title 组成的数组
                  collection.find({
                    "tags": tag
                  }, {
                    "name": 1,
                    "time": 1,
                    "title": 1
                  }).sort({
                    time: -1
                  }).toArray(function (err, docs) {
                    mongodb.close();
                    if (err) {
                          return callback(err);
                    }
                    callback(null, docs);
                  });
            });
          });
    };

    然后,我们修改index.js,增加的代码如下所示:

    //详细标签页页面路由
    router.get('/tags/:tag', function (req, res) {
          Post.getTag(req.params.tag, function (err, posts) {
            if (err) {
                  req.flash('error',err); 
                  return res.redirect('/');
            }
            res.render('tag', {
                  title: 'TAG:' + req.params.tag,
                  posts: posts,
                  user: req.session.user,
                  success: req.flash('success').toString(),
                  error: req.flash('error').toString()
            });
          });
    });

    然后,我们在views文件夹下新建tag.js,添加如下所示的代码:

    <%- include common/header %>
    
    <div class='container'>
        <ul class="list-group">
            <% var lastYear = 0 %>
            <% posts.forEach(function (post, index) { %>
                  <% if (lastYear != post.time.year) { %>
                <li class="list-group-item"><%= post.time.year %></li>
                  <% lastYear = post.time.year } %>
                <li class="list-group-item list-group-item-info"><%= post.time.day %></li>
                <li class="list-group-item">
                    <span class="badge"><%= post.name %></span>
                    <a href="/u/<%= post.name %>/<%= post.time.day %>/<%= post.title %>" style="color: purple;"><%= post.title %></a>
                </li>
            <% }) %>
        </ul>
    </div>
    <%- include common/footer %>

    最后,不能忘了edit.ejs,为了保持和post.ejs一直,我们增加其中的代码为:

    <div class="form-group">
        <label for="name" class="control-label">标签:</label>
      //这里我们假设编辑时不能编辑文章的标题和标签 <input type="text" name="tag1" class="form-inline" value="<%= post.tags[0] %>" disabled="disabled"/> <input type="text" name="tag2" class="form-inline" value="<%= post.tags[1] %>" disabled="disabled"/> </div>

    至此,我们的增加了标签和标签页的功能

  • 相关阅读:
    DOM(文档对象模型)
    客户端检测
    mysql之触发器
    mysql之select(二)
    浅谈mysql中varchar(m)与char(n)的区别与联系
    mysql之select(一)
    mysql(一)
    mysql5.7.11安装遇到的问题
    Java 网络编程(二)
    Java 网络编程(一)
  • 原文地址:https://www.cnblogs.com/yuity/p/5303955.html
Copyright © 2011-2022 走看看