Kaynağa Gözat

Merge branch 'master' of http://60.205.254.193:3000/GCLS/GCLS_Page_Exercise

dusenyao 1 yıl önce
ebeveyn
işleme
d920ae7da7

+ 2 - 2
src/views/exercise_questions/create/components/common/AudioPlay.vue

@@ -215,13 +215,13 @@ export default {
 
     .audio-time {
       min-width: 35px;
-      font-size: 12px;
+      font-size: 14px;
       font-weight: 400;
       line-height: 20px;
     }
 
     .audio-slider {
-      width: 82px;
+      width: 76px;
 
       :deep .el-slider__runway {
         height: 4px;

+ 1 - 0
src/views/exercise_questions/create/components/exercises/RepeatQuestion.vue

@@ -268,6 +268,7 @@ export default {
             setTimeout(() => {
               document.getElementsByClassName('repeat-richtext')[i].innerText =
                 this.matically_pinyin_obj[this.data.option_list[i].mark];
+              this.data.option_list[i].content = this.matically_pinyin_obj[this.data.option_list[i].mark];
             }, 100);
           }
         }

+ 0 - 1
src/views/exercise_questions/preview/EssayQuestionPreview.vue

@@ -30,7 +30,6 @@
       file-type-name="文件"
       :upload-type="'*'"
       :file-id-list="answer.answer_list[0].accessory_file_id_list"
-      upload-title="上传附件:"
       :disabled="disabled"
       @upload="handleUpload"
       @deleteFile="handleDelete"

+ 4 - 1
src/views/exercise_questions/preview/SortPreview.vue

@@ -261,7 +261,7 @@ export default {
       column-gap: 16px;
       align-items: center;
       max-width: 800px;
-      margin-bottom: 8px;
+      margin-bottom: 16px;
       cursor: move;
 
       &.error {
@@ -286,17 +286,20 @@ export default {
 
       :deep p {
         margin: 0;
+        text-align: justify;
       }
     }
 
     &-horizontal {
       > span {
         display: flex;
+        flex-wrap: wrap;
         column-gap: 8px;
       }
 
       .drag-item {
         display: block;
+        margin-bottom: 8px;
       }
 
       .drag-content {

+ 30 - 11
src/views/exercise_questions/preview/WordCardPreview.vue

@@ -27,28 +27,35 @@
       <div class="words-right">
         <template v-for="(item, index) in option_list">
           <div v-if="index === active_index" :key="index" class="strock-box">
-            <div v-if="item.audio_file_id || item.pinyin" class="pinyin-box">
-              <AudioPlay v-if="item.audio_file_id" :file-id="item.audio_file_id" theme-color="white" />
-              <span class="pinyin">{{ item.pinyin }}</span>
-            </div>
             <div v-if="item.hz_strokes_list && item.hz_strokes_list.length > 0" class="strock-left">
-              <template v-for="(items, indexs) in item.hz_strokes_list">
+              <div v-for="(items, indexs) in item.hz_strokes_list" :key="indexs + '_' + index">
+                <span class="pinyin">{{
+                  item.pinyin_list && item.pinyin_list[indexs] ? item.pinyin_list[indexs] : ''
+                }}</span>
                 <Strockplayredline
                   v-if="items"
-                  :key="indexs"
                   :play-storkes="true"
                   :book-text="items.hz"
                   :target-div="'pre' + items.hz + indexs + active_index"
                   :book-strokes="items.strokes"
                   :class="['strock-chinese', indexs !== item.hz_strokes_list.length - 1 ? 'border-right-none' : '']"
                 />
-              </template>
+              </div>
+              <div v-if="item.audio_file_id" class="pinyin-box">
+                <AudioPlay v-if="item.audio_file_id" :file-id="item.audio_file_id" theme-color="white" />
+              </div>
             </div>
           </div>
         </template>
         <el-divider />
         <div v-if="option_list[active_index]" class="content-box">
-          <span v-if="option_list[active_index].definition_preview.length > 0" class="tips">释义:</span>
+          <span
+            v-if="
+              option_list[active_index].definition_preview.length > 0 && option_list[active_index].definition_preview[0]
+            "
+            class="tips"
+            >释义:</span
+          >
           <p v-for="(itemd, indexd) in option_list[active_index].definition_preview" :key="indexd" class="definition">
             {{ itemd }}
           </p>
@@ -56,7 +63,13 @@
           <p v-if="option_list[active_index].collocation" class="definition">
             {{ option_list[active_index].collocation }}
           </p>
-          <span v-if="option_list[active_index].example_sentence.length > 0" class="tips">例句:</span>
+          <span
+            v-if="
+              option_list[active_index].example_sentence.length > 0 && option_list[active_index].example_sentence[0]
+            "
+            class="tips"
+            >例句:</span
+          >
           <template v-for="(iteme, indexe) in option_list[active_index].example_sentence">
             <p v-if="iteme.trim()" :key="indexe + iteme.trim()" class="example-sentence">
               <span>{{ computeOptionMethods[data.option_number_show_mode](indexe) }} </span>
@@ -118,6 +131,7 @@ export default {
     },
   },
   created() {
+    console.log(this.data);
     // this.handleData();
   },
   mounted() {},
@@ -137,6 +151,7 @@ export default {
           audio_file_id: '',
         };
         item.definition_preview = item.definition.split('\n');
+        item.pinyin_list = item.pinyin.split(' ');
         if (!this.isJudgingRightWrong) {
           this.answer.answer_list.push(obj);
         }
@@ -189,10 +204,12 @@ export default {
     }
 
     .pinyin {
+      display: block;
       font-family: 'League';
       font-size: 16px;
       font-weight: 500;
-      color: #fff;
+      color: #000;
+      text-align: center;
     }
 
     .strock-chinese {
@@ -213,6 +230,7 @@ export default {
 
   .strock-left {
     display: flex;
+    align-items: center;
   }
 
   .pinyin-box {
@@ -220,8 +238,9 @@ export default {
     gap: 4px;
     align-items: center;
     width: max-content;
+    height: 36px;
     padding: 4px 8px;
-    margin-bottom: 10px;
+    margin-left: 16px;
     background: rgba(47, 111, 236, 100%);
     border-radius: 40px;
 

+ 1 - 2
src/views/exercise_questions/preview/WordDictationPreview.vue

@@ -19,8 +19,7 @@
         <div class="card-box">
           <div class="words-info">
             <span>{{ computeOptionMethods[data.option_number_show_mode](index) }} </span>
-            <span class="pinyin">{{ item.pinyin }}</span>
-            <AudioPlay :file-id="item.audio_file_id" theme-color="white" />
+            <AudioPlay v-if="item.audio_file_id" :file-id="item.audio_file_id" theme-color="white" />
           </div>
           <div class="words-dic-box">
             <div v-for="(itemc, indexc) in item.imgArr" :key="indexc" class="words-dic-item">

+ 6 - 1
src/views/exercise_questions/preview/WritePictruePreview.vue

@@ -29,6 +29,7 @@
 
     <div v-if="answer.answer_list[active_index]" class="content-right">
       <el-input
+        class="write-input"
         v-model="answer.answer_list[active_index].text"
         rows="12"
         resize="none"
@@ -49,7 +50,6 @@
         file-type-name="文件"
         :upload-type="'*'"
         :file-id-list="answer.answer_list[active_index].accessory_file_id"
-        upload-title="上传附件:"
         @upload="handleUpload"
         @deleteFile="handleDelete"
       />
@@ -224,8 +224,13 @@ export default {
     }
   }
 
+  .write-input {
+    font-size: 16px;
+  }
+
   :deep .el-textarea .el-input__count {
     bottom: 15px;
+    font-size: 14px;
     background-color: #f2f3f5;
   }
 }

+ 7 - 1
src/views/exercise_questions/preview/WritePreview.vue

@@ -13,6 +13,7 @@
       v-html="sanitizeHTML(data.description)"
     ></div>
     <el-input
+      class="write-input"
       v-model="answer.answer_list[0].text"
       rows="3"
       type="textarea"
@@ -21,6 +22,7 @@
       show-word-limit
       :readonly="disabled"
       @input="handleInput"
+      :autosize="{ minRows: 3 }"
     />
 
     <template v-if="isEnable(data.property.is_enable_upload_accessory)">
@@ -30,7 +32,6 @@
         file-type-name="文件"
         :upload-type="'*'"
         :file-id-list="answer.answer_list[0].accessory_file_id_list"
-        upload-title="上传附件:"
         :disabled="disabled"
         @upload="handleUpload"
         @deleteFile="handleDelete"
@@ -135,7 +136,12 @@ export default {
     }
   }
 
+  .write-input {
+    font-size: 16px;
+  }
+
   :deep .el-textarea .el-input__count {
+    font-size: 14px;
     background-color: #f2f3f5;
   }
 }

+ 51 - 39
src/views/exercise_questions/preview/components/common/SoundRecordPreview.vue

@@ -190,43 +190,55 @@ export default {
     },
     // 开始录音
     microphone() {
-      if (!this.audio.paused) {
-        this.$refs[this.wavBlob].pause();
-        this.audio.paused = true;
-      }
-      if (this.disabled) return;
-      if (this.microphoneStatus) {
-        this.hasMicro = 'normal';
-        this.recorder.stop();
-        clearInterval(this.timer);
-        // 录音结束,获取取录音数据
-        let wav = this.recorder.getWAVBlob(); // 获取 WAV 数据
-        this.microphoneStatus = false;
-        let reader = new window.FileReader();
-        reader.readAsDataURL(wav);
-        reader.onloadend = () => {
-          let MethodName = 'file_store_manager-SaveFileByteBase64Text';
-          let data = {
-            base64_text: reader.result.replace('data:audio/wav;base64,', ''),
-            file_suffix_name: 'mp3',
-          };
-          GetStaticResources(MethodName, data).then((res) => {
-            if (res.status === 1) {
-              this.$emit('update:wavBlob', res.file_id);
+      if (navigator && navigator.mediaDevices) {
+        const constraints = { audio: true }; // 设置只获取音频流
+        navigator.mediaDevices
+          .getUserMedia(constraints)
+          .then(() => {
+            if (!this.audio.paused) {
+              this.$refs[this.wavBlob].pause();
+              this.audio.paused = true;
+            }
+            if (this.disabled) return;
+            if (this.microphoneStatus) {
+              this.hasMicro = 'normal';
+              this.recorder.stop();
+              clearInterval(this.timer);
+              // 录音结束,获取取录音数据
+              let wav = this.recorder.getWAVBlob(); // 获取 WAV 数据
+              this.microphoneStatus = false;
+              let reader = new window.FileReader();
+              reader.readAsDataURL(wav);
+              reader.onloadend = () => {
+                let MethodName = 'file_store_manager-SaveFileByteBase64Text';
+                let data = {
+                  base64_text: reader.result.replace('data:audio/wav;base64,', ''),
+                  file_suffix_name: 'mp3',
+                };
+                GetStaticResources(MethodName, data).then((res) => {
+                  if (res.status === 1) {
+                    this.$emit('update:wavBlob', res.file_id);
+                  }
+                });
+              };
+            } else {
+              this.hasMicro = '';
+              this.$emit('update:wavBlob', '');
+              // 开始录音
+              this.recorder.start();
+              this.microphoneStatus = true;
+              this.recordTimes = 0;
+              clearInterval(this.timer);
+              this.timer = setInterval(() => {
+                this.recordTimes += 1;
+              }, 1000);
             }
+          })
+          .catch((error) => {
+            this.$message.warning('请打开浏览器录音权限');
           });
-        };
       } else {
-        this.hasMicro = '';
-        this.$emit('update:wavBlob', '');
-        // 开始录音
-        this.recorder.start();
-        this.microphoneStatus = true;
-        this.recordTimes = 0;
-        clearInterval(this.timer);
-        this.timer = setInterval(() => {
-          this.recordTimes += 1;
-        }, 1000);
+        this.$message.warning('该浏览器不支持录音');
       }
     },
     // 删除录音
@@ -254,7 +266,7 @@ export default {
     // 音频加载完之后
     onLoadedmetadata(res) {
       this.audio.max_time = parseInt(res.target.duration);
-      this.audio_allTime = secondFormatConversion(this.audio.max_time);
+      this.audio_allTime = this.audio.max_time ? secondFormatConversion(this.audio.max_time) : '00:00';
     },
     // 当音频当前时间改变后,进度条也要改变
     onTimeupdate(res) {
@@ -329,7 +341,7 @@ export default {
     .tips {
       display: block;
       margin-top: 4px;
-      font-size: 12px;
+      font-size: 14px;
       font-weight: 400;
       line-height: 20px;
       color: rgba($color: #000, $alpha: 50%);
@@ -339,7 +351,7 @@ export default {
   .record-time {
     display: block;
     margin-top: 4px;
-    font-size: 12px;
+    font-size: 14px;
     line-height: 20px;
     color: rgba(0, 0, 0, 50%);
   }
@@ -375,7 +387,7 @@ export default {
 
   .audio-time {
     min-width: 35px;
-    font-size: 12px;
+    font-size: 14px;
     font-weight: 400;
     line-height: 20px;
   }
@@ -416,7 +428,7 @@ export default {
     border-radius: 28px;
 
     .audio-slider {
-      width: 178px;
+      width: 170px;
     }
   }
 }