From 6d4c22d3f4393d074ee6ac21d8e43eb9b4467347 Mon Sep 17 00:00:00 2001 From: limengnan <420004014@qq.com> Date: Thu, 21 Aug 2025 18:33:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=9E=E6=97=B6=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E4=BF=9D=E5=AD=98=E6=96=B9=E6=B3=95=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=88=A0=E9=99=A4=E5=8E=86=E5=8F=B2=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/renderer/src/services/api.js | 18 ++- frontend/src/renderer/src/views/Detection.vue | 46 ++++--- .../src/renderer/src/views/PatientProfile.vue | 113 +++++++++--------- 3 files changed, 97 insertions(+), 80 deletions(-) diff --git a/frontend/src/renderer/src/services/api.js b/frontend/src/renderer/src/services/api.js index 1c471ff8..dc470627 100644 --- a/frontend/src/renderer/src/services/api.js +++ b/frontend/src/renderer/src/services/api.js @@ -13,7 +13,7 @@ api.interceptors.request.use( if (window.electronAPI) { config.baseURL = window.electronAPI.getBackendUrl() } else { - config.baseURL = 'http://192.168.1.173:5000' + config.baseURL = 'http://192.168.1.58:5000' } // 只为需要发送数据的请求设置Content-Type @@ -610,16 +610,22 @@ export const historyAPI = { // 删除检测数据记录 detectionDelById(id) { return api.delete(`/api/detection/data/${id}`, {}) + }, + // 删除检测会话及其相关的检测数据 + sessionsDelById(id) { + return api.delete(`api/detection/sessions/${id}`, {}) }, // 获取检测会话历史 sessionById(id) { return api.get(`/api/history/sessions/${id}`) }, - // detectionLatestById(id) { - // return api.get(`/api/detection/data/detail/${id}`) - // }, - detectionLatestById(id) { + //获取最新的检测数据 + detectionLatestList(id) { + return api.get(`/api/detection/data/detail/${id}/latest`) + }, + //根据主键ID查询检测数据详情 + detectionById(id) { return api.get(`/api/detection/data/detail/${id}`) }, @@ -631,7 +637,7 @@ export const getBackendUrl = () => { if (window.electronAPI) { return window.electronAPI.getBackendUrl() } else { - return 'http://192.168.1.173:5000' + return 'http://192.168.1.58:5000' } } diff --git a/frontend/src/renderer/src/views/Detection.vue b/frontend/src/renderer/src/views/Detection.vue index 8105a67f..dc0d4bc0 100644 --- a/frontend/src/renderer/src/views/Detection.vue +++ b/frontend/src/renderer/src/views/Detection.vue @@ -64,7 +64,7 @@
{{ femtoboltStatus }}
-
+
深度相机视频流 @@ -323,7 +323,7 @@
-
+
@@ -334,9 +334,12 @@
{{ cameraStatus }}
+
+ +
- +
@@ -569,6 +572,9 @@ const dataCollectionLoading = ref(false) const isRecording = ref(false) const cameraDialogVisible =ref(false) // 设置相机参数弹框 +const wholeBodyRef = ref(null) // 身体姿态ref +const videoImgRef =ref(null) // 视频流图片ref + // 录像相关变量 let mediaRecorder = null let recordedChunks = [] @@ -908,6 +914,7 @@ const editPatient = () => { } dialogVisible.value = true } +const tempInfo = ref({}) // WebSocket连接函数 function connectWebSocket() { try { @@ -1037,25 +1044,29 @@ function connectWebSocket() { // 监听各设备数据事件 devicesSocket.on('camera_frame', (data) => { frameCount++ + tempInfo.value.camera_frame = data displayFrame(data.image) }) - devicesSocket.on('video_frame', (data) => { - frameCount++ - displayFrame(data.image) - }) + // devicesSocket.on('video_frame', (data) => { + // frameCount++ + // displayFrame(data.image) + // }) devicesSocket.on('femtobolt_frame', (data) => { + tempInfo.value.femtobolt_frame = data displayDepthCameraFrame(data.depth_image || data.image) }) - devicesSocket.on('depth_camera_frame', (data) => { - displayDepthCameraFrame(data.depth_image || data.image) - }) + // devicesSocket.on('depth_camera_frame', (data) => { + // displayDepthCameraFrame(data.depth_image || data.image) + // }) devicesSocket.on('imu_data', (data) => { + tempInfo.value.imu_data = data handleIMUData(data) }) devicesSocket.on('pressure_data', (data) => { + tempInfo.value.pressure_data = data handlePressureData(data) }) @@ -1634,11 +1645,12 @@ async function saveDetectionData() { patientId: patientInfo.value.id, patientName: patientInfo.value.name, sessionId: patientInfo.value.sessionId, - head_pose: {}, - body_pose: {}, - foot_data: {} + head_data: imu_data, + body_data: femtobolt_frame, + foot_data: pressure_data, + camera_data: camera_frame, }) - + tempInfo.value // 显示成功消息和文件路径 ElMessage.success({ message: `截图保存成功!`, @@ -2286,6 +2298,9 @@ const getDevicesInit = async () => { } onMounted(() => { + // wholeBodyRef.value + console.log(wholeBodyRef.value.getBoundingClientRect()) + console.log(videoImgRef.value.getBoundingClientRect()) // 加载患者信息 loadPatientInfo() @@ -2301,6 +2316,7 @@ onMounted(() => { }) onUnmounted(() => { + if (timerId.value) { clearInterval(timerId.value); } diff --git a/frontend/src/renderer/src/views/PatientProfile.vue b/frontend/src/renderer/src/views/PatientProfile.vue index 4afef145..136e182b 100644 --- a/frontend/src/renderer/src/views/PatientProfile.vue +++ b/frontend/src/renderer/src/views/PatientProfile.vue @@ -26,7 +26,7 @@
{{ item.created_at }}
最近会诊
{{ getDayNum(item.created_at,index) }}
- + 删除
@@ -75,11 +75,11 @@
-
+
- +
@@ -435,6 +435,10 @@ function getDayNum(date2,index){ // 转换为天数 const daysDiff = Math.floor(timeDiff / (1000 * 3600 * 24)); + + if(daysDiff == 0){ + return "当天"; + } return daysDiff + "天"; } @@ -544,6 +548,7 @@ const deleteScreenshot = async (screenshot) => { } } + const exportReport = async (record) => { try { ElMessage.info('正在生成报告...') @@ -712,8 +717,7 @@ function editClick(row,index) { } //数据详情 function patientdetails(row) { - // historyAPI.sessionById(row.id).then(res => { - // }) + detectionById(row) detailsDialogVisible.value = true } async function handleDiagnosticInfo(status) { @@ -776,8 +780,42 @@ const playNewVideo = () => { videoPlayerRef.value[index].play() } } +function detectionById(row) { + historyAPI.detectionById(row.id).then((response)=>{ + if(response.success){ + debugger + } + }).catch(()=>{ -const deleteClick = async (row) => { + }) +} +const deleteClick = async (row,row2) => { + detectionLatestList(row.id) + ElMessageBox.confirm( + '确定义删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + } + ).then(() => { + historyAPI.detectionDelById(row2.id).then((response)=>{ + if(response.success){ + ElMessage.success({ + message: response.message, + duration: 5000 + }); + sessionsInit() + // detectionLatestList(row.id) + } + }).catch(()=>{ + }) + }) +} + + +const sessionsDelById = async (row) => { ElMessageBox.confirm( '确定义删除此条数据?', @@ -788,7 +826,7 @@ const deleteClick = async (row) => { type: 'warning', } ).then(() => { - historyAPI.detectionDelById(row.id).then((response)=>{ + historyAPI.sessionsDelById(row.id).then((response)=>{ if(response.success){ ElMessage.success({ message: response.message, @@ -796,63 +834,20 @@ const deleteClick = async (row) => { }); sessionsInit() } - - }).catch(()=>{ - }) }) +} - - // try { - // // 检查是否有活跃的会话ID - // if (!row.id) { - // throw new Error('缺少会话Id'); +const detectionLatestList = async(id)=>{ + const response = await historyAPI.detectionLatestList(id) + console.log(response) + // historyAPI.detectionLatestList(id).then((response)=>{ + // if(response.success){ + // console.log(response) // } - - // // 显示确认对话框 - // await ElMessageBox.confirm( - // '确定要删除此条数据?', - // '警告', - // { - // confirmButtonText: '确定', - // cancelButtonText: '取消', - // type: 'warning', - // } - // ); - - // // 调用后端API删除数据 - // const response = await fetch(`${BACKEND_URL}/api/detection/data/${row.id}`, { - // method: 'DELETE', - // headers: { - // 'Content-Type': 'application/json' - // }, - // }); - - // if (!response.ok) { - // throw new Error(`HTTP ${response.status}: ${response.statusText}`); - // } - - // const result = await response.json(); - // if (result.success) { - // ElMessage.success({ - // message: '删除成功', - // duration: 5000 - // }); - // } else { - // throw new Error(result.message || '删除失败'); - // } - // } catch (error) { - // // 如果是用户取消操作,不显示错误 - // if (error === 'cancel' || error === 'close') { - // return; - // } - - // ElMessage.error({ - // message: error.message || '删除过程中发生错误', - // duration: 5000 - // }); - // } + // }).catch(()=>{ + // }) } // // 其他控制方法 // const togglePlayPause = () => {