gemercheung 2 rokov pred
rodič
commit
f3cb3498b6

+ 2 - 2
.env.development

@@ -5,8 +5,8 @@ VITE_APP_CDN_URL=https://4dkk.4dage.com/v4/www/
 # sdk文件地址
 # VITE_APP_SDK_DIR=https://4dkk.4dage.com/v4/sdk/4.9.0
 VITE_APP_SDK_DIR=https://4dkk.4dage.com/v4-test/www/sdk
-# VITE_APP_SOCKET_URL=ws://127.0.0.1:8889
-VITE_APP_SOCKET_URL=wss://testws.4dkankan.com
+VITE_APP_SOCKET_URL=ws://127.0.0.1:8889
+# VITE_APP_SOCKET_URL=wss://testws.4dkankan.com
 # VITE_APP_SOCKET_URL=wss://221.4.210.172:16666
 # 静态资源目录
 VITE_APP_STATIC_DIR=viewer

BIN
src/assets/images/icon/assistant_crown.png


BIN
src/assets/images/icon/assistants@2x.png


BIN
src/assets/images/rtcLive/assistant_crown.png


BIN
src/components/basic/icon/images/assistants@2x.png


+ 2 - 0
src/components/basic/icon/images/index.ts

@@ -23,6 +23,7 @@ import video_on from './video_on@2x.png';
 import video_off from './video_off@2x.png';
 import video_disable from './video_off_50@2x.png';
 import kick_user from './remove@2x.png';
+import assistants from './assistants@2x.png';
 const icons = {
   arrow,
   arrows,
@@ -49,5 +50,6 @@ const icons = {
   video_off,
   video_disable,
   kick_user,
+  assistants,
 };
 export { icons };

+ 12 - 0
src/components/chatRoom/chatroom.scss

@@ -417,6 +417,18 @@
                 left: 0;
                 z-index: 2;
               }
+              .avatar-crown-assistant {
+                background-image: url(/@/assets/images/rtcLive/assistant_crown.png);
+                background-position: center center;
+                background-size: contain;
+                background-repeat: no-repeat;
+                width: 100%;
+                height: 100%;
+                position: absolute;
+                top: 0;
+                left: 0;
+                z-index: 2;
+              }
               > img {
                 // width: 100%;
                 // height: 100%;

+ 19 - 0
src/components/chatRoom/memberList.vue

@@ -26,6 +26,10 @@
                   alt=""
                 />
                 <div class="avatar-crown" v-show="i.Role === 'leader'"></div>
+                <div
+                  class="avatar-crown-assistant"
+                  v-show="i.Role !== 'leader' && i.IsAssistant"
+                ></div>
               </div>
               <div class="name">{{ i.Nickname }}</div>
             </div>
@@ -43,6 +47,12 @@
 
               <ImageIcon
                 class="kick_icon"
+                v-if="i?.Role !== 'leader' && !i.IsAssistant"
+                type="assistants"
+                @click="isNativeLeader && userCanBeAssistant(i)"
+              />
+              <ImageIcon
+                class="kick_icon"
                 v-if="i?.Role !== 'leader'"
                 type="kick_user"
                 @click="isNativeLeader && userCanKick(i)"
@@ -132,6 +142,15 @@
       userId: member.UserId,
     });
   }
