Преглед изворни кода

'视频会议点击关闭摄像头解散房间bug'

hanchaobo пре 2 година
родитељ
комит
f60928153d
3 измењених фајлова са 103 додато и 200 уклоњено
  1. 19
    57
      src/views/components/roomFooter.vue
  2. 0
    1
      src/views/onlyOffice.vue
  3. 84
    142
      src/views/room.vue

+ 19
- 57
src/views/components/roomFooter.vue Прегледај датотеку

@@ -1,75 +1,35 @@
1 1
 <template>
2 2
   <div class="roomFooter">
3 3
     <div class="outRoom">
4
-      <el-button type="danger" @click="exitRoom" v-if="!roleFlag"
5
-        >退出房间</el-button
6
-      >
7
-      <el-button type="danger" @click="exitRoom" v-if="roleFlag"
8
-        >解散房间</el-button
9
-      >
4
+      <el-button type="danger" @click="exitRoom" v-if="!roleFlag">退出房间</el-button>
5
+      <el-button type="danger" @click="exitRoom" v-if="roleFlag">解散房间</el-button>
10 6
     </div>
11 7
     <div class="operation">
12 8
       <div class="mic">
13
-        <img
14
-          class="micImg"
15
-          src="@/assets/mic_on.png"
16
-          alt=""
17
-          v-if="micFlag"
18
-          @click="micClickOn"
19
-        />
20
-        <img
21
-          class="micImg"
22
-          src="@/assets/mic_off.png"
23
-          alt=""
24
-          v-else
25
-          @click="micClickOff"
26
-        />
9
+        <img class="micImg" src="@/assets/mic_on.png" alt="" v-if="micFlag" @click="micClickOn" />
10
+        <img class="micImg" src="@/assets/mic_off.png" alt="" v-else @click="micClickOff" />
27 11
       </div>
28 12
       <div class="video">
29
-        <img
30
-          class="videoImg"
31
-          src="@/assets/video_on.png"
32
-          alt=""
33
-          v-if="videoFlag"
34
-          @click="videoClickOn"
35
-        />
36
-        <img
37
-          class="videoImg"
38
-          src="@/assets/video_off.png"
39
-          alt=""
40
-          v-else
41
-          @click="videoClickOff"
42
-        />
13
+        <img class="videoImg" src="@/assets/video_on.png" alt="" v-if="videoFlag" @click="videoClickOn" />
14
+        <img class="videoImg" src="@/assets/video_off.png" alt="" v-else @click="videoClickOff" />
43 15
       </div>
44 16
       <div class="sharing">
45
-        <img
46
-          class="sharImg"
47
-          src="@/assets/screenShare_on.png"
48
-          alt=""
49
-          v-if="sharFlag"
50
-          @click="sharClickOn"
51
-        />
52
-        <img
53
-          class="sharImg"
54
-          src="@/assets/screenShare_off.png"
55
-          alt=""
56
-          v-else
57
-          @click="sharClickOff"
58
-        />
59
-        
17
+        <img class="sharImg" src="@/assets/screenShare_on.png" alt="" v-if="sharFlag" @click="sharClickOn" />
18
+        <img class="sharImg" src="@/assets/screenShare_off.png" alt="" v-else @click="sharClickOff" />
19
+
60 20
       </div>
61 21
       <div class="mediationPop">
62
-         <el-button type="warning" @click="mediationPop">调解</el-button>
22
+        <el-button type="warning" @click="mediationPop">调解</el-button>
63 23
       </div>
64 24
     </div>
65 25
   </div>
66 26
 </template>
67
-  
68
-  <script>
27
+
28
+<script>
69 29
 import { startVideo, stopVideo, destructionRoom } from "@/api/room.js";
