From fe79fe828a39e1da3e2d035e064ffc3dcb27af90 Mon Sep 17 00:00:00 2001 From: limengnan <420004014@qq.com> Date: Wed, 26 Nov 2025 16:43:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=A0=B7=E5=BC=8F=E6=9C=AA?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/renderer/src/assets/new/archive.svg | 6 + .../src/renderer/src/assets/new/conduct.png | Bin 0 -> 1358 bytes .../src/renderer/src/assets/new/conduct.svg | 7 + .../src/renderer/src/assets/new/endvideo.svg | 6 + .../src/renderer/src/assets/new/jietu.svg | 6 + .../src/renderer/src/assets/new/newbg.jpg | Bin 0 -> 50210 bytes .../src/renderer/src/assets/new/refresh.svg | 6 + .../src/renderer/src/assets/new/settings.svg | 6 + .../renderer/src/assets/new/startvideo.svg | 6 + .../renderer/src/assets/new/testheader.png | Bin 0 -> 39420 bytes .../src/renderer/src/assets/new/title1.svg | 6 + .../src/renderer/src/assets/new/title2.svg | 6 + .../src/renderer/src/assets/new/title3.svg | 6 + .../src/renderer/src/assets/new/title4.svg | 6 + .../src/renderer/src/assets/new/title5.svg | 6 + frontend/src/renderer/src/assets/new/u10.svg | 6 + frontend/src/renderer/src/assets/new/u13.png | Bin 0 -> 28367 bytes frontend/src/renderer/src/assets/new/u16.svg | 6 + frontend/src/renderer/src/assets/new/u249.svg | 6 + frontend/src/renderer/src/assets/new/u253.svg | 6 + frontend/src/renderer/src/assets/new/u257.svg | 6 + frontend/src/renderer/src/assets/new/u264.svg | 6 + .../renderer/src/assets/new/useravatar.svg | 6 + .../src/renderer/src/assets/new/useredit.svg | 6 + .../src/renderer/src/assets/new/userinfo.svg | 6 + frontend/src/renderer/src/services/api.js | 4 +- frontend/src/renderer/src/style.css | 2 +- frontend/src/renderer/src/views/Dashboard.vue | 792 ++-- .../renderer/src/views/Detection - 副本.vue | 3001 +++++++++++++++ frontend/src/renderer/src/views/Detection.vue | 3399 +++++------------ frontend/src/renderer/src/views/Header.vue | 70 +- frontend/src/renderer/src/views/Login.vue | 294 +- .../src/renderer/src/views/PatientCreate.vue | 216 +- 33 files changed, 4752 insertions(+), 3153 deletions(-) create mode 100644 frontend/src/renderer/src/assets/new/archive.svg create mode 100644 frontend/src/renderer/src/assets/new/conduct.png create mode 100644 frontend/src/renderer/src/assets/new/conduct.svg create mode 100644 frontend/src/renderer/src/assets/new/endvideo.svg create mode 100644 frontend/src/renderer/src/assets/new/jietu.svg create mode 100644 frontend/src/renderer/src/assets/new/newbg.jpg create mode 100644 frontend/src/renderer/src/assets/new/refresh.svg create mode 100644 frontend/src/renderer/src/assets/new/settings.svg create mode 100644 frontend/src/renderer/src/assets/new/startvideo.svg create mode 100644 frontend/src/renderer/src/assets/new/testheader.png create mode 100644 frontend/src/renderer/src/assets/new/title1.svg create mode 100644 frontend/src/renderer/src/assets/new/title2.svg create mode 100644 frontend/src/renderer/src/assets/new/title3.svg create mode 100644 frontend/src/renderer/src/assets/new/title4.svg create mode 100644 frontend/src/renderer/src/assets/new/title5.svg create mode 100644 frontend/src/renderer/src/assets/new/u10.svg create mode 100644 frontend/src/renderer/src/assets/new/u13.png create mode 100644 frontend/src/renderer/src/assets/new/u16.svg create mode 100644 frontend/src/renderer/src/assets/new/u249.svg create mode 100644 frontend/src/renderer/src/assets/new/u253.svg create mode 100644 frontend/src/renderer/src/assets/new/u257.svg create mode 100644 frontend/src/renderer/src/assets/new/u264.svg create mode 100644 frontend/src/renderer/src/assets/new/useravatar.svg create mode 100644 frontend/src/renderer/src/assets/new/useredit.svg create mode 100644 frontend/src/renderer/src/assets/new/userinfo.svg create mode 100644 frontend/src/renderer/src/views/Detection - 副本.vue diff --git a/frontend/src/renderer/src/assets/new/archive.svg b/frontend/src/renderer/src/assets/new/archive.svg new file mode 100644 index 00000000..75d3f08f --- /dev/null +++ b/frontend/src/renderer/src/assets/new/archive.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/conduct.png b/frontend/src/renderer/src/assets/new/conduct.png new file mode 100644 index 0000000000000000000000000000000000000000..d705efe8c5f4ccd7a0f04ede5c6edf5e1d1bfcd8 GIT binary patch literal 1358 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!ovKsVXIz(B#=QqR!b zFxkjFEip+)!N|bKNZ-Ih-_T6g$jHjr)XKzA0Sc6W78a$XSp~VcL9GMwY?U%fN(!v> z^~=l4^~#O)@{7{-4J|D#^$m>ljf`}GDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_p zOiaozEwNPsIu_!K+yc00*0A>MPh-zp`HQAS1^UXzW9~q=E7AMmjtCE+>6!V z;*iRMRQ;gT;{4L0WMJH-DTAykuyQU+O)SYT3dzsUfdynhMt(_taYlZDf{}@yfr3VO zW?o8ud9fx~gRifZXI^nhVqS8pr;Du;&9P zN&dxbtz9zBcA@^m0 zmW2ix@myVZo?D*pWtw;ATifpiPBRu4H{Pz3N?*ciyrtvdA=dZ1IHzoN@>o?kqg1|7 zslD*X(suFBla4D(@yxz!&c`7)rOd~(?cuA5oD*CpH|z9;N=TbEN1bC8?D;Ep)BeSs zl_Fj~`A!|%78RSl+xSAl!2N69{o|ItP0Iz3Omp5jtEkJnJu=w(ai>GN)!QBG*g_<8 zW5Q)WvY4MbG;5)^>(*ksX&>3nh}$gp|HYxiX3scnFD_ah$ruG+J{!Tg-j^My4E4=;KqPN}m@^sK7fp>$C3G2eOL zsT=tnMIAbwj=k!gm=byJ-$jq=Dyy|ItADF**LU&VurTg_$DXrqmxKsRWuJ2Nu8oHB z(UNH#yH~%?neMgP_u!j3jj6f@bFXjR{5-v=VUfu;1MgPlnzjGVh1?e7@tAyf>+OH; b4U7!O_sz9^*Qs|ORKj_>`njxgN@xNAKpf|d literal 0 HcmV?d00001 diff --git a/frontend/src/renderer/src/assets/new/conduct.svg b/frontend/src/renderer/src/assets/new/conduct.svg new file mode 100644 index 00000000..657eae97 --- /dev/null +++ b/frontend/src/renderer/src/assets/new/conduct.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/endvideo.svg b/frontend/src/renderer/src/assets/new/endvideo.svg new file mode 100644 index 00000000..1285fc14 --- /dev/null +++ b/frontend/src/renderer/src/assets/new/endvideo.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/jietu.svg b/frontend/src/renderer/src/assets/new/jietu.svg new file mode 100644 index 00000000..3ebb379c --- /dev/null +++ b/frontend/src/renderer/src/assets/new/jietu.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/newbg.jpg b/frontend/src/renderer/src/assets/new/newbg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b429dd2ccadd49063be878aebd5d1a478550a1ae GIT binary patch literal 50210 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 literal 0 HcmV?d00001 diff --git a/frontend/src/renderer/src/assets/new/refresh.svg b/frontend/src/renderer/src/assets/new/refresh.svg new file mode 100644 index 00000000..37c462b7 --- /dev/null +++ b/frontend/src/renderer/src/assets/new/refresh.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/settings.svg b/frontend/src/renderer/src/assets/new/settings.svg new file mode 100644 index 00000000..1ef71f99 --- /dev/null +++ b/frontend/src/renderer/src/assets/new/settings.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/startvideo.svg b/frontend/src/renderer/src/assets/new/startvideo.svg new file mode 100644 index 00000000..703f1d35 --- /dev/null +++ b/frontend/src/renderer/src/assets/new/startvideo.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/testheader.png b/frontend/src/renderer/src/assets/new/testheader.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee897b4047f766d9dd78b3bb670670b612d6b13 GIT binary patch literal 39420 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 BGYtR$ literal 0 HcmV?d00001 diff --git a/frontend/src/renderer/src/assets/new/title1.svg b/frontend/src/renderer/src/assets/new/title1.svg new file mode 100644 index 00000000..f87b6a4b --- /dev/null +++ b/frontend/src/renderer/src/assets/new/title1.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/title2.svg b/frontend/src/renderer/src/assets/new/title2.svg new file mode 100644 index 00000000..9229295a --- /dev/null +++ b/frontend/src/renderer/src/assets/new/title2.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/title3.svg b/frontend/src/renderer/src/assets/new/title3.svg new file mode 100644 index 00000000..65d2c9ec --- /dev/null +++ b/frontend/src/renderer/src/assets/new/title3.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/title4.svg b/frontend/src/renderer/src/assets/new/title4.svg new file mode 100644 index 00000000..f211968c --- /dev/null +++ b/frontend/src/renderer/src/assets/new/title4.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/title5.svg b/frontend/src/renderer/src/assets/new/title5.svg new file mode 100644 index 00000000..36d53724 --- /dev/null +++ b/frontend/src/renderer/src/assets/new/title5.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/u10.svg b/frontend/src/renderer/src/assets/new/u10.svg new file mode 100644 index 00000000..60e866b4 --- /dev/null +++ b/frontend/src/renderer/src/assets/new/u10.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/u13.png b/frontend/src/renderer/src/assets/new/u13.png new file mode 100644 index 0000000000000000000000000000000000000000..dc301d37b24a94df3ac27f973f8cd61f7d08c51c GIT binary patch literal 28367 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 + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/u249.svg b/frontend/src/renderer/src/assets/new/u249.svg new file mode 100644 index 00000000..4161523a --- /dev/null +++ b/frontend/src/renderer/src/assets/new/u249.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/u253.svg b/frontend/src/renderer/src/assets/new/u253.svg new file mode 100644 index 00000000..1f260d35 --- /dev/null +++ b/frontend/src/renderer/src/assets/new/u253.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/u257.svg b/frontend/src/renderer/src/assets/new/u257.svg new file mode 100644 index 00000000..596a771c --- /dev/null +++ b/frontend/src/renderer/src/assets/new/u257.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/u264.svg b/frontend/src/renderer/src/assets/new/u264.svg new file mode 100644 index 00000000..f357134a --- /dev/null +++ b/frontend/src/renderer/src/assets/new/u264.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/useravatar.svg b/frontend/src/renderer/src/assets/new/useravatar.svg new file mode 100644 index 00000000..b262db65 --- /dev/null +++ b/frontend/src/renderer/src/assets/new/useravatar.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/useredit.svg b/frontend/src/renderer/src/assets/new/useredit.svg new file mode 100644 index 00000000..dcaf053c --- /dev/null +++ b/frontend/src/renderer/src/assets/new/useredit.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/assets/new/userinfo.svg b/frontend/src/renderer/src/assets/new/userinfo.svg new file mode 100644 index 00000000..695d2e1b --- /dev/null +++ b/frontend/src/renderer/src/assets/new/userinfo.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/services/api.js b/frontend/src/renderer/src/services/api.js index c175d682..0d8ba21e 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://localhost:5000' + config.baseURL = 'http://192.168.1.60:5000' } // 为需要发送数据的请求设置Content-Type(避免覆盖FormData) @@ -660,7 +660,7 @@ export const getBackendUrl = () => { if (window.electronAPI) { return window.electronAPI.getBackendUrl() } else { - return 'http://localhost:5000' + return 'http://192.168.1.60:5000' } } diff --git a/frontend/src/renderer/src/style.css b/frontend/src/renderer/src/style.css index 5347ea2a..06c14be0 100644 --- a/frontend/src/renderer/src/style.css +++ b/frontend/src/renderer/src/style.css @@ -7,7 +7,7 @@ } body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + font-family: 'Noto Sans SC', sans-serif; background-color: #f5f5f5; color: #333; line-height: 1.6; diff --git a/frontend/src/renderer/src/views/Dashboard.vue b/frontend/src/renderer/src/views/Dashboard.vue index 137a9aeb..9adfa164 100644 --- a/frontend/src/renderer/src/views/Dashboard.vue +++ b/frontend/src/renderer/src/views/Dashboard.vue @@ -1,256 +1,221 @@ @@ -261,10 +226,15 @@ import { ElMessage, ElMessageBox } from 'element-plus' import api, { patientAPI } from '../services/api.js' import { useAuthStore } from '../stores/index.js' import Header from '@/views/Header.vue' +import PatientCreate from '@/views/PatientCreate.vue' +import Detection from '@/views/Detection.vue' + import { color } from 'echarts' const router = useRouter() const authStore = useAuthStore() - +const isDetection = ref(true) // 显示检查页面 +const patienttype = ref('add') +const patienttotal = ref(0) // 响应式数据 const activeNav = ref('detection') const searchKeyword = ref('') @@ -361,18 +331,20 @@ const calculateAgeres = (date) => { } // 计算属性 const filteredPatients = computed(() => { - if (!searchKeyword.value) { - return patients.value - } + // if (!searchKeyword.value) { + // return patients.value + // } - return patients.value.filter(patient => - patient.name.toLowerCase().includes(searchKeyword.value.toLowerCase()) - ) + // return patients.value.filter(patient => + // patient.name.toLowerCase().includes(searchKeyword.value.toLowerCase()) + // ) }) // 方法 const handleSearch = () => { // 搜索逻辑已在计算属性中处理 + loadPatients() + } // const selectPatient = (patient) => { @@ -457,7 +429,8 @@ const startDetection = () => { ElMessage.warning('请先选择患者') return } - router.push(`/detection/${selectedPatient.value.id}`) + isDetection.value = true + // router.push(`/detection/${selectedPatient.value.id}`) } const createNewPatient = async () => { @@ -465,7 +438,9 @@ const createNewPatient = async () => { const response = await api.get('/api/license/info') const isValid = response && response.success && response.data && response.data.valid if (isValid) { - router.push('/patient/create') + // router.push('/patient/create') + patienttype.value = 'add' + isCloseCreat.value =true return } const msg ='['+ (response && response.data && response.data.message)+'],软件使用授权不正确,您不能创建新患者!' @@ -546,16 +521,24 @@ const calculateAge = (birthDate) => { } return age } - +const size =ref(15) +const page =ref(1) +const search = ref("") const loadPatients = async () => { try { - const response = await patientAPI.getPatients() + const response = await patientAPI.getPatients({ + page:page.value, + size:size.value, + search:search.value + }) if (response.success) { // 如果返回的是分页数据对象,提取patients数组 if (response.data && Array.isArray(response.data.patients)) { patients.value = response.data.patients + patienttotal.value =response.data.total } else if (Array.isArray(response.data)) { patients.value = response.data + patienttotal.value =response.total } else { patients.value = [] } @@ -563,32 +546,7 @@ const loadPatients = async () => { } catch (error) { console.error('加载患者列表失败:', error) // 模拟数据 - patients.value = [ - { - id: 1, - name: '张三', - gender: '男', - age: 45, - updated_at: '2023-05-01 14:00:00', - num: 4 - }, - { - id: 2, - name: '李四', - gender: '女', - updated_at: '2023-05-01 14:00:00', - num: 4 - }, - { - id: 3, - name: '王五', - gender: '男', - age: 52, - updated_at: '2023-05-01 14:00:00', - num: 4 - - } - ] + patients.value = [] } } const handleClose = () => { @@ -639,7 +597,24 @@ function delClick(id) { .catch(() => { }); } - +const isCloseCreat = ref(false) +function closecreatbox(e){ + if(e == true){ + loadPatients() + } + isCloseCreat.value = false +} +function endChange(){ + isDetection.value = false +} +function handleCurrentChange (val) { + page.value = val + loadPatients() +} +function editClick(){ + patienttype.value = 'edit' + isCloseCreat.value = true +} diff --git a/frontend/src/renderer/src/views/Detection - 副本.vue b/frontend/src/renderer/src/views/Detection - 副本.vue new file mode 100644 index 00000000..8229f853 --- /dev/null +++ b/frontend/src/renderer/src/views/Detection - 副本.vue @@ -0,0 +1,3001 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/src/renderer/src/views/Detection.vue b/frontend/src/renderer/src/views/Detection.vue index f087f07f..cbbd4d3b 100644 --- a/frontend/src/renderer/src/views/Detection.vue +++ b/frontend/src/renderer/src/views/Detection.vue @@ -1,587 +1,292 @@ @@ -595,233 +300,58 @@ import { useAuthStore } from '../stores/index.js' import * as echarts from 'echarts' import { getBackendUrl, patientAPI } from '../services/api.js' import noImageSvg from '@/assets/no-image.svg' -import HistoryDashboard from '@/views/PatientProfile.vue' -const isBig =ref(false) const authStore = useAuthStore() -const router = useRouter() -const route = useRoute() -const isRecording = ref(false) -const isConnected = ref(false) +const emit = defineEmits([ 'endChange']); +const props = defineProps({ + selectedPatient: { + required: false, + type: Object, + default: null + } +}) + +// 四个设备的独立连接状态 +const cameraStatus = ref('未连接') // 相机设备状态 +const femtoboltStatus = ref('未连接') // 深度相机(FemtoBolt)设备状态 +const imuStatus = ref('未连接') // IMU设备状态 +const pressureStatus = ref('未连接') // 压力传感器设备状态 +const footImgSrc = ref('') // 足底压力传感器图片 + + +const patientInfo =ref({}) +const seconds = ref(0); +const isRunning = ref(false); +const timerId = ref(null); +const blinkState = ref(false); + + const rtspImgSrc = ref('') -const camera1ImgSrc = ref('') -const camera2ImgSrc = ref('') +const camera1ImgSrc = ref('') // 相机视频流1 +const camera2ImgSrc = ref('')// 相机视频流2 + const depthCameraImgSrc = ref('') // 深度相机视频流 const screenshotLoading = ref(false) const cameraDialogVisible =ref(false) // 设置相机参数弹框 const contenGridRef =ref(null) // 实时检查整体box const wholeBodyRef = ref(null) // 身体姿态ref const videoImgRef =ref(null) // 视频流图片ref -const camera1Ref = ref(null) -const camera2Ref = ref(null) -const historyDialogVisible = ref(false) -// 录像相关变量 -let mediaRecorder = null -let recordedChunks = [] -let recordingStream = null -// 患者信息(从页面获取或通过API获取) -const patientInfo = ref({ - id: '', - name: '', - gender: '', - birth_date: '', - age: '', - height: '', - weight: '', - shoe_size: '', - phone: '', - nationality: '', - created_at: '', - sessionId: null // 检查记录ID,实际使用时应从路由或API获取 -}) -// WebSocket相关变量 -let socket = null -let devicesSocket = null -let cameraSocket = null -let femtoboltSocket = null -let imuSocket = null -let pressureSocket = null -let restartSocket = null -let frameCount = 0 - -// 后端服务器地址配置 -const BACKEND_URL = getBackendUrl() -const resDialogVisible = ref(false) -const reshandleClose = () => { - resDialogVisible.value = false -} -const cameraHandleClose = () => { - cameraDialogVisible.value = false -} -const dialogVisible = ref(false) -const handleClose = () => { - dialogVisible.value = false -} -// 表单引用 -const patientFormRef = ref() -// 表单数据 -const saveLoading = ref(false) -const patientForm = ref({ - id: '', - name: '', - gender: '', - birth_date: '', - nationality: '', - residence: '', - height: '', - weight: '', - shoe_size: '', - phone: '', - occupation: '', - workplace: '', - email: '' -}) -const occupationOptions = ref(["学生", "教师", "医生", "护士", "工程师", "程序员", "设计师", -"会计师", "律师", "警察", "消防员", "军人", "公务员", "销售", "市场营销", -"人力资源", "行政", "财务", "咨询师", "建筑师", "科研人员", "记者", "编辑", -"作家", "艺术家", "音乐家", "演员", "导演", "摄影师", "厨师", "服务员", -"司机", "快递员", "外卖员", "农民", "工人", "电工", "焊工", "机械师", -"飞行员", "空乘", "船员", "导游", "翻译", "心理咨询师", "社会工作者", -"运动员", "教练", "经纪人", "投资人", "企业家", "自由职业者"]) -const nationalityOptions = ref(["汉族", "满族", "蒙古族", "回族", "藏族", "维吾尔族", "苗族", "彝族", "壮族", -"布依族", "朝鲜族", "侗族", "瑶族", "白族", "土家族", "哈尼族", "哈萨克族", "傣族", -"黎族", "傈僳族", "佤族", "畲族", "高山族", "拉祜族", "水族", "东乡族", "纳西族", -"景颇族", "柯尔克孜族", "土族", "达斡尔族", "仫佬族", "羌族", "布朗族", "撒拉族", -"毛南族", "仡佬族", "锡伯族", "阿昌族", "普米族", "塔吉克族", "怒族", "乌孜别克族", -"俄罗斯族", "鄂温克族", "德昂族", "保安族", "裕固族", "京族", "塔塔尔族", "独龙族", -"鄂伦春族", "赫哲族", "门巴族", "珞巴族", "基诺族"]) -const diagnosticForm = ref({ - diagnosis_info: '', - treatment_info: '', - suggestion_info: '' -}) -const cameraForm = ref({ // 相机参数 - camera:{ - device_index: '', // 序号 - }, - femtobolt:{ - algorithm_type: '', // 算法类型 - depth_mode: '', // 相机模式 - depth_range_min: '', // 距离范围最小值 - depth_range_max: '', // 距离范围最大值 - }, - imu:{ - port: '', // IMU串口号 +// 处理开始/停止按钮点击 +async function handleStartStop() { + if (isRecording.value) { + // 停止录制视频 + await stopRecord() + } else { + // 开始录制视频 + await startRecord() } -}) -const calculatedAge = ref(null) -//修改 - -// 模拟历史数据 -const historyData = ref([]) -const chartoption = ref({ - backgroundColor: '#242424', - grid: { top: 0, right: 0, bottom: 0, left: 0 }, - animation: false, - series: [ - { - type: 'gauge', - radius: '180%', - center: ['50%', '91%'], - startAngle: 180, - endAngle: 0, - min: -90, - max: 90, - splitNumber: 10, - itemStyle: { - color: '#58D9F9', - shadowColor: 'rgba(0,138,255,0.45)', - shadowBlur: 10, - shadowOffsetX: 2, - shadowOffsetY: 2 - }, - progress: { - show: false, - }, - pointer: { - length: '85%', - width: 2, - offsetCenter: [0, '5%'], - itemStyle: { - color: '#ff8d00' - }, - }, - anchor: { - show: true, - showAbove: true, - size: 18, - icon: 'circle', - itemStyle: { - borderWidth: 3, - color: '#ff8d00', - borderColor: '#ff8d00', - } - }, - axisLine: { - roundCap: true, - lineStyle: { - width: 3, - color: [[1, '#0089ff']] - } - }, - axisTick: { - splitNumber: 2, - lineStyle: { - width: 2, - color: '#ffffff' - } - }, - splitLine: { - length: 12, - lineStyle: { - width: 4, - color: '#0089ff' - } - }, - axisLabel: { - //刻度颜色 - distance: 10, - color: '#ffffff', - fontSize: 10 - }, - title: { - show: false - }, - detail: { - show: false, - }, - data: [ - { - value: 0 - } - ] - } - ] -}) -// 四个设备的独立连接状态 -const cameraStatus = ref('未连接') // 相机设备状态 -const femtoboltStatus = ref('未连接') // 深度相机(FemtoBolt)设备状态 -const imuStatus = ref('未连接') // IMU设备状态 -const pressureStatus = ref('未连接') // 压力传感器设备状态 - -// 为了向后兼容,保留videoStatus但映射到cameraStatus -const videoStatus = computed(() => cameraStatus.value) -// 计时器状态 -const seconds = ref(0); -const isRunning = ref(false); -const timerId = ref(null); -const blinkState = ref(false); -const formattedTime = computed(() => { +} +const formattedTime = computed(() => { // 计算格式化后的时间 录制时间 const mins = Math.floor(seconds.value / 60); const secs = seconds.value % 60; return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; }); -const headlist = ref({ - rotation: '0', - tilt: '0', - pitch: '0' -}) // 开始计时器 const startTimer = () => { if (isRunning.value) return; @@ -860,115 +390,210 @@ const resetTimer = () => { seconds.value = 0; blinkState.value = false; }; -const validateForm = async () => { - try { - await patientFormRef.value.validate() - return true - } catch (error) { - ElMessage.error('请完善必填信息') - return false - } -} -//保存基础信息 -const handleSave = async () => { - if (!(await validateForm())) return - saveLoading.value = true - try { - await savePatient() - ElMessage.success('修改成功') - dialogVisible.value = false - saveLoading.value = false - loadPatientInfo() - } catch (error) { - ElMessage.error('修改失败:' + error.message) - saveLoading.value = false - } finally { - saveLoading.value = false - } -} -const savePatient = async () => { - const patientData = { - id: patientForm.value.id, - name: patientForm.value.name, - gender: patientForm.value.gender, - age: calculatedAge.value, - birth_date: patientForm.value.birth_date, - height: patientForm.value.height, - weight: patientForm.value.weight, - shoe_size: patientForm.value.shoe_size, - phone: patientForm.value.phone, - occupation: patientForm.value.occupation, - email: patientForm.value.email, - nationality: patientForm.value.nationality, - residence: patientForm.value.residence, - workplace: patientForm.value.workplace - } - try { - const response = await patientAPI.updatePatient(patientForm.value.id, patientData) - if (response.success) { - return response.data +const startRecord = async () => { // 开始录屏 + try { + console.log('🚀 正在开始录屏...') + startTimer() + // 验证患者信息 + if (!patientInfo.value || !patientInfo.value.sessionId) { + throw new Error('缺少患者信息,无法开始录屏') + } + let screen_location = contenGridRef.value.getBoundingClientRect() + let femtobolt_location = wholeBodyRef.value.getBoundingClientRect() + let camera1_location = camera1Ref.value?.getBoundingClientRect() + let camera2_location = camera2Ref.value?.getBoundingClientRect() + let titile_height = 24 + // 调用后端API开始录屏 + const response = await fetch(`${BACKEND_URL}/api/detection/${patientInfo.value.sessionId}/start_record`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + patient_id: patientId.value, + // 可以添加其他录屏参数 + creator_id: creatorId.value, + screen_location:[Math.round(screen_location.x), Math.round(screen_location.y) + titile_height, Math.round(screen_location.width), Math.round(screen_location.height)], + camera1_location:[ + Math.round(camera1_location.x), Math.round(camera1_location.y)+ titile_height, + Math.round(camera1_location.width), Math.round(camera1_location.height) + ], + camera2_location:[ + Math.round(camera2_location.x), Math.round(camera2_location.y)+ titile_height, + Math.round(camera2_location.width), Math.round(camera2_location.height) + ], + femtobolt_location:[Math.round(femtobolt_location.x), Math.round(femtobolt_location.y) + titile_height, Math.round(femtobolt_location.width), Math.round(femtobolt_location.height)], + + }) + }) + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`) + } + + const result = await response.json() + + if (result.success) { + // 保存会话ID和检测开始时间 + patientInfo.value.detectionStartTime = Date.now() + console.log('✅ 录屏会话创建成功,会话ID:', patientInfo.value.sessionId) + isRecording.value = true + ElMessage.success('录屏已开始') } else { - throw new Error(response.message || '修改失败') + throw new Error(result.message || '开始录屏失败') } } catch (error) { + ElMessage.error(`开始录屏失败: ${error.message}`) throw error } } -const isPreventCombo = ref(false) -function routeTo(path = '/') { - if (isPreventCombo.value === true) { - ElMessage.warning(`请勿连续点击回退按钮!`) - return - } - isPreventCombo.value = true - setTimeout(() => { - isPreventCombo.value = false - }, 2000) - router.push(path) -} -function cameraUpdate() { // 相机设置数据更新弹框 - cameraForm.value = { // 相机参数 - camera:{ - device_index: '', // 序号 - }, - femtobolt:{ - algorithm_type: '', // 算法类型 - depth_mode: '', // 相机模式 - depth_range_min: '', // 距离范围最小值 - depth_range_max: '', // 距离范围最大值 - }, - imu:{ - port: '', // IMU串口号 + +const stopRecord = async () => { // 停止录屏 + try { + resetTimer() + // 计算检测持续时间 + let duration = 0 + if (patientInfo.value.detectionStartTime) { + duration = Math.floor((Date.now() - patientInfo.value.detectionStartTime) / 1000) } + + // 调用后端API停止检测 + const response = await fetch(`${BACKEND_URL}/api/detection/${patientInfo.value.sessionId}/stop_record`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + duration: duration + }) + }) + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`) + } + isRecording.value = false + + } catch (error) { + console.error('❌ 停止检测失败:', error) + ElMessage.error(`停止检测失败: ${error.message}`) } - // 加载相机参数信息 - getDevicesInit() - } -const calculateAge = (birthDate) => { - if (!birthDate) return '-' - const today = new Date() - const birth = new Date(birthDate) - let age = today.getFullYear() - birth.getFullYear() - const monthDiff = today.getMonth() - birth.getMonth() - if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birth.getDate())) { - age-- +const isStartVideo = ref(false) +function startVideoClick() { + startRecord() + isStartVideo.value = true +} +function stopVideoClick() { + stopRecord() + isStartVideo.value = false +} +function endClick() { + emit('endChange',false) + ElMessage.success('结束监测') +} +const patientId = ref("") // 患者ID +const loadPatientInfo = async () => { // 加载患者信息 + try { + debugger + // 从路由参数获取患者ID + // patientId.value = props.selectedPatient.id + patientId.value = '202511150005' + if (patientId.value == '' || patientId.value == null) { + console.warn('未找到患者ID参数') + return + } + + // 调用API获取患者信息 + const response = await fetch(`${BACKEND_URL}/api/patients/${patientId.value}`) + if (response.ok) { + const result = await response.json() + if (result.success) { + patientInfo.value = { ...result.data, sessionId: null } + + console.log('患者信息加载成功:', patientInfo.value) + } else { + throw new Error(result.message) + } + } else { + throw new Error(`HTTP ${response.status}: ${response.statusText}`) + } + } catch (error) { + console.error('加载患者信息失败:', error) + ElMessage.warning('加载患者信息失败,请检查网络连接') } - return age } -// 返回按钮逻辑 -const handleBack = () => { - console.log('返回上一页') -} -const editPatient = () => { - // 修改患者信息 - patientForm.value = JSON.parse(JSON.stringify(patientInfo.value)) - if (patientForm.value.birth_date) { - calculatedAge.value = calculateAge(patientForm.value.birth_date) +onMounted(() => { + if (authStore.currentUser) { + creatorId.value = authStore.currentUser.id + } + + // 加载患者信息 + loadPatientInfo() + // 启动检测 + // startDetection() + // 页面加载时自动连接WebSocket + // connectWebSocket() + + // 监听页面关闭或刷新事件 + window.addEventListener('beforeunload', handleBeforeUnload) + +}) +// 开始检测 +async function startDetection() { + try { + console.log('🚀 正在开始检测...') + + // 调用后端API开始检测 + const response = await fetch(`${BACKEND_URL}/api/detection/start`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + patient_id: route.params.id, + // 可以添加其他检测参数 + creator_id: creatorId.value, + }) + }) + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`) + } + const result = await response.json() + if (result.success) { + console.log('✅ 检测开始成功') + // 保存会话ID和检测开始时间 + patientInfo.value.sessionId = result.session_id + } else { + throw new Error(result.message || '开始检测失败') + } + + } catch (error) { + console.error('💥 开始检测失败:', error) + ElMessage.error(`开始检测失败: ${error.message}`) + throw error + } +} +// 停止检测 +async function stopDetection() { + try { + // 计算检测持续时间 + let duration = 0 + // 调用后端API停止检测 + const response = await fetch(`${BACKEND_URL}/api/detection/${patientInfo.value.sessionId}/stop`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + duration: duration + }) + }) + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`) + } + } catch (error) { + console.error('❌ 停止检测失败:', error) + ElMessage.error(`停止检测失败: ${error.message}`) } - dialogVisible.value = true } -const tempInfo = ref({}) // WebSocket连接函数 function connectWebSocket() { try { @@ -1029,7 +654,7 @@ function connectWebSocket() { console.log('✅ 主WebSocket连接成功!Socket ID:', socket.id) isConnected.value = true //绘制头部仪表盘 - initchart() + // initchart() }) socket.on('connect_error', (error) => { @@ -1175,672 +800,7 @@ function connectWebSocket() { isConnected.value = false } } - -// 启动设备数据推送 -function startDeviceDataPush() { - if (devicesSocket && devicesSocket.connected) { - console.log('🚀 发送启动设备数据推送请求...') - devicesSocket.emit('start_push_data') - } else { - console.warn('⚠️ 设备Socket未连接,无法启动设备数据推送') - } -} - -// 断开WebSocket连接函数 -function disconnectWebSocket() { - try { - if (socket) { - if (socket.connected) { - console.log('正在主动断开WebSocket连接...') - - // 移除所有事件监听器 - socket.removeAllListeners() - - // 断开主连接 - socket.disconnect() - - console.log('✅ 主WebSocket连接已断开') - } - socket = null - isConnected.value = false - } - - // 断开统一设备命名空间连接 - if (devicesSocket) { - if (devicesSocket.connected) { - // 取消订阅所有设备 - try { - devicesSocket.emit('unsubscribe_device', { device_type: 'camera' }) - devicesSocket.emit('unsubscribe_device', { device_type: 'femtobolt' }) - devicesSocket.emit('unsubscribe_device', { device_type: 'imu' }) - devicesSocket.emit('unsubscribe_device', { device_type: 'pressure' }) - } catch (e) { - console.warn('取消设备订阅时出错:', e) - } - - // 移除所有事件监听器 - devicesSocket.removeAllListeners() - - // 断开连接 - devicesSocket.disconnect() - - console.log('🔗 统一设备命名空间连接已断开') - } - - devicesSocket = null - cameraSocket = null - femtoboltSocket = null - imuSocket = null - pressureSocket = null - restartSocket = null - } - - // 重置所有设备状态 - cameraStatus.value = '未连接' - femtoboltStatus.value = '未连接' - imuStatus.value = '未连接' - pressureStatus.value = '未连接' - - } catch (error) { - console.warn('断开WebSocket连接时出错:', error) - } -} - -// WebSocket重连函数 -function reconnectWebSocket() { - console.log('开始重新连接WebSocket...') - - // 先断开现有连接 - disconnectWebSocket() - - // 延迟一段时间后重新连接 - setTimeout(() => { - connectWebSocket() - console.log('WebSocket重连完成') - }, 1000) -} - - - - -// 简单的帧显示函数 -function displayFrame(base64Image) { - // 兼容旧调用:默认作为 camera1 更新 - displayCameraFrameById('camera1', base64Image) -} - -function displayCameraFrameById(deviceId, base64Image) { - if (base64Image && base64Image.length > 0) { - const url = 'data:image/jpeg;base64,' + base64Image - if (String(deviceId).toLowerCase() === 'camera2') { - camera2ImgSrc.value = url - } else { - camera1ImgSrc.value = url - // 旧变量保留(避免其它位置引用出错) - rtspImgSrc.value = url - } - } else { - console.warn('⚠️ 收到空的视频帧数据') - } -} - -// 深度相机帧显示函数 -function displayDepthCameraFrame(base64Image) { - if (base64Image && base64Image.length > 0) { - depthCameraImgSrc.value = 'data:image/jpeg;base64,' + base64Image - } else { - console.warn('⚠️ 收到空的深度相机帧数据') - } -} - - -// 头部姿态最值跟踪数据 -const headPoseMaxValues = ref({ - rotationLeftMax: 0, // 旋转-左旋最大值 - rotationRightMax: 0, // 旋转-右旋最大值 - tiltLeftMax: 0, // 倾斜-左倾最大值 - tiltRightMax: 0, // 倾斜-右倾最大值 - pitchUpMax: 0, // 俯仰-上仰最大值 - pitchDownMax: 0 // 俯仰-下俯最大值 -}) - -// 头部姿态历史最值记录数组 -const headPoseHistory = ref([]) -const headPoseData = ref({}) - -// IMU更新节流与抖动阈值(降低频繁DOM与图表更新导致的卡顿) -let lastIMUUpdateTs = 0 -const IMU_MIN_INTERVAL_MS = 33 // 约30Hz -let lastIMUValues = { rotation: null, tilt: null, pitch: null } -const IMU_CHANGE_EPS = 0.1 // 小于0.1°的变化忽略 - - -// 处理IMU头部姿态数据 -function handleIMUData(data) { - try { - if (!data) return - - // 兼容两种载荷结构: - // 1) { rotation, tilt, pitch } - // 2) { head_pose: { rotation, tilt, pitch } } - const rotation = (data.rotation ?? (data.head_pose && data.head_pose.rotation)) - const tilt = (data.tilt ?? (data.head_pose && data.head_pose.tilt)) - const pitch = (data.pitch ?? (data.head_pose && data.head_pose.pitch)) - - if (rotation === undefined || tilt === undefined || pitch === undefined) { - return - } - headlist.value.rotation = rotation // 旋转角度 - headlist.value.tilt = tilt // 倾斜角度 - headlist.value.pitch = pitch // 俯仰角度 - const now = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now() - - // 若距离上次更新时间很短且变化不明显,则跳过避免频繁DOM更新 - const tooSoon = (now - lastIMUUpdateTs) < IMU_MIN_INTERVAL_MS - const notSignificant = ( - lastIMUValues.rotation !== null && Math.abs(rotation - lastIMUValues.rotation) < IMU_CHANGE_EPS && - lastIMUValues.tilt !== null && Math.abs(tilt - lastIMUValues.tilt) < IMU_CHANGE_EPS && - lastIMUValues.pitch !== null && Math.abs(pitch - lastIMUValues.pitch) < IMU_CHANGE_EPS - ) - if (tooSoon && notSignificant) return - - lastIMUUpdateTs = now - lastIMUValues = { rotation, tilt, pitch } - - const rVal = Math.round(rotation * 10) / 10 - const pVal = Math.round(pitch * 10) / 10 - const tVal = Math.round(tilt * 10) / 10 - - if (rotationCharts && !rotationCharts.isDisposed()) { - try { - rotationCharts.setOption({ - series: [{ data: [{ value: rVal }] }] - }) - } catch (e) { - console.warn('rotationCharts setOption error:', e); - } - } - if (pitchCharts && !pitchCharts.isDisposed()) { - try { - pitchCharts.setOption({ - series: [{ data: [{ value: pVal }] }] - }) - } catch (e) { - console.warn('pitchCharts setOption error:', e); - } - } - if (tiltCharts && !tiltCharts.isDisposed()) { - try { - tiltCharts.setOption({ - series: [{ data: [{ value: tVal }] }] - }) - } catch (e) { - console.warn('tiltCharts setOption error:', e); - } - } - - // 更新最值跟踪逻辑使用原始数值(不做四舍五入) - updateHeadPoseMaxValues({ rotation, tilt, pitch }) - } catch (error) { - console.error('❌ 处理IMU数据失败:', error) - } -} - -// 更新头部姿态最值 -function updateHeadPoseMaxValues(headPose) { - try { - // 更新旋转角最值 - if (headPose.rotation < 0) { - // 左旋(负值),取绝对值的最大值 - headPoseMaxValues.value.rotationLeftMax = Math.max( - headPoseMaxValues.value.rotationLeftMax, - Math.abs(headPose.rotation) - ) - } else if (headPose.rotation > 0) { - // 右旋(正值) - headPoseMaxValues.value.rotationRightMax = Math.max( - headPoseMaxValues.value.rotationRightMax, - headPose.rotation - ) - } - - // 更新倾斜角最值 - if (headPose.tilt < 0) { - // 左倾(负值),取绝对值的最大值 - headPoseMaxValues.value.tiltLeftMax = Math.max( - headPoseMaxValues.value.tiltLeftMax, - Math.abs(headPose.tilt) - ) - } else if (headPose.tilt > 0) { - // 右倾(正值) - headPoseMaxValues.value.tiltRightMax = Math.max( - headPoseMaxValues.value.tiltRightMax, - headPose.tilt - ) - } - - // 更新俯仰角最值 - if (headPose.pitch < 0) { - // 下俯(负值),取绝对值的最大值 - headPoseMaxValues.value.pitchDownMax = Math.max( - headPoseMaxValues.value.pitchDownMax, - Math.abs(headPose.pitch) - ) - } else if (headPose.pitch > 0) { - // 上仰(正值) - headPoseMaxValues.value.pitchUpMax = Math.max( - headPoseMaxValues.value.pitchUpMax, - headPose.pitch - ) - } - - } catch (error) { - console.error('❌ 更新头部姿态最值失败:', error) - } -} - -// 清零最值并开始跟踪 -function clearAndStartTracking() { - try { - // 重置所有最值为0 - headPoseMaxValues.value = { - rotationLeftMax: 0, - rotationRightMax: 0, - tiltLeftMax: 0, - tiltRightMax: 0, - pitchUpMax: 0, - pitchDownMax: 0 - } - } catch (error) { - ElMessage.error('清零失败') - } -} - -// 保存当前最值到历史记录 -function saveMaxValuesToHistory() { - try { - // 创建当前最值的副本 - const currentMaxValues = { - id: headPoseHistory.value.length + 1, - rotationLeftMax: Number(headPoseMaxValues.value.rotationLeftMax.toFixed(1)), - rotationRightMax: Number(headPoseMaxValues.value.rotationRightMax.toFixed(1)), - tiltLeftMax: Number(headPoseMaxValues.value.tiltLeftMax.toFixed(1)), - tiltRightMax: Number(headPoseMaxValues.value.tiltRightMax.toFixed(1)), - pitchUpMax: Number(headPoseMaxValues.value.pitchUpMax.toFixed(1)), - pitchDownMax: Number(headPoseMaxValues.value.pitchDownMax.toFixed(1)), - timestamp: new Date().toLocaleString() - } - - // 添加到历史记录 - headPoseHistory.value.push(currentMaxValues) - - - // console.log('💾 头部姿态最值已保存:', currentMaxValues) - // ElMessage.success(`头部姿态最值已保存(第${currentMaxValues.id}组)`) - - // 更新历史数据表格(如果存在的话) - updateHistoryTable() - } catch (error) { - // console.error('❌ 保存最值失败:', error) - ElMessage.error('保存最值失败') - } -} - -// 更新历史数据表格 -function updateHistoryTable() { - try { - // 将头部姿态最值数据合并到现有的历史数据中 - if (headPoseHistory.value.length > 0) { - const latestData = headPoseHistory.value[headPoseHistory.value.length - 1] - - // 更新historyData数组,添加头部姿态最值数据 - const newHistoryItem = { - id: latestData.id, - rotLeft: latestData.rotationLeftMax, - rotRight: latestData.rotationRightMax, - tiltLeft: latestData.tiltLeftMax, - tiltRight: latestData.tiltRightMax, - pitchDown: latestData.pitchDownMax, - pitchUp: latestData.pitchUpMax, - timestamp: latestData.timestamp - } - // 如果historyData数组存在,则添加新数据 - if (historyData.value) { - historyData.value.push(newHistoryItem) - } - historyData.value.sort((a, b) => b.id - a.id); - console.log('📋 历史数据表格已更新') - } - } catch (error) { - console.error('❌ 更新历史数据表格失败:', error) - } -} -const footPressure = ref({ - left_front: '', - left_rear: '', - right_front: '', - right_rear: '', - left_total: '', - right_total: '', - total_pressure: '' -}) -const footImgSrc = ref('') -// 处理压力传感器足部压力数据 -function handlePressureData(data) { - try { - if (data && data.foot_pressure) { - const pressureData = data.foot_pressure - - // 更新足部压力数据 - // 显示分区压力值 - if (pressureData.pressure_zones) { - footPressure.value = pressureData.pressure_zones - } - - - // 处理压力图片 - if (pressureData.pressure_image) { - // console.log(' 📊 接收到压力分布图片 (base64格式)') - // 这里可以将图片显示在界面上 - if (pressureData.pressure_image && pressureData.pressure_image.length > 0) { - footImgSrc.value = pressureData.pressure_image - } else { - console.warn('⚠️ 收到空的压力传感器数据图') - } - } - } - } catch (error) { - console.error('❌ 处理压力传感器数据失败:', error) - } -} - - -async function handleDiagnosticInfo(status) { - try { - // 检查是否有活跃的会话ID - if (!patientInfo.value.sessionId) { - throw new Error('缺少会话Id') - } - // 调用后端API采集检测数据 - const response = await fetch(`${BACKEND_URL}/api/detection/${patientInfo.value.sessionId}/save-info`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - diagnosis_info: diagnosticForm.diagnosis_info, - treatment_info: diagnosticForm.treatment_info, - suggestion_info: diagnosticForm.suggestion_info, - status: status, - session_id: patientInfo.value.sessionId, - }) - }) - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`) - } - - const result = await response.json() - if (result.success) { - // 显示成功消息 - ElMessage.success({ - message: status + '诊断信息成功', - duration: 5000 - }) - - } else { - throw new Error(result.message || '诊断信息失败') - } - } catch (error) { - ElMessage.error({ - message: errorMessage, - duration: 5000 - }) - - } finally { - - } -} - -// 保存检测数据 -async function saveDetectionData() { - console.log(tempInfo.value) - if (screenshotLoading.value) return - - try { - screenshotLoading.value = true - // 显示保存进度 - ElMessage.info('正在保存检测截图数据...') - - // 检查是否有活跃的会话ID - if (!patientInfo.value.sessionId) { - throw new Error('请先开始检测再进行数据保存') - } - const base64 = 'data:image/jpeg;base64,' - - let body_image = "" - if(tempInfo.value.femtobolt_frame != null - && tempInfo.value.femtobolt_frame.depth_image != null){ - body_image = base64 + tempInfo.value.femtobolt_frame.depth_image - } - - let pressure_image = "" - let foot_data = "" - if(tempInfo.value.pressure_data != null - && tempInfo.value.pressure_data.foot_pressure != null - && tempInfo.value.pressure_data.foot_pressure.pressure_image != null){ - pressure_image = tempInfo.value.pressure_data.foot_pressure.pressure_image - foot_data = tempInfo.value.pressure_data.foot_pressure.pressure_zones - } - let foot_image="" - if(tempInfo.value.camera_frame != null - && tempInfo.value.camera_frame.image != null ){ - foot_image=base64 + tempInfo.value.camera_frame.image - } - - let head_pose={} - if(tempInfo.value.imu_data != null ){ - head_pose=tempInfo.value.imu_data - } - if(headPoseMaxValues !=null){ - head_pose.headPoseMaxValues = headPoseMaxValues.value - } - - let screen_location = contenGridRef.value.getBoundingClientRect() - // 调用后端API保存截图 - const result = await sendDetectionData({ - - session_id: patientInfo.value.sessionId, - patient_id: patientInfo.value.id, - - head_pose:head_pose, - body_pose:null, - body_image: body_image, - - foot_data:foot_data, - foot_image:foot_image, - foot_data_image:pressure_image, - screen_image:null - - }) - - // 显示成功消息和文件路径 - ElMessage.success({ - message: `检测数据保存成功!`, - duration: 5000 - }) - - - } catch (error) { - console.error('❌ 检测数据保存失败:', error) - - // 根据错误类型显示不同的错误消息 - let errorMessage = '检测数据保存失败' - if (error.message.includes('网络连接失败')) { - errorMessage = '网络连接失败,请检查后端服务是否正常运行' - } else if (error.message.includes('服务器错误')) { - errorMessage = error.message - } else if (error.message.includes('未找到检测数据区域')) { - errorMessage = '检测数据区域不存在,请刷新页面重试' - } else if (error.message.includes('未找到检测数据')) { - errorMessage = '检测数据不存在,请刷新页面重试' - } else { - errorMessage = `检测数据保存失败: ${error.message}` - } - - ElMessage.error({ - message: errorMessage, - duration: 5000 - }) - - } finally { - screenshotLoading.value = false - } -} - -// 调用后端API保存检测数据 -async function sendDetectionData(data) { - try { - const response = await fetch(`${BACKEND_URL}/api/detection/${patientInfo.value.sessionId}/collect` - , { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(data) - }) - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`) - } - - const result = await response.json() - - if (result.success) { - console.log('📸 截图保存成功:', result.filepath) - return result - } else { - throw new Error(result.message || '保存失败') - } - - } catch (error) { - console.error('💥 保存截图API调用失败:', error) - - if (error.name === 'TypeError' && error.message.includes('fetch')) { - throw new Error('网络连接失败,请检查后端服务是否正常运行') - } else if (error.message.includes('HTTP')) { - throw new Error(`服务器错误: ${error.message}`) - } else { - throw new Error(error.message) - } - } -} - -// 处理开始/停止按钮点击 -async function handleStartStop() { - if (isRecording.value) { - // 停止录制视频 - await stopRecord() - } else { - // 开始录制视频 - await startRecord() - } -} -// 开始检测 -async function startDetection() { - try { - console.log('🚀 正在开始检测...') - - // 调用后端API开始检测 - const response = await fetch(`${BACKEND_URL}/api/detection/start`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - patient_id: route.params.id, - // 可以添加其他检测参数 - creator_id: creatorId.value, - }) - }) - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`) - } - const result = await response.json() - if (result.success) { - console.log('✅ 检测开始成功') - // 保存会话ID和检测开始时间 - patientInfo.value.sessionId = result.session_id - } else { - throw new Error(result.message || '开始检测失败') - } - - } catch (error) { - console.error('💥 开始检测失败:', error) - ElMessage.error(`开始检测失败: ${error.message}`) - throw error - } -} - -// 停止检测 -async function stopDetection() { - try { - // 计算检测持续时间 - let duration = 0 - // 调用后端API停止检测 - const response = await fetch(`${BACKEND_URL}/api/detection/${patientInfo.value.sessionId}/stop`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - duration: duration - }) - }) - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`) - } - } catch (error) { - console.error('❌ 停止检测失败:', error) - ElMessage.error(`停止检测失败: ${error.message}`) - } -} -// 格式化日期方法 -const formatDate = (dateString) => { - if (!dateString) return '-' - const date = new Date(dateString) - return date.toLocaleDateString('zh-CN') -} -const patientId = ref("") -// 加载患者信息 -const loadPatientInfo = async () => { - try { - // 从路由参数获取患者ID - patientId.value = route.params.id - if (patientId.value == '' || patientId.value == null) { - console.warn('未找到患者ID参数') - return - } - - // 调用API获取患者信息 - const response = await fetch(`${BACKEND_URL}/api/patients/${patientId.value}`) - if (response.ok) { - const result = await response.json() - if (result.success) { - patientInfo.value = { ...result.data, sessionId: null } - - console.log('患者信息加载成功:', patientInfo.value) - } else { - throw new Error(result.message) - } - } else { - throw new Error(`HTTP ${response.status}: ${response.statusText}`) - } - } catch (error) { - console.error('加载患者信息失败:', error) - ElMessage.warning('加载患者信息失败,请检查网络连接') - } -} - +const creatorId = ref('') // 处理页面关闭或刷新事件 const handleBeforeUnload = (event) => { console.log('页面即将关闭,正在清理资源...') @@ -1853,88 +813,29 @@ const handleBeforeUnload = (event) => { console.log('✅ 资源清理完成') } -const creatorId = ref('') -let rotationCharts = null; -let pitchCharts = null; -let tiltCharts = null; -const initchart = () => { - // 确保 DOM 元素已经渲染 - nextTick(() => { - const chartDom = document.getElementById('rotationChartId'); - if (chartDom) { - // 如果图表已经存在,先销毁 - if (rotationCharts) { - try { - rotationCharts.dispose(); - } catch (e) { - console.warn('rotationCharts dispose error:', e); - } - rotationCharts = null; - } - rotationCharts = echarts.init(chartDom); - rotationCharts.setOption(chartoption.value); - } else { - console.warn('找不到 ID 为 rotationChartId 的 DOM 元素'); - } - const chartDom2 = document.getElementById('pitchChartId'); - if (chartDom2) { - // 如果图表已经存在,先销毁 - if (pitchCharts) { - try { - pitchCharts.dispose(); - } catch (e) { - console.warn('pitchCharts dispose error:', e); - } - pitchCharts = null; - } - pitchCharts = echarts.init(chartDom2); - pitchCharts.setOption(chartoption.value); - } else { - console.warn('找不到 ID 为 pitchChartId 的 DOM 元素'); - } - const chartDom3 = document.getElementById('tiltChartId'); - if (chartDom3) { - // 如果图表已经存在,先销毁 - if (tiltCharts) { - try { - tiltCharts.dispose(); - } catch (e) { - console.warn('tiltCharts dispose error:', e); - } - tiltCharts = null; - } - tiltCharts = echarts.init(chartDom3); - tiltCharts.setOption(chartoption.value); - } else { - console.warn('找不到 ID 为 tiltChartId 的 DOM 元素'); - } - // 添加窗口大小调整监听器 - window.addEventListener('resize', () => { - if (rotationCharts && !rotationCharts.isDisposed()) { - try { - rotationCharts.resize(); - } catch (e) { - console.warn('rotationCharts resize error:', e); - } - } - if (pitchCharts && !pitchCharts.isDisposed()) { - try { - pitchCharts.resize(); - } catch (e) { - console.warn('pitchCharts resize error:', e); - } - } - if (tiltCharts && !tiltCharts.isDisposed()) { - try { - tiltCharts.resize(); - } catch (e) { - console.warn('tiltCharts resize error:', e); - } - } - }); - }); + + + +// 深度相机帧显示函数 +function displayDepthCameraFrame(base64Image) { + if (base64Image && base64Image.length > 0) { + depthCameraImgSrc.value = 'data:image/jpeg;base64,' + base64Image + } else { + console.warn('⚠️ 收到空的深度相机帧数据') + } } -const calibrationClick = async () => { +// 头部姿态最值跟踪数据 +const headPoseMaxValues = ref({ + rotationLeftMax: 0, // 旋转-左旋最大值 + rotationRightMax: 0, // 旋转-右旋最大值 + tiltLeftMax: 0, // 倾斜-左倾最大值 + tiltRightMax: 0, // 倾斜-右倾最大值 + pitchUpMax: 0, // 俯仰-上仰最大值 + pitchDownMax: 0 // 俯仰-下俯最大值 +}) + + +const calibrationClick = async () => { // 校准按钮点击事件 const response = await fetch(`${BACKEND_URL}/api/devices/calibrate/imu`, { method: 'POST', headers: { @@ -1953,228 +854,23 @@ const calibrationClick = async () => { } } - -const cameraSubmit = async () => { - const response = await fetch(`${BACKEND_URL}/api/config/devices/all`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(cameraForm.value) - }) - if (response.ok) { - const result = await response.json() - if (result.success) { - ElMessage.success(result.message) - cameraDialogVisible.value = false - } else { - ElMessage.error(result.message) - } - } -} - -// 加载相机参数信息 -const getDevicesInit = async () => { +// 清零最值并开始跟踪 +function clearAndStartTracking() { try { - // 调用API获取患者信息 - const response = await fetch(`${BACKEND_URL}/api/config/devices`) - if (response.ok) { - const result = await response.json() - if (result.success) { - console.log('相机参数加载成功:', result.data) - cameraForm.value = result.data - cameraDialogVisible.value = true - // console.log('相机参数加载成功:', patientInfo.value) - } else { - throw new Error(result.message) - } - } else { - throw new Error(`HTTP ${response.status}: ${response.statusText}`) + // 重置所有最值为0 + headPoseMaxValues.value = { + rotationLeftMax: 0, + rotationRightMax: 0, + tiltLeftMax: 0, + tiltRightMax: 0, + pitchUpMax: 0, + pitchDownMax: 0 } } catch (error) { - console.error('加载相机参数失败:', error) - ElMessage.warning('加载相机参数失败,请检查网络连接') + ElMessage.error('清零失败') } } -onMounted(() => { - - if (authStore.currentUser) { - console.log(authStore.currentUser) - creatorId.value = authStore.currentUser.id - } - - // 加载患者信息 - loadPatientInfo() - // 启动检测 - startDetection() - // 页面加载时自动连接WebSocket - connectWebSocket() - - // 监听页面关闭或刷新事件 - window.addEventListener('beforeunload', handleBeforeUnload) - -}) - -onUnmounted(() => { - console.log('🔄 Detection组件正在卸载,开始清理资源...') - - try { - // 清理定时器 - if (timerId.value) { - clearInterval(timerId.value) - timerId.value = null - console.log('✅ 定时器已清理') - } - - // 停止录制 - if (isRecording.value === true) { - stopRecord() - console.log('✅ 录制已停止') - } - - // 停止检测 - stopDetection() - console.log('✅ 检测已停止') - - // 断开WebSocket连接 - disconnectWebSocket() - console.log('✅ WebSocket连接已断开') - - // 清理图表资源 - if (tiltCharts) { - try { - tiltCharts.dispose() - console.log('✅ tiltCharts已清理') - } catch (e) { - console.warn('tiltCharts dispose error in onUnmounted:', e) - } - tiltCharts = null - } - - if (rotationCharts) { - try { - rotationCharts.dispose() - console.log('✅ rotationCharts已清理') - } catch (e) { - console.warn('rotationCharts dispose error in onUnmounted:', e) - } - rotationCharts = null - } - - if (pitchCharts) { - try { - pitchCharts.dispose() - console.log('✅ pitchCharts已清理') - } catch (e) { - console.warn('pitchCharts dispose error in onUnmounted:', e) - } - pitchCharts = null - } - - // 移除页面关闭事件监听器 - window.removeEventListener('beforeunload', handleBeforeUnload) - console.log('✅ beforeunload事件监听器已移除') - - console.log('🎉 Detection组件资源清理完成') - - } catch (error) { - console.error('❌ Detection组件卸载时出错:', error) - } -}) - -const startRecord = async () => { // 开始录屏 - try { - console.log('🚀 正在开始录屏...') - startTimer() - // 验证患者信息 - if (!patientInfo.value || !patientInfo.value.sessionId) { - throw new Error('缺少患者信息,无法开始录屏') - } - let screen_location = contenGridRef.value.getBoundingClientRect() - let femtobolt_location = wholeBodyRef.value.getBoundingClientRect() - let camera1_location = camera1Ref.value?.getBoundingClientRect() - let camera2_location = camera2Ref.value?.getBoundingClientRect() - let titile_height = 24 - // 调用后端API开始录屏 - const response = await fetch(`${BACKEND_URL}/api/detection/${patientInfo.value.sessionId}/start_record`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - patient_id: patientId.value, - // 可以添加其他录屏参数 - creator_id: creatorId.value, - screen_location:[Math.round(screen_location.x), Math.round(screen_location.y) + titile_height, Math.round(screen_location.width), Math.round(screen_location.height)], - camera1_location:[ - Math.round(camera1_location.x), Math.round(camera1_location.y)+ titile_height, - Math.round(camera1_location.width), Math.round(camera1_location.height) - ], - camera2_location:[ - Math.round(camera2_location.x), Math.round(camera2_location.y)+ titile_height, - Math.round(camera2_location.width), Math.round(camera2_location.height) - ], - femtobolt_location:[Math.round(femtobolt_location.x), Math.round(femtobolt_location.y) + titile_height, Math.round(femtobolt_location.width), Math.round(femtobolt_location.height)], - - }) - }) - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`) - } - - const result = await response.json() - - if (result.success) { - // 保存会话ID和检测开始时间 - patientInfo.value.detectionStartTime = Date.now() - console.log('✅ 录屏会话创建成功,会话ID:', patientInfo.value.sessionId) - isRecording.value = true - ElMessage.success('录屏已开始') - } else { - throw new Error(result.message || '开始录屏失败') - } - } catch (error) { - ElMessage.error(`开始录屏失败: ${error.message}`) - throw error - } -} - -const stopRecord = async () => { // 停止录屏 - try { - resetTimer() - // 计算检测持续时间 - let duration = 0 - if (patientInfo.value.detectionStartTime) { - duration = Math.floor((Date.now() - patientInfo.value.detectionStartTime) / 1000) - } - - // 调用后端API停止检测 - const response = await fetch(`${BACKEND_URL}/api/detection/${patientInfo.value.sessionId}/stop_record`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - duration: duration - }) - }) - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`) - } - isRecording.value = false - - } catch (error) { - console.error('❌ 停止检测失败:', error) - ElMessage.error(`停止检测失败: ${error.message}`) - } -} -function routerClick(){ - historyDialogVisible.value = true -} - -const isRestart = ref(false) // 防止连击 - // 单个刷新数据 function refreshClick(type) { // 检查是否在冷却期内 @@ -2203,792 +899,397 @@ function refreshClick(type) { console.warn('⚠️ Socket服务未连接,无法重启设备!') } } + +// 处理压力传感器足部压力数据 +function handlePressureData(data) { + try { + if (data && data.foot_pressure) { + const pressureData = data.foot_pressure + + // 更新足部压力数据 + // 显示分区压力值 + if (pressureData.pressure_zones) { + footPressure.value = pressureData.pressure_zones + } + + + // 处理压力图片 + if (pressureData.pressure_image) { + // console.log(' 📊 接收到压力分布图片 (base64格式)') + // 这里可以将图片显示在界面上 + if (pressureData.pressure_image && pressureData.pressure_image.length > 0) { + footImgSrc.value = pressureData.pressure_image + } else { + console.warn('⚠️ 收到空的压力传感器数据图') + } + } + } + } catch (error) { + console.error('❌ 处理压力传感器数据失败:', error) + } +} +function displayCameraFrameById(deviceId, base64Image) { // 显示相机帧 + if (base64Image && base64Image.length > 0) { + const url = 'data:image/jpeg;base64,' + base64Image + if (String(deviceId).toLowerCase() === 'camera2') { + camera2ImgSrc.value = url + } else { + camera1ImgSrc.value = url + // 旧变量保留(避免其它位置引用出错) + rtspImgSrc.value = url + } + } else { + console.warn('⚠️ 收到空的视频帧数据') + } +} + - - \ No newline at end of file diff --git a/frontend/src/renderer/src/views/Header.vue b/frontend/src/renderer/src/views/Header.vue index e67329c4..bd9803a1 100644 --- a/frontend/src/renderer/src/views/Header.vue +++ b/frontend/src/renderer/src/views/Header.vue @@ -14,16 +14,13 @@
登录时间:{{ time }}
- +
@@ -86,18 +83,19 @@ const handleUserCommand = (command) => { - switch (command) { - case 'profile': - viewInfoClick() - // 个人信息 - break - case 'settings': - // 系统设置 - break - case 'logout': - handleLogout() - break - } + handleLogout() + // switch (command) { + // case 'profile': + // viewInfoClick() + // // 个人信息 + // break + // case 'settings': + // // 系统设置 + // break + // case 'logout': + // handleLogout() + // break + // } } const dialogVisible =ref(false) function viewInfoClick(){ @@ -214,7 +212,7 @@ } .header { - height: 50px; + height: 60px; background: #323232; border-bottom: none; display: flex; @@ -240,17 +238,18 @@ width: 26px; height: 26px; border-radius: 4px; - background: #0099ff; + background: rgba(38, 111, 255, 1); text-align: center; padding-top: 3px; } .system-title { margin: 0; - font-family: 微软雅黑, sans-serif; - font-weight: 400; + font-family: 'Noto Sans SC'; + font-weight: 700; font-style: normal; font-size: 22px; + color: #FFFFFF; color: rgb(255, 255, 255); display: flex; align-items: center; @@ -287,15 +286,15 @@ font-size: 12px; margin-left: 8px; } - .badge-invalid { background-color: #8b0000; color: #fff; } - .badge-trial { background-color: #ff8c00; color: #fff; } - .badge-valid { background-color: #2e8b57; color: #fff; } + .badge-invalid { background-color: rgba(67, 67, 67, 1); color: #949494; } + .badge-trial { background-color: rgba(67, 67, 67, 1); color: #949494; } + .badge-valid { background-color: rgba(38, 111, 255, 1); color: #fff; } .activate-btn { margin-left: 8px; padding: 2px 10px; font-size: 12px; - border: 1px solid #409EFF; - background-color: #409EFF; + border: 1px solid rgba(38, 111, 255, 1); + background-color: rgba(38, 111, 255, 1); color: #fff; border-radius: 12px; cursor: pointer; @@ -316,4 +315,15 @@ box-shadow: 0 0 0 1px transparent inset; border-color: transparent !important; } +.user-line{ + width: 1px; + height: 15px; + margin: 0 10px; + background-color: #949494; +} +.user-return:hover{ + cursor: pointer; + color: rgb(0, 140, 255); + text-decoration: underline; +} \ No newline at end of file diff --git a/frontend/src/renderer/src/views/Login.vue b/frontend/src/renderer/src/views/Login.vue index f1229753..6a90148a 100644 --- a/frontend/src/renderer/src/views/Login.vue +++ b/frontend/src/renderer/src/views/Login.vue @@ -1,67 +1,69 @@