SanHQin 2 miesięcy temu
rodzic
commit
83ca4b18cb

+ 1 - 1
dist/index.html

@@ -32,7 +32,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.8fef3d6628848e770ee4a44e723a1907.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.161e82026ac2ae03ab6f.js></script><script type=text/javascript src=./static/js/vendor.bb486323f0fa002ba2e7.js></script><script type=text/javascript src=./static/js/app.4fc95c35e24683448ff2.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.520407e4eec62f8d5639f41f7247ef24.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.161e82026ac2ae03ab6f.js></script><script type=text/javascript src=./static/js/vendor.bb486323f0fa002ba2e7.js></script><script type=text/javascript src=./static/js/app.30a69fb10f4c7b7a5af6.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

Plik diff jest za duży
+ 0 - 0
dist/static/css/app.520407e4eec62f8d5639f41f7247ef24.css


Plik diff jest za duży
+ 0 - 0
dist/static/css/app.520407e4eec62f8d5639f41f7247ef24.css.map


Plik diff jest za duży
+ 0 - 0
dist/static/js/app.30a69fb10f4c7b7a5af6.js


Plik diff jest za duży
+ 0 - 0
dist/static/js/app.30a69fb10f4c7b7a5af6.js.map


Plik diff jest za duży
+ 0 - 0
dist/static/js/manifest.161e82026ac2ae03ab6f.js.map


+ 4 - 2
src/components/pages/classroomObservation/dialog/batchCreationClassDialog.vue

