From d9e812fbb1e1873757d8edf7938da56cab7cd8ad Mon Sep 17 00:00:00 2001 From: 龚焕茏 <2842157468@qq.com> Date: 星期五, 09 八月 2024 17:00:02 +0800 Subject: [PATCH] feat:通过Websocket根据教师会议命令执行操作 --- src/views/meet/index.vue | 113 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 89 insertions(+), 24 deletions(-) diff --git a/src/views/meet/index.vue b/src/views/meet/index.vue index 90bdb15..35a13e0 100644 --- a/src/views/meet/index.vue +++ b/src/views/meet/index.vue @@ -9,7 +9,7 @@ <el-row :gutter="5"> <el-col :span="12"> <el-input placeholder="鎼滅储瀛﹀憳" size="small" clearable @input="getStudentList" @clear="getStudentList" - v-model="searchForm.keyword"/> + v-model="searchForm.keyword" /> </el-col> <el-col :span="2"> <el-button type="primary" size="small" @click="getStudentList">鎼滅储</el-button> @@ -19,18 +19,29 @@ <el-tab-pane label="鍦ㄧ嚎瀛﹀憳" name="1"></el-tab-pane> <el-tab-pane label="绂荤嚎瀛﹀憳" name="0"></el-tab-pane> </el-tabs> - <el-row :gutter="20" v-for="student in showStudentList" :key="student.id" class="student-row"> - <el-col :span="18"> - <div> - {{ student.realName }} - </div> - </el-col> - <el-col :span="6"> - <div :class="{online: student.onlineStatus === 1, outline: student.onlineStatus === 0}"> - {{ getStatus(student.onlineStatus) }} - </div> - </el-col> - </el-row> + <el-table :data="showStudentList" style="width: 100%"> + <el-table-column prop="realName" label="瀛﹀憳濮撳悕"></el-table-column> + <el-table-column prop="id" label="鎿嶄綔" width="80px;"> + <template slot-scope="scope"> + <el-dropdown trigger="click" @command="handleCommand"> + <i class="el-icon-more-outline" id="more"></i> + <el-dropdown-menu slot="dropdown"> + <el-dropdown-item :command="{ command: 'openCamera', id: scope.row.id }">鎵撳紑鎽勫儚澶�</el-dropdown-item> + <el-dropdown-item :command="{ command: 'mute', id: scope.row.id }">闈欓煶</el-dropdown-item> + <el-dropdown-item :command="{ command: 'kickOut', id: scope.row.id }">韪㈠嚭</el-dropdown-item> + </el-dropdown-menu> + </el-dropdown> + </template> + </el-table-column> + <el-table-column prop="onlineStatus" label="鐘舵��" width="80px;"> + <template slot-scope="scope"> + <div :class="{ online: scope.row.onlineStatus === 1, outline: scope.row.onlineStatus === 0 }"> + {{ getStatus(scope.row.onlineStatus) }} + </div> + </template> + </el-table-column> + </el-table> + <el-button class="link-left" type="primary" size="small" @click="muteEveryone">鍏ㄤ綋闈欓煶</el-button> </el-row> </div> </div> @@ -39,10 +50,10 @@ <script> import { getStudentList } from '@/api/meet' - export default { - data () { + data() { return { + ws: null, jitsiApi: null, width: 0, height: 0, @@ -60,34 +71,77 @@ showStudentList: [] } }, + beforeDestroy() { + if (this.ws) { + this.ws.close(); + } + }, methods: { - hiddenStudent () { + muteEveryone() { + this.jitsiApi.executeCommand('muteEveryone', 'video'); + }, + handleCommand(command) { + this.sendMessage(JSON.stringify(command)) + }, + initWebSocket() { + this.ws = new WebSocket('ws://127.0.0.1:8000/websocket/' + 1); + let ws = this.ws; + ws.onopen = () => { + console.log('WebSocket 杩炴帴鎴愬姛'); + // 鍙戦�佸績璺虫暟鎹� + ws.send('ping'); + }; + ws.onmessage = (event) => { + console.log('鏀跺埌鏈嶅姟鍣ㄦ秷鎭�:', event.data); + // 澶勭悊鏈嶅姟鍣ㄥ彂鏉ョ殑娑堟伅 + }; + ws.onerror = (error) => { + console.error('WebSocket 杩炴帴鍑洪敊:', error); + }; + ws.onclose = () => { + console.log('WebSocket 杩炴帴宸插叧闂�'); + // 鍙互鍦ㄨ繖閲屽皾璇曢噸鏂拌繛鎺� + }; + + // 缁勪欢閿�姣佹椂鏂紑 WebSocket 杩炴帴 + this.$once('hook:beforeDestroy', () => { + ws.close(); + }); + }, + sendMessage(message) { + if (this.ws.readyState === WebSocket.OPEN) { + this.ws.send(message); + } else { + console.error('WebSocket 杩炴帴鏈墦寮�'); + } + }, + hiddenStudent() { this.showStudent = !this.showStudent }, - changeJitsiWindowSize (width, height) { + changeJitsiWindowSize(width, height) { this.jitsiApi.resizeLargeVideo(width, height) }, - getShowText () { + getShowText() { if (this.showStudent) { return '闅愯棌' } else { return '鏄剧ず' } }, - getStatus (status) { + getStatus(status) { if (status === 1) { return '鍦ㄧ嚎' } else if (status === 0) { return '绂荤嚎' } }, - handleTabChange (tab) { + handleTabChange(tab) { let status = parseInt(tab.name) this.showStudentList = this.studentList.filter(student => { return student.onlineStatus === status }) }, - getStudentList () { + getStudentList() { let params = { keyword: this.searchForm.keyword } @@ -98,7 +152,7 @@ }) }) }, - getRoomInfo () { + getRoomInfo() { this.jitsiApi.getRoomsInfo().then(rooms => { rooms.rooms.forEach(room => { // 鎴块棿鐨刬d鏄竴涓瓙鍩熷悕锛屼笖@绗﹀墠鐨勪細璁悕绉版槸缁忚繃URL缂栫爜鐨� @@ -128,7 +182,7 @@ }) } }, - mounted () { + mounted() { this.height = window.innerHeight this.meetId = this.$route.query.meetId this.getStudentList() @@ -209,8 +263,11 @@ this.intervalId = setInterval(() => { this.getRoomInfo() }, 2500) + + // 鍒濆鍖� + this.initWebSocket(); }, - beforeDestroy () { + beforeDestroy() { // 娓呴櫎瀹氭椂鍣紝閬垮厤鍐呭瓨娉勬紡 if (this.intervalId) { clearInterval(this.intervalId) @@ -222,6 +279,14 @@ </script> <style lang="scss" scoped> +/deep/ thead { + display: none; +} + +#more:hover { + cursor: pointer; +} + #meet { height: 100%; } -- Gitblit v1.8.0