讲解一下通用可视化搭建平台整体的设计思路

一直以来,许多产品平台都在尝试通过可视化搭建的手段来降低GUI应用的研发门槛,提高生产效率。随着我们业务的发展,数据建设的完善,用户对于数据可视化的诉求也日益增多,而数据大屏是数据可视化的其中一种展示方式,它作为大数据展示媒介的一种,被广泛运用于各种会展、公司展厅、发布会等。

相比于传统手工定制的图表与数据仪表盘,通用大屏搭建平台的出现,可以解决定制开发,数据分散带来的应用开发、数据维护成本高等问题,通过数据采集、清洗、分析到直观实时的数据可视化展现,能够多方位、多角度、全景展现各项指标,实时监控,动态一目了然。

本文将通过敏捷BI平台的通用大屏搭建能力的实现方案,来讲解一下通用可视化搭建平台整体的设计思路。

二、快速了解可视化大屏

2.1什么是数据可视化

从技术层面上来讲,最直观的就是前端可视化框架:Echart、Antv、Chart.js、D3.js、Vega等,这些库都能帮我们快速把数据转换成各种形式的可视化图表。

从业务层面来讲,其最主要的意义就在于通过数据->图表组合->可视化页面这一业务流程,来帮助用户更加直观整体的分析不同行业和场景的趋势和规律。

所以在数据领域里,对于复杂难懂且体量庞大的数据而言,图表的信息量要大得多,这也是数据可视化最根本的目的。

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

主要由可视化组件+事件交互+坐标关系组成,效果如下图所示:

2.3可视化大屏和常见的BI报表看板的区别

经常会有同学会问到,可视化大屏和BI报表看板的区别是什么?

这里简单的做一下介绍:

大屏和报表看板都只是BI的其中一种展现方式,大屏更多是通过不同尺寸的显示器硬件上进行投屏,而报表看板更多是在电脑端进行展示使用。

大屏更加注重数据动态变化,会有极强的视觉体验和冲击力,提供丰富的轮播动画、表格滚动等动画特效。而报表看板更注重交互式数据探索分析,例如上卷下钻、排序、过滤、图表切换、条件预警等。

三、设计思路

3.1技术选型

前端框架:React全家桶(个人习惯)

可视化框架:EchartsDataV-React(封装度高,json结构的配置项易拓展)D3.js(可视化元素粒度小、定制能力强)

拖拽插件:dnd-kit(满足树状结构视图的跨组件拖拽)

布局插件:React-Grid-Layout(网格自由布局,修改源码,支持多个方向的拖拽,自由布局、锁定缩放比等)

3.2架构设计

下图是我们搭建平台的整体架构设计:

整个大屏搭建平台包含四个非常重要的子系统和模块:

画布编辑器:是搭建平台的核心与难点,支持页面布局配置、页面交互配置和组件数据配置等功能,另外还支持代码片段的配置,也可以称得上是一个低代码平台。

数据中心:是提供专门用于连接不同数据源的服务,例如直连MySQL、ClickHouse、Elasticsearch、Presto等,提供了大屏搭建所需要的原始数据。

管理中心:是大屏的后台运营管理模块,包含了大屏模版管理、大屏发布下线、访问权限等管理功能。

3.3搭建流程

通过上面提到的大屏组成元素,我们可以分析总结出大屏搭建主流程如下图所示:

四、核心功能实现

接下来我们会逐一对平台几个核心功能实现进行解析:

1、大屏自适应布局

背景:解决页面错乱问题,实现多种分辨率的大屏适配:

思考:首先我们想到的是移动端适配主流的vh、vw、rem组合的方式以及font.js+rem等两种方案。第一种方案主要是通过媒体查询来定义父级大小,然后对组件的height、margin、padding等多种css属性采用rem作为单位,继承父级设置等单位(1vw),实现自适应适配,第二种方案是引用第三方脚本,通过在main.js中写代码计算,使用rem进行继承,实现适配。

①vh、vw、rem组合

