刷新后继续获取log

This commit is contained in:
xunbu
2025-07-15 00:06:52 +08:00
parent acd0ae3c46
commit ba2c0bd5c8

View File

@@ -67,9 +67,11 @@
background-color: var(--bs-secondary-bg); background-color: var(--bs-secondary-bg);
} }
/* --- 修改点: 添加了文件选中后的样式 --- */
.file-drop-area.file-selected { .file-drop-area.file-selected {
border-style: solid; border-style: solid;
border-color: var(--bs-success); border-color: var(--bs-success);
background-color: var(--bs-success-bg-subtle);
} }
.file-drop-area.input-error { .file-drop-area.input-error {
@@ -391,10 +393,20 @@
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">
<input type="file" class="d-none file-input"> <input type="file" class="d-none file-input">
<!-- --- 修改点: 更新拖放区域的内部结构以支持两种状态 --- -->
<div class="file-drop-area"> <div class="file-drop-area">
<div class="file-drop-default">
<i class="bi bi-cloud-arrow-up fs-1"></i> <i class="bi bi-cloud-arrow-up fs-1"></i>
<p class="file-drop-prompt mb-0">点击或拖拽文件到此处</p> <p class="file-drop-prompt mb-0">点击或拖拽文件到此处</p>
<p class="file-name-display text-success"></p> </div>
<div class="file-drop-selected" style="display: none;">
<i class="bi bi-check-circle-fill fs-1 text-success"></i>
<p class="mb-0 mt-2 fw-bold text-success">文件已选择</p>
</div>
</div>
<div class="file-name-display-wrapper mt-2" style="display: none;">
<span class="fw-bold">文件名: </span>
<span class="file-name-display text-success"></span>
</div> </div>
</div> </div>
<div class="col-md-7"> <div class="col-md-7">
@@ -663,13 +675,16 @@
const cardElement = cardFragment.querySelector('.task-card'); const cardElement = cardFragment.querySelector('.task-card');
cardElement.dataset.taskId = taskId; cardElement.dataset.taskId = taskId;
// --- 修改点: 更新元素选择器以获取新的和现有的元素 ---
const elements = { const elements = {
card: cardElement, card: cardElement,
taskIdDisplay: cardElement.querySelector('.task-id-display'), taskIdDisplay: cardElement.querySelector('.task-id-display'),
removeBtn: cardElement.querySelector('.remove-task-btn'), removeBtn: cardElement.querySelector('.remove-task-btn'),
fileInput: cardElement.querySelector('.file-input'), fileInput: cardElement.querySelector('.file-input'),
fileDropArea: cardElement.querySelector('.file-drop-area'), fileDropArea: cardElement.querySelector('.file-drop-area'),
fileDropPrompt: cardElement.querySelector('.file-drop-prompt'), fileDropDefault: cardElement.querySelector('.file-drop-default'),
fileDropSelected: cardElement.querySelector('.file-drop-selected'),
fileNameDisplayWrapper: cardElement.querySelector('.file-name-display-wrapper'),
fileNameDisplay: cardElement.querySelector('.file-name-display'), fileNameDisplay: cardElement.querySelector('.file-name-display'),
logArea: cardElement.querySelector('.log-area'), logArea: cardElement.querySelector('.log-area'),
statusMessage: cardElement.querySelector('.status-message'), statusMessage: cardElement.querySelector('.status-message'),
@@ -692,7 +707,10 @@
file: null, file: null,
htmlUrl: null, htmlUrl: null,
fileNameStem: null, fileNameStem: null,
isSubmitted: false // === 修改点 1: 正确设置恢复任务的初始状态 ===
// 如果任务是从之前的会话中恢复的restoreState为true
// 那么它一定是一个已经提交过的任务。
isSubmitted: restoreState
}, },
intervals: { intervals: {
log: null, log: null,
@@ -758,15 +776,23 @@
}); });
} }
// --- 修改点: 更新 handleFileSelect 函数以改变拖放区外观 ---
function handleFileSelect(taskId) { function handleFileSelect(taskId) {
const { elements, state } = tasks[taskId]; const { elements, state } = tasks[taskId];
const file = elements.fileInput.files[0]; const file = elements.fileInput.files[0];
if (file) { if (file) {
state.file = file; state.file = file;
elements.fileNameDisplay.textContent = `已选: ${file.name}`;
// 更新外部文件名显示
elements.fileNameDisplay.textContent = file.name;
elements.fileNameDisplayWrapper.style.display = 'block';
// 更新拖放区外观为“已选择”状态
elements.fileDropArea.classList.add('file-selected'); elements.fileDropArea.classList.add('file-selected');
elements.fileDropPrompt.style.display = 'none'; elements.fileDropDefault.style.display = 'none';
// Clear any previous error states elements.fileDropSelected.style.display = 'block';
// 清除任何之前的错误状态
elements.fileDropArea.classList.remove('input-error'); elements.fileDropArea.classList.remove('input-error');
elements.fileNameDisplay.classList.remove('input-error-text'); elements.fileNameDisplay.classList.remove('input-error-text');
} }
@@ -934,13 +960,11 @@
} }
const status = await response.json(); const status = await response.json();
// Restore filename display from status // 页面刷新时,从后端状态恢复文件名显示
if (status.original_filename && !state.file) { // 注意: 这里不改变拖放区的绿色状态,以满足“刷新后恢复”的需求
elements.fileNameDisplay.textContent = `已上传: ${status.original_filename}`; if (status.original_filename && (!state.file || isRestore)) {
elements.fileDropArea.classList.add('file-selected'); elements.fileNameDisplay.textContent = status.original_filename;
elements.fileDropPrompt.style.display = 'none'; elements.fileNameDisplayWrapper.style.display = 'block';
elements.fileDropArea.classList.remove('input-error');
elements.fileNameDisplay.classList.remove('input-error-text');
} }
elements.statusMessage.textContent = status.status_message || '正在获取状态...'; elements.statusMessage.textContent = status.status_message || '正在获取状态...';
@@ -979,6 +1003,16 @@
elements.startBtn.disabled = false; elements.startBtn.disabled = false;
elements.progress.style.display = 'block'; elements.progress.style.display = 'block';
elements.downloadButtons.style.display = 'none'; elements.downloadButtons.style.display = 'none';
// === 修改点 2: 刷新后启动轮询 ===
// 这是实现需求的核心改动。
// 如果此函数是在页面刷新恢复任务时被调用的 (isRestore为true),
// 并且服务器确认任务仍在处理中,
// 我们就必须启动客户端的轮询,以继续接收后续的日志和状态更新。
// 我们也检查轮询间隔是否已存在,避免重复启动。
if (isRestore && !tasks[taskId].intervals.status) {
startPolling(taskId);
}
} }
} catch (error) { } catch (error) {