Просмотр исходного кода

fix: 作品同步增加停止/中断操作 (#6072)

ethanfly 3 дней назад
Родитель
Сommit
125e23e89a
2 измененных файлов с 26 добавлено и 1 удалено
  1. 6 0
      client/src/stores/taskQueue.ts
  2. 20 1
      client/src/views/Works/index.vue

+ 6 - 0
client/src/stores/taskQueue.ts

@@ -41,6 +41,11 @@ export const useTaskQueueStore = defineStore('taskQueue', () => {
 
   const activeTaskCount = computed(() => activeTasks.value.length);
 
+  // 当前正在运行的作品同步任务(用于 Works 页面显示"停止同步"按钮)
+  const runningSyncWorksTask = computed(() =>
+    tasks.value.find(t => t.type === 'sync_works' && t.status === 'running')
+  );
+
   // 获取任务类型配置
   const getTaskConfig = (type: TaskType) => TASK_TYPE_CONFIG[type];
 
@@ -567,6 +572,7 @@ export const useTaskQueueStore = defineStore('taskQueue', () => {
     runningTasks,
     hasActiveTasks,
     activeTaskCount,
+    runningSyncWorksTask,
     // 方法
     getTaskConfig,
     connectWebSocket,

+ 20 - 1
client/src/views/Works/index.vue

@@ -45,10 +45,14 @@
         <el-icon><Search /></el-icon>
         搜索
       </el-button>
-      <el-button @click="refreshAllWorks" :loading="refreshing">
+      <el-button @click="refreshAllWorks" :loading="refreshing" v-if="!taskStore.runningSyncWorksTask">
         <el-icon><Refresh /></el-icon>
         同步作品
       </el-button>
+      <el-button type="danger" @click="stopSyncWorks" v-else>
+        <el-icon><CircleCloseFilled /></el-icon>
+        停止同步
+      </el-button>
       <el-button type="success" @click="syncAllComments" :loading="syncingComments">
         <el-icon><ChatDotSquare /></el-icon>
         同步评论
@@ -590,6 +594,21 @@ async function refreshAllWorks() {
   }
 }
 
+// 停止正在运行的作品同步任务
+async function stopSyncWorks() {
+  const task = taskStore.runningSyncWorksTask;
+  if (!task) return;
+  
+  try {
+    const ok = await taskStore.cancelTask(task.id);
+    if (ok) {
+      ElMessage.success('已发送取消请求,同步任务将停止');
+    }
+  } catch {
+    ElMessage.error('取消同步任务失败');
+  }
+}
+
 // WebSocket 连接用于接收同步结果
 let ws: WebSocket | null = null;
 let wsReconnectTimer: ReturnType<typeof setTimeout> | null = null;