思路:一个用户在线时,只允许他在自己发表的文章页进行编辑或删除,编辑时只能编辑文章内容,不能编辑文章标题
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>
<% } %>
小结
编辑的原理是,获取当前参数——获取对应数据库信息——使用数据库的更新函数修改信息。
删除原理:根据参数直接删除数据库的信息,返回首页