web前端 | 博客(十三)评论功能

12月29日 收藏 0 评论 0 前端开发

web前端 | 博客(十三)评论功能

文章声明:转载来源:https://blog.csdn.net/qq_40644568/article/details/103941757

一、评论功能

1.创建评论集合

2.判断用户是否登录,如果用户登录,再允许用户提交评论表单

3.在服务器端创建文章评论功能对应的路由

4.再路由请求处理函数中接受客户端传递过来的评论信息

5.将评论信息存储在评论集合中

6.将页面重定向回文章详情页面

7.在文章详情页面路由.中获取文章评论信息并展示在页面中

二、在model下新建comment.js

const mongoose = require('mongoose');

const commentSchema = new mongoose.Schema({
//文章id
aid: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Article',
},
//用户id
uid: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
},
//评论时间
publishDate: {
type: Date,
default: Date.now, //当前时间
},
content: {
type: String
}
});

//3. 使用规则创建文章集合
const Comment = mongoose.model('Comment', commentSchema);

//4. 将集合规则作为模块成员导出
module.exports = {
Comment
}

三、判断登录角色

在login.js中判断登录角色

if(user.role == 'admin') {
//重定向到用户列表页面
res.redirect('/admin/user');
} else {
//重定向到用户列表页面
res.redirect('/home/');
}

四、限制普通用户访问后台管理页面

在登录时,将用户角色存储在session对象中

login.js

req.session.role = user.role;

在middleware下的loginGuard.js中

//判断用户访问的是否是登录页面
//判断用户的登录状态
//如果用户是登录的,将请求放行
//如果用户不是登录的,将请求重定向到登录页面
if(req.url != '/login' && !req.session.username) {
res.redirect('/admin/login');
} else {
//如果用户是登录状态,并且是普通用户
if(req.session.role == 'normal') {
//让它跳转到墨客首页,阻止程序向下执行
return res.redirect('/home/');
}
//用户是登录状态,将请求放行
next();
}
}

五、对未登录用户提示登录后才能评论

在article.art中

{{if userInfo}}
<h4>评论</h4>
<form class="comment-form">
<textarea class="comment"></textarea>
<div class="items">
<input type="submit" value="提交">
</div>
</form>
{{else}}
<div><h2>先进行登录,再对文章进行评论</h2></div>
{{/if}}

未登录状态:

然而userInfo存储在req.app.locals中,即使退出登录,删除了服务器端的session,删除了客户端的cookie,但是userInfo并不为空。所以要在退出时对它进行置空。

在logout.js中

req.app.locals.userInfo = null;

六、实现添加评论功能

为表单添加请求地址请求方式,为表单控件添加name属性。

给表单添加隐藏域,分别存储文章id和用户id。

在服务器端添加评论添加请求的路由,将客户端中传来的评论信息存储在数据库当中。

article.art

<form class="comment-form" action="/home/comment" method="post">
<textarea class="comment" name="content"></textarea>
<input type="hidden" name="uid" value="{{@userInfo._id}}">
<input type="hidden" name="aid" value="{{@article._id}}">
<div class="items">
<input type="submit" value="提交">
</div>
</form>

在home.js中创建评论功能路由,

req.body中

所以可以从其中拿到请求信息。

在home文件夹下的comment.js中

//将评论集合构造函数进行导入
const { Comment } = require('../../model/comment');

module.exports = async (req, res) => {
//接受客户端传递过来的请求参数
const { content, uid, aid } = req.body;

//将评论信息存储到评论集合中
await Comment.create({
content: content,
uid: uid,
aid: aid,
time: new Date()
});

//将页面重定向回文章详情页面
res.redirect('/home/article?id='+ aid);
}

其中有了数据。

七、评论展示功能

在文章详情的路由请求页面中,根据文章id,从评论集合中查询出评论,并将查询出来的数据展示在页面中。

在article.js中,根据文章的id查询评论信息。

let comments = await Comment.find({aid: id});

因为要得到评论人的信息,所以要.populate('uid')。

将查询出来的评论信息传入模板当中,在模板中使用模板语法即可。

在article.art中,

{{each comments}}
<div class="mb10">
<div class="article-info">
<span class="author">{{$value.uid.username}}</span>
<span>{{dateFormat($value.time), 'yyyy-mm-dd'}}</span>
<span>{{$value.uid.email}}</span>
</div>
<div class="comment-content">
{{$value.content}}
</div>
</div>
{{/each}}

提交后新评论可以正常显示。

C 0条回复 评论

帖子还没人回复快来抢沙发