From 72a8ea8b3df5f8ff2ccd49bd951ded5deb2e1593 Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期五, 28 八月 2026 11:39:24 +0800
Subject: [PATCH] fix: 数据导入目录浏览/批量导入数量上限,防浏览器渲染与请求爆炸

---
 traffic-audit-web/src/views/DataImport.vue                                                    |   11 +++++++++++
 traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java |   11 +++++++++--
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java b/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
index deafe7a..58b5305 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
@@ -2369,10 +2369,13 @@
         result.put("parent", cur.getParent() == null ? "" : cur.getParent());
         List<Map<String, Object>> dirs = new ArrayList<>();
         File[] subs = cur.listFiles(File::isDirectory);
+        int dirTotal = 0;
         if (subs != null) {
             Arrays.sort(subs, Comparator.comparing(File::getName));
             for (File d : subs) {
                 if (d.isHidden()) continue;
+                dirTotal++;
+                if (dirs.size() >= 300) continue;
                 Map<String, Object> m = new LinkedHashMap<>();
                 m.put("name", d.getName());
                 m.put("path", d.getAbsolutePath());
@@ -2380,17 +2383,21 @@
             }
         }
         result.put("dirs", dirs);
+        result.put("dirsTruncated", dirTotal > dirs.size());
         List<String> excelFiles = new ArrayList<>();
         File[] files = cur.listFiles((d, n) -> {
             String lower = n.toLowerCase();
             return lower.endsWith(".xlsx") || lower.endsWith(".xls");
         });
+        int excelTotal = files == null ? 0 : files.length;
         if (files != null) {
             Arrays.sort(files, Comparator.comparing(File::getName));
-            for (File f : files) excelFiles.add(f.getName());
+            int take = Math.min(files.length, 300);
+            for (int i = 0; i < take; i++) excelFiles.add(files[i].getName());
         }
-        result.put("excelCount", excelFiles.size());
+        result.put("excelCount", excelTotal);
         result.put("files", excelFiles);
+        result.put("filesTruncated", excelTotal > excelFiles.size());
         return result;
     }
 
diff --git a/traffic-audit-web/src/views/DataImport.vue b/traffic-audit-web/src/views/DataImport.vue
index f98dd70..457e52b 100644
--- a/traffic-audit-web/src/views/DataImport.vue
+++ b/traffic-audit-web/src/views/DataImport.vue
@@ -158,6 +158,8 @@
               <div class="tip">鍗曞嚮鏂囦欢澶硅繘鍏ュ瓙鏂囦欢澶癸紱<b>鍙屽嚮鐩爣鏂囦欢澶圭珛鍗冲鍏�</b>鍏朵腑鍏ㄩ儴 Excel锛涗篃鍙繘鍏ュ悗鐐逛笅鏂规寜閽�傚鍏ユ椂浼氭寜鏂囦欢鍚嶈嚜鍔ㄨ瘑鍒湀浠姐��</div>
               <div v-if="dirExcelCount === 0" class="tip">褰撳墠鏂囦欢澶瑰唴娌℃湁 Excel 鏂囦欢锛�.xlsx/.xls锛�</div>
               <div v-else class="tip">褰撳墠鏂囦欢澶瑰唴 Excel锛歿{ dirExcelCount }} 涓� 鈥斺�� {{ dirFiles.slice(0, 6).join('銆�') }}{{ dirFiles.length > 6 ? ' 绛�' : '' }}锛堜粎瀵煎叆鐩存帴浣嶄簬璇ユ枃浠跺す鐨勬枃浠讹級</div>
+              <div v-if="dirDirsTruncated" class="tip">瀛愭枃浠跺す杩囧锛屼粎鏄剧ず鍓� 300 涓�</div>
+              <div v-if="dirFilesTruncated" class="tip">Excel 鏂囦欢杩囧锛堝叡 {{ dirExcelCount }} 涓級锛屼粎鏄剧ず鍓� 300 涓�</div>
             </div>
             <span slot="footer">
               <el-button size="small" @click="dirDialog = false">鍙栨秷</el-button>
@@ -243,7 +245,9 @@
       dirCurrent: '',
       dirParent: '',
       dirDirs: [],
+      dirDirsTruncated: false,
       dirExcelCount: 0,
+      dirFilesTruncated: false,
       dirFiles: [],
       dirLoading: false,
       dirImporting: false,
@@ -428,8 +432,10 @@
           this.dirCurrent = d.current || ''
           this.dirParent = d.parent || ''
           this.dirDirs = d.dirs || []
+          this.dirDirsTruncated = !!d.dirsTruncated
           this.dirExcelCount = d.excelCount || 0
           this.dirFiles = d.files || []
+          this.dirFilesTruncated = !!d.filesTruncated
         })
         .catch(e => { this.$message.error((e.response && e.response.data && e.response.data.message) || '鐩綍鍔犺浇澶辫触') })
         .finally(() => { this.dirLoading = false })
@@ -458,6 +464,11 @@
           const d = (res && res.data) || {}
           const files = (d.files || []).filter(n => /\.(xlsx|xls)$/i.test(n))
           if (!files.length) { this.$message.warning('璇ョ洰褰曟病鏈� Excel 鏂囦欢锛�.xlsx/.xls锛夛細' + dir); this.dirImporting = false; return }
+          if (files.length > 60) {
+            this.dirImporting = false
+            this.$message.warning('鐩綍鍐� Excel 鏂囦欢杩囧锛�' + files.length + ' 涓級锛屼负閬垮厤娴忚鍣ㄥ崱椤胯鍒嗘壒瀵煎叆锛堟瘡鎵逛笉瓒呰繃 60 涓級')
+            return
+          }
           localStorage.setItem('dirLast_' + type, dir)
           this.dirPath = dir
           this.dirImportFiles = files.map(n => ({ name: n, status: 'pending', period: '', msg: '' }))

--
Gitblit v1.9.1