|
@@ -2,147 +2,504 @@
|
|
|
<ModuleBase :type="data.type">
|
|
|
<template #content>
|
|
|
<!-- eslint-disable max-len -->
|
|
|
- <div class="fill-wrapper">
|
|
|
- <el-input v-model="data.content" placeholder="输入" type="textarea" @change="handleChangeContent" />
|
|
|
+ <div class="article-wrapper" v-loading="loading">
|
|
|
+ <el-input v-model="data.content" placeholder="输入" type="textarea" @change="handleChangeContent"></el-input>
|
|
|
+ <SelectUpload label="课文音频" type="audio" width="500px" @uploadSuccess="uploadAudioSuccess" />
|
|
|
+ <div v-if="data.mp3_list.length > 0" class="upload-file">
|
|
|
+ <div class="file-name">
|
|
|
+ <span>
|
|
|
+ <SvgIcon icon-class="note" size="12" />
|
|
|
+ <span>{{ data.mp3_list[0].name }}</span>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ <SvgIcon icon-class="delete-black" size="12" @click="removeFile" />
|
|
|
+ </div>
|
|
|
+ <div class="btn-box" v-if="data.content">
|
|
|
+ <a @click="checkArticle">文章校对</a>
|
|
|
+ <a @click="editWordsFlag = true">编辑生词短语注释</a>
|
|
|
+ <template v-if="data.wordTime && data.wordTime.length > 0">
|
|
|
+ <!-- <span>已有字幕时间节点</span> -->
|
|
|
+ <a type="text" @click="againWordTime">重新生成字幕时间</a>
|
|
|
+ <a @click="compareTime('句子')" size="medium">校对句子字幕时间</a>
|
|
|
+ <a @click="compareTime('文字')" size="medium">校对文字字幕时间</a>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <a v-if="!isWordTime" size="medium" @click="createWordTime">自动生成字幕节点</a>
|
|
|
+ <p v-else>字幕节点生成中...请等待</p>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
+ <el-dialog
|
|
|
+ :visible.sync="showArticleFlag"
|
|
|
+ :show-close="true"
|
|
|
+ :close-on-click-modal="true"
|
|
|
+ :modal-append-to-body="true"
|
|
|
+ :append-to-body="true"
|
|
|
+ :lock-scroll="true"
|
|
|
+ width="80%"
|
|
|
+ class="practiceBox"
|
|
|
+ v-if="showArticleFlag"
|
|
|
+ >
|
|
|
+ <CheckArticle :data="data" @saveWord="saveWord" @savePinyin="savePinyin" @saveStyle="saveStyle"></CheckArticle>
|
|
|
+ </el-dialog>
|
|
|
+ <el-dialog title="校对字幕时间" :visible.sync="compareShow" width="50%" :before-close="handleClose" top="0">
|
|
|
+ <CompareTime :data="compareData" :type="compareType" :changewordsResultList="changewordsResultList" />
|
|
|
+ <span slot="footer" class="dialog-footer">
|
|
|
+ <el-button @click="handleClose">取 消</el-button>
|
|
|
+ <el-button :loading="compareloading" type="primary" @click="saveCompare">确 定</el-button>
|
|
|
+ </span>
|
|
|
+ </el-dialog>
|
|
|
+ <el-dialog title="" :visible.sync="editWordsFlag" width="80%" :close-on-click-modal="true" top="0">
|
|
|
+ <div class="tabs-box">
|
|
|
+ <a :class="[editWordIndex === 0 ? 'active' : '']" @click="editWordIndex = 0">生词</a>
|
|
|
+ <a :class="[editWordIndex === 1 ? 'active' : '']" @click="editWordIndex = 1">注释</a>
|
|
|
+ <a :class="[editWordIndex === 2 ? 'active' : '']" @click="editWordIndex = 2">其他词汇</a>
|
|
|
+ </div>
|
|
|
+ <NewWord
|
|
|
+ v-if="editWordIndex === 0"
|
|
|
+ :dataNewWord="data.new_word_list"
|
|
|
+ key="new_word"
|
|
|
+ @sureNewWords="sureNewWords"
|
|
|
+ ></NewWord>
|
|
|
+
|
|
|
+ <Notes v-if="editWordIndex === 1" :dataNotes="data.notes_list" key="notes" @sureNotes="sureNotes"></Notes>
|
|
|
+ <NewWord
|
|
|
+ v-if="editWordIndex === 2"
|
|
|
+ :dataNewWord="data.other_word_list"
|
|
|
+ @sureNewWords="sureOtherNewWords"
|
|
|
+ ></NewWord>
|
|
|
+ </el-dialog>
|
|
|
</template>
|
|
|
</ModuleBase>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
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 SelectUpload from '@/views/book/courseware/create/components/common/SelectUpload.vue';
|
|
|
+import CheckArticle from './CheckArticle.vue';
|
|
|
+import CompareTime from './CompareTime.vue';
|
|
|
+import NewWord from './NewWord.vue';
|
|
|
+import Notes from './Notes.vue';
|
|
|
|
|
|
import { getArticleData } from '@/views/book/courseware/data/article';
|
|
|
-import { GetStaticResources } from '@/api/app';
|
|
|
+import { segSentences, BatchSegContent, GetStaticResources, getWordTime, prepareTranscribe } from '@/api/app';
|
|
|
+const Base64 = require('js-base64').Base64;
|
|
|
import cnchar from 'cnchar';
|
|
|
|
|
|
export default {
|
|
|
name: 'ArticlePage',
|
|
|
components: {
|
|
|
- SoundRecord,
|
|
|
- UploadAudio,
|
|
|
+ SelectUpload,
|
|
|
+ CheckArticle,
|
|
|
+ CompareTime,
|
|
|
+ NewWord,
|
|
|
+ Notes,
|
|
|
},
|
|
|
mixins: [ModuleMixin],
|
|
|
data() {
|
|
|
return {
|
|
|
data: getArticleData(),
|
|
|
+ showArticleFlag: false, // 校对文章
|
|
|
+ toneList: [' ', 'ˉ', 'ˊ', 'ˇ', 'ˋ'],
|
|
|
+ loading: false,
|
|
|
+ isWordTime: false,
|
|
|
+ compareType: '', //校对类型
|
|
|
+ compareShow: false,
|
|
|
+ compareData: null,
|
|
|
+ compareloading: false,
|
|
|
+ editWordsFlag: false,
|
|
|
+ editWordIndex: 0,
|
|
|
};
|
|
|
},
|
|
|
- created() {
|
|
|
- // console.log(this.data);
|
|
|
- },
|
|
|
+ created() {},
|
|
|
methods: {
|
|
|
// 解析输入内容
|
|
|
handleChangeContent() {
|
|
|
+ this.loading = true;
|
|
|
+ this.data.detail = [];
|
|
|
if (this.data.content.trim()) {
|
|
|
let contentArr = this.data.content.split('\n');
|
|
|
- let contentList = [];
|
|
|
+ let textList = [];
|
|
|
+ let detailItem = {
|
|
|
+ paraIndex: 0,
|
|
|
+ para: '',
|
|
|
+ sentences: [],
|
|
|
+ segList: [],
|
|
|
+ seg_words: [],
|
|
|
+ wordsList: [],
|
|
|
+ timeList: [],
|
|
|
+ isTitle: false,
|
|
|
+ sentencesEn: [],
|
|
|
+ };
|
|
|
+ // 分段
|
|
|
contentArr.forEach((item, index) => {
|
|
|
if (item.trim()) {
|
|
|
- contentList.push({
|
|
|
- con: item.trim(),
|
|
|
- pinyin: cnchar.spell(item.trim(), 'array', 'low', 'tone').join(' '),
|
|
|
- audio_file_id: '',
|
|
|
+ detailItem.para = item;
|
|
|
+ detailItem.paraIndex = index;
|
|
|
+ this.data.detail.push(JSON.parse(JSON.stringify(detailItem)));
|
|
|
+
|
|
|
+ let str = Base64.encode(item);
|
|
|
+ textList.push(str);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // 分句
|
|
|
+ let sentenceList = []; // 句子按段数组
|
|
|
+ let data = {
|
|
|
+ textList: textList,
|
|
|
+ };
|
|
|
+ segSentences(data)
|
|
|
+ .then((res) => {
|
|
|
+ let result = res.data.result;
|
|
|
+ sentenceList = JSON.parse(JSON.stringify(res.data.result));
|
|
|
+ result.forEach((item, index) => {
|
|
|
+ let sentenceListBase64 = [];
|
|
|
+ this.data.detail[index].sentences = item;
|
|
|
+ item.forEach((items) => {
|
|
|
+ sentenceListBase64.push(Base64.encode(items));
|
|
|
+ });
|
|
|
+ // 分词
|
|
|
+ BatchSegContent({ textList: sentenceListBase64 })
|
|
|
+ .then((res) => {
|
|
|
+ let list = res.data.result.list;
|
|
|
+ this.data.detail[index].segList = list;
|
|
|
+ this.setWordsList(list, index);
|
|
|
+ if (index === result.length - 1) {
|
|
|
+ this.loading = false;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ this.loading = false;
|
|
|
+ });
|
|
|
});
|
|
|
- this.handleMatic(item.trim(), contentList.length - 1);
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ this.loading = false;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ console.log(this.data);
|
|
|
+ },
|
|
|
+ // 处理句子和词的关系
|
|
|
+ handleSenWord() {
|
|
|
+ this.data.sentence_list_mp = [];
|
|
|
+ this.data.detail.forEach((item) => {
|
|
|
+ item.sentences.forEach((items, indexs) => {
|
|
|
+ let word_list = [];
|
|
|
+
|
|
|
+ item.segList[indexs].forEach((itemw) => {
|
|
|
+ word_list.push({
|
|
|
+ word: itemw,
|
|
|
+ });
|
|
|
+ });
|
|
|
+ let obj = {
|
|
|
+ sentence: items,
|
|
|
+ word_list: word_list,
|
|
|
+ };
|
|
|
+ this.data.sentence_list_mp.push(obj);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ console.log(this.data.sentence_list_mp);
|
|
|
+ },
|
|
|
+ setWordsList(list, paraIndex) {
|
|
|
+ let wordsList = [];
|
|
|
+ list.forEach((item, index) => {
|
|
|
+ let sentArr = [];
|
|
|
+
|
|
|
+ item.map((sItem) => {
|
|
|
+ let toneStr = [];
|
|
|
+ for (let i = 0; i < sItem.length; i++) {
|
|
|
+ if (cnchar.isCnChar(sItem[i])) {
|
|
|
+ toneStr.push(this.toneList[cnchar.spellInfo(cnchar.spell(sItem[i], 'low', 'tone')).tone]);
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ let obj = {
|
|
|
+ chs: sItem,
|
|
|
+ pinyin: cnchar.spell(sItem, 'low', 'tone'),
|
|
|
+ pinyin_up:
|
|
|
+ cnchar.spell(sItem, 'low', 'tone').charAt(0).toUpperCase() + cnchar.spell(sItem, 'low', 'tone').slice(1),
|
|
|
+ pinyin_tone: toneStr.join(' '),
|
|
|
+ fontFamily: '楷体',
|
|
|
+ };
|
|
|
+ sentArr.push(obj);
|
|
|
+ });
|
|
|
+ wordsList.push(sentArr);
|
|
|
+ });
|
|
|
+ this.data.detail[paraIndex].wordsList = wordsList;
|
|
|
+ },
|
|
|
+ uploadAudioSuccess(fileList) {
|
|
|
+ if (fileList.length > 0) {
|
|
|
+ const { file_name: name, file_url: temporary_url, file_id, media_duration } = fileList[0];
|
|
|
+ this.data.mp3_list = [
|
|
|
+ {
|
|
|
+ name,
|
|
|
+ media_duration,
|
|
|
+ temporary_url,
|
|
|
+ url: file_id,
|
|
|
+ file_id,
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ },
|
|
|
+ removeFile() {
|
|
|
+ this.data.mp3_list = [];
|
|
|
+ },
|
|
|
+ // 校对文章
|
|
|
+ checkArticle() {
|
|
|
+ this.showArticleFlag = true;
|
|
|
+ },
|
|
|
+ saveWord(saveArr) {
|
|
|
+ saveArr.forEach((item, index) => {
|
|
|
+ let para = '';
|
|
|
+ let sentenceStr = [];
|
|
|
+ let sentences = [];
|
|
|
+ let wordsList = [];
|
|
|
+ item.forEach((items) => {
|
|
|
+ para += items.join('');
|
|
|
+ sentenceStr.push(items.join(' '));
|
|
|
+ sentences.push(items.join(''));
|
|
|
+ let sentArr = [];
|
|
|
+ items.forEach((sItem) => {
|
|
|
+ let toneStr = [];
|
|
|
+ for (let i = 0; i < sItem.length; i++) {
|
|
|
+ if (cnchar.isCnChar(sItem[i])) {
|
|
|
+ toneStr.push(this.toneList[cnchar.spellInfo(cnchar.spell(sItem[i], 'low', 'tone')).tone]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ let obj = {
|
|
|
+ chs: sItem,
|
|
|
+ pinyin: cnchar.spell(sItem, 'low', 'tone'),
|
|
|
+ pinyin_up:
|
|
|
+ cnchar.spell(sItem, 'low', 'tone').charAt(0).toUpperCase() +
|
|
|
+ cnchar.spell(sItem, 'low', 'tone').slice(1),
|
|
|
+ pinyin_tone: toneStr.join(' '),
|
|
|
+ fontFamily: '楷体',
|
|
|
+ };
|
|
|
+ sentArr.push(obj);
|
|
|
+ });
|
|
|
+ wordsList.push(sentArr);
|
|
|
});
|
|
|
- this.data.content_list = contentList;
|
|
|
+ if (this.data.detail[index]) {
|
|
|
+ this.data.detail[index].segList = item;
|
|
|
+ this.data.detail[index].para = para;
|
|
|
+ this.data.detail[index].sentenceStr = sentenceStr;
|
|
|
+ this.data.detail[index].sentences = sentences;
|
|
|
+ this.data.detail[index].wordsList = wordsList;
|
|
|
+ } else {
|
|
|
+ let obj = {
|
|
|
+ paraIndex: index,
|
|
|
+ para: para,
|
|
|
+ sentences: sentences,
|
|
|
+ segList: item,
|
|
|
+ seg_words: [],
|
|
|
+ wordsList: wordsList,
|
|
|
+ timeList: [],
|
|
|
+ isTitle: false,
|
|
|
+ sentencesEn: [],
|
|
|
+ sentenceStr: sentenceStr,
|
|
|
+ };
|
|
|
+ this.data.detail.push(obj);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.$message.success('保存成功,请校对拼音');
|
|
|
+ this.handleSenWord();
|
|
|
+ },
|
|
|
+ // 保存拼音
|
|
|
+ savePinyin(paraIndex, sentenceIndex, wordIndex, pinyin) {
|
|
|
+ if (this.data.pinyin_type === 'tone') {
|
|
|
+ this.data.detail[paraIndex].wordsList[sentenceIndex][wordIndex].pinyin_tone = pinyin;
|
|
|
} else {
|
|
|
- this.data.content_list = [];
|
|
|
+ if (wordIndex === 0) {
|
|
|
+ this.data.detail[paraIndex].wordsList[sentenceIndex][wordIndex].pinyin_up = pinyin;
|
|
|
+ } else {
|
|
|
+ this.data.detail[paraIndex].wordsList[sentenceIndex][wordIndex].pinyin = pinyin;
|
|
|
+ }
|
|
|
}
|
|
|
},
|
|
|
- // 自动生成音频
|
|
|
- handleMatic(con, index) {
|
|
|
- GetStaticResources('tool-TextToVoiceFile', {
|
|
|
- text: con.replace(/<[^>]+>/g, ''),
|
|
|
- })
|
|
|
- .then(({ status, file_id }) => {
|
|
|
- if (status === 1) {
|
|
|
- this.data.content_list[index].audio_file_id = file_id;
|
|
|
- }
|
|
|
+ saveStyle(paraIndex, sentenceIndex, wordIndex, style) {
|
|
|
+ this.data.detail[paraIndex].wordsList[sentenceIndex][wordIndex].fontFamily = style;
|
|
|
+ },
|
|
|
+ // 保存校对
|
|
|
+ saveCompare() {
|
|
|
+ if (this.compareType == '文字') {
|
|
|
+ this.compareloading = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.compareloading = true;
|
|
|
+ compareSenTenceTime({ matchList: JSON.stringify(this.compareData) })
|
|
|
+ .then((res) => {
|
|
|
+ console.log(res);
|
|
|
+ this.compareloading = false;
|
|
|
+ this.data.wordTime = res.data.result;
|
|
|
})
|
|
|
- .catch(() => {});
|
|
|
+ .catch(() => {
|
|
|
+ this.compareloading = false;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 校对时间
|
|
|
+ compareTime(type) {
|
|
|
+ this.compareType = type;
|
|
|
+ this.compareData = JSON.parse(JSON.stringify(this.data.wordTime));
|
|
|
+ this.compareShow = true;
|
|
|
+ },
|
|
|
+ handleClose() {
|
|
|
+ this.compareShow = false;
|
|
|
+ this.compareData = null;
|
|
|
+ this.compareType = '';
|
|
|
+ },
|
|
|
+ // 校对每个字的时间
|
|
|
+ changewordsResultList(index, item) {
|
|
|
+ this.data.wordTime[index].wordsResultList = JSON.parse(JSON.stringify(item));
|
|
|
+ },
|
|
|
+ againWordTime() {
|
|
|
+ this.isWordTime = false;
|
|
|
+ this.data.wordTime = [];
|
|
|
+ },
|
|
|
+ createWordTime() {
|
|
|
+ this.getfillLiu().then(() => {
|
|
|
+ if (this.data.taskId) {
|
|
|
+ let verseList = [];
|
|
|
+ this.data.detail.forEach((item) => {
|
|
|
+ verseList = verseList.concat(item.sentences);
|
|
|
+ });
|
|
|
+ if (verseList.length > 0) {
|
|
|
+ this.isWordTime = true;
|
|
|
+ let data = {
|
|
|
+ taskId: this.data.taskId,
|
|
|
+ verseList: JSON.stringify(verseList),
|
|
|
+ matchType: 'chinese',
|
|
|
+ language: 'ch',
|
|
|
+ };
|
|
|
+ getWordTime(data).then((res) => {
|
|
|
+ this.data.wordTime = res.data.result;
|
|
|
+ this.isWordTime = false;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ this.$message.warning('请先上传音频');
|
|
|
+ this.loading = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 得到文件流
|
|
|
+ getfillLiu() {
|
|
|
+ this.loading = true;
|
|
|
+ let _this = this;
|
|
|
+ return new Promise(function (resolve, reject) {
|
|
|
+ if (_this.data.mp3_list && _this.data.mp3_list.length > 0 && _this.data.mp3_list[0].file_id) {
|
|
|
+ let Mname = 'file_store_manager-GetFileByteBase64Text';
|
|
|
+ let id = _this.data.mp3_list[0].file_id.replace('[FID##', '').replace('##FID]', '');
|
|
|
+ let data = {
|
|
|
+ file_id: id,
|
|
|
+ };
|
|
|
+ GetStaticResources(Mname, data).then((res) => {
|
|
|
+ let taskIddata = {
|
|
|
+ fileName: _this.data.mp3_list[0].name,
|
|
|
+ speechBase64: res.base64_text,
|
|
|
+ language: 'ch',
|
|
|
+ };
|
|
|
+ prepareTranscribe(taskIddata)
|
|
|
+ .then((ress) => {
|
|
|
+ _this.$set(_this.data, 'taskId', ress.data.taskId);
|
|
|
+ _this.loading = false;
|
|
|
+ resolve();
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ _this.loading = false;
|
|
|
+ });
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ _this.$message.warning('请先上传音频');
|
|
|
+ _this.loading = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ sureNewWords(data) {
|
|
|
+ this.data.new_word_list = data;
|
|
|
+ },
|
|
|
+ sureOtherNewWords(data) {
|
|
|
+ this.data.other_word_list = data;
|
|
|
+ },
|
|
|
+ sureNotes(data) {
|
|
|
+ this.data.notes_list = data;
|
|
|
},
|
|
|
},
|
|
|
};
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
-.fill-wrapper {
|
|
|
+.article-wrapper {
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
row-gap: 16px;
|
|
|
align-items: flex-start;
|
|
|
+}
|
|
|
|
|
|
- :deep .rich-wrapper {
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
+.upload-file {
|
|
|
+ display: flex;
|
|
|
+ column-gap: 12px;
|
|
|
+ align-items: center;
|
|
|
+ margin: 8px 0;
|
|
|
|
|
|
- .tips {
|
|
|
- font-size: 12px;
|
|
|
- color: #999;
|
|
|
- }
|
|
|
+ .file-name {
|
|
|
+ display: flex;
|
|
|
+ column-gap: 14px;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ max-width: 360px;
|
|
|
+ padding: 8px 12px;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #1d2129;
|
|
|
+ background-color: #f7f8fa;
|
|
|
|
|
|
- .auto-matic,
|
|
|
- .upload-audio-play {
|
|
|
- :deep .upload-wrapper {
|
|
|
- margin-top: 0;
|
|
|
+ span {
|
|
|
+ display: flex;
|
|
|
+ column-gap: 14px;
|
|
|
+ align-items: center;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- .audio-wrapper {
|
|
|
- :deep .audio-play {
|
|
|
- width: 16px;
|
|
|
- height: 16px;
|
|
|
- color: #000;
|
|
|
- background-color: initial;
|
|
|
- }
|
|
|
-
|
|
|
- :deep .audio-play.not-url {
|
|
|
- color: #a1a1a1;
|
|
|
- }
|
|
|
-
|
|
|
- :deep .voice-play {
|
|
|
- width: 16px;
|
|
|
- height: 16px;
|
|
|
- }
|
|
|
- }
|
|
|
+ .svg-icon {
|
|
|
+ cursor: pointer;
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- .auto-matic {
|
|
|
- display: flex;
|
|
|
- flex-shrink: 0;
|
|
|
- column-gap: 12px;
|
|
|
- align-items: center;
|
|
|
- width: 200px;
|
|
|
- padding: 5px 12px;
|
|
|
- background-color: $fill-color;
|
|
|
+.btn-box {
|
|
|
+ display: flex;
|
|
|
+ column-gap: 16px;
|
|
|
+
|
|
|
+ a {
|
|
|
+ padding: 5px 16px;
|
|
|
+ font-size: 14px;
|
|
|
+ line-height: 22px;
|
|
|
+ color: #4e5969;
|
|
|
+ cursor: pointer;
|
|
|
+ background: #f2f3f5;
|
|
|
border-radius: 2px;
|
|
|
+ }
|
|
|
|
|
|
- .auto-btn {
|
|
|
- font-size: 16px;
|
|
|
- font-weight: 400;
|
|
|
- line-height: 22px;
|
|
|
- color: #1d2129;
|
|
|
- cursor: pointer;
|
|
|
- }
|
|
|
+ p {
|
|
|
+ margin: 0;
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- .correct-answer {
|
|
|
- display: flex;
|
|
|
- flex-wrap: wrap;
|
|
|
- gap: 8px;
|
|
|
+.tabs-box {
|
|
|
+ display: flex;
|
|
|
+ column-gap: 12px;
|
|
|
+ margin-bottom: 12px;
|
|
|
|
|
|
- .el-input {
|
|
|
- width: 180px;
|
|
|
+ a {
|
|
|
+ padding: 5px 16px;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: 400;
|
|
|
+ line-height: 22px; /* 157.143% */
|
|
|
+ color: #4e5969;
|
|
|
+ cursor: pointer;
|
|
|
+ border-radius: 100px;
|
|
|
|
|
|
- :deep &__prefix {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- color: $text-color;
|
|
|
- }
|
|
|
+ &.active {
|
|
|
+ color: #165dff;
|
|
|
+ background: #f2f3f5;
|
|
|
}
|
|
|
}
|
|
|
}
|