使用MongoDB搭建博客评论多级回复

前言:刚开始写博客,现在刚完成评论回复的功能,就想着记录一下,弄了大概有两天,很多都不懂,就自己琢磨着写,记录一下。

一、搭建出页面评论回复的页面功能

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 名称
email 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 名称
email 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容