nodejs实战express笔记之增加编辑与删除功能

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

1、在文章页面添加编辑和删除链接
<span><a class="edit" href="/edit/<%= post.name %>/<%=post.time.day %>/<%= post.title %>">编辑</a></span>
<span><a class="edit" href="/edit/<%= post.name %>/<%=post.time.day %>/<%= post.title %>">删除</a></span>
2、Post模型中添加编辑函数
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格式)
            });
        });
    });
};

3、在index.js入口文件中添加edit路由规则

//编辑页路由
    app.get('/edit/:name/:day/:title',checkLogin);
    app.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.flash('success').toString(),
                success:req.flash('error').toString()
            });
        });
    });
4、建立edit.ejs模板引擎
<%- include header %>
    <form method="post">
      标题<br/>
      <input type="text" name="title" value="<%= post.title %>" disabled="disabled"/>
      正文<br/>
      <textarea name="post" cols="100" rows="20">
        <%= post.post %>
      </textarea>
    </form>
<%- include footer %>
5、在Post模型中添加update方法
//更新一篇文章及其相关信息
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);
            });
        });
    });
};
6、添加修改成功路由
    //编辑完成保存修改请求路由
    app.post('/edit/:name/:day/:title',checkLogin);
    app.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=encodeURL('/u/'+req.params.name+'/'+req.params.day+'/'+req.params.title);//这里原书有问题,作者本人的github上不一样,可以参考
            if(err){
                req.flash('error',err);
                return res.redirect(url);//出错返回文章页
            }
            req.flash('success','修改成功!');
            res.redirect(url);//成功!返回文章页
        });
    });
7、在Post模型中添加remove函数
//删除一篇文章
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();
            }
            //根据用户名、日期和标题查找并删除一篇文章
            collection.remove({
                "name":name,
                "time.day":day,
                "title":title
            },{
                w:1
            },function(err){
                mongodb.close();
                if(err){
                    return callback(err);
                }
                callback(null);
            });
        });
    });
};
8、添加删除路由
//删除请求路由
    app.get('/remove/:name/:day/:title',checkLogin);
    app.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('/');
        });
    });
9、修改权限,实现一个账号只能编辑自己的文章
<span><a class="edit" href="/edit/<%= post.name %>/<%=post.time.day %>/<%= post.title %>">编辑</a></span>
      <span><a class="edit" href="/edit/<%= post.name %>/<%=post.time.day %>/<%= post.title %>">删除</a></span>
//改为
<% if (user && (user.name == post.name)) {%>
      <span><a class="edit" href="/edit/<%= post.name %>/<%=post.time.day %>/<%= post.title %>">编辑</a></span>
      <span><a class="edit" href="/edit/<%= post.name %>/<%=post.time.day %>/<%= post.title %>">删除</a></span>
    <% } %>
小结

编辑的原理是,获取当前参数——获取对应数据库信息——使用数据库的更新函数修改信息。
删除原理:根据参数直接删除数据库的信息,返回首页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值