diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml new file mode 100644 index 0000000..d6f10a7 --- /dev/null +++ b/.gitea/workflows/deploy.yaml @@ -0,0 +1,43 @@ +name: Deploy To Dev + +on: + push: + branches: + - 'dev' + +jobs: + deploy: + runs-on: gx-dev01 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Copy specific directory to runner's host machine + run: | + TARGET_DIR="./dist" + + # 检查 dist 目录是否存在 + if [ ! -d "$TARGET_DIR" ]; then + echo "Error: The source directory '$TARGET_DIR' does not exist in the repository." + # 如果目录不存在,报错并退出当前步骤 + exit 1 + fi + cp -r ./dist/* /data/xsy-www/ + + - name: Find and restart the app container + run: | + # 1. 使用 docker ps 过滤包含 'xsy-lighttpd' 服务的容器 + # 2. 提取容器 ID 或名称 + CONTAINER_ID=$(docker ps -a --filter "name=xsy-lighttpd" --format "{{.ID}}") + + if [ -z "$CONTAINER_ID" ]; then + echo "Error: Could not find any container matching name 'app1'." + exit 1 + else + echo "Found container ID: $CONTAINER_ID. Restarting..." + # 使用标准的 docker restart 命令 + docker restart "$CONTAINER_ID" + echo "Container restarted successfully." + fi + diff --git a/dist.zip b/dist.zip index bf8d84c..3c3d146 100644 Binary files a/dist.zip and b/dist.zip differ diff --git a/src/layout/components/InviteJoin/index.vue b/src/layout/components/InviteJoin/index.vue index 63b1350..da3a220 100644 --- a/src/layout/components/InviteJoin/index.vue +++ b/src/layout/components/InviteJoin/index.vue @@ -83,8 +83,7 @@ const clickJoin = async () => { inviteDialog.value = false router.push({ path: '/conferencingRoom', - query:{ - type:2,//创建房间,加入房间 2 + query:{ room_uid:socketInformation.value.room_uid } }) diff --git a/src/views/conferencingRoom/components/fileUpload/browseFile.vue b/src/views/conferencingRoom/components/fileUpload/browseFile.vue index b6cd4af..d72a641 100644 --- a/src/views/conferencingRoom/components/fileUpload/browseFile.vue +++ b/src/views/conferencingRoom/components/fileUpload/browseFile.vue @@ -348,8 +348,7 @@ function handleFileUploadMessage(payload, topic){ try { const messageStr = payload.toString() const data = JSON.parse(messageStr) - // emitter.emit('fileUploadStatus') - console.log(data,'data文件转换完成,预览通知') + // emitter.emit('fileUploadStatus') const userId = JSON.parse(sessionStorage.getItem('userData'))?.uid if(dialogFileVisible.value){ dialogFileVisible.value = false @@ -422,7 +421,7 @@ function handlePdfMessage(payload, topic){ case 'converting': break case 'completed': - getConvertedFile(data.task_id) + getConvertedFile(data.task_id,data.room_uid) break case 'failed': break @@ -436,12 +435,12 @@ function handlePdfMessage(payload, topic){ } // 获取转换后的文件 -const getConvertedFile = async (taskId) => { +const getConvertedFile = async (taskId,roomId) => { try { if (!taskId) { throw new Error('任务ID不存在') } - const fileRes = await getConvertStatusApi(taskId,props.roomId) + const fileRes = await getConvertStatusApi(taskId,roomId) } catch (err) { console.error('获取转换文件失败:', err) handleError('获取转换文件失败', err) diff --git a/src/views/conferencingRoom/index.vue b/src/views/conferencingRoom/index.vue index ae2c507..7c4c201 100644 --- a/src/views/conferencingRoom/index.vue +++ b/src/views/conferencingRoom/index.vue @@ -457,6 +457,7 @@ const loading = ref(false); let lastPublishTime = 0; const publishThrottleTime = 100; // 100ms 节流 + // 鼠标状态跟踪 const mouseState = reactive({ isDrawing: false, @@ -1148,8 +1149,9 @@ async function initMqttFilePreview(){ const clientId = `filePreview_${Date.now()}` await mqttClient.connect(clientId) isMqttFilePreview.value = true - // 订阅主题 + // 订阅主题 emitter.emit('subscribeToFilePreviewTopic',{roomId:roomId.value}) + emitter.emit('roomces',{roomId:roomId.value}) } catch (error) { console.error('MQTT连接失败:', error) ElMessage.error('文件上传服务连接失败') @@ -1903,11 +1905,8 @@ function handleRemoteWhiteboardOpen(data) { // 处理远程关闭白板 function handleRemoteWhiteboardClose(data) { - ElMessage.info(`${data.senderName || data.sender} 关闭了白板`); - // if(data.roomType == '1'){ - // isWhiteboardActive.value = false; - // } - //当远程用户关闭白板时,如果本地有屏幕共享,确保屏幕共享重新显示 + ElMessage.info(`${data.senderName || data.sender} 关闭了白板`); + //当远程用户关闭白板时,如果本地有屏幕共享,确保屏幕共享重新显示 nextTick(() => { if (hasActiveScreenShare.value && !isWhiteboardActive.value) { activateLayer('screenVideo',false); @@ -1952,8 +1951,7 @@ async function handleConfirmSelection(userInfo){ function publishWhiteboardMessage(type, payload = {}) { try { const message = { - type, - roomType: route.query.type,//用于判断是参与者还是发起者 + type, roomId: roomId.value, sender: hostUid.value, senderName: hostUid.value, @@ -2115,22 +2113,34 @@ function setupRoomListeners() { } // 事件处理函数 +/** + * 处理房间连接成功事件 + * 1. 初始化房间ID + * 2. 初始化各种MQTT连接(白板、激光笔、文件上传等) + * 3. 更新连接状态 + * 4. 初始化已存在的远程参与者 + */ async function handleConnected() { + // 设置当前房间ID roomId.value = room.name - await initMqtt(); - await initToLaserPointerMqtt(); - await initMqttFileUploadSucc() ; - await initMqttFileConversionStatus(); - await initMqttFilePreview(); - await initMqttEnlargeVideo(); + + // 初始化各种MQTT服务 + await initMqtt(); // 白板MQTT + await initToLaserPointerMqtt(); // 激光笔MQTT + await initMqttFileUploadSucc(); // 文件上传成功MQTT + await initMqttFileConversionStatus(); // 文件转换状态MQTT + await initMqttFilePreview(); // 文件预览MQTT + await initMqttEnlargeVideo(); // 视频放大MQTT + + // 更新连接状态 status.value = false; ElMessage.success('已成功连接到房间'); - // 初始化现有远程参与者 + + // 初始化已存在的远程参与者 room.remoteParticipants.forEach(participant => { - addRemoteParticipant(participant); - setupParticipantListeners(participant); - // 立即检查并更新参与者的轨道状态 - updateParticipantTracks(participant); + addRemoteParticipant(participant); // 添加参与者 + setupParticipantListeners(participant); // 设置监听器 + updateParticipantTracks(participant); // 更新轨道状态 }); } @@ -2838,35 +2848,7 @@ function handleScreenShareEnded() { ElMessage.info('屏幕共享已停止'); // 移除事件监听器 room.localParticipant.off('screenShareEnded', handleScreenShareEnded); -} - -async function joinRoomBtn() { - try { - loading.value = true; // 开始加载 - status.value = true; // 确保显示加载状态 - - const res = await getRoomToken({max_participants: 20}); - if(res.meta.code != 200){ - ElMessage.error(res.meta.message); - loading.value = false; - return; - } - const token = res.data.access_token; - roomName.value = res.data.room.name - if (!token) { - throw new Error('获取 token 失败'); - } - setupRoomListeners(); - await room.connect(wsURL, token, { - autoSubscribe: true, - }); - } catch (error) { - ElMessage.error(`连接失败: ${error.message}`); - status.value = true; - } finally { - loading.value = false; // 无论成功失败都结束加载 - } -} +} // 离开会议函数 async function leaveRoom() { @@ -3105,19 +3087,15 @@ onUnmounted(() => { } }); onMounted(async () => { - if(route.query.type == '1'){ - await joinRoomBtn() - hostUid.value = roomStore.userUid - // 邀请用户参与房间 - if(room.name){ - await getInvite(room.name,{participants:[{user_uid:roomStore.detailUid,display_name:roomStore.detailName}], participant_role: "participant"}) - } - } else { + try { + loading.value = true; // 开始加载 + status.value = true; // 确保显示加载状态 const res = await getTokenApi(route.query.room_uid) if(res.meta.code == 200){ const token = res.data.access_token; hostUid.value = res.data.user_uid - await nextTick(); + roomName.value = res.data.room_name + await nextTick(); setupRoomListeners(); await room.connect(wsURL, token, { autoSubscribe: true, @@ -3125,7 +3103,12 @@ onMounted(async () => { }else{ ElMessage.error(res.meta.message); return; - } + } + } catch (error) { + ElMessage.error(`连接失败: ${error.message}`); + status.value = true; + } finally { + loading.value = false; // 无论成功失败都结束加载 } }); diff --git a/src/views/conferencingRoom/pathTransit.vue b/src/views/conferencingRoom/pathTransit.vue index 6bb0774..c277b17 100644 --- a/src/views/conferencingRoom/pathTransit.vue +++ b/src/views/conferencingRoom/pathTransit.vue @@ -42,7 +42,7 @@