修复了一些前端bug

This commit is contained in:
xunbu
2025-07-15 00:26:19 +08:00
parent abdcd215fd
commit 66106e7a15

View File

@@ -661,8 +661,13 @@
function saveTaskIds() {
if (isAdminMode) return; // In admin mode, do not save task list to localStorage
const taskIds = Object.keys(tasks);
saveToStorage('active_task_ids', JSON.stringify(taskIds));
// === 修改点: 只保存已提交到后端的任务ID ===
// 这是解决问题的核心。通过只持久化那些已经成功提交给后端处理的任务,
// 我们可以防止未提交的任务(这些任务在后端不存在)在页面刷新后被恢复。
// 如果一个未提交的任务是页面上唯一的任务,刷新后 `localStorage` 中的任务列表会是空的,
// `init`函数在初始化时会发现没有任务,从而新建一个空白任务,符合预期。
const submittedTaskIds = Object.keys(tasks).filter(taskId => tasks[taskId].state.isSubmitted);
saveToStorage('active_task_ids', JSON.stringify(submittedTaskIds));
}
// --- Task Card Management ---
@@ -675,7 +680,6 @@
const cardElement = cardFragment.querySelector('.task-card');
cardElement.dataset.taskId = taskId;
// --- 修改点: 更新元素选择器以获取新的和现有的元素 ---
const elements = {
card: cardElement,
taskIdDisplay: cardElement.querySelector('.task-id-display'),
@@ -707,7 +711,6 @@
file: null,
htmlUrl: null,
fileNameStem: null,
// === 修改点 1: 正确设置恢复任务的初始状态 ===
// 如果任务是从之前的会话中恢复的restoreState为true
// 那么它一定是一个已经提交过的任务。
isSubmitted: restoreState
@@ -776,7 +779,6 @@
});
}
// --- 修改点: 更新 handleFileSelect 函数以改变拖放区外观 ---
function handleFileSelect(taskId) {
const { elements, state } = tasks[taskId];
const file = elements.fileInput.files[0];
@@ -871,6 +873,10 @@
const result = await response.json();
if (response.ok && result.task_started) {
// === 修改点: 任务成功提交后保存其ID ===
// 由于 saveTaskIds 只保存 isSubmitted 为 true 的任务,
// 在这里调用它可以确保这个新提交的任务ID被持久化。
saveTaskIds();
elements.statusMessage.textContent = result.message || '任务已开始,正在处理...';
elements.statusMessage.className = 'status-message small text-info';
elements.startBtn.innerHTML = `<i class="bi bi-stop-circle-fill me-1"></i>取消翻译`;
@@ -881,6 +887,9 @@
throw new Error(result.message || `请求失败 (${response.status})`);
}
} catch (error) {
// === 修改点: 如果提交失败或过程中出现任何异常,将任务状态重置为未提交 ===
// 这样可以防止一个失败的任务被错误地标记为“已提交”,从而避免了刷新后出现问题。
state.isSubmitted = false;
console.error('请求失败:', error);
elements.statusMessage.textContent = `启动失败: ${error.message}`;
elements.statusMessage.className = 'status-message small text-danger';
@@ -961,7 +970,6 @@
const status = await response.json();
// 页面刷新时,从后端状态恢复文件名显示
// 注意: 这里不改变拖放区的绿色状态,以满足“刷新后恢复”的需求
if (status.original_filename && (!state.file || isRestore)) {
elements.fileNameDisplay.textContent = status.original_filename;
elements.fileNameDisplayWrapper.style.display = 'block';
@@ -1004,12 +1012,6 @@
elements.progress.style.display = 'block';
elements.downloadButtons.style.display = 'none';
// === 修改点 2: 刷新后启动轮询 ===
// 这是实现需求的核心改动。
// 如果此函数是在页面刷新恢复任务时被调用的 (isRestore为true),
// 并且服务器确认任务仍在处理中,
// 我们就必须启动客户端的轮询,以继续接收后续的日志和状态更新。
// 我们也检查轮询间隔是否已存在,避免重复启动。
if (isRestore && !tasks[taskId].intervals.status) {
startPolling(taskId);
}