TIM腾讯聊天(即时通信 IM)(咨询客服业务)

这篇具有很好参考价值的文章主要介绍了TIM腾讯聊天(即时通信 IM)(咨询客服业务)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

即时通信 IM

介绍 即时通信IM产品简介
应用场景
TIM腾讯聊天(即时通信 IM)(咨询客服业务)

1. 社交沟通

即时通信 IM 为应用于社交沟通提供能力支持,可实现单聊、群聊、弹幕等多种聊天模式,支持文字、图片、语音、短视频等多种消息类型,实时消息推送满足消息到达率的要求,并可支持实时音视频通话,有效提升用户粘性与活跃度。
示例场景:应用内聊天
推荐功能:消息管理、群组管理
客户案例:QQ、微信

2. 智能客服

即时通信 IM 满足商家与用户多场景沟通的需要,为客户提供专属客服服务,提升服务效率,与智能机器人相结合,可有效降低人力成本,沉淀客户价值。
示例场景:线上商城客服
推荐功能:在线客服
客户案例:阳光约车

3. 企业通讯

即时通信 IM 为企业客户提供解决方案,可覆盖桌面和移动端,设备无缝切换,实现企业沟通和办公的高效协同。
示例场景:企业内部通信
推荐功能:即时通信
客户案例:百世快递

4.系统消息通知

即时通信 IM 提供在线推送与离线推送服务,让系统消息精准到达。
示例场景:App 系统通知
推荐功能:消息推送
客户案例:货拉拉

5.游戏交流

即时通信 IM 可为游戏客户端提供大厅、小队、全服等多种聊天室类型,支持文字、语音、表情、短视频等多种消息类型,可通过自定义消息轻松实现游戏内道具赠送、交易等业务场景;同时,即时通信 IM 支持全球业务,我们已经在海外数十个国家部署专用服务器,为您的即时通信全球化提供强大动力。
示例场景:大厅群聊
推荐功能:多种群组类型、全球接入
客户案例:王者荣耀助手、腾讯游戏助手

6.在线教育

即时通信 IM 为在线课堂提供丰富的技术支持。可实现白板画笔轨迹保存、聊天室、小班教学实时音视频以及万人及以上直播课弹幕等功能。可轻松实现开课提醒、在线签到、班级管理、师生互动、白板教学、提问以及作业布置等功能。
示例场景:在线课堂、直播课
推荐功能:全球接入、直播群、自定义消息、群组管理
客户案例:Classin、中华会计网校、VIPkid、混沌大学

小程序接入(用户、客服端)两端使用在同一个小程序

直接上代码
先说一下

小程序一旦在导航页**用户端**接入聊天咨询
在第二端**客服端**也会调用导航页的聊天咨询 tim.on(.........)方法

因为是使用同一个 SDKAppID在这里插入图片描述
TIM腾讯聊天(即时通信 IM)(咨询客服业务)
TIM腾讯聊天(即时通信 IM)(咨询客服业务)
SDK腾讯云API文档

代码展示:
先安装:

在这里插入代码片// IM Web SDK
// 从v2.11.2起,SDK 支持了 WebSocket,推荐接入;v2.10.2及以下版本,使用 HTTP
npm install tim-js-sdk --save
// 发送图片、文件等消息需要腾讯云即时通信 IM 上传插件
npm install tim-upload-plugin --save
或者另外一版本
npm install cos-wx-sdk-v5 --save

TIM腾讯聊天(即时通信 IM)(咨询客服业务)

真心话:

算了全部代码直接展示了吧,刚入行的小伙,别压力太大。。。这是以下是没做优化的。
两端能正常聊天就不错了唉。。。。一个小程序还做两端。心累。。。。。

TIM腾讯聊天(即时通信 IM)(咨询客服业务)

用户端

在小程序用户导航,咨询页面pages/news/news中添加

