tremble hace 3 años
padre
commit
035d5ef983
Se han modificado 4 ficheros con 104 adiciones y 46 borrados
  1. 28 20
      src/app.vue
  2. 49 19
      src/components/RTC/PageRtcLive.vue
  3. 4 4
      src/components/RTC/Trtccom.vue
  4. 23 3
      src/components/RTC/index.vue

+ 28 - 20
src/app.vue

@@ -9,18 +9,18 @@
       <Information v-if="!isshoppingguide" />
       <Control />
       <teleport v-if="refMiniMap && player.showWidgets" :to="refMiniMap">
-        <span :class="{ gudieDisabled: isshoppingguide && role.value != 'leader' }" class="button-switch" @click.stop="toggleMap">
+        <span :class="{ gudieDisabled: isshoppingguide && role != 'leader' }" class="button-switch" @click.stop="toggleMap">
           <ui-icon type="show_map_collect"></ui-icon>
         </span>
 
-        <p class="change" :class="{ gudieDisabled: isshoppingguide && role.value != 'leader' }" @click="changeMode('dollhouse', $event, 'focus3d')">
+        <p class="change" :class="{ gudieDisabled: isshoppingguide && role != 'leader' }" @click="changeMode('dollhouse', $event, 'focus3d')">
           <ui-icon type="show_3d_normal"></ui-icon>
           3D模型
         </p>
       </teleport>
       <template v-if="refMiniMap && player.showWidgets">
         <div
-          :class="{ disabled: flying, gudieDisabled: isshoppingguide && role.value != 'leader' }"
+          :class="{ disabled: flying, gudieDisabled: isshoppingguide && role != 'leader' }"
           v-show="mode != 'panorama'"
           v-if="controls.showFloorplan && controls.showDollhouse"
           class="tab-layer"
@@ -104,6 +104,7 @@ let app = null;
 
 let tagid = browser.getURLParam("tagid");
 const role = ref(browser.getURLParam("role"));