//vwvh单位w3c的官方解释vw:1%ofviewport’swidthvh:1%ofviewport’sheight//例如,设计稿的宽度为1920px,则1vw=19.2px,为了方便计算,我们将html元素的font-size大小设置为100px,也就是5.208vw=100px。body,html{font-size:5.208vw}

②font.js+rem

//监听窗口的oversize事件,来动态计算根节点字体大小,再配合rem做适配(function(doc,win){constdocEl=doc.documentElementconstresizeEvt='orientationchange'inwindow'orientationchange':'resize'constrecalc=function(){letclientWidth=docEl.clientWidthif(!clientWidth)returndocEl.style.fontSize=100*(clientWidth/1920)+'px'}if(!doc.addEventListener)returnwin.addEventListener(resizeEvt,recalc,false)doc.addEventListener('DOMContentLoaded',recalc,false)})(document,window)

缺陷:当我们大屏里面使用到的第三方插件,它的样式使用的是px为单位时,例如line-height的设置为20px,此时就不能适应行高,就会出现重叠等错乱问题。或者我们利用postcss-px2rem插件进行全局替换,但是在使用过程中,需要注意对已经处理过适配的插件,例如AntDesign,否则引入的antd控件使用会出现样式错乱的问题

解决思路:采用了css3的缩放transform:scale(X,Y)属性,主要是通过监听浏览器窗口的onresize事件,当窗口大小发生变化时,我们只需要根据大屏容器的实际宽高,去计算对应的放大缩小的比例,就可以实现布局的自适应了,我们也提供了不同的布局适应效果,例如等高缩放、等宽缩放、全屏铺满等,不同的缩放方式,决定了我们在计算宽高比例的优先级。因此我们后面在做画布的缩小功能,也可以直接使用这种方案来实现。

//基于设置的设计稿尺寸换算对应的宽高比useEffect(()=>{constwR=boxSize.width/viewWidth;consthR=boxSize.height/viewHeight;setBgScaleRatio(wR);setBgHeightScaleRatio(hR);},[boxSize,viewWidth,viewHeight]);//根据等宽、等高、全屏等不同的缩放比例计算scale值constgetScale=(proportion,x,y)=>{if(proportion==='radioWidth'){return`scaleX(${x})`}if(proportion==='radioHeight'){return`scaleY(${y})`}return`scale(${x},${y})`}

2、大屏组件通用开发流程设计

背景:随着可视化组件的增多、新增组件流程繁琐冗长,为了避免重复的造轮子以及后续引入第三方组件,需要制定一套通用的组件开发流程:

设计思路:组件=component组件主体+schema组件配置协议层+组件定义层(类型、从属关系、初始化宽高等)

①component组件主体:

可视化框架选型:行业主流可视化库有Echart、Antv、Chart.js、D3.js、Vega、DataV-React基于可视化的通用性和定制性的需求,我们选择了Echart、DataV-React作为基础组件的开发框架,面对定制性要求更高的自定义组件,我们选择了可视化粒度更小的D3.js。

封装通用Echarts组件(初始化、事件注册、实例注销等):

//initializationechartsconstrenderNewEcharts=()=>{//1.newechartsinstanceconstechartObj=updateEChartsOption();//2.bindeventsbindEvents(echartObj,onEvents||{});//3.onchartreadyif(typeofonChartReady==='function')onChartReady(echartObj);//4.onresizeechartObj.resize();};//bindtheeventsconstbindEvents=(instance,events)=>{const_bindEvent=(eventName,func)=>{instance.on(eventName,(param)=>{func(param,instance);});};//loopandbindfor(consteventNameinevents){if(Object.prototype.hasOwnProperty.call(events,eventName)){_bindEvent(eventName,events[eventName]);}}};//disposeechartsandclearsize-sensorconstdispose=()=>{if($chartEl.current){clear($chartEl.current);//disposeechartsinstance(echartsLib||echarts).dispose($chartEl.current);}};

封装通用DataV组件(DataV-React、自定义等组件入口,统一负责配置、数据收集、监听resize)

