ballbet体育平台-ballbet体育平台 从零设计可视化大屏搭建引擎
你的位置:ballbet体育平台 > ballbet体育平台 > ballbet体育平台 从零设计可视化大屏搭建引擎
ballbet体育平台 从零设计可视化大屏搭建引擎
时间:2021-09-10 03:09 点击:52 次

几个月前吾写了一篇关于从零开发一款可视化大屏制作平台 的文章, 浅易概述了一下可视化大屏搭建平台的一些设计思路和效率演示, 这篇文章吾会就 如何设计可视化大屏搭建引擎 这一主题, 详细介绍一下实现原理。

▲作为国家西部重要的生态安全屏障,英雄的祁连山,却曾伤痕累累。过去近半个世纪的“黑色增长史”,造成冻土破碎、植被稀疏,局部生态受破坏严重。党的十八大以来,以习近平同志为核心的党中央把生态文明建设和生态环境保护摆在治国理政的重要位置。祁连山生态安全,习近平总书记亲自“出题”亲自“验收”。在总书记关切下,祁连山历经“史上最严”整改,祛多年沉疴,还欠账旧账,迎来黑色、浅绿、深绿的底色之变。祁连山整治,已经成为生态环境科学修复治理的“博物馆”“教科书”。然而从“深绿”到“常绿”,依然任重道远。视频记者:张睿、范培珅

8月19日0—24时,31个省(自治区、直辖市)和新疆生产建设兵团报告新增确诊病例33例,其中境外输入病例29例(广东9例,云南6例,北京2例,辽宁2例,上海2例,福建2例,河南2例,天津1例,黑龙江1例,江苏1例,四川1例),本土病例4例(江苏2例,云南2例);无新增死亡病例;新增疑似病例2例,均为境外输入病例(均在上海)。

在第四个“中国医师节”来临之际,8月18日上午,龙湾区委书记、温州高新区党工委书记周一富带领区四套班子领导走访医疗卫生单位,看望慰问医务人员,为他们送上鲜花和慰问品,并通过他们向全区卫生健康工作者送去节日问候和崇高敬意,希望大家崇尚医德、钻研医术、秉持医风、勇担重任,努力促进医学进步,为建设龙湾东部康养中心作出新贡献。区领导周赞、张纯芳、彭锋参加慰问。

抗击疫情,人人有责!新冠肺炎疫情防控小知识,一起来看!

遵命吾一向的写作风格, 吾会在下面列出文章的大纲,以便行家有选择且高效率的涉猎和学习:

迅速晓畅数据可视化 如何设计通用的大屏搭建引擎 大屏搭建引擎中央功能实现 拖拽器实现 物料中央设计 动态渲染器实现 配置面板设计 限制中央概述 功能辅助设计 可视化大屏后期规划和异日展看

行家能够轻盈根据右侧的文章导航, 迅速定位到本身想看的位置, 接下来吾们最先辈入正文。

迅速晓畅数据可视化

说到数据可视化, 想必行家多多少少稍接触过, 从技术层面谈, 最直不益看的就是前端可视化框架, 比如:

echart antv Chart.js D3.js Vega

这些库都能帮吾们轻盈制作可视化图外。

从实用性的角度来谈, 其最主要的意义就在于协助用户更益的分析和外达数据。以是说谈到数据可视化, 更多的是和各栽图外打交道, 经历 数据 -> 图外组相符 -> 可视化页面 这一营业流程, 就构成了吾们今天要钻研的话题——设计可视化大屏搭建引擎。

如何设计通用的大屏搭建引擎

说到 “引擎” 这个词能够有栽莫名的高大上, 其实在互联网技术中, 吾们频繁会听到各栽相关的名词,比如 “涉猎器渲染引擎” , “规则引擎” , “图像识别引擎” 等, 吾觉得 “引擎” 的内心就是挑供一套郑重的机制, 为编制挑供源源一向的生产力。以是吾们今天谈的“可视化大屏搭建引擎”, 内心上也是挑供一套搭建机制, 赞成吾们设计各栽复杂的可视化页面。

为了方便行家理解可视化搭建, 吾这边展现2张可视化大屏的页面, 来和行家一首分析一下可视化大屏的构成要素:

自然实际行使中大屏表现的内容和式样远比这复杂, 吾们从上图能够挑炼出大屏页面的2个直不益看特征:

可视化组件集 空间坐标相关

由于吾们可视化大屏载体是页面, 是html, 以是还有另外一个特征: 事件/交互。综上吾们总结出了可视化大屏的必备要素:

吾们只要足够的理解了可视化大屏的构成和特征, 吾们才能更益的设计可视化大屏搭建引擎, 基于以上分析, 吾设计了一张基础引擎的架构图:

接下来吾就带行家一首来拆解并实现上面的搭建引擎ballbet体育平台。

大屏搭建引擎中央功能实现

俗语说: “益的拆解是成功的一半”, 任何一个复杂义务或者编制, 吾们只要能将其拆解成许多细微的子模块, 就能很益的解决并实现它. (学习也是相通)

接下来吾们就一一解决上述基础引擎的几个中央子模块:

拖拽器实现 物料中央设计 动态渲染器实现 配置面板设计 限制中央概述 功能辅助设计

拖拽器实现

拖拽器是可视化搭建引擎的中央模块, 也是用来解决上述挑到的大屏页面特征中的“空间坐标相关”这一题目。吾们先来看一下实现效率:

相关拖拽的技术实现, 吾们能够行使原生 js 实现, 也能够行使第三方成熟的拖拽库, 比如:

DnD React-Dragable react-moveable

吾之前也开源了一个轻量级解放拖拽库 rc-drag , 效率如下:

相关它的技术实现能够参考吾的另一篇文章: 轻盈教你搞定组件的拖拽, 缩放, 多限制点伸缩和拖拽数据上报。行家也能够基于此做二次扩展和封装。

吾们拖拽器的基本原型代码如下:

