workerman 之 联合 php后端及时推送消息给小程序

6 篇文章 0 订阅
4 篇文章 0 订阅

参考网址
https://blog.csdn.net/weixin_40221833/article/details/79611021

上面写的很好,代码直接能用

我要说的是,这个推送和我理解的推送不一样,
我想要的是新消息提醒样式,而不是手机上部跳出来的那种推送消息

所以,我下面介绍一下我怎么做的新消息提醒

其实还是样式问题,有新消息,显示红点 就好了
所以,我直接遍历的数据库消息,已读消息satus为 2,未读消息为 1,默认为 1

在这里插入图片描述
tp3.2

 <?php
	namespace Wxapi\Controller;
	
	use Common\Controller\HomebaseController;
	
	use Think\Model;
	
	use Think\upload;
	
 // 微信未读消息
public function wxmsg($touid){

    $chatlist_model = M('wxchatlist');
    $posts = new Model();

    $where['status'] = '1';
    $where['touid'] = $touid;
    // 未读消息 ASC
    // $data = $chatlist_model->where($where)->order('date ASC')->group('uid')->select();  // order 和 group 不能同用
    $d = $chatlist_model->where($where)->group('uid')->count();  
    // var_dump($d);
    

    $sql="SELECT * FROM (SELECT * FROM `red_wxchatlist`  
         WHERE
         `status`= 1
         AND
         `touid`= ".$touid."
          ORDER BY 
         `date` DESC) r     
          GROUP BY r.uid 
         ";
    
    $data = $posts->query($sql);
    $data[0]['num'] = $d;

    // var_dump($data);


    // 已有消息
    $wh['status'] = '2';
    $wh['touid'] = $touid;
    $da = $chatlist_model->where($wh)->group('uid')->count();
    // var_dump($da);
    
    $sql22="SELECT * FROM (SELECT * FROM `red_wxchatlist`  
         WHERE
         `status`= 2
         AND
         `touid`= ".$touid."
          ORDER BY 
         `date` DESC) r     
          GROUP BY r.uid 
         ";
    
    $data22 = $posts->query($sql22);
    $data22[0]['num'] = $da;


    // var_dump($data22);

    // 页面上,需要,发送过来消息人的 头像,名字,内容,时间
    // 之前聊天的记录也要有,就要查,status=2的
    // 如果是同1个人发来的,就只显示1个对话框

    if(empty($data) && empty($data22)){
        $data=array(
            "status"=>0,
            "message"=>"数据异常",
        );
        
        $this->ajaxReturn($data,'JSON');
    }else{
         $info = array(
            "status"=>1,
            'shuju'=>$data,
            'history'=>$data22
        );
        $this->ajaxReturn($info,'JSON');
    } 
}

小程序中

wxml

<view class="container">
<!--主体-->
<view class="main">

  <view class="item"  wx:for="{{newslist}}" wx:key="key"  data-uid="{{item.uid}}"   bindtap="linkchat">
      <view class="round-click">
          <view data-type="{{currentIndex}}" >{{item.num}}</view>
      </view>
      <view class="item-avatar"><image src="{{item.avatarurl}}"></image></view>
      <view class="item-text">
          <view class="text-row">
              <view class="row-name">{{item.uid}}</view>
              <view class="row-time">{{item.date}}</view>
          </view>
          <view class="text-msg text-allipsis">{{item.content}}</view>
      </view>
      <view class="item-oth"></view>
  </view>

  <view class="item"  wx:for="{{histnews}}" wx:key="key" data-uid="{{item.uid}}" bindtap="linkchat">
      <view class="round-click">
          <view data-type="{{currentIndex}}" >{{item.num}}</view>
      </view>
      <view class="item-avatar"><image src="{{item.avatarurl}}"></image></view>
      <view class="item-text">
          <view class="text-row">
              <view class="row-name">{{item.uid}}</view>
              <view class="row-time">{{item.date}}</view>
          </view>
          <view class="text-msg text-allipsis">{{item.content}}</view>
      </view>
      <view class="item-oth"></view>
  </view>
        
</view>

js

// pages/chat/message/message.js
const app = getApp();
var utils = require('../../../utils/util.js');
var socketOpen = false;
var frameBuffer_Data, session, SocketTask;
// var url = 'ws://localhost:8000';   // 本地
var url = 'ws://192.168.2.105:5678';  // 这样就可以在体验版聊天了

