SanHQin hace 18 horas
padre
commit
0a6b09e6f7

+ 1 - 1
dist/index.html

@@ -37,7 +37,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.d644dee7e1ff6773cfdd72140f3d16fc.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.23ea04dc469b57e2b4f8.js></script><script type=text/javascript src=./static/js/vendor.2c492f3d5a39df08f4a3.js></script><script type=text/javascript src=./static/js/app.46d98d884b3e26679c38.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.9da04959e695ba26355b9e8d46d67dc2.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.23ea04dc469b57e2b4f8.js></script><script type=text/javascript src=./static/js/vendor.2c492f3d5a39df08f4a3.js></script><script type=text/javascript src=./static/js/app.8b652defbb7f2b1f812c.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/css/app.9da04959e695ba26355b9e8d46d67dc2.css


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/css/app.9da04959e695ba26355b9e8d46d67dc2.css.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/css/workPage.8f80ba644312281cacfc720d32708c43.css


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/css/workPage.8f80ba644312281cacfc720d32708c43.css.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/js/app.8b652defbb7f2b1f812c.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/js/app.8b652defbb7f2b1f812c.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/js/manifest.23ea04dc469b57e2b4f8.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/js/workPage-manifest.2ece51fa34be51c8610a.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/js/workPage.c578c661f45812eadff0.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/js/workPage.c578c661f45812eadff0.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/js/workPage.e04327f29aab77cb1437.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/js/workPage.e04327f29aab77cb1437.js.map


+ 1 - 1
dist/workPage.html

@@ -1,4 +1,4 @@
-<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>工作页面 - CocoFlow</title><link rel=icon href=../static/logo.ico><link href=./static/css/workPage.3bd38670d47d99120a88e1a42ebe9acd.css rel=stylesheet></head><body><noscript><strong>We're sorry but this app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script type=text/javascript src=./static/js/workPage-manifest.2ece51fa34be51c8610a.js></script><script type=text/javascript src=./static/js/workPage-vendor.7b6275e4cf468b42a92b.js></script><script type=text/javascript src=./static/js/workPage.c578c661f45812eadff0.js></script></body></html><script>function stopSafari() {
+<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>工作页面 - CocoFlow</title><link rel=icon href=../static/logo.ico><link href=./static/css/workPage.8f80ba644312281cacfc720d32708c43.css rel=stylesheet></head><body><noscript><strong>We're sorry but this app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script type=text/javascript src=./static/js/workPage-manifest.2ece51fa34be51c8610a.js></script><script type=text/javascript src=./static/js/workPage-vendor.7b6275e4cf468b42a92b.js></script><script type=text/javascript src=./static/js/workPage.e04327f29aab77cb1437.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

+ 84 - 79
src/components/pages/workPage/components/kwlPage.vue

@@ -10,7 +10,10 @@
         <div class="kwlHeaderRight" @click="showHowTo = !showHowTo">
           <span>{{ lang.ssKWLHowTo }}</span>
           <i :class="['kwlArrow', { 'kwlArrowUp': showHowTo }]">
-            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="w-4 h-4 transition-transform "><polyline points="6 9 12 15 18 9"></polyline></svg>
+            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+              class="w-4 h-4 transition-transform ">
+              <polyline points="6 9 12 15 18 9"></polyline>
+            </svg>
           </i>
         </div>
       </div>
@@ -50,20 +53,14 @@
     </div>
 
     <!-- 视频全屏播放弹窗 -->
-    <el-dialog
-      :visible.sync="videoDialogVisible"
-      :append-to-body="true"
-      :show-close="true"
-      custom-class="kwlVideoDialog"
-      width="80%"
-      @closed="onVideoDialogClosed"
-    >
+    <el-dialog :visible.sync="videoDialogVisible" :append-to-body="true" :show-close="true"
+      custom-class="kwlVideoDialog" width="80%" @closed="onVideoDialogClosed">
       <div class="kwlVideoDialogBody" v-if="currentVideoUrl">
         <video :src="currentVideoUrl" controls autoplay class="kwlVideoFull"></video>
       </div>
     </el-dialog>
 
