0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

講解一下通用可視化搭建平臺整體的設計思路

OSC開源社區(qū) ? 來源:vivo互聯(lián)網(wǎng)技術 ? 作者:Wang Lei ? 2022-10-20 09:43 ? 次閱讀

一、前言

一直以來,許多產(chǎn)品平臺都在嘗試通過可視化搭建的手段來降低 GUI 應用的研發(fā)門檻,提高生產(chǎn)效率。隨著我們業(yè)務的發(fā)展,數(shù)據(jù)建設的完善,用戶對于數(shù)據(jù)可視化的訴求也日益增多,而數(shù)據(jù)大屏是數(shù)據(jù)可視化的其中一種展示方式,它作為大數(shù)據(jù)展示媒介的一種,被廣泛運用于各種會展、公司展廳、發(fā)布會等。

相比于傳統(tǒng)手工定制的圖表與數(shù)據(jù)儀表盤,通用大屏搭建平臺的出現(xiàn),可以解決定制開發(fā), 數(shù)據(jù)分散帶來的應用開發(fā)、數(shù)據(jù)維護成本高等問題,通過數(shù)據(jù)采集、清洗、分析到直觀實時的數(shù)據(jù)可視化展現(xiàn),能夠多方位、多角度、全景展現(xiàn)各項指標,實時監(jiān)控,動態(tài)一目了然。

本文將通過敏捷BI平臺的通用大屏搭建能力的實現(xiàn)方案,來講解一下通用可視化搭建平臺整體的設計思路。

二、快速了解可視化大屏

2.1 什么是數(shù)據(jù)可視化

技術層面上來講,最直觀的就是前端可視化框架:Echart、Antv、Chart.js、D3.js、Vega 等,這些庫都能幫我們快速把數(shù)據(jù)轉(zhuǎn)換成各種形式的可視化圖表。

12b9a87e-4fc4-11ed-a3b6-dac502259ad0.png


業(yè)務層面來講, 其最主要的意義就在于通過數(shù)據(jù) -> 圖表組合 -> 可視化頁面這一業(yè)務流程,來幫助用戶更加直觀整體的分析不同行業(yè)和場景的趨勢和規(guī)律。

132cab44-4fc4-11ed-a3b6-dac502259ad0.png


所以在數(shù)據(jù)領域里,對于復雜難懂且體量龐大的數(shù)據(jù)而言,圖表的信息量要大得多,這也是數(shù)據(jù)可視化最根本的目的。

2.2 可視化大屏都有哪些部分

主要由可視化組件+ 事件交互 + 坐標關系組成,效果如下圖所示:

13451cb0-4fc4-11ed-a3b6-dac502259ad0.jpg

2.3 可視化大屏和常見的BI報表看板的區(qū)別

經(jīng)常會有同學會問到,可視化大屏和BI報表看板的區(qū)別是什么?

這里簡單的做一下介紹:

大屏和報表看板都只是BI的其中一種展現(xiàn)方式,大屏更多是通過不同尺寸的顯示器硬件上進行投屏,而報表看板更多是在電腦端進行展示使用。

大屏更加注重數(shù)據(jù)動態(tài)變化 ,會有極強的視覺體驗和沖擊力,提供豐富的輪播動畫、表格滾動等動畫特效。而報表看板更注重交互式數(shù)據(jù)探索分析,例如上卷下鉆、排序、過濾、圖表切換、條件預警等。

三、設計思路

3.1 技術選型

前端框架:React全家桶(個人習慣)

可視化框架:EchartsDataV-React(封裝度高,json結構的配置項易拓展)D3.js(可視化元素粒度小、定制能力強)

拖拽插件:dnd-kit(滿足樹狀結構視圖的跨組件拖拽)

布局插件:React-Grid-Layout(網(wǎng)格自由布局,修改源碼,支持多個方向的拖拽,自由布局、鎖定縮放比等)

3.2 架構設計

下圖是我們搭建平臺的整體架構設計:

139fb7b0-4fc4-11ed-a3b6-dac502259ad0.png

