首页 > 技术文章 > vue+mongoose+node.js项目总结第三篇_实现评论和回复功能

xxm980617 2019-09-04 10:59 原文

一、前言                                                                          

1、如下面演示所示:点击评论的时候是评论该条动态,点击评论的内容列表就是在回复发起评论的那个人。

二、主要知识                                                                   

1、功能实现分析

      第一步:用户点击“评论”,跳转到一个单独的评论页面

      第二步:如果是点击评论列表,跳转到一个单独的回复页面(评论页面和回复页面是同一个)

      第三步:输入评论或者回复的内容,点击发送的时候请求后端接口评论成功

      第四步:评论成功后跳转到浏览动态的页面

2、前台实现

 Found.vue中:

(1)评论的时候将该条动态的id, 发布该条动态的用户名传进去, 回复的时候将该条动态的id、comment.from是评论的人、以及发布动态的用户

 

 

(2)这里使用的是动态路由参数:https://www.jianshu.com/p/45ee7a6bdc0c

      //评论
      comment(id,writer){//moodlist._id, moodlist.writer.username
        this.$router.push({path:'/comment', query:{id, writer}})
      },

      //回复
      commentTo(id, to, writer){//id是动态id, to是被回复的人,writer是发表动态的人
        console.log(id, to, writer)
        this.$router.push({path:'/comment', query:{id, to, writer}})

      },

 

Comment.vue中:

 

(1)因为评论和回复组件是用的同一个,所以用是否传入了“被回复人”来区分是回复还是评论

 

 

(2)data对象里面保存从Found.vue中传过来的参数

data(){
           return{
                to:this.$route.query.to || '', //to是被回复的人
                id:this.$route.query.id || '', //动态的id
                 writer:this.$route.query.writer || '',
                content:''//评论或者回复的内容
            }
            

        },
computed:{
          ...mapState(['userInfo'])
        },

 

(3)comment方法请求后台评论

comment(){
                if(!this.content){
                    Toast('内容不能为空')
                    return
                }

                this.$axios.post('/api/comment/comment',{
                    writer: this.writer, //发动态的作者
                    from: this.userInfo.username, //回复人
                    to: this.to, //被回复的用户
                    Mood:this.id, //动态的id
                    content: this.content //评论内容
                }).then((rs)=>{
                    console.log(111)

                    if(this.writer === this.userInfo.username && this.to === this.userInfo.username){
                        //返回到上一个路由
                        this.$router.go(-1)
                        Toast(rs.data.msg)
                        return
                    }

                    this.$router.go(-1)
                    Toast(rs.data.msg)


                })
            }

 

3、后台实现

(1)实现用户评论和回复功能需要用到三个schema对象模型,首先是用户User对象模型、PdMood动态schema模型、Comment评论schmema模型

User对象模型:

 

let express = require('express')

let mongoose = require('mongoose')

module.exports = new mongoose.Schema({
    username: String,
    password: String,

    nickName:{  
        type: String,
        default: '一只会说话的猪'
    },
    isAdmin:{ //标识是否为管理员
        type: Boolean,
        default: false
    },
    avater:{
        type: String,
        default:'http://localhost:4000/public/images/ava.jpg'

    },
    description:{
        type:String,
        default:'这个人很懒,什么都没留下'
    },

    cartList:{
        type: Array
    }
})

 

PdMood动态对象模型:

 

/*
用户动态的schemas
*/
var mongoose = require('mongoose')
module.exports = new mongoose.Schema({
    addTime:{
        type: Date,
        default: Date.now
    },
    content:String, //用户发表内容
    writer:{
       type: mongoose.Schema.Types.ObjectId, //这里的类型是User里面的id
       ref:'User'//关联User集合
    },
    comments:[{
        type:mongoose.Schema.Types.ObjectId,
        ref:'Comment'
    }],
    moodImg:{//用户上传的图片数组
        type: Array,
        default:[]
    }
})

 

Comment评论模型:

let express = require('express')

let mongoose = require('mongoose')

module.exports = new mongoose.Schema({
    addTime:{
        type: Date,
        default: Date.now
    },
    content:{
        type:String
    },
    writer:{
        type:String
    },
    from:{
        type:String
    },
    to:{
        type:String
    },
    Mood:{
        type:mongoose.Schema.Types.ObjectId,
        ref:'PdMood'
    }
    
})

 

(2)前台点击“发送”请求后台:"/comment"接口

/*
处理用户评论的模块
*/
let User = require('../Models/User')
let PdMood = require('../Models/PdMood')
let Comment = require('../Models/Comment')
let express = require('express')
let router = express.Router()

router.post('/comment',(req,res)=>{
    let content = req.body.content //接受到评论内容
    let from = req.body.from //评论人
    let to = req.body.to ||'' //被评论
    let moodId = req.body.Mood //被评论动态的id
    //拿到这些参数之后新建一个评论对象存储这些参数
    let writer = req.body.writer//发布动态的人
    console.log(content,from,to,moodId,writer)
    new Comment({
        content: content,
        from: from,
        to: to,
        Mood: moodId,
        writer: writer
    })
    .save()//保存
    .then((rs)=>{//保存成功之后去动态表里面查找动态
        PdMood.findOne({
            _id: moodId
        }).then((result)=>{
            let comments = result.comments //取到关于该动态的所有评论
            comments.push(rs._id) //在当前的动态数中将当前的评论加到该动态的评论数组中
            PdMood.update({//更新该动态
              _id: moodId
            },{
                comments:comments
            })
            .then(()=>{
                res.json({
                    code:0,
                    msg:'评论成功'
                })
            })
        })
    })
})

module.exports = router;

 

推荐阅读