tremble 3 lat temu
rodzic
commit
e2ca4c2bd1

+ 4 - 0
.env

@@ -6,6 +6,10 @@ VUE_APP_CDN_URL=https://4dkk.4dage.com/v4/www/
 # sdk文件地址
 VUE_APP_SDK_DIR=https://eurs3.4dkankan.com/v4/cdfg/sdk
 
+# socket地址
+VUE_SOCKET_URL=https://vr-admin.cdfmembers.com/
+
+
 
 # 静态资源目录
 VUE_APP_STATIC_DIR=viewer

+ 4 - 0
.env.development

@@ -7,6 +7,10 @@ VUE_APP_CDN_URL=https://4dkk.4dage.com/v4/www/
 VUE_APP_SDK_DIR=https://eurs3.4dkankan.com/v4/cdfg/sdk
 
 
+# socket地址
+VUE_SOCKET_URL=https://vr-admin.cdfmembers.com/
+
+
 # 静态资源目录
 VUE_APP_STATIC_DIR=viewer
 

+ 4 - 0
.env.prod

@@ -6,6 +6,10 @@ VUE_APP_CDN_URL=https://4dkk.4dage.com/v4/www/
 VUE_APP_SDK_DIR=https://eurs3.4dkankan.com/v4/cdfg/sdk
 
 
+# socket地址
+VUE_SOCKET_URL=https://vr-admin.cdfmembers.com/
+
+
 # 静态资源目录
 VUE_APP_STATIC_DIR=viewer
 

+ 8 - 0
src/app.vue