整個大屏搭建平臺包含四個非常重要的子系統(tǒng)和模塊:

可視化物料中心是整個平臺最基礎的模塊,我們在開源的圖表庫和自主開發(fā)的可視化組件上面定義了一層標準的 DSL 協(xié)議,這個協(xié)議和接入 畫布編輯器 的協(xié)議是對應的,目前已經(jīng)有 40+ 相關組件,組件數(shù)量還在不斷增長。

畫布編輯器:是搭建平臺的核心與難點,支持頁面布局配置、頁面交互配置和組件數(shù)據(jù)配置等功能,另外還支持代碼片段的配置,也可以稱得上是一個低代碼平臺。

數(shù)據(jù)中心:是提供專門用于連接不同數(shù)據(jù)源的服務,例如直連 MySQL、ClickHouse、Elasticsearch、Presto 等,提供了大屏搭建所需要的原始數(shù)據(jù)。

管理中心:是大屏的后臺運營管理模塊,包含了大屏模版管理、大屏發(fā)布下線、訪問權限等管理功能。

3.3搭建流程

通過上面提到的大屏組成元素,我們可以分析總結出大屏搭建主流程如下圖所示:

13f7234c-4fc4-11ed-a3b6-dac502259ad0.png

四、核心功能實現(xiàn)

接下來我們會逐一對平臺幾個核心功能實現(xiàn)進行解析:

1、大屏自適應布局

背景:解決頁面錯亂問題,實現(xiàn)多種分辨率的大屏適配:

思考:首先我們想到的是移動端適配主流的 vh、vw、rem組合的方式以及 font.js+rem 等兩種方案。第一種方案主要是通過媒體查詢來定義父級大小,然后對組件的height、margin、padding等多種css屬性采用rem作為單位,繼承父級設置等單位(1vw),實現(xiàn)自適應適配,第二種方案是引用第三方腳本,通過在main.js中寫代碼計算,使用rem進行繼承,實現(xiàn)適配。

①vh、vw、rem組合

//vw vh單位 w3c的官方解釋 vw:1% of viewport’s width vh:1% of viewport’s height
//例如,設計稿的寬度為1920px,則1vw=19.2px,為了方便計算,我們將html元素的font-size大小設置為100px,也就是5.208vw=100px。
body,html {
     font-size:5.208vw
}

②font.js + rem

//監(jiān)聽窗口的oversize事件,來動態(tài)計算根節(jié)點字體大小,再配合rem做適配
(function(doc, win) {
    const docEl = doc.documentElement
    const resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize'
    const recalc = function() {
      let clientWidth = docEl.clientWidth
      if (!clientWidth) return
      docEl.style.fontSize = 100 * (clientWidth / 1920) + 'px'
    }
    if (!doc.addEventListener) return
    win.addEventListener(resizeEvt, recalc, false)
    doc.addEventListener('DOMContentLoaded', recalc, false)
})(document, window)

缺陷:當我們大屏里面使用到的第三方插件,它的樣式使用的是px為單位時,例如 line-height 的設置為20px,此時就不能適應行高,就會出現(xiàn)重疊等錯亂問題。或者我們利用 postcss-px2rem 插件進行全局替換,但是在使用過程中,需要注意對已經(jīng)處理過適配的插件,例如 Ant Design,否則引入的antd 控件使用會出現(xiàn)樣式錯亂的問題

解決思路:采用了css3 的縮放 transform: scale(X,Y) 屬性,主要是通過監(jiān)聽瀏覽器窗口的 onresize 事件,當窗口大小發(fā)生變化時,我們只需要根據(jù)大屏容器的實際寬高,去計算對應的放大縮小的比例,就可以實現(xiàn)布局的自適應了,我們也提供了不同的布局適應效果,例如等高縮放、等寬縮放、全屏鋪滿等,不同的縮放方式,決定了我們在計算寬高比例的優(yōu)先級。因此我們后面在做畫布的縮小功能,也可以直接使用這種方案來實現(xiàn)。

