|
@@ -27,29 +27,52 @@
|
|
|
<label class="title-little">字词:</label>
|
|
|
<ul>
|
|
|
<li v-for="(item, i) in data.option_list" :key="i" class="content-word-card">
|
|
|
- <UploadDrag @fileUploadSuccess="fileUploadSuccess" :limit="1" ref="uploadDrag"></UploadDrag>
|
|
|
- <div class="word-card">
|
|
|
- <el-input v-model="item.content" :placeholder="'输入汉字或词汇'" />
|
|
|
- <el-input v-model="item.pinyin" :placeholder="'输入拼音'" />
|
|
|
- <UploadAudio
|
|
|
- v-if="data.other.audio_generation_method === 'upload'"
|
|
|
- :key="item.audio_file_id || i"
|
|
|
- :file-id="item.audio_file_id"
|
|
|
- :item-index="i"
|
|
|
- :show-upload="!item.audio_file_id"
|
|
|
- @upload="uploads"
|
|
|
- @deleteFile="deleteFiles"
|
|
|
+ <div class="item-left" v-if="item.picture_file_id">
|
|
|
+ <el-image
|
|
|
+ style="width: 72px; height: 72px"
|
|
|
+ :src="pic_list[item.picture_file_id]"
|
|
|
+ :preview-src-list="[pic_list[item.picture_file_id]]"
|
|
|
+ fit="contain"
|
|
|
/>
|
|
|
- <div v-else-if="data.other.audio_generation_method === 'auto'" class="auto-matically">
|
|
|
- <AudioPlay :file-id="item.audio_file_id" theme-color="gray" />
|
|
|
- <span class="auto-btn" @click="handleMatically(item)">自动生成</span>
|
|
|
+ <el-button size="small" class="delete-btn" @click="delectOptions(i, item.picture_file_id)">
|
|
|
+ <i class="el-icon-delete"></i>删除
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ <UploadDrag
|
|
|
+ v-else
|
|
|
+ @fileUploadSuccess="fileUploadSuccess"
|
|
|
+ :itemIndex="i"
|
|
|
+ :limit="1"
|
|
|
+ ref="uploadDrag"
|
|
|
+ ></UploadDrag>
|
|
|
+ <div class="word-card-item">
|
|
|
+ <div class="word-card">
|
|
|
+ <el-input v-model="item.content" :placeholder="'输入汉字或词汇'" />
|
|
|
+ <el-input v-model="item.pinyin" :placeholder="'拼音间用空格隔开'" />
|
|
|
+ <UploadAudio
|
|
|
+ v-if="data.other.audio_generation_method === 'upload'"
|
|
|
+ :key="item.audio_file_id || i"
|
|
|
+ :file-id="item.audio_file_id"
|
|
|
+ :item-index="i"
|
|
|
+ :show-upload="!item.audio_file_id"
|
|
|
+ @upload="uploads"
|
|
|
+ @deleteFile="deleteFiles"
|
|
|
+ />
|
|
|
+ <div v-else-if="data.other.audio_generation_method === 'auto'" class="auto-matically">
|
|
|
+ <AudioPlay :file-id="item.audio_file_id" theme-color="gray" v-if="item.audio_file_id" />
|
|
|
+ <span class="auto-btn" @click="handleMatically(item)">自动生成</span>
|
|
|
+ </div>
|
|
|
+ <SoundRecord v-else :wav-blob.sync="item.audio_file_id" />
|
|
|
+ <span class="rate-box"><el-rate v-model="item.rate"></el-rate></span>
|
|
|
+ <el-input v-model="item.definition" placeholder="输入释义" type="textarea" :rows="1" />
|
|
|
</div>
|
|
|
- <SoundRecord v-else :wav-blob.sync="item.audio_file_id" />
|
|
|
- <span><el-rate v-model="item.rate"></el-rate></span>
|
|
|
- <el-input v-model="item.definition" placeholder="输入释义" type="textarea" />
|
|
|
+ <SvgIcon
|
|
|
+ icon-class="delete"
|
|
|
+ class="delete pointer"
|
|
|
+ @click="deleteOption(i, item.audio_file_id, item.picture_file_id)"
|
|
|
+ />
|
|
|
</div>
|
|
|
|
|
|
- <SvgIcon icon-class="delete" class="delete pointer" @click="deleteOption(i, item.audio_file_id)" />
|
|
|
<div class="example-sentence-box">
|
|
|
<div class="example-sentence" v-for="(items, indexs) in item.example_sentence" :key="indexs">
|
|
|
<span class="question-number" @dblclick="changeOptionType(data)" title="双击切换序号类型">
|
|
@@ -140,6 +163,7 @@ import QuestionMixin from '../common/QuestionMixin.js';
|
|
|
import UploadAudio from '../common/UploadAudio.vue';
|
|
|
import SoundRecord from '../common/SoundRecord.vue';
|
|
|
import { GetStaticResources } from '@/api/app';
|
|
|
+import { GetFileStoreInfo } from '@/api/app';
|
|
|
import { changeOptionType, handleInputNumber } from '@/views/exercise_questions/data/common';
|
|
|
import UploadDrag from '../common/UploadDrag.vue';
|
|
|
|
|
@@ -166,9 +190,29 @@ export default {
|
|
|
changeOptionType,
|
|
|
handleInputNumber,
|
|
|
pic_list: {},
|
|
|
+ is_first: true,
|
|
|
};
|
|
|
},
|
|
|
+ watch: {
|
|
|
+ 'data.file_id_list': {
|
|
|
+ handler() {
|
|
|
+ if (this.is_first) {
|
|
|
+ this.handleData();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ deep: true,
|
|
|
+ },
|
|
|
+ },
|
|
|
methods: {
|
|
|
+ // 初始化数据
|
|
|
+ handleData() {
|
|
|
+ this.data.file_id_list.forEach((item) => {
|
|
|
+ GetFileStoreInfo({ file_id: item }).then(({ file_id, file_url }) => {
|
|
|
+ this.$set(this.pic_list, file_id, file_url);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ this.is_first = false;
|
|
|
+ },
|
|
|
addOption() {
|
|
|
this.data.option_list.push(getOption());
|
|
|
},
|
|
@@ -181,16 +225,38 @@ export default {
|
|
|
this.data.file_id_list.splice(this.data.file_id_list.indexOf(file_id), 1);
|
|
|
},
|
|
|
// 删除小题
|
|
|
- deleteOption(i, file_id) {
|
|
|
- this.data.option_list.splice(i, 1);
|
|
|
- this.data.file_id_list.splice(this.data.file_id_list.indexOf(file_id), 1);
|
|
|
+ deleteOption(i, file_id, pic_id) {
|
|
|
+ this.$confirm('是否删除?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ }).then(() => {
|
|
|
+ this.data.option_list.splice(i, 1);
|
|
|
+ this.data.file_id_list.splice(this.data.file_id_list.indexOf(file_id), 1);
|
|
|
+ this.data.file_id_list.splice(this.data.file_id_list.indexOf(pic_id), 1);
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 删除
|
|
|
+ delectOptions(i, id) {
|
|
|
+ this.$confirm('是否删除?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ delete this.pic_list[id];
|
|
|
+ this.data.file_id_list.splice(this.data.file_id_list.indexOf(id), 1);
|
|
|
+ this.data.option_list[i].picture_file_id = '';
|
|
|
+ this.$refs.uploadDrag.clearFiles();
|
|
|
+ })
|
|
|
+ .catch(() => {});
|
|
|
},
|
|
|
// 自动生成音频
|
|
|
handleMatically(item) {
|
|
|
if (item.pinyin.trim()) {
|
|
|
let MethodName = 'tool-PinyinToVoiceFile';
|
|
|
let data = {
|
|
|
- pinyin: item.pinyin.trim(),
|
|
|
+ pinyin: item.pinyin.trim().split(' ').join(','),
|
|
|
};
|
|
|
GetStaticResources(MethodName, data).then((res) => {
|
|
|
if (res.status === 1) {
|
|
@@ -201,10 +267,9 @@ export default {
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
- fileUploadSuccess(file_id, file_url) {
|
|
|
+ fileUploadSuccess(file_id, file_url, index) {
|
|
|
this.data.file_id_list.push(file_id);
|
|
|
- this.data.option_list.push(getOption());
|
|
|
- this.data.option_list[this.data.option_list.length - 1].picture_file_id = file_id;
|
|
|
+ this.data.option_list[index].picture_file_id = file_id;
|
|
|
this.$set(this.pic_list, file_id, file_url);
|
|
|
},
|
|
|
},
|
|
@@ -239,13 +304,54 @@ export default {
|
|
|
}
|
|
|
|
|
|
.content-word-card {
|
|
|
+ .item-left {
|
|
|
+ display: flex;
|
|
|
+ column-gap: 8px;
|
|
|
+ align-items: flex-end;
|
|
|
+ }
|
|
|
+
|
|
|
+ .word-card-item {
|
|
|
+ display: flex;
|
|
|
+ column-gap: 8px;
|
|
|
+ margin: 16px 0;
|
|
|
+ }
|
|
|
+
|
|
|
.word-card {
|
|
|
display: flex;
|
|
|
+ flex: 1;
|
|
|
flex-wrap: wrap;
|
|
|
- column-gap: 4px;
|
|
|
+ gap: 8px 4px;
|
|
|
|
|
|
.el-input {
|
|
|
- width: 255px;
|
|
|
+ flex: 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ .rate-box {
|
|
|
+ width: 128px;
|
|
|
+ height: 32px;
|
|
|
+ padding: 6px 0;
|
|
|
+ text-align: center;
|
|
|
+ background: #f2f3f5;
|
|
|
+ border-radius: 2px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .example-sentence-box {
|
|
|
+ .example-sentence {
|
|
|
+ display: flex;
|
|
|
+ column-gap: 8px;
|
|
|
+ margin-bottom: 8px;
|
|
|
+
|
|
|
+ .question-number {
|
|
|
+ min-width: 40px;
|
|
|
+ height: 32px;
|
|
|
+ padding: 4px 0;
|
|
|
+ color: $text-color;
|
|
|
+ text-align: center;
|
|
|
+ cursor: pointer;
|
|
|
+ background-color: $fill-color;
|
|
|
+ border-radius: 2px;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|