{{tip}}
@@ -15,7 +15,7 @@
import HeadImage from '../common/HeadImage.vue';
export default {
- name: "videoAcceptor",
+ name: "rtcPrivateAcceptor",
components: {
HeadImage
},
@@ -191,7 +191,7 @@
\ No newline at end of file
diff --git a/im-uniapp/components/group-rtc-join/group-rtc-join.vue b/im-uniapp/components/group-rtc-join/group-rtc-join.vue
new file mode 100644
index 0000000..0c0081f
--- /dev/null
+++ b/im-uniapp/components/group-rtc-join/group-rtc-join.vue
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
{{rtcInfo.userInfos.length+'人正在通话中'}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/im-uniapp/hybrid/html/rtc-group/index.html b/im-uniapp/hybrid/html/rtc-group/index.html
new file mode 100644
index 0000000..be64c86
--- /dev/null
+++ b/im-uniapp/hybrid/html/rtc-group/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
语音通话
+
+
+
音视频通话为付费功能,有需要请联系作者...
+
+
\ No newline at end of file
diff --git a/im-uniapp/hybrid/html/index.html b/im-uniapp/hybrid/html/rtc-private/index.html
similarity index 100%
rename from im-uniapp/hybrid/html/index.html
rename to im-uniapp/hybrid/html/rtc-private/index.html
diff --git a/im-uniapp/pages.json b/im-uniapp/pages.json
index 520b23c..c540831 100644
--- a/im-uniapp/pages.json
+++ b/im-uniapp/pages.json
@@ -17,7 +17,9 @@
}, {
"path": "pages/chat/chat-box"
},{
- "path": "pages/chat/chat-video"
+ "path": "pages/chat/chat-private-video"
+ },{
+ "path": "pages/chat/chat-group-video"
}, {
"path": "pages/friend/friend-add"
}, {
diff --git a/im-uniapp/pages/chat/chat-box.vue b/im-uniapp/pages/chat/chat-box.vue
index 08702a6..765b9b2 100644
--- a/im-uniapp/pages/chat/chat-box.vue
+++ b/im-uniapp/pages/chat/chat-box.vue
@@ -6,14 +6,13 @@
-
+
-
+
@@ -31,7 +30,7 @@
-
+
+
+
+
+
@@ -130,11 +139,11 @@
methods: {
onRecorderInput() {
this.showRecord = true;
- this.switchChatTabBox('none',true);
+ this.switchChatTabBox('none', true);
},
onKeyboardInput() {
this.showRecord = false;
- this.switchChatTabBox('none',false);
+ this.switchChatTabBox('none', false);
},
onSendRecord(data) {
let msgInfo = {
@@ -161,26 +170,66 @@
// 滚动到底部
this.scrollToBottom();
this.isReceipt = false;
-
+
})
},
onRtCall(msgInfo) {
if (msgInfo.type == this.$enums.MESSAGE_TYPE.RT_VOICE) {
- this.onVoiceCall();
+ this.onPriviteVoice();
} else if (msgInfo.type == this.$enums.MESSAGE_TYPE.RT_VIDEO) {
- this.onVideoCall();
+ this.onPriviteVideo();
}
},
- onVideoCall() {
+ onPriviteVideo() {
const friendInfo = encodeURIComponent(JSON.stringify(this.friend));
uni.navigateTo({
- url: `/pages/chat/chat-video?mode=video&friend=${friendInfo}&isHost=true`
+ url: `/pages/chat/chat-private-video?mode=video&friend=${friendInfo}&isHost=true`
})
},
- onVoiceCall() {
+ onPriviteVoice() {
const friendInfo = encodeURIComponent(JSON.stringify(this.friend));
uni.navigateTo({
- url: `/pages/chat/chat-video?mode=voice&friend=${friendInfo}&isHost=true`
+ url: `/pages/chat/chat-private-video?mode=voice&friend=${friendInfo}&isHost=true`
+ })
+ },
+ onGroupVideo() {
+ this.$http({
+ url: "/webrtc/group/info?groupId="+this.group.id,
+ method: 'GET'
+ }).then((rtcInfo)=>{
+ if(rtcInfo.isChating){
+ // 已在通话中,可以直接加入通话
+ this.$refs.rtcJoin.open(rtcInfo);
+ }else {
+ // 邀请成员发起通话
+ let ids = [this.mine.id];
+ this.$refs.selBox.init(ids, ids);
+ this.$refs.selBox.open();
+ }
+ })
+ },
+ onInviteOk(ids) {
+ if(ids.length < 2){
+ return;
+ }
+ let users = [];
+ ids.forEach(id => {
+ let m = this.groupMembers.find(m => m.userId == id);
+ // 只取部分字段,压缩url长度
+ users.push({
+ id: m.userId,
+ nickName: m.aliasName,
+ headImage: m.headImage,
+ isCamera: false,
+ isMicroPhone: true
+ })
+ })
+ const groupId = this.group.id;
+ const inviterId = this.mine.id;
+ const userInfos = encodeURIComponent(JSON.stringify(users));
+ uni.navigateTo({
+ url: `/pages/chat/chat-group-video?groupId=${groupId}&isHost=true
+ &inviterId=${inviterId}&userInfos=${userInfos}`
})
},
moveChatToTop() {
@@ -302,13 +351,13 @@
});
},
- onShowEmoChatTab(){
+ onShowEmoChatTab() {
this.showRecord = false;
- this.switchChatTabBox('emo',true)
+ this.switchChatTabBox('emo', true)
},
- onShowToolsChatTab(){
+ onShowToolsChatTab() {
this.showRecord = false;
- this.switchChatTabBox('tools',true)
+ this.switchChatTabBox('tools', true)
},
switchChatTabBox(chatTabBox, hideKeyBoard) {
this.chatTabBox = chatTabBox;
@@ -496,11 +545,11 @@
});
},
onScrollToTop() {
- if(this.showMinIdx==0){
+ if (this.showMinIdx == 0) {
console.log("消息已滚动到顶部")
return;
}
-
+
// #ifndef H5
// 防止滚动条定格在顶部,不能一直往上滚
this.scrollToMsgIdx(this.showMinIdx);
@@ -541,7 +590,8 @@
});
},
readedMessage() {
- if(this.unreadCount == 0){
+ console.log("readedMessage")
+ if (this.unreadCount == 0) {
return;
}
let url = ""
@@ -718,7 +768,6 @@
}
}
-
.chat-msg {
flex: 1;
padding: 0;
diff --git a/im-uniapp/pages/chat/chat-group-video.vue b/im-uniapp/pages/chat/chat-group-video.vue
new file mode 100644
index 0000000..de42480
--- /dev/null
+++ b/im-uniapp/pages/chat/chat-group-video.vue
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/im-uniapp/pages/chat/chat-video.vue b/im-uniapp/pages/chat/chat-private-video.vue
similarity index 89%
rename from im-uniapp/pages/chat/chat-video.vue
rename to im-uniapp/pages/chat/chat-private-video.vue
index ab8b2e7..afb405b 100644
--- a/im-uniapp/pages/chat/chat-video.vue
+++ b/im-uniapp/pages/chat/chat-private-video.vue
@@ -1,6 +1,6 @@
-
-
+
+
@@ -72,20 +72,21 @@
// #endif
},
initUrl(){
- this.url = "/hybrid/html/index.html";
+ this.url = "/hybrid/html/rtc-private/index.html";
this.url += "?mode="+this.mode;
this.url += "&isHost="+this.isHost;
this.url += "&baseUrl="+UNI_APP.BASE_URL;
this.url += "&loginInfo="+JSON.stringify(uni.getStorageSync("loginInfo"));
this.url += "&userInfo="+JSON.stringify(this.$store.state.userStore.userInfo);
this.url += "&friend="+JSON.stringify(this.friend);
+ this.url += "&config=" + JSON.stringify(this.$store.state.configStore.webrtc);
},
},
onBackPress() {
this.sendMessageToWebView("NAV_BACK",{})
},
onLoad(options) {
- uni.$on('WS_RTC', msg => {
+ uni.$on('WS_RTC_PRIVATE', msg => {
// 推送给web-view处理
this.sendMessageToWebView("RTC_MESSAGE", msg);
})
@@ -104,7 +105,7 @@
this.initUrl();
},
onUnload() {
- uni.$off('WS_RTC')
+ uni.$off('WS_RTC_PRIVATE')
}
}
diff --git a/im-uniapp/ssl/cert.crt b/im-uniapp/ssl/cert.crt
new file mode 100644
index 0000000..12f90bf
--- /dev/null
+++ b/im-uniapp/ssl/cert.crt
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDIjCCAgoCCQCw2aUcFWVX4jANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJj
+bjEMMAoGA1UECAwDZ3oIMQswCQYDVQQHDAJnejEcMBoGA1UECgwTRGVmYXVsdCBD
+b21wYW55IEx0ZDELMAkGA1UEAwwCYngwHhcNMjQwNDI4MTQzNTIzWhcNMzQwNDI2
+MTQzNTIzWjBTMQswCQYDVQQGEwJjbjEMMAoGA1UECAwDZ3oIMQswCQYDVQQHDAJn
+ejEcMBoGA1UECgwTRGVmYXVsdCBDb21wYW55IEx0ZDELMAkGA1UEAwwCYngwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDqZXvAXwH0xA5TSposclmZXxox
+pfT5F0eSOaxRE2NFfUbHoCrCHYV8pPAIy9S6vbG5Bbh4eprv4smH4lHWfa+81nI8
+sKizmJ3jdFSzCRrIHzbdlQsY0Vg+VasyoWjyjVDJeDzz/G/vQUeb19+kXlHVDETt
+J7sZEqNyDxewsiDBUf2f+fvsgtIWakuD7CGe/P9e6gHz0D++GezOUKgUtL3eUkCa
+pI8+ecoAG1ud/3MtRvGyq9FwwsQwsscu1YVmt7fRhuGbcM3/bog1VXe/to/msKUC
+gCZjWS82D9sw0ikEAn7jagKJu1ezybmN9/JljhpC8UgZnqPT01LzfFvDECN7AgMB
+AAEwDQYJKoZIhvcNAQELBQADggEBAMnjP0ANnPSTbwSCufVXwJgX5tWcSGjezFAY
+Du+rbdUipn2O4/NCkTTPpDbrDKRET2zDUrxJOXu/UZBS8lreowtUQCk8lX7kH5oj
+72lmcOFgWUyk8ULTPzrl0sdaQ8mhsvf+vHO9Ww/+RqQlzlr+eMuamMm1wDrbczWK
+z1tq2QQuIhxf1pIznHag5eWui6Z0RIRQaozbXWU6VuSf703CNixxdZsdNWHpdiJW
+vj8LewFaSmGp6HzwMX6/Kx/kocqpeeCZ6CharePv2C5bC5Kd5KVFCHnp5xbcZKUq
+8Q7CSH5WKV3QkoFKGPz1qh17qeryxgoqLQXLapptNKOS76QBivM=
+-----END CERTIFICATE-----
diff --git a/im-uniapp/ssl/cert.key b/im-uniapp/ssl/cert.key
new file mode 100644
index 0000000..ec189b5
--- /dev/null
+++ b/im-uniapp/ssl/cert.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEA6mV7wF8B9MQOU0qaLHJZmV8aMaX0+RdHkjmsURNjRX1Gx6Aq
+wh2FfKTwCMvUur2xuQW4eHqa7+LJh+JR1n2vvNZyPLCos5id43RUswkayB823ZUL
+GNFYPlWrMqFo8o1QyXg88/xv70FHm9ffpF5R1QxE7Se7GRKjcg8XsLIgwVH9n/n7
+7ILSFmpLg+whnvz/XuoB89A/vhnszlCoFLS93lJAmqSPPnnKABtbnf9zLUbxsqvR
+cMLEMLLHLtWFZre30Ybhm3DN/26INVV3v7aP5rClAoAmY1kvNg/bMNIpBAJ+42oC
+ibtXs8m5jffyZY4aQvFIGZ6j09NS83xbwxAjewIDAQABAoIBAQC8uyPunFE15Rrn
+w9zpxtUQIjw0F71tR2pQefGegm7fR+TS3csv65dM6n1/h6ftCMpuAQYstAPG/aNp
+rzhX7XGwKjdnWJMtsMgImeWNFtqiokeKGPULcZyM7GvhY4feLR0Ma60gg3UZf0WK
+XUJs1aksUym4jtIeeRxzvWVE19h57uEG1fJM3Rf0OFhb1iUYVjtW4iW+RTtc1mpb
+hoda+8P3Tua33WuhSYtFusDx35ZM2WDgYlgeMxm94JUFUUOIhiggasYNsu1YmQl4
+AqhRncGn6p/gZVQsjkeCtmTIyD+igqulI/OkqI3DmFCzFSoSXLFE7HZ4pL500Vxn
+aOvOYRCZAoGBAP1Aopr0scpLzt7Lei+dbLc3wxziCyeNtVDvswFS93Lx1bnSJw4m
+0PAvQGoOdeiPI1vmsdDJdV5R0Vmbybyz7JPiTyUyti4p909s5AtpPqdLptjuO2ge
+2b1YD/HnubL0omlejKu5fKg3zaPqhr/Z8f6WfYSsm1dV10arSBj4JdvVAoGBAOzw
+epHXXnAfaC/cEOUOOVe5o/MNxIYYfJkG6VtmB3v+oY0/C+SyUbkY3Qu5yjCDBYhP
+rLVr1+TiLE3Sqj+ndRvICy8T6Iv+hA2ijvJiNVAjtqkwM5YOMJdFYI6fem1N+Hkv
+ipOQUWFmwUBAKQm4BSGtNdbL89KTTV1tMubH4joPAoGBANRGmkWSd3gepO8A1ZEV
+vmuw1N3f5wOnd2S5Fm00su9pIAGa0lu9U4MPyEldh52AZV4B9+gPBU8i+3zF5YpD
+sjifCEIgyK3XRVIQ7vFVrUujUN4iii8TNOXN68eTuYb0ITJ7KyRB3OhPphIQYhRr
+xbjlQZ6045yH+mNk7JDpZyplAoGAVF4sxtGRZwtH5gLOYUF3Wa1Ym6tDVxxRAYxc
+e5cRAy3gCJNygLSeNPKNgydcv3ln9umn7dHAxldivzNMO+483O+WS+Ui4PZ3vwMr
+M1OU+Dw/Rm9LbxsOYk7p2t8ekN06pKwxA+pXj/8uwNoXwsYrzZoHmbx1zX12BtZj
+UZnLDDECgYBpvFK+cntSzE+qpsvxYnosSswcJvmGoOzBCE2aWebwXp0QOwjg/Zh/
+VR5Mc8L8xHpcpUJZXaTmyeouwc2XPfBvvbWlGZFh7zBn2dKCNxT62fPXKFX2rBgE
+k4f033ToXD6Lv0JT94JfjS0GB+zzHjfcS/K8Lr3d3lUmkiI1LFD5GA==
+-----END RSA PRIVATE KEY-----
diff --git a/im-uniapp/store/chatStore.js b/im-uniapp/store/chatStore.js
index 75950af..5356df3 100644
--- a/im-uniapp/store/chatStore.js
+++ b/im-uniapp/store/chatStore.js
@@ -51,7 +51,6 @@ export default {
}
})
})
- console.log(cacheChats.length)
},
openChat(state, chatInfo) {
let chats = this.getters.findChats();
@@ -295,7 +294,6 @@ export default {
});
// 将消息一次性装载回来
state.chats = cacheChats;
- console.log(cacheChats.length)
this.commit("saveToStorage");
},
saveToStorage(state) {
diff --git a/im-uniapp/store/configStore.js b/im-uniapp/store/configStore.js
new file mode 100644
index 0000000..ba289c2
--- /dev/null
+++ b/im-uniapp/store/configStore.js
@@ -0,0 +1,32 @@
+import http from '../common/request'
+
+export default {
+ state: {
+ webrtc: {}
+ },
+ mutations: {
+ setConfig(state, config) {
+ state.webrtc = config.webrtc;
+ },
+ clear(state){
+ state.webrtc = {};
+ }
+ },
+ actions:{
+ loadConfig(context){
+ return new Promise((resolve, reject) => {
+ http({
+ url: '/system/config',
+ method: 'GET'
+ }).then((config) => {
+ console.log("系统配置",config)
+ context.commit("setConfig",config);
+ resolve();
+ }).catch((res)=>{
+ reject(res);
+ });
+ })
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/im-uniapp/store/index.js b/im-uniapp/store/index.js
index 34db94b..fa52aac 100644
--- a/im-uniapp/store/index.js
+++ b/im-uniapp/store/index.js
@@ -2,15 +2,16 @@ import chatStore from './chatStore.js';
import friendStore from './friendStore.js';
import userStore from './userStore.js';
import groupStore from './groupStore.js';
-import {
- createStore
-} from 'vuex';
+import configStore from './configStore.js';
+import { createStore } from 'vuex';
+
const store = createStore({
modules: {
chatStore,
friendStore,
userStore,
- groupStore
+ groupStore,
+ configStore
},
state: {},
actions: {
@@ -20,6 +21,7 @@ const store = createStore({
promises.push(this.dispatch("loadFriend"));
promises.push(this.dispatch("loadGroup"));
promises.push(this.dispatch("loadChat"));
+ promises.push(this.dispatch("loadConfig"));
return Promise.all(promises);
})
},
diff --git a/im-uniapp/store/userStore.js b/im-uniapp/store/userStore.js
index 42056e5..a2e5a5a 100644
--- a/im-uniapp/store/userStore.js
+++ b/im-uniapp/store/userStore.js
@@ -5,6 +5,9 @@ import http from '../common/request'
export default {
state: {
userInfo: {},
+ config:{
+ webrtc:{}
+ },
state: USER_STATE.FREE
},
diff --git a/im-uniapp/vite.config.js b/im-uniapp/vite.config.js
index 0c46ed6..c866fc9 100644
--- a/im-uniapp/vite.config.js
+++ b/im-uniapp/vite.config.js
@@ -1,6 +1,7 @@
import { defineConfig } from "vite"
import uni from "@dcloudio/vite-plugin-uni";
-
+const path = require('path')
+const fs = require('fs')
export default defineConfig({
plugins: [
uni()
@@ -14,6 +15,11 @@ export default defineConfig({
changeOrigin: true
},
- }
+ },
+ // 音视频功能需要ssl证书,如需调试请打开注释
+ // https: {
+ // cert: fs.readFileSync(path.join(__dirname, 'ssl/cert.crt')),
+ // key: fs.readFileSync(path.join(__dirname, 'ssl/cert.key'))
+ // }
}
})
\ No newline at end of file
diff --git a/截图/交流群2.png b/截图/交流群2.png
new file mode 100644
index 0000000..45896ee
Binary files /dev/null and b/截图/交流群2.png differ