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