@@ -358,6 +358,14 @@ onMounted(async () => {
   app.Scene.on("loaded", (pano) => {
     refMiniMap.value = "[xui_min_map]";
     store.commit("setFloorId", pano.floorIndex);
+    store.commit("rtc/setShowdaogou", true);
+
+    if (browser.getURLParam("roomId")) {
+      store.commit("showShoppingguide", true);
+    }
+
+
+
     app.resource.tags(`${process.env.VUE_APP_RESOURCE_URL}cdf/hot/${browser.getURLParam("m")}/hot.json?rnd=${Math.random()}`);
     useMusicPlayer();
   });

+ 32 - 67
src/components/Controls/Panel/Main.vue

@@ -15,6 +15,34 @@
           <ui-icon :type="item.icon"></ui-icon>
           <div>{{ item.name }}</div>
         </li>
+
+        <li v-if="showdaogou">
+          <ui-icon
+            type="guided_shopping"
+            @click.stop="
+              onClickMenu({
+                icon: 'guided_shopping',
+                id: 'guided_shopping',
+                name: '導購',
+              })
+            "
+          ></ui-icon>
+          <div>導購</div>
+        </li>
+
+        <li>
+          <ui-icon
+            type="guided_shopping"
+            @click.stop="
+              onClickMenu({
+                icon: 'shopping',
+                id: 'shopping',
+                name: '購物',
+              })
+            "
+          ></ui-icon>
+          <div>購物</div>
+        </li>
       </ul>
     </div>
 
@@ -84,6 +112,7 @@ const store = useStore();
 
 const isOpen = ref(false);
 
+
 const toggleOpen = () => {
   isOpen.value = !isOpen.value;
 };
@@ -95,6 +124,7 @@ const currentCategory = ref({
 
 const currentM = computed(() => browser.getURLParam("m"));
 const currentPose = computed(() => browser.getURLParam("pose"));
+const showdaogou = computed(() => store.getters["rtc/showdaogou"]);
 
 const isPlay = computed(() => {
   let status = store.getters["tour/isPlay"];
@@ -140,16 +170,6 @@ const menulist = computed(() => {
       id: "kefu",
       name: "客服",
     },
-    {
-      icon: "guided_shopping",
-      id: "guided_shopping",
-      name: "導購",
-    },
-    {
-      icon: "shopping",
-      id: "shopping",
-      name: "購物",
-    },
   ];
 
   if (!browser.isMobile()) {
@@ -160,56 +180,7 @@ const menulist = computed(() => {
 
 const categorylist = ref([]);
 
-const brandlist = ref([
-  {
-    img: "show_3d_normal",
-    name: "GAP 蓋璞",
-  },
-  {
-    img: "show_3d_normal",
-    name: "MOOST·理MOOST·理MOOST·理MOOST·理MOOST·理",
-  },
-  {
-    img: "show_3d_normal",
-    name: "H&M",
-  },
-  {
-    img: "show_3d_normal",
-    name: "GAP 蓋璞",
-  },
-  {
-    img: "show_3d_normal",
-    name: "MOOST·理",
-  },
-  {
-    img: "show_3d_normal",
-    name: "H&M",
-  },
-  {
-    img: "show_3d_normal",
-    name: "GAP 蓋璞",
-  },
-  {
-    img: "show_3d_normal",
-    name: "MOOST·理",
-  },
-  {
-    img: "show_3d_normal",
-    name: "H&M",
-  },
-  {
-    img: "show_3d_normal",
-    name: "GAP 蓋璞",
-  },
-  {
-    img: "show_3d_normal",
-    name: "MOOST·理",
-  },
-  {
-    img: "show_3d_normal",
-    name: "H&M",
-  },
-]);
+const brandlist = ref([]);
 
 const brandScroll = () => {
   nextTick(() => {
@@ -307,15 +278,9 @@ const getShoplist = async () => {
 };
 
 onMounted(() => {
-  useApp().then(async (app) => {
+  useApp().then((app) => {
     getCategorylist();
     getShoplist();
-
-    app.Scene.on("loaded", () => {
-      if (browser.getURLParam("roomId")) {
-        store.commit("showShoppingguide", true);
-      }
-    });
   });
 });
 </script>

+ 63 - 21
src/components/RTC/PageRtcLive.vue

@@ -24,17 +24,17 @@
     <!-- </div> -->
     <!-- <input type="text" autocomplete="off"> -->
     <div class="contorlBar" v-if="!showInput">
-      <div v-if="connectStatus == 1" :class="{ disabled: user_info.isWords }" class="saySomething" @click="onFocus">
+      <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>
+           :class="{'dis':!user_info.IsWords}"></i> -->
+        <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>
       <div style="text-align: right; width: 100%" v-if="connectStatus == 0">连接中...</div>
       <div v-if="connectStatus == 1" class="contorl_btn">
-        <div v-if="isBrushes" @click="onDrawUndo" class="brushesBack" :class="{ disable: !canUndo }"></div>
+        <div v-if="isBrushes && user_info.Role == 'leader'" @click="onDrawUndo" class="brushesBack" :class="{ disabled: !canUndo }"></div>
         <div v-if="user_info.Role == 'leader'" @click="onDraw(!isBrushes)" :class="{ brushesed: isBrushes }" class="brushes"></div>
 
         <div
@@ -87,7 +87,7 @@
                 <!-- <div class="outBtn iconfont iconremove"></div> -->
                 <!-- <div v-if="audioDevices.length>0" class="micBtn iconfont" @click="changeMedia('audio',hideMic)" :class="user_info.muted ?'iconmic_off':'iconmic_on'"></div>
                 <div v-else class="micBtn iconfont iconmic_off"></div> -->
-                <div class="micBtn mute_all_mic" :class="{ open_all_mic: !all_mute_mic }" @click="onMemberMuted(all_mute_mic)"></div>
+                <div class="micBtn mute_all_mic" :class="{ open_all_mic: !all_mute_mic }" ></div>
               </div>
             </div>
 
@@ -99,10 +99,10 @@
                 <div class="name">{{ i.Nickname }}</div>
               </div>
               <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>
 
                 <div class="outBtn icon_remove" @click="userGetOut(i.UserId)"></div>
-                <div class="micBtn" :class="i.isMuted ? 'mute_one_mic_off' : 'mute_one_mic_on'" @click="onMemberMuted(!i.isMuted, i.UserId)"></div>
+                <div class="micBtn" :class="i.IsMuted ? 'mute_one_mic_off' : 'mute_one_mic_on'" @click="onMemberMuted(i)"></div>
               </div>
             </div>
           </div>
@@ -135,7 +135,7 @@ let chatAutoScroll = () => {
 };
 
 let createSocket = (config) => {
-  var socket = io("https://vr-admin.cdfmembers.com/", {
+  var socket = io(process.env.VUE_SOCKET_URL, {
     path: "/ws-sync",
     transports: ["websocket"],
   });
@@ -193,6 +193,35 @@ const all_mute_mic = ref(true);
 
 const chat$ = ref(null);
 
+const setUserWords = (res) => {
+  if (user_info.value.Role == "leader") {
+    user_list.value = res.members.reduce(function (tempArr, item) {
+      if (tempArr.findIndex((ele) => ele.UserId === item.UserId) === -1) {
+        tempArr.push(item);
+      }
+      return tempArr;
+    }, []);
+  }
+  if (res.userId == user_info.value.UserId) {
+    user_info.value.IsWords = res.words;
+  }
+};
+
+const setUserMuted = (res) => {
+  if (user_info.value.Role == "leader") {
+    user_list.value = res.members.reduce(function (tempArr, item) {
+      if (tempArr.findIndex((ele) => ele.UserId === item.UserId) === -1) {
+        tempArr.push(item);
+      }
+      return tempArr;
+    }, []);
+  }
+  if (res.userId == user_info.value.UserId) {
+    user_info.value.IsMuted = res.muted;
+  }
+};
+
+//用戶加入
 const setUserJoin = async (res) => {
   console.log("有人进来了", res);
   // self.user_info = res.user;
@@ -223,7 +252,11 @@ const setUserJoin = async (res) => {
 };
 
 const onDrawUndo = async () => {
-  await getApp().Connect.paint.undo();
+  let app = await getApp();
+  app.Connect.paint.undo();
+  canUndo.value = app.Connect.paint.records.length > 0;
+
+  console.log(app.Connect.paint.records, "app.Connect.paint.records");
 };
 
 // 画笔开启
@@ -316,16 +349,14 @@ const openDialog = (str, link) => {
   emit("openDialog", str, link);
 };
 
-const onMemberMuted = (muted, userId) => {
-  if (user_list.value.length > 1) {
-    Dialog.toast({ content: `操作成功`, type: "success" });
-    socket.value && socket.value.send("Muted", muted, userId);
-  }
+const onMemberMuted = (item) => {
+    item.IsMuted = !item.IsMuted;
+    socket.value.emit("action", { type: "users-muted", muted: item.IsMuted, userId: item.UserId });
 };
 
 const userCanSpeak = (item) => {
-  item.isWords = !item.isWords;
-  socket.value && socket.value.invoke("Words", isWords, userId);
+  item.IsWords = !item.IsWords;
+  socket.value.emit("action", { type: "users-words", words: item.IsWords, userId: item.UserId });
 };
 
 const startFollow = (app) => {
@@ -414,14 +445,27 @@ const startFollow = (app) => {
       app.Connect.follow.sync();
     } else if (data.type == "user-paint") {
       onDraw(data.open);
+      if (role.value == "customer") {
+        if (data.open) {
+          Dialog.toast({ content: `主持人开启画笔` });
+        } else {
+          Dialog.toast({ content: `主持人关闭画笔` });
+        }
+      }
     } else if (data.type == "user-join") {
       setUserJoin(data);
+    } else if (data.type == "users-muted") {
+      setUserMuted(data);
+      //閉麥
+    } else if (data.type == "users-words") {
+      setUserWords(data);
+      //禁言
     }
   });
 
   // 同屏带看
   socket.value.on("sync", (data) => {
-    app.Connect.sync.receive(data);
+    app.Connect.follow.receive(data);
   });
 
   // 画笔
@@ -432,9 +476,6 @@ const startFollow = (app) => {
 
 onMounted(() => {
   useApp().then((app) => {
-    paint.value = app.Connect.paint;
-    console.log(paint.value, "paint");
-
     startFollow(app);
     app.Connect.follow.on("data", (data) => {
       if (isJoined.value) {
@@ -443,6 +484,7 @@ onMounted(() => {
     });
 
     app.Connect.paint.on("data", (data) => {
+      canUndo.value = app.Connect.paint.records.length > 0;
       socket.value.emit("paint", data);
     });
   });

+ 2 - 1
src/components/RTC/dialog/index.vue

@@ -42,7 +42,8 @@ const endLiveCancel = () => {
 };
 
 const endLiveConfirm = () => {
-  socket.value && socket.value.send("end")
+  store.commit("rtc/setSocket", {});
+  // socket.value.emit("disconnect");
   emit("confirmDialog");
 };
 </script>

+ 8 - 1
src/store/modules/rtc.js

@@ -5,18 +5,25 @@ export default {
     namespaced: true,
     state() {
         return {
-            socket: {}
+            socket: {},
+            showdaogou: false
         }
     },
     getters: {
         socket: state => {
             return state.socket
         },
+        showdaogou: state => {
+            return state.showdaogou
+        },
     },
     mutations: {
         setSocket(state, payload) {
             state.socket = payload
         },
+        setShowdaogou(state, payload) {
+            state.showdaogou = payload
+        }
     },
     actions: {