Jelajahi Sumber

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

dusenyao 1 tahun lalu
induk
melakukan
1c7461bef2

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

@@ -284,7 +284,7 @@ export default {
         this.loading_list[i].loading = true;
         let MethodName = 'tool-PinyinToVoiceFile';
         let data = {
-          pinyin: item.pinyin.trim(),
+          pinyin: item.pinyin.trim().split(' ').join(','),
         };
         GetStaticResources(MethodName, data)
           .then((res) => {

+ 38 - 8
src/views/exercise_questions/create/components/exercises/ChooseToneQuestion.vue

@@ -45,10 +45,13 @@
               @deleteFile="deleteFiles"
             />
             <div v-else-if="data.other.audio_generation_method === 'auto'" class="auto-matically">
-              <AudioPlay :file-id="item.audio_file_id" theme-color="gray" v-if="item.audio_file_id" />
-              <span class="auto-btn" @click="handleMatically(item)" v-loading="item.loading">{{
-                item.audio_file_id ? '已生成' : '自动生成'
-              }}</span>
+              <AudioPlay v-if="item.audio_file_id" :file-id="item.audio_file_id" theme-color="gray" />
+              <span
+                v-loading="loading_list[i] ? loading_list[i].loading : false"
+                class="auto-btn"
+                @click="handleMatically(item, i)"
+                >{{ item.audio_file_id ? '已生成' : '自动生成' }}</span
+              >
             </div>
             <SoundRecord v-else :wav-blob.sync="item.audio_file_id" />
             <SvgIcon icon-class="delete" class="delete pointer" @click="deleteOption(i, item.audio_file_id)" />
@@ -172,8 +175,34 @@ export default {
       data: JSON.parse(JSON.stringify(ChooseToneData)),
       matically_pinyin_obj: {}, // 存放转成声调的拼音
       res_arr: [],
+      loading_list: [
+        {
+          loading: false,
+        },
+        {
+          loading: false,
+        },
+        {
+          loading: false,
+        },
+      ],
     };
   },
+  watch: {
+    'data.option_list.length': {
+      handler(val) {
+        this.loading_list = [];
+        for (let i = 0; i < val; i++) {
+          let obj = {
+            loading: false,
+          };
+          this.loading_list.push(obj);
+        }
+      },
+      deep: true,
+      immediate: true,
+    },
+  },
   created() {},
   methods: {
     addOption() {
@@ -197,13 +226,14 @@ export default {
         .then(() => {
           this.data.option_list.splice(i, 1);
           this.data.file_id_list.splice(this.data.file_id_list.indexOf(file_id), 1);
+          this.loading_list.splice(i, 1);
         })
         .catch(() => {});
     },
     // 自动生成音频
-    handleMatically(item) {
+    handleMatically(item, i) {
       if (item.content.trim()) {
-        this.$set(item, 'loading', true);
+        this.loading_list[i].loading = true;
         if (!this.matically_pinyin_obj[item.mark]) {
           this.handleItemAnswer(item);
         }
@@ -213,14 +243,14 @@ export default {
         };
         GetStaticResources(MethodName, data)
           .then((res) => {
-            item.loading = false;
+            this.loading_list[i].loading = false;
             if (res.status === 1) {
               item.audio_file_id = res.file_id;
               this.data.file_id_list.push(res.file_id);
             }
           })
           .catch(() => {
-            item.loading = false;
+            this.loading_list[i].loading = false;
           });
       }
     },

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

@@ -39,9 +39,13 @@
               </el-button>
             </div>
             <UploadDrag v-else ref="uploadDrag" :item-index="i" :limit="1" @fileUploadSuccess="fileUploadSuccess" />
-            <div v-loading="item.loadings" class="word-card-item">
+            <div v-loading="loading_list[i] ? loading_list[i].loadings : false" class="word-card-item">
               <div class="word-card">
-                <el-input v-model="item.content" :placeholder="'输入汉字或词汇'" @blur="handleChineseStrokes(item)" />
+                <el-input
+                  v-model="item.content"
+                  :placeholder="'输入汉字或词汇'"
+                  @blur="handleChineseStrokes(item, i)"
+                />
                 <el-input v-model="item.pinyin" :placeholder="'拼音间用空格隔开'" />
                 <UploadAudio
                   v-if="data.other.audio_generation_method === 'upload'"
@@ -54,9 +58,12 @@
                 />
                 <div v-else-if="data.other.audio_generation_method === 'auto'" class="auto-matically">
                   <AudioPlay v-if="item.audio_file_id" :file-id="item.audio_file_id" theme-color="gray" />
-                  <span v-loading="item.loading" class="auto-btn" @click="handleMatically(item)">{{
-                    item.audio_file_id ? '已生成' : '自动生成'
-                  }}</span>
+                  <span
+                    v-loading="loading_list[i] ? loading_list[i].loading : false"
+                    class="auto-btn"
+                    @click="handleMatically(item, i)"
+                    >{{ item.audio_file_id ? '已生成' : '自动生成' }}</span
+                  >
                 </div>
                 <SoundRecord v-else :wav-blob.sync="item.audio_file_id" />
                 <span class="rate-box"><el-rate v-model="item.rate" /></span>
@@ -186,6 +193,20 @@ export default {
       handleInputNumber,
       pic_list: {},
       is_first: true,
+      loading_list: [
+        {
+          loading: false,
+          loadings: false,
+        },
+        {
+          loading: false,
+          loadings: false,
+        },
+        {
+          loading: false,
+          loadings: false,
+        },
+      ],
     };
   },
   watch: {
@@ -197,6 +218,20 @@ export default {
       },
       deep: true,
     },
+    'data.option_list.length': {
+      handler(val) {
+        this.loading_list = [];
+        for (let i = 0; i < val; i++) {
+          let obj = {
+            loading: false,
+            loadings: false,
+          };
+          this.loading_list.push(obj);
+        }
+      },
+      deep: true,
+      immediate: true,
+    },
   },
   methods: {
     // 初始化数据
@@ -230,6 +265,7 @@ export default {
           this.data.option_list.splice(i, 1);
           this.data.file_id_list.splice(this.data.file_id_list.indexOf(file_id), 1);
           this.data.file_id_list.splice(this.data.file_id_list.indexOf(pic_id), 1);
+          this.loading_list.splice(i, 1);
         })
         .catch(() => {});
     },
@@ -249,23 +285,23 @@ export default {
         .catch(() => {});
     },
     // 自动生成音频
-    handleMatically(item) {
+    handleMatically(item, i) {
       if (item.pinyin.trim()) {
-        this.$set(item, 'loading', true);
+        this.loading_list[i].loading = true;
         let MethodName = 'tool-PinyinToVoiceFile';
         let data = {
           pinyin: item.pinyin.trim().split(' ').join(','),
         };
         GetStaticResources(MethodName, data)
           .then((res) => {
-            item.loading = false;
+            this.loading_list[i].loading = false;
             if (res.status === 1) {
               item.audio_file_id = res.file_id;
               this.data.file_id_list.push(res.file_id);
             }
           })
           .catch(() => {
-            item.loading = false;
+            this.loading_list[i].loading = false;
           });
       }
     },
@@ -275,9 +311,9 @@ export default {
       this.$set(this.pic_list, file_id, file_url);
     },
     // 生成汉字
-    handleChineseStrokes(item) {
+    handleChineseStrokes(item, i) {
       if (item.content.trim()) {
-        this.$set(item, 'loadings', true);
+        this.loading_list[i].loadings = true;
         let content_arr = item.content.trim().split('');
         let content_arrs = [];
         let content_arr_strokes = [];
@@ -300,7 +336,7 @@ export default {
             content_arr_strokes[indexc] = obj;
           });
         });
-        item.loadings = false;
+        this.loading_list[i].loadings = false;
 
         item.hz_strokes_list = content_arr_strokes;
       }

+ 24 - 9
src/views/exercise_questions/preview/ChinesePreview.vue

@@ -1,6 +1,6 @@
 <!-- eslint-disable vue/no-v-html -->
 <template>
-  <div class="chinese-preview" v-if="show_preview">
+  <div v-if="show_preview" class="chinese-preview">
     <div class="stem">
       <span class="question-number">{{ data.property.question_number }}.</span>
       <span v-html="sanitizeHTML(data.stem)"></span>
@@ -216,26 +216,35 @@ export default {
       immediate: true,
     },
     data: {
-      handler(val, oldVal) {
+      handler(val) {
         if (!val || this.data.type !== 'chinese') return;
         this.handleData();
       },
       deep: true,
       immediate: true,
     },
+    isJudgingRightWrong: {
+      handler(val) {
+        if (!val) return;
+        this.handleData();
+      },
+      immediate: true,
+    },
   },
   created() {
-    // console.log(this.data);
     // this.handleData();
   },
   mounted() {},
   methods: {
     // 初始化数据
     handleData() {
+      if (!this.isJudgingRightWrong) {
+        this.answer.answer_list = [];
+      }
       this.show_preview = false;
       this.writer_number = this.data.property.tian_number ? Number(this.data.property.tian_number) : 8;
       let option_list = JSON.parse(JSON.stringify(this.data)).option_list;
-      option_list.forEach((item) => {
+      option_list.forEach((item, index) => {
         let arr = [];
         if (this.data.property.learn_type === 'dictation') {
           item.pinyin_arr = [];
@@ -247,14 +256,20 @@ export default {
             arr.push(null);
             item.pinyin_arr.push(obj);
           });
-          item.imgArr = arr;
-          // this.answer_list.write_model[this.hz_data[index]] = arr;
+          if (this.isJudgingRightWrong) {
+            item.imgArr = this.answer.answer_list[index].strokes_content_list;
+          } else {
+            item.imgArr = arr;
+          }
         } else if (item.content.trim()) {
           for (let i = 0; i < this.writer_number; i++) {
             arr.push(null);
           }
-          item.imgArr = arr;
-          // this.answer_list.write_model[item.content] = arr;
+          if (this.isJudgingRightWrong) {
+            item.imgArr = this.answer.answer_list[index].strokes_content_list;
+          } else {
+            item.imgArr = arr;
+          }
         }
         let obj = {
           mark: item.mark,
@@ -294,7 +309,7 @@ export default {
       this.current_hz_data = imgUrl;
     },
     // 删除记录
-    deleteWriteRecord(rowIndex, colIndex, current_hz) {
+    deleteWriteRecord(rowIndex, colIndex) {
       this.$set(this.option_list[rowIndex].imgArr, colIndex, JSON.stringify({}));
       this.changeCurQue(null, colIndex, this.active_mark);
       this.current_hz_data = null;

+ 173 - 25
src/views/exercise_questions/preview/ChooseTonePreview.vue

@@ -1,6 +1,6 @@
 <!-- eslint-disable vue/no-v-html -->
 <template>
-  <div class="choosetone-preview">
+  <div v-if="show_preview" class="choosetone-preview">
     <div class="stem">
       <span class="question-number">{{ data.property.question_number }}.</span>
       <span v-html="sanitizeHTML(data.stem)"></span>
@@ -11,12 +11,19 @@
       <li v-for="(item, i) in data.option_list" :key="i" :class="['option-item']">
         <span>{{ computeOptionMethods[data.option_number_show_mode](i) }} </span>
         <AudioPlay v-if="item.audio_file_id" :file-id="item.audio_file_id" />
-        <div class="option-content">
+        <div
+          class="option-content"
+          :class="[isJudgingRightWrong ? (con_preview[i].all_right ? 'all-right' : 'has-error') : '']"
+        >
           <template v-if="data.property.answer_mode === 'select'">
             <span
               v-for="(itemc, indexc) in con_preview[i].item_con"
               :key="indexc"
-              :class="['item-con', active_index_str === i + '-' + indexc ? 'active' : '']"
+              :class="[
+                'item-con',
+                active_index_str === i + '-' + indexc ? 'active' : '',
+                isJudgingRightWrong && !con_preview[i].user_answer[indexc].is_right ? 'error' : '',
+              ]"
               @click="
                 con_preview[i].item_active_index = indexc;
                 active_index_str = i + '-' + indexc;
@@ -53,6 +60,11 @@
                   select_item_index === i
                 ? 'active'
                 : '',
+            con_preview[i].user_answer[con_preview[i].item_active_index].right_answer === value &&
+            con_preview[i].user_answer[con_preview[i].item_active_index].select_tone !==
+              con_preview[i].user_answer[con_preview[i].item_active_index].right_answer
+              ? 'right'
+              : '',
           ]"
           @click="chooseTone(con_preview[i], value, i)"
         >
@@ -107,6 +119,7 @@ export default {
       active_letter_index: 0, // 选择字母索引
       select_item_index: 0, // 小题索引
       show_tips: false, // 是否显示答题提示
+      show_preview: false,
     };
   },
   watch: {
@@ -118,12 +131,20 @@ export default {
       deep: true,
       immediate: true,
     },
+    isJudgingRightWrong: {
+      handler(val) {
+        if (!val) return;
+        this.judgeRight();
+      },
+      immediate: true,
+    },
   },
   created() {
     // this.handleData();
   },
   methods: {
     chooseTone(item, value, i) {
+      if (this.isJudgingRightWrong) return;
       if ((!this.active_letter || this.select_item_index !== i) && this.data.property.answer_mode === 'label') return;
       item.user_answer[item.item_active_index].select_tone = value;
       if (this.data.property.answer_mode === 'label') {
@@ -131,11 +152,11 @@ export default {
         this.active_index_str = `${i}-${item.item_active_index}-${this.active_letter_index}`;
         this.handleReplaceTone(this.active_letter + value);
         setTimeout(() => {
-          // item.item_con[item.item_active_index][this.active_letter_index] = this.final_con;
           let new_con = item.item_con_yuan[item.item_active_index].split(this.active_letter);
           item.item_con[item.item_active_index] = new_con[0] + this.final_con + new_con[1];
-          // this.active_letter = this.final_con;
           this.$forceUpdate();
+          this.answer.answer_list[i].value[item.item_active_index] =
+            new_con[0] + this.active_letter + value + new_con[1];
         }, 100);
       } else {
         this.active_index_str = `${i}-${item.item_active_index}`;
@@ -144,20 +165,27 @@ export default {
           item.item_con[item.item_active_index] = this.final_con;
           this.$forceUpdate();
         }, 100);
+        this.answer.answer_list[i].value[item.item_active_index] = value;
       }
     },
     // 处理数据
     handleData() {
       this.con_preview = [];
+      this.show_preview = false;
+      if (!this.isJudgingRightWrong) {
+        this.answer.answer_list = [];
+      }
       this.data.option_list.forEach((item) => {
         let con_arr = JSON.parse(JSON.stringify(item.content_view));
         let user_answer = [];
+        let user_submit = []; // 用户提交答案
         con_arr.forEach(() => {
           user_answer.push({
             select_tone: null,
             select_letter: '',
             select_index: '',
           });
+          user_submit.push('');
         });
         let obj = {
           item_con: con_arr,
@@ -167,10 +195,18 @@ export default {
           item_active_index: 0,
           active_letter: '',
         };
+        if (!this.isJudgingRightWrong) {
+          let obj = {
+            mark: item.mark,
+            value: user_submit,
+          };
+          this.answer.answer_list.push(obj);
+        }
         this.con_preview.push(obj);
       });
+      this.show_preview = true;
     },
-    handleReplaceTone(e) {
+    handleReplaceTone(e, arr, index, resArr) {
       this.$nextTick(() => {
         let value = e;
         this.resArr = [];
@@ -178,31 +214,51 @@ export default {
           let reg = /\s+/g;
           let valueArr = value.split(reg);
           valueArr.forEach((item) => {
-            this.handleValue(item);
+            this.handleValue(item, resArr);
           });
           let str = '';
           setTimeout(() => {
-            this.resArr.forEach((item) => {
-              str += ' ';
-              item.forEach((sItem) => {
-                if (sItem.number && sItem.con) {
-                  let number = Number(sItem.number);
-                  let con = sItem.con;
-                  let word = this.addTone(number, con);
-                  str += word;
-                } else if (sItem.number) {
-                  str += sItem.number;
-                } else if (sItem.con) {
-                  str += ` ${sItem.con} `;
-                }
+            if (resArr) {
+              resArr.forEach((item) => {
+                str += ' ';
+                item.forEach((sItem) => {
+                  if (sItem.number && sItem.con) {
+                    let number = Number(sItem.number);
+                    let con = sItem.con;
+                    let word = this.addTone(number, con);
+                    str += word;
+                  } else if (sItem.number) {
+                    str += sItem.number;
+                  } else if (sItem.con) {
+                    str += ` ${sItem.con} `;
+                  }
+                });
+              });
+              let number_index = e.search(/0|1|2|3|4/) + 1;
+              arr[index] = str.trim() + e.substring(number_index);
+            } else {
+              this.resArr.forEach((item) => {
+                str += ' ';
+                item.forEach((sItem) => {
+                  if (sItem.number && sItem.con) {
+                    let number = Number(sItem.number);
+                    let con = sItem.con;
+                    let word = this.addTone(number, con);
+                    str += word;
+                  } else if (sItem.number) {
+                    str += sItem.number;
+                  } else if (sItem.con) {
+                    str += ` ${sItem.con} `;
+                  }
+                });
               });
-            });
-            this.final_con = str.trim();
+              this.final_con = str.trim();
+            }
           }, 10);
         }
       });
     },
-    handleValue(valItem) {
+    handleValue(valItem, resArr) {
       let reg = /\d/;
       let reg2 = /[A-Za-zü]+\d/g;
       let numList = [];
@@ -226,7 +282,13 @@ export default {
       } else {
         numList = [];
       }
-      if (numList.length === 0) {
+      if (resArr) {
+        if (numList.length === 0) {
+          resArr.push([{ con: valItem }]);
+        } else {
+          resArr.push(numList);
+        }
+      } else if (numList.length === 0) {
         this.resArr.push([{ con: valItem }]);
       } else {
         this.resArr.push(numList);
@@ -272,6 +334,72 @@ export default {
       this.active_letter_index = indexi;
       this.select_item_index = i;
     },
+    // 判断对错
+    judgeRight() {
+      this.con_preview = [];
+      this.show_preview = false;
+      this.data.option_list.forEach((item, index) => {
+        let con_arr = JSON.parse(JSON.stringify(item.content_view));
+        let user_answer = [];
+        let user_select = [];
+        let user_res_arr = [];
+        con_arr.forEach((items, indexs) => {
+          user_answer.push({
+            select_tone: this.answer.answer_list[index].value[indexs],
+            select_letter: '',
+            select_index: '',
+            is_right:
+              this.answer.answer_list[index].value[indexs] === this.data.answer.answer_list[index].value[indexs],
+            right_answer: this.data.answer.answer_list[index].value[indexs],
+          });
+          user_res_arr.push([]);
+          user_select.push('');
+          if (this.data.property.answer_mode === 'label') {
+            this.handleReplaceTone(
+              this.answer.answer_list[index].value[indexs],
+              user_select,
+              indexs,
+              user_res_arr[indexs],
+            );
+            if (this.answer.answer_list[index].value[indexs].match(/\d+/g).length > 0) {
+              user_answer[indexs].select_tone = this.answer.answer_list[index].value[indexs].match(/\d+/g)[0];
+              let letter_number = this.answer.answer_list[index].value[indexs].match(/\d+/g)[0];
+              let letter_index = this.answer.answer_list[index].value[indexs].indexOf(letter_number) - 1;
+              user_answer[indexs].select_letter = this.answer.answer_list[index].value[indexs].substring(
+                letter_index,
+                letter_index + 1,
+              );
+              user_answer[indexs].select_index = letter_index;
+            }
+          } else {
+            this.handleReplaceTone(
+              items + this.answer.answer_list[index].value[indexs],
+              user_select,
+              indexs,
+              user_res_arr[indexs],
+            );
+          }
+        });
+        let obj = {
+          item_con: user_select,
+          item_con_yuan: JSON.parse(JSON.stringify(con_arr)),
+          mark: item.mark,
+          user_answer,
+          item_active_index: 0,
+          active_letter: '',
+          user_res_arr,
+          all_right:
+            JSON.stringify(this.answer.answer_list[index].value) ===
+            JSON.stringify(this.data.answer.answer_list[index].value),
+        };
+        this.con_preview.push(obj);
+      });
+      setTimeout(() => {
+        this.show_preview = true;
+      }, 100);
+
+      console.log(this.con_preview);
+    },
   },
 };
 </script>
@@ -298,10 +426,20 @@ export default {
       margin-right: 5%;
 
       .option-content {
-        padding: 12px 24px;
+        padding: 10px 22px;
         color: #706f78;
         background-color: $content-color;
+        border: 1px solid $content-color;
         border-radius: 40px;
+
+        &.all-right {
+          background-color: $right-bc-color;
+          border-color: $right-bc-color;
+        }
+
+        &.has-error {
+          border-color: $error-color;
+        }
       }
 
       .item-con,
@@ -310,6 +448,10 @@ export default {
         color: #000;
         cursor: pointer;
 
+        &.error {
+          color: $error-color;
+        }
+
         &.active {
           color: #2f6fec;
         }
@@ -333,6 +475,12 @@ export default {
           background: #dfe9fd;
           border-radius: 16px;
         }
+
+        &.right {
+          color: $right-color;
+          background-color: $right-bc-color;
+          border-radius: 16px;
+        }
       }
     }
   }

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

@@ -1,6 +1,6 @@
 <!-- eslint-disable vue/no-v-html -->
 <template>
-  <div class="essayquestion-preview" v-if="show_preview">
+  <div v-if="show_preview" class="essayquestion-preview">
     <div class="stem">
       <span class="question-number">{{ data.property.question_number }}.</span>
       <span v-html="sanitizeHTML(data.stem)"></span>
@@ -15,8 +15,8 @@
       placeholder="请输入"
       :maxlength="1000"
       show-word-limit
-      @input="handleInput"
       :readonly="isJudgingRightWrong"
+      @input="handleInput"
     />
     <SoundRecordPreview
       :disabled="isJudgingRightWrong"
@@ -29,9 +29,9 @@
       :upload-type="'*'"
       :file-id-list="answer.answer_list[0].accessory_file_id_list"
       upload-title="上传附件:"
+      :disabled="isJudgingRightWrong"
       @upload="handleUpload"
       @deleteFile="handleDelete"
-      :disabled="isJudgingRightWrong"
     />
     <div v-if="isEnable(data.property.is_enable_reference_answer) && isShowRightAnswer" class="reference-box">
       <h5 class="reference-title">参考答案</h5>

+ 32 - 11
src/views/exercise_questions/preview/ReplaceAnswerPreview.vue

@@ -9,12 +9,13 @@
     <div class="option-list">
       <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].mark_list[i]" placeholder="请选择">
-            <el-option v-for="items in item" :key="items.content" :label="items.content" :value="items.content">
-            </el-option>
-          </el-select> -->
           <span class="select-item select-active">{{ active_content[i] }}</span>
-          <ul :ref="'ui' + i" class="replace-ul" @scroll="handleScroll($event, i)">
+          <ul
+            :ref="'ui' + i"
+            class="replace-ul"
+            :style="{ overflow: isJudgingRightWrong ? 'hidden' : 'scroll' }"
+            @scroll="handleScroll($event, i)"
+          >
             <li
               v-for="(items, indexs) in item"
               :key="indexs"
@@ -25,7 +26,7 @@
             </li>
           </ul>
         </template>
-        <span v-else class="select-item">{{ item[0].content }}</span>
+        <span v-else class="select-item replace-ul">{{ item[0].content }}</span>
       </div>
       <SoundRecordPreview
         :wav-blob.sync="answer.answer_list[0].audio_file_id"
@@ -64,10 +65,15 @@ export default {
       deep: true,
       immediate: true,
     },
+    isJudgingRightWrong: {
+      handler(val) {
+        if (!val) return;
+        this.handleData();
+      },
+      immediate: true,
+    },
   },
-  created() {
-    // this.handleData();
-  },
+  created() {},
   mounted() {},
   methods: {
     // 初始化数据
@@ -94,8 +100,22 @@ export default {
       option_lists.forEach((option_item) => {
         if (option_item.length > 0) {
           this.option_list.push(option_item);
-          this.answer.answer_list[0].mark_list.push(option_item.length > 1 ? option_item[0].mark : '');
-          this.active_content.push(option_item.length > 1 ? option_item[0].content : '');
+          if (this.isJudgingRightWrong) {
+            this.active_content.push('');
+            this.answer.answer_list[0].mark_list.forEach((item_mark, index_mark) => {
+              option_item.forEach((option_items, index_items) => {
+                if (item_mark === option_items.mark) {
+                  this.active_content[index_mark] = option_items.content;
+                  setTimeout(() => {
+                    this.$refs[`ui${index_mark}`][0].scrollTop = index_items * 48;
+                  }, 100);
+                }
+              });
+            });
+          } else {
+            this.answer.answer_list[0].mark_list.push(option_item.length > 1 ? option_item[0].mark : '');
+            this.active_content.push(option_item.length > 1 ? option_item[0].content : '');
+          }
         }
       });
     },
@@ -108,6 +128,7 @@ export default {
       this.$forceUpdate();
     },
     handleClickItem(i, indexs) {
+      if (this.isJudgingRightWrong) return;
       this.$refs[`ui${i}`][0].scrollTop = indexs * 48;
       this.active_content[i] = this.option_list[i][indexs].content;
       this.answer.answer_list[0].mark_list[i] = this.option_list[i][indexs].mark;

+ 5 - 3
src/views/exercise_questions/preview/SortPreview.vue

@@ -44,7 +44,7 @@
         </div>
       </transition-group>
     </draggable>
-    <template v-if="isJudgingRightWrong">
+    <template v-if="isJudgingRightWrong && !is_all_right">
       <h4 class="right-title">正确答案:</h4>
       <draggable
         v-model="move_list"
@@ -87,6 +87,7 @@ export default {
       drag: false,
       click_index_list: [], // 点击选中的索引
       disrupted: false, // 是否打乱
+      is_all_right: false, // 是否全对
     };
   },
   watch: {
@@ -103,11 +104,12 @@ export default {
       handler(val) {
         if (!val) return;
 
-        this.move_list = this.answer.answer_list.map((item, i) => {
+        this.move_list = this.answer.answer_list.map((item) => {
           return {
             ...this.data.option_list.find((items) => items.mark === item),
           };
         });
+        this.is_all_right = JSON.stringify(this.answer.answer_list) === JSON.stringify(this.data.answer.answer_list);
       },
       immediate: true,
     },
@@ -115,7 +117,7 @@ export default {
       handler(val) {
         if (!val) return;
         this.disrupted = false;
-        this.move_list = this.shuffle(val.slice()).map((item, i) => ({
+        this.move_list = this.shuffle(val.slice()).map((item) => ({
           ...item,
         }));
       },

+ 8 - 8
src/views/exercise_questions/preview/WritePictruePreview.vue

@@ -1,6 +1,6 @@
 <!-- eslint-disable vue/no-v-html -->
 <template>
-  <div class="writepicture-preview" v-if="show_preview">
+  <div v-if="show_preview" class="writepicture-preview">
     <div class="stem">
       <span class="question-number">{{ data.property.question_number }}.</span>
       <span v-html="sanitizeHTML(data.stem)"></span>
@@ -12,36 +12,37 @@
       v-html="sanitizeHTML(data.description)"
     ></div>
     <div class="content">
-      <div class="content-item" v-for="(item, index) in data.option_list" :key="index">
+      <div v-for="(item, index) in data.option_list" :key="index" class="content-item">
         <el-image
           v-if="pic_list[item.picture_file_id]"
           style="width: 370px; height: 238px"
           :src="pic_list[item.picture_file_id]"
           fit="contain"
-          @click="active_index = index"
           :class="[active_index !== index ? 'not-active' : '']"
+          @click="active_index = index"
         />
         <h3 class="pic-title" v-html="sanitizeHTML(item.picture_title)"></h3>
         <p class="pic-info" v-html="sanitizeHTML(item.picture_info)"></p>
       </div>
     </div>
 
-    <div class="content-right" v-if="answer.answer_list[active_index]">
+    <div v-if="answer.answer_list[active_index]" class="content-right">
       <el-input
-        v-model="answer.answer_list[active_index].value"
+        v-model="answer.answer_list[active_index].text"
         rows="12"
         resize="none"
         type="textarea"
         placeholder="请输入"
         :maxlength="data.property.word_num"
         show-word-limit
-        @input="handleInput"
         :readonly="isJudgingRightWrong"
+        @input="handleInput"
       />
     </div>
     <template v-if="isEnable(data.property.is_enable_upload_accessory)">
       <!-- 上传附件 -->
       <UploadFiles
+        v-if="answer.answer_list[active_index]"
         :disabled="isJudgingRightWrong"
         :fille-number="999"
         file-type-name="文件"
@@ -50,7 +51,6 @@
         upload-title="上传附件:"
         @upload="handleUpload"
         @deleteFile="handleDelete"
-        v-if="answer.answer_list[active_index]"
       />
     </template>
     <template v-if="isEnable(data.property.is_enable_sample_text) && isShowRightAnswer">
@@ -114,7 +114,7 @@ export default {
         this.data.option_list.forEach((item) => {
           let obj = {
             mark: item.mark,
-            value: '',
+            text: '',
             accessory_file_id: [], // 上传文件列表
           };
           this.answer.answer_list.push(obj);

+ 3 - 3
src/views/exercise_questions/preview/components/common/FreewriteLettle.vue

@@ -18,13 +18,13 @@
           :width="width"
           class="vueEsign"
         />
-        <a class="clean-btn" @click="resetHuahua" v-if="!disabled">
+        <a v-if="!disabled" class="clean-btn" @click="resetHuahua">
           <SvgIcon icon-class="reset" class="reset-btn" />
         </a>
       </div>
       <ul class="nav-list">
         <li :class="currenHzData && currenHzData.history ? '' : 'disabled'" @click="play()">播放</li>
-        <li @click="handleWriteImg" :class="disabled ? 'disabled' : ''">保存</li>
+        <li :class="disabled ? 'disabled' : ''" @click="handleWriteImg">保存</li>
       </ul>
     </div>
   </div>
@@ -116,7 +116,7 @@ export default {
           this.$message.warning('请等待播放完成');
           return;
         }
-        this.$refs.esign.reset();
+        if (this.$refs.esign) this.$refs.esign.reset();
         this.hasPlay = true;
         let c = document.getElementById('esign');
         let cxt = document.getElementById('esign').getContext('2d');