Bladeren bron

替换练习

natasha 1 jaar geleden
bovenliggende
commit
f81c5a3a3f

+ 1 - 1
src/components/common/RichText.vue

@@ -75,7 +75,7 @@ export default {
     },
     wordlimitNum: {
       type: [Number, Boolean],
-      default: 500,
+      default: 1000,
     },
     isFill: {
       type: Boolean,

+ 0 - 19
src/views/exercise_questions/create/components/exercises/AnswerQuestion.vue

@@ -13,14 +13,6 @@
 
         <RichText v-if="data.property.stem_type === stemTypeList[1].value" v-model="data.stem" placeholder="输入题干" />
 
-        <el-input
-          v-show="isEnable(data.property.is_enable_description)"
-          v-model="data.description"
-          rows="3"
-          resize="none"
-          type="textarea"
-          placeholder="输入文段"
-        />
         <UploadAudio :file-id="data.file_id_list?.[0]" @upload="upload" @deleteFile="deleteFile" />
         <el-input
           v-if="isEnable(data.property.is_enable_reference_answer)"
@@ -58,17 +50,6 @@
           </el-radio>
         </el-form-item>
 
-        <el-form-item label="文段">
-          <el-radio
-            v-for="{ value, label } in switchOption"
-            :key="value"
-            v-model="data.property.is_enable_description"
-            :label="value"
-          >
-            {{ label }}
-          </el-radio>
-        </el-form-item>
-
         <el-form-item label="参考答案">
           <el-radio
             v-for="{ value, label } in switchOption"

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

@@ -282,7 +282,7 @@ export default {
         });
         item.loadings = false;
 
-        item.chinese_strokes = content_arr_strokes;
+        item.hz_strokes_list = content_arr_strokes;
       }
     },
   },

+ 17 - 1
src/views/exercise_questions/create/components/exercises/ReplaceAnswerQuestion.vue

@@ -28,7 +28,11 @@
         <ul>
           <li v-for="(item, i) in data.option_list" :key="i" class="content-item repeat-option">
             <div class="option-content" v-for="(items, indexs) in item" :key="indexs">
-              <el-input v-model="items.content" placeholder="输入内容"></el-input>
+              <el-input
+                v-model="items.content"
+                placeholder="输入内容"
+                @blur="items.content = items.content.trim()"
+              ></el-input>
             </div>
           </li>
         </ul>
@@ -94,6 +98,7 @@
             v-model="data.property.rows_number"
             class="word-num-input"
             :precision="0"
+            @change="handleChangeRows"
           />
         </el-form-item>
       </el-form>
@@ -137,6 +142,17 @@ export default {
     addOption() {
       this.data.option_list.push(getOption());
     },
+    // 修改行数
+    handleChangeRows(val) {
+      if (this.data.option_list.length >= val) {
+        this.data.option_list = this.data.option_list.splice(0, val);
+      } else {
+        let length = val - this.data.option_list.length;
+        for (let i = 0; i < length; i++) {
+          this.addOption();
+        }
+      }
+    },
   },
 };
 </script>

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

@@ -310,7 +310,7 @@ export default {
         });
         item.loadings = false;
 
-        item.chinese_strokes = content_arr_strokes;
+        item.hz_strokes_list = content_arr_strokes;
       }
     },
   },

+ 0 - 1
src/views/exercise_questions/data/answerQuestion.js

@@ -15,7 +15,6 @@ export const answerQuestionData = {
     stem_type: stemTypeList[0].value, // 题干类型
     question_number: '1', // 题号
     is_enable_reference_answer: switchOption[0].value, // 是否开启参考答案
-    is_enable_description: switchOption[0].value, // 是否启用描述
     score: 1, // 分值
     score_type: scoreTypeList[0].value, // 分值类型
   },

+ 1 - 1
src/views/exercise_questions/data/chinese.js

@@ -9,7 +9,7 @@ export function getOption(content = '') {
     pinyin: '',
     definition: '',
     collocation: '',
-    chinese_strokes: [],
+    hz_strokes_list: [],
   };
 }
 // 汉字类型列表

+ 1 - 1
src/views/exercise_questions/data/common.js

@@ -22,7 +22,7 @@ export const questionTypeOption = [
       { label: '听说训练', value: 'repeat' },
       { label: '看图说话', value: 'talk_picture' },
       { label: '对话题', value: 'dialogue' },
-      // { label: '回答问题', value: 'answer_question' },
+      { label: '口语表达', value: 'answer_question' },
       { label: '替换练习', value: 'replace_answer' },
     ],
   },

+ 1 - 1
src/views/exercise_questions/data/wordCard.js

@@ -11,7 +11,7 @@ export function getOption(content = '') {
     rate: null,
     example_sentence: ['', ''],
     picture_file_id: '',
-    chinese_strokes: [],
+    hz_strokes_list: [],
   };
 }
 

+ 4 - 4
src/views/exercise_questions/preview/ChinesePreview.vue

@@ -10,7 +10,7 @@
     <!-- 笔画学习 -->
     <div :class="['words-box', 'words-box-' + data.property.learn_type]">
       <div v-for="(item, index) in data.option_list" :key="index" :class="['words-item']">
-        <template v-if="item.content && item.content.trim() && item.chinese_strokes[0].strokes">
+        <template v-if="item.content && item.content.trim() && item.hz_strokes_list[0].strokes">
           <div
             v-if="data.property.learn_type !== 'dictation'"
             class="words-top"
@@ -31,7 +31,7 @@
               :play-storkes="true"
               :book-text="item.content"
               :target-div="'pre' + item.content + index"
