From 3104b34cb062dbccdcb1d189d5e89cae764fd5f5 Mon Sep 17 00:00:00 2001 From: zhanghao <774378400@qq.com> Date: Wed, 5 Aug 2026 11:08:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8A=A0=E8=BD=BD=E5=9C=B0=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auto-imports.d.ts | 1 + src/utils/request.js | 44 +++++++++++------- src/views/Address.vue | 36 ++++++++------- src/views/chassis/Chassis.vue | 2 + src/views/chassis/MapCanvas.vue | 80 ++++++++++++++++++++++++--------- 5 files changed, 108 insertions(+), 55 deletions(-) diff --git a/auto-imports.d.ts b/auto-imports.d.ts index bbc5ea8..32c8978 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -8,6 +8,7 @@ export {} declare global { const EffectScope: typeof import('vue').EffectScope const ElMess: typeof import('element-plus/es').ElMess + const ElMessage: typeof import('element-plus/es').ElMessage const acceptHMRUpdate: typeof import('pinia').acceptHMRUpdate const computed: typeof import('vue').computed const createApp: typeof import('vue').createApp diff --git a/src/utils/request.js b/src/utils/request.js index f8de690..9ae6466 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -1,25 +1,35 @@ +import { ElMessage } from 'element-plus' + const request = async (url, params = {}, method = 'GET', headers = { 'Content-Type': 'application/json' }) => { - // 1. 创建控制器 - const controller = new AbortController(); - const { signal } = controller; - - // 2. 设置定时器,超时后调用 abort() + const controller = new AbortController() + const { signal } = controller + const timeoutId = setTimeout(() => { - controller.abort(); // 触发中止信号 + controller.abort() }, 5000) - - const res = await fetch(url, { - method: method, - headers: headers, + + try { + const res = await fetch(url, { + method, + headers, body: JSON.stringify(params), signal - }).finally(() => { - // 4. 无论请求成功还是失败,都要清除定时器,防止内存泄漏 - clearTimeout(timeoutId); - }); + }) - const data = await res.json() - return data + const data = await res.json() + if (!res.ok) { + throw new Error(data.message || data.error || `请求失败(${res.status})`) + } + return data + } catch (error) { + const message = error.name === 'AbortError' + ? '请求超时,请稍后重试' + : (error.message || '请求失败,请稍后重试') + ElMessage.error(message) + throw error + } finally { + clearTimeout(timeoutId) + } } -export default request \ No newline at end of file +export default request diff --git a/src/views/Address.vue b/src/views/Address.vue index 2ab0808..7c4e8fe 100644 --- a/src/views/Address.vue +++ b/src/views/Address.vue @@ -43,6 +43,7 @@ import { useRouter } from 'vue-router' import { getRuntimeState } from '@/api/agv.js' import { useRobotStore } from '@/stores/robot' import { ElMessage } from 'element-plus' +import { ca } from 'element-plus/es/locales.mjs' const router = useRouter() @@ -104,24 +105,27 @@ const testConnect = async () => { robotStore.setCameraDeviceId('real_cam1') } - const result = await getRuntimeState({ - ip: robotStore.ip, - deviceId: ruleForm.value.agvDeviceId - }) - loading.value = false - if (result.code === 200) { - robotStore.setPosition(result.data.pose) - robotStore.setBattery(result.data.battery) - robotStore.setCurrentMap(result.data.current_map) - router.push({ - path: '/home' + try { + const result = await getRuntimeState({ + ip: robotStore.ip, + deviceId: robotStore.agvDeviceId }) - } else { - ElMessage.error(result?.message || '连接服务错误') + loading.value = false + if (result.code === 200) { + robotStore.setPosition(result.data.pose) + robotStore.setBattery(result.data.battery) + robotStore.setCurrentMap(result.data.current_map) + router.push({ + path: '/home' + }) + } else { + ElMessage.error(result?.message || result?.error || '连接服务错误') + } + } + catch (error) { + loading.value = false + ElMessage.error(error?.message || '连接服务错误') } - router.push({ - path: '/home' - }) } } diff --git a/src/views/chassis/Chassis.vue b/src/views/chassis/Chassis.vue index 73f07a5..99b9e42 100644 --- a/src/views/chassis/Chassis.vue +++ b/src/views/chassis/Chassis.vue @@ -348,6 +348,8 @@ onBeforeUnmount(() => { .map-body { flex: 1; + min-width: 0; + min-height: 0; position: relative; overflow: hidden; background: $color-background-base; diff --git a/src/views/chassis/MapCanvas.vue b/src/views/chassis/MapCanvas.vue index 1c97983..8cf69ec 100644 --- a/src/views/chassis/MapCanvas.vue +++ b/src/views/chassis/MapCanvas.vue @@ -1,6 +1,6 @@