shuisheng 1 سال پیش
والد
کامیت
5bc39c28ef
8فایلهای تغییر یافته به همراه124 افزوده شده و 163 حذف شده
  1. 13 13
      src/hooks/use-pull.ts
  2. 4 7
      src/hooks/use-push.ts
  3. 15 6
      src/hooks/use-websocket.ts
  4. 1 2
      src/types/websocket.ts
  5. 43 50
      src/views/h5/room/index.vue
  6. 21 22
      src/views/home/index.vue
  7. 21 39
      src/views/pull/index.vue
  8. 6 24
      src/views/push/index.vue

+ 13 - 13
src/hooks/use-pull.ts

@@ -405,11 +405,11 @@ export function usePull() {
     }
     }
   );
   );
 
 
-  function initPull(data: {
-    roomId: string;
-    autolay?: boolean;
-    isRemoteDesk?: boolean;
-  }) {
+  function initRoomId(id: string) {
+    roomId.value = id;
+  }
+
+  function initPull(data: { autolay?: boolean; isRemoteDesk?: boolean }) {
     if (data.autolay === undefined) {
     if (data.autolay === undefined) {
       autoplayVal.value = true;
       autoplayVal.value = true;
     } else {
     } else {
@@ -418,7 +418,7 @@ export function usePull() {
     isRemoteDesk.value = !!data.isRemoteDesk;
     isRemoteDesk.value = !!data.isRemoteDesk;
     initWs({
     initWs({
       isRemoteDesk: data.isRemoteDesk,
       isRemoteDesk: data.isRemoteDesk,
-      roomId: data.roomId,
+      roomId: roomId.value,
       isAnchor: false,
       isAnchor: false,
     });
     });
   }
   }
@@ -454,13 +454,13 @@ export function usePull() {
       window.$message.warning('请输入弹幕内容!');
       window.$message.warning('请输入弹幕内容!');
       return;
       return;
     }
     }
-    const instance = networkStore.wsMap.get(roomId);
+    const instance = networkStore.wsMap.get(roomId.value);
     if (!instance) return;
     if (!instance) return;
     const messageData: WsMessageType['data'] = {
     const messageData: WsMessageType['data'] = {
       content: txt,
       content: txt,
       content_type: WsMessageContentTypeEnum.txt,
       content_type: WsMessageContentTypeEnum.txt,
       msg_type: DanmuMsgTypeEnum.reward,
       msg_type: DanmuMsgTypeEnum.reward,
-      live_room_id: Number(roomId),
+      live_room_id: Number(roomId.value),
       isBilibili: false,
       isBilibili: false,
     };
     };
     instance.send({
     instance.send({
@@ -481,14 +481,13 @@ export function usePull() {
       window.$message.warning('请输入弹幕内容!');
       window.$message.warning('请输入弹幕内容!');
       return;
       return;
     }
     }
-    console.log('sendDanmuTxt', roomId, txt);
-    const instance = networkStore.wsMap.get(roomId);
+    const instance = networkStore.wsMap.get(roomId.value);
     if (!instance) return;
     if (!instance) return;
     const messageData: WsMessageType['data'] = {
     const messageData: WsMessageType['data'] = {
       content: txt,
       content: txt,
       content_type: WsMessageContentTypeEnum.txt,
       content_type: WsMessageContentTypeEnum.txt,
       msg_type: DanmuMsgTypeEnum.danmu,
       msg_type: DanmuMsgTypeEnum.danmu,
-      live_room_id: Number(roomId),
+      live_room_id: Number(roomId.value),
       isBilibili: false,
       isBilibili: false,
     };
     };
     instance.send({
     instance.send({
@@ -510,14 +509,14 @@ export function usePull() {
       window.$message.warning('图片不能为空!');
       window.$message.warning('图片不能为空!');
       return;
       return;
     }
     }
-    const instance = networkStore.wsMap.get(roomId);
+    const instance = networkStore.wsMap.get(roomId.value);
     if (!instance) return;
     if (!instance) return;
     const requestId = getRandomString(8);
     const requestId = getRandomString(8);
     const messageData: WsMessageType['data'] = {
     const messageData: WsMessageType['data'] = {
       content: url,
       content: url,
       content_type: WsMessageContentTypeEnum.img,
       content_type: WsMessageContentTypeEnum.img,
       msg_type: DanmuMsgTypeEnum.danmu,
       msg_type: DanmuMsgTypeEnum.danmu,
-      live_room_id: Number(roomId),
+      live_room_id: Number(roomId.value),
       isBilibili: false,
       isBilibili: false,
     };
     };
     instance.send({
     instance.send({
@@ -554,5 +553,6 @@ export function usePull() {
     danmuStr,
     danmuStr,
     liveRoomInfo,
     liveRoomInfo,
     anchorInfo,
     anchorInfo,
+    initRoomId,
   };
   };
 }
 }

+ 4 - 7
src/hooks/use-push.ts

@@ -14,7 +14,6 @@ import {
 import { useAppStore } from '@/store/app';
 import { useAppStore } from '@/store/app';
 import { useNetworkStore } from '@/store/network';
 import { useNetworkStore } from '@/store/network';
 import { useUserStore } from '@/store/user';
 import { useUserStore } from '@/store/user';
-import { ILiveRoom } from '@/types/ILiveRoom';
 import {
 import {
   WsConnectStatusEnum,
   WsConnectStatusEnum,
   WsMessageType,
   WsMessageType,
@@ -39,7 +38,6 @@ export function usePush() {
   const roomId = ref('');
   const roomId = ref('');
   const roomName = ref('');
   const roomName = ref('');
   const danmuStr = ref('');
   const danmuStr = ref('');
-  const liveRoomInfo = ref<ILiveRoom>();
   const localStream = ref<MediaStream>();
   const localStream = ref<MediaStream>();
   const videoElArr = ref<HTMLVideoElement[]>([]);
   const videoElArr = ref<HTMLVideoElement[]>([]);
   const msgIsFile = ref<WsMessageMsgIsFileEnum>(WsMessageMsgIsFileEnum.no);
   const msgIsFile = ref<WsMessageMsgIsFileEnum>(WsMessageMsgIsFileEnum.no);
@@ -168,8 +166,8 @@ export function usePush() {
           });
           });
           await handleCreateUserLiveRoom();
           await handleCreateUserLiveRoom();
         } else {
         } else {
-          roomName.value = liveRoomInfo.value?.name || '';
-          roomId.value = `${liveRoomInfo.value?.id || ''}`;
+          roomName.value = appStore.liveRoomInfo?.name || '';
+          roomId.value = `${appStore.liveRoomInfo?.id || ''}`;
           connectWs();
           connectWs();
         }
         }
       }
       }
@@ -180,9 +178,9 @@ export function usePush() {
   async function handleUserHasLiveRoom() {
   async function handleUserHasLiveRoom() {
     const res = await fetchUserHasLiveRoom(userStore.userInfo!.id!);
     const res = await fetchUserHasLiveRoom(userStore.userInfo!.id!);
     if (res.code === 200 && res.data) {
     if (res.code === 200 && res.data) {
-      liveRoomInfo.value = res.data.live_room;
+      appStore.liveRoomInfo = res.data.live_room;
       router.push({
       router.push({
-        query: { ...route.query, roomId: liveRoomInfo.value?.id },
+        query: { ...route.query, roomId: appStore.liveRoomInfo?.id },
       });
       });
       return true;
       return true;
     }
     }
@@ -376,6 +374,5 @@ export function usePush() {
     roomName,
     roomName,
     damuList,
     damuList,
     liveUserList,
     liveUserList,
-    liveRoomInfo,
   };
   };
 }
 }

+ 15 - 6
src/hooks/use-websocket.ts

@@ -611,6 +611,9 @@ export const useWebsocket = () => {
     ws.socketIo.on(WsMsgTypeEnum.message, (data: WsMessageType) => {
     ws.socketIo.on(WsMsgTypeEnum.message, (data: WsMessageType) => {
       prettierReceiveWsMsg(WsMsgTypeEnum.message, data);
       prettierReceiveWsMsg(WsMsgTypeEnum.message, data);
       damuList.value.push({
       damuList.value.push({
+        send_msg_time: data.time,
+        user: data.user_info,
+        username: data.user_info?.username,
         /** 消息类型 */
         /** 消息类型 */
         msg_type: data.data.msg_type,
         msg_type: data.data.msg_type,
         /** 消息内容类型 */
         /** 消息内容类型 */
@@ -795,8 +798,9 @@ export const useWebsocket = () => {
     ws.socketIo.on(WsMsgTypeEnum.otherJoin, (data: WsOtherJoinType['data']) => {
     ws.socketIo.on(WsMsgTypeEnum.otherJoin, (data: WsOtherJoinType['data']) => {
       prettierReceiveWsMsg(WsMsgTypeEnum.otherJoin, data);
       prettierReceiveWsMsg(WsMsgTypeEnum.otherJoin, data);
       const danmu: IWsMessage = {
       const danmu: IWsMessage = {
+        username: data.join_user_info?.username,
         send_msg_time: +new Date(),
         send_msg_time: +new Date(),
-        live_room_id: data.live_room.id!,
+        live_room_id: data.live_room_id!,
         id: -1,
         id: -1,
         content: '',
         content: '',
         content_type: WsMessageContentTypeEnum.txt,
         content_type: WsMessageContentTypeEnum.txt,
@@ -822,11 +826,11 @@ export const useWebsocket = () => {
             LiveRoomTypeEnum.system,
             LiveRoomTypeEnum.system,
             LiveRoomTypeEnum.srs,
             LiveRoomTypeEnum.srs,
             LiveRoomTypeEnum.obs,
             LiveRoomTypeEnum.obs,
-          ].includes(data.live_room.type!)
+          ].includes(appStore.liveRoomInfo?.type!)
         ) {
         ) {
           return;
           return;
         }
         }
-        if (data.live_room.type === LiveRoomTypeEnum.wertc_live) {
+        if (appStore.liveRoomInfo?.type === LiveRoomTypeEnum.wertc_live) {
           updateWebRtcLiveConfig({
           updateWebRtcLiveConfig({
             roomId: roomId.value,
             roomId: roomId.value,
             canvasVideoStream: canvasVideoStream.value,
             canvasVideoStream: canvasVideoStream.value,
@@ -847,7 +851,9 @@ export const useWebsocket = () => {
               });
               });
             }
             }
           });
           });
-        } else if (data.live_room.type === LiveRoomTypeEnum.wertc_meeting_one) {
+        } else if (
+          appStore.liveRoomInfo?.type === LiveRoomTypeEnum.wertc_meeting_one
+        ) {
           updateWebRtcMeetingOneConfig({
           updateWebRtcMeetingOneConfig({
             roomId: roomId.value,
             roomId: roomId.value,
             anchorStream: canvasVideoStream.value,
             anchorStream: canvasVideoStream.value,
@@ -868,7 +874,7 @@ export const useWebsocket = () => {
           //     });
           //     });
           //   }
           //   }
           // });
           // });
-        } else if (data.live_room.type === LiveRoomTypeEnum.pk) {
+        } else if (appStore.liveRoomInfo?.type === LiveRoomTypeEnum.pk) {
           updateWebRtcMeetingPkConfig({
           updateWebRtcMeetingPkConfig({
             roomId: roomId.value,
             roomId: roomId.value,
             anchorStream: canvasVideoStream.value,
             anchorStream: canvasVideoStream.value,
@@ -889,7 +895,9 @@ export const useWebsocket = () => {
           //     });
           //     });
           //   }
           //   }
           // });
           // });
-        } else if (data.live_room.type === LiveRoomTypeEnum.tencent_css_pk) {
+        } else if (
+          appStore.liveRoomInfo?.type === LiveRoomTypeEnum.tencent_css_pk
+        ) {
           updateWebRtcMeetingPkConfig({
           updateWebRtcMeetingPkConfig({
             roomId: roomId.value,
             roomId: roomId.value,
             anchorStream: canvasVideoStream.value,
             anchorStream: canvasVideoStream.value,
@@ -927,6 +935,7 @@ export const useWebsocket = () => {
       console.log('用户离开房间完成', data);
       console.log('用户离开房间完成', data);
       networkStore.removeRtc(data.socket_id);
       networkStore.removeRtc(data.socket_id);
       damuList.value.push({
       damuList.value.push({
+        ...data,
         send_msg_time: +new Date(),
         send_msg_time: +new Date(),
         live_room_id: Number(roomId.value),
         live_room_id: Number(roomId.value),
         id: -1,
         id: -1,

+ 1 - 2
src/types/websocket.ts

@@ -202,8 +202,7 @@ export type WsDisableSpeakingType = IWsFormat<{
 
 
 /** 其他用户加入直播间 */
 /** 其他用户加入直播间 */
 export type WsOtherJoinType = IWsFormat<{
 export type WsOtherJoinType = IWsFormat<{
-  live_room: ILiveRoom;
-  live_room_user_info: IUser;
+  live_room_id: number;
   join_user_info?: IUser;
   join_user_info?: IUser;
   join_socket_id: string;
   join_socket_id: string;
   socket_list: string[];
   socket_list: string[];

+ 43 - 50
src/views/h5/room/index.vue

@@ -86,18 +86,12 @@
                     [{{ formatTimeHour(item.send_msg_time!) }}]
                     [{{ formatTimeHour(item.send_msg_time!) }}]
                   </span>
                   </span>
                   <span class="name">
                   <span class="name">
-                    <span v-if="item.user">
-                      <span>{{ item.user.username }}</span>
-                      <span>
-                        [{{ item.user.roles?.map((v) => v.role_name).join() }}]
-                      </span>
+                    <span>{{ item.username }}</span>
+                    <span>
+                      [{{ item.user?.roles?.map((v) => v.role_name).join() }}]
                     </span>
                     </span>
-                    <span v-else>
-                      <span>{{ item.socket_id }}</span>
-                      <span>[游客]</span>
-                    </span>
-                    <span>:</span>
                   </span>
                   </span>
+                  <span>:</span>
                   <span
                   <span
                     class="msg"
                     class="msg"
                     v-if="item.content_type === WsMessageContentTypeEnum.txt"
                     v-if="item.content_type === WsMessageContentTypeEnum.txt"
@@ -119,37 +113,28 @@
                   v-else-if="item.msg_type === DanmuMsgTypeEnum.otherJoin"
                   v-else-if="item.msg_type === DanmuMsgTypeEnum.otherJoin"
                 >
                 >
                   <span class="name system">系统通知:</span>
                   <span class="name system">系统通知:</span>
-                  <span class="msg">
-                    {{ item.user?.username || item.socket_id }}进入直播!
-                  </span>
+                  <span class="msg">{{ item.username }}进入直播!</span>
                 </template>
                 </template>
                 <template
                 <template
                   v-else-if="item.msg_type === DanmuMsgTypeEnum.userLeaved"
                   v-else-if="item.msg_type === DanmuMsgTypeEnum.userLeaved"
                 >
                 >
                   <span class="name system">系统通知:</span>
                   <span class="name system">系统通知:</span>
-                  <span class="msg">
-                    {{ item.user?.username || item.socket_id }}离开直播!
-                  </span>
+                  <span class="msg">{{ item.username }}离开直播!</span>
                 </template>
                 </template>
-                <template v-else-if="item.msg_type === DanmuMsgTypeEnum.reward">
-                  <span class="time">
-                    [{{ formatTimeHour(item.send_msg_time!) }}]
-                  </span>
-                  <span class="name">
-                    <span v-if="item.user">
-                      <span>{{ item.user.username }}</span>
-                      <span>
-                        [{{ item.user.roles?.map((v) => v.role_name).join() }}]
-                      </span>
-                    </span>
-                    <span v-else>
-                      <span>{{ item.socket_id }}</span>
-                      <span>[游客]</span>
+                <div
+                  class="reward"
+                  v-else-if="item.msg_type === DanmuMsgTypeEnum.reward"
+                >
+                  <span> [{{ formatTimeHour(item.send_msg_time!) }}] </span>
+                  <span>
+                    <span>{{ item.username }}</span>
+                    <span>
+                      [{{ item.user?.roles?.map((v) => v.role_name).join() }}]
                     </span>
                     </span>
                     <span>:</span>
                     <span>:</span>
                   </span>
                   </span>
-                  <span class="msg"> 打赏了:{{ item.content }} </span>
-                </template>
+                  <span>打赏了{{ item.content }}!</span>
+                </div>
               </div>
               </div>
             </div>
             </div>
           </div>
           </div>
@@ -315,6 +300,7 @@ import { useAppStore } from '@/store/app';
 import { usePiniaCacheStore } from '@/store/cache';
 import { usePiniaCacheStore } from '@/store/cache';
 import { useUserStore } from '@/store/user';
 import { useUserStore } from '@/store/user';
 import { LiveRoomTypeEnum } from '@/types/ILiveRoom';
 import { LiveRoomTypeEnum } from '@/types/ILiveRoom';
+import { IUser } from '@/types/IUser';
 import { formatTimeHour } from '@/utils';
 import { formatTimeHour } from '@/utils';
 
 
 const route = useRoute();
 const route = useRoute();
@@ -326,6 +312,7 @@ const bottomRef = ref<HTMLDivElement>();
 const danmuListRef = ref<HTMLDivElement>();
 const danmuListRef = ref<HTMLDivElement>();
 const showEmoji = ref(false);
 const showEmoji = ref(false);
 
 
+const anchorInfo = ref<IUser>();
 const containerHeight = ref(0);
 const containerHeight = ref(0);
 const videoWrapHeight = ref(0);
 const videoWrapHeight = ref(0);
 const remoteVideoRef = ref<HTMLDivElement>();
 const remoteVideoRef = ref<HTMLDivElement>();
@@ -347,9 +334,9 @@ const {
   damuList,
   damuList,
   danmuStr,
   danmuStr,
   roomLiving,
   roomLiving,
-  anchorInfo,
   videoResolution,
   videoResolution,
-} = usePull(roomId.value);
+  initRoomId,
+} = usePull();
 
 
 onUnmounted(() => {
 onUnmounted(() => {
   closeWs();
   closeWs();
@@ -359,6 +346,7 @@ onUnmounted(() => {
 });
 });
 
 
 onMounted(() => {
 onMounted(() => {
+  initRoomId(roomId.value);
   showPlayBtn.value = true;
   showPlayBtn.value = true;
   videoWrapRef.value = remoteVideoRef.value;
   videoWrapRef.value = remoteVideoRef.value;
   setTimeout(() => {
   setTimeout(() => {
@@ -403,16 +391,7 @@ async function handleHistoryMsg() {
     });
     });
     if (res.code === 200) {
     if (res.code === 200) {
       res.data.rows.forEach((v) => {
       res.data.rows.forEach((v) => {
-        damuList.value.unshift({
-          send_msg_time: v.send_msg_time!,
-          user: v.user,
-          live_room_id: v.live_room_id!,
-          id: v.id!,
-          content: v.content!,
-          content_type: v.content_type!,
-          msg_type: v.msg_type!,
-          redbag_send_id: v.redbag_send_id,
-        });
+        damuList.value.unshift(v);
       });
       });
       if (
       if (
         appStore.liveRoomInfo?.system_msg &&
         appStore.liveRoomInfo?.system_msg &&
@@ -495,13 +474,22 @@ async function getLiveRoomInfo() {
     videoLoading.value = true;
     videoLoading.value = true;
     const res = await fetchFindLiveRoom(Number(roomId.value));
     const res = await fetchFindLiveRoom(Number(roomId.value));
     if (res.code === 200) {
     if (res.code === 200) {
-      if (res.data?.type === LiveRoomTypeEnum.wertc_live) {
-        autoplayVal.value = true;
-        showPlayBtn.value = false;
-      } else {
-        showPlayBtn.value = true;
+      if (res.data) {
+        appStore.liveRoomInfo = res.data;
+        anchorInfo.value = res.data.user_live_room?.user;
+        if (res.data.live) {
+          roomLiving.value = true;
+        } else {
+          videoLoading.value = false;
+        }
+        if (res.data?.type === LiveRoomTypeEnum.wertc_live) {
+          autoplayVal.value = true;
+          showPlayBtn.value = false;
+        } else {
+          showPlayBtn.value = true;
+        }
+        initPull({ autolay: autoplayVal.value });
       }
       }
-      initPull({ roomId: roomId.value, autolay: autoplayVal.value });
     }
     }
   } catch (error) {
   } catch (error) {
     console.error(error);
     console.error(error);
@@ -692,6 +680,11 @@ function startPull() {
       word-wrap: break-word;
       word-wrap: break-word;
       font-size: 13px;
       font-size: 13px;
 
 
+      .reward {
+        color: $theme-color-gold;
+        font-weight: bold;
+      }
+
       .name,
       .name,
       .time {
       .time {
         color: white;
         color: white;

+ 21 - 22
src/views/home/index.vue

@@ -44,11 +44,11 @@
         >
         >
           <div
           <div
             v-if="
             v-if="
-              currentLiveRoom?.live_room?.cdn === LiveRoomUseCDNEnum.yes &&
+              appStore.liveRoomInfo?.cdn === LiveRoomUseCDNEnum.yes &&
               [
               [
                 LiveRoomTypeEnum.tencent_css,
                 LiveRoomTypeEnum.tencent_css,
                 LiveRoomTypeEnum.tencent_css_pk,
                 LiveRoomTypeEnum.tencent_css_pk,
-              ].includes(currentLiveRoom?.live_room!.type!)
+              ].includes(appStore.liveRoomInfo!.type!)
             "
             "
             class="cdn-ico"
             class="cdn-ico"
           >
           >
@@ -59,16 +59,16 @@
             class="cover"
             class="cover"
             :style="{
             :style="{
               backgroundImage: `url(${
               backgroundImage: `url(${
-                currentLiveRoom?.live_room?.cover_img ||
-                currentLiveRoom?.user?.avatar
+                appStore.liveRoomInfo?.cover_img ||
+                appStore.liveRoomInfo?.user?.avatar
               })`,
               })`,
             }"
             }"
           ></div>
           ></div>
           <div
           <div
-            v-if="currentLiveRoom?.live_room?.flv_url"
+            v-if="appStore.liveRoomInfo?.flv_url"
             ref="remoteVideoRef"
             ref="remoteVideoRef"
           ></div>
           ></div>
-          <template v-if="currentLiveRoom">
+          <template v-if="appStore.liveRoomInfo">
             <div class="video-controls">
             <div class="video-controls">
               <VideoControls
               <VideoControls
                 :resolution="videoResolution"
                 :resolution="videoResolution"
@@ -87,7 +87,7 @@
             >
             >
               <div
               <div
                 class="btn"
                 class="btn"
-                @click="joinRoom(currentLiveRoom.live_room)"
+                @click="joinRoom(appStore.liveRoomInfo)"
               >
               >
                 进入直播
                 进入直播
               </div>
               </div>
@@ -104,7 +104,7 @@
               :key="index"
               :key="index"
               :class="{
               :class="{
                 item: 1,
                 item: 1,
-                active: item.live_room_id === currentLiveRoom?.live_room_id,
+                active: item.live_room_id === appStore.liveRoomInfo?.id,
               }"
               }"
               :style="{
               :style="{
                 backgroundImage: `url(${
                 backgroundImage: `url(${
@@ -137,11 +137,11 @@
                 class="border"
                 class="border"
                 :style="{
                 :style="{
                   opacity:
                   opacity:
-                    item.live_room_id === currentLiveRoom?.live_room_id ? 1 : 0,
+                    item.live_room_id === appStore.liveRoomInfo?.id ? 1 : 0,
                 }"
                 }"
               ></div>
               ></div>
               <div
               <div
-                v-if="item.live_room_id === currentLiveRoom?.live_room_id"
+                v-if="item.live_room_id === appStore.liveRoomInfo?.id"
                 class="triangle"
                 class="triangle"
               ></div>
               ></div>
               <div class="txt">{{ item.live_room?.name }}</div>
               <div class="txt">{{ item.live_room?.name }}</div>
@@ -281,7 +281,7 @@
 import { openToTarget } from 'billd-utils';
 import { openToTarget } from 'billd-utils';
 import { onMounted, reactive, ref, watch } from 'vue';
 import { onMounted, reactive, ref, watch } from 'vue';
 import { useI18n } from 'vue-i18n';
 import { useI18n } from 'vue-i18n';
-import { useRoute, useRouter } from 'vue-router';
+import { useRouter } from 'vue-router';
 
 
 import { fetchLiveBilibiliGetUserRecommend } from '@/api/bilibili';
 import { fetchLiveBilibiliGetUserRecommend } from '@/api/bilibili';
 import { fetchLiveList } from '@/api/live';
 import { fetchLiveList } from '@/api/live';
@@ -292,6 +292,7 @@ import { ILive, LiveLineEnum } from '@/interface';
 import { routerName } from '@/router';
 import { routerName } from '@/router';
 import { useAppStore } from '@/store/app';
 import { useAppStore } from '@/store/app';
 import {
 import {
+  ILiveRoom,
   LiveRoomIsShowEnum,
   LiveRoomIsShowEnum,
   LiveRoomPullIsShouldAuthEnum,
   LiveRoomPullIsShouldAuthEnum,
   LiveRoomTypeEnum,
   LiveRoomTypeEnum,
@@ -299,7 +300,6 @@ import {
 } from '@/types/ILiveRoom';
 } from '@/types/ILiveRoom';
 import { initAdsbygoogle } from '@/utils/google-ad';
 import { initAdsbygoogle } from '@/utils/google-ad';
 
 
-const route = useRoute();
 const router = useRouter();
 const router = useRouter();
 const appStore = useAppStore();
 const appStore = useAppStore();
 const canvasRef = ref<Element>();
 const canvasRef = ref<Element>();
@@ -314,7 +314,6 @@ const configVideo = ref();
 const topLiveRoomList = ref<ILive[]>([]);
 const topLiveRoomList = ref<ILive[]>([]);
 const otherLiveRoomList = ref<ILive[]>([]);
 const otherLiveRoomList = ref<ILive[]>([]);
 const bilibiliLiveRoomList = ref<ILive[]>([]);
 const bilibiliLiveRoomList = ref<ILive[]>([]);
-const currentLiveRoom = ref<ILive>();
 const interactionList = ref<any[]>([]);
 const interactionList = ref<any[]>([]);
 const videoWrapTmpRef = ref<HTMLDivElement>();
 const videoWrapTmpRef = ref<HTMLDivElement>();
 const remoteVideoRef = ref<HTMLDivElement>();
 const remoteVideoRef = ref<HTMLDivElement>();
@@ -330,7 +329,7 @@ const {
   videoResolution,
   videoResolution,
   handleStopDrawing,
   handleStopDrawing,
   handlePlay,
   handlePlay,
-} = usePull(route.params.roomId as string);
+} = usePull();
 const isBottom = ref(false);
 const isBottom = ref(false);
 const rootMargin = {
 const rootMargin = {
   bottom: 600,
   bottom: 600,
@@ -436,21 +435,21 @@ async function getBg() {
 }
 }
 
 
 function handleRefresh() {
 function handleRefresh() {
-  playLive(currentLiveRoom.value!);
+  playLive(appStore.liveRoomInfo!);
 }
 }
 
 
-function playLive(item: ILive) {
+function playLive(item: ILiveRoom) {
   handleStopDrawing();
   handleStopDrawing();
-  currentLiveRoom.value = item;
   canvasRef.value?.childNodes?.forEach((item) => {
   canvasRef.value?.childNodes?.forEach((item) => {
     item.remove();
     item.remove();
   });
   });
-  roomLiving.value = true;
-  handlePlay(item.live_room!);
+  // roomLiving.value = true;
+  appStore.liveRoomInfo = item;
+  handlePlay(item);
 }
 }
 
 
 function changeLiveRoom(item: ILive) {
 function changeLiveRoom(item: ILive) {
-  if (item.id === currentLiveRoom.value?.id) return;
+  if (item.id === appStore.liveRoomInfo?.id) return;
   if (
   if (
     ![
     ![
       LiveRoomTypeEnum.wertc_live,
       LiveRoomTypeEnum.wertc_live,
@@ -460,7 +459,7 @@ function changeLiveRoom(item: ILive) {
   ) {
   ) {
     appStore.setLiveLine(LiveLineEnum.hls);
     appStore.setLiveLine(LiveLineEnum.hls);
   }
   }
-  playLive(item);
+  playLive(item.live_room!);
 }
 }
 
 
 async function getLiveRoomList() {
 async function getLiveRoomList() {
@@ -478,8 +477,8 @@ async function getLiveRoomList() {
       topLiveRoomList.value = res.data.rows.slice(0, topNums.value);
       topLiveRoomList.value = res.data.rows.slice(0, topNums.value);
       otherLiveRoomList.value = res.data.rows.slice(topNums.value);
       otherLiveRoomList.value = res.data.rows.slice(topNums.value);
       if (res.data.total) {
       if (res.data.total) {
-        currentLiveRoom.value = topLiveRoomList.value[0];
         roomLiving.value = true;
         roomLiving.value = true;
+        appStore.liveRoomInfo = topLiveRoomList.value[0].live_room;
       }
       }
     }
     }
   } catch (error) {
   } catch (error) {

+ 21 - 39
src/views/pull/index.vue

@@ -270,9 +270,7 @@
           <template v-if="item.msg_type === DanmuMsgTypeEnum.reward">
           <template v-if="item.msg_type === DanmuMsgTypeEnum.reward">
             <div class="reward">
             <div class="reward">
               <span>[{{ formatTimeHour(item.send_msg_time!) }}]</span>
               <span>[{{ formatTimeHour(item.send_msg_time!) }}]</span>
-              <span>
-                {{ item.user?.username }} 打赏了{{ item.content }}!
-              </span>
+              <span> {{ item.user?.username }}打赏了{{ item.content }}!</span>
             </div>
             </div>
           </template>
           </template>
           <template v-if="item.msg_type === DanmuMsgTypeEnum.danmu">
           <template v-if="item.msg_type === DanmuMsgTypeEnum.danmu">
@@ -280,31 +278,21 @@
               >[{{ formatTimeHour(item.send_msg_time!) }}]</span
               >[{{ formatTimeHour(item.send_msg_time!) }}]</span
             >
             >
             <span class="name">
             <span class="name">
-              <span v-if="item.user && userStore.userInfo?.id === item.user.id">
-                <span>{{ item.user.username }}</span>
-                <span>
-                  [{{ item.user.roles?.map((v) => v.role_name).join() }}]
-                </span>
-              </span>
               <Dropdown
               <Dropdown
-                trigger="click"
+                trigger="hover"
                 positon="left"
                 positon="left"
-                v-else-if="item.user"
               >
               >
                 <template #btn>
                 <template #btn>
-                  <span>{{ item.user.username }}</span>
-                  <span>
-                    [{{ item.user.roles?.map((v) => v.role_name).join() }}]
-                  </span>
+                  <span>{{ item.username }}</span>
                 </template>
                 </template>
                 <template #list>
                 <template #list>
                   <div class="list">
                   <div class="list">
-                    <div class="item">{{ item.user.username }}</div>
+                    <div class="item">{{ item.username }}</div>
                     <div
                     <div
                       class="item operator"
                       class="item operator"
                       @click="
                       @click="
                         handleDisableSpeakingUser({
                         handleDisableSpeakingUser({
-                          userId: item.user.id,
+                          userId: item.user?.id,
                         })
                         })
                       "
                       "
                     >
                     >
@@ -314,7 +302,7 @@
                       class="item operator"
                       class="item operator"
                       @click="
                       @click="
                         handleRestoreSpeakingUser({
                         handleRestoreSpeakingUser({
-                          userId: item.user.id,
+                          userId: item.user?.id,
                         })
                         })
                       "
                       "
                     >
                     >
@@ -329,9 +317,8 @@
                   </div>
                   </div>
                 </template>
                 </template>
               </Dropdown>
               </Dropdown>
-              <span v-else>
-                <span>{{ item }}</span>
-                <span>[游客]</span>
+              <span>
+                [{{ item.user?.roles?.map((v) => v.role_name).join() }}]
               </span>
               </span>
             </span>
             </span>
             <span>:</span>
             <span>:</span>
@@ -354,11 +341,11 @@
           </template>
           </template>
           <template v-else-if="item.msg_type === DanmuMsgTypeEnum.otherJoin">
           <template v-else-if="item.msg_type === DanmuMsgTypeEnum.otherJoin">
             <span class="name system">系统通知:</span>
             <span class="name system">系统通知:</span>
-            <span class="msg">{{ item.user?.username }}进入直播! </span>
+            <span class="msg">{{ item.username }}进入直播! </span>
           </template>
           </template>
           <template v-else-if="item.msg_type === DanmuMsgTypeEnum.userLeaved">
           <template v-else-if="item.msg_type === DanmuMsgTypeEnum.userLeaved">
             <span class="name system">系统通知:</span>
             <span class="name system">系统通知:</span>
-            <span class="msg">{{ item.user?.username }}离开直播! </span>
+            <span class="msg">{{ item.username }}离开直播! </span>
           </template>
           </template>
         </div>
         </div>
       </div>
       </div>
@@ -502,7 +489,7 @@ const appStore = useAppStore();
 const networkStore = useNetworkStore();
 const networkStore = useNetworkStore();
 const { t } = useI18n();
 const { t } = useI18n();
 
 
-const roomId = ref('-1');
+const roomId = ref('');
 const anchorInfo = ref<IUser>();
 const anchorInfo = ref<IUser>();
 const configBg = ref();
 const configBg = ref();
 const configVideo = ref();
 const configVideo = ref();
@@ -542,7 +529,8 @@ const {
   damuList,
   damuList,
   liveUserList,
   liveUserList,
   danmuStr,
   danmuStr,
-} = usePull(roomId.value);
+  initRoomId,
+} = usePull();
 
 
 const rtcRtt = computed(() => {
 const rtcRtt = computed(() => {
   const arr: any[] = [];
   const arr: any[] = [];
@@ -584,6 +572,7 @@ const rtcBytesReceived = computed(() => {
 
 
 onMounted(async () => {
 onMounted(async () => {
   roomId.value = route.params.roomId as string;
   roomId.value = route.params.roomId as string;
+  initRoomId(roomId.value);
   initAdsbygoogle();
   initAdsbygoogle();
   await handleFindLiveRoomInfo();
   await handleFindLiveRoomInfo();
   if (!appStore.liveRoomInfo) return;
   if (!appStore.liveRoomInfo) return;
@@ -611,10 +600,9 @@ onMounted(async () => {
         topRef.value.getBoundingClientRect().height);
         topRef.value.getBoundingClientRect().height);
     height.value = res;
     height.value = res;
   }
   }
-  getBg();
   if (route.query.is_bilibili !== '1') {
   if (route.query.is_bilibili !== '1') {
     isBilibili.value = false;
     isBilibili.value = false;
-    initPull({ roomId: roomId.value });
+    initPull({});
   } else {
   } else {
     initWs({
     initWs({
       roomId: roomId.value,
       roomId: roomId.value,
@@ -746,16 +734,7 @@ async function handleHistoryMsg() {
     });
     });
     if (res.code === 200) {
     if (res.code === 200) {
       res.data.rows.forEach((v) => {
       res.data.rows.forEach((v) => {
-        damuList.value.unshift({
-          send_msg_time: v.send_msg_time!,
-          user: v.user,
-          live_room_id: v.live_room_id!,
-          id: v.id!,
-          content: v.content!,
-          content_type: v.content_type!,
-          msg_type: v.msg_type!,
-          redbag_send_id: v.redbag_send_id,
-        });
+        damuList.value.unshift(v);
       });
       });
       if (
       if (
         appStore.liveRoomInfo?.system_msg &&
         appStore.liveRoomInfo?.system_msg &&
@@ -787,11 +766,14 @@ watch(
 
 
 watch(
 watch(
   () => appStore.liveRoomInfo,
   () => appStore.liveRoomInfo,
-  () => {
-    getBg();
+  (newval) => {
+    if (newval) {
+      getBg();
+    }
   },
   },
   {
   {
     deep: true,
     deep: true,
+    immediate: true,
   }
   }
 );
 );
 
 

+ 6 - 24
src/views/push/index.vue

@@ -318,12 +318,9 @@
                   [{{ formatTimeHour(item.send_msg_time!) }}]
                   [{{ formatTimeHour(item.send_msg_time!) }}]
                 </span>
                 </span>
                 <span class="name">
                 <span class="name">
-                  <span v-if="item.user">
-                    {{ item.user.username }}[{{
-                      item.user.roles?.map((v) => v.role_name).join()
-                    }}]
-                  </span>
-                  <span v-else>{{ item }}[游客]</span>
+                  {{ item.username }}[{{
+                    item.user?.roles?.map((v) => v.role_name).join()
+                  }}]
                 </span>
                 </span>
                 <span>:</span>
                 <span>:</span>
                 <span
                 <span
@@ -347,19 +344,13 @@
                 v-else-if="item.msg_type === DanmuMsgTypeEnum.otherJoin"
                 v-else-if="item.msg_type === DanmuMsgTypeEnum.otherJoin"
               >
               >
                 <span class="name system">系统通知:</span>
                 <span class="name system">系统通知:</span>
-                <span class="msg">
-                  <span>{{ item.user?.username }}</span>
-                  <span>进入直播!</span>
-                </span>
+                <span class="msg">{{ item.username }}进入直播!</span>
               </template>
               </template>
               <template
               <template
                 v-else-if="item.msg_type === DanmuMsgTypeEnum.userLeaved"
                 v-else-if="item.msg_type === DanmuMsgTypeEnum.userLeaved"
               >
               >
                 <span class="name system">系统通知:</span>
                 <span class="name system">系统通知:</span>
-                <span class="msg">
-                  <span>{{ item.user?.username }}</span>
-                  <span>离开直播!</span>
-                </span>
+                <span class="msg">{{ item.username }}离开直播!</span>
               </template>
               </template>
             </div>
             </div>
           </div>
           </div>
@@ -1143,16 +1134,7 @@ async function handleHistoryMsg() {
     });
     });
     if (res.code === 200) {
     if (res.code === 200) {
       res.data.rows.forEach((v) => {
       res.data.rows.forEach((v) => {
-        damuList.value.unshift({
-          send_msg_time: v.send_msg_time!,
-          user: v.user,
-          live_room_id: v.live_room_id!,
-          id: v.id!,
-          content: v.content!,
-          content_type: v.content_type!,
-          msg_type: v.msg_type!,
-          redbag_send_id: v.redbag_send_id,
-        });
+        damuList.value.unshift(v);
       });
       });
       if (
       if (
         appStore.liveRoomInfo?.system_msg &&
         appStore.liveRoomInfo?.system_msg &&