热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信小程序接入腾讯云IM即时通讯(会话列表)

会话列表功能概述:登录:先用自己的账号登录腾讯云;获取会话列表:登录之后再获取会话列表;更新未读消息数量:获取会话列表之后更新未读消息数量WXML代码(自己写的将就

会话列表功能概述:

  • 登录 :先用自己的账号登录腾讯云;
  • 获取会话列表 :登录之后再获取会话列表;
  • 更新未读消息数量 :获取会话列表之后更新未读消息数量

WXML代码(自己写的将就看一下)

  • <view  class='msg-con'>
      <view  class='service-msg flex-wrap' >
        <view class='flex-item'>
          <view class='service-avatar'>
            <view class='iconfont icon-kefu'>view>
          view>
        view>
        <view class='flex-item4 service-item'>
            <view class='name s'>在线客服view>
        view>
        <button open-type="contact" hover-class="none">button>
      view>
      <view class='msg-item flex-wrap' wx:for="{{contactList}}" wx:key="{{index}}" wx:if="{{contactList.length > 0}}" bindtap='linkChat' data-id="{{item.To_Account}}" data-name="{{item.C2cNick}}">
        <view class='flex-item'>
          <view class='msg-avatar'>
            <image style="width:50px;height:50px;border-radius:50%;" mode= "scaleToFill" wx:if="{{item.C2cImage == ''}}" src="{{noData}}">image>
            <image style="width:50px;height:50px;border-radius:50%;" mode= "scaleToFill" wx:if="{{item.C2cImage != ''}}" src="{{item.C2cImage}}">image>
          view>
        view>
        <view class='flex-item4 msg-text'>
            <view class='name flex-wrap'>
              <view class="flex-item ellipsis1">{{item.C2cNick}}view>
              <view class="flex-item tr fz24 c9">{{item.MsgTimeStamp}}view>
            view>
            <view class='text flex-wrap'>
              <view class='flex-item3 ellipsis1'> <text>{{item.MsgShow}}text>  view>
              <view class='flex-item'> <text class='count' wx:if="{{item.UnreadMsgCount > 0}}">{{item.UnreadMsgCount}}text>view>
            view>
        view>
      view>
      <view >
    view>
    
    view>
    <view class='dev' wx:if="{{!isNoData}}">
      <image style="width:306rpx;height:306rpx;display:block;" mode= "scaleToFill" src="{{noData}}">image>
      <view class="devt">
      消息列表为空~
      view>
    view>

    WXSS代码

    .msg-con{
      width: 100%;
      height: auto;
      background: #ffffff;
      padding:0px 10px;
      box-sizing: border-box;
    }
    .service-msg{
      width: 100%;
      height: 70px;
    }
    .msg-item{
      border-top: 1px solid #e5e5e5;
    }
    .service-avatar{
      width: 50px;
      height: 50px;
      background: #69BEFF;
      margin: 10px 0;
      border-radius:50%; 
    }
    .msg-avatar{
      width: 50px;
      height: 50px;
      margin: 10px 0;
      border-radius:50%; 
    }
    .msg-text{
      margin-top:12px; 
    }
    .name{
      font-size: 16px;
      color: #333333;
      height: 25px;
    }
    .name.s{
      height: 70px;
      line-height: 70px;
    }
    .text{
      color: #999999;
      font-size: 13px;
      position: relative;
    }
    .icon-kefu::before{
      width: 50px;
      height: 50px;
      line-height: 50px;
      display: block;
      color: #ffffff;
      text-align: center;
      font-size: 60rpx;
    }
    .count{
      width: 20px;
      height: 20px;
      background:#F74C31;
      border-radius:50%;
      line-height: 20px;
      display: block;
      color: #ffffff;
      text-align: center;
      position: absolute;
      right: 0px;
      top: 0;
    }
    button{
      color: #333333;
      position: absolute;
      top: 0;
      left: 0;
      z-index: 1;
      width: 100%;
      height: 100%;
      background: rgba(0,0,0,0);
    }
    button:after{
      border:none;
    
    }
    .service-msg{
      position: relative;
    }

    JS代码

    ar util = require('../..//utils/util.js'); //转换时间插件
    var webim = require('../../utils/webim.js');//腾讯云im包
    var webimhandler = require('../../utils/webim_handler.js');//这个是所有事件的腾讯js,这个页面需要用到登录
    
    const app = getApp()
    
    Page({
    
      /**
       * 页面的初始数据
       */
      data: {
        isNoData:true,
        noData: app.data.imageUrl + '/no-msg.png',//无数据的图片
        contactList:[],//会话列表
      },
    
      onLoad: function (options) {
    
      },
      onShow:function(){
        wx.showLoading()
        var that = this;
        var selToID = '';//会话列表不设置对方私聊账号
        webimhandler.init({ //初始化的方法
          accountMode: app.data.Config.accountMode
          , accountType: app.data.Config.accountType
          , sdkAppID: app.data.Config.sdkappid
          , selType: webim.SESSION_TYPE.C2C//私聊
          , agent_member_id: app.data.userInfo.id//经纪人id
          , id: selToID  //如果是经纪人,则填agent_member_id ,如果是普通用户则填经纪人id
          , name: app.data.userInfo.agent_name
          , icon: app.data.userInfo.agent_pic,
          that: that
        });
        if (webim.checkLogin()) {//检查是否登录返回true和false,不登录则重新登录
          console.log('已登录')
          that.initRecentContactList();
        } else {
          console.log('登录成功')
          webimhandler.sdkLogin(that, app, selToID, function () {
            that.initRecentContactList();
          });
        }
    
      },
      //初始化聊天界面最近会话列表
      initRecentContactList: function () {
    
        var that = this;
          webim.getRecentContactList({//获取会话列表的方法
            'Count': 10 //最近的会话数 ,最大为 100
          }, function (resp) {
            if (resp.SessionItem){
    
              if (resp.SessionItem.length == 0) {
                that.setData({
                  isNoData: false,
                })
                wx.hideLoading()
              }else if (resp.SessionItem.length > 0){
                that.setData({
                  contactList: resp.SessionItem,
                  isNoData:true
                })
                var userId = that.data.contactList.map((item, index) => {
                  return item.To_Account
                })
                that.getAvatar(userId, that.data.contactList, function (data) {
    
                  data = data.map((item,index)=>{
                    if (item.MsgShow == '[其他]'){
                      item.MsgShow = '[房源信息]'
                    }
                    return item;
    
                  })
                  that.setData({
                    contactList: data
                  })
                  wx.hideLoading();
                  // 初始化最近会话的消息未读数(监听新消息事件)
                  webim.syncMsgs(webimhandler.onMsgNotify());
    
                })
                // webim.syncMsgs(that.initUnreadMsgCount())
              }else{
                wx.hideLoading()
                return;
              }
            }else{
              wx.hideLoading()
            }
    
    
          }, function (resp) {
            //错误回调
          });
    
    
      },
      // 初始化最近会话的消息未读数(这个方法用不到,多余,这是个坑,登录之后仍然返回空对象)
      initUnreadMsgCount: function(){
        var sess;
        var sessMap = JSON.stringify(webim.MsgStore.sessMap()) ;
    
        for (var i in sessMap) {
          console.log('循环对象')
          sess = sessMap[i];
          // if (selToID && selToID != sess.id()) { //更新其他聊天对象的未读消息数
          console.log('sess.unread()', sess.unread())
          // updateSessDiv(sess.type(), sess.id(), sess.name(), sess.unread());
          // }
        }
      },
      //获取会话列表所有用户头像
      getAvatar: function(userId, item, callback) {
        if(!callback) {
          callback = () => {
    
          }
        }
        var that = this;
        var tag_list = ['Tag_Profile_IM_Nick', 'Tag_Profile_IM_Image']
        tag_list.push("Tag_Profile_IM_Nick");
        //用户id
        var account = userId
        var optiOns= {
          From_Account: userId,
          To_Account: account,
          LastStandardSequence: 0,
          TagList: tag_list,
        };
        var cOntactList= [];
    
        webim.getProfilePortrait(
          options,
          function (res) {
            var UserProfileItem = res.UserProfileItem;
            var C2cNick, C2cImage;
            for (var i = 0; i ) {
              var data = UserProfileItem[i].ProfileItem;
    
              // 循环添加昵称和头像
              cOntactList= item.map((item, index) => {
                item.C2cNick = UserProfileItem[index].ProfileItem[0].Value
    
                item.C2cImage = UserProfileItem[index].ProfileItem[1].Value
                return item;
              })
            }
            contactList = contactList.map((item, index) => {
              var MsgTimeStamp = util.getDateDiff(item.MsgTimeStamp * 1000)
              item.MsgTimeStamp = MsgTimeStamp;
              return item;
            })
            callback(contactList)
          }
        )
    
      },
    
      /**
       * 页面相关事件处理函数--监听用户下拉动作
       */
      onPullDownRefresh: function () {
    
      },
    
      /**
       * 页面上拉触底事件的处理函数
       */
      onReachBottom: function () {
    
      },
      /**
       * 从列表选择一个会话跳转聊天(需要传你要聊天的会话的对方id过去)
       */
      linkChat:function(e){
        wx.navigateTo({
          url: '/pages/chat/chat?id=' + e.currentTarget.dataset.id + '&name=' + e.currentTarget.dataset.name  ,
        })
      }
    })
    
    登录的方法
    function sdkLogin(that,app, selToID,callback) {
        if (!callback){
            callback = () => {
    
            }
        }
        this.init({
            accountMode: app.data.Config.accountMode
            , accountType: app.data.Config.accountType
            , sdkAppID: app.data.Config.sdkappid
            , selType: webim.SESSION_TYPE.C2C//私聊
            , agent_member_id: app.data.userInfo.id//经纪人id
            , id: selToID  //如果是经纪人,则填agent_member_id ,如果是普通用户则填经纪人id
            , name: app.data.userInfo.agent_name
            , icon: app.data.userInfo.agent_pic,
            that:that
        });
    
    
        //当前用户身份
        var loginInfo = {
            'sdkAppID':app.data.Config.sdkappid, //用户所属应用id,必填
            'appIDAt3rd':app.data.Config.sdkappid, //用户所属应用id,必填
            'accountType':app.data.Config.accountType, //用户所属应用帐号类型,必填
            'identifier': app.data.userInfo.id, //当前用户ID,必须是否字符串类型,选填
            'identifierNick': app.data.userInfo.nickname, //当前用户昵称,选填
            'userSig': app.data.userInfo.usersig, //当前用户身份凭证,必须是字符串类型,选填
        };
    
        //1v1单聊的话,一般只需要 'onConnNotify' 和 'onMsgNotify'就行了。
        //监听连接状态回调变化事件
        var OnConnNotify= function (resp) {
            switch (resp.ErrorCode) {
                case webim.CONNECTION_STATUS.ON:
                    //webim.Log.warn('连接状态正常...');
                    break;
                case webim.CONNECTION_STATUS.OFF:
                    webim.Log.warn('连接已断开,无法收到新消息,请检查下你的网络是否正常');
                    break;
                default:
                    webim.Log.error('未知连接状态,status=' + resp.ErrorCode);
                    break;
            }
        };
    
    
        //监听事件
        var listeners = {
            "onConnNotify": onConnNotify//监听连接状态回调变化事件,必填
            , "onMsgNotify": onMsgNotify
    
        };
    
        //其他对象,选填
        var optiOns= {
            'isAccessFormalEnv': true,//是否访问正式环境,默认访问正式,选填
            'isLogOn': true//是否开启控制台打印日志,默认开启,选填
        };
    
        //sdk登录(独立模式)
        webim.login(loginInfo, listeners, options, function (resp) {
            callback()
    
    
        }, function (err) {
            console.log("登录失败", err.ErrorInfo)
        });
    }

    登录主要信息配置

    (我这里是写在app.js里面,这些配置信息是后台服务器端对接完之后返回给前端的,登录的时候要用到)
    var cache = require('./utils/cache.js');
    var login = require('./utils/login.js');
    App({
      data: {
        Config :{
          sdkappid: 1400129031,//
          accountType: 35602,
          accountMode: 0 //帐号模式,0-表示独立模式
        },
    
      },

    https://blog.csdn.net/qq_29789057/article/details/82428326

<view class='msg-con'> <view class='service-msg flex-wrap' > <view class='flex-item'> <view class='service-avatar'> <view class='iconfont icon-kefu'>view> view> view> <view class='flex-item4 service-item'> <view class='name s'>在线客服view> view> <button open-type="contact" hover-class="none">button> view> <view class='msg-item flex-wrap' wx:for="{{contactList}}" wx:key="{{index}}" wx:if="{{contactList.length > 0}}" bindtap='linkChat' data-id="{{item.To_Account}}" data-name="{{item.C2cNick}}"> <view class='flex-item'> <view class='msg-avatar'> <image style="width:50px;height:50px;border-radius:50%;" mode= "scaleToFill" wx:if="{{item.C2cImage == ''}}" src="{{noData}}">image> <image style="width:50px;height:50px;border-radius:50%;" mode= "scaleToFill" wx:if="{{item.C2cImage != ''}}" src="{{item.C2cImage}}">image> view> view> <view class='flex-item4 msg-text'> <view class='name flex-wrap'> <view class="flex-item ellipsis1">{{item.C2cNick}}view> <view class="flex-item tr fz24 c9">{{item.MsgTimeStamp}}view> view> <view class='text flex-wrap'> <view class='flex-item3 ellipsis1'> <text>{{item.MsgShow}}text> view> <view class='flex-item'> <text class='count' wx:if="{{item.UnreadMsgCount > 0}}">{{item.UnreadMsgCount}}text>view> view> view> view> <view > view> view> <view class='dev' wx:if="{{!isNoData}}"> <image style="width:306rpx;height:306rpx;display:block;" mode= "scaleToFill" src="{{noData}}">image> <view class="devt"> 消息列表为空~ view> view>


推荐阅读
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 本文详细介绍了如何使用Python中的smtplib库来发送带有附件的邮件,并提供了完整的代码示例。作者:多测师_王sir,时间:2020年5月20日 17:24,微信:15367499889,公司:上海多测师信息有限公司。 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • Python中判断一个集合是否为另一集合子集的两种高效方法及其应用场景分析 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 本文详细探讨了 jQuery 中 `ajaxSubmit` 方法的使用技巧及其应用场景。首先,介绍了如何正确引入必要的脚本文件,如 `jquery.form.js` 和 `jquery-1.8.0.min.js`。接着,通过具体示例展示了如何利用 `ajaxSubmit` 方法实现表单的异步提交,包括数据的发送、接收和处理。此外,还讨论了该方法在不同场景下的应用,如文件上传、表单验证和动态更新页面内容等,提供了丰富的代码示例和最佳实践建议。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。 ... [详细]
author-avatar
mobiledu2502878565
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有