微信小程序云开发之动态评论功能,可在父评论下进行子评论。

最近开发小程序用户发布动态之后,需要进行评论,刚开始没什么思路。就在网上逛了一圈,也没啥结果,都不是我想要的。要么是转载,要么是讲的不够清楚。

经过我半天的思考和开发,终于将这个评论功能给实现了。先看个效果图吧:
在这里插入图片描述

在这里插入图片描述
今天我就带大家了解一下评论功能!

评论功能实现步骤:

  1. 设计数据库信息储存方式
  2. 编写逻辑代码
  3. 编写云函数

实现评论功能,最重要的一点就是设计数据库到底该如何进行储存评论的内容,这一点很重要!如果不了解这个,给你代码你也不一定能搞懂。并且那么长的代码我直接复制粘贴出来,你也不一定看!

数据库设计,我是在每条动态里放一个 comment 数组字段,父评论直接以json格式存入数组中,所以在界面显示父评论时直接用循环就可以了。那么子评论也类似,在每个父评论的记录中有个字段为childComment 数组子弹用于储存子评论。有子评论的话直接将信息以json格式存入childComment数组中。
给大家看个数据库的格式图:
在这里插入图片描述
以这种方式设计的储存格式,不用判断哪条父评论属于哪个动态,也不用判断哪个子评论属于哪个父评论。在页面上展示的时候,就直接用两个for循环就OK了。

估计代码全给你们,你们也不会看,并且复制拿走之后,你们也许要修改一下代码,逻辑代码比较长,有三百行。所以,上面的思路给你们之后,你们就按照那样的数据库进行设计就行了。如有问题,可以在评论区问我。

先给大家看一下界面代码吧:

<view class="commentBlock">
    <text class="comtitle">全部评论</text>
    <view wx:for="{{dynamicInfo.comment}}" wx:key="{{index}}" class="comments">
        <view class="parent">
            <view class="a-n-t">
                <image class="ava" src="{{item.avatarUrl}}"></image>
                <view class="n-t">
                    <view class="avlogo">
                        <text class="textnick">{{item.nickName}}</text>
                        <image class="logo" wx:if="{{item.isbuilding}}" src="cloud://hualibiaobaiqiang-1omla.6875-hualibiaobaiqiang-1omla-1302418355/me_icon/6-楼主.png"></image>
                    </view>
                    <text class="comtime">{{item.commentTime}}</text>
                </view>
            </view>
            <view class="com" data-index="{{index}}" data-name="{{item.nickName}}" data-id="{{item.id}}" data-openid="{{item.openid}}" bindlongpress="iscommenter" bindtap="replayCom">
                <text>{{item.commentText}}</text>
            </view>
            <view class="childComment" wx:for="{{item.childComment}}"  wx:for-item="item" wx:key="*this" wx:for-index="bindex">
            <text decode="{{true}}" space="{{true}}">{{item.nickName}}&nbsp;回复@&nbsp;{{item.replyName}}:&nbsp;</text>
                <text data-bindex="{{bindex}}" data-index="{{index}}" data-name="{{item.nickName}}" data-id="{{item.id}}" data-openid="{{item.openid}}" bindlongpress="ischildcommenter" bindtap="replayCom">{{item.commentText}}</text>
            </view>
        </view>
    </view>
</view>

<form bindsubmit="submit">
  <view class='ask'>
    <input class='input' type='text' focus="{{focus}}" value="{{value}}" placeholder='{{placeholder}}' bindblur="blur" name="comment"/>
    <button class='button' form-type="submit">评论</button>
  </view>
</form>

css:

.commentBlock{
    margin-top: 10rpx;
    margin-bottom: 200rpx;
    padding: 20rpx;
    flex-direction: column;
    display: flex;
}
.comtitle{
    font-size: 14px;
    color:#666;
}
.comments{
    margin-bottom: 50rpx;
}
.parent{
    flex-direction: column;
    display: flex;
}
.a-n-t{
    flex-direction: row;
    display: flex;
    height: 85rpx;
    width: 100%;
    margin-bottom: 10rpx;
}
.ava{
    height: 85rpx;
    width: 85rpx;
}
.avlogo{
    flex-direction: row;
    display: flex;
    height: 55rpx;
}
.n-t{
    width: auto;
    height: 85rpx;
    flex-direction: column;
    display: flex;
    margin-left: 20rpx;
}
.comtime{
    font-size: 14px;
    color: #666;
    height: 23rpx;
}
.textnick{
    height: 52rpx;
    width: auto;
}
.logo{
    height: 55rpx;
    width: 64rpx;
    margin-left: 5rpx;
}
.com{
    margin-left: 85rpx;
    margin-bottom: 10rpx;
}
.childComment{
    padding:10rpx 20rpx;
    border-radius: 20rpx;
    height: auto;
    width: 600rpx;
    margin-left: 85rpx;
}

接着就是逻辑代码了:

