微信小程序直播+聊天+弹幕页面展示

不大方便展示视频哈~~

在这里插入图片描述

<!--pages/contact/contact.wxml-->

<view>
  <view class="live-box">
    <video id="myVideo" class="live-video" controls src="我用的是直播回放,由于微信小程序的直播暂时只支持商家的" enable-danmu danmu-btn></video>
  </view>
  <view class="sc">
    <scroll-view scroll-y scroll-into-view='{{toView}}' >
  <!-- <view class='scrollMsg'> -->
  <block wx:key="keys" wx:for='{{msgList}}' wx:for-index="index" >

    <!-- 单个消息1 客服发出(左) -->
    <view wx:if='{{item.style=="bubble you"}}' id='msg-{{index}}' style='display: flex; padding: 3vw 11vw 2vw 2vw;'>
      <view style='width: 11vw; height: 11vw;'>
        <image style='width: 11vw; height: 11vw; border-radius: 10rpx;' src='https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1031084171,3750714591&fm=26&gp=0.jpg'></image>
      </view>
      <view style='width: 4vw; height: 11vw; margin-left: 0.5vw; display: flex; align-items: center; z-index: 9;'>
      </view>
      <view class='leftMsg'>{{item.data}}</view>
    </view>

    <!-- 单个消息2 用户发出(右) -->
    <view wx:else id='msg-{{index}}' style='display: flex; justify-content: flex-end; padding: 2vw 2vw 2vw 11vw;'>
      <view class='rightMsg'>{{item.data}}</view>
      <view style='width: 4vw; height: 11vw; margin-right: 0.5vw; display: flex; align-items: center; z-index: 9;'>
      </view>
      <view style='width: 11vw; height: 11vw;'>
        <image style='width: 11vw; height: 11vw; border-radius: 10rpx;' src='https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1031084171,3750714591&fm=26&gp=0.jpg'></image>
      </view>
    </view>

  </block>
  <!-- </view> -->

  <!-- 占位 -->
  <view style='width: 100%; height: 18vw;'></view>
</scroll-view>

<view class='inputRoom' style='bottom: {{inputBottom}}'>
  <!-- <image style='width: 7vw; margin-left: 3.2vw;' src='' mode='widthFix'></image> -->
  <input bindconfirm='sendClick' adjust-position='{{false}}' value='{{inputVal}}' confirm-type='send' bindfocus='focus' bindblur='blur'  bindinput="getDanmu"></input>
  
  <view class="button" bindtap="sendDanmu">发送弹幕</view>
</view>
</view>
  </view>


wxss

/* pages/live/live.wxss */
page {
  background-color: #f1f1f1;
}

.inputRoom {
  width: 100vw;
  height: 16vw;
  border-top: 1px solid #cdcdcd;
  background-color: #f1f1f1;
  position: fixed;
  bottom: 0;
  display: flex;
  align-items: center;
  z-index: 20;
}

input {
  width: 76vw;
  height: 9.33vw;
  background-color: #fff;
  border-radius: 40rpx;
  margin-left: 2vw;
  padding: 0 3vw;
  font-size: 28rpx;
  color: #444;
}

.leftMsg {
  font-size: 35rpx;
  color: #444;
  line-height: 7vw;
  padding: 2vw 2.5vw;
  background-color: #fff;
  margin-left: -1.6vw;
  border-radius: 10rpx;
  z-index: 10;
}

.rightMsg {
  font-size: 35rpx;
  color: #444;
  line-height: 7vw;
  padding: 2vw 2.5vw;
  background-color: #96EB6A;
  margin-right: -1.6vw;
  border-radius: 10rpx;
  z-index: 10;
}

.live-box {
  width: 100%;
  height: 400rpx;
  background: #000;
}

.live-video {
  width: 100%;
  height: 400rpx;
}