// pages/news/news.js
import request from '../../network/request.js';
import util from '../../utils/util.js';
import * as watch from '../../utils/watch.js';
import TIM from 'tim-wx-sdk';
import COS from "cos-wx-sdk-v5";
var app = getApp();
Page({

  /**
   * 页面的初始数据
   */
  data: {
    //消息列表
    res: [],
    lock: true,
    state: null,
    num: 0,
    succeed: false,
    path:'pages/news/news'
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    let that =this
    if (wx.getStorageSync('token') == '' || !wx.getStorageSync('token')) {
      util.isLogin();
      return;
    }
    var options = {
      SDKAppID: app.globalData.SDKAppID
    }
    let tim = TIM.create(options);
    tim.setLogLevel(1); // 普通级别,日志量较多,接入时建议使用
    // 注册 COS SDK
    tim.registerPlugin({
      'cos-wx-sdk': COS
    });
    let promise = tim.login({
      userID: wx.getStorageSync('userid'),
      userSig: wx.getStorageSync('userSig')
    });
    promise.then(function (imResponse2) {
      const onSdkReady = function (event) {
        if (!that.data.lock) {
          return;
        }
        let promise1 = tim.getConversationList();
        promise1.then(function (imResponse) {
          if (imResponse.data.conversationList.length <= 0) {
            wx.hideLoading();
            return;
          }
          let conversationList = imResponse.data.conversationList; 
          // 会话列表,用该列表覆盖原有的会话列表
          that.setData({
            conversationList,
            allget: true,
            succeed: false
          })
        }).catch(function (imError) {
          console.warn('getConversationList error:', imError); 
          // 获取会话列表失败的相关信息-
        });
      };
      // 监听事件,例如:
      tim.on(TIM.EVENT.CONVERSATION_LIST_UPDATED, onSdkReady, that);
      that.setData({
        succeed: true
      })
    })
  }, // 换算时间
  showTime(val) {
    let newData = new Date().getTime()
    let timeDifference = newData - val //时间差
    let today = this.Format(newData)
    let yesterday = this.Format(newData - 24 * 60 * 60 * 1000) //昨天
    let timeDay = this.Format(val) //时间是几号
    if (timeDay == today) {
      if (timeDifference < 1 * 60 * 1000) {
        return "刚刚"
      } else if (1 * 60 * 1000 <= timeDifference && timeDifference < 60 * 60 * 1000) {
        return parseInt(timeDifference / 60 / 1000) + "分钟前"
      } else if (timeDifference >= 60 * 60 * 1000) {
        return parseInt(timeDifference / 60 / 60 / 1000) + "小时前"
      }
    } else if (timeDay == yesterday) {
      return "昨天"
    } else if (24 * 60 * 60 * 1000 <= timeDifference && timeDifference < 30 * 24 * 60 * 60 * 1000) {
      return parseInt(timeDifference / 24 / 60 / 60 / 1000) + "天前"
    } else if (30 * 24 * 60 * 60 * 1000 <= timeDifference && timeDifference < 12 * 30 * 24 * 60 * 60 * 1000) {
      return parseInt(timeDifference / 30 / 24 / 60 / 60 / 1000) + "个月前"
    } else if (timeDifference > 12 * 30 * 24 * 60 * 60 * 1000) {
      return parseInt(timeDifference / 12 / 30 / 24 / 60 / 60 / 1000) + "年前"
    }
  },
  // 年月日
  Format(val) {
    return new Date(val).getFullYear() + "-" + new Date(val).getMonth() + "-" + new Date(val).getDate()
  },
  authorization() {
    wx.showModal({
      title: '您还未登录',
      content: '请先登录再进行操作',
      success: function (res) {
        if (res.confirm) {
          wx.reLaunch({
            url: '../warrant/warrant'
          })
        } else {
          wx.reLaunch({
            url: '../home/home'
          })
        }
      }
    })
  },
  chatList() {
    // im会话列表
    var that = this;
    var options = {
      SDKAppID: app.globalData.SDKAppID
    }
    let tim = TIM.create(options);
    tim.setLogLevel(1);
    tim.registerPlugin({
      'cos-wx-sdk': COS
    });
    let logout = tim.logout();
    logout.then(function (imResponse) {}).catch(function (imError) {});
    let promise5 = tim.login({
      userID: wx.getStorageSync('userid'),
      userSig: wx.getStorageSync('userSig')
    });
    promise5.then(function (imResponse2) {
      const onSdkReady = function (event) {
        if (!that.data.lock) {
          return;
        }
        let promise1 = tim.getConversationList();
        promise1.then(function (imResponse) {
          if (imResponse.data.conversationList.length <= 0) {
            wx.hideLoading();
            return;
          }
          let conversationList = imResponse.data.conversationList; // 会话列表,用该列表覆盖原有的会话列表
          that.setData({
            conversationList,
            allget: true,
            succeed: false
          })
        }).catch(function (imError) {
          console.warn('getConversationList error:', imError); 
          // 获取会话列表失败的相关信息
        });
      };
      // 监听事件,例如:
      tim.on(TIM.EVENT.CONVERSATION_LIST_UPDATED, onSdkReady, that);
      // 开始登录 \
      that.setData({
        succeed: true
      })
    }).catch(() => {
      that.setData({
        succeed: false
      })
    })
  },
  watch: {
    // 监听返回的信息列表
    conversationList: function (newVal, oldVal) {
      console.log('监听',this.data.path, oldVal);
      let that = this;
      let counselorIds = [];
      if (newVal.length !== 0) {
        if(that.data.path==='pages/news/news' || that.data.path ==='pages/nesItem/nesItem'){
          newVal.map(ele => {
            counselorIds.push(ele.userProfile.userID)
          })
          var arr = [];
          var messageList = wx.getStorageSync('messageList') || [];
  
          //调用客服表获取头像名字
          request('/admin/consult/wx/counselor/list', 'post', {
            counselorIds
          }).then(res => {
            let obj = {
              noUser: true
            }
            //消息
            let data = res.data.data || obj
            data.map((item2) => {
              newVal.map((item1) => {
                if (item1.userProfile.userID == item2.counselorId) {
                  item2.text = item1.lastMessage.messageForShow == '[自定义消息]' ? item1.lastMessage.payload.description : item1.lastMessage.messageForShow;
                  item2.isRevoked = item1.lastMessage.isRevoked;
                  item2.isPeerRead = true;
                  let arr = wx.getStorageSync('storageList');
                  if (arr.length > 0) {
                    arr.forEach((item, index) => {
                      if (item.id == item1.userProfile.userID && item.time == item1.lastMessage.lastTime * 1000) {
                        item2.isPeerRead = false;
                      }
                    })
                  }
                  let lastTime = item1.lastMessage.lastTime * 1000;
                  let xz = new Date().getTime();
                  item2.time = that.showTime(lastTime);
                  item2.text = item2.text && item2.text.split("{").length > 1 ? JSON.parse(item2.text).title : item2.text
                  return item2
                }
              })
            })
            that.setData({
              res: data
            }, () => {
              wx.hideLoading();
              wx.setStorageSync('messageList', messageList)
            })
          })
          clearInterval(that.data.state);
          return
        }else if(that.data.path==='consuLtant/pages/home/home' || that.data.path==='consuLtant/pages/nesItem/nesItem'){
          app.globalData.counselorIds=newVal;
        }
      }
    },
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
    //启用数据监听
    watch.setWatcher(this);
    // this.chatList()
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    console.log('onShow')
    let _this = this
    if (!wx.getStorageSync('token')) {
      return;
    }
    this.data.lock = true;
    wx.onAppRoute((res) => {
      this.setData({
        path:res.path
      })
      if (res.path === 'pages/news/news') {
        this.chatList()
        if (!this.data.state) {
          clearInterval(_this.data.state);
          _this.setData({
            state: null
          })
          let num = 0
          _this.setData({
            state: setInterval(() => {
              num++;
              console.log(num);
              _this.chatList()
              if (num > 5) {
                clearInterval(_this.data.state);
                //如果不放心还可以把句柄置为null
                _this.setData({
                  state: null
                })
                num = 0
              }
            }, 100)
          })
        }
      }else if(res.path === 'consuLtant/pages/home/home' && wx.getStorageSync('do_access_token')){
        var options = {
          SDKAppID: app.globalData.SDKAppID
        }
        let tim = TIM.create(options)
        let logout = tim.logout();
        logout.then(function (imResponse) {});
        let promise = tim.login({
          userID: wx.getStorageSync('do_userid'),
          userSig: wx.getStorageSync('do_userSig')
        });
        promise.then((imResponse) => {})
        return
      }
    })

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
    var options = {
      SDKAppID: app.globalData.SDKAppID
    }
    let tim = TIM.create(options);
    let logout = tim.logout();
    logout.then(function (imResponse) {}).catch(function (imError) {});
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
    this.data.lock = false;
    var options = {
      SDKAppID: app.globalData.SDKAppID
    }
    let tim = TIM.create(options);
    let logout = tim.logout();
    logout.then(function (imResponse) {
    }).catch(function (imError) {});
  },

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

  },

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

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})

