WebIM Vue Demo 使用文档
简介
使用 Vue 框架开发的WebIM Demo,仅供参考集成:
- Vue Demo (体验Demo)
- Github.com(Github 源码地址)
项目运行
- 说明:音视频功能必须使用
https + webkit浏览器
NODEJS
版本建议 6+ 低于 13 (升级到13,结果用不了) 目前用的是 V8.11.4
1.将源码克隆到本地
git clone https://github.com/easemob/webim-vue-demo.git
2.进入项目根目录,安装运行需要的依赖模块
npm install
3.上述操作完成后
# 启动测试
npm start (如需要测试音视频功能,通过 HTTPS=true npm start 启动)
# 打包发布,发布后文件在 build/ 目录下
npm run build
4.修改appkey 运行
在WebIMConfig.js
中,将 appkey
改为自己在IM管理后台申请的key,apiUrl
,xmppUrl
默认的无需更改,如果已联系环信商务购买vip集群服务
,需要更改成环信提供的地址,或者直接将 isHttpsDNS
改为 true
,就不需要在本地配置apiUrl
,xmppUrl
目录介绍
目录 | 说明 | |
---|---|---|
build | 打包后的文件 | |
config | 项目的配置 | |
node_modules | 项目依赖 | |
static | 资源文件 | |
travis | CI脚本 | |
src | 项目源文件 | |
components | 项目组件 | |
config | 表情和项目中ui配置 | |
pages | 项目页面 | |
router | 路由 | |
store | vuex store | |
utils | sdk 引入和配置 |
Demo 文件说明
- 所有SDK 的调用都在
src/stroe
,使用VueX
管理
SDK 集成
分为 NPM
,本地引入文件
两种方式,这里主要将下 Demo
集成方式:
demo 是使用 NPM
方式集成,代码目录:src/utils/WebIM.js
- 引入 SDK 和配置文件,实例化。
- 注册 SDK 监听事件
登陆/注册
集成IM SDK,只有登陆成功后才能进行收发消息等操作
代码目录:src/pages/login
SDK 方法目录:src/store/login
# 登陆
onLogin: function (context, payload) {context.commit("setUserName", payload.username);var options = {apiUrl: WebIM.config.apiURL,user: payload.username,pwd: payload.password,appKey: WebIM.config.appkey};WebIM.conn.open(options);localStorage.setItem("userInfo", JSON.stringify({ userId: payload.username, password: payload.password }));
},
# 注册
onRegister: function (context, payload) {const _this = this;var options = {apiUrl: WebIM.config.apiURL,username: payload.username,password: payload.password,nickname: payload.nickname,appKey: WebIM.config.appkey,success: () => {//注册成功,开发者自己定义提示},error: (err) => {//注册失败,开发者自己定义提示};WebIM.conn.registerUser(options);
},
消息模块
代码目录:src/components/chat
SDK 方法目录:src/store/chat
index
为发送消息 (群组消息需要设置typemsg.setGroup("groupchat")
)message
为显示消息上屏图片消息
代码目录:src/components/upLoadImage
附件消息
代码目录:src/components/upLoadFile
表情消息
代码目录:src/components/chatEmoji
录音发送
支持直接录音发送
代码目录:src/components/recorder
# 发送文本消息
onSendText: function(context, payload){const { chatType, chatId, message } = payload;const id = WebIM.conn.getUniqueId();const time = +new Date();const chatroom = chatType === "chatroom";const type = chatType === "contact" ? "singleChat" : "groupChat";const jid = {contact: "name",group: "groupid",chatroom: "id"};const msgObj = new WebIM.message("txt", id);msgObj.set({msg: message,to: chatId[jid[chatType]],chatType: type,roomType: chatroom,success: function(){//消息发送成功,开发者自己处理},fail: function(e){//消息发送失败,开发者自己处理}});if(chatType === "group" || chatType === "chatroom"){msgObj.setGroup("groupchat");}WebIM.conn.send(msgObj.body);
}
好友功能
代码目录:src/components/addModel
SDK调用方法目录:src/store/friendModule
addFriend
添加好友friendBlack
好友黑名单getFriendRequest
收到好友请求
# 添加好友
addFriend: function(context, payload){const username = localStorage.getItem("userInfo") && JSON.parse(localStorage.getItem("userInfo")).userId;const { id } = payload;WebIM.conn.subscribe({to: id,message: username + "请求添加你为好友"});
},
# 接受好友请求
acceptSubscribe: function(context, payload){WebIM.conn.subscribed({to: payload,message: "[resp:true]"});
},
# 拒绝好友请求
declineSubscribe: function(context, payload){const username = localStorage.getItem("userInfo") && JSON.parse(localStorage.getItem("userInfo")).userId;const { id } = payload;WebIM.conn.unsubscribed({to: id,message: username + "拒绝您的好友请求"});
},
# 获取好友黑名单
onGetFriendBlack: function(context, payload){WebIM.conn.getBlacklist();
},
# 添加好友黑名单
onAddBlack: function(context, payload){let addName = payload.userId.name;WebIM.conn.addToBlackList({name: addName,});Vue.$store.dispatch("onGetContactUserList", { type: "addBlack", addName });
},
# 移除好友黑名单
onRemoveBlack: function(context, payload){let blackName = payload.removeName;WebIM.conn.removeFromBlackList({name: blackName,success: function(){},error: function(){}});
},
# 删除好友
onDeleteFriend: function(context, payload){let deleteName = payload.userId.name;WebIM.conn.removeRoster({to: deleteName,success: function(){ // 删除成功conn.unsubscribed({to: deleteName});},error: function(){ // 删除失败}});
}
音视频
单人和多人音视频,代码目录:src/components/emediaModal
index
初始化单人音视频,注册单人音视频multiAVModal
多人音视频 (请直接参考文件)
# 单人音频呼叫
onCallVoice: function(context, payload){const { chatType, to } = payload;const type = chatType === "contact" ? "singleChat" : "groupChat";const userInfo = JSON.parse(localStorage.getItem("userInfo"));if(chatType === "contact"){WebIM.call.caller = userInfo.userId;WebIM.call.makeVoiceCall(to, null, payload.rec, payload.recMerge);}
},
# 单人视频呼叫
onCallVideo: function(context, payload){const { chatType, to } = payload;const type = chatType === "contact" ? "singleChat" : "groupChat";const userInfo = JSON.parse(localStorage.getItem("userInfo"));if(chatType === "contact"){WebIM.call.caller = userInfo.userId;WebIM.call.makeVideoCall(to, null, payload.rec, payload.recMerge);}
},
# 接收音频/视频 邀请
accept(){WebIM.call.acceptCall();
},
# 挂断
WebIM.call.endCall();
音视频录制
录制功能,SDK V3.0.6
版本开始,由SDK 控制是否进行录制(若SDK 不是此版本,录制功能请联系商务同事
协调配置)
代码目录: src/components/videoSetting
SDK 方法调用目录:src/store/chat
- 请参考发起音视频的方法,第三个参数为是否录制、第四个参数为是否合并,参数可以为空
群组功能
群组代码目录:src/components/group
SDK 调用方法目录: src/store/group
createGroup
创建群组
onCreateGroup: function (context, payload) {const { groupname, desc, members, pub, approval } = payloadlet options = {data: {groupname: groupname, // 群组名desc: desc, // 群组描述members: members, // 用户名组成的数组public: pub, // pub等于true时,创建为公开群approval: approval, // approval为true,加群需审批,为false时加群无需审批},success: function (resp) {//创建群组成功},error: function () { //创建群组失败}};WebIM.conn.createGroupNew(options);
},
addGroupUser
加入群组
onJoinGroup: function (context, payload) {let options = {groupId: payload.select_groupid, // 群组IDsuccess: function (resp) {//加入成功,开发者自己处理},error: function (e) {//加入失败,开发者自己处理};WebIM.conn.joinGroup(options);
},
groupBlack
群组黑名单
onGetGroupBlack: function (context, payload) {let select_id = payload.groupid || payload.select_idlet option = {groupId: select_id,success: function (list) {//获取成功},error: function () {}};WebIM.conn.getGroupBlacklistNew(option);
},
groupInfo
群组详情
onGetGroupinfo: function (context, payload) {let gid = payload.select_id || payload.select_groupid;let options = {groupId: gid, //群组idsuccess: function (resp) {//获取成功},error: function () { //获取失败}};WebIM.conn.getGroupInfo(options)
},
groupInvite
邀请好友进群
onInviteGroup: function (context, payload) {const { select_id, select_name } = payloadlet option = {users: [select_name],groupId: select_id};WebIM.conn.inviteToGroup(option);
},
groupRequest
收到群组申请
# 收到进群申请 同意
onAgreeJoinGroup: function (context, payload) {const { joinName, joinGroupId } = payloadlet options = {applicant: joinName, // 申请加群的用户名groupId: joinGroupId, // 群组IDsuccess: function (resp) {},error: function (e) { }};WebIM.conn.agreeJoinGroup(options);
},
# 收到进群申请 拒绝
onRejectJoinGroup: function (context, payload) {const { joinName, joinGroupId } = payloadlet options = {applicant: joinName, // 申请加群的用户名groupId: joinGroupId, // 群组IDsuccess: function (resp) {},error: function (e) { }};WebIM.conn.rejectJoinGroup(options);
},
groupSetting
群组设置
请参考src/store/group
消息存储
代码目录:store > chat > msgList
SDK 调用方法目录:src/store/chat
如您已经开通 SDK 增值服务 消息漫游
- 关于持久化:这个demo采用的 SDK 的增值服务 消息漫游,拉取历史消息展示
# 拉取历史消息
getHistoryMessage: function(context, payload){const options = {queue: payload.name,isGroup: payload.isGroup,count: 10, // 每次获取消息条数success: function(msgs){ },fail: function(){ }};WebIM.conn.fetchHistoryMessages(options);
},
若您未开通上述功能
- 可以采用 indexdb 做本地存储
- 使用
增值功能
消息实时回调,将消息实时同步到开发者的服务器 - 使用 免费功能 Rest 拉取历史消息,消息拉取有延迟,消息实时性要求不高的开发者使用此功能
消息撤回
代码目录:src/store/chat
recallMessage: function(context, payload){const { chatType, mid } = payload.message;const to = payload.to;const me = this;const chatTypeObj = {contact: "chat",group: "groupchat",chatroom: "chatroom"};const option = {mid,to,type: chatTypeObj[chatType],success: function(){console.log("消息已撤回")payload.message.status = "recall";payload.message.msg = "消息已撤回";Vue.$store.commit("updateMessageStatus", payload.message);},fail: function(){// me.$message('消息撤回失败');},};WebIM.conn.recallMessage(option);
}
SDK 集成方式说明
NPM 集成
IM SDK, 音视频 SDK 支持NPM 安装,其中单人音视频SDK 依赖 IM SDK
# 安装 IM SDK
npm install easemob-websdk# 安装单人音视频
npm install easemob-webrtc# 安装多人音视频 SDK
npm install easemob-emedia
项目引入SDK
- 注:npm 安装的只有 SDK,还需要本地引入
WebIMConfgi.js
文件
import websdk from "easemob-websdk";
import emedia from "easemob-emedia";
import webrtc from "easemob-webrtc";
可直接参考 Demo目录 src/utils/WebIM.js
引入本地文件 集成
- 需要下载 React Demo,Vue Demo 没有将以下文件本地化
- 本地文件集成,需要在初始化和消息发送时加上
default
# 创建链接conn = WebIM.conn = new WebIM.default.connection({})# 消息WebIM.message = WebIM.default.message
1.下载Demo 后,将 SDK 目录下的 webimSDK.js
、EMedia_x1v1.js
、EMedia_sdk-dev.js
拷贝到项目目录下
2.再找到 WebIMConfig.js
文件拷贝到和上述文件的同级目录下
3.引入文件
<script type='text/javascript' src='./WebIMConfig.js'></script>
<script type='text/javascript' src='./webimSDK.js'></script>
<script type='text/javascript' src='./EMedia_x1v1.js'></script>
<script type='text/javascript' src='./EMedia_sdk-dev.js'></script>
或 使用import
引入本地目录文件
import config from "./WebIMConfig.js"
import websdk from "./webimSDK.js";
import emedia from "EMedia_x1v1.js";
import webrtc from "EMedia_sdk-dev.js";
文件引入后,注册监听,就可以进行登陆,收发消息,音视频等操作
常见错误
- 发送消息提示:禁止通讯,
inter-app communication is not allowed
需要在初始化SDK 候加上appKey: WebIM.config.appkey;
- 访问SDK,xmpp链接显示多个域名或ip
需要在地址前加上//
或使用isHttpsDNS:true
(在WebIMConfig.js中设置) - npm 安装集成出现提示
在webpack.base.conf.js
如图添加配置unknownContextCritical: false
,exprContextCritical: false
WebIM Vue Demo 使用文档相关推荐
- vue 导出word文档(包括图片)
vue 导出word文档(包括图片) 1.打开终端,安装依赖 -- 安装 docxtemplater npm install docxtemplater pizzip --save-- 安装 jszi ...
- vue+ts在线文档编辑(类腾讯文档)多人在线编辑-自定义页眉和分页打印(三)
目录 前言 一.自定义页眉内容 二.分页文档打印 1.加入分页符 2.打印方法 3.打印模块完整代码 总结 前言 随着在线办公场景越来越多,同时需要各式各样办公软件,在开发时就用得到在线文档来内容指定 ...
- 5013.FortiGate企业级硬件防火墙Demo演示文档
FortiGate企业级硬件防火墙Demo演示文档 语言:英文 类型:Demo 大小:2MB 格式:WEB 摘要:和真实的硬件防火墙操作界面一模一样的,非常实用! 可以通过这些界面了解到在配置硬件防火 ...
- vue插件开发、文档书写、github发布、npm包发布一波流
做vue开发,基本的操作会了之后是不是特想撸一撸vue的插件,让自己的代码可(骚)复(骚)用(的).别急,今天和你一起手摸手,哦呸,是手把手,一起撸一管,哦再呸,是封装一个基于vue的支付宝密码弹窗插 ...
- SpringBoot+Vue+OpenOffice实现文档管理(文档上传、下载、在线预览)
场景 SpringBoot集成OpenOffice实现doc文档转html: SpringBoot集成OpenOffice实现doc文档转html_BADAO_LIUMANG_QIZHI的博客-CSD ...
- vue进阶04-vue文档生成工具vuepress2
介绍 VuePress 是一个以 Markdown 为中心的静态网站生成器.你可以使用 Markdown 来书写内容(如文档.博客等),然后 VuePress 会帮助你生成一个静态网站来展示它们. V ...
- vue 下载word文档时谷歌浏览器正常,IE下载文件损坏
项目场景: 用vue项目做一个后台管理,要做到兼容谷歌浏览器及IE浏览器,谷歌浏览器问题很少,但是由于IE浏览器比较老,涉及到的兼容问题也比较多. 问题描述: 在详情页面中有个下载按钮,下载word. ...
- vue中文版Dash文档
文章目录 准备 开始 导入 准备 node环境 homebrew[homebrew地址]https://brew.sh/index_zh-cn brew install wget wget --mir ...
- Vue 3.0文档编写指南
译者:本章节大部分内容是针对母语是英文的读者,中文用户可略读,除非你想以英文文档编写者的身份参与 Vue docs 的编写, 编写文档是一种换位思考的练习.我们并不是在描述客观现实--源代码已经做到了 ...
- 俩万搭建安装SpringBoot+VUE【视频+文档+源码】
下面有在线预览地址 本项目免费开源完整可查阅文档,由 JavaPub 维护更新.可以协助适配不同操作系统及存储平台. 文章目录 适合人群 liawan-vue 俩万 收录 在线预览 文档 技术栈 环境 ...
最新文章
- linux shell 删除文本 较长行
- tensorflow与keras的关系
- oracle package lock,Oracle 11g下重现library cache lock等待事件
- 社交网络图中结点的“重要性“计算(Dijkstra + SPFA + Floyd + 模板)
- 使用 Arduino 和 LM35 温度传感器监测温度
- linux小红帽系统能用微信,小红帽腾讯QQ微信登录版-小红帽腾讯版v1.0.3 安卓版-腾牛安卓网...
- Flutter PageView 使用详细概述
- BlueHost Gzip优化JS和CSS传输
- http缓存协议详解
- 浅谈谷歌退出中国市场带来的问题
- 激光技术领域的又一重大突破:光学频率梳
- 很邪门的事,你知道多少?
- Leetcode每日一题2020.11.13第328题:奇偶链表
- MySQL给表和字段添加注释
- win10照片查看器_解决“Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足……”...
- 代理ARP的作用和原理
- 堆栈内存的分析以及作用域的详解
- 生活数字化 小故事告诉你什么是大数据
- TIL —静态工厂方法
- 不熟悉的四级核心词汇(二)