dsy 4 дней назад
Родитель
Сommit
17d2b0798c

+ 1 - 1
.env

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

+ 1 - 1
package.json

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

+ 19 - 18
src/components/CommonPreview.vue

@@ -68,7 +68,7 @@
         :style="{ paddingLeft: navigationShow ? '15px' : '315px', paddingRight: sidebarShow ? '15px' : '315px' }"
         :style="{ paddingLeft: navigationShow ? '15px' : '315px', paddingRight: sidebarShow ? '15px' : '315px' }"
       >
       >
         <!-- 左侧菜单栏 - 收缩 -->
         <!-- 左侧菜单栏 - 收缩 -->
-        <div v-if="!navigationShow" class="catalogue-bar" @click="toggleNavigationShow">
+        <div v-if="!navigationShow && !isFullScreen" class="catalogue-bar" @click="toggleNavigationShow">
           <SvgIcon icon-class="catalogue" size="54" />
           <SvgIcon icon-class="catalogue" size="54" />
         </div>
         </div>
 
 
@@ -97,7 +97,7 @@
         </main>
         </main>
 
 
         <!-- 右侧菜单栏 - 收缩 -->
         <!-- 右侧菜单栏 - 收缩 -->
-        <aside v-if="!sidebarShow" class="sidebar-bar">
+        <aside v-if="!sidebarShow && !isFullScreen" class="sidebar-bar">
           <aside class="toolbar">
           <aside class="toolbar">
             <div class="toolbar-special">
             <div class="toolbar-special">
               <img :src="require('@/assets/icon/sidebar-fullscreen.png')" alt="全屏" @click="fullScreen" />
               <img :src="require('@/assets/icon/sidebar-fullscreen.png')" alt="全屏" @click="fullScreen" />
@@ -212,11 +212,7 @@
                         <el-image v-if="shouldShowItem(chapter, item)" :src="item.file_url" fit="contain" />
                         <el-image v-if="shouldShowItem(chapter, item)" :src="item.file_url" fit="contain" />
                         <div class="mark">
                         <div class="mark">
                           <span class="word">{{ item.file_name }}</span>
                           <span class="word">{{ item.file_name }}</span>
-                          <el-link
-                            type="primary"
-                            class="el-icon-place linkLocation"
-                            @click="handleLocation(item, 3)"
-                          ></el-link>
+                          <el-link type="primary" class="el-icon-place linkLocation" @click="handleLocation(item, 3)" />
                         </div>
                         </div>
                       </template>
                       </template>
                       <template v-else-if="parseInt(drawerType) === 1">
                       <template v-else-if="parseInt(drawerType) === 1">
@@ -230,11 +226,7 @@
                         />
                         />
                         <div class="mark">
                         <div class="mark">
                           <span class="word"></span>
                           <span class="word"></span>
-                          <el-link
-                            type="primary"
-                            class="el-icon-place linkLocation"
-                            @click="handleLocation(item, 3)"
-                          ></el-link>
+                          <el-link type="primary" class="el-icon-place linkLocation" @click="handleLocation(item, 3)" />
                         </div>
                         </div>
                       </template>
                       </template>
                       <template v-else-if="parseInt(drawerType) === 2">
                       <template v-else-if="parseInt(drawerType) === 2">
@@ -246,11 +238,7 @@
                         />
                         />
                         <div class="mark">
                         <div class="mark">
                           <span class="word">{{ item.file_name }}</span>
                           <span class="word">{{ item.file_name }}</span>
-                          <el-link
-                            type="primary"
-                            class="el-icon-place linkLocation"
-                            @click="handleLocation(item, 3)"
-                          ></el-link>
+                          <el-link type="primary" class="el-icon-place linkLocation" @click="handleLocation(item, 3)" />
                         </div>
                         </div>
                       </template>
                       </template>
                     </li>
                     </li>
@@ -553,6 +541,7 @@ export default {
       book_id: '',
       book_id: '',
       activeBookChapterId: '',
       activeBookChapterId: '',
       multimediaLoadingStates: true,
       multimediaLoadingStates: true,
+      isFullScreen: false, // 是否全屏状态
     };
     };
   },
   },
   computed: {
   computed: {
@@ -612,6 +601,18 @@ export default {
     if (!this.isBook) {
     if (!this.isBook) {
       this.getProjectInfo();
       this.getProjectInfo();
     }
     }
+
+    // 监听全屏事件
+    document.addEventListener('fullscreenchange', () => {
+      if (document.fullscreenElement) {
+        this.isFullScreen = true;
+      } else {
+        this.isFullScreen = false;
+      }
+    });
+  },
+  beforeDestroy() {
+    document.removeEventListener('fullscreenchange', () => {});
   },
   },
   methods: {
   methods: {
     getProjectBaseInfo() {
     getProjectBaseInfo() {
@@ -823,7 +824,7 @@ export default {
         this[handle](param);
         this[handle](param);
       }
       }
 
 
-      if (barLevel == 2) {
+      if (barLevel === 2) {
         this.twoCurToolbarIcon = icon;
         this.twoCurToolbarIcon = icon;
       } else {
       } else {
         this.curToolbarIcon = icon;
         this.curToolbarIcon = icon;

+ 24 - 1
src/views/book/courseware/create/components/PreviewEdit.vue

@@ -1,5 +1,6 @@
 <template>
 <template>
-  <div class="preview">
+  <div ref="preview" class="preview">
+    <div v-if="heightPrompt" class="height-prompt"></div>
     <template v-for="(row, i) in rowList">
     <template v-for="(row, i) in rowList">
       <!-- 行 -->
       <!-- 行 -->
       <div :key="i" :class="['row', `row-${i}`]" :style="getMultipleColStyle(i)">
       <div :key="i" :class="['row', `row-${i}`]" :style="getMultipleColStyle(i)">
@@ -107,15 +108,29 @@ export default {
       bookInfo: {
       bookInfo: {
         theme_color: '',
         theme_color: '',
       },
       },
+      resizeObserver: null, // 用于监听高度变化
+      heightPrompt: false, // 是否显示高度提示线
     };
     };
   },
   },
   created() {
   created() {
     document.addEventListener('mousemove', this.dragMove);
     document.addEventListener('mousemove', this.dragMove);
     document.addEventListener('mouseup', this.dragEnd);
     document.addEventListener('mouseup', this.dragEnd);
   },
   },
+  mounted() {
+    const element = this.$refs.preview;
+    // 监听 courserware 高度变化,获取其高度
+    this.resizeObserver = new ResizeObserver(() => {
+      const rect = element.getBoundingClientRect();
+      this.heightPrompt = rect.height > 1620;
+    });
+    this.resizeObserver.observe(element);
+  },
   beforeDestroy() {
   beforeDestroy() {
     document.removeEventListener('mousemove', this.dragMove);
     document.removeEventListener('mousemove', this.dragMove);
     document.removeEventListener('mouseup', this.dragEnd);
     document.removeEventListener('mouseup', this.dragEnd);
+    if (this.resizeObserver) {
+      this.resizeObserver.disconnect();
+    }
   },
   },
   methods: {
   methods: {
     getMultipleColStyle(i) {
     getMultipleColStyle(i) {
@@ -324,6 +339,14 @@ export default {
   flex-direction: column;
   flex-direction: column;
   row-gap: $component-spacing;
   row-gap: $component-spacing;
 
 
+  .height-prompt {
+    position: absolute;
+    top: 1620px;
+    left: -200px;
+    width: 1400px;
+    border-top: 2px dashed #903ff8;
+  }
+
   .row {
   .row {
     display: grid;
     display: grid;
     gap: $component-spacing;
     gap: $component-spacing;

+ 1 - 1
src/views/book/courseware/data/article.js

@@ -90,7 +90,7 @@ export function getArticleProperty() {
 export function getArticleData() {
 export function getArticleData() {
   return {
   return {
     type: 'article',
     type: 'article',
-    title: '文',
+    title: '叙述体课文',
     property: getArticleProperty(),
     property: getArticleProperty(),
     content: '', // 课文内容
     content: '', // 课文内容
     mp3_list: [], // 音频列表
     mp3_list: [], // 音频列表

+ 1 - 1
src/views/book/courseware/data/bookType.js

@@ -320,7 +320,7 @@ export const bookTypeOption = [
       },
       },
       {
       {
         value: 'article',
         value: 'article',
-        label: '文',
+        label: '叙述体课文',
         icon: 'article',
         icon: 'article',
         component: Article,
         component: Article,
         set: ArticleSetting,
         set: ArticleSetting,

+ 19 - 0
src/views/book/courseware/preview/CoursewarePreview.vue

@@ -1,5 +1,6 @@
 <template>
 <template>
   <div ref="courserware" class="courserware" :style="computedCourserwareStyle()" @mouseup="handleTextSelection">
   <div ref="courserware" class="courserware" :style="computedCourserwareStyle()" @mouseup="handleTextSelection">
+    <div v-if="heightPrompt" class="height-prompt"></div>
     <template v-for="(row, i) in data.row_list">
     <template v-for="(row, i) in data.row_list">
       <div v-show="computedRowVisibility(row.row_id)" :key="i" class="row" :style="getMultipleColStyle(i)">
       <div v-show="computedRowVisibility(row.row_id)" :key="i" class="row" :style="getMultipleColStyle(i)">
         <el-checkbox
         <el-checkbox
@@ -156,6 +157,8 @@ export default {
       },
       },
       selectedInfo: null,
       selectedInfo: null,
       selectHandleInfo: null,
       selectHandleInfo: null,
+      resizeObserver: null, // 用于监听高度变化
+      heightPrompt: false, // 是否显示高度提示线
     };
     };
   },
   },
   watch: {
   watch: {
@@ -184,9 +187,17 @@ export default {
       top: rect.top,
       top: rect.top,
     };
     };
     window.addEventListener('mousedown', this.handleMouseDown);
     window.addEventListener('mousedown', this.handleMouseDown);
+
+    // 监听 courserware 高度变化,获取其高度
+    this.resizeObserver = new ResizeObserver(() => {
+      const rect = element.getBoundingClientRect();
+      this.heightPrompt = rect.height > 1620;
+    });
+    this.resizeObserver.observe(element);
   },
   },
   beforeDestroy() {
   beforeDestroy() {
     window.removeEventListener('mousedown', this.handleMouseDown);
     window.removeEventListener('mousedown', this.handleMouseDown);
+    this.resizeObserver.disconnect();
   },
   },
   methods: {
   methods: {
     /**
     /**
@@ -755,6 +766,14 @@ export default {
     bottom: -15px;
     bottom: -15px;
   }
   }
 
 
+  .height-prompt {
+    position: absolute;
+    top: 1620px;
+    left: -200px;
+    width: 1400px;
+    border-top: 2px dashed #903ff8;
+  }
+
   .row {
   .row {
     display: grid;
     display: grid;
     gap: $component-spacing;
     gap: $component-spacing;

+ 7 - 4
src/views/personal_workbench/project/ProductionEditorialManage.vue

@@ -98,7 +98,7 @@
             >
             >
               修改
               修改
             </span>
             </span>
-            <span class="link" @click="openSetProducer(id)">设置制作人</span>
+            <span class="link" @click="openSetProducer(id, producer_list)">设置制作人</span>
             <span class="link" @click="openSetAuditor(id)">设置审校人</span>
             <span class="link" @click="openSetAuditor(id)">设置审校人</span>
             <span
             <span
               v-if="is_root !== 'true'"
               v-if="is_root !== 'true'"
@@ -127,6 +127,7 @@
       :id="producer.id"
       :id="producer.id"
       :visible.sync="producer.visible"
       :visible.sync="producer.visible"
       :member-list="member_list"
       :member-list="member_list"
+      :list="producer.list"
       @close="producer.visible = false"
       @close="producer.visible = false"
       @chapterSetProducer="chapterSetProducer"
       @chapterSetProducer="chapterSetProducer"
     />
     />
@@ -195,6 +196,7 @@ export default {
       producer: {
       producer: {
         visible: false, // 设置制作人弹窗
         visible: false, // 设置制作人弹窗
         id: '', // 章节ID
         id: '', // 章节ID
+        list: [], // 当前章节制作人列表
       },
       },
       visibleAuditSteps: false, // 设置审校步骤弹窗
       visibleAuditSteps: false, // 设置审校步骤弹窗
       auditor: {
       auditor: {
@@ -374,13 +376,14 @@ export default {
         });
         });
       }
       }
     },
     },
-    openSetProducer(id) {
-      this.producer.visible = true;
+    openSetProducer(id, producer_list) {
       this.producer.id = id;
       this.producer.id = id;
+      this.producer.list = producer_list;
+      this.producer.visible = true;
     },
     },
     openSetAuditor(id) {
     openSetAuditor(id) {
-      this.auditor.visible = true;
       this.auditor.id = id;
       this.auditor.id = id;
+      this.auditor.visible = true;
     },
     },
     /**
     /**
      * 设置制作人
      * 设置制作人

+ 24 - 0
src/views/personal_workbench/project/components/SetUser.vue

@@ -38,6 +38,10 @@ export default {
       type: String,
       type: String,
       default: 'producer',
       default: 'producer',
     },
     },
+    list: {
+      type: Array,
+      default: () => [],
+    },
   },
   },
   data() {
   data() {
     return {
     return {
@@ -66,6 +70,26 @@ export default {
       return this.typeList.find((item) => item.type === this.type).bindKey;
       return this.typeList.find((item) => item.type === this.type).bindKey;
     },
     },
   },
   },
+  watch: {
+    list: {
+      handler(val) {
+        if (this.type !== 'producer') return;
+        if (val.length === 0) {
+          this.user = {
+            id_list: [],
+            id: '',
+          };
+          return;
+        }
+        if (this.isMultiple) {
+          this.user.id_list = val.map(({ id }) => id);
+        } else {
+          this.user.id = val[0]?.id || '';
+        }
+      },
+      deep: true,
+    },
+  },
   methods: {
   methods: {
     dialogClose() {
     dialogClose() {
       this.$emit('update:visible', false);
       this.$emit('update:visible', false);