|  | @@ -10,69 +10,71 @@
 | 
	
		
			
				|  |  |        class="description rich-text"
 | 
	
		
			
				|  |  |        v-html="sanitizeHTML(data.description)"
 | 
	
		
			
				|  |  |      ></div>
 | 
	
		
			
				|  |  | -    <draggable
 | 
	
		
			
				|  |  | -      v-model="move_list"
 | 
	
		
			
				|  |  | -      animation="300"
 | 
	
		
			
				|  |  | -      :options="{
 | 
	
		
			
				|  |  | -        group: { name: 'itxst', pull: 'clone' },
 | 
	
		
			
				|  |  | -      }"
 | 
	
		
			
				|  |  | -      :sort="!disabled"
 | 
	
		
			
				|  |  | -      :class="['content-box', 'content-box-' + data.property.layout_type]"
 | 
	
		
			
				|  |  | -      @start="onStart($event)"
 | 
	
		
			
				|  |  | -      @end="onEnd($event)"
 | 
	
		
			
				|  |  | +    <div
 | 
	
		
			
				|  |  | +      v-for="(move_item, move_index) in move_list"
 | 
	
		
			
				|  |  | +      :key="move_index"
 | 
	
		
			
				|  |  | +      :class="['move-box-' + data.property.layout_type]"
 | 
	
		
			
				|  |  |      >
 | 
	
		
			
				|  |  | -      <transition-group>
 | 
	
		
			
				|  |  | -        <div
 | 
	
		
			
				|  |  | -          v-for="(itemNode, indexNode) in move_list"
 | 
	
		
			
				|  |  | -          :key="indexNode"
 | 
	
		
			
				|  |  | -          :class="[
 | 
	
		
			
				|  |  | -            'drag-item',
 | 
	
		
			
				|  |  | -            { error: itemNode.mark !== data.option_list[indexNode].mark && isJudgingRightWrong },
 | 
	
		
			
				|  |  | -            click_index_list.indexOf(indexNode) > -1 ? 'drag-item-active' : '',
 | 
	
		
			
				|  |  | -          ]"
 | 
	
		
			
				|  |  | -          @click="handleClickItem(indexNode)"
 | 
	
		
			
				|  |  | -        >
 | 
	
		
			
				|  |  | -          <!-- <SvgIcon
 | 
	
		
			
				|  |  | -            v-if="data.property.layout_type === 'vertical'"
 | 
	
		
			
				|  |  | -            class="drag-icon"
 | 
	
		
			
				|  |  | -            :size="20"
 | 
	
		
			
				|  |  | -            icon-class="draggable"
 | 
	
		
			
				|  |  | -          /> -->
 | 
	
		
			
				|  |  | -          <span class="drag-content rich-text" v-html="sanitizeHTML(itemNode.content)"></span>
 | 
	
		
			
				|  |  | -          <!-- <SvgIcon
 | 
	
		
			
				|  |  | -            v-if="data.property.layout_type === 'horizontal'"
 | 
	
		
			
				|  |  | -            class="drag-icon"
 | 
	
		
			
				|  |  | -            :size="20"
 | 
	
		
			
				|  |  | -            icon-class="draggable"
 | 
	
		
			
				|  |  | -          /> -->
 | 
	
		
			
				|  |  | -        </div>
 | 
	
		
			
				|  |  | -      </transition-group>
 | 
	
		
			
				|  |  | -    </draggable>
 | 
	
		
			
				|  |  | -    <template v-if="isShowRightAnswer && !is_all_right">
 | 
	
		
			
				|  |  | -      <h4 class="right-title">正确答案:</h4>
 | 
	
		
			
				|  |  | +      <span class="option-number" v-if="data.property.layout_type === 'horizontal'"
 | 
	
		
			
				|  |  | +        >{{ computeOptionMethods[data.option_number_show_mode](move_index) }}
 | 
	
		
			
				|  |  | +      </span>
 | 
	
		
			
				|  |  |        <draggable
 | 
	
		
			
				|  |  | -        v-model="move_list"
 | 
	
		
			
				|  |  | +        v-model="move_list[move_index]"
 | 
	
		
			
				|  |  |          animation="300"
 | 
	
		
			
				|  |  |          :options="{
 | 
	
		
			
				|  |  |            group: { name: 'itxst', pull: 'clone' },
 | 
	
		
			
				|  |  |          }"
 | 
	
		
			
				|  |  | -        :sort="false"
 | 
	
		
			
				|  |  | +        :sort="!disabled"
 | 
	
		
			
				|  |  |          :class="['content-box', 'content-box-' + data.property.layout_type]"
 | 
	
		
			
				|  |  | +        @start="onStart($event)"
 | 
	
		
			
				|  |  | +        @end="onEnd($event)"
 | 
	
		
			
				|  |  | +        :group="'move' + move_index"
 | 
	
		
			
				|  |  |        >
 | 
	
		
			
				|  |  |          <transition-group>
 | 
	
		
			
				|  |  |            <div
 | 
	
		
			
				|  |  | -            v-for="(itemNode, indexNode) in data.option_list"
 | 
	
		
			
				|  |  | +            v-for="(itemNode, indexNode) in move_item"
 | 
	
		
			
				|  |  |              :key="indexNode"
 | 
	
		
			
				|  |  |              :class="[
 | 
	
		
			
				|  |  |                'drag-item',
 | 
	
		
			
				|  |  | -              { error: itemNode.mark !== data.option_list[indexNode].mark && isJudgingRightWrong },
 | 
	
		
			
				|  |  | -              click_index_list.indexOf(indexNode) > -1 ? 'drag-item-active' : '',
 | 
	
		
			
				|  |  | +              { error: itemNode.mark !== data.option_list[move_index][indexNode].mark && isJudgingRightWrong },
 | 
	
		
			
				|  |  | +              click_index_list.indexOf(indexNode) > -1 && select_index === move_index ? 'drag-item-active' : '',
 | 
	
		
			
				|  |  |              ]"
 | 
	
		
			
				|  |  | +            @click="handleClickItem(move_index, indexNode)"
 | 
	
		
			
				|  |  |            >
 | 
	
		
			
				|  |  |              <span class="drag-content rich-text" v-html="sanitizeHTML(itemNode.content)"></span>
 | 
	
		
			
				|  |  |            </div>
 | 
	
		
			
				|  |  |          </transition-group>
 | 
	
		
			
				|  |  |        </draggable>
 | 
	
		
			
				|  |  | +    </div>
 | 
	
		
			
				|  |  | +    <template v-if="isShowRightAnswer && !is_all_right">
 | 
	
		
			
				|  |  | +      <h4 class="right-title">正确答案:</h4>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      <template v-for="(move_item, move_index) in data.option_list">
 | 
	
		
			
				|  |  | +        <div
 | 
	
		
			
				|  |  | +          v-if="JSON.stringify(answer.answer_list[move_index]) !== JSON.stringify(data.answer.answer_list[move_index])"
 | 
	
		
			
				|  |  | +          :key="'answer' + move_index"
 | 
	
		
			
				|  |  | +          :class="['move-box-' + data.property.layout_type]"
 | 
	
		
			
				|  |  | +        >
 | 
	
		
			
				|  |  | +          <span class="option-number" v-if="data.property.layout_type === 'horizontal'"
 | 
	
		
			
				|  |  | +            >{{ computeOptionMethods[data.option_number_show_mode](move_index) }}
 | 
	
		
			
				|  |  | +          </span>
 | 
	
		
			
				|  |  | +          <draggable
 | 
	
		
			
				|  |  | +            v-model="move_list[move_index]"
 | 
	
		
			
				|  |  | +            animation="300"
 | 
	
		
			
				|  |  | +            :options="{
 | 
	
		
			
				|  |  | +              group: { name: 'itxst', pull: 'clone' },
 | 
	
		
			
				|  |  | +            }"
 | 
	
		
			
				|  |  | +            :sort="false"
 | 
	
		
			
				|  |  | +            :class="['content-box', 'content-box-' + data.property.layout_type]"
 | 
	
		
			
				|  |  | +          >
 | 
	
		
			
				|  |  | +            <transition-group>
 | 
	
		
			
				|  |  | +              <div v-for="(itemNode, indexNode) in move_item" :key="'answer-item' + indexNode" :class="['drag-item']">
 | 
	
		
			
				|  |  | +                <span class="drag-content rich-text" v-html="sanitizeHTML(itemNode.content)"></span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </transition-group>
 | 
	
		
			
				|  |  | +          </draggable>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +      </template>
 | 
	
		
			
				|  |  |      </template>
 | 
	
		
			
				|  |  |    </div>
 | 
	
		
			
				|  |  |  </template>
 | 
	
	
		
			
				|  | @@ -80,6 +82,7 @@
 | 
	
		
			
				|  |  |  <script>
 | 
	
		
			
				|  |  |  import Draggable from 'vuedraggable';
 | 
	
		
			
				|  |  |  import PreviewMixin from './components/PreviewMixin';
 | 
	
		
			
				|  |  | +import { computeOptionMethods } from '@/views/exercise_questions/data/common';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  export default {
 | 
	
		
			
				|  |  |    name: 'SortPreview',
 | 
	
	
		
			
				|  | @@ -87,19 +90,24 @@ export default {
 | 
	
		
			
				|  |  |    mixins: [PreviewMixin],
 | 
	
		
			
				|  |  |    data() {
 | 
	
		
			
				|  |  |      return {
 | 
	
		
			
				|  |  | +      computeOptionMethods,
 | 
	
		
			
				|  |  |        move_list: [], // 移动后的数组
 | 
	
		
			
				|  |  |        drag: false,
 | 
	
		
			
				|  |  |        click_index_list: [], // 点击选中的索引
 | 
	
		
			
				|  |  |        disrupted: false, // 是否打乱
 | 
	
		
			
				|  |  |        is_all_right: false, // 是否全对
 | 
	
		
			
				|  |  | +      select_index: null, // 点击拖动时选中的小题数
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |    },
 | 
	
		
			
				|  |  |    watch: {
 | 
	
		
			
				|  |  |      move_list: {
 | 
	
		
			
				|  |  |        handler(val) {
 | 
	
		
			
				|  |  |          if (!val || this.isJudgingRightWrong) return;
 | 
	
		
			
				|  |  | -        this.answer.answer_list = val.map(({ mark }) => {
 | 
	
		
			
				|  |  | -          return mark;
 | 
	
		
			
				|  |  | +        this.answer.answer_list = val.map((item) => {
 | 
	
		
			
				|  |  | +          let answer_item = item.map((items) => {
 | 
	
		
			
				|  |  | +            return items.mark;
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +          return answer_item;
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |        },
 | 
	
		
			
				|  |  |        deep: true,
 | 
	
	
		
			
				|  | @@ -108,10 +116,13 @@ export default {
 | 
	
		
			
				|  |  |        handler(val) {
 | 
	
		
			
				|  |  |          if (!val) return;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        this.move_list = this.answer.answer_list.map((item) => {
 | 
	
		
			
				|  |  | -          return {
 | 
	
		
			
				|  |  | -            ...this.data.option_list.find((items) => items.mark === item),
 | 
	
		
			
				|  |  | -          };
 | 
	
		
			
				|  |  | +        this.move_list = this.answer.answer_list.map((item, index) => {
 | 
	
		
			
				|  |  | +          let move_item = item.map((itemm) => {
 | 
	
		
			
				|  |  | +            return {
 | 
	
		
			
				|  |  | +              ...this.data.option_list[index].find((items) => items.mark === itemm),
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +          return move_item;
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |          this.is_all_right = JSON.stringify(this.answer.answer_list) === JSON.stringify(this.data.answer.answer_list);
 | 
	
		
			
				|  |  |        },
 | 
	
	
		
			
				|  | @@ -121,9 +132,15 @@ export default {
 | 
	
		
			
				|  |  |        handler(val) {
 | 
	
		
			
				|  |  |          if (!val) return;
 | 
	
		
			
				|  |  |          this.disrupted = false;
 | 
	
		
			
				|  |  | -        this.move_list = this.shuffle(val.slice()).map((item) => ({
 | 
	
		
			
				|  |  | -          ...item,
 | 
	
		
			
				|  |  | -        }));
 | 
	
		
			
				|  |  | +        this.move_list = val.slice().map((item, index) => {
 | 
	
		
			
				|  |  | +          let shuffe_item = this.shuffle(item.slice()).map(
 | 
	
		
			
				|  |  | +            (items) => ({
 | 
	
		
			
				|  |  | +              ...items,
 | 
	
		
			
				|  |  | +            }),
 | 
	
		
			
				|  |  | +            index === val.length - 1,
 | 
	
		
			
				|  |  | +          );
 | 
	
		
			
				|  |  | +          return shuffe_item;
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  |        },
 | 
	
		
			
				|  |  |        deep: true,
 | 
	
		
			
				|  |  |        immediate: true,
 | 
	
	
		
			
				|  | @@ -136,15 +153,16 @@ export default {
 | 
	
		
			
				|  |  |        },
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |    },
 | 
	
		
			
				|  |  | +  mounted() {},
 | 
	
		
			
				|  |  |    methods: {
 | 
	
		
			
				|  |  |      // 随机打乱数组顺序
 | 
	
		
			
				|  |  | -    shuffle(arr) {
 | 
	
		
			
				|  |  | +    shuffle(arr, flag) {
 | 
	
		
			
				|  |  |        if (this.disrupted) return arr;
 | 
	
		
			
				|  |  |        for (let i = arr.length - 1; i > 0; i--) {
 | 
	
		
			
				|  |  |          const j = Math.floor(Math.random() * (i + 1));
 | 
	
		
			
				|  |  |          [arr[i], arr[j]] = [arr[j], arr[i]];
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | -      this.disrupted = true;
 | 
	
		
			
				|  |  | +      this.disrupted = flag;
 | 
	
		
			
				|  |  |        return arr;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      onStart() {
 | 
	
	
		
			
				|  | @@ -153,26 +171,29 @@ export default {
 | 
	
		
			
				|  |  |      // 拖拽结束事件
 | 
	
		
			
				|  |  |      onEnd() {
 | 
	
		
			
				|  |  |        this.drag = false;
 | 
	
		
			
				|  |  | -      // this.changeuserAnswerJudge();
 | 
	
		
			
				|  |  |        this.$forceUpdate();
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | -    // 判断对错
 | 
	
		
			
				|  |  | -    changeuserAnswerJudge() {
 | 
	
		
			
				|  |  | -      this.move_list.forEach((item, index) => {
 | 
	
		
			
				|  |  | -        item.correct = item.mark === this.data.option_list[index].mark;
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  |      // 点击item
 | 
	
		
			
				|  |  | -    handleClickItem(indexNode) {
 | 
	
		
			
				|  |  | +    handleClickItem(index, indexNode) {
 | 
	
		
			
				|  |  |        // 查看答案模式下需要禁用
 | 
	
		
			
				|  |  |        if (this.disabled) return;
 | 
	
		
			
				|  |  | +      if (this.click_index_list.length !== 0) {
 | 
	
		
			
				|  |  | +        let indexs = this.select_index;
 | 
	
		
			
				|  |  | +        if (Number(indexs) !== Number(index)) {
 | 
	
		
			
				|  |  | +          this.click_index_list = [];
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      this.select_index = index;
 | 
	
		
			
				|  |  |        this.click_index_list.push(indexNode);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      // 点击交换
 | 
	
		
			
				|  |  |      changeSort() {
 | 
	
		
			
				|  |  | -      [this.move_list[this.click_index_list[0]], this.move_list[this.click_index_list[1]]] = [
 | 
	
		
			
				|  |  | -        this.move_list[this.click_index_list[1]],
 | 
	
		
			
				|  |  | -        this.move_list[this.click_index_list[0]],
 | 
	
		
			
				|  |  | +      let indexs = this.select_index;
 | 
	
		
			
				|  |  | +      let index1 = this.click_index_list[0];
 | 
	
		
			
				|  |  | +      let index2 = this.click_index_list[1];
 | 
	
		
			
				|  |  | +      [this.move_list[indexs][index1], this.move_list[indexs][index2]] = [
 | 
	
		
			
				|  |  | +        this.move_list[indexs][index2],
 | 
	
		
			
				|  |  | +        this.move_list[indexs][index1],
 | 
	
		
			
				|  |  |        ];
 | 
	
		
			
				|  |  |        this.click_index_list = [];
 | 
	
		
			
				|  |  |      },
 | 
	
	
		
			
				|  | @@ -186,6 +207,15 @@ export default {
 | 
	
		
			
				|  |  |  .sort-preview {
 | 
	
		
			
				|  |  |    @include preview;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  .move-box-horizontal {
 | 
	
		
			
				|  |  | +    display: flex;
 | 
	
		
			
				|  |  | +    column-gap: 8px;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    .option-number {
 | 
	
		
			
				|  |  | +      line-height: 50px;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    .content-box {
 | 
	
		
			
				|  |  |      .drag-item {
 | 
	
		
			
				|  |  |        display: flex;
 |