瀏覽代碼

Merge branch 'dev_1.2.0' of http://git.qmth.com.cn/union-question/union-question-web into dev_1.2.0

xiatian 3 年之前
父節點
當前提交
c0a4226f48

+ 1 - 1
src/App.vue

@@ -54,7 +54,7 @@ export default {
       this.addSetTime(() => {
         this.signalWaiting = false;
         this.onlineSignal();
-      }, 60 * 1000);
+      }, 30 * 1000);
     },
   },
 };

+ 29 - 7
src/components/RichText.vue

@@ -9,10 +9,8 @@ export default {
   name: "RichText",
   props: {
     textJson: {
-      type: Object,
-      default() {
-        return {};
-      },
+      type: String,
+      default: "{sections: []}",
     },
   },
   data() {
@@ -20,12 +18,36 @@ export default {
   },
   watch: {
     textJson(val) {
-      renderRichText(val, this.$el);
+      this.renderVal(val);
     },
   },
   mounted() {
-    renderRichText(this.textJson, this.$el);
+    this.renderVal(this.textJson);
+  },
+  methods: {
+    getJson(val) {
+      let json = null;
+      try {
+        json = JSON.parse(val);
+      } catch (e) {
+        console.log("not json");
+      }
+      return json;
+    },
+    renderVal(val) {
+      const jsonObj = this.getJson(val);
+      if (jsonObj) {
+        renderRichText(jsonObj, this.$el);
+      } else {
+        this.$el.innerHTML = val;
+      }
+    },
   },
-  methods: {},
 };
 </script>
+
+<style>
+.rich-text {
+  display: inline-block;
+}
+</style>

+ 1 - 1
src/components/vEditor/VEditor.vue

@@ -190,7 +190,7 @@ export default {
   padding-top: 32px;
   overflow: scroll;
   outline: none;
-  white-space: pre;
+  white-space: pre-wrap;
 }
 
 .sourceView {

+ 7 - 1
src/modules/card/autoBuild/paperCard.js

@@ -113,7 +113,13 @@ function getNestedQuestionStructList(detail, questions) {
   questions.forEach((question) => {
     const qStructList = getCommonQuestionStructList(
       detail,
-      question.subQuestions,
+      question.question.subQuestions.map((q) => {
+        return {
+          number: q.subNumber,
+          questionType: q.questionType,
+          question: q,
+        };
+      }),
       false,
       question.number
     );

+ 4 - 4
src/modules/card/autoBuild/paperStruct.js

@@ -14,7 +14,7 @@ export function getPaperJsonSimpleStructInfo(paperJson) {
     struct.push(`detail:${detail.number}-${detail.name}`);
     detail.paperDetailUnits.forEach((question) => {
       if (COMMON_QUESTION_TYPES.includes(question.questionType)) {
-        const info = parseCommonTypeQuestion(question);
+        const info = parseCommonTypeQuestion(question.question);
         struct.push(`${detail.number}-${info}`);
       } else {
         let infos = parseNestedTypeQuestion(question);
@@ -32,9 +32,9 @@ function parseCommonTypeQuestion(question) {
   let info = `${question.number}:${structType}`;
   const choiceQs = ["SINGLE_ANSWER_QUESTION", "MULTIPLE_ANSWER_QUESTION"];
   if (choiceQs.includes(structType)) {
-    info += `:${question.question.quesOptions.length}`;
+    info += `:${question.quesOptions.length}`;
   } else if (structType === "FILL_BLANK_QUESTION") {
-    info += `:${getFillBackClozeCount(question.question.quesOptions)}`;
+    info += `:${getFillBackClozeCount(question.quesOptions)}`;
   } else {
     info += ":";
   }
@@ -45,7 +45,7 @@ function parseCommonTypeQuestion(question) {
 function parseNestedTypeQuestion(question) {
   let struct = [];
   let qinfo = `${question.number}-`;
-  question.subQuestions.forEach((subq) => {
+  question.question.subQuestions.forEach((subq) => {
     const info = parseCommonTypeQuestion(subq);
     struct.push(`${qinfo}-${info}`);
   });

+ 2 - 1
src/modules/card/components/ElementPropEdit.vue

@@ -9,6 +9,7 @@
     :close-on-press-escape="false"
     :before-close="cancel"
     append-to-body
+    destroy-on-close
   >
     <component
       :is="curEditComponent"
@@ -93,6 +94,7 @@ export default {
       this.$refs.ElementPropEditComp.submit();
     },
     modified(element) {
+      this.cancel();
       // 编辑试题
       // 属性存在的条件:parent:大题的小题,container:题目内的子元素
       if (this.curElement["_edit"]) {
@@ -104,7 +106,6 @@ export default {
       } else {
         this.addElement(element);
       }
-      this.cancel();
       this.$nextTick(() => {
         this.rebuildPages();
       });

+ 19 - 3
src/modules/card/elements/fill-line/EditFillLine.vue

@@ -40,6 +40,18 @@
         ></el-input-number>
         <span class="el-input-tips">*指一行显示空位数量</span>
       </el-form-item>
+      <el-form-item label="小题空数:">
+        <el-input-number
+          v-model="modalForm.fillCount"
+          style="width: 125px"
+          :min="1"
+          :max="100"
+          :step="1"
+          step-strictly
+          :controls="false"
+        ></el-input-number>
+        <span class="el-input-tips">*指每一小题的空位数量</span>
+      </el-form-item>
     </el-form>
   </div>
 </template>
@@ -52,6 +64,7 @@ const initModalForm = {
   topicName: "",
   fillCountPerLine: 1,
   lineSpacing: 40,
+  fillCount: null,
 };
 
 export default {
@@ -101,13 +114,16 @@ export default {
   },
   methods: {
     initData(val) {
-      this.modalForm = this.$objAssign(initModalForm, val);
+      const valInfo = val.parent;
+      this.modalForm = this.$objAssign(initModalForm, valInfo);
+      if (!valInfo.fillCount) this.modalForm.fillCount = undefined;
     },
     async submit() {
       const valid = await this.$refs.modalFormComp.validate().catch(() => {});
       if (!valid) return;
-
-      this.$emit("modified", this.$objAssign(this.instance, this.modalForm));
+      const data = this.$objAssign(this.instance.parent, this.modalForm);
+      if (!data.fillCount) data.fillCount = null;
+      this.$emit("modified", data);
     },
   },
 };

+ 4 - 2
src/modules/card/elements/fill-line/model.js

@@ -11,6 +11,7 @@ const FILL_LINE_PROP = {
   topicName: "",
   topicNo: null,
   fillCountPerLine: 4,
+  fillCount: null,
   lineSpacing: 40,
   paperStruct: {},
 };
@@ -51,7 +52,8 @@ const getFullModel = (modelProp) => {
   let elements = [];
   const questions = parent.paperStruct.questions || [];
   questions.forEach((question, index) => {
-    const maxLineNumberPerQuestion = Math.ceil(question.fillCount / numPerLine);
+    const questionFillCount = parent.fillCount || question.fillCount;
+    const maxLineNumberPerQuestion = Math.ceil(questionFillCount / numPerLine);
 
     const questionHeight = childModel.lineSpacing * maxLineNumberPerQuestion;
 
@@ -61,7 +63,7 @@ const getFullModel = (modelProp) => {
       isLast: false,
       isFirst: !index,
       questionNo: question.questionNo,
-      fillCount: question.fillCount,
+      fillCount: questionFillCount,
       parent,
     });
     child.minHeight = child.h;

+ 21 - 8
src/modules/card/elements/fill-question/EditFillQuestion.vue

@@ -28,6 +28,21 @@
           :controls="false"
         ></el-input-number>
       </el-form-item>
+      <el-form-item
+        v-if="!modalForm.isBoolean"
+        prop="optionCount"
+        label="选项个数:"
+      >
+        <el-input-number
+          v-model="modalForm.optionCount"
+          style="width: 125px"
+          :min="2"
+          :max="22"
+          :step="1"
+          step-strictly
+          :controls="false"
+        ></el-input-number>
+      </el-form-item>
       <el-form-item label="题型:">
         <el-tag v-if="modalForm.isMultiply" effect="dark">多选</el-tag>
         <el-tag v-else-if="modalForm.isBoolean" effect="dark">判断</el-tag>
@@ -36,7 +51,7 @@
       <el-form-item v-if="modalForm.isBoolean">
         <el-select
           v-model="modalForm.booleanType"
-          style="margin-left: 20px; width: 125px"
+          style="width: 125px"
           placeholder="请选择"
           @change="booleanTypeChange"
         >
@@ -83,6 +98,7 @@ const initModalForm = {
   isBoolean: false,
   booleanType: BOOLEAN_TYPE[0],
   isMultiply: false,
+  optionCount: null,
 };
 
 export default {
@@ -151,8 +167,9 @@ export default {
   },
   methods: {
     initData(val) {
-      const valInfo = val.parent || val;
+      const valInfo = val.parent;
       this.modalForm = this.$objAssign(initModalForm, valInfo);
+      if (!valInfo.optionCount) this.modalForm.optionCount = undefined;
       this.booleanTypeChange();
     },
     selectTypeChange(val) {
@@ -175,12 +192,8 @@ export default {
         this.booleanTypes.no,
       ].join();
       this.modalForm.topicName = this.modalForm.topicName.trim();
-      let data = {};
-      if (this.instance.parent) {
-        data = this.$objAssign(this.instance.parent, this.modalForm);
-      } else {
-        data = this.$objAssign(this.instance, this.modalForm);
-      }
+      const data = this.$objAssign(this.instance.parent, this.modalForm);
+      if (!data.optionCount) data.optionCount = null;
       this.$emit("modified", data);
     },
   },

+ 7 - 5
src/modules/card/elements/fill-question/model.js

@@ -15,6 +15,7 @@ const FILL_QUESTION_PROP = {
   questionGap: 8,
   groupGap: 30,
   optionGap: 12,
+  optionCount: null,
   isBoolean: false, // 是否是判断题
   booleanType: BOOLEAN_TYPE[0],
   isMultiply: false, // 是否是多选题
@@ -77,15 +78,16 @@ const getFullModel = (modelProp, { pageSize, columnNumber }) => {
   const lineMaxOptionCount = lineMaxOptionCountConfig[pageSize][columnNumber];
   const questions = parent.paperStruct.questions || [];
   let questionList = questions.map((item) => {
-    const choiceList = getChoiceList({
+    let question = {
       ...item,
+    };
+    if (parent.optionCount) question.optionCount = parent.optionCount;
+    question.choiceList = getChoiceList({
+      ...question,
       isBoolean: parent.isBoolean,
       booleanType: parent.booleanType,
     });
-    return {
-      ...item,
-      choiceList,
-    };
+    return question;
   });
 
   const getNextGroupQuestions = () => {

+ 1 - 1
src/modules/card/enumerate.js

@@ -11,7 +11,7 @@ export const PAPER_TYPE = {
   // FILL: "填涂"
 };
 
-export const BOOLEAN_TYPE = ["√,×", "是,否", "对,错"];
+export const BOOLEAN_TYPE = ["√,×", "是,否", "对,错", "A,B"];
 
 export const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 

+ 2 - 2
src/modules/card/store/card.js

@@ -391,7 +391,7 @@ const actions = {
       state.topics.splice(pos._elementNo + index, 0, newElement);
     });
   },
-  modifyElement({ commit, dispatch }, element) {
+  modifyElement({ dispatch }, element) {
     if (element.type === "COMPOSITION") {
       dispatch("modifyComposition", element);
     } else if (element.type === "EXPLAIN") {
@@ -400,7 +400,7 @@ const actions = {
       dispatch("modifySplitTopic", element);
     }
     dispatch("resetTopicSeries");
-    commit("setCurElement", element);
+    // commit("setCurElement", element);
   },
   modifyCardHead({ state }, element) {
     state.topics.splice(0, 1, element);

+ 0 - 3
src/modules/portal/views/home/Home.vue

@@ -246,9 +246,6 @@ export default {
       this.passWeakDialog = true;
     }
   },
-  beforeDestroy() {
-    this.clearSetTs();
-  },
   methods: {
     ...mapActions([USER_SIGNOUT, USER_SIGNIN]),
 

+ 3 - 3
src/modules/questions/views/CheckDuplicateList.vue

@@ -121,12 +121,12 @@
         </el-table-column>
         <el-table-column label="题干">
           <template slot-scope="scope">
-            <div
+            <rich-text
               class="row-question-body"
               title="点击查看试题"
+              :text-json="scope.row.quesBody"
               @click="prevViewQues(scope.row)"
-              v-html="scope.row.quesBody"
-            ></div>
+            ></rich-text>
           </template>
         </el-table-column>
         <el-table-column label="题型大类" width="100">

+ 22 - 28
src/modules/questions/views/EditPaper.vue

@@ -237,11 +237,10 @@
                 @click.stop="showContent(detailIndex)"
               ></el-button>
             </div>
-            <div
-              v-question-audio
+            <rich-text
               class="edit-cont-body"
-              v-html="paperDetail.description"
-            ></div>
+              :text-json="paperDetail.description"
+            ></rich-text>
           </div>
           <div v-show="quesTagShow" class="edit-property">
             <div class="edit-property-box">
@@ -289,12 +288,9 @@
               >
                 <div class="edit-cont-title">
                   <span>{{ paperDetailUnit.number }}.</span>
-                  <span
-                    v-question-audio
-                    :hasAudio="paperDetailUnit.question.hasAudio"
-                    :questionId="paperDetailUnit.question.id"
-                    v-html="paperDetailUnit.question.quesBody"
-                  ></span>
+                  <rich-text
+                    :text-json="paperDetailUnit.question.quesBody"
+                  ></rich-text>
                   <span> ({{ paperDetailUnit.score }}分) </span>
                 </div>
                 <div
@@ -386,17 +382,14 @@
                     class="paper-option"
                   >
                     <span>{{ optionIndex | optionOrderWordFilter }}. </span>
-                    <span
-                      v-question-audio
-                      :hasAudio="paperDetailUnit.question.hasAudio"
-                      :questionId="paperDetailUnit.question.id"
-                      v-html="quesOption.optionBody"
-                    ></span>
+                    <rich-text :text-json="quesOption.optionBody"></rich-text>
                   </div>
                   <div v-if="!isNested(paperDetailUnit.questionType)">
                     <div v-show="quesAnswerShow">
                       <span>答案:</span>
-                      <span v-html="paperDetailUnit.question.quesAnswer"></span>
+                      <rich-text
+                        :text-json="paperDetailUnit.question.quesAnswer"
+                      ></rich-text>
                     </div>
                   </div>
                 </div>
@@ -487,7 +480,7 @@
                   </div>
                   <div class="edit-cont-title">
                     <span>{{ subQuestion.subNumber }}. </span>
-                    <span v-question-audio v-html="subQuestion.quesBody"></span>
+                    <rich-text :text-json="subQuestion.quesBody"></rich-text>
                     <span
                       >({{ paperDetailUnit.subScoreList[subIndex] }}分)</span
                     >
@@ -505,15 +498,14 @@
                       class="paper-option"
                     >
                       <span>{{ subOptIndex | optionOrderWordFilter }}. </span>
-                      <span
-                        v-question-audio
-                        v-html="subQuesOption.optionBody"
-                      ></span>
+                      <rich-text
+                        :text-json="subQuesOption.optionBody"
+                      ></rich-text>
                     </div>
                   </div>
                   <div v-show="quesAnswerShow">
                     <span>答案:</span>
-                    <span v-html="subQuestion.quesAnswer"></span>
+                    <rich-text :text-json="subQuestion.quesAnswer"></rich-text>
                   </div>
                 </div>
                 <div v-show="quesTagShow" class="edit-property">
@@ -561,10 +553,7 @@
           ></el-input>
         </el-form-item>
         <el-form-item label="大题描述">
-          <v-editor
-            v-model="editpaperDetail.description"
-            class="area-ckeditor"
-          ></v-editor>
+          <v-editor v-model="editpaperDetail.description"></v-editor>
         </el-form-item>
       </el-form>
       <div slot="footer">
@@ -811,7 +800,12 @@
         </el-row>
         <!-- end by weiwenhai -->
         <el-form-item label="题目">
-          <v-editor v-model="quesModel.quesBody"></v-editor>
+          <v-editor
+            v-model="quesModel.quesBody"
+            :enable-answer-point="
+              quesModel.questionType == 'FILL_BLANK_QUESTION'
+            "
+          ></v-editor>
         </el-form-item>
         <el-form-item
           v-for="(quesOption, optIndex) in quesModel.quesOptions"

+ 15 - 23
src/modules/questions/views/EditPaperPendingTrial.vue

@@ -273,11 +273,10 @@
                 @click.stop="showContent(detailIndex)"
               ></el-button>
             </div>
-            <div
-              v-question-audio
+            <rich-text
               class="edit-cont-body"
-              v-html="paperDetail.description"
-            ></div>
+              :text-json="paperDetail.description"
+            ></rich-text>
           </div>
           <div v-show="quesTagShow" class="edit-property">
             <div class="edit-property-box">
@@ -325,12 +324,9 @@
               >
                 <div class="edit-cont-title">
                   <span>{{ paperDetailUnit.number }}.</span>
-                  <span
-                    v-question-audio
-                    :hasAudio="paperDetailUnit.question.hasAudio"
-                    :questionId="paperDetailUnit.question.id"
-                    v-html="paperDetailUnit.question.quesBody"
-                  ></span>
+                  <rich-text
+                    :text-json="paperDetailUnit.question.quesBody"
+                  ></rich-text>
                   <span> ({{ paperDetailUnit.score }}分) </span>
                 </div>
                 <div
@@ -426,17 +422,14 @@
                     class="paper-option"
                   >
                     <span>{{ optionIndex | optionOrderWordFilter }}. </span>
-                    <span
-                      v-question-audio
-                      :hasAudio="paperDetailUnit.question.hasAudio"
-                      :questionId="paperDetailUnit.question.id"
-                      v-html="quesOption.optionBody"
-                    ></span>
+                    <rich-text :text-json="quesOption.optionBody"></rich-text>
                   </div>
                   <div v-if="!isNested(paperDetailUnit.questionType)">
                     <div v-show="quesAnswerShow">
                       <span>答案:</span>
-                      <span v-html="paperDetailUnit.question.quesAnswer"></span>
+                      <rich-text
+                        :text-json="paperDetailUnit.question.quesAnswer"
+                      ></rich-text>
                     </div>
                   </div>
                 </div>
@@ -529,7 +522,7 @@
                   </div>
                   <div class="edit-cont-title">
                     <span>{{ subQuestion.subNumber }}. </span>
-                    <span v-question-audio v-html="subQuestion.quesBody"></span>
+                    <rich-text :text-json="subQuestion.quesBody"></rich-text>
                     <span
                       >({{ paperDetailUnit.subScoreList[subIndex] }}分)</span
                     >
@@ -547,15 +540,14 @@
                       class="paper-option"
                     >
                       <span>{{ subOptIndex | optionOrderWordFilter }}. </span>
-                      <span
-                        v-question-audio
-                        v-html="subQuesOption.optionBody"
-                      ></span>
+                      <rich-text
+                        :text-json="subQuesOption.optionBody"
+                      ></rich-text>
                     </div>
                   </div>
                   <div v-show="quesAnswerShow">
                     <span>答案:</span>
-                    <span v-html="subQuestion.quesAnswer"></span>
+                    <rich-text :text-json="subQuestion.quesAnswer"></rich-text>
                   </div>
                 </div>
                 <div v-show="quesTagShow" class="edit-property">

+ 3 - 3
src/modules/questions/views/Question.vue

@@ -150,12 +150,12 @@
         </el-table-column>
         <el-table-column label="题干">
           <template slot-scope="scope">
-            <div
+            <rich-text
               class="row-question-body"
               title="点击查看试题"
+              :text-json="scope.row.quesBody"
               @click="prevViewQues(scope.row)"
-              v-html="scope.row.quesBody"
-            ></div>
+            ></rich-text>
           </template>
         </el-table-column>
         <el-table-column label="操作" width="160">

+ 14 - 14
src/modules/questions/views/QuestionInfo.vue

@@ -2,10 +2,10 @@
   <section class="question-info">
     <el-form :model="quesModel" label-position="left" label-width="80px">
       <el-form-item label="题目">
-        <div
+        <rich-text
           class="paper-question-body padding-top-6"
-          v-html="quesModel.quesBody"
-        ></div>
+          :text-json="quesModel.quesBody"
+        ></rich-text>
       </el-form-item>
       <el-form-item
         v-for="(quesOption, optIndex) in quesModel.quesOptions"
@@ -13,7 +13,7 @@
       >
         <div class="paper-question-option">
           <span>{{ optIndex | optionOrderWordFilter }}. </span>
-          <span v-html="quesOption.optionBody"></span>
+          <rich-text :text-json="quesOption.optionBody"></rich-text>
         </div>
       </el-form-item>
 
@@ -25,10 +25,10 @@
         >
           <div class="sub-question-no">{{ qindex + 1 }}</div>
           <el-form-item label="题目" label-width="50px">
-            <div
+            <rich-text
               class="paper-question-body"
-              v-html="subQuestionModel.quesBody"
-            ></div>
+              :text-json="subQuestionModel.quesBody"
+            ></rich-text>
           </el-form-item>
           <template
             v-if="
@@ -43,15 +43,15 @@
             >
               <div class="paper-question-option">
                 <span>{{ subIndex | optionOrderWordFilter }}. </span>
-                <span v-html="subQuesOption.optionBody"></span>
+                <rich-text :text-json="subQuesOption.optionBody"></rich-text>
               </div>
             </el-form-item>
           </template>
           <el-form-item label="答案" label-width="50px">
-            <div
+            <rich-text
               class="paper-question-body"
-              v-html="subQuestionModel.quesAnswer"
-            ></div>
+              :text-json="subQuestionModel.quesAnswer"
+            ></rich-text>
           </el-form-item>
         </div>
       </template>
@@ -60,10 +60,10 @@
         v-if="!quesModel.subQuestions || !quesModel.subQuestions.length"
         label="答案"
       >
-        <div
+        <rich-text
           class="paper-question-body padding-top-6"
-          v-html="quesModel.quesAnswer"
-        ></div>
+          :text-json="quesModel.quesAnswer"
+        ></rich-text>
       </el-form-item>
 
       <div class="line-seperator"></div>

+ 15 - 9
src/modules/questions/views/QuestionPreview.vue

@@ -13,7 +13,10 @@
         <span>{{ quesModel.questionType | questionType }}</span>
       </el-form-item>
       <el-form-item label="题干">
-        <div class="paper-question-body" v-html="quesModel.quesBody"></div>
+        <rich-text
+          class="paper-question-body"
+          :text-json="quesModel.quesBody"
+        ></rich-text>
       </el-form-item>
 
       <template v-if="quesModel.quesOptions && quesModel.quesOptions.length">
@@ -23,7 +26,7 @@
         >
           <div class="paper-question-option">
             <span>{{ optIndex | optionOrderWordFilter }}. </span>
-            <span v-html="quesOption.optionBody"></span>
+            <rich-text :text-json="quesOption.optionBody"></rich-text>
           </div>
         </el-form-item>
       </template>
@@ -36,10 +39,10 @@
         >
           <div class="sub-question-no">{{ qindex + 1 }}</div>
           <el-form-item label="题目">
-            <div
+            <rich-text
               class="paper-question-body"
-              v-html="subQuestionModel.quesBody"
-            ></div>
+              :text-json="subQuestionModel.quesBody"
+            ></rich-text>
           </el-form-item>
           <template
             v-if="
@@ -53,15 +56,15 @@
             >
               <div class="paper-question-option">
                 <span>{{ subIndex | optionOrderWordFilter }}. </span>
-                <span v-html="subQuesOption.optionBody"></span>
+                <rich-text :text-json="subQuesOption.optionBody"></rich-text>
               </div>
             </el-form-item>
           </template>
           <el-form-item label="答案">
-            <div
+            <rich-text
               class="paper-question-body"
               v-html="subQuestionModel.quesAnswer"
-            ></div>
+            ></rich-text>
           </el-form-item>
         </div>
       </template>
@@ -70,7 +73,10 @@
         v-if="!quesModel.subQuestions || !quesModel.subQuestions.length"
         label="答案"
       >
-        <div class="paper-question-body" v-html="quesModel.quesAnswer"></div>
+        <rich-text
+          class="paper-question-body"
+          :text-json="quesModel.quesAnswer"
+        ></rich-text>
       </el-form-item>
     </el-form>
   </el-dialog>

+ 3 - 4
src/modules/questions/views/SelectQuestion.vue

@@ -80,12 +80,11 @@
         <el-table-column label="题干">
           <template slot-scope="scope">
             <span class="small">
-              <a
-                href="javascript:;"
+              <rich-text
+                :text-json="scope.row.quesBody"
                 @click="prevViewQues(scope.row)"
-                v-html="scope.row.quesBody"
               >
-              </a>
+              </rich-text>
             </span>
           </template>
         </el-table-column>

+ 19 - 22
src/modules/questions/views/ViewPaper.vue

@@ -83,7 +83,10 @@
             }}小题,满分{{ paperDetail.score }}分)
           </span>
         </div>
-        <div class="paper-question-body" v-html="paperDetail.description"></div>
+        <rich-text
+          class="paper-question-body"
+          :text-json="paperDetail.description"
+        ></rich-text>
         <div :id="paperDetail.id" class="view-part-action">
           <el-button
             v-show="showButtons[detailIndex].up"
@@ -115,12 +118,9 @@
           >
             <div class="paper-question-title">
               <span>{{ paperDetailUnit.number }}.</span>
-              <span
-                v-question-audio
-                :hasAudio="paperDetailUnit.question.hasAudio"
-                :questionId="paperDetailUnit.question.id"
-                v-html="paperDetailUnit.question.quesBody"
-              ></span>
+              <rich-text
+                :text-json="paperDetailUnit.question.quesBody"
+              ></rich-text>
               <span> ({{ paperDetailUnit.score }}分) </span>
             </div>
             <div class="paper-question-body">
@@ -131,12 +131,7 @@
                 class="paper-question-option"
               >
                 <span>{{ optionIndex | optionOrderWordFilter }}. </span>
-                <span
-                  v-question-audio
-                  :hasAudio="paperDetailUnit.question.hasAudio"
-                  :questionId="paperDetailUnit.question.id"
-                  v-html="quesOption.optionBody"
-                ></span>
+                <rich-text :text-json="quesOption.optionBody"></rich-text>
               </div>
             </div>
             <div :id="paperDetailUnit.id" class="view-part-action">
@@ -165,7 +160,7 @@
               >
                 <div class="paper-question-title">
                   <span>{{ subQuestion.subNumber }}. </span>
-                  <span v-html="subQuestion.quesBody"></span>
+                  <rich-text :text-json="subQuestion.quesBody"></rich-text>
                   <span
                     >({{ paperDetailUnit.subScoreList[subIndex] }}分)</span
                   >
@@ -182,7 +177,9 @@
                     class="paper-question-option"
                   >
                     <span>{{ subOptIndex | optionOrderWordFilter }}. </span>
-                    <span v-html="subQuesOption.optionBody"></span>
+                    <rich-text
+                      :text-json="subQuesOption.optionBody"
+                    ></rich-text>
                   </div>
                 </div>
                 <div
@@ -373,11 +370,11 @@
         </el-form-item>
 
         <el-form-item label="题目">
-          <div
+          <rich-text
             class="paper-question-title"
             style="font-weight: 400; padding-top: 7px"
-            v-html="quesModel.quesBody"
-          ></div>
+            :text-json="quesModel.quesBody"
+          ></rich-text>
         </el-form-item>
         <el-form-item
           v-if="
@@ -390,15 +387,15 @@
             class="paper-question-option"
           >
             <span>{{ optIndex | optionOrderWordFilter }}. </span>
-            <span v-html="quesOption.optionBody"></span>
+            <rich-text :text-json="quesOption.optionBody"></rich-text>
           </div>
         </el-form-item>
         <el-form-item v-if="!isNested(quesModel.questionType)" label="答案">
-          <div
+          <rich-text
             class="paper-question-body"
             style="padding-top: 6px"
-            v-html="quesModel.quesAnswer"
-          ></div>
+            :text-json="quesModel.quesAnswer"
+          ></rich-text>
         </el-form-item>
       </el-form>
       <div slot="footer">