70 30
 export default {
71 31
   name: "Footer",
72
-  props: ["micFlag","videoFlag","sharFlag"],
32
+  props: ["micFlag", "videoFlag", "sharFlag"],
73 33
   components: {},
74 34
   data() {
75 35
     return {
@@ -112,7 +72,7 @@ export default {
112 72
       this.$emit("sharClickOff");
113 73
     },
114 74
     // 弹出调解内容
115
-    mediationPop(){
75
+    mediationPop() {
116 76
       this.$emit("mediationPop");
117 77
     },
118 78
     exitRoom() {
@@ -153,8 +113,8 @@ export default {
153 113
   },
154 114
 };
155 115
 </script>
156
-  
157
-  <style scoped>
116
+
117
+<style scoped>
158 118
 .roomFooter {
159 119
   width: 100%;
160 120
   height: 100%;
@@ -202,9 +162,11 @@ export default {
202 162
   height: 60px;
203 163
   margin-left: 20px;
204 164
 }
205
-.mediationPop{
165
+
166
+.mediationPop {
206 167
   margin-left: 20px;
207 168
 }
169
+
208 170
 .micImg,
209 171
 .videoImg,
210 172
 .sharImg {

+ 0
- 1
src/views/onlyOffice.vue Прегледај датотеку

@@ -35,7 +35,6 @@ export default {
35 35
             }
36 36
             axios.get(`http://121.40.189.20:9090/onlyOfficeConfig/${edit}/${id}/${this.userId}/desktop/true`).then(res => {
37 37
                 this.config = res.data;
38
-                debugger
39 38
                 var docEditor = new DocsAPI.DocEditor("placeholder", this.config);
40 39
             })
41 40
         },

+ 84
- 142
src/views/room.vue Прегледај датотеку

@@ -2,46 +2,25 @@
2 2
   <div class="page">
3 3
     <div class="roompage" @mouseover="mouseHover" v-if="modileFlag">
4 4
       <div class="txtContent">
5
-        <el-tag type="danger" @click="txtContent" v-if="modileFlag"
6
-          >会议内容</el-tag
7
-        >
5
+        <el-tag type="danger" @click="txtContent" v-if="modileFlag">会议内容</el-tag>
8 6
       </div>
9 7
       <div class="content">
10
-        <div
11
-          class="screenShare"
12
-          id="screenShare"
13
-          v-show="screenShareFlag"
14
-        ></div>
8
+        <div class="screenShare" id="screenShare" v-show="screenShareFlag"></div>
15 9
 
16 10
         <div :class="videoList">
17 11
           <div :class="videoClass" id="localStream">
18 12
             <div class="userName">{{ userId }}</div>
19 13
           </div>
20
-          <div
21
-            :class="videoClass"
22
-            v-for="(item, index) in userList"
23
-            :key="index"
24
-            :id="item"
25
-          >
14
+          <div :class="videoClass" v-for="(item, index) in userList" :key="index" :id="item">
26 15
             <div class="userName">{{ item }}</div>
27 16
           </div>
28 17
         </div>
29 18
       </div>
30 19
       <div class="footerList">
31
-        <roomFooter
32
-          @exitRoom="exitRoom"
33
-          @micClickOn="micClickOn"
34
-          @micClickOff="micClickOff"
35
-          @videoClickOn="videoClickOn"
36
-          @videoClickOff="videoClickOff"
37
-          @sharClickOn="sharClickOn"
38
-          @sharClickOff="sharClickOff"
39
-          @mediationPop="mediationPop"
40
-          :roomId="roomId"
41
-          :micFlag="micFlag"
42
-          :videoFlag="videoFlag"
43
-          :sharFlag="sharFlag"
44
-        ></roomFooter>
20
+        <roomFooter @exitRoom="exitRoom" @micClickOn="micClickOn" @micClickOff="micClickOff"
21
+          @videoClickOn="videoClickOn" @videoClickOff="videoClickOff" @sharClickOn="sharClickOn"
22
+          @sharClickOff="sharClickOff" @mediationPop="mediationPop" :roomId="roomId" :micFlag="micFlag"
23
+          :videoFlag="videoFlag" :sharFlag="sharFlag"></roomFooter>
45 24
       </div>
46 25
     </div>
47 26
     <div class="roomPhone" v-if="!modileFlag">
@@ -52,12 +31,7 @@
52 31
         <div :class="userClassPhone" id="localStream">
53 32
           <div class="userNamePhone">{{ userId }}</div>
54 33
         </div>
55
-        <div
56
-          :class="userClassPhone"
57
-          v-for="(item, index) in userList"
58
-          :key="index"
59
-          :id="item"
60
-        >
34
+        <div :class="userClassPhone" v-for="(item, index) in userList" :key="index" :id="item">
61 35
           <div class="userNamePhone">{{ item }}</div>
62 36
         </div>
63 37
       </div>
@@ -156,111 +130,52 @@
156 130
           </div>
157 131
         </div>
158 132
       </div> -->
159
-      <quill-editor
160
-        ref="myQuillEditor"
161
-        v-model="contentValue"
162
-        :options="editorOption"
163
-        @blur="onEditorBlur($event)"
164
-        @focus="onEditorFocus($event)"
165
-        @ready="onEditorReady($event)"
166
-      ></quill-editor>
167
-      <el-button
168
-        class="updataBtn"
169
-        @click="updataClick"
170
-        type="primary"
171
-        :disabled="!updataFlag"
172
-        >确认修改内容</el-button
173
-      >
133
+      <quill-editor ref="myQuillEditor" v-model="contentValue" :options="editorOption" @blur="onEditorBlur($event)"
134
+        @focus="onEditorFocus($event)" @ready="onEditorReady($event)"></quill-editor>
135
+      <el-button class="updataBtn" @click="updataClick" type="primary" :disabled="!updataFlag">确认修改内容</el-button>
174 136
     </el-drawer>
175 137
     <!-- 调解 -->
176 138
     <el-drawer :visible.sync="drawerMediatio" direction="ltr" title="调解内容">
177
-      <div
178
-        style="
139
+      <div style="
179 140
           width: 100%;
180 141
           display: flex;
181 142
           justify-content: space-around;
182 143
           margin-bottom: 10px;
183 144
           margin-top: 20px;
184
-        "
185
-      >
186
-        <el-upload
187
-          ref="upload"
188
-          :limit="1"
189
-          :action="UploadUrl()"
190
-          :headers="headers"
191
-          :data="filedata"
192
-          :on-change="beforeUpload"
193
-          :on-success="handlSuccess"
194
-          :file-list="fileList"
195
-          v-if="appFlag"
196
-        >
197
-          <el-button slot="trigger" size="small" type="primary"
198
-            >申请人上传证据</el-button
199
-          >
145
+        ">
146
+        <el-upload ref="upload" :limit="1" :action="UploadUrl()" :headers="headers" :data="filedata"
147
+          :on-change="beforeUpload" :on-success="handlSuccess" :file-list="fileList" v-if="appFlag">
148
+          <el-button slot="trigger" size="small" type="primary">申请人上传证据</el-button>
200 149
         </el-upload>
201
-        <el-upload
202
-          ref="upload1"
203
-          :limit="1"
204
-          :action="UploadUrl()"
205
-          :headers="headers1"
206
-          :data="filedata1"
207
-          :on-change="beforeUpload1"
208
-          :on-success="handlSuccess1"
209
-          :file-list="fileList1"
210
-          v-if="resFlag"
211
-        >
212
-          <el-button slot="trigger" size="small" type="primary"
213
-            >被申请人上传证据</el-button
214
-          >
150
+        <el-upload ref="upload1" :limit="1" :action="UploadUrl()" :headers="headers1" :data="filedata1"
151
+          :on-change="beforeUpload1" :on-success="handlSuccess1" :file-list="fileList1" v-if="resFlag">
152
+          <el-button slot="trigger" size="small" type="primary">被申请人上传证据</el-button>
215 153
         </el-upload>
216
-        <el-upload
217
-          ref="upload3"
218
-          :limit="1"
219
-          :action="UploadUrl()"
220
-          :headers="headers3"
221
-          :data="filedata3"
222
-          :on-change="beforeUpload3"
223
-          :on-success="handlSuccess3"
224
-          :file-list="fileList3"
225
-          accept=".doc,.docx"
226
-          v-if="updataFlag"
227
-        >
228
-          <el-button slot="trigger" size="small" type="primary"
229
-            >上传调解书</el-button
230
-          >
154
+        <el-upload ref="upload3" :limit="1" :action="UploadUrl()" :headers="headers3" :data="filedata3"
155
+          :on-change="beforeUpload3" :on-success="handlSuccess3" :file-list="fileList3" accept=".doc,.docx"
156
+          v-if="updataFlag">
157
+          <el-button slot="trigger" size="small" type="primary">上传调解书</el-button>
231 158
         </el-upload>
232 159
       </div>
233 160
       <div class="list">
234 161
         <div class="applicant" v-if="applicantFile.length > 0">
235 162
           <div>申请人证据</div>
236
-          <div
237
-            style="color: #104fad; cursor: pointer"
238
-            v-for="(item, index) in applicantFile"
239
-            :key="index"
240
-            @click="preview(item, 0)"
241
-          >
163
+          <div style="color: #104fad; cursor: pointer" v-for="(item, index) in applicantFile" :key="index"
164
+            @click="preview(item, 0)">
242 165
             {{ item.annexName }}
243 166
           </div>
244 167
         </div>
245 168
         <div class="res" v-if="resFile.length > 0">
246 169
           <div>被申请人证据</div>
247
-          <div
248
-            style="color: #104fad; cursor: pointer"
249
-            v-for="(item, index) in resFile"
250
-            :key="index"
251
-            @click="preview(item, 0)"
252
-          >
170
+          <div style="color: #104fad; cursor: pointer" v-for="(item, index) in resFile" :key="index"
171
+            @click="preview(item, 0)">
253 172
             {{ item.annexName }}
254 173
           </div>
255 174
         </div>
256 175
         <div class="mediate" v-if="mediateFile.length > 0">
257 176
           <div>调解书</div>
258
-          <div
259
-            style="color: #104fad; cursor: pointer"
260
-            v-for="(item, index) in mediateFile"
261
-            :key="index"
262
-            @click="preview(item, 1)"
263
-          >
177
+          <div style="color: #104fad; cursor: pointer" v-for="(item, index) in mediateFile" :key="index"
178
+            @click="preview(item, 1)">
264 179
             {{ item.annexName }}
265 180
           </div>
266 181
         </div>
@@ -296,7 +211,7 @@
296 211
 </template>
297 212
 
298 213
 <script>
299
-import { getUsersig, reserveConferenceList,confirmMeetingResult } from "@/api/home";
214
+import { getUsersig, reserveConferenceList, confirmMeetingResult } from "@/api/home";
300 215
 import {
301 216
   secretaryRoleByUserId,
302 217
   htmlToPDF,
@@ -352,11 +267,11 @@ export default {
352 267
       applicantFile: [],
353 268
       resFile: [],
354 269
       mediateFile: [],
355
-      formData:{
356
-        mediaResult:1,
357
-        sealFlag:1
270
+      formData: {
271
+        mediaResult: 1,
272
+        sealFlag: 1
358 273
       },
359
-      caseFlowId:null,
274
+      caseFlowId: null,
360 275
       headers: {
361 276
         // Authorization: "Bearer " + token,
362 277
         Authorization: "",
@@ -532,7 +447,9 @@ export default {
532 447
         }
533 448
         let token = sessionStorage.getItem("token");
534 449
         window.open(
535
-          `http://121.40.189.20:8002/onlyoffice?id=${item.onlyOfficeFileId}&flag=${flag}&token=${token}`,
450
+          // `http://121.40.189.20:8002/onlyoffice?id=${item.onlyOfficeFileId}&flag=${flag}&token=${token}`,
451
+          // "_black"
452
+          `http://localhost:81/onlyoffice?id=${item.onlyOfficeFileId}&flag=${flag}&token=${token}`,
536 453
           "_black"
537 454
         );
538 455
       } else {
@@ -619,8 +536,10 @@ export default {
619 536
       });
620 537
       this.localStreamAsr.stop();
621 538
       await trtc.exitRoom();
622
-      await trtc.updateLocalVideo({ publish: false });
623
-      await trtc.updateLocalAudio({ publish: false });
539
+      // await trtc.updateLocalVideo({ publish: false });
540
+      // await trtc.updateLocalAudio({ publish: false });
541
+      await trtc.stopLocalVideo();
542
+      await trtc.stopLocalAudio();
624 543
       await trtc.destroy();
625 544
       this.$router.push({
626 545
         name: "Home",
@@ -683,30 +602,41 @@ export default {
683 602
         // })
684 603
       });
685 604
     },
605
+    /**主持人解散房间监听事件 */
606
+    exitRoomAll() {
607
+      trtc.on(TRTC.EVENT.KICKED_OUT, event => {
608
+        console.log(event.reason);
609
+        alert("主持人已经解散会议");
610
+        this.$router.push({
611
+          name: "Home",
612
+        });
613
+        this.userList = [];
614
+      });
615
+    },
686 616
     // 删除退出会议人员列表
687 617
     deletePushVideo() {
688 618
       trtc.on(TRTC.EVENT.REMOTE_VIDEO_UNAVAILABLE, (event) => {
689 619
         const streamType = event.streamType;
690 620
         const userId = event.userId;
691 621
         if (streamType == "main") {
692
-          if (this.hostId == userId) {
693
-            alert("主持人已经解散会议");
694
-            this.$router.push({
695
-              name: "Home",
696
-            });
697
-            this.userList = [];
698
-            return;
699
-          }
622
+          // if (this.hostId == userId) {
623
+          //   alert("主持人已经解散会议");
624
+          //   this.$router.push({
625
+          //     name: "Home",
626
+          //   });
627
+          //   this.userList = [];
628
+          //   return;
629
+          // }
700 630
           let deleteIndex = this.userList.indexOf(userId);
701 631
           this.userList = this.userList.filter((item) => item !== userId);
702 632
           if (deleteIndex !== -1) {
703 633
             this.userList.splice(deleteIndex, 1);
704 634
           }
705
-          if (this.modileFlag) {
706
-            // this.userHeight = getHeight(this.userList);
707
-          } else {
708
-            this.userClassPhone = getWidthPhone(this.userList);
709
-          }
635
+          // if (this.modileFlag) {
636
+          //   // this.userHeight = getHeight(this.userList);
637
+          // } else {
638
+          //   this.userClassPhone = getWidthPhone(this.userList);
639
+          // }
710 640
           Object.keys(this.asrList).forEach((key) => {
711 641
             this.asrList[userId].stop();
712 642
           });
@@ -748,25 +678,25 @@ export default {
748 678
         }
749 679
       });
750 680
     },
751
-        // 调解
681
+    // 调解
752 682
     mediationPop() {
753 683
       this.drawerMediatio = true;
754 684
       this.selectByIdFn(this.caseId);
755
-       setInterval(() => {
685
+      setInterval(() => {
756 686
         this.selectByIdFn(this.caseId);
757 687
       }, 8000);
758 688
       this.selectRoleMenuByCaseIdFn(this.caseId);
759 689
       this.getMenuPermsByUserFn();
760 690
     },
761 691
     // 确定会议结果
762
-    determineMeeting(){
692
+    determineMeeting() {
763 693
       let valueMeeting = {
764
-        id:this.caseId,
694
+        id: this.caseId,
765 695
         mediaResult: this.formData.mediaResult,
766
-        sealFlag:this.formData.sealFlag,
767
-        caseFlowId:this.caseFlowId
696
+        sealFlag: this.formData.sealFlag,
697
+        caseFlowId: this.caseFlowId
768 698
       }
769
-      confirmMeetingResult(valueMeeting).then(res=>{
699
+      confirmMeetingResult(valueMeeting).then(res => {
770 700
         if (res.code == 200) {
771 701
           this.$message({
772 702
             message: "确定成功",
@@ -833,6 +763,7 @@ export default {
833 763
     });
834 764
     this.getPushVideo();
835 765
     this.deletePushVideo();
766
+    this.exitRoomAll();
836 767
     try {
837 768
       await trtc.enterRoom({
838 769
         roomId: Number(roomId),
@@ -898,11 +829,13 @@ export default {
898 829
   width: 100%;
899 830
   height: 100vh;
900 831
 }
832
+
901 833
 .content {
902 834
   width: 100%;
903 835
   height: 90%;
904 836
   display: flex;
905 837
 }
838
+
906 839
 .videoList {
907 840
   width: 100%;
908 841
   height: 100%;
@@ -914,6 +847,7 @@ export default {
914 847
   margin-bottom: 20px;
915 848
   position: relative;
916 849
 }
850
+
917 851
 .videoList1 {
918 852
   width: 20%;
919 853
   height: 100%;
@@ -925,6 +859,7 @@ export default {
925 859
   margin-bottom: 20px;
926 860
   position: relative;
927 861
 }
862
+
928 863
 .txtContent {
929 864
   width: 100px;
930 865
   height: 50px;
@@ -941,18 +876,21 @@ export default {
941 876
   background: red;
942 877
   border-radius: 20px;
943 878
 }
879
+
944 880
 .videoItem1 {
945 881
   width: 32%;
946 882
   height: 32%;
947 883
   background: red;
948 884
   border-radius: 20px;
949 885
 }
886
+
950 887
 .videoItem3 {
951 888
   width: 48%;
952 889
   height: 100%;
953 890
   background: red;
954 891
   border-radius: 20px;
955 892
 }
893
+
956 894
 .videoItem2 {
957 895
   width: 90%;
958 896
   height: 25%;
@@ -970,11 +908,13 @@ export default {
970 908
   bottom: 0;
971 909
   z-index: 10;
972 910
 }
911
+
973 912
 .screenShare {
974 913
   width: 80%;
975 914
   height: 100%;
976 915
   background: yellow;
977 916
 }
917
+
978 918
 .userName {
979 919
   border-radius: 10px;
980 920
   width: 90px;
@@ -988,11 +928,13 @@ export default {
988 928
   z-index: 9;
989 929
   color: #ffffff;
990 930
 }
931
+
991 932
 .footerList {
992 933
   width: 100%;
993 934
   height: 10%;
994 935
   background: green;
995 936
 }
937
+
996 938
 .userNamePhone {
997 939
   border-radius: 10px;
998 940
   min-width: 20%;