Procházet zdrojové kódy

完善目录排序

yangg před 4 měsíci
rodič
revize
92080800f7

+ 53 - 46
ui/src/views/system/document/com/editor.vue

@@ -323,68 +323,76 @@ export default {
     updateDirectoryNumbers() {
       // 按层级分组
       const levelGroups = {};
+      let globalCounter = 1; // 用于一级目录的编号
 
       // 第一遍遍历:收集并按层级分组
       this.extractedAttrs.forEach((attr, index) => {
         if (attr.type === "Directory") {
-          if (!levelGroups[attr.level]) {
-            levelGroups[attr.level] = [];
+          const level = parseInt(attr.level) || 1;
+          if (!levelGroups[level]) {
+            levelGroups[level] = [];
           }
           attr.originalIndex = index;
           attr.originalContent = attr.content.replace(/^[\d.]+\s*/, '').trim();
-          levelGroups[attr.level] = [...levelGroups[attr.level], attr];
+          levelGroups[level] = [...levelGroups[level], attr];
         }
       });
 
-      // 处理所有层级的目录
+      // 创建一个Map来存储每个层级的计数器
+      const levelCounters = new Map();
+
+      // 处理每个层级的目录
       Object.keys(levelGroups)
         .sort((a, b) => Number(a) - Number(b))
         .forEach(level => {
+          level = parseInt(level);
           const attrs = levelGroups[level];
           
-          if (level === '1') {
-            // 处理一级目录
-            attrs.forEach((attr, index) => {
-              attr.number = (index + 1).toString();
-              attr.content = `${attr.number} ${attr.originalContent}`;
-            });
-          } else {
-            // 处理其他层级目录
-            attrs.forEach((attr) => {
-              // 找到该目录前面最近的上级目录
-              const parentLevel = (parseInt(level) - 1).toString();
-              let previousParent = null;
+          // 为每个层级创建一个新的计数器
+          if (!levelCounters.has(level)) {
+            levelCounters.set(level, new Map());
+          }
+
+          // 处理当前层级的所有目录
+          attrs.forEach((attr) => {
+            if (level === 1) {
+              // 一级目录直接使用全局计数器
+              attr.number = globalCounter.toString();
+              globalCounter++;
+            } else {
+              // 获取父级层级
+              const parentLevel = level - 1;
+              let parentNumber = null;
               
-              for (const parentAttr of levelGroups[parentLevel] || []) {
-                if (parentAttr.originalIndex < attr.originalIndex) {
-                  previousParent = parentAttr;
-                } else {
+              // 在父级层级中查找最近的父目录
+              for (let i = attr.originalIndex - 1; i >= 0; i--) {
+                const potentialParent = this.extractedAttrs[i];
+                if (potentialParent && 
+                    potentialParent.type === "Directory" && 
+                    parseInt(potentialParent.level) === parentLevel) {
+                  parentNumber = potentialParent.number;
                   break;
                 }
               }
 
-              if (previousParent) {
-                // 找到同属于这个上级目录下的所有同级目录
-                const siblings = attrs.filter(a => {
-                  // 找到下一个同级别的父级目录
-                  const nextParent = levelGroups[parentLevel].find(p => 
-                    p.originalIndex > previousParent.originalIndex
-                  );
-                  const nextParentIndex = nextParent ? nextParent.originalIndex : Infinity;
-                  
-                  return a.originalIndex > previousParent.originalIndex 
-                         && a.originalIndex < nextParentIndex;
-                });
-
-                // 计算在当前层级中的位置
-                const siblingIndex = siblings.indexOf(attr) + 1;
-                
-                // 构建编号
-                attr.number = `${previousParent.number}.${siblingIndex}`;
-                attr.content = `${attr.number} ${attr.originalContent}`;
+              if (parentNumber) {
+                // 获取或初始化该父级下的计数器
+                const parentCounters = levelCounters.get(level);
+                if (!parentCounters.has(parentNumber)) {
+                  parentCounters.set(parentNumber, 1);
+                } else {
+                  parentCounters.set(parentNumber, parentCounters.get(parentNumber) + 1);
+                }
+
+                // 设置当前目录的编号
+                const childNumber = parentCounters.get(parentNumber);
+                attr.number = `${parentNumber}.${childNumber}`;
               }
-            });
-          }
+            }
+
+            // 更新目录内容
+            attr.content = `${attr.number} ${attr.originalContent}`;
+          });
         });
 
       // 更新原始数据中的目录内容
@@ -392,11 +400,10 @@ export default {
         if (com.attrs) {
           com.attrs.forEach(attr => {
             if (attr.type === "Directory") {
-              const updatedAttr = this.extractedAttrs.find(a => {
-                const cleanAttrContent = attr.content.replace(/^[\d.]+\s*/, '').trim();
-                const cleanUpdatedContent = a.originalContent;
-                return a.level === attr.level && cleanAttrContent === cleanUpdatedContent;
-              });
+              // 根据原始索引找到对应的更新后的目录项
+              const updatedAttr = this.extractedAttrs.find(a => 
+                a.originalIndex === attr.originalIndex
+              );
 
               if (updatedAttr) {
                 attr.number = updatedAttr.number;

+ 1 - 3
ui/src/views/system/document/create.vue

@@ -3822,7 +3822,7 @@ export default {
 
         let catalogData = [];
         let levelMap = new Map(); // 用于跟踪每个层级的最后一个节点
-
+        
         coms.forEach((item, moduleIndex) => {
           if (!item || !item.attrs) return;
 
@@ -3991,7 +3991,6 @@ export default {
     // 生成目录编号
     generateDirectoryNumber(moduleIndex, level) {
       let number = "";
-
       if (level === 1) {
         // 一级标题使用模块序号
         number = (moduleIndex + 1).toString();
@@ -4213,7 +4212,6 @@ export default {
 
     handleDragEnd(draggingNode, dropNode, dropType, ev) {
       if (!dropNode) return;
-
       // 获取拖拽节点和目标节点的模块索引
       const dragModuleIndex = draggingNode.data.moduleIndex;
       const dropModuleIndex = dropNode.data.moduleIndex;