Browse Source

修改问题

dusenyao 1 year ago
parent
commit
5ffe183159

+ 13 - 0
public/tinymce/skins/content/index-nospace.css

@@ -0,0 +1,13 @@
+body#tinymce {
+  margin-left: 12px;
+}
+
+.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
+  font-size: 14px;
+  color: #86909c;
+  cursor: text;
+}
+
+p {
+  margin: 0;
+}

+ 5 - 1
src/components/common/RichText.vue

@@ -95,6 +95,10 @@ export default {
       type: Number,
       default: 16,
     },
+    isHasSpace: {
+      type: Boolean,
+      default: false,
+    },
   },
   data() {
     return {
@@ -111,7 +115,7 @@ export default {
         placeholder: this.placeholder,
         language: 'zh_CN',
         skin_url: `${process.env.BASE_URL}tinymce/skins/ui/oxide`,
-        content_css: `${process.env.BASE_URL}tinymce/skins/content/index.css`,
+        content_css: `${process.env.BASE_URL}tinymce/skins/content/${this.isHasSpace ? 'index-nospace' : 'index'}.css`,
         min_height: this.height,
         width: '100%',
         autoresize_bottom_margin: 0,

+ 7 - 1
src/views/exercise_questions/answer/index.vue

@@ -131,7 +131,12 @@
         <template v-else>
           <el-button v-if="curQuestionIndex > 0" round @click="fillQuestionAnswer('pre')">上一题</el-button>
           <el-button
-            v-if="curQuestionIndex === questionList.length - 1 && !isTeacherAnnotations && !isShow"
+            v-if="
+              curQuestionIndex === questionList.length - 1 &&
+              !isTeacherAnnotations &&
+              !isShow &&
+              user_answer_record_info.is_exist_answer_record !== 'true'
+            "
             type="primary"
             round
             @click="confirmSubmitAnswer"
@@ -404,6 +409,7 @@ export default {
           this.answer_mode = answer_mode;
           this.curQuestionIndex = 0;
           this.isSubmit = false;
+          this.user_answer_record_info.is_exist_answer_record = 'false';
         })
         .catch(() => {});
     },

+ 13 - 13
src/views/exercise_questions/create/components/exercises/FillQuestion.vue

@@ -4,15 +4,6 @@
       <div class="stem">
         <RichText v-model="data.stem" :font-size="18" placeholder="输入题干" />
 
-        <el-input
-          v-if="isEnable(data.property.is_enable_word_select_fill)"
-          v-model="data.word_select_fill"
-          rows="3"
-          resize="none"
-          type="textarea"
-          placeholder="输入词汇"
-        />
-
         <RichText
           v-if="isEnable(data.property.is_enable_description)"
           v-model="data.description"
@@ -20,6 +11,15 @@
         />
       </div>
 
+      <el-input
+        v-if="isEnable(data.property.is_enable_word_select_fill)"
+        v-model="data.word_select_fill"
+        rows="3"
+        resize="none"
+        type="textarea"
+        placeholder="输入词汇"
+      />
+
       <div class="content">
         <RichText
           ref="modelEssay"
@@ -65,21 +65,21 @@
             <el-option v-for="item in fontSizeList" :key="item" :label="item" :value="item" />
           </el-select>
         </el-form-item>
-        <el-form-item label="选词填空">
+        <el-form-item label="提示">
           <el-radio
             v-for="{ value, label } in switchOption"
             :key="value"
-            v-model="data.property.is_enable_word_select_fill"
+            v-model="data.property.is_enable_description"
             :label="value"
           >
             {{ label }}
           </el-radio>
         </el-form-item>
-        <el-form-item label="提示">
+        <el-form-item label="选词填空">
           <el-radio
             v-for="{ value, label } in switchOption"
             :key="value"
-            v-model="data.property.is_enable_description"
+            v-model="data.property.is_enable_word_select_fill"
             :label="value"
           >
             {{ label }}

+ 11 - 10
src/views/exercise_questions/create/components/exercises/ListenFillQuestion.vue

@@ -11,6 +11,12 @@
           @deleteFile="deleteFile"
         />
 
+        <RichText
+          v-if="isEnable(data.property.is_enable_description)"
+          v-model="data.description"
+          placeholder="输入提示"
+        />
+
         <el-input
           v-if="isEnable(data.property.is_enable_word_select_fill)"
           v-model="data.word_select_fill"
@@ -19,12 +25,6 @@
           type="textarea"
           placeholder="输入词汇"
         />
-
-        <RichText
-          v-if="isEnable(data.property.is_enable_description)"
-          v-model="data.description"
-          placeholder="输入提示"
-        />
       </div>
 
       <div class="content">
@@ -81,27 +81,28 @@
           </el-select>
         </el-form-item>
 
-        <el-form-item label="选词填空">
+        <el-form-item label="提示">
           <el-radio
             v-for="{ value, label } in switchOption"
             :key="value"
-            v-model="data.property.is_enable_word_select_fill"
+            v-model="data.property.is_enable_description"
             :label="value"
           >
             {{ label }}
           </el-radio>
         </el-form-item>
 
-        <el-form-item label="提示">
+        <el-form-item label="选词填空">
           <el-radio
             v-for="{ value, label } in switchOption"
             :key="value"
-            v-model="data.property.is_enable_description"
+            v-model="data.property.is_enable_word_select_fill"
             :label="value"
           >
             {{ label }}
           </el-radio>
         </el-form-item>
+
         <el-form-item label="听力">
           <el-radio
             v-for="{ value, label } in switchOption"

+ 1 - 1
src/views/exercise_questions/create/components/exercises/ReadAloudQuestion.vue

@@ -10,7 +10,7 @@
           placeholder="输入提示"
         />
 
-        <RichText v-model="data.text" placeholder="输入文段" />
+        <RichText v-model="data.text" placeholder="输入文段" :is-has-space="true" />
 
         <UploadAudio
           v-show="isEnable(data.property.is_enable_listening)"

+ 1 - 1
src/views/exercise_questions/create/components/exercises/ReadQuestion.vue

@@ -12,7 +12,7 @@
       </div>
 
       <div class="content">
-        <RichText v-model="data.article" :is-border="true" :height="130" placeholder="输入文章" />
+        <RichText v-model="data.article" :is-border="true" :height="130" placeholder="输入文章" :is-has-space="true" />
       </div>
 
       <div v-for="(item, i) in data.question_list" :key="i">

+ 3 - 2
src/views/exercise_questions/preview/ActivityPreview.vue

@@ -15,6 +15,7 @@
     <UploadFiles
       :fille-number="999"
       file-type-name="文件"
+      :max-size="4096"
       upload-type="*"
       :file-id-list="answer.accessory_file_id_list"
       :disabled="disabled"
@@ -25,10 +26,10 @@
 </template>
 
 <script>
-import UploadFiles from './components/common/UploadFiles.vue';
-
 import PreviewMixin from './components/PreviewMixin';
 
+import UploadFiles from './components/common/UploadFiles.vue';
+
 export default {
   name: 'ActivityPreview',
   components: {

+ 19 - 6
src/views/exercise_questions/preview/FillPreview.vue

@@ -8,18 +8,18 @@
       <span v-html="sanitizeHTML(data.stem)"></span>
     </div>
 
-    <div v-if="isEnable(data.property.is_enable_word_select_fill)" class="word-fill">
-      <span v-for="(text, i) in wordFillList" :key="i" class="word-fill-item" @click="selectedDescription(text)">
-        {{ text }}
-      </span>
-    </div>
-
     <div
       v-if="isEnable(data.property.is_enable_description)"
       class="description rich-text"
       v-html="sanitizeHTML(data.description)"
     ></div>
 
+    <div v-if="isEnable(data.property.is_enable_word_select_fill)" class="word-fill">
+      <span v-for="(text, i) in wordFillList" :key="i" class="word-fill-item" @click="selectedDescription(text)">
+        {{ text }}
+      </span>
+    </div>
+
     <div class="fill-wrapper">
       <p v-for="(item, i) in modelEssay" :key="i">
         <template v-for="(li, j) in item">
@@ -31,6 +31,7 @@
               :disabled="disabled"
               :class="[...computedAnswerClass(li.mark)]"
               :style="[{ width: Math.max(80, li.content.length * 21.3) + 'px' }]"
+              @input="handleInput(i, j)"
               @focus="handleInputFocus(i, j)"
               @blur="handleTone(li.content, i, j)"
             />
@@ -55,6 +56,7 @@ export default {
   data() {
     return {
       modelEssay: [],
+      history: [], // modelEssay 历史记录
       inputFocus: false,
       focusPostion: {
         i: -1,
@@ -79,6 +81,7 @@ export default {
     modelEssay: {
       handler(val) {
         if (!val) return;
+        this.history = JSON.parse(JSON.stringify(val));
         this.answer.answer_list = val
           .map((item) => {
             return item
@@ -157,6 +160,16 @@ export default {
       this.modelEssay[i][j].content = text;
       this.inputFocus = false;
     },
+    /**
+     * 处理输入框输入
+     * @param {number} i
+     * @param {number} j
+     */
+    handleInput(i, j) {
+      // 在开启选词填空的情况下,输入框输入内容时,做撤销处理
+      if (!this.isEnable(this.data.property.is_enable_word_select_fill)) return;
+      this.modelEssay[i][j].content = this.history[i][j].content;
+    },
     handleTone(value, i, j) {
       if (!/^[a-zA-Z0-9\s]+$/.test(value)) return;
       this.modelEssay[i][j].content = value

+ 19 - 5
src/views/exercise_questions/preview/ListenFillPreview.vue

@@ -7,11 +7,6 @@
       </span>
       <span v-html="sanitizeHTML(data.stem)"></span>
     </div>
-    <div v-if="isEnable(data.property.is_enable_word_select_fill)" class="word-fill">
-      <span v-for="(text, i) in wordFillList" :key="i" class="word-fill-item" @click="selectedDescription(text)">
-        {{ text }}
-      </span>
-    </div>
 
     <div
       v-if="isEnable(data.property.is_enable_description)"
@@ -19,6 +14,12 @@
       v-html="sanitizeHTML(data.description)"
     ></div>
 
+    <div v-if="isEnable(data.property.is_enable_word_select_fill)" class="word-fill">
+      <span v-for="(text, i) in wordFillList" :key="i" class="word-fill-item" @click="selectedDescription(text)">
+        {{ text }}
+      </span>
+    </div>
+
     <AudioPlay
       v-if="isEnable(data.property.is_enable_listening) && data.file_id_list.length > 0"
       :file-id="data.file_id_list[0]"
@@ -37,6 +38,7 @@
               :disabled="disabled"
               :class="[...computedAnswerClass(li.mark)]"
               :style="[{ width: Math.max(80, li.content.length * 21.3) + 'px' }]"
+              @input="handleInput(i, j)"
               @focus="handleInputFocus(i, j)"
               @blur="handleTone(li.content, i, j)"
             />
@@ -62,6 +64,7 @@ export default {
     return {
       inputFocus: false,
       modelEssay: [],
+      history: [], // modelEssay 历史记录
       focusPostion: {
         i: -1,
         j: -1,
@@ -85,6 +88,7 @@ export default {
     modelEssay: {
       handler(val) {
         if (!val) return;
+        this.history = JSON.parse(JSON.stringify(val));
         this.answer.answer_list = val
           .map((item) => {
             return item
@@ -140,6 +144,16 @@ export default {
         j,
       };
     },
+    /**
+     * 处理输入框输入
+     * @param {number} i
+     * @param {number} j
+     */
+    handleInput(i, j) {
+      // 在开启选词填空的情况下,输入框输入内容时,做撤销处理
+      if (!this.isEnable(this.data.property.is_enable_word_select_fill)) return;
+      this.modelEssay[i][j].content = this.history[i][j].content;
+    },
     selectedDescription(text) {
       if (!this.inputFocus) return;
       const { i, j } = this.focusPostion;

+ 12 - 2
src/views/exercise_questions/preview/components/common/UploadFiles.vue

@@ -40,8 +40,9 @@
 
 <script>
 import { fileUpload, GetFileStoreInfo } from '@/api/app';
-const Base64 = require('js-base64').Base64;
+import { Base64 } from 'js-base64';
 import { getConfig } from '@/utils/auth';
+import { conversionSize } from '@/utils/common';
 
 export default {
   name: 'UploadFiles',
@@ -70,6 +71,11 @@ export default {
       type: Boolean,
       default: false,
     },
+    // 最大文件大小(单位 MB)
+    maxSize: {
+      type: Number,
+      default: 0,
+    },
   },
   data() {
     return {
@@ -106,7 +112,11 @@ export default {
   },
   methods: {
     beforeUpload(file) {
-      // 可以用来限制文件大小
+      let size = file.size / 1024 / 1024;
+      if (this.maxSize !== 0 && size > this.maxSize) {
+        this.$message.error(`文件大小不能超过${conversionSize(this.maxSize * 1024 * 1024)}`);
+        return false;
+      }
     },
     upload(file) {
       fileUpload('Mid', file, { isGlobalprogress: true }).then(({ file_info_list }) => {