Browse Source

修复问题

dsy 1 day ago
parent
commit
56b53afa91

+ 3 - 0
.env

@@ -9,3 +9,6 @@ VUE_APP_BookWebSI = '/GCLSBookWebSI/ServiceInterface'
 
 #eepServer
 VUE_APP_EepServer = '/EEPServer/SI'
+
+#version
+VUE_APP_VERSION = '0.1.1'

+ 3 - 3
package.json

@@ -1,9 +1,9 @@
 {
   "name": "eep_page",
-  "version": "1.0.0",
+  "version": "0.1.0",
   "private": true,
   "main": "main.js",
-  "description": "国际中文智慧教育引擎互动教材编辑器",
+  "description": "智慧梧桐数字教材编辑器",
   "author": "合新软件",
   "scripts": {
     "electron": "nodemon --watch main.js --exec \"electron .\"",
@@ -80,7 +80,7 @@
   },
   "build": {
     "appId": "com.gcls.page.textbook",
-    "productName": "国际中文智慧教育引擎互动教材编辑器",
+    "productName": "智慧梧桐数字教材编辑器",
     "copyright": "Copyright © 2025 ${author}",
     "directories": {
       "output": "out"

BIN
public/icon.png


+ 0 - 1
src/components/CommonPreview.vue

@@ -709,7 +709,6 @@ export default {
     padding: 5px;
     margin: 0 5px;
     background-color: #fff;
-    border: 3px solid #f44444;
     border-radius: 4px;
     box-shadow: 0 2px 4px rgba(0, 0, 0, 10%);
 

+ 7 - 1
src/layouts/home/footer/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="home-footer">
     <div class="email"></div>
+    <div class="version">版本:{{ version }}</div>
   </div>
 </template>
 
@@ -8,13 +9,18 @@
 export default {
   name: 'HomeFooter',
   data() {
-    return {};
+    return {
+      version: process.env.VUE_APP_VERSION,
+    };
   },
 };
 </script>
 
 <style lang="scss" scoped>
 .home-footer {
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
   height: 48px;
   padding: 8px;
   background-color: #fff;

+ 13 - 14
src/utils/transform.js

@@ -56,18 +56,17 @@ export function audioTimeToMMSS(currentTime) {
   return `${minutes}:${seconds}:${milliseconds}`;
 }
 
-
-//分:秒转秒
+// 分:秒转秒
 export function timeStrToSen(time) {
-    if (!time) {
-        return -1;
-    }
-    var pos = time.indexOf(':');
-    var min = 0,
-        sec = 0;;
-    if (pos > 0) {
-        min = parseInt(time.substring(0, pos));
-        sec = parseFloat(time.substring(pos + 1))
-    }
-    return min * 60 + sec;
-}
+  if (!time) {
+    return -1;
+  }
+  let pos = time.indexOf(':');
+  let min = 0;
+  let sec = 0;
+  if (pos > 0) {
+    min = parseInt(time.substring(0, pos));
+    sec = parseFloat(time.substring(pos + 1));
+  }
+  return min * 60 + sec;
+}

+ 2 - 2
src/views/book/courseware/create/components/question/voice_matrix/CheckSubtitles.vue

@@ -8,7 +8,7 @@
               <span :class="[lrcIndex.row === i && lrcIndex.col === j ? 'triangle' : 'lrc-line']"></span>
             </div>
             <div class="lrc-time">
-              <span>[{{ audioTimeToMMSS(lrc_data.begin_time) }}]</span>
+              <span>[{{ audioTimeToMMSS(lrc_data.begin_time / 1000) }}]</span>
             </div>
             <!-- eslint-disable-next-line vue/no-v-html -->
             <span class="lrc-text" v-html="content"></span>
@@ -148,7 +148,7 @@ export default {
         // 获取当前播放时间
         const audio = this.$refs[this.audioId];
         if (audio) {
-          const currentTime = audio.currentTime;
+          const currentTime = audio.currentTime * 1000; // 转为毫秒
           let obj = {
             begin_time: currentTime,
             end_time: currentTime + 1,

+ 1 - 1
src/views/book/courseware/data/3dModel.js

@@ -10,7 +10,7 @@ export function get3DModelData() {
   return {
     type: '3DModel',
     title: '3D模型',
-    min_height: 120,
+    min_height: 220,
     property: get3DModelProperty(),
     model_list: [],
     model_id_list: [],

+ 14 - 16
src/views/book/courseware/preview/CoursewarePreview.vue

@@ -29,23 +29,19 @@
           <div :key="j" :class="['col', `col-${i}-${j}`]" :style="computedColStyle(col)">
             <!-- 网格 -->
             <template v-for="(grid, k) in col.grid_list">
-              <div
+              <component
+                :is="previewComponentList[grid.type]"
                 :key="k"
-                ref="component"
+                ref="preview"
+                :content="computedColContent(grid.id)"
+                :class="[grid.id]"
                 :data-id="grid.id"
-                @contextmenu.prevent="handleContextMenu($event, grid.id)"
-              >
-                <component
-                  :is="previewComponentList[grid.type]"
-                  ref="preview"
-                  :content="computedColContent(grid.id)"
-                  :class="[grid.id]"
-                  :style="{
-                    gridArea: grid.grid_area,
-                    height: grid.height,
-                  }"
-                />
-              </div>
+                :style="{
+                  gridArea: grid.grid_area,
+                  height: grid.height,
+                }"
+                @contextmenu.native.prevent="handleContextMenu($event, grid.id)"
+              />
 
               <div
                 v-if="showMenu && componentId === grid.id"
@@ -324,6 +320,8 @@ export default {
       };
     },
     handleContextMenu(event, id) {
+      console.log(this.canRemark);
+
       if (this.canRemark) {
         event.preventDefault(); // 阻止默认的上下文菜单显示
         this.menuPosition = {
@@ -365,7 +363,7 @@ export default {
      */
     async findChildComponentByKey(id) {
       await this.$nextTick();
-      return this.$refs.component.find((child) => child.dataset.id === id);
+      return this.$refs.preview.find((child) => child.dataset.id === id);
     },
     /**
      * 模拟回答

+ 18 - 12
src/views/book/courseware/preview/components/3d_model/3DModelPreview.vue

@@ -253,7 +253,7 @@ export default {
           // 材质文件加载成功
           materials.preload();
           loader.setMaterials(materials);
-          this.loadOBJModel(loader, url);
+          this.loadOBJModel(loader, url, true);
         },
         undefined,
         (error) => {
@@ -264,20 +264,26 @@ export default {
       );
     },
 
-    loadOBJModel(loader, url) {
+    /**
+     * 加载OBJ模型并应用默认材质
+     * @param {OBJLoader} loader - OBJ加载器
+     * @param {string} url - OBJ文件URL
+     * @param {boolean} hasMaterials - 是否有材质文件
+     */
+    loadOBJModel(loader, url, hasMaterials = false) {
       loader.load(
         url,
         (obj) => {
-          // 如果没有材质,为模型添加默认材质
+          let colorList = [0xff6666, 0x66ff66, 0x6666ff, 0xffff66, 0x66ffff, 0xff66ff]; // 可自定义颜色列表
+          let meshIndex = 0;
           obj.traverse((child) => {
-            if (child.isMesh) {
-              if (!child.material || !child.material.map) {
-                // 创建一个基本的彩色材质
-                child.material = new THREE.MeshPhongMaterial({
-                  color: 0x888888,
-                  shininess: 30,
-                });
-              }
+            if (child.isMesh && !hasMaterials) {
+              // 为每个 mesh 设置自定义颜色材质
+              child.material = new THREE.MeshPhongMaterial({
+                color: colorList[meshIndex % colorList.length], // 循环使用颜色
+                shininess: 30,
+              });
+              meshIndex += 1;
               child.castShadow = true;
               child.receiveShadow = true;
             }
@@ -412,7 +418,7 @@ export default {
 
   .three {
     position: relative;
-    min-height: 104px;
+    min-height: 204px;
     overflow: hidden;
 
     .loading {

+ 1 - 0
src/views/personal_workbench/edit_task/edit/index.vue

@@ -31,6 +31,7 @@
           <span class="link" @click="showSetBackground">背景图</span>
           <span class="link" @click="saveCoursewareContent('quit')">退出编辑</span>
           <span class="link" @click="saveCoursewareContent">保存</span>
+          <span class="link">全文设置</span>
           <span class="link" @click="goBackBookList">返回教材列表</span>
         </div>
       </div>

+ 63 - 16
src/views/personal_workbench/edit_task/index.vue

@@ -25,12 +25,25 @@
       <div class="textbook-chapter">
         <div class="chapter-header">
           <span class="cell">教材内容</span>
+          <span class="cell">制作人</span>
           <span class="cell">状态</span>
         </div>
         <div class="chapter-list">
-          <div v-for="chapter in courseware_list" :key="chapter.id" class="chapter-item">
-            <span class="path" @click="navigateToChapter(chapter.id)">{{ chapter.name_path }}</span>
-            <span class="status">{{ chapter.status_name }}</span>
+          <div
+            v-for="{ id, name, producer_list, status_name, deep, is_my_edit_task } in node_list"
+            :key="id"
+            :style="computedNameStyle(deep, isTrue(is_my_edit_task))"
+            class="chapter-item"
+          >
+            <span
+              class="path"
+              :style="computedPathStyle(isTrue(is_my_edit_task))"
+              @click="navigateToChapter(id, isTrue(is_my_edit_task))"
+            >
+              {{ name }}
+            </span>
+            <span>{{ producer_list.map((producer) => producer.name).join(';') }}</span>
+            <span class="status">{{ status_name }}</span>
           </div>
         </div>
       </div>
@@ -42,7 +55,8 @@
 import MenuPage from '../common/menu.vue';
 
 import { PageQueryMyProjectList_Producer } from '@/api/list';
-import { GetMyBookCoursewareTaskList_Edit } from '@/api/project';
+import { ChapterGetBookChapterStructExpandList } from '@/api/book';
+import { isTrue } from '@/utils/validate';
 
 export default {
   name: 'EditTask',
@@ -53,7 +67,8 @@ export default {
     return {
       project_list: [], // 项目列表
       cur_project_id: '', // 当前选中的项目ID
-      courseware_list: [], // 课程列表
+      node_list: [], // 章节结构列表
+      isTrue,
     };
   },
   created() {
@@ -73,21 +88,52 @@ export default {
     },
     selectProject(id) {
       this.cur_project_id = id;
-      this.getMyBookCoursewareTaskList();
+      this.getBookChapterStructExpandList();
     },
     /**
-     * 得到我的教材课件任务列表
+     * 得到教材章节结构展开列表
      */
-    getMyBookCoursewareTaskList() {
-      GetMyBookCoursewareTaskList_Edit({ project_id: this.cur_project_id }).then(({ courseware_list }) => {
-        this.courseware_list = courseware_list;
+    getBookChapterStructExpandList() {
+      ChapterGetBookChapterStructExpandList({
+        book_id: this.cur_project_id,
+        node_deep_mode: 0,
+        is_contain_producer: 'true',
+        is_contain_auditor: 'false',
+      }).then(({ node_list }) => {
+        this.node_list = node_list;
       });
     },
     /**
+     * 计算章节名称样式
+     * @param {number} deep - 节点深度
+     * @param {boolean} isMyEditTask - 是否是我的编辑任务
+     * @returns {Object} - 样式对象
+     */
+    computedNameStyle(deep, isMyEditTask) {
+      return {
+        'padding-left': `${(deep - 1) * 16}px`,
+        fontWeight: deep === 1 ? 'bold' : 'normal',
+        cursor: isMyEditTask ? 'pointer' : 'auto',
+      };
+    },
+    /**
+     * 计算章节路径样式
+     * @param {boolean} isMyEditTask - 是否是我的编辑任务
+     * @returns {Object} - 样式对象
+     */
+    computedPathStyle(isMyEditTask) {
+      return {
+        color: isMyEditTask ? '#165dff' : 'default',
+      };
+    },
+    /**
      * 跳转到章节预览页面
      * @param {string} id 课件ID
+     * @param {boolean} isMyEditTask - 是否是我的编辑任务
      */
-    navigateToChapter(id) {
+    navigateToChapter(id, isMyEditTask) {
+      if (!isMyEditTask) return;
+      if (!id) return;
       this.$router.push({
         path: `/personal_workbench/edit_task/preview/${id}`,
         query: { project_id: this.cur_project_id },
@@ -198,6 +244,12 @@ export default {
         border-right: $border;
       }
 
+      :nth-child(2) {
+        width: 140px;
+        text-align: center;
+        border-right: $border;
+      }
+
       :last-child {
         width: 140px;
         text-align: center;
@@ -234,11 +286,6 @@ export default {
           font-size: 14px;
           border-bottom: $border;
 
-          .path {
-            color: $main-color;
-            cursor: pointer;
-          }
-
           @include cell;
         }
       }

+ 1 - 1
vue.config.js

@@ -19,7 +19,7 @@ const eepApiUrlList = {
 
 const proxy = {};
 
-let name = '国际中文智慧教育引擎互动教材编辑器';
+let name = '智慧梧桐数字教材编辑器';
 
 if (NODE_ENV === 'development') {
   proxy[process.env.VUE_APP_EEP] = {