Yuity

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1. 现在我们来给博客添加编辑文章与删除文章的功能。

  假定: 当一个用户在线时,只允许他在自己发表的文章页进行编辑和删除,编辑时,只能编辑文章内容,不能编辑文章标题。

  1.1 首先,我们来给文章页面增加编辑和删除文章的链接。打开 article.ejs 将代码增加如下所示:

<p>
    <% if(user && (user.name == post.name)) { %>
        <a class="edit" href="/edit/<%= post.name %>/<%= post.time.day %>/<%= post.title %>">编辑</a>
        <a class="edit" href="/remove/<%= post.name %>/<%= post.time.day %>/<%= post.title %>">删除</a>
    <% }; %>
</p>

  然后,来给页面增加一些基本的样式,打开style.css,增加代码如下所示:

.edit{
    margin:4px;
    padding:2px 5px;
    border-radius:3px;
    background-color:#f3f3f3;
    color:#333;
    font-size:16px;
}
.edit:hover{
    text-decoration:none;
    background-color:#f00;
    color:#fff;
    -webkit-transition:color .2s linear;
}

  1.2 接下来,我们来给这两个链接注册响应事件,我们打开post.js,增加如下代码:

//返回原始发表的内容(markdown形式)
Post.edit = function(name, day, title, 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);
            }
            //根据用户名、发表日期及文章名进行查询
            collection.findOne({
                "name": name,
                "time.day": day,
                "title": title
            }, function(err, doc) {
                mongodb.close();
                if(err) {
                    return callback(err);
                }
                callback(null, doc);    //返回查询的一篇文章(markdown格式)
            });
        });
    });
};

    然后,打开index.js,在在 app.get('/u/:name/:day/:title') 后添加如下代码:

//编辑页面路由
router.get('/edit/:name/:day/:title', checkLogin);
router.get('/edit/:name/:day/:title', function (req, res) {
      var currentUser = req.session.user;
      Post.edit(currentUser.name, req.params.day, req.params.title, function (err, post) {
        if (err) {
          req.flash('error', err); 
          return res.redirect('back');
        }
        res.render('edit', {
          title: '编辑',
          post: post,
          user: req.session.user,
          success: req.flash('success').toString(),
          error: req.flash('error').toString()
        });
      });
});

    其次,在views下新建edit.ejs,修改代码如下所示:

<%- include common/header %>

<div class='container'>
    <form role="form" method="post">
          <h2>编辑</h2>
          <hr/>
          <div class="form-group">
            <label for="title" class="control-label">标题:</label>
               <input type="text" class="form-control" name="title" value="<%= post.title %>" disabled="disabled">
         </div>
          <div class="form-group">
              <label for="name" class="control-label">正文:</label>
              <textarea class="form-control" name="post" rows="10" cols="10"><%= post.post %></textarea>
        </div>
          <div class="form-group">
            <button type="submit" class="btn btn-primary">保存修改</button>
           </div>
    </form>
</div>

<%- include common/footer %>

    现在,运行我们的博客,单击编辑按钮后就可以跳转到该文章对应的编辑页面了。然后,我们实现将修改后的文章提交到数据库的操作,打开post.js,添加如下代码:

//更新一篇文章及其相关信息
Post.update = function(name, day, title, post, 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);
            }
              //更新文章内容
              collection.update({
                "name": name,
                "time.day": day,
                "title": title
              }, {
                $set: {post: post}
              }, function (err) {
                mongodb.close();
                if (err) {
                      return callback(err);
                }
                callback(null);
              });
        });
      });
};

    然后,打开index.js,在在 app.get('/u/:name/:day/:title') 后添加如下代码:

router.post('/edit/:name/:day/:title', checkLogin);
router.post('/edit/:name/:day/:title', function (req, res) {
      var currentUser = req.session.user;

      Post.update(currentUser.name, req.params.day, req.params.title, req.body.post, function (err) {
        var url = encodeURI('/u/' + req.params.name + '/' + req.params.day + '/' + req.params.title);
        if (err) {
              req.flash('error', err); 
              return res.redirect(url);//出错!返回文章页
        }
        req.flash('success', '修改成功!');
        res.redirect(url);//成功!返回文章页
      });
});

    至此,我们就可以编辑并且保存文章了。赶紧运行试一试吧。

    

    1.2 接下来,我们来实现删除文章的功能,打开post.js,在最后添加如下代码:

//删除一篇文章
Post.remove = function(name, day, title, 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);
              }
              //根据用户名、日期和标题查找并删除一篇文章
              collection.remove({
                "name": name,
                "time.day": day,
                "title": title
            }, {
            w: 1
              }, function (err) {
                mongodb.close();
                if (err) {
                  return callback(err);
                }
                callback(null);
              });
        });
      });
};

  然后,我们打开index.js,在app.post('/edit/:name/:day/:title')后面添加如下代码:

//删除页面路由
router.get('/remove/:name/:day/:title', checkLogin);
router.get('/remove/:name/:day/:title', function (req, res) {
      var currentUser = req.session.user;
      Post.remove(currentUser.name, req.params.day, req.params.title, function (err) {
        if (err) {
          req.flash('error', err); 
          return res.redirect('back');
        }
        req.flash('success', '删除成功!');
        res.redirect('/');
      });
});

 

现在,我们就给博客里的文章添加了编辑和删除的功能。

 

posted on 2016-03-21 12:30  Yuity  阅读(453)  评论(0编辑  收藏  举报