+  function userCanBeAssistant(member: UserInfoType) {
+    const { socket } = useSocket();
+    member.IsAssistant = !member.IsAssistant;
+    socket.emit('action', {
+      type: 'set-assistant',
+      userId: member.UserId,
+      status: member.IsAssistant,
+    });
+  }
   function userCanSpeak(member: UserInfoType) {
     const { socket } = useSocket();
     member.IsMuted = !member.IsMuted;

+ 7 - 2
src/components/hotspot/index.vue

@@ -63,6 +63,7 @@
   const currentTag = ref<tagType | null>(null);
   const isClick = ref(false);
   const showLayer = ref(false);
+  const emit = defineEmits(['setCurrentTag']);
 
   const isShowTag = computed(() => {
     return (tag: tagType) => {
@@ -74,11 +75,13 @@
   const openLayer = (tag: tagType) => {
     showLayer.value = true;
     currentTag.value = tag;
+    emit('setCurrentTag', tag);
     console.error('open-layer');
   };
-  const closeLayer = (tag: tagType) => {
+  const closeLayer = () => {
     showLayer.value = false;
-    currentTag.value = tag;
+    currentTag.value = null;
+    emit('setCurrentTag', null);
     console.error('close-layer');
   };
 
@@ -111,10 +114,12 @@
       !unref(showLayer)
     ) {
       currentTag.value = null;
+      sceneStore.setCurrentTag(null);
     }
   };
   const onMouseEnter = (_, tag: tagType) => {
     if (!unref(isMobile)) {
+      sceneStore.setCurrentTag(tag);
       currentTag.value = tag;
     }
   };

+ 0 - 6
src/components/hotspot/metas/metas-video.vue

@@ -1,8 +1,6 @@
 <!--  -->
 <template>
-  <!-- <div class="video-box" :style="metasHeight ? `height:${metasHeight}px;` : ''"> -->
   <div class="video-box">
-    <!-- <ui-icon v-show="loading" class="loading-icon" type="_loading_"></ui-icon> -->
     <i
       v-show="loading"
       class="iconfont ui-kankan-icon icon tip-h-center tip-v-bottom icon-_loading_ loading-icon"
@@ -33,10 +31,6 @@
   import { tagType } from '/@/store/modules/scene';
   import { watchEffect } from 'vue';
 
-  // const videoNum = ref(0);
-  // const type = ref('video');
-  // const hotData = computed(() => store.getters['tag/hotData']);
-
   const props = defineProps({
     data: {
       type: Object,

+ 13 - 8
src/store/modules/rtc.ts

@@ -66,8 +66,9 @@ export interface UserInfoType {
   RoomId: string;
   UserId: string;
   text?: string;
-  order: number;
+  Order: number;
   IsOnline?: boolean;
+  IsAssistant?: boolean;
 }
 export type RoleType = 'leader' | 'customer';
 
@@ -272,20 +273,24 @@ export const useRtcStore = defineStore({
       const memberList = members.reduce((prev: UserInfoType[], current: UserInfoType, index) => {
         if (prev.findIndex((ele: UserInfoType) => ele.UserId === current.UserId) === -1) {
           // console.log(current);
-          current.order = index > 1 ? index : 2;
+          current.Order = index > 1 ? index : 2;
           if (current.Role === 'leader') {
-            current.order = 0;
-          }
-          if (current.UserId === this.userId) {
-            current.order = 1;
-            this.currentSession = current;
+            current.Order = 0;
+          } else {
+            if (current.IsAssistant) {
+              current.Order = 1;
+            }
+            if (current.UserId === this.userId) {
+              current.Order = 2;
+              this.currentSession = current;
+            }
           }
 
           prev.push(current);
         }
         return prev;
       }, []);
-      const sortList = sortBy(memberList, ['order', 'UserId'], ['asc', 'asc']);
+      const sortList = sortBy(memberList, ['Order', 'UserId'], ['asc', 'asc']);
       console.log('sortList', sortList);
       this.memberList = sortList;
     },

+ 5 - 0
src/store/modules/scene.ts

@@ -40,6 +40,7 @@ interface SceneState {
   tags: tagType[];
   floors: FloorsType[];
   metadata: KankanMetaDataType;
+  currentTag: null | tagType;
 }
 
 export const getStaticURL = (path: string) => {
@@ -50,6 +51,7 @@ export const useSceneStore = defineStore({
   id: 'scene',
   state: (): SceneState => ({
     tags: [],
+    currentTag: {} as tagType,
     floors: [],
     metadata: {} as KankanMetaDataType,
   }),
@@ -98,5 +100,8 @@ export const useSceneStore = defineStore({
         }
       }
     },
+    setCurrentTag(tag: null | tagType): void {
+      this.currentTag = tag;
+    },
   },
 });