鍍金池/ 教程/ HTML/ 第11章 增加文章檢索功能
第9章 增加標(biāo)簽和標(biāo)簽頁面
番外篇之——使用 Mongoose
番外篇之——使用 Async
第4章 實現(xiàn)用戶頁面和文章頁面
第12章 增加友情鏈接
第14章 增加頭像
第7章 實現(xiàn)分頁功能
第5章 增加編輯與刪除功能
第11章 增加文章檢索功能
第3章 增加文件上傳功能
番外篇之——部署到 Heroku
第2章 使用 Markdown
第13章 增加404頁面
第16章 增加日志功能
第1章 一個簡單的博客
番外篇之——使用 Handlebars
第10章 增加pv統(tǒng)計和留言統(tǒng)計
番外篇之——使用 Passport
第15章 增加轉(zhuǎn)載功能和轉(zhuǎn)載統(tǒng)計
第8章 增加存檔頁面
番外篇之——使用 generic pool
番外篇之——使用 _id 查詢
番外篇之——使用 Disqus
番外篇之——使用 KindEditor
第6章 實現(xiàn)留言功能

第11章 增加文章檢索功能

現(xiàn)在我們來給博客增加文章檢索功能,即根據(jù)關(guān)鍵字模糊查詢文章標(biāo)題,且字母不區(qū)分大小寫。 首先,我們修改 header.ejs ,在 前添加一行代碼:

<span><form action="/search" method="GET"><input type="text" name="keyword" placeholder="SEARCH" class="search" /></form></span>

在 style.css 中添加一行樣式:

.search{border:0;width:6em;text-align:center;font-size:1em;margin:0.5em 0;}

打開 post.js ,在最后添加如下代碼:

//返回通過標(biāo)題關(guān)鍵字查詢的所有文章信息
Post.search = function(keyword, callback) {
  mongodb.open(function (err, db) {
    if (err) {
      return callback(err);
    }
    db.collection('posts', function (err, collection) {
      if (err) {
        mongodb.close();
        return callback(err);
      }
      var pattern = new RegExp(keyword, "i");
      collection.find({
        "title": pattern
      }, {
        "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 ,在 app.get('/u/:name') 前添加如下代碼:

app.get('/search', function (req, res) {
  Post.search(req.query.keyword, function (err, posts) {
    if (err) {
      req.flash('error', err); 
      return res.redirect('/');
    }
    res.render('search', {
      title: "SEARCH:" + req.query.keyword,
      posts: posts,
      user: req.session.user,
      success: req.flash('success').toString(),
      error: req.flash('error').toString()
    });
  });
});

在 views 文件夾下新建 search.ejs ,添加如下代碼:

<%- include header %>
<ul class="archive">
<% var lastYear = 0 %>
<% posts.forEach(function (post, index) { %>
  <% if(lastYear != post.time.year) { %>
    <li><h3><%= post.time.year %></h3></li>
  <% lastYear = post.time.year } %>
    <li><time><%= post.time.day %></time></li>
    <li><a href="/u/<%= post.name %>/<%= post.time.day %>/<%= post.title %>"><%= post.title %></a></li>
<% }) %>
</ul>
<%- include footer %>

注意:目前為止,你會發(fā)現(xiàn) tag.ejs 和 search.ejs 代碼完全一樣,因為我們都用相同的布局。這也突出了模版的優(yōu)點之一 —— 可以重復(fù)利用,但我們這里并沒有把這兩個文件用一個代替,因為每一個文件的名字代表了不同的意義。

現(xiàn)在,我們給博客添加了文章檢索功能。