constDataV:React.FC=(props)=>{const{config}=props;const[renderCounter,setRenderCounter]=useState(0);const$dataVWarpEl=useRef(null);const$componentEl=useRef(null);useEffect(()=>{//绑定容器size监听constresizefunc=debounce(()=>{$componentEl.resize();},500)//fixmeaddResizeListener($dataVWarpEl.current,resizefunc);return()=>{//清除订阅removeResizeListener($dataVWarpEl.current,resizefunc);};},[]);return();};

②schema组件配置协议层+组件定义层(类型、从属关系、初始化宽高等)

我们自定义了一套schema组件的DSL,结构协议层。通过DSL约定了组件的配置协议,包括组件的可编辑属性、编辑类型、初始值等,之所以定义一致的协议层,主要是方便后期的组件扩展,配置后移。

JSONSchema设计:

{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'],//属性之间的联动,规则['配置所属类型,属性key,属性值']depContext:DepCommonShowState,//属性之间的校验回调方法compShow:['line'],//哪些组件可配置dataV:{key:'title.text',value:''},//配置的key值和默认value值},

表单DSL设计:

收益:以上是我们定制的DSL结构协议层,用户只需要填写Excel表格,就可以实现动态表单的创建,实现组件配置项分类、配置复用、配置项之间联动、属性注释等功能。目前属性配置器已经支持了常用的15种的配置UI控件,通过定制的DSL结构协议层,可以快速完成组件的配置界面初始化,为后续规划的组件物料中心做准备。

3、拖拽器实现

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

解决方案:通过分析源码,对不同纬度的拖拽事件以及拖拽目标碰撞事件进行了重写,并且也拓展了锁定宽高比、旋转透明度等功能。

源码分析:

resize伸缩特性增强(优化),拖拽的同时,除了修改容器宽高外,也动态调整了组件的坐标位置

//CSSTransformssupport(default)if(useCSSTransforms){if(activeResize){const{width,height,handle}=activeResize;constclonePos={...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);}}

堆叠显示,自由布局(优化),通过控制布局是否压缩,动态调整拖拽目标的层级zIndex来实现多图层组件操作交互和自由定位。

//每次拖拽时zIndex要在当前最大zIndex基础上+1,并返回给组件使用constgetAfterMaxZIndex=useCallback(i=>{if(i===curDragItemI){return;}setCurDragItemI(i);setMaxZIndex(maxZIndex=>maxZIndex+1);returnmaxZIndex;},[]);

改造后效果展示

4、大屏状态推送

背景:大屏的后期维护需要有版本发布自更新以及大屏下线等需求,这个时候就需要有一套消息通知机制,通过命令来控制大屏的运行状态。

解决方案:基于websocket通信机制,建立长链接,实现了心跳及重连机制,实时对上线发布后的大屏进行更新或下线管理。

五、效果预览

六、总结

本文通过可视化页面搭建、no/lowcode平台、Schema动态表单等技术思想来分析讲解了如何去设计开发一个通用的数据大屏搭建平台。

当前的设计方案基本满足了数据大屏的核心能力搭建需求。如果想实现更富有展现力,满足更多场景的大屏搭建平台,我们还需要进一步提高平台的扩展性和完善整体的物料生态,具体规划如下:

丰富和拓展大屏组件&配置能力,覆盖不同行业的可视化场景。

可视化物料平台的搭建,沉淀优秀的可视化组件、大屏模版素材。

THE END
1.23种设计模式介绍设计模式(Design Patterns)是软件开发中经过验证的解决方案,它们提供了一种通用的方式解决常见的设计问题。通过使用设计模式,开发者可以提高代码的可读性、可维护性和可扩展性。1994年,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著的《设计模式:可复用面向对象软件的基础》一书首次系统地介绍了23种https://blog.csdn.net/zhaoxilengfeng/article/details/144382870
2.软件架构三层结构图mob6454cc68310b的技术博客asp.net三层架构代码 aspnet三层架构结构图 接解asp.net已很久了,一直采用一个解决方案一个项目的方式去开发,所有的数据操作全放在一个类文件里,以为这就是所谓的三层结构,后来听说真正的大型网站的三层结构,应该是三个项目,或是更多的项目组成的,找网上找到N久的关于三层结构的教程,一直没有什么好的,可以入门的,https://blog.51cto.com/u_16099212/12797421
3.软件架构设计模式:从单体应用到微服务的演进策略详解软件架构设计模式:从单体应用到微服务的演进策略详解 一、引言 在当今的软件开发领域,随着业务的不断发展和需求的不断变化,单体应用架构已经不能满足日益增长的复杂需求。微服务架构作为一种新的解决方案,逐渐成为了各大企业关注的焦点。本文将对单体应用和微服务架构进行详细对比,并提出在实际应用中的演进策略。 https://www.jianshu.com/p/6035547eb228
4.软件架构设计软件架构风格是描述特定软件系统组织方式的惯用模式。组织方式描述了系统的组成构件和这些构件的组织方式;惯用模式则反映众多系统共有的结构和语义特性。强调对软件设计的重用。 架构风格定义一个系统家族,即一个架构定义一个词汇表和一组约束。词汇表中包含一些构件和连接件类型,而这组约束指出系统是如何将这些构件和连https://www.163.com/dy/article/GDGCECK505529XVP.html
5.架构设计常用到的10种设计模式,你都知道吗?企业规模的软件系统该如何设计呢?在开始写代码之前,我们需要选择一个合适的架构,这个架构将决定软件实施过程中的功能属性和质量属性。因此,了解软件设计中的不同架构模式对我们的软件设计会有较大的帮助。 软件架构模式 什么是架构模式?根据维基百科:架构模式是针对特定软件架构场景常见问题的通用、可重用解决方案。架构https://www.cloud.tencent.com/developer/news/470432
6.数字经济领域百问百答67.工业互联网平台基础共性能力要求包括哪些方面? 答:包括平台资源管理能力(工业设备管理、软件应用管理、用户与开发者管理、数据资源管理)、平台应用服务能力(存储计算服务、应用开发服务、平台间调用服务、安全防护服务、新技术应用服务)、平台基础技术能力(平台架构设计、平台关键技术)、平台投入产出能力(平台研发投入、https://www.zjk.gov.cn/content/bwbd/197999.html
7.企业私有云平台基础架构规划建设实践平台建设难点总结探讨最好以业务应用类型来驱动,例如,以微服务架构为基础设计的应用,就推荐使用云计算架构来满足其弹性伸缩的要求。 Q2: 企业云平台建设一共分几期?还是一部到位?云平台实施的方向? A2: 云平台很少有一步到位的,往往最开始的阶段是满足最基础的需求,例如计算虚拟化,存储虚拟化,然后网络虚拟化,然后容器,监控,大数据,编https://redhat.talkwithtrend.com/Article/217841
8.标签系列:标签管理平台的架构与设计数据Taylor有了对平台架构的整体认知之后,接下来就从产品设计角度,从标签的管理,生产,分析,应用四个方面聊聊下标签平台的常见功能与设计。 标签平台的产品设计 管理 包含了统一的对接入数据源的管理,围绕标签生命周期的管理,和作为平台通用的那些功能设计。 数据源管理 https://xie.infoq.cn/article/75059aca4fe6a85a12557b2a9
9.前端低代码平台架构介绍低代码前端开发框架为了充分发挥低代码开发在前端架构中的优势,我们可以采取以下策略:首先,深入了解项目的需求和特点,明确哪些部分适合使用低代码开发,哪些部分需要采用传统开发方式。其次,在选择低代码平台时,我们需要关注其组件库的丰富程度、自定义能力的强弱以及平台的稳定性和安全性。最后,我们需要保持对底层技术的关注和学习,不断提升https://www.bnocode.com/article/low-code-front-end-architecture.html
10.字节跳动一站式数据治理解决方案及平台架构文章上面介绍了我们应对数据治理的解决方案,包括全规则、全链路和一站式,接下来介绍具体的平台架构。 整体架构 首先在整体的架构部分,这是治理平台内整体的架构图。 其中灰色的部分是在平台透出给用户的产品能力,包括治理全景。治理全景对应于刚才在一站式的视图层能够告诉用户,有哪些资产,这些资产的情况是怎么样的。然后https://developer.volcengine.com/articles/7316453574492782642
11.10种常见的软件架构模式·微服务架构·看云架构模式是一个通用的、可重用的解决方案,用于在给定上下文中的软件体系结构中经常出现的问题。 架构模式与软件设计模式类似,但具有更广泛的范围。 在本文中,将简要地解释以下10种常见的体系架构模式,以及它们的用法、优缺点。 分层模式 客户端-服务器模式 https://www.kancloud.cn/architect-jdxia/architect/521056
12.如何做好整车开发的平台与架构?而在制造方面,当采用平台战略时,由于采用共用件策略,所以制造方式也必然是相同的。在扩展到架构策略时,虽然某些零部件已有所不同,但在相同工程解决方案的基础上,也有可能确定相同的制造方式或找到可以互换的制造方式,这就是所谓的模块化设计和制造。因此,所谓架构,实际上就是相同的工程解决方案和模块化制造工艺的综合http://www.360doc.com/content/21/0126/08/46573964_958971988.shtml
13.如何搭建全平台营销活动产品架构编辑导语:本文从平台性的营销活动切入,介绍了需求分析、产品设计架构思路和详细的单一活动模型设计,帮助大家熟悉底层逻辑,掌握核心要义,在产品初期就能够考虑到未来的扩展性、全面性,具有强势的扩展能力。 双十一大促,我们最关注的就是各家电商平台有哪些营销活动,哪些折扣的方式能够让在必须消费的前期下省钱到最低。甚https://supplier.alibaba.com/article/CTG0OO4P03O.htm
14.美好家长:打造有温度的教育共同体美好教育在上城热点专题课程架构中的内容遵循学生的发展核心,把家长和儿童的需求作为课程设计的出发点和落脚点,满足家长个性化、多样化终身学习的需求,注重解决家长教育中的突出问题,创新家庭教育指导方式,为家长提供多元、有针对性的指导服务。 2.家长课程内容精心选择 课程内容按照划分的四个年龄段,围绕十个核心问题进行内容的设计。学龄前https://z.hangzhou.com.cn/2019/mhjyzsc/content/content_7126138_0.html
15.常见的系统架构模式有哪些?详解8大系统架构设计哲学设计不仅仅指的是外观和感觉,它还包括运作方式。——史蒂夫·乔布斯 系统架构(System Architecture)、软件架构(Soft Architecture)是IT领域常见的名词,架构设计是软件系统构建过程中极其关键的一部分。 系统架构为什么重要?常见的架构模式都有哪些?本文将带你了解不同的架构设计所运用的不同设计哲学。 https://baidu-mip.xianjichina.com/news/details_254901.html
16.基于FPGA的实时图像处理实验平台设计AET本文介绍了一种采用CMOS摄像头作为视频源输入,SDRAM作为帧缓冲器,FPGA作为主控器和图像处理模块,ADV7123作为视频D/A转换器,UART和VGA作为输入输出接口的系统设计方案,对相关设计人员具有一定的参考价值。 1 实时图像处理实验平台架构 本系统由视频采集模块、帧缓存模块(处理前)、图像处理模块、帧缓存模块(处理后)、http://www.chinaaet.com/article/3000002969
17.全面易懂!写给新手的信息架构设计指南优设网简单来说,信息架构设计就是让用户可以 容易地理解你的产品是怎样的。让他们在使用你产品的时候可以更顺利更自然。就像一进入饭店就会有一种感觉,门口是等餐的地方,进去就应该吃饭,如果找洗手间一定不会往门口走,而会往深处走。这就是信息架构的好处:他让用户使用同类产品时更容易上手和理解,让产品更容易被接受。https://www.uisdc.com/information-architecture-design-guide
18.培训报告(通用13篇)本着“围绕打造本质安全型企业”的主题要求,利用职工班前班后会、安全文化建设、安全教育培训等方式方法,把安全教育主题活动和“以人为本”的理念落实到安全生产每一个环节,对职工安全意识的动态把握和对安全隐患的超前防控,使生产活动中危及劳动者生命安全、身体健康的各种事故风险和伤害因素,始终处于有效认知、动态。https://www.liuxue86.com/a/4986923.html