| 
					
				 | 
			
			
				@@ -19,7 +19,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       <span class="drag-line" data-row="-1"></span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       <!-- 行 --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       <template v-for="(row, i) in data.row_list"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <div :key="i" class="row" :style="computedRowStyle(i)"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <div :key="row.row_id || `row-${i}`" class="row" :style="computedRowStyle(i)"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           <el-checkbox 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             v-if="row?.row_id" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             v-model="rowCheckList[row.row_id]" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -30,17 +30,17 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           <template v-for="(col, j) in row.col_list"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             <span 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               v-if="j === 0" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              :key="`start-${i}-${j}`" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              :key="`start-${row.row_id || 'r' + i}-${col.col_id || 'c' + j}`" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               class="drag-vertical-line col-start" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               :data-row="i" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               :data-col="j" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ></span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <div :key="j" :class="['col', `col-${i}-${j}`]" :style="computedColStyle(col)"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div :key="col.col_id || `col-${i}-${j}`" :class="['col', `col-${i}-${j}`]" :style="computedColStyle(col)"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               <!-- 网格 --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               <template v-for="(grid, k) in col.grid_list"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 <span 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   v-if="k === 0" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  :key="`start-${i}-${j}-${grid.id}`" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  :key="`start-${grid.id}`" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   class="drag-line grid-line drag-row" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   :style="{ gridArea: 'grid-top' }" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   :data-row="i" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -50,7 +50,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ></span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 <span 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   v-if="grid.row > 1 && grid.row !== col.grid_list[k - 1].row" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  :key="`middle-${i}-${j}-${grid.id}`" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  :key="`middle-${grid.id}`" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   :style="{ gridArea: `middle-${grid.grid_area}` }" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   :data-row="i" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   :data-col="j" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -59,7 +59,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   class="drag-line grid-line" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ></span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 <span 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  :key="`left-${i}-${j}-${grid.id}`" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  :key="`left-${grid.id}`" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   :style="{ gridArea: `left-${grid.grid_area}` }" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   :data-row="i" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   :data-col="j" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -85,7 +85,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   @changeData="changeData" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 <span 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  :key="`right-${i}-${j}-${grid.id}`" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  :key="`right-${grid.id}`" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   :style="{ gridArea: `right-${grid.grid_area}` }" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   :data-row="i" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   :data-col="j" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -95,7 +95,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ></span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 <span 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   v-if="k === col.grid_list.length - 1" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  :key="`end-${i}-${j}-${grid.id}`" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  :key="`end-${grid.id}`" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   class="drag-line grid-line drag-row" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   :style="{ gridArea: `grid-bottom` }" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   :data-row="i" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -105,10 +105,20 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ></span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <span :key="`end-${i}-${j}`" class="drag-vertical-line col-end" :data-row="i" :data-col="j + 1"></span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <span 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              :key="`end-${row.row_id || 'r' + i}-${col.col_id || 'c' + 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> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <span 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          v-if="i < data.row_list.length - 1" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          :key="`row-${row.row_id || i}`" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          class="drag-line" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          :data-row="i" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ></span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       <span class="drag-line" :data-row="data.row_list.length - 1"></span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     </template> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -326,6 +336,8 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     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(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (content_group_row_list) this.content_group_row_list = JSON.parse(content_group_row_list); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1083,6 +1095,7 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     calculateColObject() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const id = `ID-${getRandomNumber(12, true)}`; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const letter = `L${getRandomNumber(6, true)}`; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const col_id = `C${getRandomNumber(8, true)}`; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       let row = this.data.row_list[this.curRow]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       let col = row.col_list; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1097,6 +1110,7 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       row.width_list.splice(this.curCol, 0, `${w}fr`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       col.splice(this.curCol, 0, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        col_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         width: '100fr', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         height: 'auto', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         grid_list: [ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1119,12 +1133,14 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const id = `ID-${getRandomNumber(12, true)}`; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const letter = `L${getRandomNumber(6, true)}`; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const row_id = `R${getRandomNumber(6, true)}`; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const col_id = `C${getRandomNumber(8, true)}`; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       this.data.row_list.splice(this.curRow + 1, 0, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         width_list: ['100fr'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         row_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         col_list: [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            col_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             width: '100fr', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             height: 'auto', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             grid_list: [ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1262,6 +1278,21 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       order += gridIndex + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return order; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 归一化 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) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          if (!col.col_id) col.col_id = `C${getRandomNumber(8, true)}`; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return col; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return row; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 </script> 
			 |