-    <!-- KWL 三列 
+    <!-- KWL 三列
             @keyup.enter="addItem('know')"
      -->
     <div class="kwlColumns">
@@ -80,11 +77,8 @@
           </div>
         </div>
         <div class="kwlAddRow">
-          <input
-            v-model="newKnow"
-            class="kwlInput"
-            :placeholder="work.kplaceholder ? work.kplaceholder : lang.ssKWLAddPlaceholder"
-          />
+          <input v-model="newKnow" class="kwlInput"
+            :placeholder="work.kplaceholder ? work.kplaceholder : lang.ssKWLAddPlaceholder" />
           <button class="kwlAddBtn kwlAddBtnKnow" @click="addItem('know')">+</button>
         </div>
       </div>
@@ -104,11 +98,8 @@
           </div>
         </div>
         <div class="kwlAddRow">
-          <input
-            v-model="newWant"
-            class="kwlInput"
-            :placeholder="work.wplaceholder ? work.wplaceholder : lang.ssKWLAddPlaceholder"
-          />
+          <input v-model="newWant" class="kwlInput"
+            :placeholder="work.wplaceholder ? work.wplaceholder : lang.ssKWLAddPlaceholder" />
           <button class="kwlAddBtn kwlAddBtnWant" @click="addItem('want')">+</button>
         </div>
       </div>
@@ -128,11 +119,8 @@
           </div>
         </div>
         <div class="kwlAddRow">
-          <input
-            v-model="newLearned"
-            class="kwlInput"
-            :placeholder="work.lplaceholder ? work.lplaceholder : lang.ssKWLAddPlaceholder"
-          />
+          <input v-model="newLearned" class="kwlInput"
+            :placeholder="work.lplaceholder ? work.lplaceholder : lang.ssKWLAddPlaceholder" />
           <button class="kwlAddBtn kwlAddBtnLearn" @click="addItem('learned')">+</button>
         </div>
       </div>
@@ -142,18 +130,11 @@
     <div class="kwlCard kwlReflection" v-if="isShowReflection">
       <div class="kwlRefTitle">{{ lang.ssKWLReflection }}</div>
       <div class="kwlRefAreaWrap">
-        <textarea
-          v-model="work.reflection"
-          class="kwlRefTextarea"
-          :placeholder="lang.ssKWLReflectionPH"
-        ></textarea>
+        <textarea v-model="work.reflection" class="kwlRefTextarea" :placeholder="lang.ssKWLReflectionPH"></textarea>
         <!-- 右下角麦克风按钮:点击开始/停止录音 -->
-        <div
-          class="kwlMicBtn"
-          :class="{ kwlMicBtnActive: recordObj.status == '1' }"
+        <div class="kwlMicBtn" :class="{ kwlMicBtnActive: recordObj.status == '1' }"
           :title="recordObj.status == '1' ? lang.ssKWLStopRec : lang.ssKWLVoiceInput"
-          @click="recordObj.status == '1' ? stopRecord() : startRecord()"
-        >
+          @click="recordObj.status == '1' ? stopRecord() : startRecord()">
           <!-- 录音中:声波动画 -->
           <svg v-if="recordObj.status == '1'" width="18" height="18" viewBox="0 0 120 20">
             <rect x="5" y="5" width="8" :height="10" rx="3" fill="currentColor">
@@ -214,9 +195,9 @@ export default {
         taskDescription: "",
         taskUrl: [],
         showHowTo: false,
-        kplaceholder:"",
-        wplaceholder:"",
-        lplaceholder:"",
+        kplaceholder: "",
+        wplaceholder: "",
+        lplaceholder: "",
         isShowReflection: true
       },
       newKnow: "",
