前言:刚开始写博客,现在刚完成评论回复的功能,就想着记录一下,弄了大概有两天,很多都不懂,就自己琢磨着写,记录一下。
一、搭建出页面评论回复的页面功能
image.png
二、设计mongodb集合
1、创建comment评论集合
const mongoose = require('mongoose');
const commentSchema = new mongoose.Schema({
// 用户信息
user: {
// 将当前集合和评论用户集合关联
type: mongoose.Schema.Types.ObjectId,
ref: 'CommentUser',
required: true
},
// 文章Id
articleId: {
type: String,
required: true
},
// 评论用户 user or admin
type: {
type: String,
default: 'user'
},
// 内容
content: {
type: String,
maxlength: 200,
required: true
},
// 创建时间
enterDate: {
type: Date,
default: Date.now
},
// 赞
like: {
type: Number,
default: 1
},
// 踩
hate: {
type: Number,
default: 1
}
});
const Comment = mongoose.model('Comment', commentSchema);
module.exports = Comment
2、创建reply回复集合
const mongoose = require('mongoose');
const replySchema = new mongoose.Schema({
// 回复用户
formUser: {
// 将当前集合和用户集合关联
type: mongoose.Schema.Types.ObjectId,
ref: 'CommentUser',
required: true
},
toUser: {
// 将当前集合和回复用户集合关联
type: mongoose.Schema.Types.ObjectId,
ref: 'CommentUser',
required: true
},
// 内容
replyContent: {
type: String,
maxlength: 200,
required: true
},
// 创建时间
enterDate: {
type: Date,
default: Date.now
},
// 回复对象Id
replyToId: {
// 将当前集合和评论集合关联
type: mongoose.Schema.Types.ObjectId,
ref: 'Comment',
required: true
},
// 回复用户 user or admin
type: {
type: String,
default: 'user'
},
// 赞
like: {
type: Number,
default: 1
},
// 踩
hate: {
type: Number,
default: 1
}
});
const Reply = mongoose.model('Reply', replySchema);
module.exports = Reply
三、api接口(发表评论、回复评论、获取评论列表)
1、发表评论接口
// 发表评论
const fs = require('fs');
const path = require('path')
// 评论
const Comment = require('./../../database/comment')
// 用户
const CommentUser = require('./../../database/commentUser');
// 获取文件夹下的所有图片
const public = fs.readdirSync(path.join(__dirname, '../../public/static'))
// 发表评论
module.exports = async (req, res, next) => {
try {
// 查询当前集合中是否有这个名称
const hasUser = await CommentUser.findOne({ name: req.body.name })
if (hasUser === null) {
// 获取 0 - 20 的随机数
var num = parseInt(Math.random() * 21);
// 获取路径
var defaultAvatar = '/static/' + public[num];
// 头像路径
req.body.avatar = defaultAvatar;
// 没有就创建用户
const hasNotUser = await CommentUser.create(req.body)
// console.log('未拥有', hasNotUser);
req.body.user = hasNotUser._id
} else {
// console.log('已拥有', hasUser);
req.body.user = hasUser._id
}
await Comment.create(req.body)
res.send({
code: 200,
message: '发表成功'
})
} catch (error) {
next(error)
}
}
- 描述:
发表评论
- 请求url:
/comment/publishedComment
- 请求方式:
POST
- 参数:
参数名 | 必选 | 类型 | 描述 |
---|---|---|---|
articleId | 是 | String | 文章ID |
content | 是 | String | 评论内容 |
name | 是 | String | 名称 |
是 | String | 邮箱 | |
website | 否 | String | 网站 |
2、回复评论接口
const fs = require('fs');
const path = require('path')
// 回复
const Reply = require('./../../database/reply')
// 用户
const CommentUser = require('./../../database/commentUser');
// 获取文件夹下的所有图片
const public = fs.readdirSync(path.join(__dirname, '../../public/static'))
// 回复评论
module.exports = async (req, res, next) => {
try {
// 查询当前集合中是否有这个名称
const hasUser = await CommentUser.findOne({ name: req.body.name })
if (hasUser === null) {
// 获取 0 - 20 的随机数
var num = parseInt(Math.random() * 21);
// 获取路径
var defaultAvatar = '/static/' + public[num];
// 头像路径
req.body.avatar = defaultAvatar;
// 没有就创建用户
const hasNotUser = await CommentUser.create(req.body)
// console.log('未拥有', hasNotUser);
req.body.formUser = hasNotUser._id
} else {
// console.log('已拥有', hasUser);
req.body.formUser = hasUser._id
}
await Reply.create(req.body)
res.send({
code: 200,
message: '回复成功'
})
} catch (error) {
next(error)
}
}
- 描述:
回复评论
- 请求url:
/comment/replyComment
- 请求方式:
POST
- 参数:
参数名 | 必选 | 类型 | 描述 |
---|---|---|---|
replyToId | 是 | String | 评论ID |
toUser | 是 | String | 评论用户ID |
name | 是 | String | 名称 |
是 | String | 邮箱 | |
website | 否 | String | 网站 |
replyContent | 是 | String | 回复内容 |
3、获取评论列表
// 评论
const Comment = require('./../../database/comment')
// 回复
const Reply = require('./../../database/reply')
// 获取评论列表
module.exports = async (req, res, next) => {
try {
// 查询评论集合中所有关联 user 信息的文档数据 lean()表示 可以修改 集合默认不可修改
let data = await Comment.find({ articleId: req.query.id }).populate('user', { email: 0, website: 0 }).lean();
// 循环遍历评论集合
for (let item of data) {
// 查询回复集合中所有关联 formUser、toUser 信息的文档数据
let replyList = await Reply.find({ replyToId: item._id }).populate('formUser', { email: 0, website: 0 }).populate('toUser', { email: 0, website: 0 });
// 将查询出来的回复数据 添加到 评论集合中
item['replyList'] = replyList;
}
res.send({
code: 200,
data: data,
message: '成功'
})
} catch (error) {
next(error)
}
}
- 描述:
根据文章ID获取评论列表
- 请求url:
/comment/getCommentListArticleById
- 请求方式:
GET
- 参数:
参数名 | 必选 | 类型 | 描述 |
---|---|---|---|
id | 是 | String | 文章ID |