Prechádzať zdrojové kódy

修改框架和选择题

dsy 1 mesiac pred
rodič
commit
be18cbdb46

+ 1 - 1
.env

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

+ 1 - 1
package.json

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

+ 38 - 26
src/views/book/courseware/create/components/CreateCanvas.vue

@@ -328,32 +328,42 @@ export default {
     },
   },
   created() {
-    ContentGetCoursewareContent({ id: this.courseware_id }).then(({ content, content_group_row_list }) => {
-      if (content) {
-        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;
+    const loading = this.$loading({
+      lock: true,
+      text: '组件加载中...',
+      spinner: 'el-icon-loading',
+    });
+    ContentGetCoursewareContent({ id: this.courseware_id })
+      .then(({ content, content_group_row_list }) => {
+        if (content) {
+          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;
+          }
+          loading.close();
         }
-      }
-      if (content_group_row_list) this.content_group_row_list = JSON.parse(content_group_row_list);
+        if (content_group_row_list) this.content_group_row_list = JSON.parse(content_group_row_list);
 
-      this.$watch(
-        'data',
-        () => {
-          this.changeData();
-        },
-        {
-          deep: true,
-        },
-      );
-    });
+        this.$watch(
+          'data',
+          () => {
+            this.changeData();
+          },
+          {
+            deep: true,
+          },
+        );
+      })
+      .finally(() => {
+        loading.close();
+      });
     this.getBookUnifiedAttr();
   },
   mounted() {
@@ -398,12 +408,14 @@ export default {
      */
     async saveCoursewareContent(type) {
       let isAllLoader = false;
-      if (this.isEdit) {
+
+      if (this.$refs?.component === undefined || this.$refs?.component.length === 0) {
+        isAllLoader = true;
+      } else if (this.isEdit) {
         isAllLoader = this.$refs?.component?.every((item) => item.property.isGetContent);
       } else {
         isAllLoader = this.$refs?.previewEdit?.$refs?.preview?.every((item) => item.loader);
       }
-
       if (!isAllLoader) {
         this.$message.warning('有组件内容未加载完成,请稍后再试');
         return false;

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

@@ -42,7 +42,7 @@ const mixin = {
      * @param {string|number} value
      */
     updateProperty(key, value) {
-      this.property[key] = value;
+      this.$set(this.property, key, value);
     },
   },
 };

+ 7 - 1
src/views/book/courseware/create/components/question/select/Select.vue

@@ -3,7 +3,7 @@
     <template #content>
       <ul class="option-list">
         <li v-for="(item, i) in data.option_list" :key="item.mark" class="option-item">
-          <span class="serial-number">{{ convertNumberToLetter(i) }}.</span>
+          <span class="serial-number">{{ computedOptionNumber(i) }}.</span>
           <div class="option-contnet">
             <span :class="['checkbox', { active: isAnswer(item.mark) }]" @click="selectAnswer(item.mark)">
               <SvgIcon icon-class="check-mark" width="10" height="7" />
@@ -58,6 +58,7 @@ import ModuleMixin from '../../common/ModuleMixin';
 import PinyinText from '@/components/PinyinText.vue';
 
 import { getSelectData, getOption, arrangeTypeList } from '@/views/book/courseware/data/select';
+import { serialNumberTypeList, computeOptionMethods } from '@/views/book/courseware/data/common';
 
 export default {
   name: 'SelectPage',
@@ -98,6 +99,11 @@ export default {
     },
   },
   methods: {
+    computedOptionNumber(number) {
+      let type = serialNumberTypeList.find((item) => item.value === this.data.property.option_serial_type)?.value;
+      if (!type) return number + 1;
+      return computeOptionMethods[type](number);
+    },
     // 将数字转换为小写字母
     convertNumberToLetter(number) {
       return String.fromCharCode(97 + number);

+ 41 - 1
src/views/book/courseware/create/components/question/select/SelectSetting.vue

@@ -3,6 +3,11 @@
     <el-form :model="property" label-width="72px">
       <SerailNumber :property="property" />
 
+      <el-form-item label="选项序号" class="serial-number">
+        <el-input v-model="optionSerialType" disabled />
+        <SvgIcon icon-class="switch" height="16" width="16" @click="switchSNType" />
+      </el-form-item>
+
       <el-form-item label="排列">
         <el-radio
           v-for="{ value, label } in arrangeTypeList"
@@ -45,6 +50,7 @@
 import SettingMixin from '@/views/book/courseware/create/components/common/SettingMixin';
 
 import { arrangeTypeList, getSelectProperty } from '@/views/book/courseware/data/select';
+import { serialNumberTypeList } from '@/views/book/courseware/data/common';
 
 export default {
   name: 'SelectSetting',
@@ -55,7 +61,41 @@ export default {
       property: getSelectProperty(),
     };
   },
-  methods: {},
+  computed: {
+    optionSerialType() {
+      let type = serialNumberTypeList.find((item) => item.value === this.property.option_serial_type)?.value;
+
+      let val = '1';
+      switch (type) {
+        case serialNumberTypeList[0].value:
+          val = '1';
+          break;
+        case serialNumberTypeList[1].value:
+          val = '(1)';
+          break;
+        case serialNumberTypeList[2].value:
+          val = 'a';
+          break;
+        case serialNumberTypeList[3].value:
+          val = 'A';
+          break;
+        default:
+          val = '1';
+          break;
+      }
+      return val;
+    },
+  },
+  methods: {
+    /**
+     * @description 切换选项序号类型
+     */
+    switchSNType() {
+      const currentIndex = serialNumberTypeList.findIndex((item) => item.value === this.property.option_serial_type);
+      const nextIndex = (currentIndex + 1) % serialNumberTypeList.length;
+      this.updateProperty('option_serial_type', serialNumberTypeList[nextIndex].value);
+    },
+  },
 };
 </script>
 

+ 1 - 0
src/views/book/courseware/data/select.js

@@ -19,6 +19,7 @@ export function getSelectProperty() {
     sn_position: serialNumberPositionList[3].value,
     sn_display_mode: displayList[0].value,
     arrange_type: arrangeTypeList[0].value,
+    option_serial_type: serialNumberTypeList[2].value,
     view_pinyin: 'false', // 显示拼音
     pinyin_position: pinyinPositionList[0].value,
     is_first_sentence_first_hz_pinyin_first_char_upper_case: displayList[0].value, // 句首大写

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

@@ -18,9 +18,7 @@
           <span class="checkbox">
             <SvgIcon icon-class="check-mark" width="10" height="7" />
           </span>
-          <span class="serial-number">
-            {{ i + 1 }}
-          </span>
+          <span class="serial-number"> {{ computedOptionNumber(i) }}. </span>
           <PinyinText
             v-if="isEnable(data.property.view_pinyin)"
             class="content"
@@ -44,10 +42,11 @@
 </template>
 
 <script>
-import { getSelectData, arrangeTypeList } from '@/views/book/courseware/data/select';
-
 import PreviewMixin from '../common/PreviewMixin';
 
+import { getSelectData, arrangeTypeList } from '@/views/book/courseware/data/select';
+import { serialNumberTypeList, computeOptionMethods } from '@/views/book/courseware/data/common';
+
 export default {
   name: 'SelectPreview',
   mixins: [PreviewMixin],
@@ -74,6 +73,11 @@ export default {
     },
   },
   methods: {
+    computedOptionNumber(number) {
+      let type = serialNumberTypeList.find((item) => item.value === this.data.property.option_serial_type)?.value;
+      if (!type) return number + 1;
+      return computeOptionMethods[type](number);
+    },
     isAnswer(mark) {
       return this.answer.answer_list.includes(mark);
     },