Vue + WebSocket 實時數據可視化實戰:多源融合與模擬數據雙模式設計

在現代交通大屏項目中,實時數據的采集和可視化尤為重要。本文結合 Vue3 和 ECharts,分享一個支持多 WebSocket 數據源實時合并、模擬數據調試、自動重連的完整設計方案,幫助你快速搭建健壯的數據可視化組件。


一、項目背景與核心需求

  • 實時接收多個 WebSocket 數據源(不同服務器或端口)

  • 設計模擬數據接口,方便本地開發調試

  • 支持數據的自動合并(如車流總量、車輛類型分布)

  • 使用 ECharts 動態展示統計數據

  • 保證 WebSocket 斷線自動重連,提高穩定性


二、項目架構與核心狀態管理

定義一個全局響應式對象 sources,分別存儲四個數據源的數據,支持真實數據和模擬數據統一寫入。


const USE_MOCK = true; // 是否啟用模擬數據 
const sources = reactive({ su1: {}, su2: {}, su3: {}, su4: {}, });

三、WebSocket 連接與模擬數據設計

1. 真實 WebSocket 連接實現

使用原生 WebSocket 連接服務器,設置事件監聽,支持斷線自動重連。

function createRealWS(url, setTarget) {const ws = new WebSocket(url);ws.onopen = () => console.log(`🟢 WebSocket ${url} 已連接`);ws.onmessage = (event) => {const data = JSON.parse(event.data);setTarget(JSON.parse(data.data));};ws.onerror = () => console.error(`WebSocket ${url} 出錯`);ws.onclose = () => {console.warn(`WebSocket ${url} 關閉,3秒后重連...`);setTimeout(() => createRealWS(url, setTarget), 3000);};
}

2. 模擬數據接口

為了方便本地開發,使用定時器生成結構一致的模擬數據,模擬數據每3秒刷新一次。

function createMockSource(setTarget) {setInterval(() => {const mock = {timestamp: Date.now(),globalTime: new Date().toLocaleString(),totalVehiCount: Math.floor(Math.random() * 1000),aveSpeed: +(30 + Math.random() * 10).toFixed(2),numVehiByType: Object.fromEntries([1, 2, 3, 7, 8, 10, 11, 15, 100].map(k => [k, Math.floor(Math.random() * 100)])),};setTarget(mock);}, 3000);
}

3. 初始化所有數據源

根據 WebSocket URL 端口號映射到對應數據源,啟用模擬或真實數據。

