Kaynağa Gözat

修改问题

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

+ 5 - 0
src/views/exercise_questions/create/components/create.vue

@@ -84,6 +84,10 @@ export default {
       type: Array,
       required: true,
     },
+    loading: {
+      type: Boolean,
+      required: true,
+    },
   },
   data() {
     return {
@@ -190,6 +194,7 @@ export default {
      */
     async saveQuestion() {
       if (this.indexList.length <= 0) return;
+      if (this.loading) return;
       try {
         this.$bus.$emit('saveQuestion');
         await SaveQuestion(this.dataConversion());

+ 9 - 2
src/views/exercise_questions/create/components/exercises/MatchingQuestion.vue

@@ -15,8 +15,8 @@
         <ul>
           <li v-for="(item, i) in data.option_list" :key="i" class="content-item">
             <div v-for="(li, j) in item" :key="li.mark" class="item-cell">
-              <span v-if="j === 0" class="question-number">
-                {{ i + 1 }}
+              <span v-if="j === 0" class="question-number" title="双击切换序号类型" @dblclick="changeOptionType(data)">
+                {{ computedQuestionNumber(i, data.option_number_show_mode) }}
               </span>
               <RichText v-model="li.content" placeholder="输入内容" :inline="true" />
               <span v-if="data.property.column_number > j + 1" class="horizontal-line"></span>
@@ -58,6 +58,11 @@
             <el-option v-for="item in fontSizeList" :key="item" :label="item" :value="item" />
           </el-select>
         </el-form-item>
+        <el-form-item label="选项题号">
+          <el-select v-model="data.property.option_question_number_font_size">
+            <el-option v-for="item in fontSizeList" :key="item" :label="item" :value="item" />
+          </el-select>
+        </el-form-item>
         <el-form-item label="提示">
           <el-radio
             v-for="{ value, label } in switchOption"
@@ -105,6 +110,7 @@
 import RichText from '@/components/common/RichText.vue';
 import QuestionMixin from '../common/QuestionMixin.js';
 
+import { changeOptionType } from '@/views/exercise_questions/data/common';
 import { columnNumberList, getOption, getMatchingDataTemplate } from '@/views/exercise_questions/data/matching';
 
 export default {
@@ -113,6 +119,7 @@ export default {
   mixins: [QuestionMixin],
   data() {
     return {
+      changeOptionType,
       columnNumberList,
       data: getMatchingDataTemplate(),
     };

+ 2 - 2
src/views/exercise_questions/create/components/exercises/SortQuestion.vue

@@ -148,8 +148,8 @@ export default {
     'data.option_list': {
       handler(val) {
         if (!val) return;
-        this.data.answer.answer_list = val.map((item) => {
-          let value_list = item.data_list.map((items) => {
+        this.data.answer.answer_list = val?.map((item) => {
+          let value_list = item.data_list?.map((items) => {
             return items.mark;
           });
           let answer_item = {

+ 12 - 1
src/views/exercise_questions/create/index.vue

@@ -37,6 +37,7 @@
       ref="createMain"
       :cur-index="curIndex"
       :index-list="index_list"
+      :loading="loading"
       @selectExerciseItem="selectExerciseItem"
       @setPreview="setPreview"
       @deleteQuestion="deleteQuestion"
@@ -105,6 +106,7 @@ export default {
     const { id, back_url } = this.$route.query;
 
     return {
+      loading: false, // 题目加载中
       exercise_id: id, // 练习id
       exercise: { name: '' }, // 练习信息
       isEditExercise: false, // 是否编辑练习
@@ -212,8 +214,12 @@ export default {
      */
     getQuestionInfo() {
       if (this.index_list.length === 0) return;
+      this.$refs.createMain.clearSaveDate();
+      this.loading = true;
+      let curI = this.curIndex;
       GetQuestionInfo({ question_id: this.index_list[this.curIndex].id })
         .then(({ question, file_list }) => {
+          if (curI !== this.curIndex) return;
           this.$refs.createMain.resetSaveDate();
           if (!question.content) return;
           // 将题目文件id列表添加到题目内容中
@@ -224,6 +230,7 @@ export default {
           this.$nextTick(() => {
             this.$refs.createMain.$refs.exercise?.[0].setQuestion(content);
             this.refreshPreviewData();
+            this.loading = false;
           });
         })
         .catch(() => {});
@@ -316,11 +323,12 @@ export default {
       } else if (isEffectCurIndex) {
         this.curIndex = newIndex < this.curIndex ? this.curIndex + 1 : this.curIndex - 1;
       }
+      this.isMoveQuestion = false;
       if (isMoveCur || isEffectCurIndex) {
         this.$nextTick(() => {
           this.$refs.createMain.$refs.exercise?.[0].setQuestion(this.moveQuestionData);
-          this.isMoveQuestion = false;
           this.refreshPreviewData();
+          this.$refs.createMain.resetSaveDate();
         });
       }
 
@@ -332,10 +340,12 @@ export default {
       })
         .then(() => {
           this.$message.success('移动成功');
+          let curI = this.curIndex;
           // 移动题目后,单独更新当前题目的题号
           GetQuestionInfo({ question_id: this.index_list[this.curIndex].id })
             .then(({ question }) => {
               if (!question) return;
+              if (curI !== this.curIndex) return;
               this.$refs.createMain.$refs.exercise?.[0].setQuestionNumber(question.question_number);
             })
             .catch(() => {});
@@ -351,6 +361,7 @@ export default {
      * @param {number} param.oldIndex 移动前的索引
      */
     handleStart({ newIndex, oldIndex }) {
+      this.$refs.createMain.clearSaveDate();
       let isMoveCur = newIndex === this.curIndex || oldIndex === this.curIndex; // 是否移动当前题目
       let isEffectCurIndex = newIndex < this.curIndex !== oldIndex < this.curIndex; // 是否影响当前题目索引
       if (isMoveCur || isEffectCurIndex) {

+ 2 - 1
src/views/exercise_questions/data/matching.js

@@ -31,7 +31,7 @@ export function getMatchingDataTemplate() {
   return {
     type: 'matching', // 题型
     stem: '', // 题干
-    option_number_show_mode: optionTypeList[0].value, // 选项类型
+    option_number_show_mode: optionTypeList[1].value, // 选项类型
     description: '', // 描述
     option_list, // 选项
     file_id_list: [], // 文件 id 列表
@@ -41,6 +41,7 @@ export function getMatchingDataTemplate() {
       stem_type: stemTypeList[1].value, // 题干类型
       question_number: '1', // 题号
       stem_question_number_font_size: fontSizeList[6], // 题干题号
+      option_question_number_font_size: fontSizeList[5], // 选项题号
       column_number: columnNumberList[0].value, // 列数
       is_enable_description: switchOption[0].value, // 描述
       score: 1, // 分值

+ 15 - 2
src/views/exercise_questions/preview/MatchingPreview.vue

@@ -15,6 +15,9 @@
 
     <ul ref="list" class="option-list">
       <li v-for="(item, i) in optionList" :key="i" class="list-item">
+        <span class="serial-number" :style="{ fontSize: data.property.option_question_number_font_size }">
+          {{ computeOptionMethods[data.option_number_show_mode](i) }}
+        </span>
         <div
           v-for="({ content, mark }, j) in item"
           :key="mark"
@@ -43,7 +46,7 @@
 </template>
 
 <script>
-import { svgNS } from '@/views/exercise_questions/data/common';
+import { svgNS, computeOptionMethods } from '@/views/exercise_questions/data/common';
 
 import PreviewMixin from './components/PreviewMixin';
 
@@ -52,6 +55,7 @@ export default {
   mixins: [PreviewMixin],
   data() {
     return {
+      computeOptionMethods,
       answerList: [], // 答案列表
       curConnectionPoint: { i: -1, j: -1, mark: '' }, // 当前连线点
       // 拖拽相关
@@ -531,7 +535,12 @@ export default {
 
     .list-item {
       display: flex;
-      column-gap: 60px;
+      column-gap: 8px;
+      align-items: center;
+
+      .serial-number {
+        font-size: 16pt;
+      }
 
       .item-wrapper {
         display: flex;
@@ -543,6 +552,10 @@ export default {
         background-color: $content-color;
         border-radius: 40px;
 
+        &:not(:last-child) {
+          margin-right: 52px;
+        }
+
         &.focus {
           background-color: #dcdbdd;
         }

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

@@ -214,8 +214,7 @@ export default {
       let answerOption = this.data.answer.answer_list
         .find((item) => item.mark === mark)
         ?.value_list.find((item) => item.mark === liMark);
-      if (!selectOption) return '';
-      let selectValue = selectOption.value;
+      let selectValue = selectOption?.value;
       let answerValue = answerOption.value;
       let isRight = selectValue === answerValue;
       if (isRight) return '';