Page({
  data: {
    userInfo: '',
    scrollTop: 0,
    newslist: [],       // 页面的消息列表
    histnews: [],
    session_id: '',
    tochat: '',
    uid: 1,
    num: 0,
    fabuimg: 'https://hs.com/public/images/wechat/fabu.png',  
  },
  // 页面加载
  onLoad: function (options) {
    var that = this;
    var sessionid = wx.getStorageSync('session_id');
    if (wx.getStorageSync('session_id')) {
      that.setData({
        session_id: sessionid,
        tochat: options.tochat,
      })
    }

   that.jiazai();    // 请求数据
  },
	
 // 请求聊天列表
  jiazai: function () {
      var that = this;
      console.log('走到jiazai');
      // 如果是已读消息,修改状态为2,默认是1,未读消息
      // 请求数据库,查,touid 是自己的消息,读取status为1的数据的 content 和 uid
      wx.request({
          url: 'https://hs.com/Wxapi/Index/wxmsg',
          data: {
            touid: that.data.session_id
          },
          header: {
            'content-type': 'application/json' // 默认值
          },
          success: function (res) {
            delete res.data.referer;
            delete res.data.state;
            // console.log(res.data);
            var content = res.data.shuju;
            // console.log(content);
            if (!content) {
              content = [];
            }
            var content2 = res.data.history;
            // console.log(content2);
            if (!content2) {
              content2 = [];
            }
            that.setData({
              newslist: res.data.shuju,
              histnews: res.data.history
            });
          }
      })
  },

  // 跳聊天页面
  linkchat: function (event) {
    // 携带应该是想要对话的用户的标识
    // var tochat = this.data.content.sessionid;   // 想要对话人的 uid
    var tochat = event.currentTarget.dataset.uid;
    var url = "/pages/chat/chat-detail?tochat=" + tochat;
    console.log(url);
    wx.navigateTo({
      url: url
    })
  },

// 上面的代码就已经能实现效果了,下面是请求websocket,其实根本用不到


  // 发送数据
  sendmsg: function(){
    var data = {
      content: '我喜欢你',
      uid: '326',
    };
    console.log('走到socketopen111');
    if (socketOpen) {     // 没有走到这
      sendSocketMessage(data)    // 如果打开了socket就发送数据给服务器
      console.log('走到socketopen222');
    }
  },
  

  onShow: function (e) {
    if (!socketOpen) {
      this.webSocket()
    }
  },

  // 页面加载完成
  onReady: function () {
    var that = this;
    SocketTask.onOpen(res => {
      socketOpen = true;
      console.log('监听 WebSocket 连接打开事件。', res)
      console.log('WebSocket连接已打开!')
      // send: 'login',
      // 下面应该携带的是,发送消息人的uid,我是收到人,
      // 如果是已读消息,修改状态为2,默认是1,未读消息
      // var data1 = {
      //   send: 'send_message',
      //   content: '我好爱你',
      //   uid: that.data.session_id
      // }
      // that.sendSocketMessage({
      //   data: JSON.stringify(data1),  //将 JavaScript 值转换为 JSON 字符串
      // })
    })
    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('走到服务器返回数据');
      // 下面打开就报错,因为没返回值
      // console.log('监听WebSocket接受到服务器的消息事件。服务器返回的消息', JSON.parse(onMessage.data))
      // var onMessage_data = JSON.parse(onMessage.data);

})


  },

  // 给服务端发送消息
  sendSocketMessage: function (msg) {
    console.log('走到wx.sendSocketMessage');
    var that = this;
    console.log('通过 WebSocket 连接发送数据', JSON.stringify(msg))  // msg 发送的数据
    SocketTask.send({
      data: JSON.stringify(msg)
    }, function (res) {
      util.showModal("已发送");
      console.log('已发送');
    })
  },
  

  

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

  onHide: function () {
    SocketTask.close(function (close) {
      console.log('关闭 WebSocket 连接。', close)
    })
  },
  
  // 获取hei的id节点然后屏幕焦点调转到这个节点  ,这是第二个页面的写法
  bottom: function () {
    var that = this;
    this.setData({
      scrollTop: 1000000
    })
  },



})

wxss

/* pages/message/message.wxss */
.container{
  background-color:white;
}
.main{
  position:relative;
  width:100%;
}
.main .item{
  width:100%;
  height:120rpx;
  background-color:#F7F7F7;
  margin-top:2rpx;
  padding:10rpx 0;
}
.main .item .item-avatar{
  width:20%;
  height:100rpx;
  line-height:100rpx;
  float:left;
}
.main .item .item-avatar image{
  width:80rpx;
  height:80rpx;
  vertical-align:middle;
  margin-left: 40rpx;
  border-radius: 10rpx;
}
.main .item .item-text{
  width:78%;
  height:100rpx;
  float:left;
}
.main .item .item-text .text-row{
  height:50rpx;
  font-size:35rpx;
  line-height:50rpx;
  overflow: hidden;
}
.main .item .item-text .text-row .row-name{
  float:left;
}
.main .item .item-text .text-row .row-time{
  float:right;
  color:#848484;
  font-size:25rpx;
}
.main .item .item-text .text-msg{
  height:50rpx;
  line-height: 50rpx;
  font-size:30rpx;
  color:#848484	;
  overflow: hidden;
}

.fiexd{
  position:fixed;
}
.text-allipsis{
  white-space:nowrap;
  text-overflow: ellipsis;
}

/* 下面是提醒样式 */

.round-click{
    height: 40rpx;
    width: 40rpx;
    /* background-color: #d92a2a; */
    
    background-color: #e60808;
    border-radius: 100%;
    position: fixed;
    /* bottom: 150rpx; */
    /* right: 20rpx; */
    left: 80rpx;
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 9;
}
.round-click navigator{
    font-size: 32rpx;
    max-width: 80rpx;
    color: #fff;
    text-align: center;
}
.round-click view{
    font-size: 32rpx;
    max-width: 80rpx;
    color: #fff;
    text-align:center;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值