@@ -272,9 +253,9 @@ export default {
             taskDescription: "",
             taskUrl: [],
             showHowTo: false,
-            kplaceholder:"",
-            wplaceholder:"",
-            lplaceholder:"",
+            kplaceholder: "",
+            wplaceholder: "",
+            lplaceholder: "",
             isShowReflection: true
           }, _data);
 
@@ -287,6 +268,11 @@ export default {
     }
   },
   methods: {
+    // 清理 iframe 录音会话(统一清理入口)
+    _cleanupTranscriber(iframe) {
+      iframe.contentWindow.onSessionStopped = null;
+      iframe.contentWindow.window.onRecognizedResult = null;
+    },
     changeWorkData(newValue) {
       const str = JSON.stringify(newValue);
       this.$emit("changeWorkData", str);
@@ -328,16 +314,18 @@ export default {
         this.$message.error(this.lang.ssKWLRecServiceNotReady);
         return;
       }
-      try {
-        if(this.lang.lang == 'com'){
+
+      const startTranscriber = () => {
+        // try {
+        if (this.lang.lang == 'com') {
           iframe.contentWindow.window.document.getElementById(
             "languageOptions"
           ).selectedIndex = 8;
-        }else if(this.lang.lang == 'hk'){
+        } else if (this.lang.lang == 'hk') {
           iframe.contentWindow.window.document.getElementById(
             "languageOptions"
           ).selectedIndex = 4;
-        }else{
+        } else {
           iframe.contentWindow.window.document.getElementById(
             "languageOptions"
           ).selectedIndex = 2;
@@ -358,23 +346,44 @@ export default {
         iframe.contentWindow.ConversationTranscriber();
         this.recordObj.status = "1";
         this.recordObj.startTime = new Date().getTime();
-        setTimeout(() => {
-          navigator.permissions && navigator.permissions.query({ name: 'microphone' }).then(permissionStatus => {
-            if (permissionStatus.state !== "granted") {
-              this.recordObj.status = "0";
-              this.recordObj.loading = false;
-              iframe.contentWindow.onSessionStopped = null;
-              iframe.contentWindow.window.onRecognizedResult = null;
-              this.$message.warning(this.lang.ssKWLNoPermStop);
-              return;
-            }
-          }).catch(() => {});
-        }, 2000);
-      } catch (err) {
-        console.error("startRecord error:", err);
-        this.$message.error(this.lang.ssKWLRecStartFail);
-        this.recordObj.status = "0";
+
+      }
+      // 先通过 getUserMedia 主动请求麦克风权限,避免 ConversationTranscriber
+      // 在浏览器权限弹窗期间被中断导致内部状态异常
+      if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
+        navigator.mediaDevices.getUserMedia({ audio: true })
+          .then(stream => {
+            // 权限已获取,立即释放 stream,让 ConversationTranscriber 自己接管麦克风
+            stream.getTracks().forEach(t => t.stop());
+            startTranscriber();
+          })
+          .catch(() => {
+            // 用户拒绝权限
+            this._cleanupTranscriber(iframe);
+            this.$message.success(this.lang.ssNoPermStop);
+          });
+      } else {
+        // 降级:不支持 getUserMedia 的浏览器直接启动
+        startTranscriber();
       }
+
+
+      setTimeout(() => {
+        navigator.permissions && navigator.permissions.query({ name: 'microphone' }).then(permissionStatus => {
+          if (permissionStatus.state !== "granted") {
+            this.recordObj.status = "0";
+            this.recordObj.loading = false;
+            this._cleanupTranscriber(iframe);
+            this.$message.warning(this.lang.ssKWLNoPermStop);
+            return;
+          }
+        }).catch(() => { });
+      }, 2000);
+      // } catch (err) {
+      //   console.error("startRecord error:", err);
+      //   this.$message.error(this.lang.ssKWLRecStartFail);
+      //   this.recordObj.status = "0";
+      // }
     },
     // 停止录音
     stopRecord() {
@@ -382,20 +391,19 @@ export default {
         this.$message.info(this.lang.ssKWLRecordShort);
         return;
       }
+      const iframe = this.$refs["iframeRef"];
       navigator.permissions && navigator.permissions.query({ name: 'microphone' }).then(permissionStatus => {
         if (permissionStatus.state !== "granted") {
           this.recordObj.status = "0";
           this.recordObj.loading = false;
-          let iframe = this.$refs["iframeRef"];
           if (iframe && iframe.contentWindow) {
-            iframe.contentWindow.onSessionStopped = null;
-            iframe.contentWindow.window.onRecognizedResult = null;
+            this._cleanupTranscriber(iframe);
           }
           this.$message.warning(this.lang.ssKWLNoMicPerm);
           return;
         }
         if (this.recordObj.status == '1' && !this.recordObj.loading) {
-          let iframe = this.$refs["iframeRef"];
+          // let iframe = this.$refs["iframeRef"];
           if (!iframe || !iframe.contentWindow) {
             this.recordObj.status = "0";
             this.recordObj.loading = false;
@@ -416,16 +424,14 @@ export default {
             this.recordObj.status = "0";
             this.recordObj.loading = false;
             this.$message.success(this.lang.ssKWLRecStopped);
-            iframe.contentWindow.onSessionStopped = null;
-            iframe.contentWindow.window.onRecognizedResult = null;
+            this._cleanupTranscriber(iframe);
           };
         } else {
           this.recordObj.status = "0";
           this.recordObj.loading = false;
           let iframe = this.$refs["iframeRef"];
           if (iframe && iframe.contentWindow) {
-            iframe.contentWindow.onSessionStopped = null;
-            iframe.contentWindow.window.onRecognizedResult = null;
+            this._cleanupTranscriber(iframe);
           }
         }
       }).catch(() => {
@@ -433,15 +439,14 @@ export default {
         this.recordObj.loading = false;
         let iframe = this.$refs["iframeRef"];
         if (iframe && iframe.contentWindow) {
-          iframe.contentWindow.onSessionStopped = null;
-          iframe.contentWindow.window.onRecognizedResult = null;
+          this._cleanupTranscriber(iframe);
         }
         this.$message.success(this.lang.ssKWLRecStopped);
       });
     }
   },
-  mounted() {},
-  beforeUnmount() {}
+  mounted() { },
+  beforeUnmount() { }
 };
 </script>
 
@@ -658,17 +663,17 @@ export default {
 }
 
 /* 视频全屏弹窗 */
-.kwlVideoDialog >>> .el-dialog {
+.kwlVideoDialog>>>.el-dialog {
   background: transparent;
   box-shadow: none;
 }
 
-.kwlVideoDialog >>> .el-dialog__header {
+.kwlVideoDialog>>>.el-dialog__header {
   padding: 0;
   margin: 0;
 }
 
-.kwlVideoDialog >>> .el-dialog__headerbtn {
+.kwlVideoDialog>>>.el-dialog__headerbtn {
   top: -2.5rem;
   right: -2.5rem;
   width: 2.5rem;
@@ -678,17 +683,17 @@ export default {
   z-index: 10;
 }
 
-.kwlVideoDialog >>> .el-dialog__close {
+.kwlVideoDialog>>>.el-dialog__close {
   color: #fff;
   font-size: 1.5rem;
 }
 
-.kwlVideoDialog >>> .el-dialog__body {
+.kwlVideoDialog>>>.el-dialog__body {
   padding: 0;
   background: transparent;
 }
 
-.kwlVideoDialog >>> .el-dialog__headerbtn:hover .el-dialog__close {
+.kwlVideoDialog>>>.el-dialog__headerbtn:hover .el-dialog__close {
   color: #fff;
 }
 

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio