Browse Source

修改问题

dsy 1 week ago
parent
commit
5eab1efbd4

+ 1 - 1
.env

@@ -11,4 +11,4 @@ VUE_APP_BookWebSI = '/GCLSBookWebSI/ServiceInterface'
 VUE_APP_EepServer = '/EEPServer/SI'
 
 #version
-VUE_APP_VERSION = '2025.10.20'
+VUE_APP_VERSION = '2025.10.22'

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "eep_page",
-  "version": "2025.10.20",
+  "version": "2025.10.22",
   "private": true,
   "main": "main.js",
   "description": "智慧梧桐数字教材编辑器",

+ 2 - 0
src/components/RichText.vue

@@ -311,6 +311,7 @@ export default {
         const applyFontSize = () => {
           try {
             editor.execCommand('FontSize', false, newVal);
+            editor.setContent(this.value); // 触发内容更新,解决 value 在设置后变为空字符串的问题
           } catch (e) {
             // 容错:某些情况下 execCommand 会抛错,忽略即可
             // console.warn('apply fontSize failed', e);
@@ -333,6 +334,7 @@ export default {
         const applyFontFamily = () => {
           try {
             editor.execCommand('FontName', false, newVal);
+            editor.setContent(this.value); // 触发内容更新,解决 value 在设置后变为空字符串的问题
           } catch (e) {
             // 容错:忽略因 selection 不可用或其它原因导致的错误
           }

+ 21 - 17
src/views/book/courseware/create/components/CreateCanvas.vue

@@ -19,7 +19,7 @@
       <span class="drag-line" data-row="-1"></span>
       <!-- 行 -->
       <template v-for="(row, i) in data.row_list">
-        <div :key="row.row_id || `row-${i}`" class="row" :style="computedRowStyle(i)">
+        <div :key="row.row_id" class="row" :style="computedRowStyle(i)">
           <el-checkbox
             v-if="row?.row_id"
             v-model="rowCheckList[row.row_id]"
@@ -30,12 +30,12 @@
           <template v-for="(col, j) in row.col_list">
             <span
               v-if="j === 0"
-              :key="`start-${row.row_id || 'r' + i}-${col.col_id || 'c' + j}`"
+              :key="`start-${row.row_id}-${col.col_id}`"
               class="drag-vertical-line col-start"
               :data-row="i"
               :data-col="j"
             ></span>
-            <div :key="col.col_id || `col-${i}-${j}`" :class="['col', `col-${i}-${j}`]" :style="computedColStyle(col)">
+            <div :key="col.col_id" :class="['col', `col-${i}-${j}`]" :style="computedColStyle(col)">
               <!-- 网格 -->
               <template v-for="(grid, k) in col.grid_list">
                 <span
@@ -106,19 +106,14 @@
               </template>
             </div>
             <span
-              :key="`end-${row.row_id || 'r' + i}-${col.col_id || 'c' + j}`"
+              :key="`end-${row.row_id}-${col.col_id}`"
               class="drag-vertical-line col-end"
               :data-row="i"
               :data-col="j + 1"
             ></span>
           </template>
         </div>
-        <span
-          v-if="i < data.row_list.length - 1"
-          :key="`row-${row.row_id || i}`"
-          class="drag-line"
-          :data-row="i"
-        ></span>
+        <span v-if="i < data.row_list.length - 1" :key="`row-${row.row_id}`" class="drag-line" :data-row="i"></span>
       </template>
       <span class="drag-line" :data-row="data.row_list.length - 1"></span>
     </template>
@@ -335,9 +330,17 @@ export default {
   created() {
     ContentGetCoursewareContent({ id: this.courseware_id }).then(({ content, content_group_row_list }) => {
       if (content) {
-        this.data = JSON.parse(content);
-        // 为旧数据补充 row_id / col_id,保证 v-for 使用稳定 key
-        this.normalizeRowColIds();
+        let parsedContent = JSON.parse(content);
+        if (
+          parsedContent &&
+          Array.isArray(parsedContent.row_list) &&
+          parsedContent.row_list.length > 0 &&
+          !parsedContent.row_list[0]?.row_id
+        ) {
+          this.data = this.normalizeRowColIds(parsedContent);
+        } else {
+          this.data = parsedContent;
+        }
       }
       if (content_group_row_list) this.content_group_row_list = JSON.parse(content_group_row_list);
 
@@ -1281,17 +1284,18 @@ export default {
     /**
      * 归一化 row_list 中的 row_id / col_id(为后端旧数据补 id)
      */
-    normalizeRowColIds() {
-      if (!this.data || !Array.isArray(this.data.row_list)) return;
-      this.data.row_list = this.data.row_list.map((row, ri) => {
+    normalizeRowColIds(data) {
+      if (!data || !Array.isArray(data.row_list)) return data;
+      data.row_list = data.row_list.map((row) => {
         if (!row.row_id) row.row_id = `R${getRandomNumber(6, true)}`;
         if (!Array.isArray(row.col_list)) row.col_list = [];
-        row.col_list = row.col_list.map((col, ci) => {
+        row.col_list = row.col_list.map((col) => {
           if (!col.col_id) col.col_id = `C${getRandomNumber(8, true)}`;
           return col;
         });
         return row;
       });
+      return data;
     },
   },
 };

+ 1 - 0
src/views/book/courseware/create/components/common/ModuleMixin.js

@@ -90,6 +90,7 @@ const mixin = {
   },
   methods: {
     GetCoursewareComponentContent() {
+      if (this.courseware_id === '' || this.id === '') return;
       ContentGetCoursewareComponentContent({ courseware_id: this.courseware_id, component_id: this.id }).then(
         ({ content }) => {
           if (content) {

+ 34 - 30
src/views/book/courseware/create/components/question/fill/Fill.vue

@@ -130,36 +130,8 @@ export default {
       },
     },
     'data.property': {
-      handler({ view_pinyin }) {
-        if (!this.isEnable(view_pinyin)) {
-          this.data.model_essay.forEach((item, i) => {
-            item.forEach((option) => {
-              option.paragraph_list = [];
-              option.paragraph_list_parameter = {
-                text: '',
-                pinyin_proofread_word_list: [],
-              };
-            });
-          });
-          return;
-        }
-
-        if (
-          this.data.model_essay.length > 0 &&
-          this.data.model_essay[0].length > 0 &&
-          this.data.model_essay[0][0].paragraph_list.length > 0
-        ) {
-          return;
-        }
-
-        this.data.model_essay.forEach((item, i) => {
-          item.forEach((option, j) => {
-            const text = option.content.replace(/<[^>]+>/g, '');
-            if (!text) return;
-            option.paragraph_list_parameter.text = text;
-            this.createParsedTextInfoPinyin(text, i, j, 'model_essay');
-          });
-        });
+      handler() {
+        this.handleViewPinyin();
       },
       deep: true,
     },
@@ -182,6 +154,7 @@ export default {
             .replace(/<span class="rich-fill".*?>(.*?)<\/span>|([_]{3,})/gi, '###$1$2###');
           this.data.model_essay.push(this.splitRichText(str));
         });
+      this.handleViewPinyin();
     },
     // 分割富文本
     splitRichText(str) {
@@ -281,6 +254,37 @@ export default {
         },
       ];
     },
+    handleViewPinyin() {
+      if (!this.isEnable(this.data.property.view_pinyin)) {
+        this.data.model_essay.forEach((item) => {
+          item.forEach((option) => {
+            option.paragraph_list = [];
+            option.paragraph_list_parameter = {
+              text: '',
+              pinyin_proofread_word_list: [],
+            };
+          });
+        });
+        return;
+      }
+
+      if (
+        this.data.model_essay.length > 0 &&
+        this.data.model_essay[0].length > 0 &&
+        this.data.model_essay[0][0].paragraph_list.length > 0
+      ) {
+        return;
+      }
+
+      this.data.model_essay.forEach((item, i) => {
+        item.forEach((option, j) => {
+          const text = option.content.replace(/<[^>]+>/g, '');
+          if (!text) return;
+          option.paragraph_list_parameter.text = text;
+          this.createParsedTextInfoPinyin(text, i, j, 'model_essay');
+        });
+      });
+    },
   },
 };
 </script>

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

@@ -389,6 +389,7 @@ export default {
       align-items: center;
       width: 120px;
       margin: 0 2px;
+      vertical-align: bottom;
 
       &.pinyin :deep input.el-input__inner {
         font-family: 'PINYIN-B', sans-serif;