3 Commits bd48749e52 ... 8dafa5ec02

Author SHA1 Message Date
  natasha 8dafa5ec02 Merge branch 'lhd' 6 hours ago
  zq af8099c3c1 修正拼音回填问题 6 hours ago
  zq bb807a37b8 基础组件预览:获取无文本内容的数据结构,用于保存为个人模板时的样式模板 7 hours ago

+ 5 - 5
src/views/book/courseware/create/components/base/common/CorrectPinyin.vue

@@ -9,7 +9,7 @@
     :append-to-body="true"
     :append-to-body="true"
     @close="dialogClose"
     @close="dialogClose"
   >
   >
-    <div ref="toolbarMenu" v-if="!newVersion" class="toolbar">
+    <div v-if="!newVersion" ref="toolbarMenu" class="toolbar">
       <el-select v-model="dataContent.activeTextStyle.fontFamily" placeholder="请选择">
       <el-select v-model="dataContent.activeTextStyle.fontFamily" placeholder="请选择">
         <el-option v-for="item in fontFamilyOptions" :key="item.value" :label="item.label" :value="item.value" />
         <el-option v-for="item in fontFamilyOptions" :key="item.value" :label="item.label" :value="item.value" />
       </el-select>
       </el-select>
@@ -34,7 +34,7 @@
         <SvgIcon icon-class="strikethrough" title="删除线" size="20" @click="setActiveTextStyle('line-through')" />
         <SvgIcon icon-class="strikethrough" title="删除线" size="20" @click="setActiveTextStyle('line-through')" />
       </span>
       </span>
     </div>
     </div>
-    <span class="tone-pinyin" v-show="isEnable(dataContent.showPinyin)">{{ dataContent.pinyin }}</span>
+    <span v-show="isEnable(dataContent.showPinyin)" class="tone-pinyin">{{ dataContent.pinyin }}</span>
     <span class="content-text" :style="dataContent.activeTextStyle">{{ dataContent.text }}</span>
     <span class="content-text" :style="dataContent.activeTextStyle">{{ dataContent.text }}</span>
 
 
     <div class="pinyin-row">
     <div class="pinyin-row">
@@ -60,8 +60,8 @@
         filterable
         filterable
         allow-create
         allow-create
         default-first-option
         default-first-option
-        @change="convertTonePinyin"
         class="pinyin-input"
         class="pinyin-input"
+        @change="convertTonePinyin"
       >
       >
         <el-option v-for="item in pinyinList" :key="item.pinyin" :value="item.pinyin.replace(/,/g, '')">
         <el-option v-for="item in pinyinList" :key="item.pinyin" :value="item.pinyin.replace(/,/g, '')">
           <span style="float: left">{{ item.pinyin ? item.pinyin.replace(/,/g, '') : '' }}</span>
           <span style="float: left">{{ item.pinyin ? item.pinyin.replace(/,/g, '') : '' }}</span>
@@ -71,8 +71,8 @@
         </el-option>
         </el-option>
       </el-select>
       </el-select>
     </div>
     </div>
-    <span v-show="isEnable(dataContent.showPinyin)" class="tips"
-      >一到四声分别用数字1-4表示,轻声用0表示,拼音间用空格隔开。</span
+    <span v-show="isEnable(dataContent.showPinyin)" class="tips">
+      一到四声分别用数字1-4表示,轻声用0表示,拼音间用空格隔开。</span
     >
     >
 
 
     <!-- <RichText
     <!-- <RichText

+ 32 - 3
src/views/book/courseware/create/components/base/rich_text/RichText.vue

