From 196240b21f46b7a69f02422ddc76c899ca2a269d Mon Sep 17 00:00:00 2001 From: renna <576157508@qq.com> Date: Mon, 14 Jul 2025 11:05:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B9=B3=E5=8F=B0=E6=A6=82?= =?UTF-8?q?=E8=A7=88=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 3 + .env.production | 2 + .env.staging | 2 + README.md | 39 +- src/api/monitor/carRunInfo.js | 70 + src/assets/images/alarm_car.png | Bin 0 -> 1807 bytes src/assets/images/arrow.png | Bin 0 -> 869 bytes src/assets/images/close_icon.png | Bin 0 -> 224 bytes src/assets/images/warning_car.png | Bin 0 -> 1859 bytes src/assets/images/weather_icon.png | Bin 0 -> 550 bytes src/assets/images/weather_station.png | Bin 0 -> 472 bytes src/components/car/detail/TrackPlayback.vue | 341 ++++- .../map/controls/LayerSwitcher copy.vue | 1180 ----------------- src/components/map/controls/LayerSwitcher.vue | 10 +- src/components/map/controls/README.md | 167 +++ .../map/controls/VehicleAnimationSystem.vue | 688 ++++++++++ .../map/controls/VehicleDetailPopup.vue | 206 +++ .../map/controls/VehicleLabelSystem.vue | 299 +++++ .../controls/VehicleMovementControl copy.vue | 677 ---------- .../map/controls/VehicleMovementControl.vue | 999 ++++++++++++-- .../VehicleMovementControlRefactored.vue | 1097 +++++++++++++++ .../map/controls/VehicleStyleManager.vue | 220 +++ .../map/controls/WeatherStationPopup.vue | 187 +++ src/components/map/info/AlarmNotification.vue | 33 +- src/components/map/info/CarDetail.vue | 11 +- src/components/map/info/eventlist.vue | 4 +- src/router/index.js | 15 +- src/utils/test_websocket.html | 2 +- src/utils/websocket.js | 12 + src/views/car/monitor/detail.vue | 8 +- src/views/car/park/index.vue | 18 +- src/views/platform/index.vue | 280 +++- vite.config.js | 2 +- 33 files changed, 4464 insertions(+), 2108 deletions(-) create mode 100644 src/api/monitor/carRunInfo.js create mode 100644 src/assets/images/alarm_car.png create mode 100644 src/assets/images/arrow.png create mode 100644 src/assets/images/close_icon.png create mode 100644 src/assets/images/warning_car.png create mode 100644 src/assets/images/weather_icon.png create mode 100644 src/assets/images/weather_station.png delete mode 100644 src/components/map/controls/LayerSwitcher copy.vue create mode 100644 src/components/map/controls/README.md create mode 100644 src/components/map/controls/VehicleAnimationSystem.vue create mode 100644 src/components/map/controls/VehicleDetailPopup.vue create mode 100644 src/components/map/controls/VehicleLabelSystem.vue delete mode 100644 src/components/map/controls/VehicleMovementControl copy.vue create mode 100644 src/components/map/controls/VehicleMovementControlRefactored.vue create mode 100644 src/components/map/controls/VehicleStyleManager.vue create mode 100644 src/components/map/controls/WeatherStationPopup.vue diff --git a/.env.development b/.env.development index 6eeb8bb..dc4c90b 100644 --- a/.env.development +++ b/.env.development @@ -6,3 +6,6 @@ VITE_APP_ENV = 'development' # 青岛机场无人驾驶车辆协同云平台/开发环境 VITE_APP_BASE_API = '/dev-api' + +# WebSocket配置 +VITE_APP_WEBSOCKET_URL=ws://10.0.0.126:8080/collision diff --git a/.env.production b/.env.production index 6910509..e7596e3 100644 --- a/.env.production +++ b/.env.production @@ -7,5 +7,7 @@ VITE_APP_ENV = 'production' # 青岛机场无人驾驶车辆协同云平台/生产环境 VITE_APP_BASE_API = '/prod-api' +VITE_APP_WEBSOCKET_URL='ws://10.0.0.124:8080/collision' + # 是否在打包时开启压缩,支持 gzip 和 brotli VITE_BUILD_COMPRESS = gzip \ No newline at end of file diff --git a/.env.staging b/.env.staging index 5d43537..f1ae977 100644 --- a/.env.staging +++ b/.env.staging @@ -7,5 +7,7 @@ VITE_APP_ENV = 'staging' # 青岛机场无人驾驶车辆协同云平台/生产环境 VITE_APP_BASE_API = '/stage-api' +VITE_APP_WEBSOCKET_URL='ws://10.0.0.124:8080/collision' + # 是否在打包时开启压缩,支持 gzip 和 brotli VITE_BUILD_COMPRESS = gzip \ No newline at end of file diff --git a/README.md b/README.md index f3e5f5b..78fe374 100644 --- a/README.md +++ b/README.md @@ -124,4 +124,41 @@ function getUserOptions() { } 使用SockJS + STOMP协议 -滑出蓝色 滑入黄色 \ No newline at end of file +滑出蓝色 滑入黄色 + +20250711关键改进说明 +1. 平滑动画核心系统 +​​动画循环引擎​​:使用 requestAnimationFrame 创建流畅的60FPS动画循环 +​​运动预测算法​​: +记录车辆移动历史轨迹(最多3个点) +计算运动方向向量用于预测后续位置 +​​物理引擎​​: +基于真实速度计算每帧最大移动距离 +方向插值时考虑车速影响(车速越高转向越慢) +2. 新数据结构 +vehicleAnimations:存储所有平滑动画所需数据 +当前位置和方向 +目标位置和方向 +最后更新时间 +预测向量 +vehicleMotionHistory:存储最近位置点用于轨迹预测 +3. 增强的位置更新逻辑 +收到新位置时记录历史点 +计算历史点间的移动向量 +设置目标位置时包含预测偏移量 +当超过300ms没有新数据时使用预测向量继续移动 +4. 性能优化 +距离阈值检查(0.1米)避免不必要的计算 +角度归一化处理0-360度边界情况 +使用缓动函数使运动曲线更自然 +5. 暴露控制接口 +通过defineExpose提供了三个新方法: + +startVehicleSmoothing():启动平滑动画 +stopVehicleSmoothing():停止平滑动画 +resetVehicleAnimations():重置所有动画数据 +使用建议 +将此组件整合到现有项目中 +调用startVehicleSmoothing()启动平滑效果 +处理WebSocket消息时继续调用updateVehiclePosition() +当组件隐藏时调用stopVehicleSmoothing()节省资源 \ No newline at end of file diff --git a/src/api/monitor/carRunInfo.js b/src/api/monitor/carRunInfo.js new file mode 100644 index 0000000..7418311 --- /dev/null +++ b/src/api/monitor/carRunInfo.js @@ -0,0 +1,70 @@ +import request from '@/utils/request' + +// 车辆运动信息管理 +// 查询车辆运动信息列表 +export function listCarRunInfo(query) { + return request({ + url: '/system/vehicle_location/list', + method: 'get', + params: query + }) +} + +// 导出车辆运动信息列表 +export function exportCarRunInfo(query) { + return request({ + url: '/system/vehicle_location/export', + method: 'post', + params: query + }) +} + +// 根据车辆ID查询车辆运动信息列表 +export function listCarRunInfoByVehicleId(vehicleId, query) { + return request({ + url: '/system/vehicle_location/vehicle/' + vehicleId, + method: 'get', + params: query + }) +} + +// 根据车牌号查询车辆运动信息列表 +export function listCarRunInfoByLicensePlate(licensePlate, query) { + return request({ + url: '/system/vehicle_location/plate/' + licensePlate, + method: 'get', + params: query + }) +} + +// 根据车辆ID查询车辆最新位置信息 +export function getLatestLocationByVehicleId(vehicleId) { + return request({ + url: '/system/vehicle_location/latest/vehicle/' + vehicleId, + method: 'get' + }) +} + +// 根据车牌号查询车辆最新位置信息 +export function getLatestLocationByLicensePlate(licensePlate) { + return request({ + url: '/system/vehicle_location/latest/plate/' + licensePlate, + method: 'get' + }) +} + +// 删除调度日志 +export function delJobLog(jobLogId) { + return request({ + url: '/monitor/jobLog/' + jobLogId, + method: 'delete' + }) +} + +// 清空调度日志 +export function cleanJobLog() { + return request({ + url: '/monitor/jobLog/clean', + method: 'delete' + }) +} diff --git a/src/assets/images/alarm_car.png b/src/assets/images/alarm_car.png new file mode 100644 index 0000000000000000000000000000000000000000..618b5c138f70fefa684b87671329e71c6fdf4e26 GIT binary patch literal 1807 zcmV+q2k`ibP)Q9=&{Bu~u?XSjrlpp) z*g}O;gsS+$h@wKo2VzF>9SBA;7@UMjoMhrW?)%>J+Iuh8Irp5Cd&Zd<1%K%tX7<^y zwZHYPZ?C-v;M?*|FRZ(Ph>Qw$jp1qw@xJ@^(BMPCe5v)H&3lg>1bA9wWF%VqMRgj$ z*=#M>gpxy z*AQi7fdxj;QTij!SjA)@2~@c$x4=Oic8G=M7VAjs;*oY^Yy6f1&M224b_|j;-2{-&R*;`gm)tV>l@dkmAEMi5)NDcncpt+Qg|_`otX@ zExcBDHtu*I8SetZB1S?8ixS>^x1nF!kl`Cg^RO@BlCgEn^ftF^YH7hS7SaHeN*I}O z;k92+t7nua^{W-@<43l!hXjMQv1i!D`LYDh$c@&mC-grwGNn--eR&7Jdc6U=qBx66Bf22mnMZB{xrCSSOkQ*utQ2%ELt=bPbhJ zM&d`uYGBNizP1W$g_#0?6oN2LWMPZRZg^l5d|a1!`loBz&7gFT?pRN}4@KFDZA!3| zlJoa(hTk2j`patDcS=SMSI9JfBlwLwS!M2h_W3uI^Amu-Hp=OZ8nsu|X zS_wU%Fm=Z?Vudsi+?@&ysnAGAKpm`W%w-w7JqtL3Ax_ph;hQgpj)mw2bbRV?5GJ!_ z@30O44&OJ_Z3e1b(5!1db4nZUhl3pglFy|4slWf=TOazp&ka_$n*v7ygLE2O6Scxq z8igWt`-(FaCN$Yu9bcy*cahP!|8Vd5>pALNFn>X^nTh5)vct$HbdYPu_f44suyf~5 zeB+I`9cw_lC{-8?4|R+5PU=)P-H??GogUwJw3V^I3&KW!E&9=}2Xy@)YJ*wfE5idJ z{V=r#`N7q!rF|wf^BSfpDz1qY*AdMWfKsWXVSL=FpKkvvYwGKW*#484dxdFGoC~LI z+e=*d<+c*ivYIS-VN|Oow&8q2!@%GGEG>4LP6q#z2mLp?gD*Vh^*@J#%M4l#--h|Q zOsxjfKXg|TQg~zrM{Zw}6`3L8@=BBQ4C$ugw(Ya?{a2KWw{1|RQV1D?s27U|SgCZN zOS8rBV{B}aPtUI}05>*q1BNKAD+f)(C&tJ&Ew`r91X_8av_*V`F2alQCm_ xd^`aARsNBoHANoS7#$roA-pQ^tJwK^%4fan*vH$E#q$6F002ovPDHLkV1hh7e%=58 literal 0 HcmV?d00001 diff --git a/src/assets/images/arrow.png b/src/assets/images/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..cb9bef3473fd361a1da8261b53131a79deebecb7 GIT binary patch literal 869 zcmV-r1DgDaP)HMMKA*`=J{UtT+exP-t#$|R!J8Q_uYH`{LbI2LafOe?ti~G+MiUCaVIr!WW+p4qLE0C(grKZSxo1Lz_q`ulOjQ zv$J(|b3o_OG}?cvwyZ1?Tn zwmK(J#)t}3f-y2e&X5y|Vv6FWQYisD0%<-vVdH%Q!DFarFuSA=6l2b4j7p^fI*BL@ zBp-up(3t{#{_@Q&bo>H_?EEbapVzFezi4O!0vxJe|WImtY zKpAqD0?~mIzfdToB7ET(DYT)h`u@Y<{?ivbx7GLMbUJ-0m&;|4Z^C$n1LoPItoxP5 zZ1Z4aEb|l$$t)!U?GT?FwZm0|Ai+Mv;C{rJev$`^mApv7sy%}|8l|P`nj%`_nD|jzS5~|F>z@Rn{zyw&fP!eZG<)1D`XmbDmE?r*$zFsT1;gO=g3yFwRkGuZ!Rn`&@j?;L}3 Ren1B>c)I$ztaD0e0su+AP1yhd literal 0 HcmV?d00001 diff --git a/src/assets/images/warning_car.png b/src/assets/images/warning_car.png new file mode 100644 index 0000000000000000000000000000000000000000..4710083dc69766f05b4f12d0c4d1eab369d03a4d GIT binary patch literal 1859 zcmV-J2fX-+P)EP96SloO1Aiz=FrChw-P1WXnsA>uzTyf%ST?CDuny?eNLY|d2&?{ z?CQ$DIY6KM6-ntI&-(BC>hYPf*R%>&=tVT6n=9x*bqmG{5|lYm&ta-|>Pv%P+tMRG zHP?_oAAWS|p)R4S6B9=pv_-e;;8z2nrQAc8ZGNDBv-jy&YoV{+2Lgg?s2K)Vqcy=aA>sm!!=iQ4-D*aRx_BdZT)^j^|!TB?AS|< z$C!j3@^;~SSS?rm8R0f&xDGEhwYnHc|D2Hg91ofocrLv3{43QnGmGI5fHv$JbRQ%q zT^Htb$H>UYiX*o&N?XDMLKp*7;7Rt>gC`ai2zzgcvcWoFzBDc>B`6V{HL|EHIooPR z@O6)f@B0s5dq;9~UXE!$K<2r+@L;)V&Po5qOXyD`K!|`c-@3a4_ z`JohIOAnTA+REnNv$3<8vt)}?<>==}cc1>utl}{aoZsHk|NK;0k01MY z{Q~(z2nmP`0QKaT4-f%k04w7rO(4mp=qa72g3Qzqh)eU8R@MXj&W(rWixU$^2n53{ zfXBax(6T+&(V`?do>s-}AeWdl$C(IeU87%R`(wfNZZEHQ`j(&Z0fsWMGTt>lqkjF| zl%CiIo64n253_@JyXB%fG$HJuDb@#xf#elA^K9ceIsKv(&79%P*Uc z(xcL-U--vo-5WM_!p(_r47J+eSQNlAsAt0vO>S4nP@xPJS4siR8WUIKS+hn6kw8Y( z$K1`gCe)&uki1J|z)+{|)}d4aWrg0A%s0_qrA>jdWr$99r?4{&L;}eWP1m7bcH6J+ zv|g?T`s^*6#T^`F7hvLmm_#d?XwD&1w&>YrPqnZ#M zg~?wQ=MAY?#+l@g?q3$g+MFwP&m;=sY70xur!_X7M$g>1M2c-GXrkIN_yqqrnOU-> zx?rt1g7i@Jvj1ZoUzs3leVaZTM~nf|l8)vvv=|6$F%Bce`L;|*dEY3B8i~j*Os!<8 z90p7ML~LKwb3kj}KuEt^+MAkzu}}cl@J;sGtPOyUIZP?XOb$pyCf2rCv|62w+bJC@ zZQ0MvT$0F+b*t0BwhEVw%_aEDow8tN}xu}<)qgS4YzkdT}7T$rv=PX;`J z_JKZqmo12BGGrlO=g%zge@1Yvh=6Eh0DR`f+`;EghwEPagdED{^$tTtD6#(OKj)v; zC={m>nvvq#{laU;%s|N+$zDyZ4EC^u~^H+`{~0Z=R!HH?n>Wv}wXLMMKZ(%Aa{l-xft4T^K&H#~2i zi?GyCLORYOGabglf{hJ$b%}-zeH&nYE}nW)AF?g|JwIfZe=<=xj)F@Uom%L@?6g~{ zz~pL-H{V+KXJL48cmn{rrd0J7iZURDvjNBjVcx+$We9}8#};?#RDyV zITk&PjGW|?vm3jCTU)pV{gl=f9nIy%z`0bK4C>UztF?MUwtf3Y9O?A;DpY+E0>=`~ ziWlnHxii13!z#VqT5_%#{z4u+j~Z5gJ-99%W@Fy2cF&zZ|BEJ=hHkB$yLL^&#aD(T zI$l$Sg+(vK+F;K`Z+d!K!J8P1(_NT{Y6$E5J*;^(T`JV3raW?=i8o{fqdt!OWW*XB x9W`Lz(EkzbGU!OSkuf|xY}1@$wvxZK<2B>)@6MyBQ8WMm002ovPDHLkV1jQ%i?sj% literal 0 HcmV?d00001 diff --git a/src/assets/images/weather_icon.png b/src/assets/images/weather_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7f0e04c98c8bf4a70c3e5161b79d6caf41ed52 GIT binary patch literal 550 zcmV+>0@?kEP)K2X{f#s}+hj8g1+oRM{S64V+CKr%?}3hQQdu76W&NpmKfQCI+qG$Pq~ z)3FjJ{^grp<|J+>JXmKh0b>H>!iHg>A(ArKb=Sc-yVAm*7+uYQiXsw;A>Mh?E<@7- zWl>i*!KPXMHf5~P4hQ`MIC2Gn4hKl~vbwkl7BHs3xoj@#_7_587CD%2qnAMLY0eL4qd_GXyd$|D-cYQ56G{9Nqw6$e=eJ2;2Dw53Y1|Q8(@;18lkcT zY-hAbgbemH`JbiMOF%JxJ(>&+I*aY*jX|mC6P)`u z!axvxJ+hYzK;Q}%u8k+~2*w-WQe21&iSFP8!VSEExCN>52r0Y(?laSNSZKb*gen&n z^A=F)e*I>uyYs3796HFBcrsWAwp?OtR$=?aifcpa4LPDpXH7a0;3YR-lbX>(((#=G(G*?x$eC$qRt-Hyr^EommC=?j(7h+ONO#UMDD!XI# z8p={W%Mu3JLRm7U#@g_gBD$0z``J9E%TfDkmv#etV!LF9$J-V%V_#VLz+b}ofb#+8 z1I`DW4>%uiKJY($Kn{yg6KteI7O?&_>)oy|*r=urSIKymVe1VJ7Wf9!zdf%%nuJ3D O0000 起点 {{ item.start }} - ——> + + arrow 终点 {{ item.end }} @@ -52,18 +53,18 @@
轨迹详情 - 回放 + 回放
- QN001 - 最大时速 91km/h - 平均时速 28km/h - 总里程 63.3km - 耗时 20min - 冲突告警 1 - 冲突预警 1 + {{ activeTask?.licensePlate || activeVehicleId || "未选择车辆" }} + 最大时速 {{ trackDetails.maxSpeed }}km/h + 平均时速 {{ trackDetails.averageSpeed }}km/h + 总里程 {{ trackDetails.totalDistance }}km + 耗时 {{ trackDetails.totalTime }}min + 冲突告警 {{ trackDetails.warnings }} + 冲突预警 {{ trackDetails.preWarnings }}
@@ -79,7 +80,7 @@
- 2024-09-10 12:00:00 + {{ trackDetails.startTime || "未开始" }}
@@ -110,7 +111,7 @@
- 2024-09-10 12:20:00 + {{ trackDetails.endTime || "未结束" }}
@@ -120,8 +121,31 @@ \ No newline at end of file diff --git a/src/components/map/controls/LayerSwitcher.vue b/src/components/map/controls/LayerSwitcher.vue index fe2dcbb..2f3d2e2 100644 --- a/src/components/map/controls/LayerSwitcher.vue +++ b/src/components/map/controls/LayerSwitcher.vue @@ -64,7 +64,7 @@
-
道路图层
+
+
+ 超速告警 +
@@ -41,6 +48,7 @@
车辆冲突 超界告警 + 超速告警
@@ -100,6 +108,24 @@ const alarmList = ref([ date: '2025-03-19 10:30', level: 'medium', type: 'report' + }, + { + carId: 'QN002', + carType: '牵引车', + time: 'T10:15—10: 18超速行驶', + description: ',速度达到85km/h', + date: '2025-03-19 10:18', + level: 'high', + type: 'speed' + }, + { + carId: 'QN003', + carType: '摆渡车', + time: 'T10:22—10: 25超速行驶', + description: ',速度达到78km/h', + date: '2025-03-19 10:25', + level: 'medium', + type: 'speed' } ]); @@ -126,7 +152,7 @@ defineExpose({ position: absolute; left:70px; top: 15%; - width: 360px; + width: 400px; background-color: rgba(41, 44, 56, 0.95); border-radius: 8px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); @@ -181,16 +207,17 @@ defineExpose({ } .tab-item { - padding: 0 16px; + padding: 0 12px; height: 100%; display: flex; align-items: center; justify-content: center; - font-size: 14px; + font-size: 13px; color: #A0A8B7; cursor: pointer; position: relative; transition: all 0.3s; + white-space: nowrap; } .tab-item.active { diff --git a/src/components/map/info/CarDetail.vue b/src/components/map/info/CarDetail.vue index eeb3ae9..720a473 100644 --- a/src/components/map/info/CarDetail.vue +++ b/src/components/map/info/CarDetail.vue @@ -109,7 +109,7 @@ >
-
+
{{ item.time }}
@@ -404,15 +404,14 @@ function getBatteryTempClass(temp) { width: 12px; height: 12px; border-radius: 50%; - background-color: #8ec6ff; - margin-top: 4px; + background-color: #fff; z-index: 2; } .timeline-dot.active { width: 14px; height: 14px; - background-color: #1a6dff; + background-color: #6DB8FF; box-shadow: 0 0 8px 2px rgba(26, 109, 255, 0.6); } @@ -422,8 +421,8 @@ function getBatteryTempClass(temp) { left: 50%; transform: translateX(-50%); width: 2px; - height: calc(100% + 7px); - background: linear-gradient(to bottom, #8ec6ff 50%, transparent 50%); + height: calc(100% - 10px); + background: linear-gradient(to bottom, #536C8F 50%, transparent 50%); background-size: 2px 8px; z-index: 1; } diff --git a/src/components/map/info/eventlist.vue b/src/components/map/info/eventlist.vue index eea4c04..ddb3db4 100644 --- a/src/components/map/info/eventlist.vue +++ b/src/components/map/info/eventlist.vue @@ -350,7 +350,7 @@ onMounted(() => { } .status-btn.task { - background-color: #00B1EB; + background-color: #5690E7; } .status-btn.idle { @@ -409,7 +409,7 @@ onMounted(() => { } .online-status.online { - background-color: #00B1EB; + background-color: #5690E7; } .online-status.offline { diff --git a/src/router/index.js b/src/router/index.js index 2a5bb25..8beff24 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -230,20 +230,7 @@ export const dynamicRoutes = [ } ] }, - { - path: '/monitor/job-log', - component: Layout, - hidden: true, - permissions: ['monitor:job:list'], - children: [ - { - path: 'index/:jobId(\\d+)', - component: () => import('@/views/monitor/job/log'), - name: 'JobLog', - meta: { title: '调度日志', activeMenu: '/monitor/job' } - } - ] - }, + { path: '/tool/gen-edit', component: Layout, diff --git a/src/utils/test_websocket.html b/src/utils/test_websocket.html index 363613d..db98f1f 100644 --- a/src/utils/test_websocket.html +++ b/src/utils/test_websocket.html @@ -115,7 +115,7 @@
diff --git a/src/utils/websocket.js b/src/utils/websocket.js index fda8c9d..1423214 100644 --- a/src/utils/websocket.js +++ b/src/utils/websocket.js @@ -81,8 +81,20 @@ let wsInstance = null; export function createWebSocket(url, options) { if (!wsInstance) { wsInstance = new WebSocketService(url, options); + } else if (wsInstance.url !== url) { + // 如果URL改变,重新创建实例 + wsInstance.close(); + wsInstance = new WebSocketService(url, options); } return wsInstance; } +// 重置WebSocket实例,用于强制重新创建实例 +export function resetWebSocketInstance() { + if (wsInstance) { + wsInstance.close(); + wsInstance = null; + } +} + export default WebSocketService; \ No newline at end of file diff --git a/src/views/car/monitor/detail.vue b/src/views/car/monitor/detail.vue index ee70874..d712281 100644 --- a/src/views/car/monitor/detail.vue +++ b/src/views/car/monitor/detail.vue @@ -191,7 +191,7 @@ const cardList = [ ]; -