+const userName = ref(browser.getURLParam("name"));
 
 const closetagtype = () => {
   store.commit("tag/setTagClickType", {
@@ -170,9 +171,11 @@ const resize = () => {
 watch(
   () => isshoppingguide.value,
   (val, old) => {
+
     let $minmap = document.querySelector("[xui_min_map]");
     if ($minmap) {
       setTimeout(async () => {
+      
         if (role.value == "leader") {
           return;
         }
@@ -257,12 +260,13 @@ const onClickTagInfo = (el) => {
   el.stopPropagation();
   let item = tags.value.find((item) => item.sid == el.target.dataset.id);
   if (item.type == "commodity") {
+    guideclicktag(item);
     store.commit("tag/setTagClickType", {
       type: "goodlist",
       data: item,
     });
-    guideclicktag(item);
   } else if (item.type == "link_scene") {
+    guideclicktag(item);
     let sceneFirstView = item.hotContent.sceneFirstView;
     window.location.href = jumpNewScene(sceneFirstView);
   }
@@ -290,7 +294,7 @@ onMounted(async () => {
     dom: scene$.value,
     mobile: true,
     isLoadTags: false,
-    sceneKind:'tiles',
+    sceneKind: "tiles",
     scene: {
       markerOpacity: 1,
       markerURL: "https://eurs3.4dkankan.com/cdf/file/43aa29799bfd472298a47cc6370b10cc.png",
@@ -374,8 +378,10 @@ onMounted(async () => {
               );
             } catch (error) {}
           } else if (tag.type == "link_scene") {
+            guideclicktag(tag);
             let sceneFirstView = tag.hotContent.sceneFirstView;
             window.location.href = jumpNewScene(sceneFirstView);
+
           }
         });
       });
@@ -411,21 +417,7 @@ onMounted(async () => {
   // }
   app.Scene.on("ready", () => {
     show.value = true;
-    if (!localStorage.getItem("user_guide")) {
-      Dialog.confirm({
-        showCloseIcon: false,
-        okText: "我知道了",
-        content:
-          "<span style='font-size: 16px; line-height: 1.5;'>開發者已遵守收集、使用最終用戶個人信息有關的所有可適用法律、政策和法規,保護用戶個人信息安全。<span/>",
-        title: "隱私條款:",
-        single:true,
-        func: (state) => {
-          if (state == "ok") {
-            localStorage.setItem("user_guide", Date.now());
-          }
-        },
-      });
-    }
+
   });
   app.Scene.on("error", (data) => {
     switch (data.code) {
@@ -450,6 +442,22 @@ onMounted(async () => {
 
     if (browser.getURLParam("roomId")) {
       store.commit("showShoppingguide", true);
+    }else{
+          if (!localStorage.getItem("user_guide")) {
+            Dialog.confirm({
+              showCloseIcon: false,
+              okText: "我知道了",
+              content:
+                "<span style='font-size: 16px; line-height: 1.5;'>開發者已遵守收集、使用最終用戶個人信息有關的所有可適用法律、政策和法規,保護用戶個人信息安全。<span/>",
+              title: "隱私條款:",
+              single: true,
+              func: (state) => {
+                if (state == "ok") {
+                  localStorage.setItem("user_guide", Date.now());
+                }
+              },
+            });
+          }
     }
 
     app.resource.tags(`${process.env.VUE_APP_RESOURCE_URL}cdf/hot/${browser.getURLParam("m")}/hot.json?rnd=${Math.random()}`);

+ 49 - 19
src/components/RTC/PageRtcLive.vue

@@ -12,7 +12,7 @@
       <div v-if="connectStatus == 1" :class="{ disabled: !user_info.IsWords }" class="saySomething" @click="onFocus">
         <!-- <i class="speakIcon"
            :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>
 
         <div class="disSpeakBtn" @click.stop="chatShow = !chatShow" :class="{ dis: !chatShow }"></div>
@@ -24,8 +24,8 @@
 
         <div v-if="user_list.length < 5" class="invitation" @click="openDialog('dialogShare', shareLink)"></div>
         <div v-if="role == 'leader'" class="members" @click="openMember"></div>
-        <div v-if="!disableMic" @click="handleMuteAduio" :class="{ mic_off: audioMuted }" class="mic_on"></div>
-        <div v-if="disableMic" class="mic_no"></div>
+        <div v-if="!disableMic" @click="handleMuteAduio" :class="{ mic_off: audioMuted, disabled: !audioDeviceId }" class="mic_on"></div>
+        <div v-if="disableMic" class="mic_no" :class="{ disabled: !audioDeviceId }"></div>
         <div v-if="role == 'leader'" @click="handleMuteVideo" :class="[videoMuted ? 'video_no' : 'video_on', videoDeviceId ? '' : 'disabled']"></div>
         <div class="exit" @click="openDialog('dialogIndex')"></div>
       </div>
@@ -33,7 +33,7 @@
     <div class="layer" v-if="showInput" @click="closeInput">
       <div class="inputBox" @click.stop>
         <div class="msgBox">
-          <input id="input_msg" type="text" maxlength="200" v-model.trim="text" :placeholder="`說點什~`" />
+          <input id="input_msg" type="text" maxlength="200" v-model.trim="text" :placeholder="`說點什~`" />
           <span class="iconsend_icon" :class="{ disable: text == '' }" @click.stop="sendText">發送</span>
         </div>
       </div>
@@ -76,7 +76,7 @@
               <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="outBtn icon_remove" @click="userGetOut(i, idx)"></div>
+                <!-- <div class="outBtn icon_remove" @click="userGetOut(i, idx)"></div> -->
                 <div class="micBtn" :class="i.IsMuted ? 'mute_one_mic_off' : 'mute_one_mic_on'" @click="onMemberMuted(i)"></div>
               </div>
             </div>
@@ -103,6 +103,19 @@ const emit = defineEmits(["openDialog"]);
 
 const store = useStore();
 
+let jumpNewScene = (sceneFirstView) => {
+  let url = window.location.href;
+
+  if (!browser.hasURLParam("pose")) {
+    url += `&${sceneFirstView.sceneview}`;
+  } else {
+    url = browser.replaceQueryString(url, "pose", sceneFirstView.sceneview.replace("pose=", ""));
+  }
+
+  url = browser.replaceQueryString(url, "m", sceneFirstView.num);
+  return url;
+};
+
 let chatAutoScroll = () => {
   let el = document.getElementById("chat");
   let client_h = document.getElementById("chat").clientHeight;
@@ -124,7 +137,7 @@ store.commit("rtc/setSocket", createSocket());
 let getUrl = (href, queryArr) => {
   queryArr.forEach((item) => {
     if (!browser.hasURLParam(item.key)) {
-      let ttt = href.split('index.html?')
+      let ttt = href.split("index.html?");
       href = `${ttt[0]}index.html?${item.key}=${item.val}&${ttt[1]}`;
       console.log(href);
     } else {
@@ -135,6 +148,7 @@ let getUrl = (href, queryArr) => {
   return href;
 };
 const videoDeviceId = computed(() => store.getters["rtc/videoDeviceId"]);
+const audioDeviceId = computed(() => store.getters["rtc/audioDeviceId"]);
 
 const connectStatus = ref(0);
 const isBrushes = ref(false);
@@ -207,7 +221,7 @@ const setUserMuted = (res) => {
   if (res.userId) {
     if (res.userId == user_info.value.UserId) {
       user_info.value.IsMuted = res.muted;
-      Dialog.toast({ content: !user_info.value.IsMuted ? `主持人設置了开麦` : `主持人设置了静音` });
+      Dialog.toast({ content: !user_info.value.IsMuted ? `主持人設置了開麥` : `主持人設置了靜音` });
       disableMic.value = res.muted;
       audioMuted.value = res.muted;
     }
@@ -237,7 +251,7 @@ const onAllMuted = (res) => {
     user_info.value.IsMuted = res.muted;
     item.IsMuted = res.muted;
     if (role.value == "customer") {
-      Dialog.toast({ content: !user_info.value.IsMuted ? `主持人設置了开麦` : `主持人设置了静音` });
+      Dialog.toast({ content: !user_info.value.IsMuted ? `主持人設置了開麥` : `主持人設置了靜音` });
       disableMic.value = res.muted;
       audioMuted.value = res.muted;
     }
@@ -259,6 +273,7 @@ const setUserJoin = async (res) => {
   if (res.user.Role == "leader") {
     name = "主持人";
     Dialog.toast({ content: `主持人進入房間` });
+    socket.value.emit("action", { type: "user-init" });
   }
   let data = {
     role: res.user.Role,
@@ -395,7 +410,7 @@ const onMemberLeave = async (res) => {
     mode: mode.value,
     Nickname: name,
     UserId: res.user.UserId,
-    text: "离开房間",
+    text: "離開房間",
   };
   chatList.value.push(data);
   await nextTick();
@@ -423,17 +438,30 @@ const startFollow = (app) => {
   store.commit("rtc/setUserId", browser.getURLParam("vruserId") || `user_${role.value}${Math.floor(Math.random() * 100000000)}`);
   store.commit("rtc/setRoomId", browser.getURLParam("roomId") || `room_${Math.floor(Math.random() * 100000000)}`);
 
-  socket.value.on("connect", () => {
+  socket.value.on("connect", (e) => {
     socket.value.emit("join", {
       userId: userId.value,
       roomId: roomId.value,
       role: role.value || "leader",
-      nickname: browser.getURLParam("name") || common.uuid(12),
+      nickname: browser.getURLParam("name"),
     });
   });
 
   // 加入房間成功
   socket.value.on("join", (data) => {
+    let meblist = data.members.reduce(function (tempArr, item) {
+      if (tempArr.findIndex((ele) => ele.UserId === item.UserId) === -1) {
+        tempArr.push(item);
+      }
+      return tempArr;
+    }, []);
+
+    if (meblist.length > 5 && role.value == "customer") {
+      Dialog.toast({ content: `房間已滿員` });
+      emit("closeSocket");
+      return;
+    }
+
     connectStatus.value = 1;
     if (role.value == "customer") {
       socket.value.emit("action", { type: "user-init" });
@@ -445,12 +473,7 @@ const startFollow = (app) => {
     isJoined.value = true;
 
     user_info.value = data.user;
-    user_list.value = data.members.reduce(function (tempArr, item) {
-      if (tempArr.findIndex((ele) => ele.UserId === item.UserId) === -1) {
-        tempArr.push(item);
-      }
-      return tempArr;
-    }, []);
+    user_list.value = meblist;
 
     //更新分享鏈接
     shareLink.value = getUrl(window.location.href, [
@@ -497,7 +520,7 @@ const startFollow = (app) => {
         },
       ]);
     }
-    console.log('创建房间后更新url',tmp);
+    console.log("創建房間後更新url", tmp);
     history.replaceState(null, null, tmp);
   });
 
@@ -534,10 +557,13 @@ const startFollow = (app) => {
       onMemberLeave(data);
     } else if (data.type == "leader-dismiss") {
       emit("closeSocket");
-      Dialog.toast({ content: `主持人已解散房` });
+      Dialog.toast({ content: `主持人已解散房` });
     } else if (data.type == "tagclick") {
       if (role.value == "customer") {
         let item = tags.value.find((item) => item.sid == data.data.sid);
+
+        console.log(item,'itemitemitemitemitemitem');
+
         if (item.type == "commodity") {
           store.commit("tag/setTagClickType", {
             type: "goodlist",
@@ -549,6 +575,10 @@ const startFollow = (app) => {
             data: item,
           });
         }
+        else if (item.type == "link_scene") {
+          let sceneFirstView = item.hotContent.sceneFirstView;
+            window.location.href = jumpNewScene(sceneFirstView);
+        }
         // document.querySelector(`[data-tag-id="${data.data.sid}"]`).click();
         // console.log(data.data.sid);
       }

+ 4 - 4
src/components/RTC/Trtccom.vue

@@ -12,7 +12,7 @@
       <div
         class="local"
         :data-role="item.userId_"
-        :class="{ disabledlocal: item.userId_.indexOf('customer') > -1  || !videoDeviceId }"
+        :class="{ disabledlocal: item.userId_.indexOf('customer') > -1 || !videoDeviceId }"
         v-for="item in invitedRemoteStreams"
         :id="item.userId_"
         :key="item.userId_"
@@ -147,7 +147,7 @@ async function handleJoin() {
       sdkAppId: parseInt(store.getters["rtc/sdkAppId"], 10),
       userId: store.getters["rtc/userId"],
       userSig: userSig.value,
-      useStringRoomId:true
+      useStringRoomId: true,
     });
     installEventHandlers();
 
@@ -188,7 +188,7 @@ async function handleStartShare() {
     userId: `share${store.getters["rtc/userId"]}`,
     roomId: store.getters["rtc/roomId"],
     secretKey: store.getters["rtc/secretKey"],
-    useStringRoomId: true
+    useStringRoomId: true,
   });
   try {
     await shareClient.join();
@@ -350,7 +350,7 @@ async function handleStreamSubscribed(event) {
 
   await nextTick();
   setTimeout(() => {
-  console.log(remoteStream.userId_,'remoteStream.getId()');
+    console.log(remoteStream.userId_, "remoteStream.getId()");
     remoteStream
       .play(remoteStream.userId_)
       .then(() => {

+ 23 - 3
src/components/RTC/index.vue

@@ -15,6 +15,7 @@ import PageRtcLive from "./PageRtcLive";
 import createdRoom from "./dialog/createdRoom";
 import dialogIndex from "./dialog/index.vue";
 import dialogShare from "./dialog/share.vue";
+import { Dialog } from "@/global_components/";
 import browser from "@/utils/browser";
 import { onMounted, watch, computed, ref, nextTick } from "vue";
 import { useStore } from "vuex";
@@ -32,7 +33,6 @@ const role = ref(browser.getURLParam("role"));
 const userName = ref(browser.getURLParam("name"));
 const socket = computed(() => store.getters["rtc/socket"]);
 
-
 const openDialog = (str, link) => {
   shareLink.value = link;
   dialog.value = str;
@@ -46,7 +46,7 @@ const confirmDialog = async () => {
   await getApp().Connect.follow.exit();
   store.commit("rtc/setIsJoined", false);
   if (socket.value) {
-    if(role.value == 'leader'){
+    if (role.value == "leader") {
       socket.value.emit("action", { type: "leader-dismiss" });
     }
 
@@ -54,7 +54,6 @@ const confirmDialog = async () => {
     store.commit("rtc/setSocket", null);
   }
 
-  
   let tempUrl = window.location.href;
   ["mode", "name", "role", "roomId", "vruserId"].forEach((item) => {
     tempUrl = browser.replaceQueryString(tempUrl, item, "");
@@ -68,11 +67,31 @@ const confirmDialog = async () => {
 const closeCreated = (str, link) => {
   store.commit("showShoppingguide", false);
   showCreated.value = false;
+  showguide()
 };
 
 const createdConfirm = (str, link) => {
   showCreated.value = false;
   show.value = true;
+  showguide()
+};
+
+const showguide = () => {
+  if (!localStorage.getItem("user_guide")) {
+    Dialog.confirm({
+      showCloseIcon: false,
+      okText: "我知道了",
+      content:
+        "<span style='font-size: 16px; line-height: 1.5;'>開發者已遵守收集、使用最終用戶個人信息有關的所有可適用法律、政策和法規,保護用戶個人信息安全。<span/>",
+      title: "隱私條款:",
+      single: true,
+      func: (state) => {
+        if (state == "ok") {
+          localStorage.setItem("user_guide", Date.now());
+        }
+      },
+    });
+  }
 };
 
 onMounted(() => {
@@ -82,6 +101,7 @@ onMounted(() => {
       createdConfirm();
     } else {
       showCreated.value = true;
+      // showguide()
     }
   });
   // showCreated.value = true;