function initAllSources() {const urls = ["ws://xx/wsStatisJd","ws://xx/wsStatisJd","ws://xx/wsStatisJd","ws://xx/wsStatisJd",];urls.forEach((url) => {const key = getSourceKeyByPort(url); // su1 su2 su3 su4const setFn = (data) => (sources[key] = data);if (USE_MOCK) {createMockSource(setFn);} else {createRealWS(url, setFn);}});
}

四、數據合并與格式化

合并車流總量

將四個數據源的車輛總數相加,確保數值準確。

function mergeTotal(...totals) {return totals.reduce((sum, val) => sum + Number(val || 0), 0);
}

合并車輛類型分布

對每種車輛類型進行累加。

格式化合并后的車輛類型數據,固定順序輸出并計算百分比

function formatVehicleTypeData(numVehiByType, total = 0) {const fixedOrder = [8, 3, 2, 1, 15, 7, 10, 11, 100];return fixedOrder.map(key => {const value = numVehiByType[key] || 0;const name = vehicleTypeMap[key] || `類型${key}`;const percent = total > 0 ? ((value / total) * 100).toFixed(1) : "0.0";return {name,value,percent: Number(percent),color: vehicleColorMap[name] || "#999999",};});
}

五、響應式數據更新與圖表刷新

通過 watchEffect 監聽數據變化,自動計算合并數據并刷新 ECharts 餅圖。

watchEffect(() => {const { su1, su2, su3, su4 } = sources;const mergedTotal = mergeTotal(su1.totalVehiCount,su2.totalVehiCount,su3.totalVehiCount,su4.totalVehiCount);const mergedType = mergeVehicleType(su1.numVehiByType || {},su2.numVehiByType || {},su3.numVehiByType || {},su4.numVehiByType || {});chartData.value = formatVehicleTypeData(mergedType, mergedTotal);realtimeTime.value = new Date().toLocaleString();totalVehiCount.value = mergedTotal;aveSpeed.value = {su1: su1.aveSpeed || 0,su2: su2.aveSpeed || 0,su3: su3.aveSpeed || 0,su4: su4.aveSpeed || 0,};InitEchart2(chartData.value);
});

六、ECharts 餅圖動態渲染

初始化并動態更新餅圖,顏色對應車輛類型,關閉標簽和提示框保證大屏美觀。

const InitEchart2 = (data) => {const chartDom = document.getElementById("map-left-4-1-echarts");if (!chartDom) return;if (!myChart) {myChart = echarts.init(chartDom);}const colorList = data.map(item => item.color || "#ccc");myChart.setOption({color: colorList,tooltip: { show: false },series: [{name: "車輛類型占比",type: "pie",radius: ["55%", "80%"],avoidLabelOverlap: false,itemStyle: {borderRadius: 1,borderColor: "#2c3950",borderWidth: 2,},label: { show: false },emphasis: { scale: false, label: { show: false } },labelLine: { show: false },data: data.map(({ name, value }) => ({ name, value })),}],});
};

七、啟動與定時刷新邏輯

在組件掛載時,初始化數據接口和數據源,并設置定時器周期刷新相關統計數據。

onMounted(() => {curDayCountData();       // 獲取今日車流初始數據initAllSources();        // 啟動 WebSocket / 模擬數據getDeviceOnlineData();   // 設備在線率數據curDayEventCountData();  // 今日事件統計eventHistoryCountData(); // 事件歷史統計dataRefreshTimer = setInterval(() => {curDayCountData();getDeviceOnlineData();curDayEventCountData();eventHistoryCountData();}, 30000);
});onUnmounted(() => {if (dataRefreshTimer) clearInterval(dataRefreshTimer);
});

八、總結

  • 多數據源實時管理,靈活切換模擬/真實數據,提升開發效率

  • 自動重連機制,保證 WebSocket 長連接穩定可靠

  • 響應式合并處理,統一計算統計數據,確保展示準確

  • ECharts 動態刷新,實現流暢視覺效果,符合大屏需求

如果你正在做交通、工業或監控領域的實時可視化,這個方案值得借鑒。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90482.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90482.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90482.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#索引器、接口、泛型

以下是對提供的 C# 代碼中涉及的核心知識點的梳理和總結,涵蓋索引器、接口、泛型三大核心內容,以及相關實踐要點:一、索引器(Indexer)索引器是一種允許類或結構體像數組一樣通過[]語法訪問成員的特殊成員,本…

界面組件DevExpress WPF中文教程:Grid - 如何過濾節點?

DevExpress WPF擁有120個控件和庫,將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序,這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

Excel——INDEX和MATCH傻傻分不清?

核心邏輯?先用 MATCH 找到目標姓名在表格中的 ?行號,再用 INDEX 根據行號 ?提取對應信息。就像查字典:先用拼音找到字的頁碼(MATCH 找行號)再翻到該頁看具體解釋(INDEX 取數據)?分步拆解(以…

制造業低代碼平臺實戰評測:簡道云、釘釘宜搭、華為云Astro、金蝶云·蒼穹、斑斑低代碼,誰更值得選?

上回聊了斑斑和簡道云,不少同行私信問我其他幾個低代碼平臺怎么樣,今天就給大家來個"五大門派"終極對決! 一、先說痛點 制造業搞數字化最怕三件事: 1.錢花了沒效果(大平臺用不起,小工具不夠用&…

Jenkins中HTML文件顯示樣式問題解決方案

Jenkins中HTML文件顯示樣式問題解決方案 問題描述 在Jenkins中歸檔的HTML文件顯示格式失效,樣式無法正常顯示,但在本地瀏覽器中打開卻能正常顯示。 問題原因 Jenkins為了安全考慮,默認設置了嚴格的內容安全策略(Content Security Policy, CSP…

四、配置文件

文章目錄1. 文件類型1.1 properties1.2 yaml1.2.1 簡介1.2.2 基本語法1.2.3 數據類型1.2.4 示例2. 配置提示1. 文件類型 1.1 properties 同以前的properties的用法 1.2 yaml 1.2.1 簡介 YAML 是 “YAML Ain’t Markup Language”(YAML 不是一種標記語言&#x…

Python常用醫療AI庫以及案例解析(場景化進階版)

?? 框架應用拓撲圖用例 #mermaid-svg-lZ1J5KCaVWBV2kAu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lZ1J5KCaVWBV2kAu .error-icon{fill:#552222;}#mermaid-svg-lZ1J5KCaVWBV2kAu .error-text{fill:#552222;st…

Python高效操作Kafka實戰指南

Python操作Kafka的高效 以下是使用Python操作Kafka的高效消息發送實例,涵蓋基礎發送、批量處理、異步回調等場景。示例基于confluent-kafka庫(推薦)和kafka-python庫,代碼均經過實測。 流程圖 基礎消息發送(同步) from confluent_kafka import Producerproducer = Pro…

離線快速處理PDF格式轉化的方案

日常辦公中,PDF 幾乎成了我們離不開的文件格式。然而像 WPS 這樣的工具,不少實用功能都需要額外付費才能解鎖。它的打開方式很簡單,雙擊桌面圖標即可運行。它不會彈出主界面,而是默默駐留在系統托盤區,需要時雙擊圖標就…

SpringMVC注解與SpringCloudOpenFeign注解對比

1. 背景知識 梳理SpringMVC和SpringCloudOpenFeign常用注解后: Spring MVC中常用注解_筆記-CSDN博客Spring Cloud OpenFeign 常用注解_筆記-CSDN博客 這里對兩類注解做個對比。理解兩者定位(服務端 vs 客戶端)是掌握注解使用的關鍵&#x…

Linux 時間同步的流程

一、問題時間RTC時間、系統時間(UTC)和本地時間的關系如下:?RTC時間?(硬件時鐘):顯示為UTC時間格式:02:50:35/02:51:28由主板電池供電,獨立于系統運行?12通常存儲UTC時間(Linux默認配置&…

VSCode——python選擇解釋器消失的解決辦法

VSCode軟件的左下角 設置——檢查更新:

笛卡爾積規避:JOIN條件完整性檢查要點

笛卡爾積是數據庫查詢中的高風險操作,多表JOIN時缺失有效關聯條件會導致結果集指數級膨脹,引發?性能塌方?甚至系統崩潰?。以下是核心檢查策略及防御方案:一、笛卡爾積的致命影響??性能塌方?百萬級訂單表與千萬級用戶表缺失ON條件時&…

Vimba相機二次開發教程,基于Python

文章目錄安裝獲取圖像輔助數據Vimba 是由 Allied Vision 開發的一套軟件開發套件(SDK),主要用于控制和操作其工業相機產品。它提供了一套完整的 API 和工具,支持多種操作系統和編程語言,便于開發者快速集成相機功能到應…

電子測試行業軟件ATECLOUD與ETEST對比分析-納米軟件

在當今科技飛速發展的時代,電測行業對于自動化測試平臺的依賴程度日益加深。高效、精準的自動化測試平臺不僅能夠提升測試效率,還能確保產品質量。ATECLOUD 與 ETEST 作為電測行業中頗受矚目的自動化測試平臺,各自展現出獨特的優勢與特點。下…

自動化測試中的常見測試方法

自動化測試中的常見測試方法在自動化測試中,除了數據驅動(Data-Driven Testing),還有多種主流方法,每種方法適用于不同場景和需求。以下是常見的自動化測試方法分類及詳解:一、關鍵字驅動測試(K…

口語01-don‘t judge a book by its cover

Dont judge a book by its cover 不要以貌取人1 the most advanced thing2 stack3 right4 frantically5 be annoyed with sb6 Get your stuff off my desk7 But today I came to class and was running a few minutes late.8 take my seat:占我座位 / 坐我的位置9 s…

《Uniapp-Vue 3-TS 實戰開發》自定義預約時間段組件

這個組件可以直接在 uniapp 項目中使用,提供了 24 小時時段選擇功能,支持單選 / 多選、預設時段選擇、隨機選擇等功能。 html版本: <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="vi…

《Uniapp-Vue 3-TS 實戰開發》自定義環形進度條組件

引言 在UniApp中使用Vue3和TypeScript開發環形進度條組件,我們可以考慮三種技術:Canvas、SVG和純HTML(利用CSS)。考慮到兼容性、實現難度和效果,SVG是較好的選擇。它可以輕松實現環形進度條,支持漸變色,并且可以通過屬性精確控制進度,同時在不同分辨率屏幕上清晰顯示…

MybatisPlus-17.擴展功能-JSON處理器

一.JSON處理器數據庫中有的字段會以JSON格式來進行存儲。類型為json類型。但是在java中我們沒有這樣的數據類型&#xff0c;一般會以字符串接收&#xff0c;這樣就會導致如果想要從數據庫中獲取json格式中的key和value的話會比較麻煩&#xff0c;還要進行字符串操作。那么有沒有…