From c0879765fdc70aa5e56b0883d9bd10a2723322ae Mon Sep 17 00:00:00 2001 From: Jeason <1710884619@qq.com> Date: Mon, 20 Apr 2026 13:50:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E7=B4=AF=E7=A7=AF=E6=A8=A1=E5=BC=8F=EF=BC=8C=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=88=97=E8=A1=A8=E6=94=AF=E6=8C=81=E5=88=A0?= =?UTF-8?q?=E9=99=A4=EF=BC=8C=E5=90=8E=E7=AB=AF=E6=8E=A5=E6=94=B6=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E6=8C=87=E5=AE=9A=E7=9A=84=E6=96=87=E4=BB=B6=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/main.py | 12 +++++++++--- web/static/clean_style.css | 12 ++++++++++++ web/static/script.js | 37 ++++++++++++++++++++++++++++++------- 3 files changed, 51 insertions(+), 10 deletions(-) diff --git a/web/main.py b/web/main.py index 1e06eb3..5ecd6e0 100644 --- a/web/main.py +++ b/web/main.py @@ -356,6 +356,7 @@ def run_analysis_task(session_id: str, files: list, user_requirement: str, is_fo class StartRequest(BaseModel): requirement: str template: Optional[str] = None + files: Optional[List[str]] = None class ChatRequest(BaseModel): session_id: str @@ -383,10 +384,15 @@ async def upload_files(files: list[UploadFile] = File(...)): async def start_analysis(request: StartRequest, background_tasks: BackgroundTasks): session_id = session_manager.create_session() - # Use only the most recently uploaded files, not everything in uploads/ - files = getattr(app.state, 'last_uploaded_files', None) + # Priority: request.files (from frontend) > last_uploaded > scan uploads/ + files = None + if request.files: + files = [f for f in request.files if os.path.exists(f)] + if not files: + files = getattr(app.state, 'last_uploaded_files', None) + if files: + files = [f for f in files if os.path.exists(f)] if not files: - # Fallback: scan uploads directory files = glob.glob("uploads/*.csv") + glob.glob("uploads/*.xlsx") if not files: raise HTTPException(status_code=400, detail="No data files found. Please upload files first.") diff --git a/web/static/clean_style.css b/web/static/clean_style.css index 6506574..58d5857 100644 --- a/web/static/clean_style.css +++ b/web/static/clean_style.css @@ -409,6 +409,18 @@ body { border-radius: 0.25rem; } +.file-remove { + margin-left: auto; + cursor: pointer; + color: #9CA3AF; + font-size: 1.1rem; + line-height: 1; + padding: 0 0.25rem; +} +.file-remove:hover { + color: #EF4444; +} + /* Tabs */ .tabs { display: flex; diff --git a/web/static/script.js b/web/static/script.js index dde336a..0566962 100644 --- a/web/static/script.js +++ b/web/static/script.js @@ -64,29 +64,49 @@ if (fileInput) { fileInput.addEventListener('click', (e) => e.stopPropagation()); } +// Track all uploaded file paths for this session +let uploadedFilePaths = []; + async function handleFiles(files) { if (files.length === 0) return; - fileList.innerHTML = ''; const formData = new FormData(); - for (const file of files) { formData.append('files', file); - const fileItem = document.createElement('div'); - fileItem.className = 'file-item'; - fileItem.innerHTML = ` ${file.name}`; - fileList.appendChild(fileItem); } try { const res = await fetch('/api/upload', { method: 'POST', body: formData }); - if (!res.ok) alert('Upload failed'); + if (!res.ok) { alert('Upload failed'); return; } + const data = await res.json(); + // Accumulate uploaded paths + if (data.paths) { + uploadedFilePaths = uploadedFilePaths.concat(data.paths); + } + renderFileList(); } catch (e) { console.error(e); alert('Upload failed'); } } +function renderFileList() { + fileList.innerHTML = ''; + for (let i = 0; i < uploadedFilePaths.length; i++) { + const fname = uploadedFilePaths[i].split('/').pop().split('\\').pop(); + const fileItem = document.createElement('div'); + fileItem.className = 'file-item'; + fileItem.innerHTML = ` ${fname} + ×`; + fileList.appendChild(fileItem); + } +} + +window.removeUploadedFile = function(index) { + uploadedFilePaths.splice(index, 1); + renderFileList(); +} + // --- Template Logic --- async function loadTemplates() { try { @@ -142,6 +162,9 @@ async function startAnalysis() { if (selectedTemplate) { body.template = selectedTemplate; } + if (uploadedFilePaths.length > 0) { + body.files = uploadedFilePaths; + } const res = await fetch('/api/start', { method: 'POST',