submit(e){
      console.log(e)
      if(e.detail.value.comment==''){
        wx.showToast({
          title: '请输入回复内容',
          icon:'none'
        })
      }else{
      wx.showLoading({
        title: '发送中...',
      })
      const Time = utils.formatTime(new Date())
      const sendtime = Time.split(' ')
      const hs = sendtime[1].split(':')
      const HS = hs[0]+':'+hs[1]
      const commentTime = sendtime[0]+' '+HS
      const openid = wx.getStorageSync('openId')
      const userInfo = wx.getStorageSync('userInfo')
      if(openid){
          if(openid==this.data.dynamicOpenid&&this.data.placeholder=='我来说两句~'){        //判断是否为楼主
            wx.cloud.callFunction({
              name:"addComment",
              data:{
                avatarUrl:userInfo.avatarUrl,       //回复者头像
                nickName:userInfo.nickName,      //回复者名称
                _id:this.pagesData,   //动态ID,随机数
                commentText:e.detail.value.comment,   //回复内容
                commentTime:commentTime,            //回复时间
                openid:openid,                    //回复者openid
                replyName:'',         //被回复者名称
                isbuilding:true,          //是否为楼主
                childComment:[],        //子评论
                id:Math.floor(Math.random()*100000000)                  //通过该条记录在父评论数组中的索引来添加子评论
              },
              success:res=>{
                wx.showToast({
                  title: '评论成功!',
                  icon:'success'
                })
                this.setData({
                  value:''
                })
                wx.hideLoading({
                  success: (res) => {},
                })
                this.getDynamic()
              }
            })
          }else if(openid!=this.data.dynamicOpenid&&this.data.placeholder=='我来说两句~'){
              wx.cloud.callFunction({
                name:"addComment",
                data:{
                avatarUrl:userInfo.avatarUrl,       //回复者头像
                nickName:userInfo.nickName,      //回复者名称
                _id:this.pagesData,  //动态ID
                commentText:e.detail.value.comment,   //回复内容
                commentTime:commentTime,            //回复时间
                openid:openid,                    //回复者openid
                replyName:'',         //被回复者名称
                isbuilding:false,          //是否为楼主
                childComment:[],        //子评论
                id:Math.floor(Math.random()*100000000)                     //通过该条记录在父评论数组中的索引来添加子评论
                },
                success:res=>{
                  wx.showToast({
                    title: '评论成功!',
                    icon:'success'
                  })
                  this.setData({
                    value:''
                  })
                  this.getDynamic()
                  wx.hideLoading({
                    success: (res) => {},
                  })
                }
              })
          }else if(openid==this.data.dynamicOpenid&&this.data.placeholder!='我来说两句~'){
            wx.cloud.callFunction({
              name:"addChildComment",
              data:{
                avatarUrl:userInfo.avatarUrl,       //回复者头像
                nickName:userInfo.nickName,      //回复者名称
                _id:this.pagesData,   //动态ID,随机数
                commentText:e.detail.value.comment,   //回复内容
                commentTime:commentTime,            //回复时间
                openid:openid,                   //回复者openid
                replyName:this.data.name,         //被回复者名称
                isbuilding:true,          //是否为楼主
                index:this.data.index,        //对象数组索引
                id:Math.floor(Math.random()*100000000)                 //通过该条记录在父评论数组中的索引来添加子评论
              },
              success:res=>{
                wx.showToast({
                  title: '评论成功!',
                  icon:'success'
                })
                this.setData({
                  value:''
                })
                wx.hideLoading({
                  success: (res) => {},
                })
                this.getDynamic()
              }
            })
          }else if(openid!=this.data.dynamicOpenid&&this.data.placeholder!='我来说两句~'){
            wx.cloud.callFunction({
              name:"addChildComment",
              data:{
                avatarUrl:userInfo.avatarUrl,       //回复者头像
                nickName:userInfo.nickName,      //回复者名称
                _id:this.pagesData,   //动态ID,随机数
                commentText:e.detail.value.comment,   //回复内容
                commentTime:commentTime,            //回复时间
                openid:openid,                    //回复者openid
                replyName:this.data.name,         //被回复者名称
                isbuilding:false,          //是否为楼主
                index:this.data.index,        //对象数组索引
                id:Math.floor(Math.random()*100000000)                 //通过该条记录在父评论数组中的索引来添加子评论
              },
              success:res=>{
                wx.showToast({
                  title: '评论成功!',
                  icon:'success'
                })
                this.setData({
                  value:''
                })
                wx.hideLoading({
                  success: (res) => {},
                })
                this.getDynamic()
              }
            })
          }
      }else{
        wx.showToast({
          title:'请登录',
          icon:'none'
        })
      }
    }
    },

如有问题可在评论区问我,这里的逻辑代码没有给出所有。参考上面的数据库设计,只要你会数据的读取和写入,那就不是问题了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章