// 基于設置的設計稿尺寸 換算對應的寬高比
useEffect(() => {
    const wR = boxSize.width / viewWidth;
    const hR = boxSize.height / viewHeight;
 
    setBgScaleRatio(wR);
    setBgHeightScaleRatio(hR);
}, [boxSize, viewWidth, viewHeight]);
 
//根據(jù)等寬、等高、全屏等不同的縮放比例 計算scale值
const getScale = (proportion, x, y) => {
    if (proportion === 'radioWidth') {
        return `scaleX(${x})`
    }
    if (proportion === 'radioHeight') {
        return `scaleY(${y})`
    }
    return `scale(${x}, ${y})`
}

2、大屏組件通用開發(fā)流程設計

背景:隨著可視化組件的增多、新增組件流程繁瑣冗長,為了避免重復的造輪子以及后續(xù)引入第三方組件,需要制定一套通用的組件開發(fā)流程:

設計思路:組件 =component 組件主體 +schema 組件配置協(xié)議層 + 組件定義層(類型、從屬關系、初始化寬高等)

① component 組件主體:

可視化框架選型:行業(yè)主流可視化庫有 Echart、Antv、Chart.js、D3.js、Vega、DataV-React 基于可視化的通用性和定制性的需求,我們選擇了 Echart、DataV-React 作為基礎組件的開發(fā)框架,面對定制性要求更高的自定義組件,我們選擇了可視化粒度更小的 D3.js。

封裝通用 Echarts 組件(初始化、事件注冊、實例注銷等):

// initialization echarts
const renderNewEcharts = () => {
    // 1. new echarts instance
    const echartObj = updateEChartsOption();
    // 2. bind events
    bindEvents(echartObj, onEvents || {});
    // 3. on chart ready
    if (typeof onChartReady === 'function') onChartReady(echartObj);
    // 4. on resize
    echartObj.resize();
};
 
// bind the events
const bindEvents = (instance, events) => {
    const _bindEvent = (eventName, func) => {
       instance.on(eventName, (param) => {
           func(param, instance);
       });
    };
 
    // loop and bind
    for (const eventName in events) {
        if (Object.prototype.hasOwnProperty.call(events, eventName)) {
            _bindEvent(eventName, events[eventName]);
        }
    }
};
 
// dispose echarts and clear size-sensor
const dispose = () => {
    if ($chartEl.current) {
       clear($chartEl.current);
       // dispose echarts instance
       (echartsLib || echarts).dispose($chartEl.current);
    }
};

封裝通用 DataV 組件(DataV-React、自定義等組件入口,統(tǒng)一負責配置、數(shù)據(jù)收集、監(jiān)聽resize)

const DataV: React.FC = (props) => {
    const { config } = props;
    const [renderCounter, setRenderCounter] = useState(0);
    const $dataVWarpEl = useRef(null);
    const $componentEl = useRef(null);
 
    useEffect(() => {
        // 綁定容器size監(jiān)聽
        const resizefunc = debounce(() => {
            $componentEl.resize();
        }, 500)
       // fixme
       addResizeListener($dataVWarpEl.current, resizefunc);
       return () => {
           // 清除訂閱
           removeResizeListener($dataVWarpEl.current, resizefunc);
       };
    }, []);
 
    return (
        
            
        
    );
};

② schema 組件配置協(xié)議層 + 組件定義層(類型、從屬關系、初始化寬高等)

我們自定義了一套 schema 組件的DSL,結構協(xié)議層。通過DSL約定了組件的配置協(xié)議,包括組件的可編輯屬性、編輯類型、初始值等,之所以定義一致的協(xié)議層,主要是方便后期的組件擴展,配置后移。

140c22c4-4fc4-11ed-a3b6-dac502259ad0.png

JSON Schema設計:

{
    headerGroupName: '公共配置',                         //配置所屬類型
    headerGroupKey: 'widget',                           //配置所屬類型key值 相同的key值都歸屬一類
    name: '標題名稱',                                    //屬性名稱
    valueType: ['string'],                              //屬性值類型
    optionLabels: [],                                   //服務下拉列表、多選框等控件的標簽名
    optionValues: [],                                   //服務下拉列表、多選框等控件的標簽值
    tip: false,                                         //配置項的 Tooltip 注解
    ui: ['input'],                                      //使用的控件類型
    class: false,                                       //控件類名,定制控件樣式
    css: { width: '50%'},                               //修改控件樣式
    dependencies: ['widget,title.show,true'],           //屬性之間的聯(lián)動,規(guī)則['配置所屬類型, 屬性key, 屬性值']
    depContext: DepCommonShowState,                     //屬性之間的校驗回調(diào)方法
    compShow: ['line'],                                 //哪些組件可配置
    dataV: { key: 'title.text', value: '' },            //配置的key值和默認value值
},

表單DSL設計:

143e6e78-4fc4-11ed-a3b6-dac502259ad0.png

收益:以上是我們定制的DSL結構協(xié)議層,用戶只需要填寫Excel表格,就可以實現(xiàn)動態(tài)表單的創(chuàng)建,實現(xiàn)組件配置項分類、配置復用、配置項之間聯(lián)動、屬性注釋等功能。目前屬性配置器已經(jīng)支持了常用的15種的配置UI控件,通過定制的DSL結構協(xié)議層,可以快速完成組件的配置界面初始化,為后續(xù)規(guī)劃的組件物料中心做準備。

3、拖拽器實現(xiàn)

背景:React-Grid-Layout 拖拽插件不支持自由布局和組件不同緯度拖拽:

解決方案:通過分析源碼,對不同緯度的拖拽事件以及拖拽目標碰撞事件進行了重寫,并且也拓展了鎖定寬高比、旋轉(zhuǎn)透明度等功能。

源碼分析:

1475a596-4fc4-11ed-a3b6-dac502259ad0.png


resize伸縮特性增強(優(yōu)化),拖拽的同時,除了修改容器寬高外,也動態(tài)調(diào)整了組件的坐標位置

// CSS Transforms support (default)
if (useCSSTransforms) {
    if (activeResize) {
        const { width, height, handle } = activeResize;
        const clonePos = { ...pos };
        if (["w", "nw", "sw"].includes(handle)) {
            clonePos.left -= clonePos.width - width;
        }
        if (["n", "nw", "ne"].includes(handle)) {
            clonePos.top -= clonePos.height - height;
        }
        style = setTransform(clonePos, this.props.angle);
    } else {
        style = setTransform(pos, this.props.angle);
    }
}

堆疊顯示,自由布局(優(yōu)化),通過控制布局是否壓縮,動態(tài)調(diào)整拖拽目標的層級zIndex來實現(xiàn)多圖層組件操作交互和自由定位。

// 每次拖拽時zIndex要在當前最大zIndex基礎上 + 1,并返回給組件使用
const getAfterMaxZIndex = useCallback(i => {
    if (i === curDragItemI) {
        return;
    }
    setCurDragItemI(i);
    setMaxZIndex(maxZIndex => maxZIndex + 1);
    return maxZIndex;
}, []);

改造后效果展示

1494ae5a-4fc4-11ed-a3b6-dac502259ad0.jpg

4、大屏狀態(tài)推送

背景:大屏的后期維護需要有版本發(fā)布自更新以及大屏下線等需求,這個時候就需要有一套消息通知機制,通過命令來控制大屏的運行狀態(tài)。

解決方案:基于websocket通信機制,建立長鏈接,實現(xiàn)了心跳及重連機制,實時對上線發(fā)布后的大屏進行更新或下線管理。

14d84e6c-4fc4-11ed-a3b6-dac502259ad0.png

五、效果預覽

14e86dce-4fc4-11ed-a3b6-dac502259ad0.gif

六、總結

本文通過可視化頁面搭建、no/low code 平臺、Schema 動態(tài)表單等技術思想來分析講解了如何去設計開發(fā)一個通用的數(shù)據(jù)大屏搭建平臺。

當前的設計方案基本滿足了數(shù)據(jù)大屏的核心能力搭建需求。如果想實現(xiàn)更富有展現(xiàn)力,滿足更多場景的大屏搭建平臺,我們還需要進一步提高平臺的擴展性和完善整體的物料生態(tài),具體規(guī)劃如下:

豐富和拓展大屏組件&配置能力,覆蓋不同行業(yè)的可視化場景。

可視化物料平臺的搭建,沉淀優(yōu)秀的可視化組件、大屏模版素材。

3D以及動效渲染引擎開發(fā)實現(xiàn)。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • DSL
    DSL
    +關注

    關注

    2

    文章

    59

    瀏覽量

    38334
  • 數(shù)據(jù)轉(zhuǎn)換

    關注

    0

    文章

    88

    瀏覽量

    18015
  • MySQL
    +關注

    關注

    1

    文章

    819

    瀏覽量

    26647

原文標題:從0到1設計通用數(shù)據(jù)大屏搭建平臺

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    生產(chǎn)產(chǎn)量可視化管理平臺有什么功能

    在這個數(shù)據(jù)驅(qū)動的時代,每個細微的生產(chǎn)波動都可能成為影響企業(yè)競爭力的關鍵因素。如何精準掌握生產(chǎn)動態(tài),高效提升產(chǎn)量,成為了眾多企業(yè)家心中的頭等大事。今天,就讓我們同揭開生產(chǎn)產(chǎn)量可視化管理平臺
    的頭像 發(fā)表于 11-29 17:50 ?207次閱讀

    智慧能源可視化監(jiān)管平臺——助力可視化能源數(shù)據(jù)管理

    博達可視化大屏設計平臺在智慧能源領域的價值體現(xiàn)在實時監(jiān)控、數(shù)據(jù)可視化、決策支持和效率提升等方面。借助該平臺,企業(yè)可以輕松搭建智慧能源類
    的頭像 發(fā)表于 11-29 10:00 ?387次閱讀
    智慧能源<b class='flag-5'>可視化</b>監(jiān)管<b class='flag-5'>平臺</b>——助力<b class='flag-5'>可視化</b>能源數(shù)據(jù)管理

    數(shù)字孿生三維可視化場景如何搭建?

    數(shù)字孿生 三維可視化 場景是種強大的工具,能夠幫助我們模擬和展示現(xiàn)實世界中的復雜環(huán)境和系統(tǒng)。從數(shù)據(jù)采集到交互設計,通過系列步驟,可以有效地搭建出逼真動態(tài)的數(shù)字孿生三維場景。 數(shù)據(jù)采
    的頭像 發(fā)表于 11-06 14:40 ?243次閱讀

    羅克韋爾自動FactoryTalk Optix可視化平臺概述

    羅克韋爾自動FactoryTalk Optix可視化平臺概述
    的頭像 發(fā)表于 09-05 15:19 ?623次閱讀

    工業(yè)數(shù)據(jù)可視化管理平臺是什么

    數(shù)據(jù)可視化管理平臺應運而生,它以其獨特的功能和優(yōu)勢,正在成為工業(yè)數(shù)字轉(zhuǎn)型的重要工具。 工業(yè)數(shù)據(jù)可視化管理平臺的定義 工業(yè)數(shù)據(jù)
    的頭像 發(fā)表于 08-28 14:21 ?320次閱讀

    物聯(lián)網(wǎng)云平臺地圖數(shù)據(jù)可視化

    可視化技術以其直觀、高效、易于理解的特點,成為了個不可或缺的組成部分。 物聯(lián)網(wǎng)云平臺地圖數(shù)據(jù)可視化功能,是指將物聯(lián)網(wǎng)設備采集的各類數(shù)據(jù),通過云平臺
    的頭像 發(fā)表于 07-01 17:10 ?384次閱讀

    成都高校大學數(shù)字孿生可視化系統(tǒng)平臺建設項目迎來驗收階段

    智能制造作為未來制造業(yè)的重要發(fā)展方向,其核心在于實現(xiàn)制造過程的數(shù)字、網(wǎng)絡和智能。為此,成都高校大學智能制造實驗室致力于搭建個先進的數(shù)
    的頭像 發(fā)表于 07-01 15:38 ?245次閱讀

    數(shù)字孿生三維可視化平臺

    數(shù)字孿生 三維可視化平臺作為當今智能化解決方案的前沿工具,奠定了數(shù)字孿生技術與三維可視化技術在各行業(yè)中的重要地位。數(shù)字孿生技術通過數(shù)學建模、仿真計算和數(shù)據(jù)分析實現(xiàn)對實體系統(tǒng)的虛擬復制,為用戶提供了
    的頭像 發(fā)表于 06-28 17:15 ?539次閱讀

    如何實現(xiàn)園區(qū)大屏可視化?

    孿生可視化建平臺利用Web三維可視化技術對現(xiàn)實場景進行仿真,實現(xiàn)園區(qū)級業(yè)務場景 的可視化呈現(xiàn),助力企業(yè)快速完成項目的實施。實現(xiàn)園區(qū)場景立體可先,極致
    的頭像 發(fā)表于 06-19 15:39 ?454次閱讀
    如何實現(xiàn)園區(qū)大屏<b class='flag-5'>可視化</b>?

    三維可視化系統(tǒng)平臺介紹及優(yōu)勢

    三維可視化 系統(tǒng)平臺種基于三維技術開發(fā)的軟件系統(tǒng),主要用于實現(xiàn)對三維空間中數(shù)據(jù)、模型、場景等內(nèi)容的可視化展示和操作。這樣的系統(tǒng)平臺在各個
    的頭像 發(fā)表于 06-12 16:02 ?644次閱讀
    三維<b class='flag-5'>可視化</b>系統(tǒng)<b class='flag-5'>平臺</b>介紹及優(yōu)勢

    c語言怎么做可視化界面

    C語言是通用的編程語言,廣泛應用于系統(tǒng)編程、嵌入式開發(fā)等領域。雖然C語言本身并不支持直接創(chuàng)建可視化界面,但通過結合些圖形庫和工具,我們可以為C語言程序開發(fā)出直觀、易用的
    的頭像 發(fā)表于 06-06 10:46 ?2459次閱讀

    智慧城市-可視化,進步提高信息建設水平

    信息量化、可視化、互動的特點,直觀地展示城市管理、服務、交通、環(huán)境等方面的數(shù)據(jù)。 ? 數(shù)據(jù)視覺平臺 數(shù)據(jù)可視化主要是將城市發(fā)展過程中遇到的問題和數(shù)據(jù),通過數(shù)據(jù)采集、數(shù)據(jù)處理和變換、可視化
    的頭像 發(fā)表于 05-22 16:49 ?468次閱讀

    智慧園區(qū)三維可視化的重要性!

    智慧園區(qū)三維可視化是系統(tǒng)的個重要組成部分,它將數(shù)據(jù)及園區(qū)場景1:1還原,讓管理者更加清楚的知道園區(qū)的具體情況。可視化建平臺利用Web三維可視化
    的頭像 發(fā)表于 05-15 16:38 ?439次閱讀

    訊維智能可視化綜合平臺助力醫(yī)療行業(yè)實現(xiàn)遠程診療

    訊維智能可視化平臺在醫(yī)療行業(yè)中扮演著重要角色,特別是在推動遠程診療方面。通過先進的可視化技術和解決方案,訊維平臺為醫(yī)療機構提供了高效、準確、便捷的遠程醫(yī)療服務,有效提升了醫(yī)療服務的覆蓋
    的頭像 發(fā)表于 05-13 16:33 ?265次閱讀

    四信數(shù)字孿生可視化平臺,賦能智慧水利創(chuàng)新發(fā)展

    數(shù)字孿生可視化平臺基于維、二維水動力模型,疊加三維可視化實時渲染,應用于水雨情監(jiān)測、庫區(qū)及小流域來水預報、水庫閘壩調(diào)度、河道洪水推演、淹沒分析等,依托
    的頭像 發(fā)表于 04-19 16:03 ?910次閱讀
    四信數(shù)字孿生<b class='flag-5'>可視化</b><b class='flag-5'>平臺</b>,賦能智慧水利創(chuàng)新發(fā)展