@@ -390,9 +390,38 @@ export default {
     // 填充校对后的拼音
     // 填充校对后的拼音
     fillCorrectPinyin({ selectContent: { text, pinyin, activeTextStyle, note, showPinyin }, i, j, k, newVersion }) {
     fillCorrectPinyin({ selectContent: { text, pinyin, activeTextStyle, note, showPinyin }, i, j, k, newVersion }) {
       if (newVersion) {
       if (newVersion) {
-        if (pinyin) this.data.rich_text_list[j].word_list[k].pinyin = pinyin;
-        this.data.rich_text_list[j].word_list[k].showPinyin = showPinyin;
-        if (note !== null) this.data.rich_text_list[j].word_list[k].note = note;
+        // if (pinyin) this.data.rich_text_list[j].word_list[k].pinyin = pinyin;
+        // this.data.rich_text_list[j].word_list[k].showPinyin = showPinyin;
+        // if (note !== null) this.data.rich_text_list[j].word_list[k].note = note;
+
+        const targetBlock = this.data.rich_text_list[j];
+        if (!targetBlock || !targetBlock.word_list) {
+          console.error('找不到对应的文本块', { j, k });
+          return;
+        }
+
+        const targetWord = targetBlock.word_list[k];
+        if (!targetWord) {
+          console.error('找不到对应的词语', { j, k });
+          return;
+        }
+
+        if (pinyin) {
+          targetWord.pinyin = pinyin;
+          targetWord.pinyin_list = pinyin.split(/\s+/);
+        }
+
+        if (showPinyin !== undefined && showPinyin !== null) {
+          targetWord.showPinyin = showPinyin;
+        }
+
+        if (note !== null && note !== undefined) {
+          targetWord.note = note;
+        }
+
+        if (activeTextStyle && Object.keys(activeTextStyle).length > 0) {
+          targetWord.activeTextStyle = { ...targetWord.activeTextStyle, ...activeTextStyle };
+        }
       } else {
       } else {
         // 兼容历史数据
         // 兼容历史数据
         this.data.paragraph_list_parameter.pinyin_proofread_word_list.push({
         this.data.paragraph_list_parameter.pinyin_proofread_word_list.push({

+ 36 - 0
src/views/book/courseware/preview/components/audio/AudioPreview.vue

@@ -91,6 +91,7 @@ import { getAudioData } from '@/views/book/courseware/data/audio';
 
 
 import PreviewMixin from '../common/PreviewMixin';
 import PreviewMixin from '../common/PreviewMixin';
 import AudioPlay from '../common/AudioPlay.vue';
 import AudioPlay from '../common/AudioPlay.vue';
+import { getRandomNumber } from '@/utils';
 
 
 export default {
 export default {
   name: 'AudioPreview',
   name: 'AudioPreview',
@@ -216,6 +217,41 @@ export default {
         this.viewScroll = 'hidden';
         this.viewScroll = 'hidden';
       }
       }
     },
     },
+
+    /**
+     * 获取无文本内容的数据结构,用于保存为个人模板时的样式模板
+     */
+    getNoTextContentData() {
+      let noTextContentData = JSON.parse(JSON.stringify(this.data));
+      const resetFieldMap = {
+        analysis_list: [],
+        answer_list: [],
+      };
+
+      Object.assign(noTextContentData, resetFieldMap);
+
+      noTextContentData.option_list.forEach((item) => {
+        item.content = '';
+        item.pinyin = '';
+        item.shiyi = '';
+        item.mark = getRandomNumber();
+        item.hz_info = [];
+        item.file_list = [];
+        item.file_id_list = [];
+        item.content_list = [];
+        item.is_common_pinyin = true;
+        item.audio_file_id = '';
+        item.is_margin = false;
+        item.is_show_ben = true;
+      });
+
+      if (noTextContentData.answer) {
+        noTextContentData.answer.answer_list = [];
+        noTextContentData.answer.reference_answer = '';
+      }
+
+      return noTextContentData;
+    },
   },
   },
 };
 };
 </script>
 </script>

+ 37 - 0
src/views/book/courseware/preview/components/divider/DividerPreview.vue

@@ -6,6 +6,7 @@
 <script>
 <script>
 import { getDividerData } from '@/views/book/courseware/data/divider';
 import { getDividerData } from '@/views/book/courseware/data/divider';
 import PreviewMixin from '../common/PreviewMixin';
 import PreviewMixin from '../common/PreviewMixin';
+import { getRandomNumber } from '@/utils';
 
 
 export default {
 export default {
   name: 'DividerPreview',
   name: 'DividerPreview',
@@ -33,6 +34,42 @@ export default {
       };
       };
     },
     },
   },
   },
+  methods: {
+    /**
+     * 获取无文本内容的数据结构,用于保存为个人模板时的样式模板
+     */
+    getNoTextContentData() {
+      let noTextContentData = JSON.parse(JSON.stringify(this.data));
+      const resetFieldMap = {
+        analysis_list: [],
+        answer_list: [],
+      };
+
+      Object.assign(noTextContentData, resetFieldMap);
+
+      noTextContentData.option_list.forEach((item) => {
+        item.content = '';
+        item.pinyin = '';
+        item.shiyi = '';
+        item.mark = getRandomNumber();
+        item.hz_info = [];
+        item.file_list = [];
+        item.file_id_list = [];
+        item.content_list = [];
+        item.is_common_pinyin = true;
+        item.audio_file_id = '';
+        item.is_margin = false;
+        item.is_show_ben = true;
+      });
+
+      if (noTextContentData.answer) {
+        noTextContentData.answer.answer_list = [];
+        noTextContentData.answer.reference_answer = '';
+      }
+
+      return noTextContentData;
+    },
+  },
 };
 };
 </script>
 </script>
 
 

+ 37 - 1
src/views/book/courseware/preview/components/label/LabelPreview.vue

@@ -20,6 +20,7 @@
 <script>
 <script>
 import { getLabelData } from '@/views/book/courseware/data/label';
 import { getLabelData } from '@/views/book/courseware/data/label';
 import PreviewMixin from '../common/PreviewMixin';
 import PreviewMixin from '../common/PreviewMixin';
+import { getRandomNumber } from '@/utils';
 
 
 export default {
 export default {
   name: 'LabelPreview',
   name: 'LabelPreview',
@@ -29,7 +30,42 @@ export default {
       data: getLabelData(),
       data: getLabelData(),
     };
     };
   },
   },
-  methods: {},
+  methods: {
+    /**
+     * 获取无文本内容的数据结构,用于保存为个人模板时的样式模板
+     */
+    getNoTextContentData() {
+      let noTextContentData = JSON.parse(JSON.stringify(this.data));
+      const resetFieldMap = {
+        analysis_list: [],
+        answer_list: [],
+      };
+
+      Object.assign(noTextContentData, resetFieldMap);
+
+      noTextContentData.option_list.forEach((item) => {
+        item.content = '';
+        item.pinyin = '';
+        item.shiyi = '';
+        item.mark = getRandomNumber();
+        item.hz_info = [];
+        item.file_list = [];
+        item.file_id_list = [];
+        item.content_list = [];
+        item.is_common_pinyin = true;
+        item.audio_file_id = '';
+        item.is_margin = false;
+        item.is_show_ben = true;
+      });
+
+      if (noTextContentData.answer) {
+        noTextContentData.answer.answer_list = [];
+        noTextContentData.answer.reference_answer = '';
+      }
+
+      return noTextContentData;
+    },
+  },
 };
 };
 </script>
 </script>
 
 

+ 36 - 0
src/views/book/courseware/preview/components/picture/PicturePreview.vue

@@ -66,6 +66,7 @@
 <script>
 <script>
 import { getPictureData } from '@/views/book/courseware/data/picture';
 import { getPictureData } from '@/views/book/courseware/data/picture';
 import PreviewMixin from '../common/PreviewMixin';
 import PreviewMixin from '../common/PreviewMixin';
+import { getRandomNumber } from '@/utils';
 
 
 export default {
 export default {
   name: 'PicturePreview',
   name: 'PicturePreview',
@@ -255,6 +256,41 @@ export default {
         }
         }
       });
       });
     },
     },
+
+    /**
+     * 获取无文本内容的数据结构,用于保存为个人模板时的样式模板
+     */
+    getNoTextContentData() {
+      let noTextContentData = JSON.parse(JSON.stringify(this.data));
+      const resetFieldMap = {
+        analysis_list: [],
+        answer_list: [],
+      };
+
+      Object.assign(noTextContentData, resetFieldMap);
+
+      noTextContentData.option_list.forEach((item) => {
+        item.content = '';
+        item.pinyin = '';
+        item.shiyi = '';
+        item.mark = getRandomNumber();
+        item.hz_info = [];
+        item.file_list = [];
+        item.file_id_list = [];
+        item.content_list = [];
+        item.is_common_pinyin = true;
+        item.audio_file_id = '';
+        item.is_margin = false;
+        item.is_show_ben = true;
+      });
+
+      if (noTextContentData.answer) {
+        noTextContentData.answer.answer_list = [];
+        noTextContentData.answer.reference_answer = '';
+      }
+
+      return noTextContentData;
+    },
   },
   },
 };
 };
 </script>
 </script>

+ 36 - 0
src/views/book/courseware/preview/components/rich_text/RichTextPreview.vue

@@ -58,6 +58,7 @@ import PreviewMixin from '../common/PreviewMixin';
 import { isEnable } from '@/views/book/courseware/data/common';
 import { isEnable } from '@/views/book/courseware/data/common';
 import PinyinText from '@/components/PinyinText.vue';
 import PinyinText from '@/components/PinyinText.vue';
 import AudioPlay from '../character_base/components/AudioPlay.vue';
 import AudioPlay from '../character_base/components/AudioPlay.vue';
+import { getRandomNumber } from '@/utils';
 
 
 export default {
 export default {
   name: 'RichTextPreview',
   name: 'RichTextPreview',
@@ -119,6 +120,41 @@ export default {
         }, 800);
         }, 800);
       });
       });
     },
     },
+
+    /**
+     * 获取无文本内容的数据结构,用于保存为个人模板时的样式模板
+     */
+    getNoTextContentData() {
+      let noTextContentData = JSON.parse(JSON.stringify(this.data));
+      const resetFieldMap = {
+        analysis_list: [],
+        answer_list: [],
+      };
+
+      Object.assign(noTextContentData, resetFieldMap);
+
+      noTextContentData.option_list.forEach((item) => {
+        item.content = '';
+        item.pinyin = '';
+        item.shiyi = '';
+        item.mark = getRandomNumber();
+        item.hz_info = [];
+        item.file_list = [];
+        item.file_id_list = [];
+        item.content_list = [];
+        item.is_common_pinyin = true;
+        item.audio_file_id = '';
+        item.is_margin = false;
+        item.is_show_ben = true;
+      });
+
+      if (noTextContentData.answer) {
+        noTextContentData.answer.answer_list = [];
+        noTextContentData.answer.reference_answer = '';
+      }
+
+      return noTextContentData;
+    },
   },
   },
 };
 };
 </script>
 </script>

+ 36 - 0
src/views/book/courseware/preview/components/video/VideoPreview.vue

@@ -60,6 +60,7 @@
 import { getVideoData } from '@/views/book/courseware/data/video';
 import { getVideoData } from '@/views/book/courseware/data/video';
 import PreviewMixin from '../common/PreviewMixin';
 import PreviewMixin from '../common/PreviewMixin';
 import VideoPlay from '../common/VideoPlay.vue';
 import VideoPlay from '../common/VideoPlay.vue';
+import { getRandomNumber } from '@/utils';
 
 
 export default {
 export default {
   name: 'VideoPreview',
   name: 'VideoPreview',
@@ -282,6 +283,41 @@ export default {
         this.translateY = newY;
         this.translateY = newY;
       }
       }
     },
     },
+
+    /**
+     * 获取无文本内容的数据结构,用于保存为个人模板时的样式模板
+     */
+    getNoTextContentData() {
+      let noTextContentData = JSON.parse(JSON.stringify(this.data));
+      const resetFieldMap = {
+        analysis_list: [],
+        answer_list: [],
+      };
+
+      Object.assign(noTextContentData, resetFieldMap);
+
+      noTextContentData.option_list.forEach((item) => {
+        item.content = '';
+        item.pinyin = '';
+        item.shiyi = '';
+        item.mark = getRandomNumber();
+        item.hz_info = [];
+        item.file_list = [];
+        item.file_id_list = [];
+        item.content_list = [];
+        item.is_common_pinyin = true;
+        item.audio_file_id = '';
+        item.is_margin = false;
+        item.is_show_ben = true;
+      });
+
+      if (noTextContentData.answer) {
+        noTextContentData.answer.answer_list = [];
+        noTextContentData.answer.reference_answer = '';
+      }
+
+      return noTextContentData;
+    },
   },
   },
 };
 };
 </script>
 </script>