上面才获取列表,还没获取聊天详情呢

TIM腾讯聊天(即时通信 IM)(咨询客服业务)
用户聊天;

// pages/nesItem/nesItem.js
import request from '../../network/request.js';
import TIM from 'tim-wx-sdk';
import COS from "cos-wx-sdk-v5";
import util from "../../utils/util"

var app = getApp();
Page({

  /**
   * 页面的初始数据
   */
  data: {
    list: [], //消息列表
    yyImge: true, //默认显示输入文字
    options: "", //上一页传过来的参数
    token: null,
    userid: null,
    userSig: null,
    innerAudioContext: null, //创建内部 audio 上下文 InnerAudioContext 对象
    SDKAppID: {
      SDKAppID: app.globalData.SDKAppID
    },
    nextReqMessageID: "", //用于续拉,分页续拉时需传入该字段
    scrollTop: 0, //聊天页面滚动条的长度
    showScrollTop: 0, //需要滚动到的位置
    tim:null,
    userUrl: "",
    doctorUrl: "",
    uesrName: "",
    userMsg: "", //用户信息
    doctorMsg: "", //医生信息
    iputText: "",
    fsIputText: "", //发送的内容
    jp_height: 0, //键盘高度
    footer_bottom: 0, //键盘相对位置bottom
    lock: true,
    copyType: true, //true可复制
    thisPage: true,
    isIos: wx.getStorageSync('model') == "ios" ? true : false,
    tipsText: "请输入内容", //自定义提示文字
    showTips: false, //true为显示自定义提示
    moveUp: false, //true表示输入区需要上移
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
     console.log('options',options);
    this.initialization()
    this.setData({
      options: options,
      token: wx.getStorageSync('token'),
      userid: wx.getStorageSync('userid'),
      userSig: wx.getStorageSync('userSig'),
      uesrName: options.name || ""
    })
    wx.setNavigationBarTitle({
      title: decodeURIComponent(options.name) || ""//动态标题
    })
    this.useTim()
    this.getUserUrl()
    this.getDoctorUrl()
  },
    // 引入使用腾讯云
    useTim() {
      if (!this.data.lock) return;
      this.data.lock = false;
      this.setData({
        tim: TIM.create(this.data.SDKAppID)
      })
      let tim = this.data.tim
      // 设置 SDK 日志输出级别,详细分级请参见 setLogLevel 接口的说明
      tim.setLogLevel(0); // 普通级别,日志量较多,接入时建议使用
      // 注册 COS SDK
      tim.registerPlugin({
        'cos-wx-sdk': COS
      });
      // this.getMessageList();
      let _this = this;
      let promise = tim.login({ userID: this.data.userid, userSig: this.data.userSig});
        promise.then(function(imResponse) {
          console.log(imResponse.data); // 登录成功
          if (imResponse.data.repeatLogin === true) {
            // 标识帐号已登录,本次登录操作为重复登录。v2.5.1 起支持
            _this.getMessageList();
            console.log(imResponse.data.errorInfo);
          }
        }).catch(function(imError) {
          console.warn('login error:', imError); // 登录失败的相关信息
        });
      
    },
  // 重登tim
  restLoginTim(callback) {
    // let logout = this.data.tim.logout();
    // logout.then(function (imResponse) {}).catch(function (imError) {});
    let login = this.data.tim.login({
      userID: this.data.userid,
      userSig: this.data.userSig
    })
   
    login.then((imResponse) => {
      this.timReady()
      callback()
    }).catch(function (imError) {
      console.warn('login error:', imError); // 登录失败的相关信息
    });
  },
  timReady() { 
    this.data.tim.on(TIM.EVENT.SDK_READY, () => {
      if (this.data.lock) return
      this.data.lock = true;
      this.getMessageList()
      if (!this.data.list.length) {
        this.getNewNews()
      }
    })
  },
 // 获取用户信息
 getUserUrl() {
  request('/admn/patient/wx/geo', 'get').then(res => {
    this.setData({
      userMsg: res.data.data,
      uesrName: res.data.data.realName,
      userUrl:res.data.data.avatar
    })
    if (!this.data.options.name) {
      wx.setNavigationBarTitle({
        title: res.data.data.realName
      })
    }
  })
},
// 获取医生信息
  getDoctorUrl() {
  request(`/admin/consult/counselor/findByCounId/${this.data.options.id}`, 'post',{}).then(res => {
    this.setData({
      doctorUrl: res.data.data.counselorImg,
      doctorMsg: res.data.data
    })
  })
  },
  // 获取聊天记录
  getMessageList() {
    this.getFooterBottom()  
    let promise = this.data.tim.getMessageList({
      conversationID: 'C2C' + this.data.options.id, //id为对应聊天人的userID
      count: 15 //一次拉取的聊天条数
    });
    //初始化渲染消息列表
    promise.then((imResponse) => {
      let list = imResponse.data.messageList
      let nextReqMessageID = imResponse.data.nextReqMessageID; // 用于续拉,分页续拉时需传入该字段。
      let arr = this.publicFindList(list)
      this.setData({
        list: arr,
        nextReqMessageID
      }, () => {
        this.setStorageList()
        this.scrollTop()
      })
    })
  },
  // 下拉获取更多聊天记录
  dropDownGetList() {
    this.scrollTop("change")
    this.getFooterBottom()
    let promise = this.data.tim.getMessageList({
      conversationID: 'C2C' + this.data.options.id, //id为对应聊天人的userID
      nextReqMessageID: this.data.nextReqMessageID, //用于续拉,分页续拉时需传入该字段
      count: 15 //一次拉取的聊天条数
    });
    //初始化渲染消息列表
    promise.then((imResponse) => {
      let list = imResponse.data.messageList
      if (!list.length) return
      let nextReqMessageID = imResponse.data.nextReqMessageID; // 用于续拉,分页续拉时需传入该字段。
      let arr = this.publicFindList(list)
      this.setData({
        list: [...arr, ...this.data.list],
        nextReqMessageID
      }, () => {
        this.scrollTop("show")
      })
    })
  },
  // 获取消息列表更改赋值公有方法
  publicFindList(list) {
    let arr = []
    list.find(item => {
      let text = item.type == 'TIMCustomElem' ? item.payload.description : item.payload.text
      arr.push({
        state: item.from == this.data.userid ? true : false, //true为我发送的,则对方
        data: item.payload.text && item.payload.text.split("{").length > 1 ? JSON.parse(item.payload.text) : "", //预约提示的自定义消息
        text: text, //语音视频提示或者发的消息
        isLink: this.judgeLink(text), //判断是否为链接
        type: item.type, //表示是自定义消息
        img: item.payload.imageInfoArray ? item.payload.imageInfoArray[0].imageUrl : '', //图片
        url: item.payload.url, //语音地址
        second: item.payload.second, //语音时长
        fjh: item.payload.extension, //房间号
        types: item.payload.data, //自定义消息属性
        time: item.time * 1000,
        showTime: this.showTime(item.time * 1000)
      })
    })
    return arr
  },
  // 判断是否为链接
  judgeLink(val) {
    let text = /^((http|https):\/\/)?(([A-Za-z0-9]+-[A-Za-z0-9]+|[A-Za-z0-9]+)\.)+([A-Za-z]+)[/\?\:]?.*$/
    return text.test(val)
  },
  // 换算时间
  showTime(val) {
    let newData = new Date().getTime()
    let timeDifference = newData - val //时间差
    let today = this.Format(newData)
    let yesterday = this.Format(newData - 24 * 60 * 60 * 1000) //昨天
    let nowDayOfWeek = new Date().getDay(); //今天本周的第几天
    let lastWeek = newData - nowDayOfWeek * 24 * 60 * 60 * 1000 //上周星期天
    let thisYear = new Date().getFullYear() //今年
    let thisMonth = new Date().getMonth() + 1 //本月
    let newVal = new Date(val)
    let timeDay = this.Format(val) //时间是几号
    let newYear = newVal.getFullYear() //年
    let newMonth = newVal.getMonth() + 1 //月份
    let newDate = newVal.getDate() //日
    let newHours = newVal.getHours() > 9 ? newVal.getHours() : "0" + newVal.getHours() //时
    let newMinutes = newVal.getMinutes() > 9 ? newVal.getMinutes() : "0" + newVal.getMinutes() //分

    let time = newHours + ":" + newMinutes
    // if (timeDifference < 2 * 60 * 1000 && timeDay == today) {
    //   return "刚刚"
    // } else
    if (timeDay == today) {
      return time
    } else if (timeDay == yesterday) {
      return "昨天  " + time
    } else if (val > lastWeek) {
      let arr = ["一", "二", "三", "四", "五", "六"]
      switch (new Date(val).getDay()) {
        case 7:
          return "星期日  " + time
        default:
          return "星期" + arr[new Date(val).getDay() - 1] + "  " + time
      }
    } else {
      return newYear + "年" + newMonth + "月" + newDate + "日  " + time
    }

  },
  // 年月日
  Format(val) {
    return new Date(val).getFullYear() + "-" + new Date(val).getMonth() + "-" + new Date(val).getDate()
  },
  // 获取jp_height
  getFooterBottom() {
    let model = wx.getStorageSync('model')
    let height
    if (model == "ios") {
      height = this.data.jp_height ? 0 : this.data.jp_height
      console.log('键盘高度',height);
    } else {
      height = this.data.jp_height
      console.log('键盘高度',height);
    }
    this.setData({
      footer_bottom: height
    })
  },
  // 收到推送的新消息
  getNewNews() {
    this.data.tim.on(TIM.EVENT.MESSAGE_RECEIVED, (event) => {
      let length = this.data.list.length
      let list = this.data.list
      let data = event.data[0]
      if (data.from != this.data.options.id) return
      // 监听对方消息
      let text = data.type == 'TIMCustomElem' ? data.payload.description : data.payload.text
      list[length] = {
        state: data.from == this.data.userid ? true : false, //true是我,则对方
        data: data.payload.text && data.payload.text.split("{").length > 1 ? JSON.parse(data.payload.text) : "", //预约提示的自定义消息
        text: text, //自定义消息或者发的消息
        isLink: this.judgeLink(text), //判断是否为链接
        type: data.type,
        img: data.payload.imageInfoArray ? data.payload.imageInfoArray[0].imageUrl : '', //发来的图片
        url: data.payload.url, //语音
        second: data.payload.second, //语音时长
        fjh: data.payload.extension, //房间号
        types: data.payload.data, //自定义消息属性
        time: data.time * 1000,
        showTime: this.showTime(new Date().getTime())
      }
      this.setData({
        list
      })
      this.setStorageList()
      this.getFooterBottom()
      this.scrollTop()
    });
  },
  // 关闭键盘
  hideKeyboard() {
    wx.hideKeyboard()
    this.setData({
      jp_height: 0,
      footer_bottom: 0
    })
  },
  // 获取输入框消息
  inpValue(e) {
    this.setData({
      iputText: e.detail.value
    })
  },
  // 输入框聚焦
  focus() {
    this.getFooterBottom()
    this.scrollTop()
  },
  // 发送信息
  sendComments() {
    console.log('点击',this.data.iputText)
    this.getFooterBottom()
    if (!this.data.iputText.replace(/ /g, '')) {
      this.customize("请输入内容")
      return;
    }
    // 判断是否有网
    if (wx.getStorageSync('nonetwork')) {
      wx.showToast({
        title: '网络连接失败',
        icon: 'none',
        duration: 1000
      })
      return
    }
    this.data.fsIputText = this.data.iputText
    this.setData({
      iputText: '',
    })
    let message = this.data.tim.createTextMessage({
      to: this.data.options.id,
      conversationType: TIM.TYPES.CONV_C2C,
      payload: {
        text: this.data.fsIputText
      }
    });

    let promise = this.data.tim.sendMessage(message);
    let fn = promise.then((imResponse) => {
      let data = imResponse.data.message
      this.getMessageList()
      this.consultmessage(1, data.payload.text)
    }).catch((imError) => {
      this.restLoginTim(fn)
      // 发送失败
      console.warn('sendMessage error:', imError);
    });
  },
  // 预览图片
  previewImg(e) {
    let url = e.currentTarget.dataset.url
    let list = []
    this.data.list.find(item => {
      if (item.img) {
        list.push(item.img)
      }
    })
    wx.previewImage({
      current: url,
      urls: list
    })
  },
  // 发送图片
  chooseimage: function () {
    this.getFooterBottom()
    this.hideKeyboard()
    let that = this
    // 1. 选择图片
    wx.chooseImage({
      sourceType: ['album'], // 从相册选择
      count: 1, // 只选一张,目前 SDK 不支持一次发送多张图片
      success: (res) => {
        this.qiniuUpload(2, res)
        // 2. 创建消息实例,接口返回的实例可以上屏
        let message = this.data.tim.createImageMessage({
          to: this.data.options.id,
          conversationType: TIM.TYPES.CONV_C2C,
          payload: {
            file: res
          },
          onProgress: function (event) {}
        });
     
        let promise = this.data.tim.sendMessage(message);
        promise.then((imResponse) => {
          that.getMessageList()
        }).catch((imError) => {
          console.warn('sendMessage error:', imError);
        });
      }
    })
  },
  // 键盘高度发生变化
  bindkeyboardheightchange(e) {
    let height = e.detail.height
    this.setData({
      jp_height: height,
      footer_bottom: height
    })
  },
  // 滚动条到底部
  scrollTop(bool) {
    const query = wx.createSelectorQuery()
    query.select('.scroll').boundingClientRect()
    query.exec((res) => {
      let num = res[0] && res[0].height || 0
      if (bool == "change") {
        this.data.scrollTop = num
        return
      }
      let showNum = bool == "show" ? num - this.data.scrollTop + 20 : num + 20
      this.setData({
        showScrollTop: showNum
      })
    })
  },
  copyTextEnd() {
    this.data.copyEnd = true;
    this.data.startTime = new Date().getTime()
  },
  // 自定义提示消息
  customize(text) {
    this.data.tipsStartTime = new Date().getTime()
    this.setData({
      showTips: true,
      tipsText: text
    }, setTimeout(() => {
      this.data.tipsEndTime = new Date().getTime()
      let time = this.data.tipsEndTime - this.data.tipsStartTime
      if (time >= 1000) {
        this.setData({
          showTips: false
        })
      }
    }, 1000))
  },
  // 存消息
  consultmessage(type, text) {
    // type 1普通文本 2图片 3语音 4视频 5功能性 6其他
    // ly发送方 1用户 2医生
    request(`/admin/consult/consultmessage/userSave?id=${this.data.options.id}&ly=${1}&type=${type}&text=${text}`, 'post', {   
    }).then(res => {})
  },
  // 存数据
  setStorageList() {
    let listLength = this.data.list.length
    let id = this.data.options.id
    const storageList = wx.getStorageSync('storageList') || [] //本地存储消息列表信息
    let storageListLength = storageList.length
    let idList = storageListLength > 0 ? storageList.map(item => {
      return item.id
    }) : []
    // 以前存在过
    if (listLength > 0) {
      if (idList.indexOf(id) > -1) {
        storageList.find(item => {
          if (item.id == id) {
            item.time = this.data.list[listLength - 1].time
            item.iputText = this.data.iputText
          }
        })
      } else {
        storageList.push({
          id: id,
          time: this.data.list[listLength - 1].time,
          iputText: this.data.iputText
        })
      }
      if (this.data.thisPage) {
        wx.setStorageSync('storageList', storageList)
      }
    }
  },
  // 进入页面给默认显示的信息(如:未发送的文本)
  initialization() {
    let model = wx.getStorageSync('phoneObj').model
    this.setData({
      moveUp: model.includes("iPhone XR"),
    })
    this.data.thisPage = true
    let listLength = this.data.list.length
    let id = this.data.options.id
    const storageList = wx.getStorageSync('storageList') || [] //本地存储消息列表信息
    let storageListLength = storageList.length
    let idList = storageListLength > 0 ? storageList.map(item => {
      return item.id
    }) : []
    if (storageListLength > 0) {
      if (idList.indexOf(id) > -1) {
        storageList.find(item => {
          if (item.id == id) {
            this.setData({
              iputText: item.iputText
            })
          }
        })
      } else {
        this.setData({
          iputText: ""
        })
      }
    }

  },
  // 离开页面需要做的处理
  leavePage() {
   
  //  this.data.innerAudioContext.pause()
    this.setStorageList()
    this.data.thisPage = false
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
    this.restLoginTim()
  },

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

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
    this.leavePage()
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
    this.leavePage()
  },
})