export default function DragBox(props) {     const [x, y, config] = props;     const [target, setTarget] = React.useState();     const [elementGuidelines, setElementGuidelines] = React.useState([]);     const [frame, setFrame] = React.useState({         translate: [x, y],     });     React.useEffect(() => {         setTarget(document.querySelector(".target")!);     }, []);     return <div className="container">         <div className="target">拖拽内部组件, 比如图外/基础组件等</div>         <Moveable             target={target}             elementGuidelines={elementGuidelines}             snappable={true}             snapThreshold={5}             isDisplaySnapDigit={true}             snapGap={true}             snapElement={true}             snapVertical={true}             snapHorizontal={true}             snapCenter={false}             snapDigit={0}             draggable={true}             throttleDrag={0}             startDragRotate={0}             throttleDragRotate={0}             zoom={1}             origin={true}             padding={{"left":0,"top":0,"right":0,"bottom":0}}             onDragStart={e => {                 e.set(frame.translate);                 // 自定义的拖拽最先逻辑             }}             onDrag={e => {                 frame.translate = e.beforeTranslate;                 e.target.style.transform = `translate(${e.beforeTranslate[0]}px, ${e.beforeTranslate[1]}px)`;                 // 自定义的拖拽终结逻辑             }}         />     </div>; } 

以上只是实现了基本的拖拽功能, 吾们必要对拖拽位相新闻做保存以便在预览是实现“所搭即所得”的效率。位相新闻会和其他属性同一保存在组件的DSL数据中, 这块在接下来内容中会详细介绍。

对于拖拽器的进一步深入, 吾们还能够竖立参考线, 对齐线, 吸附等, 并且能够在拖拽的分别时期(比如onDragStart和onDragEnd)做分别的营业逻辑。这些 Moveable 都挑供了对答的api声援, 行家能够参考行使。

物料中央设计

物料中央主要为大屏页面挑供“原原料”。为了设计雄壮且通用的物料, 吾们必要设计一套标准组件结议和属性制定。并且为了方便物料管理和查询, 吾们还必要对物料进走分类, 吾的分类如下:

可视化组件 (柱状图, 饼图, 条形图, 地图可视化等) 修饰型组件 (图片, 轮播图, 修饰素材等) 文字类组件 (文本, 文本跑马灯, 文字看板)

详细的物料库演示如下:

这边吾拿一个可视化组件的实现来举例表明:

import React, { memo, useEffect } from 'react' import { Chart } from '@antv/g2'  import { colors } from '@/components/BasicShop/common'  import { ChartConfigType } from './schema'  interface ChartComponentProps extends ChartConfigType {   id: string }  const ChartComponent: React.FC<ChartComponentProps> = ({   id, data, width, height,   toggle, legendPosition, legendLayout, legendShape,   labelColor, axisColor, multiColor, tipEvent, titleEvent,   dataType, apiAddress, apiMethod, apiData, refreshTime, }) => {   useEffect(() => {     let timer:any = null;     const chart = new Chart({       container: `chart-${id}`,       autoFit: true,       width,       height     })      // 数据过滤, 接入     const dataX = data.map(item => ({ ...item, value: Number(item.value) }))     chart.data(dataX)          // 图外属性拼装     chart.legend(       toggle         ? {           position: legendPosition,           layout: legendLayout,           marker: {             symbol: legendShape           },         }         : false,     )      chart.tooltip({       showTitle: false,       showMarkers: false,     })      // 其他图外新闻源配置, 手段相像, 此处省略     // ...      chart.render()    }, [])    return <div id={`chart-${id}`} /> }  export default memo(ChartComponent) 

以上就是吾们的基础物料的实现模式, 可视化组件采用了g2, 自然行家也能够行使熟识的echart, D3.js等. 分别物料既有通用的 props , 也有特有的 props, 取决于吾们如何定义物料的Schema。

在设计 Schema 前吾们必要清晰组件的属性划分, 为了已足组件配置的变通性和通用性, 吾做了如下划分:

外面属性 (组件宽高, 颜色, 标签, 表现模式等) 数据配置 (静态数据, 动态数据) 事件/交互 (如单击, 跳转等)

有了以上划分, 吾们就能够轻盈设计想要的通用Schema了。吾们先来看看实现后的配置面板:

这些属性项都是基于吾们定义的schema配置项, 经历 解析引擎 动态渲染出来的, 相关 解析引擎 和配置面板, 吾会在下面的章节和行家介绍。吾们先看看组件的 schema 组织:

const Chart: ChartSchema = {   editAttrs: [     {       key: 'layerName',       type: 'Text',       cate: 'base',     },     {       key: 'y',       type: 'Number',       cate: 'base',     },     ...DataConfig, // 数据配置项     ...eventConfig, // 事件配置项        ],   config: {     width: 200,     height: 200,     zIndex: 1,     layerName: '柱状图',     labelColor: 'rgba(188,200,212,1)',     // ... 其他配置初首值     multiColor: ['rgba(91, 143, 249, 1)', 'rgba(91, 143, 249, 1)', 'rgba(91, 143, 249,,1)', 'rgba(91, 143, 249, 1)'],     data: [       {         name: 'A',         value: 25,       },       {         name: 'B',         value: 66,       }     ],   }, } 

其中 editAttrs 外示可编辑的属性列外, config 为属性的初首值, 自然行家也能够根据本身的喜欢, 设计相反的通用schema。

吾们经历以上设计的标准组件和标准schema, 就能够批量且高效的生产各栽物料, 还能够轻盈集成任何第三方可视化组件库。

动态渲染器实现

吾们都清新, 一个页面中元素许多时会影响页面团体的添载速度, 由于涉猎器渲染页面必要消耗CPU / GPU。对于可视化页面来说, 每一个可视化组件都必要渲染大量的新闻元, 这无疑会对页面性能造成不幼的影响, 以是吾们必要设计一栽机制, 让组件异步添载到画布上, 而不是一次性添载几十个几百个组件(云云的话页面会有大量的白屏时间, 用户体验极度消极)。

动态添载器就是挑供了云云一栽机制, 保证组件的添载都是异步的, 一方面能够缩短页面体积, 另一方面用户能够更早的看到页面元素。现在吾们熟的动态添载机制也有许多, Vue 和 React 生态都挑供了开箱即用的解决方案(固然吾们能够用 webpack 自走设计云云的动态模型, 此处为了挑高走文效率, 吾们直接基于现成方案封装)。吾们先看一下动态渲染组件的过程:

上面的演示能够微弱的看出从左侧组件菜单拖动某个组件图标到画布上后, 真实的组件才最先添载渲染。

这边吾们以 umi3.0 挑供的 dynamic 函数来最幼化实现一个动态渲染器. 倘若不熟识 umi 生态的友人, 也不必发急, 看完吾的实现过程和原理之后, 就能够行使任何熟识的动态添载机制实现它了。实现如下:

import React, { useMemo, memo, FC } from 'react' import { dynamic } from 'umi'  import LoadingComponent from '@/components/LoadingComponent'   const DynamicFunc = (cpName: string, category: string) => {   return dynamic({     async loader() {       //  动态添载组件       const { default: Graph } = await import(`@/components/materies/${cpName}`)        return (props: DynamicType) => {         const { config, id } = props         return <Graph {...config} id={id} />       }     },     loading: () => <LoadingComponent />   }) }  const DynamicRenderEngine: FC<DynamicType> = memo((props) => {   const {    type,    config,    // 其他配置...    } = props   const Dynamic = useMemo(() => {     return DynamicFunc(config)   }, [config])    return <Dynamic {...props} /> })  export default DynamicRenderEngine 

是不是很浅易? 自然吾们也能够根据自身营业必要, 设计更复杂重大的动态渲染器。

配置面板设计

实现配置面板的前挑是对组件 Schema 组织有一个编制的设计, 在介绍组件库实现中吾们介绍了通用组件 schema 的一个设计案例, 吾们基于云云的案例组织, 来实现 动态配置面板。

由上图能够清新, 动态配置面板的一个中央要素就是 外单渲染器。外单渲染器的主意就是基于属性配置列外 attrs 来动态渲染出对答的外单项。吾之前写了一篇文章详细的介绍了外单设计器的技术实现的文章, 行家感有趣也能够参考一下: Dooring可视化之从零实现动态外单设计器。

吾这边来浅易实现一个基础的外单渲染器模型:

const FormEditor = (props: FormEditorProps) => {   const { attrs, defaultValue, onSave } = props;    const onFinish = (values: Store) => {     // 保存配置项数据     onSave && onSave(values);   };      const handlechange = (value) => {     // 更新逻辑   }    const [form] = Form.useForm();    return (     <Form       form={form}       {...formItemLayout}       onFinish={onFinish}       initialValues={defaultValue}       onValuesChange={handlechange}     >       {         attrs.map((item, i) => {         return (           <React.Fragment key={i}>             {item.type === 'Number' && (               <Form.Item label={item.name} name={item.key}>                 <InputNumber />               </Form.Item>             )}             {item.type === 'Text' && (               <Form.Item label={item.name} name={item.key}>                 <Input placeholder={item.placeholder} />               </Form.Item>             )}             {item.type === 'TextArea' && (               <Form.Item label={item.name} name={item.key}>                 <TextArea rows={4} />               </Form.Item>             )}             // 其他配置类型           </React.Fragment>         );       })}     </Form>   ); }; 

倘若行家想看更完善的配置面板实现, 能够参考开源项现在 H5-Dooring | H5可视化编辑器

吾们能够看看最后的配置面板实现效率:

限制中央概述 & 功能辅助设计

限制中央的实现主要是营业层的, 异国涉及太多复杂的技术, 以是这边吾浅易介绍一下。由于可视化大屏页面展现的新闻有些能够是私密数据, 只期待一片面人看到, 以是吾们必要对页面的访问进走限制。其次由于企业内部营业战略需求, 能够会对页面进走各栽验证, 状态校验, 数据更新频率等, 以是吾们必要设计一套限制中央来管理。最基本的就是访问限制, 如下:

功能辅助设计 主要是一些用户操作上的优化, 比如迅速键, 画布缩放, 大屏迅速导航, 撤销重做等操作, 这块能够根据详细的产品需求来完善。行家后期设计搭建产品时也能够参考实现。

可视化大屏后期规划和异日展看

为了实现更富有表现力, 已足更多场景的可视化大屏引擎, 吾们一方面必要挑高引擎扩展性, 一方面必要完善物料生态, 其次只要与时俱进, 挑供更多智能化的场景功能, 比如搭建埋点, 数据预警等, 详细规划如下:

雄厚组件物料, 声援3D组件, 地理空间组件等 搭建埋点, 方便后期对组件进走分析 实现数据源, 事件机制闭环 声援用户自定义组件

本文转载自微信公多号「趣谈前端」,能够经历以下二维码关注。转载本文请相关趣谈前端公多号。

【编辑选举】ballbet体育平台

【坦然说】策略可视化在挂图作战中的实践与思考 微柔开源的可视化神器,上手太酷炫了 用Python获取了微信良朋数据,进走可视化分析发现 白话Matplotlib数据可视化 可视化神器Plotly玩转漏斗图
当前网址:http://www.radiotjandrafm.com/ballbettiyupingtai/145833.html
tag:ballbet,体育,平台,从,零,设计,可视化,大屏,