|
@@ -9,7 +9,7 @@
|
|
|
<div
|
|
|
v-for="({ content, mark }, j) in item"
|
|
|
:key="mark"
|
|
|
- :class="['item-wrapper', `item-${mark}`]"
|
|
|
+ :class="['item-wrapper', `item-${mark}`, computedAnswerClass(mark)]"
|
|
|
:style="{ cursor: disabled ? 'default' : 'pointer' }"
|
|
|
@mousedown="mousedown($event, i, j, mark)"
|
|
|
@mouseup="mouseup($event, i, j, mark)"
|
|
@@ -69,6 +69,63 @@ export default {
|
|
|
},
|
|
|
immediate: true,
|
|
|
},
|
|
|
+ answerList: {
|
|
|
+ handler(list) {
|
|
|
+ let arr = [];
|
|
|
+ let column_number = this.data.property.column_num;
|
|
|
+ // 从前往后遍历,如果有 nextMark,就往后找,直到没有 nextMark
|
|
|
+ // 如果第一个选项的 nextMark 为空,则整个行都为空,等待后面的 preArr 填充
|
|
|
+ list.forEach((item, i) => {
|
|
|
+ let { mark, nextMark } = item[0];
|
|
|
+ arr[i] = nextMark ? [mark, nextMark] : new Array(column_number).fill('');
|
|
|
+ let _nextMark = nextMark;
|
|
|
+ while (_nextMark) {
|
|
|
+ let fMark = this.findMark(list, _nextMark, 'next');
|
|
|
+ if (column_number > arr[i].length) {
|
|
|
+ arr[i].push(fMark);
|
|
|
+ }
|
|
|
+ _nextMark = fMark;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ let emptyStringArray = []; // 无数据的列的下标数组
|
|
|
+ arr.forEach((item, i) => {
|
|
|
+ item.every((li) => li.length <= 0) ? emptyStringArray.push(i) : '';
|
|
|
+ });
|
|
|
+ if (column_number === 2) {
|
|
|
+ this.answer.answer_list = arr;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 从后向前遍历,如果有 preMark,就往前找,直到没有 preMark,并过滤掉无数据的列
|
|
|
+ let preArr = [];
|
|
|
+ list.forEach((item) => {
|
|
|
+ let { mark, preMark } = item[column_number - 1];
|
|
|
+ let _arr = new Array(column_number).fill('');
|
|
|
+ let back = column_number - 1;
|
|
|
+ let _preMark = preMark;
|
|
|
+ while (_preMark) {
|
|
|
+ _arr[back] = mark;
|
|
|
+ back -= 1;
|
|
|
+ _arr[back] = _preMark;
|
|
|
+ back -= 1;
|
|
|
+ let fMark = this.findMark(list, _preMark, 'pre');
|
|
|
+ if (back >= 0 && fMark) {
|
|
|
+ _arr[back] = fMark;
|
|
|
+ }
|
|
|
+ _preMark = fMark;
|
|
|
+ }
|
|
|
+ if (_arr.every((li) => li.length <= 0) || _arr.every((li) => li.length > 0)) return;
|
|
|
+ preArr.push(_arr);
|
|
|
+ });
|
|
|
+ // 将 preArr 中的数据填充到 arr 无数据的位置中
|
|
|
+ if (preArr.length > 0 && emptyStringArray.length > 0) {
|
|
|
+ preArr.forEach((item, i) => {
|
|
|
+ arr[emptyStringArray[i]] = item;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ this.answer.answer_list = arr;
|
|
|
+ },
|
|
|
+ deep: true,
|
|
|
+ },
|
|
|
isJudgingRightWrong(cur) {
|
|
|
if (cur) {
|
|
|
this.clearLine();
|
|
@@ -81,7 +138,6 @@ export default {
|
|
|
if (cur) {
|
|
|
this.$nextTick(() => {
|
|
|
this.circulateAnswerList(true);
|
|
|
- this.judgeRichTextIsImgAndText(true);
|
|
|
});
|
|
|
}
|
|
|
},
|
|
@@ -232,7 +288,8 @@ export default {
|
|
|
circulateAnswerList(isShowRightAnswer = false) {
|
|
|
let answer_list = isShowRightAnswer ? this.data.answer.answer_list : this.answer.answer_list;
|
|
|
answer_list.forEach((item) => {
|
|
|
- item.forEach((mark, j) => {
|
|
|
+ item.forEach((_m, j) => {
|
|
|
+ let mark = isShowRightAnswer ? _m.mark : _m;
|
|
|
if (mark.length <= 0 || j >= item.length - 1) return;
|
|
|
|
|
|
let cur = { i: -1, j: -1 }; // 当前连线点
|
|
@@ -245,7 +302,7 @@ export default {
|
|
|
});
|
|
|
});
|
|
|
this.curConnectionPoint = { i: cur.i, j: cur.j, mark };
|
|
|
- this.createLine(item[j + 1], false, isShowRightAnswer);
|
|
|
+ this.createLine(item[j + 1].mark, false, isShowRightAnswer);
|
|
|
});
|
|
|
});
|
|
|
},
|
|
@@ -385,6 +442,60 @@ export default {
|
|
|
}),
|
|
|
);
|
|
|
},
|
|
|
+ /**
|
|
|
+ * 根据 mark 查找 nextMark 或 preMark
|
|
|
+ * @param {Array} list 答案列表
|
|
|
+ * @param {String} mark 标记
|
|
|
+ * @param {'pre'|'next'} type 类型
|
|
|
+ * @returns {String} 返回 nextMark 或 preMark
|
|
|
+ */
|
|
|
+ findMark(list, mark, type) {
|
|
|
+ let fMark = '';
|
|
|
+ list.find((item) => {
|
|
|
+ return item.find((li) => {
|
|
|
+ if (mark === li.mark) {
|
|
|
+ fMark = type === 'pre' ? li.preMark : li.nextMark;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ return fMark;
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 计算答题对错选项class
|
|
|
+ * @param {string} mark 选项标识
|
|
|
+ */
|
|
|
+ computedAnswerClass(mark) {
|
|
|
+ if (!this.isJudgingRightWrong) return '';
|
|
|
+ let answer = this.data.answer.answer_list.find((item) => {
|
|
|
+ return item.some((li) => li.mark === mark);
|
|
|
+ });
|
|
|
+ return this.is2DArrayContains1DArray(this.answer.answer_list, answer) ? 'right' : 'wrong';
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 判断二维数组是否包含一维数组
|
|
|
+ * @param {array} arr2D 二维数组
|
|
|
+ * @param {array} arr1D 一维数组
|
|
|
+ */
|
|
|
+ is2DArrayContains1DArray(arr2D, arr1D) {
|
|
|
+ for (let i = 0; i < arr2D.length; i++) {
|
|
|
+ const currentArray = arr2D[i];
|
|
|
+ if (currentArray.length !== arr1D.length) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ let found = true;
|
|
|
+ for (let j = 0; j < currentArray.length; j++) {
|
|
|
+ if (currentArray[j] !== arr1D[j]) {
|
|
|
+ found = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (found) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ },
|
|
|
},
|
|
|
};
|
|
|
</script>
|