From e7684ad9c4323d0736d2089a23ed527923df8f2f Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Fri, 23 Jan 2026 22:50:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(DataBaseInfoView):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=BE=85=E5=A4=84=E7=90=86=E6=96=87=E4=BB=B6=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E6=9D=A1=E5=92=8C=E6=89=B9=E9=87=8F=E8=A7=A3=E6=9E=90/?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/views/DataBaseInfoView.vue | 116 ++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 1 deletion(-) diff --git a/web/src/views/DataBaseInfoView.vue b/web/src/views/DataBaseInfoView.vue index 582d2e94..21fac9da 100644 --- a/web/src/views/DataBaseInfoView.vue +++ b/web/src/views/DataBaseInfoView.vue @@ -20,6 +20,17 @@
+ +
+ + +
{ return kbType === 'milvus' }) +// 计算待解析文件数量(status: 'uploaded') +const pendingParseCount = computed(() => { + const files = store.database.files || {} + return Object.values(files).filter(f => !f.is_folder && f.status === 'uploaded').length +}) + +// 计算待入库文件数量(status: 'parsed' 或 'error_indexing') +const pendingIndexCount = computed(() => { + const files = store.database.files || {} + const isLightRAG = database.value?.kb_type?.toLowerCase() === 'lightrag' + return Object.values(files).filter(f => { + if (f.is_folder) return false + if (isLightRAG) { + return f.status === 'parsed' + } + return f.status === 'parsed' || f.status === 'error_indexing' + }).length +}) + +// 确认批量解析 +const confirmBatchParse = () => { + const fileIds = Object.values(store.database.files || {}) + .filter(f => f.status === 'uploaded') + .map(f => f.file_id) + + if (fileIds.length === 0) { + return + } + + Modal.confirm({ + title: '批量解析', + content: `确定要解析 ${fileIds.length} 个文件吗?`, + onOk: () => store.parseFiles(fileIds) + }) +} + +// 确认批量入库 +const confirmBatchIndex = () => { + const isLightRAG = database.value?.kb_type?.toLowerCase() === 'lightrag' + const fileIds = Object.values(store.database.files || {}) + .filter(f => { + if (f.is_folder) return false + if (isLightRAG) return f.status === 'parsed' + return f.status === 'parsed' || f.status === 'error_indexing' + }) + .map(f => f.file_id) + + if (fileIds.length === 0) { + return + } + + if (isLightRAG) { + Modal.confirm({ + title: '批量入库', + content: `确定要入库 ${fileIds.length} 个文件吗?`, + onOk: () => store.indexFiles(fileIds) + }) + return + } + + // 非 LightRAG:触发 FileTable 的入库流程 + // 暂时简单处理,直接调用 store.indexFiles + Modal.confirm({ + title: '批量入库', + content: `确定要入库 ${fileIds.length} 个文件吗?`, + onOk: () => store.indexFiles(fileIds) + }) +} + // Tab 切换逻辑 - 智能默认 const activeTab = ref('query') @@ -487,9 +568,42 @@ const handleMouseUp = () => { flex-shrink: 0; flex-grow: 1; padding-right: 0; + flex-direction: column; // max-height: calc(100% - 16px); } + .info-panel { + background: var(--gray-10); + border-radius: 12px; + border: 1px solid var(--gray-200); + display: flex; + gap: 12px; + padding: 8px 12px; + margin-bottom: 8px; + flex-shrink: 0; + + .banner-item { + display: flex; + align-items: center; + gap: 6px; + padding: 4px 8px; + background: var(--color-warning-50); + border-radius: 4px; + font-size: 13px; + color: var(--color-warning-700); + cursor: pointer; + transition: all 0.2s; + + &:hover { + background: var(--color-warning-100); + } + + svg { + color: var(--color-warning-700); + } + } + } + .right-panel { flex-grow: 1; overflow: hidden;