还有客服端哦
不想写了,有人就用加油吧。我改改写写2天多才就那样
html样式也就那样,就不复制了
TIM腾讯聊天(即时通信 IM)(咨询客服业务)文章来源地址https://www.toymoban.com/news/detail-491381.html

到了这里,关于TIM腾讯聊天(即时通信 IM)(咨询客服业务)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序之在线客服(即时聊天)

    一、即时聊天 使用小程序给我们提供的在线聊天功能,在界面中只能通过按钮开放能力来打开。 注意:此功能只能在手机端中去使用,在模拟器中无法进行。 二、小程序页面中的代码展示 上诉button按钮需要绑定open-type=“contact” 这个参数即可实现客服功能。 注意:模拟器

    2024年02月11日
    浏览(54)
  • 如何实现IM即时通信系统(一)

    在企业数字化建设过程中,如何与客户保持线上链接是重要的组成部分。而IM通信系统就属于数字化建设的基础设施。那么,如何实现一个符合企业需求的IM系统呢?采购当然是其中需要考虑的方式之一。但就我个人的经验来看,市面上好的IM厂商很稀少,因为IM厂商需要做标

    2024年02月10日
    浏览(69)
  • uniapp即时通讯源码/im聊天系统源码开源(app+h5+小程序+pc四端)

    IM即时通讯源码是现今互联网行业中成熟、稳定和高效的即时通讯解决方案之一,其源码可以提供给开发者进行二次开发和定制化,实现更加个性化的即时通讯功能。本文将围绕IM即时通讯源码进行深入探讨,包括其优势、应用场景以及二次开发和定制化等方面的内容。 源码

    2024年02月04日
    浏览(45)
  • uniapp小程序接入腾讯IM聊天

    腾讯IM中创建项目 拿到AppID 与 密钥  下载demo 将debug 文件夹拖到自己项目中  在第一个js文件中填入自己项目的APPID 与密钥 下载(tim-wx-sdk 上传文件 的依赖 看项目所需

    2024年02月11日
    浏览(43)
  • springboot+websocket+webrtc 仿微信、仿QQ 音视频通话聊天 飞鱼chat IM即时通讯

    仿微信、QQ音视频聊天,文字表情、收发文件图片等功能。本项目使用springboot+websocket+webrtc-bootstrap5+H5+JQuery3.3+mysql实现,可自适应PC端和移动端 git地址在最后 pc端效果图 WebSocket是一种在单个TCP连接上进行全双工通信的协议,这使得客户端和服务器之间的数据交换变得更加简单

    2024年02月04日
    浏览(56)
  • 开源im聊天系统源码全套+php即时通讯源码带直播红包系统(uniapp/pc/app/h5四端)

    随着移动互联网的迅猛发展,即时通讯(Instant Messaging,简称IM)已经成为现代社交生活中不可或缺的一部分。无论是个人还是企业,都需要一种高效、安全、稳定的即时通讯方式来满足实时沟通的需求。因此,IM源码的开发变得越来越重要,它为我们提供了构建现代化即时通

    2024年02月03日
    浏览(57)
  • 分布式websocket即时通信(IM)系统保证消息可靠性【第八期】

    b站上面本期视频版本,观看视频食用更佳!点击即可跳转,找不到视频可以直接搜索我 目前叫 呆呆呆呆梦 目前已经写的文章有。并且有对应视频版本。 git项目地址 【IM即时通信系统(企聊聊)】点击可跳转 sprinboot单体项目升级成springcloud项目 【第一期】 前端项目技术选型

    2024年01月22日
    浏览(63)
  • IM即时通讯开发MQ消息队列

    消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一。   消息从发送者到接收者的典型传递方式有两种:     1)一种我们可以称为即时消息:即消息从一端发出后(消息发送者

    2024年02月12日
    浏览(72)
  • 开源即时通讯IM框架 MobileIMSDK v6.4 发布

    本次更新为次要版本更新,进行了若干优化(更新历史详见:码云 Release Notes、Github Release Notes)。MobileIMSDK 可能是市面上唯一同时支持  UDP + TCP + WebSocket  三种协议的同类开源IM框架。 MobileIMSDK 是一套专为移动端开发的原创IM通信层框架: 历经10年、久经考验; 超轻量级、

    2024年02月06日
    浏览(59)
  • IM即时通讯-6-已读回执的方案设计

    部分即时通讯软件会选择展示给用户已读未读, 主要是***快速感知对方的阅读状态, 感觉到自己受重视, 方便做下一步操作***。 如果要带点高度的讲, 满足软件所代表的关键用户的诉求 toB的场景 如钉钉, 企业微信。已读未读, 是为了满足企业运作核心效率(即老板视角

    2023年04月09日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包