@@ -434,7 +434,7 @@ export default {
             const params = [
               {
                 remarks: data.remarks,
-                status: data.status,
+                status: "3",
                 json: JSON.stringify(data.jsonData),
                 batch: data.batch,
                 createId: data.createId,
@@ -465,7 +465,7 @@ export default {
         .then(res => {
           this.$message.success("创建成功");
           if(!this.dataList.find(i =>i.status == 1)){
-            this.startTask(this.dataList.find(i =>i.status == 0).id);
+            this.startTask(this.dataList.find(i =>i.status === "0").id);
           }
         })
         .catch(err => {
@@ -1292,6 +1292,7 @@ export default {
   height: 100%;
   display: flex;
   align-items: center;
+  overflow-y: hidden;
 }
 
 .b_n_left > span {
@@ -1304,6 +1305,7 @@ export default {
   cursor: pointer;
   transition: 0.3s;
   font-size: 16px;
+  white-space: nowrap;
 }
 
 .b_n_left > span:hover {

+ 106 - 3
src/components/pages/classroomObservation/dialog/uploadFileToCreateClassDialog.vue

@@ -212,6 +212,7 @@ export default {
         url: data.Location,
         type: _type,
         size: size,
+        duration: this.fileList.find(i => i.index == res.index).duration,
         fileObj:this.fileList.find(i => i.index == res.index).fileObj,
       };
       this.fileList.find(i => i.index == res.index).status = "success";
@@ -227,7 +228,7 @@ export default {
         console.log("上传完成");
       }
     },
-    addFile() {
+    async addFile() {
       let input = document.createElement("input");
       input.type = "file";
       input.accept = "video/mp4, audio/wav, audio/x-m4a, audio/mpeg, text/plain";
@@ -236,7 +237,7 @@ export default {
 
       input.click();
 
-      input.addEventListener("change", e => {
+      input.addEventListener("change", async e => {
         let files = e.target.files;
         console.log(files)
         for (let i = 0; i < files.length; i++) {
@@ -244,6 +245,9 @@ export default {
           if (
             ["video/mp4", "audio/wav", "audio/x-m4a", "text/plain","audio/mpeg"].includes(files[i].type)
           ) {
+            if(files[i].type==='audio/wav'){
+              files[i].name = files[i].name.toLowerCase();
+            }
             this.fileList.push({
               file: files[i],
               index: uuidv4(),
@@ -272,6 +276,26 @@ export default {
             });
           }
         }
+
+        if(this.fileList.length>0){
+          console.log("获取音频时长")
+          for(let i = 0;i<this.fileList.length;i++){
+            console.log(this.fileList[i])
+            if(["audio/wav", "audio/x-m4a","audio/mpeg"].includes(this.fileList[i].type)){
+              try {
+                let _time = await this.getAudioDuration(this.fileList[i].file);
+                this.fileList[i].duration = this.updateRecordedTimeMixin({duration:_time.toFixed(2)});
+                console.log(`音频时长:${this.updateRecordedTimeMixin({duration:_time.toFixed(2)})}`)
+              } catch (error) {
+                console.log(error)
+                continue
+              }
+
+            }else{
+              continue;
+            }
+          }
+        }
       });
     },
     async getTemplateData() {
@@ -309,7 +333,86 @@ export default {
       } catch (error) {
         console.log("获取模板失败");
       }
-    }
+    },
+    //获取音频文件的时长
+    async getAudioDuration(file) {
+      // 方法1:使用 <audio> 元素(更快更轻量)
+      const mediaElementMethod = () =>
+        new Promise((resolve, reject) => {
+          const audio = document.createElement("audio");
+          const url = URL.createObjectURL(file);
+
+          audio.preload = "metadata";
+          audio.src = url;
+
+          const cleanup = () => {
+            URL.revokeObjectURL(url);
+            audio.remove();
+          };
+
+          audio.onloadedmetadata = () => {
+            if (isFinite(audio.duration) && audio.duration > 0) {
+              cleanup();
+              resolve(audio.duration);
+            } else {
+              reject(new Error("无法通过元数据获取时长"));
+            }
+          };
+
+          audio.onerror = () => {
+            cleanup();
+            reject(new Error("音频加载错误"));
+          };
+
+          // iOS Safari 兼容处理
+          audio.load();
+          document.body.appendChild(audio);
+        });
+
+      // 方法2:使用 Web Audio API(更精确但更耗资源)
+      const webAudioMethod = () =>
+        new Promise((resolve, reject) => {
+          const reader = new FileReader();
+
+          reader.onload = async () => {
+            try {
+              const audioContext = new (window.AudioContext ||
+                window.webkitAudioContext)();
+              const buffer = await audioContext.decodeAudioData(reader.result);
+              resolve(buffer.duration);
+            } catch (e) {
+              reject(new Error("音频解码失败: " + e.message));
+            }
+          };
+
+          reader.onerror = () => reject(new Error("文件读取失败"));
+          reader.readAsArrayBuffer(file);
+        });
+
+      // 优先尝试快速方法,失败时回退到精确方法
+      try {
+        return await mediaElementMethod();
+      } catch (firstError) {
+        console.warn("快速方法失败:", firstError.message, "尝试精确方法...");
+        try {
+          return await webAudioMethod();
+        } catch (secondError) {
+          throw new Error(`所有方法均失败: ${firstError.message} > ${secondError.message}`);
+        }
+      }
+    },
+    //时间
+    updateRecordedTimeMixin({ duration }) {
+      // 更新currentTime,将秒数转换为时分秒格式
+      let hours = Math.floor(duration / 3600);
+      let minutes = Math.floor((duration % 3600) / 60);
+      let seconds = Math.floor(duration % 60);
+      return `${hours
+        .toString()
+        .padStart(2, "0")}:${minutes
+          .toString()
+          .padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`;
+    },
   }
 };
 </script>

+ 16 - 3
src/components/pages/classroomObservation/newComponents/batchClassCard.vue

@@ -29,7 +29,11 @@
                 @click="editBaseMessage"
               />
             </div>
-            <span>{{ cardData.create_at }}</span>
+            <span>
+              <div>{{ cardData.create_at }}</div>
+              <span v-if="cardData.jsonData.fileData && cardData.jsonData.fileData.duration"></span>
+              <div v-if="cardData.jsonData.fileData && cardData.jsonData.fileData.duration">{{ cardData.jsonData.fileData.duration }}</div>
+            </span>
           </div>
         </div>
         <div class="bcc_r_t_right">
@@ -161,7 +165,7 @@ export default {
         id: "1",
         name: "文件名称文件名称文件名称",
         create_at: "2025-05-07 16.05.03",
-        remarks: "备注1",
+        remarks: "",
         status: "0",
         jsonData: {
           baseMessage: {
@@ -458,10 +462,19 @@ export default {
 .bcc_r_t_l_message > span {
   margin-top: 10px;
   font-size: 14px;
-  display: block;
+  display: flex;
+  align-items: center;
   color: rgba(150, 155, 163, 1);
 }
 
+.bcc_r_t_l_message > span>span{
+  width: 2px;
+  height: 12px;
+  display: block;
+  background-color: #CBCBCB;
+  margin: 0 10px;
+}
+
 .bcc_r_bottom {
   width: 100%;
   display: flex;

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików