dsy 1 maand geleden
bovenliggende
commit
5897045d11
21 gewijzigde bestanden met toevoegingen van 218 en 20 verwijderingen
  1. 4 4
      src/components/RichText.vue
  2. 12 11
      src/views/book/courseware/create/components/base/rich_text/RichText.vue
  3. 1 2
      src/views/book/courseware/create/components/base/stem/Stem.vue
  4. 86 0
      src/views/book/courseware/preview/common/AnswerCorrect.vue
  5. 7 2
      src/views/book/courseware/preview/common/PreviewOperation.vue
  6. 5 0
      src/views/book/courseware/preview/components/character/CharacterPreview.vue
  7. 5 0
      src/views/book/courseware/preview/components/character_structure/CharacterStructurePreview.vue
  8. 36 0
      src/views/book/courseware/preview/components/common/PreviewMixin.js
  9. 1 0
      src/views/book/courseware/preview/components/fill/FillPreview.vue
  10. 5 0
      src/views/book/courseware/preview/components/image_text/ImageTextPreview.vue
  11. 5 0
      src/views/book/courseware/preview/components/input/InputPreview.vue
  12. 5 0
      src/views/book/courseware/preview/components/judge/JudgePreview.vue
  13. 5 0
      src/views/book/courseware/preview/components/matching/MatchingPreview.vue
  14. 5 0
      src/views/book/courseware/preview/components/newWord_template/NewWordTemplatePreview.vue
  15. 6 1
      src/views/book/courseware/preview/components/pinyin_base/PinyinBasePreview.vue
  16. 5 0
      src/views/book/courseware/preview/components/record_input/RecordInputPreview.vue
  17. 5 0
      src/views/book/courseware/preview/components/select/SelectPreview.vue
  18. 5 0
      src/views/book/courseware/preview/components/sort/SortPreview.vue
  19. 5 0
      src/views/book/courseware/preview/components/table/TablePreview.vue
  20. 5 0
      src/views/book/courseware/preview/components/video_interaction/VideoInteractionPreview.vue
  21. 5 0
      src/views/book/courseware/preview/components/voice_matrix/VoiceMatrixPreview.vue

+ 4 - 4
src/components/RichText.vue

@@ -65,6 +65,7 @@ export default {
     Editor,
     MathDialog,
   },
+  inject: ['processHtmlString'],
   inheritAttrs: false,
   props: {
     inline: {
@@ -491,7 +492,7 @@ export default {
       },
     };
   },
-  inject: ['processHtmlString'],
+  computed: {},
   watch: {
     isViewNote: {
       handler(newVal) {
@@ -573,7 +574,6 @@ export default {
       },
     },
   },
-  computed: {},
   created() {
     if (this.pageFrom !== 'audit') {
       window.addEventListener('click', this.hideToolbarDrawer);
@@ -788,7 +788,7 @@ export default {
       editor.nodeChanged();
       this.setPinYinStyleForTitle();
     },
-    //标题类型的富文本,如果开启了拼音,需要同步拼音样式
+    // 标题类型的富文本,如果开启了拼音,需要同步拼音样式
     setPinYinStyleForTitle() {
       if (this.isViewPinyin) {
         let styles = this.getFirstCharStyles();
@@ -1248,7 +1248,7 @@ export default {
         {
           acceptNode: (node) => (node.textContent.trim() ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT),
         },
-        false
+        false,
       );
       return walker.nextNode();
     },

+ 12 - 11
src/views/book/courseware/create/components/base/rich_text/RichText.vue

@@ -25,8 +25,8 @@
           @SubmitTranslation="handleMultilingualTranslation"
         />
         <el-button
-          style="margin-left: 10px"
           v-show="isEnable(data.property.view_pinyin)"
+          style="margin-left: 10px"
           class="btn"
           @click.native="showWordFlag = true"
           >分词校对</el-button
@@ -128,7 +128,7 @@ export default {
       handler(newLevel) {
         this.$nextTick(() => {
           if (Number(newLevel) < 1) return;
-          if (this.titleStyleList.length == 0 && typeof this.getBookUnifiedTitleList === 'function') {
+          if (this.titleStyleList.length === 0 && typeof this.getBookUnifiedTitleList === 'function') {
             this.titleStyleList = this.getBookUnifiedTitleList() || [];
           }
           if (this.titleStyleList.length > 0) {
@@ -188,11 +188,12 @@ export default {
         return;
       }
       data.text = text.replace(/<[^>]+>/g, '').replace(/&nbsp;/g, ' ');
-      data.is_first_sentence_first_hz_pinyin_first_char_upper_case = this.data.property.is_first_sentence_first_hz_pinyin_first_char_upper_case;
+      data.is_first_sentence_first_hz_pinyin_first_char_upper_case =
+        this.data.property.is_first_sentence_first_hz_pinyin_first_char_upper_case;
 
-      fc_list = fc_list || [];
-      data.is_custom_fc = fc_list.length > 0;
-      data.fc_paragraph_list = fc_list;
+      let fcList = fc_list || [];
+      data.is_custom_fc = fcList.length > 0;
+      data.fc_paragraph_list = fcList;
 
       await PinyinBuild_OldFormat(data).then(({ parsed_text }) => {
         if (parsed_text) {
@@ -217,15 +218,15 @@ export default {
                   Object.assign(tmp.activeTextStyle, styles);
                 }
                 return tmp;
-              })
-            )
+              }),
+            ),
           );
           this.data.paragraph_list = mergedData; // 取出合并后的数组
           this.parseFClist();
         }
       });
     },
-    //开启拼音之后,拼音样式要跟随标题样式
+    // 开启拼音之后,拼音样式要跟随标题样式
     createParsedTextStyleForTitle(styles) {
       if (!styles) return;
       this.data.paragraph_list.forEach((outerArr, i) =>
@@ -233,8 +234,8 @@ export default {
           innerArr.forEach((newItem, k) => {
             if (!newItem.activeTextStyle) newItem.activeTextStyle = {};
             Object.assign(newItem.activeTextStyle, styles);
-          })
-        )
+          }),
+        ),
       );
     },
     parseFClist() {

+ 1 - 2
src/views/book/courseware/create/components/base/stem/Stem.vue

@@ -27,13 +27,12 @@ import { getStemData } from '@/views/book/courseware/data/stem';
 import { PinyinBuild_OldFormat } from '@/api/book';
 import { isEnable } from '@/views/book/courseware/data/common';
 import ModuleMixin from '../../common/ModuleMixin';
-import RichText from '@/components/RichText.vue';
 import PinyinText from '@/components/PinyinText.vue';
 import DOMPurify from 'dompurify';
 
 export default {
   name: 'StemPage',
-  components: { RichText, PinyinText },
+  components: { PinyinText },
   mixins: [ModuleMixin],
   data() {
     return {

+ 86 - 0
src/views/book/courseware/preview/common/AnswerCorrect.vue

@@ -0,0 +1,86 @@
+<!-- eslint-disable vue/no-v-html -->
+<template>
+  <el-dialog
+    v-dialogDrag
+    title="批改"
+    custom-class="answer-correct-dialog"
+    :visible="visible"
+    width="40vw"
+    :close-on-click-modal="false"
+    :before-close="handleClose"
+  >
+    <RichText
+      v-if="!permissionControl.can_check_correct"
+      ref="richText"
+      v-model="correct"
+      placeholder="请输入批改内容"
+    />
+    <div v-else class="rich-text" v-html="sanitizeHTML(correct)"></div>
+
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="handleClose()">取 消</el-button>
+      <el-button type="primary" @click="confirm()">确 定</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import RichText from '@/components/RichText.vue';
+
+import { sanitizeHTML } from '@/utils/common';
+
+export default {
+  name: 'AnswerCorrect',
+  components: {
+    RichText,
+  },
+  inject: ['getPermissionControl'],
+  props: {
+    visible: {
+      type: Boolean,
+      default: false,
+    },
+    answerCorrect: {
+      type: String,
+      default: '',
+    },
+  },
+  data() {
+    return {
+      sanitizeHTML,
+      correct: '',
+    };
+  },
+  computed: {
+    permissionControl() {
+      return this.getPermissionControl();
+    },
+  },
+  watch: {
+    answerCorrect: {
+      handler(val) {
+        this.correct = val;
+      },
+      immediate: true,
+    },
+  },
+  methods: {
+    handleClose() {
+      this.$emit('update:visible', false);
+    },
+    confirm() {
+      this.$emit('closeAnswerCorrect', this.correct);
+      this.handleClose();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.answer-correct-dialog {
+  .rich-text {
+    max-height: 60vh;
+    overflow-y: auto;
+  }
+}
+</style>

+ 7 - 2
src/views/book/courseware/preview/common/PreviewOperation.vue

@@ -1,7 +1,11 @@
 <template>
   <div class="operation">
     <div v-show="permissionControl.can_answer" class="button retry" @click="retry()"></div>
-    <div v-show="permissionControl.can_correct || permissionControl.can_check_correct" class="button correct"></div>
+    <div
+      v-show="permissionControl.can_correct || permissionControl.can_check_correct"
+      class="button correct"
+      @click="openAnswerCorrect()"
+    ></div>
     <div
       v-show="permissionControl.can_judge_correct || permissionControl.can_show_answer"
       class="button answer"
@@ -13,7 +17,7 @@
 <script>
 export default {
   name: 'PreviewOperation',
-  inject: ['getPermissionControl'],
+  inject: ['getPermissionControl', 'openAnswerCorrect'],
   data() {
     return {};
   },
@@ -26,6 +30,7 @@ export default {
     showAnswerAnalysis() {
       this.$emit('showAnswerAnalysis');
     },
+
     // 重做
     retry() {
       this.$emit('retry');

+ 5 - 0
src/views/book/courseware/preview/components/character/CharacterPreview.vue

@@ -399,6 +399,11 @@
         </div>
       </div>
       <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" />
+      <AnswerCorrect
+        :answer-correct="data?.answer_correct"
+        :visible.sync="visibleAnswerCorrect"
+        @closeAnswerCorrect="closeAnswerCorrect"
+      />
       <AnswerAnalysis
         :visible.sync="visibleAnswerAnalysis"
         :answer-list="data.answer_list"

+ 5 - 0
src/views/book/courseware/preview/components/character_structure/CharacterStructurePreview.vue

@@ -153,6 +153,11 @@
         </div>
       </div>
       <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" />
+      <AnswerCorrect
+        :answer-correct="data?.answer_correct"
+        :visible.sync="visibleAnswerCorrect"
+        @closeAnswerCorrect="closeAnswerCorrect"
+      />
       <AnswerAnalysis
         :visible.sync="visibleAnswerAnalysis"
         :answer-list="data.answer_list"

+ 36 - 0
src/views/book/courseware/preview/components/common/PreviewMixin.js

@@ -2,6 +2,7 @@ import SerialNumberPosition from './SerialNumberPosition.vue';
 import PinyinText from '@/components/PinyinText.vue';
 import AnswerAnalysis from '@/views/book/courseware/preview/common/AnswerAnalysis.vue';
 import PreviewOperation from '@/views/book/courseware/preview/common/PreviewOperation.vue';
+import AnswerCorrect from '@/views/book/courseware/preview/common/AnswerCorrect.vue';
 
 import { isEnable } from '@/views/book/courseware/data/common';
 import { ContentGetCoursewareComponentContent } from '@/api/book';
@@ -21,6 +22,12 @@ const mixin = {
       loader: false,
       visibleAnswerAnalysis: false, // 是否显示答案解析弹窗
       answerAnalysisState: null, // 答案解析弹窗前的状态快照
+      visibleAnswerCorrect: false, // 是否显示批改弹窗
+    };
+  },
+  provide() {
+    return {
+      openAnswerCorrect: () => this.openAnswerCorrect(),
     };
   },
   inject: ['getLang', 'getChinese', 'convertText', 'getTitleList', 'getPermissionControl'],
@@ -69,6 +76,7 @@ const mixin = {
     PinyinText,
     AnswerAnalysis,
     PreviewOperation,
+    AnswerCorrect,
   },
   created() {
     // 这里分为 预览 和 编辑调整位置、视频互动组件 三种情况
@@ -129,6 +137,20 @@ const mixin = {
       if (userAnswer) this.answer = userAnswer;
     },
     /**
+     * 获取批改信息
+     * @returns {string} 批改信息
+     */
+    getAnswerCorrect() {
+      return this.data.answer_correct || '';
+    },
+    /**
+     * 设置批改信息
+     * @param {string} correct 批改信息
+     */
+    setAnswerCorrect(correct) {
+      this.$set(this.data, 'answer_correct', correct);
+    },
+    /**
      * 得到序号外部样式
      */
     getAreaStyle() {
@@ -195,6 +217,7 @@ const mixin = {
         ...borderData,
       };
     },
+    // 显示答案与解析页面
     showAnswerAnalysis() {
       if (!this.answerAnalysisState) {
         this.answerAnalysisState = {
@@ -207,6 +230,7 @@ const mixin = {
       this.isJudgingRightWrong = this.permissionControl.can_judge_correct;
       this.isShowRightAnswer = this.permissionControl.can_show_answer;
     },
+    // 关闭答案与解析页面
     closeAnswerAnalysis() {
       if (this.answerAnalysisState) {
         this.disabled = this.answerAnalysisState.disabled;
@@ -219,6 +243,18 @@ const mixin = {
         this.isShowRightAnswer = false;
       }
     },
+    // 显示批改页面
+    openAnswerCorrect() {
+      this.visibleAnswerCorrect = true;
+    },
+    /**
+     * @description 关闭批改页面,并传递批改信息
+     * @param {string} correct 批改信息
+     */
+    closeAnswerCorrect(correct) {
+      this.visibleAnswerCorrect = false;
+      this.$set(this.data, 'answer_correct', correct);
+    },
   },
 };
 

+ 1 - 0
src/views/book/courseware/preview/components/fill/FillPreview.vue

@@ -103,6 +103,7 @@
 
     <WriteDialog :visible.sync="writeVisible" @confirm="handleWriteConfirm" />
     <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" @retry="retry" />
+    <AnswerCorrect :visible.sync="visibleAnswerCorrect" @closeAnswerCorrect="closeAnswerCorrect" />
     <AnswerAnalysis
       :visible.sync="visibleAnswerAnalysis"
       :answer-list="data.answer_list"

+ 5 - 0
src/views/book/courseware/preview/components/image_text/ImageTextPreview.vue

@@ -59,6 +59,11 @@
       </div>
     </div>
     <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" />
+    <AnswerCorrect
+      :answer-correct="data?.answer_correct"
+      :visible.sync="visibleAnswerCorrect"
+      @closeAnswerCorrect="closeAnswerCorrect"
+    />
     <AnswerAnalysis
       :visible.sync="visibleAnswerAnalysis"
       :answer-list="data.answer_list"

+ 5 - 0
src/views/book/courseware/preview/components/input/InputPreview.vue

@@ -27,6 +27,11 @@
     </div>
 
     <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" />
+    <AnswerCorrect
+      :answer-correct="data?.answer_correct"
+      :visible.sync="visibleAnswerCorrect"
+      @closeAnswerCorrect="closeAnswerCorrect"
+    />
     <AnswerAnalysis
       :visible.sync="visibleAnswerAnalysis"
       :answer-list="data.answer_list"

+ 5 - 0
src/views/book/courseware/preview/components/judge/JudgePreview.vue

@@ -57,6 +57,11 @@
     </div>
 
     <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" />
+    <AnswerCorrect
+      :answer-correct="data?.answer_correct"
+      :visible.sync="visibleAnswerCorrect"
+      @closeAnswerCorrect="closeAnswerCorrect"
+    />
     <AnswerAnalysis
       :visible.sync="visibleAnswerAnalysis"
       :answer-list="data.answer_list"

+ 5 - 0
src/views/book/courseware/preview/components/matching/MatchingPreview.vue

@@ -37,6 +37,11 @@
     </div>
 
     <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" />
+    <AnswerCorrect
+      :answer-correct="data?.answer_correct"
+      :visible.sync="visibleAnswerCorrect"
+      @closeAnswerCorrect="closeAnswerCorrect"
+    />
     <AnswerAnalysis
       :visible.sync="visibleAnswerAnalysis"
       :answer-list="data.answer_list"

+ 5 - 0
src/views/book/courseware/preview/components/newWord_template/NewWordTemplatePreview.vue

@@ -209,6 +209,11 @@
       </div>
     </div>
     <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" />
+    <AnswerCorrect
+      :answer-correct="data?.answer_correct"
+      :visible.sync="visibleAnswerCorrect"
+      @closeAnswerCorrect="closeAnswerCorrect"
+    />
     <AnswerAnalysis
       :visible.sync="visibleAnswerAnalysis"
       :answer-list="data.answer_list"

+ 6 - 1
src/views/book/courseware/preview/components/pinyin_base/PinyinBasePreview.vue

@@ -151,13 +151,18 @@
         </template>
       </div>
       <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" />
+      <AnswerCorrect
+        :answer-correct="data?.answer_correct"
+        :visible.sync="visibleAnswerCorrect"
+        @closeAnswerCorrect="closeAnswerCorrect"
+      />
       <AnswerAnalysis
         :visible.sync="visibleAnswerAnalysis"
         :answer-list="data.answer_list"
         :analysis-list="data.analysis_list"
         @closeAnswerAnalysis="closeAnswerAnalysis"
       >
-        <div slot="right-answer" v-if="data.property.fun_type === 'input'" class="right-answer">
+        <div v-if="data.property.fun_type === 'input'" slot="right-answer" class="right-answer">
           <div
             class="content-box"
             :class="[data.property.arrange_type === 'horizontal' ? 'content-box-flex' : 'content-box-vertical']"

+ 5 - 0
src/views/book/courseware/preview/components/record_input/RecordInputPreview.vue

@@ -28,6 +28,11 @@
         />
       </div>
       <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" />
+      <AnswerCorrect
+        :answer-correct="data?.answer_correct"
+        :visible.sync="visibleAnswerCorrect"
+        @closeAnswerCorrect="closeAnswerCorrect"
+      />
       <AnswerAnalysis
         :visible.sync="visibleAnswerAnalysis"
         :answer-list="data.answer_list"

+ 5 - 0
src/views/book/courseware/preview/components/select/SelectPreview.vue

@@ -40,6 +40,11 @@
     </div>
 
     <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" />
+    <AnswerCorrect
+      :answer-correct="data?.answer_correct"
+      :visible.sync="visibleAnswerCorrect"
+      @closeAnswerCorrect="closeAnswerCorrect"
+    />
     <AnswerAnalysis
       :visible.sync="visibleAnswerAnalysis"
       :answer-list="data.answer_list"

+ 5 - 0
src/views/book/courseware/preview/components/sort/SortPreview.vue

@@ -42,6 +42,11 @@
     </div>
 
     <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" />
+    <AnswerCorrect
+      :answer-correct="data?.answer_correct"
+      :visible.sync="visibleAnswerCorrect"
+      @closeAnswerCorrect="closeAnswerCorrect"
+    />
     <AnswerAnalysis
       :visible.sync="visibleAnswerAnalysis"
       :answer-list="data.answer_list"

+ 5 - 0
src/views/book/courseware/preview/components/table/TablePreview.vue

@@ -223,6 +223,11 @@
         </table>
       </div>
       <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" />
+      <AnswerCorrect
+        :answer-correct="data?.answer_correct"
+        :visible.sync="visibleAnswerCorrect"
+        @closeAnswerCorrect="closeAnswerCorrect"
+      />
       <AnswerAnalysis
         :visible.sync="visibleAnswerAnalysis"
         :answer-list="data.answer_list"

+ 5 - 0
src/views/book/courseware/preview/components/video_interaction/VideoInteractionPreview.vue

@@ -26,6 +26,11 @@
       >{{ convertText('查看答题报告') }}</el-button
     >
     <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" />
+    <AnswerCorrect
+      :answer-correct="data?.answer_correct"
+      :visible.sync="visibleAnswerCorrect"
+      @closeAnswerCorrect="closeAnswerCorrect"
+    />
     <AnswerAnalysis
       :visible.sync="visibleAnswerAnalysis"
       :answer-list="data.answer_list"

+ 5 - 0
src/views/book/courseware/preview/components/voice_matrix/VoiceMatrixPreview.vue

@@ -210,6 +210,11 @@
     </div>
 
     <PreviewOperation @showAnswerAnalysis="showAnswerAnalysis" />
+    <AnswerCorrect
+      :answer-correct="data?.answer_correct"
+      :visible.sync="visibleAnswerCorrect"
+      @closeAnswerCorrect="closeAnswerCorrect"
+    />
     <AnswerAnalysis
       :visible.sync="visibleAnswerAnalysis"
       :answer-list="data.answer_list"