微信小程序雲開發之動態評論功能,可在父評論下進行子評論。

最近開發小程序用戶發佈動態之後,需要進行評論,剛開始沒什麼思路。就在網上逛了一圈,也沒啥結果,都不是我想要的。要麼是轉載,要麼是講的不夠清楚。

經過我半天的思考和開發,終於將這個評論功能給實現了。先看個效果圖吧:
在這裏插入圖片描述

在這裏插入圖片描述
今天我就帶大家瞭解一下評論功能!

評論功能實現步驟:

  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'
        })
      }
    }
    },

如有問題可在評論區問我,這裏的邏輯代碼沒有給出所有。參考上面的數據庫設計,只要你會數據的讀取和寫入,那就不是問題了。

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