.button {
  text-align: center;
  width: 170rpx;
  height: 66rpx;
  line-height: 66rpx;
  margin-left: 10rpx;
  border-radius: 10rpx;
  background-color: #3478F7;
  color: azure;
  font-size: 28rpx;
}
/* .sc{
  position: absolute;
  top: 700rpx;
  bottom: 0rpx;
  opacity: 0.40;
} */

js

const app = getApp();
var socketOpen = false;
var frameBuffer_Data, session, SocketTask;
var url = 'ws://49.???.??.???:9501';//我调用的宝塔的聊天demo
var upload_url ='请填写您的图片上传接口地址';
var inputVal = '';
var msgList = [];
var windowWidth = wx.getSystemInfoSync().windowWidth;
var windowHeight = wx.getSystemInfoSync().windowHeight;
var keyHeight = 0;


/**
 * 初始化数据
 */
function initData(that) {
  inputVal = '';

  msgList = [{
      style: 'bubble you',
      contentType: 'text',
      data: '欢迎来到王者农药,敌军还有30秒到达战场,请做好准备!'
    },
    {
      style: 'bubble me',
      contentType: 'text',
      data: '我怕是走错片场了...'
    }
  ]
  that.setData({
    msgList,//敌军的聊天
    inputVal//我的聊天
  })
}

/**
 * 计算msg总高度
 */
// function calScrollHeight(that, keyHeight) {
//   var query = wx.createSelectorQuery();
//   query.select('.scrollMsg').boundingClientRect(function(rect) {
//   }).exec();
// }

   //生成随机颜色
   function getRandomColor() {
    let rgb =[]
    for(let i=0;i<3;i++){
      let color =Math.floor(Math.random()*256).toString(16)
      color = (color.length ==1) ?'0'+color : color
      rgb.push(color)
    }
    return "#" + rgb.join('')
  }

