|
|
@@ -1,3 +1,4 @@
|
|
|
+<!-- eslint-disable vue/no-v-html -->
|
|
|
<template>
|
|
|
<ModuleBase ref="base" :type="data.type">
|
|
|
<template #content>
|
|
|
@@ -14,14 +15,13 @@
|
|
|
:font-family="data?.unified_attrib?.font"
|
|
|
:font-color="data?.unified_attrib?.text_color"
|
|
|
/>
|
|
|
- <el-input
|
|
|
- v-if="data.property.fill_type === fillTypeList[1].value"
|
|
|
- v-model="data.vocabulary"
|
|
|
- type="textarea"
|
|
|
- :autosize="{ minRows: 2, maxRows: 4 }"
|
|
|
- resize="none"
|
|
|
- placeholder="请输入词汇,用于选词填空"
|
|
|
- />
|
|
|
+ <div v-if="data.property.fill_type === fillTypeList[1].value" class="select-vocabulary">
|
|
|
+ <h5 class="title">选词列表:</h5>
|
|
|
+ <el-button size="mini" @click="openAddWord">添加词汇</el-button>
|
|
|
+ <ul class="word-list">
|
|
|
+ <li v-for="item in data.word_list" :key="item.mark" v-html="sanitizeHTML(item.content)"></li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
|
|
|
<span class="tips">在需要加空的内容处插入 3 个或以上的下划线“_”。</span>
|
|
|
<div v-if="data.audio_file_id">
|
|
|
@@ -95,6 +95,7 @@
|
|
|
@updateAnswerAnalysisFileList="updateAnswerAnalysisFileList"
|
|
|
@deleteAnswerAnalysis="deleteAnswerAnalysis"
|
|
|
/>
|
|
|
+ <AddWord :visible.sync="visibleWord" @add-word="addWord" />
|
|
|
</template>
|
|
|
</ModuleBase>
|
|
|
</template>
|
|
|
@@ -104,11 +105,13 @@ import ModuleMixin from '../../common/ModuleMixin';
|
|
|
import SoundRecord from '@/views/book/courseware/create/components/question/fill/components/SoundRecord.vue';
|
|
|
import UploadAudio from '@/views/book/courseware/create/components/question/fill/components/UploadAudio.vue';
|
|
|
import PinyinText from '@/components/PinyinText.vue';
|
|
|
+import AddWord from './components/AddWord.vue';
|
|
|
|
|
|
import { getFillData, arrangeTypeList, fillFontList, fillTypeList } from '@/views/book/courseware/data/fill';
|
|
|
import { addTone, handleToneValue } from '@/views/book/courseware/data/common';
|
|
|
import { getRandomNumber } from '@/utils';
|
|
|
import { TextToAudioFile } from '@/api/app';
|
|
|
+import { sanitizeHTML } from '@/utils/common';
|
|
|
|
|
|
export default {
|
|
|
name: 'FillPage',
|
|
|
@@ -116,32 +119,20 @@ export default {
|
|
|
SoundRecord,
|
|
|
UploadAudio,
|
|
|
PinyinText,
|
|
|
+ AddWord,
|
|
|
},
|
|
|
mixins: [ModuleMixin],
|
|
|
data() {
|
|
|
return {
|
|
|
data: getFillData(),
|
|
|
fillTypeList,
|
|
|
+ sanitizeHTML,
|
|
|
+ visibleWord: false,
|
|
|
};
|
|
|
},
|
|
|
watch: {
|
|
|
'data.property.arrange_type': 'handleMindMap',
|
|
|
'data.property.fill_font': 'handleMindMap',
|
|
|
- 'data.vocabulary': {
|
|
|
- handler(val) {
|
|
|
- if (!val) return;
|
|
|
- this.data.word_list = val
|
|
|
- .split(/[\n\r]+/)
|
|
|
- .map((item) => item.split(/\s+/).filter((s) => s))
|
|
|
- .flat()
|
|
|
- .map((content) => {
|
|
|
- return {
|
|
|
- content,
|
|
|
- mark: getRandomNumber(),
|
|
|
- };
|
|
|
- });
|
|
|
- },
|
|
|
- },
|
|
|
'data.property': {
|
|
|
handler() {
|
|
|
this.handleViewPinyin();
|
|
|
@@ -332,6 +323,20 @@ export default {
|
|
|
});
|
|
|
});
|
|
|
},
|
|
|
+ openAddWord() {
|
|
|
+ this.visibleWord = true;
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 添加词汇
|
|
|
+ * @param {string} word 词汇内容
|
|
|
+ */
|
|
|
+ addWord(word) {
|
|
|
+ if (!word) return;
|
|
|
+ this.data.word_list.push({
|
|
|
+ content: word,
|
|
|
+ mark: getRandomNumber(),
|
|
|
+ });
|
|
|
+ },
|
|
|
},
|
|
|
};
|
|
|
</script>
|
|
|
@@ -347,6 +352,29 @@ export default {
|
|
|
width: 100%;
|
|
|
}
|
|
|
|
|
|
+ .select-vocabulary {
|
|
|
+ .title {
|
|
|
+ margin: 0 0 8px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .word-list {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 8px;
|
|
|
+ margin-top: 8px;
|
|
|
+
|
|
|
+ li {
|
|
|
+ padding: 4px 6px;
|
|
|
+ border: $border;
|
|
|
+ border-radius: 4px;
|
|
|
+
|
|
|
+ :deep p {
|
|
|
+ margin: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
.tips {
|
|
|
font-size: 12px;
|
|
|
color: #999;
|