-              :book-strokes="item.chinese_strokes[0].strokes"
+              :book-strokes="item.hz_strokes_list[0].strokes"
               :class="['strock-chinese', 'border-right-none']"
             />
             <Strockred
@@ -41,7 +41,7 @@
               :hanzi-color="hanzi_color"
               :reset="true"
               :target-div="'write-praT' + item.content + itemI + Math.random().toString(36).substring(2, 10)"
-              :book-strokes="item.chinese_strokes[0].strokes"
+              :book-strokes="item.hz_strokes_list[0].strokes"
               :class="[
                 'strock-chinese',
                 (itemI + 1) % writer_number_yuan !== 0 && itemI !== writer_number ? 'border-right-none' : '',
@@ -68,7 +68,7 @@
               :play-storkes="true"
               :book-text="item.content"
               :target-div="'pre' + item.content + index"
-              :book-strokes="item.chinese_strokes[0].strokes"
+              :book-strokes="item.hz_strokes_list[0].strokes"
               :class="['strock-chinese']"
             />
             <div v-for="(items, indexs) in item.imgArr" :key="indexs" class="con-box">

+ 49 - 35
src/views/exercise_questions/preview/ReplaceAnswerPreview.vue

@@ -1,13 +1,22 @@
 <!-- eslint-disable vue/no-v-html -->
 <template>
-  <div class="repeat-preview">
+  <div class="replace-preview">
     <div class="stem">
       <span class="question-number">{{ data.property.question_number }}.</span>
       <span v-html="sanitizeHTML(data.stem)"></span>
     </div>
     <div v-if="isEnable(data.property.is_enable_description)" class="description">{{ data.description }}</div>
     <div class="option-list">
-      <li v-for="(item, i) in answer_list" :key="i" :class="['option-item']"></li>
+      <div v-for="(item, i) in option_list" :key="i" :class="['option-item']">
+        <template v-if="item.length > 1">
+          <el-select v-model="answer.answer_list[0].select_mark[i]" placeholder="请选择">
+            <el-option v-for="items in item" :key="items.content" :label="items.content" :value="items.content">
+            </el-option>
+          </el-select>
+        </template>
+        <span v-else>{{ item[0].content }}</span>
+      </div>
+      <SoundRecordPreview :wav-blob.sync="answer.answer_list[0].voice_file_id" />
     </div>
   </div>
 </template>
@@ -26,23 +35,45 @@ export default {
   data() {
     return {
       computeOptionMethods,
-      answer_list: [],
+      answer: {
+        answer_list: [
+          {
+            voice_file_id: '',
+            select_mark: [],
+          },
+        ],
+        option_list: [],
+      },
     };
   },
   created() {
     console.log(this.data);
     this.handleData();
   },
+  mounted() {},
   methods: {
     // 初始化数据
     handleData() {
-      this.answer_list = [];
+      this.option_list = [];
+      this.answer.answer_list = [
+        {
+          voice_file_id: '',
+          select_mark: [],
+        },
+      ];
+      let option_lists = [[], [], [], []];
       this.data.option_list.forEach((item) => {
-        let obj = {
-          mark: item.mark,
-          audio_file_id: '',
-        };
-        this.answer_list.push(obj);
+        item.forEach((items, indexs) => {
+          if (items.content) {
+            option_lists[indexs].push(items);
+          }
+        });
+      });
+      option_lists.forEach((option_item) => {
+        if (option_item.length > 0) {
+          this.option_list.push(option_item);
+          this.answer.answer_list[0].select_mark.push('');
+        }
       });
     },
   },
@@ -52,37 +83,20 @@ export default {
 <style lang="scss" scoped>
 @use '@/styles/mixin.scss' as *;
 
-.repeat-preview {
+.replace-preview {
   @include preview;
 
   .option-list {
-    // display: flex;
-    // flex-wrap: wrap;
-    // row-gap: 16px;
-
-    .option-item {
-      display: flex;
-      column-gap: 16px;
-      align-items: center;
-      width: 90%;
-      margin-bottom: 16px;
-
-      .option-content {
-        flex: 1;
+  }
 
-        // max-width: 306px;
-        padding: 8px 16px;
-        color: #706f78;
-        background-color: $content-color;
-        border-radius: 40px;
-      }
+  .slider {
+    display: flex;
+  }
 
-      .sound-box {
-        padding: 4px;
-        background: $content-color;
-        border-radius: 40px;
-      }
-    }
+  .slider-item {
+    flex: 1;
+    height: 100px;
+    border: 1px solid #ccc;
   }
 }
 </style>

+ 3 - 3
src/views/exercise_questions/preview/WordCardPreview.vue

@@ -26,14 +26,14 @@
         </div>
         <template v-for="(item, index) in data.option_list">
           <div class="strock-box" :key="index" v-if="index === active_index">
-            <div class="strock-left" v-if="item.chinese_strokes && item.chinese_strokes.length > 0">
-              <template v-for="(items, indexs) in item.chinese_strokes">
+            <div class="strock-left" v-if="item.hz_strokes_list && item.hz_strokes_list.length > 0">
+              <template v-for="(items, indexs) in item.hz_strokes_list">
                 <Strockplayredline
                   :play-storkes="true"
                   :book-text="items.hz"
                   :target-div="'pre' + items.hz + indexs + active_index"
                   :book-strokes="items.strokes"
-                  :class="['strock-chinese', indexs !== item.chinese_strokes.length - 1 ? 'border-right-none' : '']"
+                  :class="['strock-chinese', indexs !== item.hz_strokes_list.length - 1 ? 'border-right-none' : '']"
                   :key="indexs"
                   v-if="items"
                 />