소스 검색

修改创建框架

dusenyao 1 년 전
부모
커밋
4784da47fe

+ 79 - 0
package-lock.json

@@ -29,6 +29,7 @@
         "@electron-forge/maker-squirrel": "^7.3.1",
         "@electron-forge/maker-zip": "^7.3.1",
         "@electron-forge/plugin-auto-unpack-natives": "^7.3.1",
+        "@electron/fuses": "^1.8.0",
         "@rushstack/eslint-patch": "^1.10.1",
         "@types/md5": "^2.3.5",
         "@vue/cli-plugin-babel": "~5.0.8",
@@ -2936,6 +2937,84 @@
         "node": ">= 6"
       }
     },
+    "node_modules/@electron/fuses": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@electron/fuses/-/fuses-1.8.0.tgz",
+      "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==",
+      "dev": true,
+      "dependencies": {
+        "chalk": "^4.1.1",
+        "fs-extra": "^9.0.1",
+        "minimist": "^1.2.5"
+      },
+      "bin": {
+        "electron-fuses": "dist/bin.js"
+      }
+    },
+    "node_modules/@electron/fuses/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@electron/fuses/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@electron/fuses/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/@electron/fuses/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
+    },
+    "node_modules/@electron/fuses/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@electron/fuses/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/@electron/get": {
       "version": "2.0.3",
       "resolved": "https://registry.npmmirror.com/@electron/get/-/get-2.0.3.tgz",

+ 8 - 7
package.json

@@ -30,30 +30,31 @@
   "devDependencies": {
     "@babel/core": "^7.24.3",
     "@babel/eslint-parser": "^7.24.1",
-    "@types/md5": "^2.3.5",
-    "@rushstack/eslint-patch": "^1.10.1",
-    "@vue/eslint-config-prettier": "^9.0.0",
-    "@vue/preload-webpack-plugin": "^2.0.0",
     "@electron-forge/cli": "^7.3.1",
     "@electron-forge/maker-deb": "^7.3.1",
     "@electron-forge/maker-rpm": "^7.3.1",
     "@electron-forge/maker-squirrel": "^7.3.1",
     "@electron-forge/maker-zip": "^7.3.1",
     "@electron-forge/plugin-auto-unpack-natives": "^7.3.1",
+    "@electron/fuses": "^1.8.0",
+    "@rushstack/eslint-patch": "^1.10.1",
+    "@types/md5": "^2.3.5",
     "@vue/cli-plugin-babel": "~5.0.8",
     "@vue/cli-plugin-eslint": "~5.0.8",
     "@vue/cli-service": "~5.0.8",
+    "@vue/eslint-config-prettier": "^9.0.0",
+    "@vue/preload-webpack-plugin": "^2.0.0",
     "compression-webpack-plugin": "^6.1.2",
     "electron": "^29.1.6",
     "eslint": "^8.57.0",
     "eslint-plugin-prettier": "^5.1.3",
     "eslint-plugin-vue": "^9.24.0",
-    "prettier": "^3.2.5",
     "nodemon": "^3.1.0",
-    "sass": "^1.72.0",
-    "sass-loader": "^14.1.1",
     "patch-package": "^8.0.0",
     "postcss-html": "^1.6.0",
+    "prettier": "^3.2.5",
+    "sass": "^1.72.0",
+    "sass-loader": "^14.1.1",
     "stylelint": "^15.11.0",
     "stylelint-config-recess-order": "^4.6.0",
     "stylelint-config-recommended-scss": "^14.0.0",

+ 0 - 1
src/api/book.js

@@ -114,7 +114,6 @@ export function GetCoursewareList_Chapter(data) {
  * 保存互动课件内容
  */
 export function SaveCoursewareContent(data) {
-  console.log(data);
   return http.post(`${process.env.VUE_APP_BookWebSI}?MethodName=book-courseware_manager-SaveCoursewareContent`, data);
 }
 

+ 1 - 0
src/views/book/chapter.vue

@@ -54,6 +54,7 @@ export default {
   provide() {
     return {
       selectNode: this.selectNode,
+      getCurChaterId: () => this.curChapterId,
     };
   },
   data() {

+ 0 - 1
src/views/book/courseware/create/components/base/common/UploadFile.vue

@@ -142,7 +142,6 @@ export default {
     // 文件校验
     afterSelectFile(file) {
       const fileName = file.name;
-      console.log(this.moduleData.single_size);
       let singleSizeTip = `文件[${fileName}]大小超过 ${conversionSize(this.moduleData.single_size)},被移除!`;
 
       if (file.size > this.moduleData.single_size * 1024 * 1024) {

+ 0 - 1
src/views/book/courseware/create/components/base/picture/Picture.vue

@@ -36,7 +36,6 @@ export default {
   computed: {},
   methods: {
     saveDate(file) {
-      console.log('图片', this.data);
       this.data.id = this.id;
       this.data.file_list.push(file);
       this.data.file_id_list.push(file.file_id);

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

@@ -61,7 +61,6 @@ const mixin = {
       this.componentMove({ ...data, id: this.id });
     },
     saveCoursewareComponentContent() {
-      console.log(JSON.stringify(this.data));
       SaveCoursewareComponentContent({
         courseware_id: this.courseware_id,
         component_id: this.id,

+ 218 - 27
src/views/book/courseware/create/components/createCanvas.vue

@@ -20,7 +20,13 @@
       <div :key="i" class="row" :style="getMultipleColStyle(i)">
         <!-- 列 -->
         <template v-for="(col, j) in row.col_list">
-          <span v-if="j === 0" :key="`start-${i}-${j}`" class="drag-vertical-line" :data-row="i" :data-col="j"></span>
+          <span
+            v-if="j === 0"
+            :key="`start-${i}-${j}`"
+            class="drag-vertical-line col-start"
+            :data-row="i"
+            :data-col="j"
+          ></span>
           <div
             :key="j"
             :class="['col', `col-${i}-${j}`]"
@@ -35,11 +41,22 @@
             <template v-for="(grid, k) in col.grid_list">
               <span
                 v-if="k === 0"
-                :key="`start-${k}`"
-                class="drag-line grid-line"
+                :key="`start-${i}-${j}-${k}`"
+                class="drag-line grid-line drag-row"
+                :style="{ gridArea: 'grid-top' }"
                 :data-row="i"
                 :data-col="j"
                 :data-grid="k"
+                data-type="row"
+              ></span>
+              <span
+                :key="`left-${k}`"
+                :style="{ gridArea: `left-${grid.grid_area}` }"
+                :data-row="i"
+                :data-col="j"
+                :data-grid="k"
+                data-type="col-left"
+                class="drag-vertical-line grid-line grid-line-left"
               ></span>
               <component
                 :is="componentList[grid.type]"
@@ -47,15 +64,33 @@
                 ref="component"
                 :key="k"
                 :class="[grid.id]"
-                :style="{ gridArea: grid.grid_area, height: grid.height }"
+                :style="{ gridArea: grid.grid_area, height: grid.height, marginTop: grid.row !== 1 ? '16px' : '0' }"
                 :delete-component="deleteComponent(i, j, k)"
                 :component-move="componentMove(i, j, k)"
                 @showSetting="showSetting"
               />
-              <span :key="`end-${k}`" class="drag-line grid-line" :data-row="i" :data-col="j" :data-grid="k + 1"></span>
+              <span
+                :key="`right-${k}`"
+                :style="{ gridArea: `right-${grid.grid_area}` }"
+                :data-row="i"
+                :data-col="j"
+                :data-grid="k + 1"
+                data-type="col-right"
+                class="drag-vertical-line grid-line grid-line-right"
+              ></span>
+              <span
+                v-if="k === col.grid_list.length - 1"
+                :key="`end-${i}-${j}-${k}`"
+                class="drag-line grid-line drag-row"
+                :style="{ gridArea: `grid-bottom` }"
+                :data-row="i"
+                :data-col="j"
+                :data-grid="k + 1"
+                data-type="row"
+              ></span>
             </template>
           </div>
-          <span :key="`end-${i}-${j}`" class="drag-vertical-line" :data-row="i" :data-col="j + 1"></span>
+          <span :key="`end-${i}-${j}`" 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-${i}`" class="drag-line" :data-row="i"></span>
@@ -94,6 +129,7 @@ export default {
       curRow: -2,
       curCol: -1,
       curGrid: -1,
+      gridInsertType: '', // 网格插入类型
       enterCanvas: false, // 是否进入画布
       // 拖拽状态
       drag: {
@@ -128,6 +164,7 @@ export default {
         });
         this.curCol = -1;
         this.curGrid = -1;
+        this.gridInsertType = '';
       },
     },
   },
@@ -252,7 +289,10 @@ export default {
      */
     deleteComponent(i, j, k) {
       return () => {
-        this.data.row_list[i].col_list[j].grid_list.splice(k, 1);
+        const gridList = this.data.row_list[i].col_list[j].grid_list;
+        let delRow = gridList[k].row; // 删除的 grid 的 row
+        let delW = gridList[k].width; // 删除的 grid 的 width
+        gridList.splice(k, 1);
 
         const colList = this.data.row_list[i].col_list[j];
         if (colList.grid_list.length === 0) {
@@ -269,14 +309,69 @@ export default {
           this.data.row_list.splice(i, 1);
         }
 
-        const gridList = this.data.row_list[i]?.col_list[j]?.grid_list;
         if (gridList?.length > 0) {
-          colList.grid_template_columns = `100%`;
-
-          const grid_template_areas = gridList.map(({ grid_area }) => grid_area).join(' ');
-          colList.grid_template_areas = `'.' '${grid_template_areas}' '.'`;
+          let maxCol = 0; // 最大列数
+          let rowList = new Map();
+          gridList.forEach(({ row }) => {
+            rowList.set(row, (rowList.get(row) || 0) + 1);
+          });
+          let curMaxRow = 0; // 当前数量最大 row 的值
+          rowList.forEach((value, key) => {
+            if (value > maxCol) {
+              maxCol = value;
+              curMaxRow = key;
+            }
+          });
 
-          colList.grid_template_rows = `0 ${gridList.map(({ height }) => height).join(' 16px ')} 0`;
+          let delNum = gridList.filter(({ row }) => row === delRow).length;
+          let diff = Number(delW.replace('%', '')) / delNum;
+          if (delNum === 0) {
+            // 删除 grid 后面的 row 都减 1
+            gridList.forEach((item) => {
+              if (item.row > delRow) {
+                item.row -= 1;
+              }
+            });
+          } else {
+            gridList.forEach((item) => {
+              if (item.row === delRow) {
+                item.width = `${Number(item.width.replace('%', '')) + diff}%`;
+              }
+            });
+          }
+          // 计算 grid_template_areas 和 grid_template_rows
+          let gridStr = '';
+          let gridArr = [];
+          gridList.forEach(({ grid_area, row }) => {
+            if (!gridArr[row - 1]) {
+              gridArr[row - 1] = [];
+            }
+            if (curMaxRow === row) {
+              gridArr[row - 1].push(`left-${grid_area} ${grid_area} right-${grid_area}`);
+            } else {
+              const str = ` ${grid_area} `.repeat(maxCol * 3 - 2);
+              gridArr[row - 1].push(`left-${grid_area} ${str} right-${grid_area}`);
+            }
+          });
+          gridArr.forEach((item) => {
+            gridStr += `'${item.join(' ')}' `;
+          });
+          colList.grid_template_areas = `'${'grid-top '.repeat(maxCol * 3)}' ${gridStr} '${'grid-bottom '.repeat(maxCol * 3)}'`;
+          colList.grid_template_rows = `0 ${gridList.map(({ height }) => height).join(' ')} 0`;
+
+          // 计算 grid_template_columns
+          let gridTemCols = '';
+          gridList.forEach((item) => {
+            // 如果第一行只有一个 grid 则不需要 - 8px
+            if (maxCol === 1 && item.row === 1) {
+              gridTemCols += `${item.width}`;
+              return;
+            }
+            if (item.row === 1) {
+              gridTemCols += `calc(${item.width} - 8px) 8px 8px `;
+            }
+          });
+          colList.grid_template_columns = `0 ${maxCol === 1 ? gridTemCols : gridTemCols.slice(0, gridTemCols.length - 8)} 0`;
         }
       };
     },
@@ -343,6 +438,7 @@ export default {
           this.curRow = Number(item.getAttribute('data-row'));
           this.curCol = Number(item.getAttribute('data-col') || -1);
           this.curGrid = Number(item.getAttribute('data-grid') || -1);
+          this.gridInsertType = item.getAttribute('data-type') || '';
 
           item.style.opacity = 1;
         } else {
@@ -408,16 +504,90 @@ export default {
       let row = this.data.row_list[this.curRow];
       let col = row.col_list[this.curCol];
       let grid = col.grid_list;
+      let type = this.gridInsertType;
+
+      if (type === 'row') {
+        let rowNum = this.curGrid === 0 ? 1 : grid[this.curGrid - 1].row + 1;
+        grid.splice(this.curGrid, 0, {
+          id,
+          grid_area: letter,
+          width: '100%',
+          height: 'auto',
+          row: rowNum,
+          type: this.curType,
+        });
+        // 在新加入的 grid 后面的 row 都加 1
+        grid.forEach((item, i) => {
+          if (i > this.curGrid) {
+            item.row += 1;
+          }
+        });
+      }
 
-      grid.splice(this.curGrid, 0, {
-        id,
-        grid_area: letter,
-        width: '100%',
-        height: 'auto',
-        type: this.curType,
+      if (['col-left', 'col-right'].includes(type)) {
+        let rowNum = grid[type === 'col-left' ? this.curGrid : this.curGrid - 1].row;
+        grid.splice(this.curGrid, 0, {
+          id,
+          grid_area: letter,
+          width: '100%',
+          height: 'auto',
+          row: rowNum,
+          type: this.curType,
+        });
+
+        let allRowNum = grid.filter(({ row }) => row === rowNum).length;
+        let w = 0;
+        grid.forEach((item, i) => {
+          if (item.row === rowNum && i !== this.curGrid) {
+            let width = Number(item.width.replace('%', ''));
+            let diff = width / allRowNum;
+            item.width = `${width - diff}%`;
+            w += diff;
+          }
+        });
+        grid[this.curGrid].width = `${w}%`;
+      }
+
+      let maxCol = 0; // 最大列数
+      let rowList = new Map();
+      grid.forEach(({ row }) => {
+        rowList.set(row, (rowList.get(row) || 0) + 1);
+      });
+      let curMaxRow = 0; // 当前数量最大 row 的值
+      rowList.forEach((value, key) => {
+        if (value > maxCol) {
+          maxCol = value;
+          curMaxRow = key;
+        }
+      });
+      // 计算 grid_template_areas 和 grid_template_rows
+      let gridStr = '';
+      let gridArr = [];
+      grid.forEach(({ grid_area, row }) => {
+        if (!gridArr[row - 1]) {
+          gridArr[row - 1] = [];
+        }
+        if (curMaxRow === row) {
+          gridArr[row - 1].push(`left-${grid_area} ${grid_area} right-${grid_area}`);
+        } else {
+          const str = ` ${grid_area} `.repeat(maxCol * 3 - 2);
+          gridArr[row - 1].push(`left-${grid_area} ${str} right-${grid_area}`);
+        }
+      });
+      gridArr.forEach((item) => {
+        gridStr += `'${item.join(' ')}' `;
+      });
+      col.grid_template_areas = `'${'grid-top '.repeat(maxCol * 3)}' ${gridStr} '${'grid-bottom '.repeat(maxCol * 3)}'`;
+      col.grid_template_rows = `0 ${grid.map(({ height }) => height).join(' ')} 0`;
+
+      // 计算 grid_template_columns
+      let gridTemCols = '';
+      grid.forEach((item) => {
+        if (item.row === 1) {
+          gridTemCols += `calc(${item.width} - 8px) 8px 8px `;
+        }
       });
-      col.grid_template_areas = `'.' ${grid.map(({ grid_area }) => `'${grid_area}'`).join(" '.' ")} '.'`;
-      col.grid_template_rows = `0 ${grid.map(({ height }) => height).join(' 16px ')} 0`;
+      col.grid_template_columns = `0 ${gridTemCols.slice(0, gridTemCols.length - 8)} 0`;
     },
     /**
      * 计算列插入的对象
@@ -441,13 +611,14 @@ export default {
       col.splice(this.curCol, 0, {
         width: '100%',
         height: 'auto',
-        grid_template_areas: `'.' '${letter}' '.'`,
-        grid_template_columns: '100%',
+        grid_template_areas: `'grid-top grid-top grid-top' 'left-${letter} ${letter} right-${letter}' 'grid-bottom grid-bottom grid-bottom'`,
+        grid_template_columns: '0 100% 0',
         grid_template_rows: '0 auto 0',
         grid_list: [
           {
             id,
             grid_area: letter,
+            row: 1,
             width: '100%',
             height: 'auto',
             type: this.curType,
@@ -468,8 +639,8 @@ export default {
           {
             width: '100%',
             height: 'auto',
-            grid_template_areas: `'.' '${letter}' '.'`,
-            grid_template_columns: '100%',
+            grid_template_areas: `'grid-top grid-top grid-top' 'left-${letter} ${letter} right-${letter}' 'grid-bottom grid-bottom grid-bottom'`,
+            grid_template_columns: '0 100% 0',
             grid_template_rows: '0 auto 0',
             grid_list: [
               {
@@ -477,6 +648,7 @@ export default {
                 grid_area: letter,
                 width: '100%',
                 height: 'auto',
+                row: 1,
                 type: this.curType,
               },
             ],
@@ -526,10 +698,18 @@ export default {
     display: grid;
     row-gap: 16px;
 
-    > .drag-vertical-line:not(:first-child, :last-child) {
+    > .drag-vertical-line:not(:first-child, :last-child, .grid-line) {
       left: 6px;
     }
 
+    .drag-vertical-line.col-start {
+      left: -12px;
+    }
+
+    .drag-vertical-line.col-end {
+      right: -8px;
+    }
+
     .col {
       display: grid;
 
@@ -537,7 +717,7 @@ export default {
         left: -8px;
       }
 
-      .drag-vertical-line:not(:first-child, :last-child) {
+      .drag-vertical-line:not(:first-child, :last-child, .grid-line) {
         left: 6px;
       }
 
@@ -548,6 +728,7 @@ export default {
   }
 
   .drag-line {
+    z-index: 9;
     width: calc(100% - 16px);
     height: 4px;
     margin: 0 8px;
@@ -555,6 +736,10 @@ export default {
     border-radius: 4px;
     opacity: 0;
 
+    &.drag-row {
+      background-color: $right-color;
+    }
+
     &.grid-line:not(:first-child, :last-child) {
       position: relative;
       top: 6px;
@@ -563,11 +748,16 @@ export default {
 
   .drag-vertical-line {
     position: relative;
+    z-index: 9;
     width: 4px;
     height: 100%;
     background-color: #379fff;
     border-radius: 4px;
     opacity: 0;
+
+    &.grid-line {
+      background-color: #f43;
+    }
   }
 }
 </style>
@@ -581,6 +771,7 @@ export default {
   background-color: #eaf5ff;
   border: 1px solid #b5dbff;
   border-radius: 4px;
+  opacity: 0.5;
   transform: translate(-40%, -40%);
 }
 </style>

+ 41 - 19
src/views/book/courseware/preview/index.vue

@@ -9,9 +9,13 @@
       <div class="exit">
         <el-button icon="el-icon-close" @click="goBack">退出预览</el-button>
       </div>
-      <main class="content">
+      <div v-for="(data, i) in coursewareDataList" :key="`data-${i}`" class="content">
         <span class="content-title">
           <SvgIcon icon-class="menu-2" size="24" />
+          <template v-for="(item, m) in menuList">
+            <span :key="m">{{ item }}</span>
+            <span v-if="i < menuList.length - 1" :key="`separator-${m}`" class="separator">/</span>
+          </template>
         </span>
         <div
           class="courserware"
@@ -27,7 +31,7 @@
             },
           ]"
         ></div>
-      </main>
+      </div>
     </div>
   </div>
 </template>
@@ -54,22 +58,17 @@ export default {
       book_id: this.$route.params.book_id,
       chapter_id,
       curChapterId: chapter_id,
-      data: {
-        background_image_url: '',
-        background_position: {
-          width: 100,
-          height: 100,
-          top: 0,
-          left: 0,
-        },
-        // 组件列表
-        row_list: [],
-      },
       nodes: [],
       curPosition: [],
       courseware_list: [],
+      coursewareDataList: [],
     };
   },
+  computed: {
+    menuList() {
+      return this.curPosition.map((item, index) => this.getNodeName(index));
+    },
+  },
   created() {
     GetBookChapterStruct({ book_id: this.book_id, node_deep_mode: 0 }).then(({ nodes }) => {
       this.nodes = nodes ?? [];
@@ -81,6 +80,13 @@ export default {
     goBack() {
       this.$router.push(`/chapter?chapter_id=${this.chapter_id}&book_id=${this.book_id}`);
     },
+    getNodeName(index) {
+      let node = this.nodes;
+      for (let i = 0; i <= index; i++) {
+        node = i === 0 ? node[this.curPosition[i]] : node.nodes[this.curPosition[i]];
+      }
+      return node?.name;
+    },
     /**
      * 根据节点id查找节点在nodes中的位置
      * @param {array} nodes 节点数组
@@ -114,11 +120,17 @@ export default {
     getCoursewareList_Chapter(chapter_id) {
       GetCoursewareList_Chapter({ chapter_id }).then(({ courseware_list }) => {
         this.courseware_list = courseware_list ?? [];
+        this.getCoursewareContent();
       });
     },
-    getCoursewareContent() {
-      GetCoursewareContent({ id: this.courseware_id }).then(({ content }) => {
-        if (content) this.data = JSON.parse(content);
+    async getCoursewareContent() {
+      Promise.all(
+        this.courseware_list.map(async ({ courseware_id }) => {
+          const { content } = await GetCoursewareContent({ id: courseware_id });
+          return content ? JSON.parse(content) : {};
+        }),
+      ).then((coursewareDataList) => {
+        this.coursewareDataList = coursewareDataList;
       });
     },
   },
@@ -168,7 +180,6 @@ export default {
     .exit {
       display: flex;
       justify-content: flex-end;
-      margin-bottom: 24px;
 
       .el-button {
         height: 40px;
@@ -180,12 +191,15 @@ export default {
     }
 
     .content {
+      margin-top: 24px;
       background-color: #fff;
       border: 3px solid #f44444;
       border-radius: 16px;
 
       &-title {
-        display: inline-block;
+        display: inline-flex;
+        column-gap: 24px;
+        align-items: center;
         min-width: 280px;
         height: 64px;
         padding: 18px 24px;
@@ -197,7 +211,15 @@ export default {
       }
 
       .courserware {
-        padding: 24px;
+        display: flex;
+        flex-direction: column;
+        row-gap: 6px;
+        width: 100%;
+        min-height: 500px;
+        background-color: #fff;
+        background-repeat: no-repeat;
+        border-bottom-right-radius: 12px;
+        border-bottom-left-radius: 12px;
       }
     }
   }