|
@@ -4,7 +4,7 @@
|
|
<div class="members"></div>
|
|
<div class="members"></div>
|
|
<span>{{ user_list.length }}观看</span>
|
|
<span>{{ user_list.length }}观看</span>
|
|
</div>
|
|
</div>
|
|
- <!-- <chat ref="chat" v-show="chatShow" :chatList="chatList" :user_info="user_info"></chat> -->
|
|
|
|
|
|
+ <chat ref="chat$" v-show="chatShow" :chatList="chatList" :user_info="user_info"></chat>
|
|
<div class="videoBox userVideo" id="userVideo" v-show="!hideVideoTop">
|
|
<div class="videoBox userVideo" id="userVideo" v-show="!hideVideoTop">
|
|
<img v-if="!userVideoShow" :src="require('@/assets/images/rtcLive/avatar_small@2x.png')" alt="" />
|
|
<img v-if="!userVideoShow" :src="require('@/assets/images/rtcLive/avatar_small@2x.png')" alt="" />
|
|
<img v-if="!userVideoShow" class="loadingTip" :src="require('@/assets/images/rtcLive/loading@2x.png')" alt="" />
|
|
<img v-if="!userVideoShow" class="loadingTip" :src="require('@/assets/images/rtcLive/loading@2x.png')" alt="" />
|
|
@@ -24,11 +24,11 @@
|
|
<!-- </div> -->
|
|
<!-- </div> -->
|
|
<!-- <input type="text" autocomplete="off"> -->
|
|
<!-- <input type="text" autocomplete="off"> -->
|
|
<div class="contorlBar" v-if="!showInput">
|
|
<div class="contorlBar" v-if="!showInput">
|
|
- <div v-if="connectStatus == 1" :class="{ disable: !user_info.isWords }" class="saySomething" @click="onFocus">
|
|
|
|
|
|
+ <div v-if="connectStatus == 1" :class="{ disabled: user_info.isWords }" class="saySomething" @click="onFocus">
|
|
<!-- <i class="speakIcon"
|
|
<!-- <i class="speakIcon"
|
|
:class="{'dis':!user_info.isWords}"></i> -->
|
|
:class="{'dis':!user_info.isWords}"></i> -->
|
|
- <span v-if="user_info.isWords"> 说点什么 </span>
|
|
|
|
- <span v-if="!user_info.isWords">已被禁言</span>
|
|
|
|
|
|
+ <span v-if="!user_info.isWords"> 说点什么 </span>
|
|
|
|
+ <span v-if="user_info.isWords">已被禁言</span>
|
|
|
|
|
|
<div class="disSpeakBtn" @click.stop="chatShow = !chatShow" :class="{ dis: !chatShow }"></div>
|
|
<div class="disSpeakBtn" @click.stop="chatShow = !chatShow" :class="{ dis: !chatShow }"></div>
|
|
</div>
|
|
</div>
|
|
@@ -91,12 +91,12 @@
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
- <div v-show="user_info.UserId != i.UserId && i.role != 'leader'" class="memberItem" v-for="i in user_list" :key="i.UserId">
|
|
|
|
|
|
+ <div v-show="user_info.UserId != i.UserId && i.Role != 'leader'" class="memberItem" v-for="i in user_list" :key="i.UserId">
|
|
<div class="userMsg">
|
|
<div class="userMsg">
|
|
<div class="avatar">
|
|
<div class="avatar">
|
|
<img :src="require('@/assets/images/rtcLive/avatar_small@2x.png')" alt="" />
|
|
<img :src="require('@/assets/images/rtcLive/avatar_small@2x.png')" alt="" />
|
|
</div>
|
|
</div>
|
|
- <div class="name">{{ i.userName }}</div>
|
|
|
|
|
|
+ <div class="name">{{ i.Nickname }}</div>
|
|
</div>
|
|
</div>
|
|
<div class="button" v-if="user_info.Role == 'leader'">
|
|
<div class="button" v-if="user_info.Role == 'leader'">
|
|
<div class="micBtn" :class="i.isWords ? 'ban_speak_on' : 'ban_speak_off'" @click="userCanSpeak(i)"></div>
|
|
<div class="micBtn" :class="i.isWords ? 'ban_speak_on' : 'ban_speak_off'" @click="userCanSpeak(i)"></div>
|
|
@@ -109,8 +109,6 @@
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
-
|
|
|
|
- <Draw ref="draw" @sendCanUndo="sendCanUndo" :show-paint="showPaint" />
|
|
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
@@ -121,15 +119,21 @@ import { useStore } from "vuex";
|
|
import { Scrollbar, Dialog } from "@/global_components/";
|
|
import { Scrollbar, Dialog } from "@/global_components/";
|
|
import common from "@/utils/common";
|
|
import common from "@/utils/common";
|
|
|
|
|
|
-// import Draw from './paint/Draw';
|
|
|
|
import { mapGetters } from "vuex";
|
|
import { mapGetters } from "vuex";
|
|
-// import chat from './chat/chat.vue';
|
|
|
|
|
|
+import chat from "./chat/chat.vue";
|
|
import browser from "@/utils/browser";
|
|
import browser from "@/utils/browser";
|
|
|
|
|
|
const emit = defineEmits(["openDialog"]);
|
|
const emit = defineEmits(["openDialog"]);
|
|
|
|
|
|
const store = useStore();
|
|
const store = useStore();
|
|
|
|
|
|
|
|
+let chatAutoScroll = () => {
|
|
|
|
+ let el = document.getElementById("chat");
|
|
|
|
+ let client_h = document.getElementById("chat").clientHeight;
|
|
|
|
+ let all = document.getElementById("contents").clientHeight;
|
|
|
|
+ el.scrollTo(0, client_h + all);
|
|
|
|
+};
|
|
|
|
+
|
|
let createSocket = (config) => {
|
|
let createSocket = (config) => {
|
|
var socket = io("https://vr-admin.cdfmembers.com/", {
|
|
var socket = io("https://vr-admin.cdfmembers.com/", {
|
|
path: "/ws-sync",
|
|
path: "/ws-sync",
|
|
@@ -168,6 +172,7 @@ const user_info = ref({});
|
|
const user_list = ref([]);
|
|
const user_list = ref([]);
|
|
const mode = ref(browser.getURLParam("mode"));
|
|
const mode = ref(browser.getURLParam("mode"));
|
|
const role = ref(browser.getURLParam("role"));
|
|
const role = ref(browser.getURLParam("role"));
|
|
|
|
+const isJoined = ref(false);
|
|
|
|
|
|
const chatList = ref([]);
|
|
const chatList = ref([]);
|
|
const text = ref("");
|
|
const text = ref("");
|
|
@@ -180,8 +185,25 @@ const disableMic = ref(false);
|
|
const chatShow = ref(true);
|
|
const chatShow = ref(true);
|
|
const all_mute_mic = ref(true);
|
|
const all_mute_mic = ref(true);
|
|
|
|
|
|
|
|
+const chat$ = ref(null);
|
|
|
|
+
|
|
const onDrawUndo = () => {};
|
|
const onDrawUndo = () => {};
|
|
|
|
+const onDraw = async () => {
|
|
|
|
+ isBrushes.value = !isBrushes.value;
|
|
|
|
+ if (isBrushes.value) {
|
|
|
|
+ await getApp().Connect.paint.show({ role:role.value, paint: role.value == "leader" ? true : false });
|
|
|
|
+ if (role.value == "leader") {
|
|
|
|
+ socket.value.emit("action", { type: "user-paint", open: true });
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ await getApp().Connect.paint.hide()
|
|
|
|
+ if (role.value == "leader") {
|
|
|
|
+ socket.value.emit("action", { type: "user-paint", open: false });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
|
|
|
|
+//打开输入框
|
|
const onFocus = () => {
|
|
const onFocus = () => {
|
|
showInput.value = true;
|
|
showInput.value = true;
|
|
nextTick(() => {
|
|
nextTick(() => {
|
|
@@ -190,6 +212,47 @@ const onFocus = () => {
|
|
});
|
|
});
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+//发弹幕
|
|
|
|
+const sendText = async () => {
|
|
|
|
+ if (text.value == "") {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ let data = {
|
|
|
|
+ role: role.value,
|
|
|
|
+ mode: mode.value,
|
|
|
|
+ Nickname: user_info.value.Nickname,
|
|
|
|
+ userId: user_info.value.userId,
|
|
|
|
+ text: text.value,
|
|
|
|
+ };
|
|
|
|
+ socket.value &&
|
|
|
|
+ socket.value.emit("action", {
|
|
|
|
+ type: "danmumsg",
|
|
|
|
+ data,
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ chatList.value.push(data);
|
|
|
|
+ await nextTick();
|
|
|
|
+ try {
|
|
|
|
+ chatAutoScroll();
|
|
|
|
+ let input_msg = document.getElementById("input_msg");
|
|
|
|
+ input_msg.blur();
|
|
|
|
+ } catch (error) {}
|
|
|
|
+ closeInput();
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+//接收消息
|
|
|
|
+const setReceiveMsg = async (res) => {
|
|
|
|
+ console.log(res);
|
|
|
|
+ if (res.role == "leader") {
|
|
|
|
+ res.Nickname = "主持人";
|
|
|
|
+ }
|
|
|
|
+ chatList.value.push(res);
|
|
|
|
+ await nextTick();
|
|
|
|
+ try {
|
|
|
|
+ chatAutoScroll();
|
|
|
|
+ } catch (error) {}
|
|
|
|
+};
|
|
|
|
+
|
|
// 关闭输入框
|
|
// 关闭输入框
|
|
const closeInput = () => {
|
|
const closeInput = () => {
|
|
showInput.value = false;
|
|
showInput.value = false;
|
|
@@ -211,7 +274,6 @@ const closeMember = () => {
|
|
};
|
|
};
|
|
|
|
|
|
const openDialog = (str, link) => {
|
|
const openDialog = (str, link) => {
|
|
- // getApp().Connect.follow.start();
|
|
|
|
emit("openDialog", str, link);
|
|
emit("openDialog", str, link);
|
|
};
|
|
};
|
|
|
|
|
|
@@ -228,25 +290,26 @@ const userCanSpeak = (item) => {
|
|
};
|
|
};
|
|
|
|
|
|
const startFollow = (app) => {
|
|
const startFollow = (app) => {
|
|
- var isJoined = false;
|
|
|
|
|
|
+ app.Connect.follow.start({ follow: role.value == "customer" });
|
|
|
|
|
|
socket.value.on("connect", () => {
|
|
socket.value.on("connect", () => {
|
|
socket.value.emit("join", {
|
|
socket.value.emit("join", {
|
|
userId: browser.getURLParam("userId") || common.uuid(12),
|
|
userId: browser.getURLParam("userId") || common.uuid(12),
|
|
roomId: browser.getURLParam("roomId") || common.uuid(12),
|
|
roomId: browser.getURLParam("roomId") || common.uuid(12),
|
|
- role: role.val || "leader",
|
|
|
|
|
|
+ role: role.value || "leader",
|
|
|
|
+ nickname: browser.getURLParam("name") || common.uuid(12),
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
// 加入房间成功
|
|
// 加入房间成功
|
|
socket.value.on("join", (data) => {
|
|
socket.value.on("join", (data) => {
|
|
connectStatus.value = 1;
|
|
connectStatus.value = 1;
|
|
- console.log(data,'join');
|
|
|
|
|
|
+
|
|
|
|
+ socket.value.emit("action", { type: "user-init" });
|
|
|
|
+
|
|
user_info.value = data.user;
|
|
user_info.value = data.user;
|
|
user_list.value = data.members;
|
|
user_list.value = data.members;
|
|
|
|
|
|
- console.log(user_info.value, "user_info");
|
|
|
|
-
|
|
|
|
//更新分享链接
|
|
//更新分享链接
|
|
shareLink.value = getUrl(window.location.href, [
|
|
shareLink.value = getUrl(window.location.href, [
|
|
{
|
|
{
|
|
@@ -258,6 +321,10 @@ const startFollow = (app) => {
|
|
val: "",
|
|
val: "",
|
|
},
|
|
},
|
|
{
|
|
{
|
|
|
|
+ key: "userId",
|
|
|
|
+ val: "",
|
|
|
|
+ },
|
|
|
|
+ {
|
|
key: "role",
|
|
key: "role",
|
|
val: "customer",
|
|
val: "customer",
|
|
},
|
|
},
|
|
@@ -291,24 +358,47 @@ const startFollow = (app) => {
|
|
|
|
|
|
history.replaceState(null, null, tmp);
|
|
history.replaceState(null, null, tmp);
|
|
|
|
|
|
- isJoined = true;
|
|
|
|
|
|
+ isJoined.value = true;
|
|
});
|
|
});
|
|
|
|
|
|
socket.value.on("action", (data) => {
|
|
socket.value.on("action", (data) => {
|
|
if (data.type == "error") {
|
|
if (data.type == "error") {
|
|
Dialog.toast({ content: `房间未找到`, type: "error" });
|
|
Dialog.toast({ content: `房间未找到`, type: "error" });
|
|
- } else if (data.type == "user-join") {
|
|
|
|
|
|
+ } else if (data.type == "danmumsg") {
|
|
|
|
+ setReceiveMsg(data.data);
|
|
|
|
+ } else if (data.type == "user-init") {
|
|
|
|
+ app.Connect.follow.sync();
|
|
|
|
+ } else if (data.type == "user-paint") {
|
|
|
|
+ // canUndo.value = data.open
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
|
|
+ // 同屏带看
|
|
socket.value.on("sync", (data) => {
|
|
socket.value.on("sync", (data) => {
|
|
app.Connect.sync.receive(data);
|
|
app.Connect.sync.receive(data);
|
|
});
|
|
});
|
|
|
|
+
|
|
|
|
+ // 画笔
|
|
|
|
+ socket.value.on("paint", (data) => {
|
|
|
|
+ console.log(data,'paint');
|
|
|
|
+ app.Connect.sync.receive(data);
|
|
|
|
+ });
|
|
};
|
|
};
|
|
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
useApp().then((app) => {
|
|
useApp().then((app) => {
|
|
startFollow(app);
|
|
startFollow(app);
|
|
|
|
+ app.Connect.follow.on("data", (data) => {
|
|
|
|
+ if (isJoined.value) {
|
|
|
|
+ socket.value.emit("sync", data);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ console.log(app.Connect.paint);
|
|
|
|
+ app.Connect.paint.on("data", (data) => {
|
|
|
|
+ if (isJoined.value) {
|
|
|
|
+ socket.value.emit("paint", data);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
});
|
|
});
|
|
});
|
|
});
|
|
</script>
|
|
</script>
|