|
@@ -17,11 +17,13 @@
|
|
|
<div class="form" :style="{ width: `${data.property.form_width}px` }">
|
|
|
<div v-if="isEnable(data.property.is_enable_table_header)" class="form-header">
|
|
|
<div
|
|
|
- v-for="{ text, mark, width } in data.option_header_list"
|
|
|
+ v-for="({ text, mark, width }, i) in data.option_header_list"
|
|
|
:key="mark"
|
|
|
:style="{
|
|
|
- width: `${width}%`,
|
|
|
- paddingLeft: isEnable(data.property.is_enable_number_column) ? '40px' : '0',
|
|
|
+ borderLeft: isEnable(data.property.is_enable_number_column) || i > 0 ? '1px solid #165dff' : 'none',
|
|
|
+ width:
|
|
|
+ isEnable(data.property.is_enable_number_column) && i === 0 ? `calc(${width}% - 40px)` : `${width}%`,
|
|
|
+ marginLeft: isEnable(data.property.is_enable_number_column) && i === 0 ? '40px' : '0',
|
|
|
}"
|
|
|
class="header-item"
|
|
|
>
|
|
@@ -30,73 +32,38 @@
|
|
|
</div>
|
|
|
<div v-for="(item, i) in optionList" :key="i" class="form-content">
|
|
|
<div
|
|
|
- v-for="({ mark, content_list }, j) in item"
|
|
|
- :key="mark"
|
|
|
+ v-for="(li, j) in item"
|
|
|
+ :key="li.mark"
|
|
|
:style="{ width: `${data.option_header_list[j].width}%` }"
|
|
|
class="form-item"
|
|
|
>
|
|
|
<span v-if="j === 0 && isEnable(data.property.is_enable_number_column)" class="serial-number">
|
|
|
{{ i + 1 }}
|
|
|
</span>
|
|
|
- <div v-for="(li, k) in content_list" :key="k" class="item-content">
|
|
|
- <span v-if="li.type === 'text'" v-html="sanitizeHTML(li.content)"></span>
|
|
|
- <template v-else-if="li.type === 'input_any'">
|
|
|
- <el-input
|
|
|
- :key="k"
|
|
|
- v-model="li.content"
|
|
|
- :disabled="disabled"
|
|
|
- :class="['fill']"
|
|
|
- placeholder="请输入"
|
|
|
- :style="[
|
|
|
- { cursor: disabled ? 'not-allowed' : 'pointer' },
|
|
|
- { width: Math.max(80, li.content.length * 12) + 'pt' },
|
|
|
- ]"
|
|
|
- />
|
|
|
- </template>
|
|
|
- <template v-else-if="li.type === 'fill'">
|
|
|
- <el-input
|
|
|
- :key="k"
|
|
|
- v-model="li.content"
|
|
|
- :disabled="disabled"
|
|
|
- :class="['fill', ...computedAnswerClass(mark, li.mark)]"
|
|
|
- placeholder="请输入"
|
|
|
- :style="[
|
|
|
- { cursor: disabled ? 'not-allowed' : 'pointer' },
|
|
|
- { width: Math.max(80, li.content.length * 12) + 'pt' },
|
|
|
- ]"
|
|
|
- />
|
|
|
- <span
|
|
|
- v-show="computedAnswerText(mark, li.mark).length > 0"
|
|
|
- :key="`answer-${i}-${j}-${k}`"
|
|
|
- class="right-answer-content"
|
|
|
- >
|
|
|
- {{ computedAnswerText(mark, li.mark) }}
|
|
|
- </span>
|
|
|
- </template>
|
|
|
+ <div class="item-content">
|
|
|
+ <span v-if="li.type === 'text'">{{ li.text }}</span>
|
|
|
<template v-else-if="li.type === 'input'">
|
|
|
<el-input
|
|
|
- :key="k"
|
|
|
- v-model="li.content"
|
|
|
+ v-model="li.text"
|
|
|
:disabled="disabled"
|
|
|
- :class="['input', ...computedAnswerClass(mark, li.mark)]"
|
|
|
+ class="fill"
|
|
|
+ placeholder="请输入"
|
|
|
:style="[
|
|
|
{ cursor: disabled ? 'not-allowed' : 'pointer' },
|
|
|
- { width: Math.max(80, li.content.length * 12) + 'pt' },
|
|
|
+ { width: Math.max(80, li.text.length * 12) + 'pt' },
|
|
|
]"
|
|
|
/>
|
|
|
- <span
|
|
|
- v-show="computedAnswerText(mark, li.mark).length > 0"
|
|
|
- :key="`answer-${i}-${j}-${k}`"
|
|
|
- class="right-answer-fill"
|
|
|
- >
|
|
|
- {{ computedAnswerText(mark, li.mark) }}
|
|
|
- </span>
|
|
|
</template>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
+
|
|
|
+ <div v-if="isEnable(data.property.is_enable_reference_answer) && isShowRightAnswer" class="reference-box">
|
|
|
+ <h5 class="reference-title">参考答案</h5>
|
|
|
+ <span class="reference-answer">{{ data.reference_answer }}</span>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
@@ -122,106 +89,44 @@ export default {
|
|
|
},
|
|
|
optionList: {
|
|
|
handler(val) {
|
|
|
- val.forEach((item) => {
|
|
|
- item.forEach(({ mark, content_list }) => {
|
|
|
- let value_list = [];
|
|
|
- let answerIndex = this.answer.answer_list.findIndex((item) => item.mark === mark);
|
|
|
- content_list.forEach((li) => {
|
|
|
- if (['fill', 'input', 'input_any'].includes(li.type) && li.content.length > 0) {
|
|
|
- value_list.push({
|
|
|
+ if (!val) return;
|
|
|
+ this.optionList.forEach((item) => {
|
|
|
+ item.forEach((li) => {
|
|
|
+ if (['input'].includes(li.type)) {
|
|
|
+ let findIndex = this.answer.answer_list.findIndex(({ mark }) => mark === li.mark);
|
|
|
+ if (findIndex === -1 && li.text.length <= 0) {
|
|
|
+ this.answer.answer_list.splice(findIndex, 1);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (findIndex === -1) {
|
|
|
+ this.answer.answer_list.push({
|
|
|
mark: li.mark,
|
|
|
- value: li.content,
|
|
|
+ value: li.text,
|
|
|
});
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (findIndex !== -1) {
|
|
|
+ this.answer.answer_list[findIndex].value = li.text;
|
|
|
+ return;
|
|
|
}
|
|
|
- });
|
|
|
- if (answerIndex === -1 && value_list.length <= 0) return;
|
|
|
- if (answerIndex !== -1 && value_list.length <= 0) {
|
|
|
- this.answer.answer_list.splice(answerIndex, 1);
|
|
|
- return;
|
|
|
- }
|
|
|
- if (answerIndex !== -1) {
|
|
|
- this.answer.answer_list[answerIndex].value_list = value_list;
|
|
|
- return;
|
|
|
}
|
|
|
- this.answer.answer_list.push({
|
|
|
- mark,
|
|
|
- value_list,
|
|
|
- });
|
|
|
});
|
|
|
});
|
|
|
},
|
|
|
+ immediate: true,
|
|
|
deep: true,
|
|
|
},
|
|
|
isJudgingRightWrong(val) {
|
|
|
if (!val) return;
|
|
|
- this.answer.answer_list.forEach(({ mark, value_list }) => {
|
|
|
- this.optionList
|
|
|
- .find((item) => item.find((li) => li.mark === mark))
|
|
|
- .forEach((item) => {
|
|
|
- item.content_list.forEach((li) => {
|
|
|
- if (['fill', 'input', 'input_any'].includes(li.type)) {
|
|
|
- let answer = value_list.find((item) => item.mark === li.mark);
|
|
|
- if (!answer) return;
|
|
|
- li.content = answer.value;
|
|
|
- }
|
|
|
- });
|
|
|
- });
|
|
|
+ this.answer.answer_list.forEach(({ mark, value }) => {
|
|
|
+ const parentIndex = this.optionList.findIndex((item) => item.find((li) => li.mark === mark));
|
|
|
+ if (parentIndex === -1) return;
|
|
|
+ const childIndex = this.optionList[parentIndex].findIndex((item) => item.mark === mark);
|
|
|
+ this.optionList[parentIndex][childIndex].text = value;
|
|
|
});
|
|
|
},
|
|
|
},
|
|
|
- methods: {
|
|
|
- /**
|
|
|
- * 计算答题对错选项字体颜色
|
|
|
- * @param {string} mark 选项标识
|
|
|
- * @param {string} liMark 选项子标识
|
|
|
- */
|
|
|
- computedAnswerClass(mark, liMark) {
|
|
|
- if (!this.isJudgingRightWrong && !this.isShowRightAnswer) {
|
|
|
- return '';
|
|
|
- }
|
|
|
- let selectOption = this.answer.answer_list
|
|
|
- .find((item) => item.mark === mark)
|
|
|
- ?.value_list.find((item) => item.mark === liMark);
|
|
|
- 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 answerValue = answerOption.value;
|
|
|
- let classList = [];
|
|
|
- let isRight = selectValue === answerValue;
|
|
|
-
|
|
|
- if (this.isJudgingRightWrong) {
|
|
|
- isRight ? classList.push('right') : classList.push('wrong');
|
|
|
- }
|
|
|
-
|
|
|
- if (this.isShowRightAnswer && !isRight) {
|
|
|
- classList.push('show-right-answer');
|
|
|
- }
|
|
|
- return classList;
|
|
|
- },
|
|
|
- /**
|
|
|
- * 计算正确答案
|
|
|
- * @param {string} mark 选项标识
|
|
|
- * @param {string} liMark 选项子标识
|
|
|
- */
|
|
|
- computedAnswerText(mark, liMark) {
|
|
|
- if (!this.isShowRightAnswer) return '';
|
|
|
- // mark 对应答题选项
|
|
|
- let selectOption = this.answer.answer_list
|
|
|
- .find((item) => item.mark === mark)
|
|
|
- ?.value_list.find((item) => item.mark === liMark);
|
|
|
- // mark 对应正确答案选项
|
|
|
- let answerOption = this.data.answer.answer_list
|
|
|
- .find((item) => item.mark === mark)
|
|
|
- ?.value_list.find((item) => item.mark === liMark);
|
|
|
- let selectValue = selectOption?.value;
|
|
|
- let answerValue = answerOption.value;
|
|
|
- let isRight = selectValue === answerValue;
|
|
|
- if (isRight) return '';
|
|
|
- return `(${answerValue})`;
|
|
|
- },
|
|
|
- },
|
|
|
+ methods: {},
|
|
|
};
|
|
|
</script>
|
|
|
|
|
@@ -248,7 +153,6 @@ $table-border: 1px solid #ebebeb;
|
|
|
padding: 8px 12px;
|
|
|
font-size: 16px;
|
|
|
text-align: center;
|
|
|
- border-left: $table-border;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -265,6 +169,7 @@ $table-border: 1px solid #ebebeb;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
min-height: 48px;
|
|
|
+ overflow: auto;
|
|
|
border-bottom: $table-border;
|
|
|
border-left: $table-border;
|
|
|
|
|
@@ -339,11 +244,27 @@ $table-border: 1px solid #ebebeb;
|
|
|
.serial-number {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
+ width: 40px;
|
|
|
+ min-width: 40px;
|
|
|
+ max-width: 40px;
|
|
|
height: 100%;
|
|
|
padding: 8px 12px;
|
|
|
border-right: $table-border;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ .reference-box {
|
|
|
+ padding: 12px;
|
|
|
+ background: #f9f8f9;
|
|
|
+
|
|
|
+ .reference-title {
|
|
|
+ margin: 0 0 10px;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: 400;
|
|
|
+ line-height: 32px;
|
|
|
+ color: #4e5969;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|