Page({

  /**
   * 页面的初始数据
   */
  data: {
    scrollHeight: '100vh',
    inputBottom: 0
  },

  getDanmu:function(event){
   
    this.setData({
      danmuTxt:event.detail.value,
      
    })
  },
  sendDanmu:function(event){
    let text = this.data.danmuTxt
    this.setData({
      inputVal : ''
    })
    this.videoCtx.sendDanmu({
    text:text,
    
      color:getRandomColor()
    })
  },
  playVideo:function(event){
    this.videoCtx.stop()
    //停止播放之前正在播放的视频
    this.setData({
      src:event.currentTarget.dataset.url
    })
    //更新视频地址
    this.videoCtx.play()
    //播放新的视频
  },
 
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function(options) {
    initData(this);
    this.videoCtx = wx.createVideoContext('myVideo')
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function() {
    if (!socketOpen) {
      this.webSocket()
    }
  },

   // 页面加载完成
   onReady: function () {
    var that = this;
    SocketTask.onOpen(res => {
      socketOpen = true;
      console.log('监听 WebSocket 连接打开事件。', res)
    })
    SocketTask.onClose(onClose => {
      console.log('监听 WebSocket 连接关闭事件。', onClose)
      socketOpen = false;
      this.webSocket()
    })
    SocketTask.onError(onError => {
      console.log('监听 WebSocket 错误。错误信息', onError)
      socketOpen = false
    })
    SocketTask.onMessage(onMessage => {
      console.log(onMessage)
      this.data.msgList.push(JSON.parse( onMessage.data))
      
      console.log(this.data.msgList)
     this.setData({
       msgList:this.data.msgList
     })
    })
  },

  webSocket: function () {
    // 创建Socket
    SocketTask = wx.connectSocket({
      url: url,
      data: 'data',
      header: {
        'content-type': 'application/json'
      },
      method: 'post',
      success: function (res) {
        console.log('WebSocket连接创建', res)
      },
      fail: function (err) {
        wx.showToast({
          title: '网络异常!',
        })
        console.log(err)
      },
    })
  },

  // 提交文字
  submitTo: function (e) {
    let that = this;
    var data = {
      body: that.data.inputValue,
    }
    if (socketOpen) {
      // 如果打开了socket就发送数据给服务器
      console.log(data)
      sendSocketMessage(data)
    
      this.setData({
        msgList: this.data.msgList,
        inputValue: ''
      })
 
      that.bottom()
    }
  },
  bindKeyInput: function (e) {
    
    this.setData({
      inputValue: e.detail.value
    })
  },
 
  onHide: function () {
    SocketTask.close(function (close) {
      console.log('关闭 WebSocket 连接。', close)
    })
  },
 
  addImg: function () {
    this.setData({
      addImg: !this.data.addImg
    })
 
  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function() {

  },

  /**
   * 获取聚焦
   */
  focus: function(e) {
    keyHeight = e.detail.height;
    this.setData({
      scrollHeight: (windowHeight - keyHeight) + 'px'
    });
    this.setData({
      toView: 'msg-' + (msgList.length - 1),
      inputBottom: keyHeight + 'px'
    })
    //计算msg高度
    // calScrollHeight(this, keyHeight);

  },

  //失去聚焦(软键盘消失)
  blur: function(e) {
    this.setData({
      scrollHeight: '100vh',
      inputBottom: 0
    })
    this.setData({
      toView: 'msg-' + (msgList.length - 1)
    })

  },

  /**
   * 发送点击监听
   */
  sendClick: function(e) {
    var data = {
      body: e.detail.value,
    }
    if (socketOpen) {
      // 如果打开了socket就发送数据给服务器
      console.log(data)
      sendSocketMessage(data)
    }
   
    inputVal = '';
    this.setData({
      msgList: this.data.msgList,
      inputVal
    })
    // this.setData({
    //   msgList,
    //   inputVal
    // });


  },

  /**
   * 退回上一页
   */
  toBackClick: function() {
    wx.navigateBack({})
  }
  

})

//通过 WebSocket 连接发送数据,需要先 wx.connectSocket,并在 wx.onSocketOpen 回调之后才能发送。
function sendSocketMessage(msg) {
  var that = this;
  console.log('通过 WebSocket 连接发送数据', JSON.stringify(msg))
  
  var body=JSON.stringify(msg.body)
  console.log(body.replace(/\"/g, ""))
  SocketTask.send({
    data: body.replace(/\"/g, "")
  }, function (res) {
    console.log('已发送', res)
  })
} 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
微信小程序购物车是指在微信小程序中实现购物车功能,用户可以将商品添加到购物车中,进行数量的增减,结算等操作。而PHP是一种服务器端脚本语言,可以用来处理与数据库的交互、数据的处理和逻辑的实现。 在微信小程序中实现购物车功能,一般需要以下几个步骤: 1. 创建购物车页面:在小程序中创建一个购物车页面,用于展示用户已选择的商品列表和相关操作。 2. 添加商品到购物车:在商品详情页或列表页中,用户点击添加到购物车按钮时,将商品信息添加到购物车中。可以使用小程序的本地存储功能(如wx.setStorageSync)将商品信息保存到本地。 3. 购物车展示:在购物车页面中,通过获取本地存储的商品信息,展示用户已选择的商品列表。可以使用wx.getStorageSync获取本地存储的数据。 4. 购物车操作:用户可以对购物车中的商品进行数量的增减、删除等操作。通过修改本地存储的商品信息,更新购物车页面展示。 5. 结算功能:用户点击结算按钮时,将购物车中的商品信息传递给后台服务器进行处理。可以使用小程序的网络请求功能(如wx.request)将数据发送给后台。 在PHP中处理微信小程序购物车功能,一般需要以下几个步骤: 1. 接收数据:在PHP中,可以通过$_POST或$_GET等全局变量接收小程序发送的数据,包括购物车中的商品信息。 2. 数据处理:根据接收到的数据,进行相应的处理,如将商品信息存储到数据库中,更新商品数量等操作。 3. 返回结果:根据处理结果,将相应的数据返回给小程序,如返回处理成功的消息或错误提示。 需要注意的是,以上只是一个简单的介绍,实际实现过程中还需要考虑安全性、数据验证、并发处理等方面的问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颜夕啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值