diff --git a/internal/app/logic/wait_cond.go b/internal/app/logic/wait_cond.go index 807eb3c..d80c199 100644 --- a/internal/app/logic/wait_cond.go +++ b/internal/app/logic/wait_cond.go @@ -35,8 +35,8 @@ func newWaitCond() *WaitCond { } func (p *WaitCond) Trigger() { - p.TriggerChan <- struct{}{} p.Version.Add(1) + p.TriggerChan <- struct{}{} } func (p *WaitCond) timing() { // 添加定时信号清理阻塞协程 diff --git a/internal/app/middle/wait.go b/internal/app/middle/wait.go index 6f9c59f..dd3c65a 100644 --- a/internal/app/middle/wait.go +++ b/internal/app/middle/wait.go @@ -28,6 +28,7 @@ func (p *WaitCondMiddle) WaitGetMiddel(c *gin.Context) { return } if version < p.wc.Version.Load() { + c.Header("Version", strconv.FormatInt(p.wc.Version.Load(), 10)) c.Next() return } diff --git a/resources/src/views/process/Process.vue b/resources/src/views/process/Process.vue index c9a9241..911d2b3 100644 --- a/resources/src/views/process/Process.vue +++ b/resources/src/views/process/Process.vue @@ -196,16 +196,6 @@ type CreateHandle = { const processCreateComponent = ref(null); const processData = ref(); -// 生成兼容的 UUID -const generateUUID = (): string => { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - const r = Math.random() * 16 | 0; - const v = c === 'x' ? r : (r & 0x3 | 0x8); - return v.toString(16); - }); -}; - -const uuid: string = crypto?.randomUUID?.() ?? generateUUID(); const snackbarStore = useSnackbarStore(); const startingAll = ref(false); const killingAll = ref(false); @@ -214,6 +204,8 @@ const killAllDialog = ref(false); const fab = ref(false); const initFirst = ref(false); +const version = ref(0); + const initProcessData = () => { getProcessList().then((e) => { processData.value = e.data!.sort((a, b) => a.name.localeCompare(b.name)); @@ -283,6 +275,13 @@ const executeKillAll = () => { }; let cancelTokenSource: any; + +onBeforeUnmount(() => { + if (cancelTokenSource) { + cancelTokenSource.cancel("组件已销毁,取消请求"); + } +}); + const getProcessListWait = () => { cancelTokenSource = axios.CancelToken.source(); axios @@ -290,10 +289,11 @@ const getProcessListWait = () => { cancelToken: cancelTokenSource.token, headers: { Authorization: "bearer " + localStorage.getItem("token"), - Uuid: uuid, + Version: version.value, }, }) .then((response) => { + version.value = parseInt(response.headers?.version || "0"); processData.value = response.data.data.sort((a, b) => a.name.localeCompare(b.name) ); diff --git a/resources/src/views/task/Task.vue b/resources/src/views/task/Task.vue index a73bbf5..94f3028 100644 --- a/resources/src/views/task/Task.vue +++ b/resources/src/views/task/Task.vue @@ -18,12 +18,7 @@
mdi-format-list-checks 任务 - + mdi-refresh - + {{ header.title }} @@ -75,7 +74,13 @@ fill="#000000" /> - + - + mdi-play - + mdi-stop @@ -325,6 +340,8 @@ import { stopTaskById, } from "~/src/api/task"; import { useSnackbarStore } from "~/src/stores/snackbarStore"; +import axios from "axios"; +import { onBeforeUnmount } from "vue"; import { TaskItem } from "~/src/types/tassk/task"; const snackbarStore = useSnackbarStore(); @@ -362,6 +379,7 @@ const eventMap = { const urlBase = ref(`${window.location.origin}/api/task/api-key/`); +const version = ref(0); // 表头 const headers = [ { title: "任务ID", key: "id" }, @@ -425,6 +443,8 @@ const refreshTasks = () => { onMounted(() => { initTask(); + + getTaskListWait(); }); // 打开添加任务弹窗 @@ -471,6 +491,35 @@ const copyToClipboard = () => { console.error("复制失败:", err); }); }; +let cancelTokenSource: any; + +onBeforeUnmount(() => { + if (cancelTokenSource) { + cancelTokenSource.cancel("组件已销毁,取消请求"); + } +}); + +const getTaskListWait = () => { + cancelTokenSource = axios.CancelToken.source(); + axios + .get("api/task/all/wait", { + cancelToken: cancelTokenSource.token, + headers: { + Authorization: "bearer " + localStorage.getItem("token"), + Version: version.value, + }, + }) + .then((response) => { + version.value = parseInt(response.headers?.version || "0"); + taskData.value = response.data.data.sort((a, b) => + a.name.localeCompare(b.name) + ); + getTaskListWait(); + }) + .catch((error) => { + console.error("请求错误:", error); + }); +}; // 初始化任务 & 下拉框选项 const initTask = () => { @@ -490,7 +539,6 @@ const initTask = () => { .finally(() => { loading.value = false; }); - // 操作/事件/条件 operationSelect.value = Object.entries(operationMap).map(([value, name]) => ({ name,