從零開發(fā)一款可視化大屏制作平臺

image.png

幾個月前開源的H5頁面制作平臺H5-Dooring 收到了很多熱心的反饋和交流, 順著筆者之前的規(guī)劃, 我們又做了一款可視化大屏編輯器V6.Dooring. 接下來筆者就來帶大家一起看看我們的方案設計和技術實現(xiàn).

你將收獲

  • 可視化大屏產(chǎn)品設計思路
  • 主流可視化圖表庫技術選型
  • 大屏編輯器設計思路
  • 大屏可視化編輯器Schema設計
  • 用戶數(shù)據(jù)自治探索

在介紹之前, 我們先看看實現(xiàn)的效果展示.

效果預覽

image
image
image

方案實現(xiàn)

可視化大屏產(chǎn)品設計思路

目前很多企業(yè)或多或少的面臨“信息孤島”問題,各個系統(tǒng)平臺之間的數(shù)據(jù)無法實現(xiàn)互通共享,難以實現(xiàn)一體化的數(shù)據(jù)分析和實時呈現(xiàn)讶迁。

相比于傳統(tǒng)手工定制的圖表與數(shù)據(jù)儀表盤上祈,可視化大屏制作平臺的出現(xiàn),可以打破抵消的定制開發(fā), 數(shù)據(jù)分散的問題,通過數(shù)據(jù)采集、清洗、分析到直觀實時的數(shù)據(jù)可視化展現(xiàn)夭禽,能夠多方位、多角度谊路、全景展現(xiàn)各項指標讹躯,實時監(jiān)控,動態(tài)一目了然缠劝。

針對以上需求, 我們設計了一套可視化大屏解決方案, 具體包含如下幾點:

image

上圖是筆者4個月前設計的基本草圖, 后期會持續(xù)更新. 通過以上的設計分解, 我們基本可以搭建一個可自己定制的數(shù)據(jù)大屏.

主流可視化圖表庫技術選型

目前筆者調(diào)研的已知主流可視化庫有:

  • echart 一個基于 JavaScript 的老牌開源可視化圖表庫
  • D3.js 一個數(shù)據(jù)驅(qū)動的可視化庫, 可以不需要其他任何框架獨立運行在現(xiàn)代瀏覽器中潮梯,它結合強大的可視化組件來驅(qū)動 DOM 操作
  • antv 包含一套完整的可視化組件體系
  • Chart.js 基于 HTML5 的 簡單易用的 JavaScript 圖表庫
  • metrics-graphics 建立在D3之上的可視化庫, 針對可視化和布置時間序列數(shù)據(jù)進行了優(yōu)化
  • C3.js 通過包裝構造整個圖表所需的代碼,使生成基于D3的圖表變得容易

我們使用以上任何一個庫都可以實現(xiàn)我們的可視化大屏搭建的需求, 各位可以根據(jù)喜好來選擇.

大屏編輯器設計思路

在上面的分析中我們知道一個大屏編輯器需要有個編輯器核心, 主要包含以下部分:

  • 組件庫
  • 拖拽(自由拖拽, 參考線, 自動提示)
  • 畫布渲染器
  • 屬性編輯器

如下圖所示:


image

組件庫我們可以用任何組件封裝方式(react/vue等), 這里沿用H5-Dooring的可視化組件設計方式, 對組件模型進行優(yōu)化和設計.

類似的代碼如下:

import { Chart } from '@antv/f2';
import React, { memo, useEffect, useRef } from 'react';

import styles from './index.less';
import { IChartConfig } from './schema';

const XChart = (props:IChartConfig) => {
  const { data, color, size, paddingTop, title } = props;
  const chartRef = useRef(null);
  useEffect(() => {
      const chart = new Chart({
        el: chartRef.current || undefined,
        pixelRatio: window.devicePixelRatio, // 指定分辨率
      });

      // step 2: 處理數(shù)據(jù)
      const dataX = data.map(item => ({ ...item, value: Number(item.value) }));

      // Step 2: 載入數(shù)據(jù)源
      chart.source(dataX);

      // Step 3:創(chuàng)建圖形語法惨恭,繪制柱狀圖秉馏,由 genre 和 sold 兩個屬性決定圖形位置,genre 映射至 x 軸脱羡,sold 映射至 y 軸
      chart
        .interval()
        .position('name*value')
        .color('name');

      // Step 4: 渲染圖表
      chart.render();
  }, [data]);
  return (
    <div className={styles.chartWrap}>
      <div className={styles.chartTitle} style={{ color, fontSize: size, paddingTop }}>
        {title}
      </div>
      <canvas ref={chartRef}></canvas>
    </div>
  );
};

export default memo(XChart);

以上只是一個簡單的例子, 更具業(yè)務需求的復雜度我們往往會做更多的控制, 比如動畫(animation), 事件(event), 數(shù)據(jù)獲取(data inject)等.

組件拖拽可以采用市面已有的Dragable等插件, 也可以采用H5-Dooring的智能網(wǎng)格拖拽. 這里筆者選擇自由拖拽來實現(xiàn). 已有的有:

  • rc-drag
  • sortablejs
  • react-dnd
  • react-dragable
  • vue-dragable

等等. 具體拖拽呈現(xiàn)流程如下:

image

具體拖拽流程就是:

  1. 使用H5 dragable API拖拽左側組件(component data)進入目標容器(targetBox)
  2. 監(jiān)聽拖拽結束事件拿到拖拽事件傳遞的data來渲染真實的可視化組件
  3. 可視化組件掛載, schema注入編輯面板, 編輯面板渲染組件屬性編輯器
  4. 拖拽, 屬性修改, 更新
  5. 預覽, 發(fā)布

組件的schema參考Dooring DSL設計

可視化大屏數(shù)據(jù)自治探索

目前我們實現(xiàn)的搭建平臺可以靜態(tài)的設計數(shù)據(jù)源, 也可以注入第三方接口, 如下:

image

我們可以調(diào)用內(nèi)部接口來實時獲取數(shù)據(jù), 這塊在可視化監(jiān)控平臺用的場景比較多, 方式如下:

image

參數(shù)(params)編輯區(qū)可以自定義接口參數(shù). 代碼編輯器筆者這里推薦兩款, 大家可以選用:

  • react-monaco-editor
  • react-codemirror2

使用以上之一可以實現(xiàn)minivscode, 大家也可以嘗試一下.

輔助功能

可視化大屏一鍵截圖
一鍵截圖功能還是沿用H5-Dooring 的快捷截圖方案, 主要用于對大屏的分享, 海報制作等需求, 我們可以使用以下任何一個組件實現(xiàn):

  • dom-to-image
  • html2canvas

撤銷重做

撤銷重做功能我們可以使用已有的庫比如react-undo, 也可以自己實現(xiàn), 實現(xiàn)原理:

image

有點鏈表的意思, 我們將每一個狀態(tài)存儲到數(shù)組中, 通過指針來實現(xiàn)撤銷重做的功能, 如果要想更健壯一點, 我們可以設計一套“狀態(tài)淘汰機制”, 設置可保留的最大狀態(tài)數(shù), 之前的自動淘汰(刪除, 更高大上一點的叫出棧). 這樣可以避免復雜操作中的大量狀態(tài)存儲, 節(jié)約瀏覽器內(nèi)存.

標尺參考線
標尺和參考線這里我們自己實現(xiàn), 通過動態(tài)dom渲染來實現(xiàn)參考線在縮放后的動態(tài)收縮, 實現(xiàn)方案核心如下:

arr.forEach(el => {
  let dom = [...Array.from(el.querySelectorAll('.calibrationNumber'))][0] as HTMLElement;
  if (dom) {
    dom.style.transform = `translate3d(-4px, -8px, 0px) scale(${(multiple + 0.1).toFixed(
      1,
    )})`;
  }
});

詳細源碼可參考: H5-Dooring | 參考線設計源碼

后期規(guī)劃

最近我們的主要方向是H5-Dooring編輯器2.0的開發(fā)和可視化大屏搭建平臺的升級和優(yōu)化, 后面會出線上版demo, 歡迎大家把玩.

下期精彩

  • 3D可視化組件設計方案
  • 數(shù)據(jù)可視化監(jiān)控平臺設計
  • 可視化大屏的數(shù)據(jù)治理和實時數(shù)據(jù)呈現(xiàn)
  • H5-Dooring 2.0版本技術分享

往期推薦

復盤node項目中遇到的13+常見問題和解決方案

如何搭積木式的快速開發(fā)H5頁面?

手擼一個在線css三角形生成器

前端高效開發(fā)必備的 js 庫梳理

覺得有用 萝究?喜歡就收藏,順便點個贊吧锉罐,你的支持是我最大的鼓勵帆竹!微信搜 “趣談前端”,發(fā)現(xiàn)更多有趣的H5游戲, webpack脓规,node栽连,gulp,css3侨舆,javascript秒紧,nodeJS,canvas數(shù)據(jù)可視化等前端知識和實戰(zhàn).

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挨下,一起剝皮案震驚了整個濱河市熔恢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌复颈,老刑警劉巖绩聘,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耗啦,居然都是意外死亡凿菩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門帜讲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衅谷,“玉大人,你說我怎么就攤上這事似将』袂” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵在验,是天一觀的道長玷氏。 經(jīng)常有香客問我,道長腋舌,這世上最難降的妖魔是什么盏触? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮块饺,結果婚禮上赞辩,老公的妹妹穿的比我還像新娘。我一直安慰自己授艰,他們只是感情好辨嗽,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淮腾,像睡著了一般糟需。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谷朝,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天篮灼,我揣著相機與錄音,去河邊找鬼徘禁。 笑死诅诱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的送朱。 我是一名探鬼主播娘荡,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驶沼!你這毒婦竟也來了炮沐?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤回怜,失蹤者是張志新(化名)和其女友劉穎大年,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡翔试,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年轻要,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垦缅。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡冲泥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壁涎,到底是詐尸還是另有隱情凡恍,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布怔球,位于F島的核電站嚼酝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏竟坛。R本人自食惡果不足惜革半,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望流码。 院中可真熱鬧又官,春花似錦、人聲如沸漫试。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驾荣。三九已至外构,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間播掷,已是汗流浹背审编。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留歧匈,地道東北人垒酬。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像件炉,于是被迫代替她去往敵國和親勘究。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容