当前位置:   article > 正文

E3【数据可视化】【组件】基于Python+Flask+Echarts+HTML5拖放(DragDrop)实现的可拖放布局并自动保存布局的动态饼图_html5数据可视化

html5数据可视化

目录

一. 效果展示

二. 实现思路

所需知识点 

三. 系统架构

四. 关键代码

1. 页面div布局

2. 布局拖放 drag drop 处理

3. 布局保存

4. Python Flask web服务器

5. 饼图 - JSON 数据格式

6. 饼图 - AJAX动态刷新数据

五. 源码下载

一. 效果展示

本例演示了 页面元素支持 拖放 自定义布局, 并 自动永久保存 修改后的布局。(目前保存布局有2种方式:1种是使用前端cookie,这里采用了服务端保存的方式,满足实际使用场景的需求)

二. 实现思路

本文使用Echarts PIE 演示 HTML5 拖放效果,实际场景中可以替换为 Echarts 任意图表 以及其他 HTML 元素。

所需知识点 

HTML5 拖拽 https://www.w3school.com.cn/html/html5_draganddrop.asp

jQuery 处理DOM节点 https://www.w3school.com.cn/jquery/jquery_dom_get.asp

Python Flask https://github.com/pallets/flask

Echarts  Examples - Apache ECharts

三. 系统架构

1. 前后端分离:前端 Echarts JavaScript BootStrap; 后端Python Flask;

2. 数据动态更新:服务端触发数据源的变化,前端AJAX自动获取最新数据并渲染到Echarts图表上;

3. 数据格式:JSON;

四. 关键代码

1. 页面div布局

此页面由 4个并列的div,及一个可 draggable的 container div 组成,container用于渲染Echarts 饼图

  1. <div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)">
  2. <div draggable="true" ondragstart="drag(event)" id="container" style="height: 100%; width: 100%;"></div>
  3. </div>
  4. <div id="div2" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
  5. <div id="div3" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
  6. <div id="div4" ondrop="drop(event)" ondragover="allowDrop(event)"></div>

2. 布局拖放 drag drop 处理

drag 使用 dataTransfer 传递 div id

  1. function drag(ev) {
  2. ev.dataTransfer.setData("Text", ev.target.id);
  3. }

drop 接收drag 传递过来的div id。

  1. function drop(ev) {
  2. ev.preventDefault();
  3. var data = ev.dataTransfer.getData("Text");
  4. ev.target.appendChild(document.getElementById(data));
  5. save_layout(gen_layout());
  6. }

3. 布局保存

  1. // ajax 保存当前 div 布局到服务端
  2. function save_layout(layout) {
  3. $.post(
  4. "/save_layout/" + JSON.stringify(layout),
  5. function (rsp) {
  6. result = JSON.parse(rsp)
  7. console.log(rsp)
  8. }
  9. )
  10. }

4. Python Flask web服务

  1. app = Flask(__name__, static_folder="static", template_folder="template")
  2. @app.route('/')
  3. def hello_world():
  4. return 'Hello World!'
  5. # 主程序在这里
  6. if __name__ == "__main__":
  7. # 开启线程,触发动态数据
  8. a = threading.Thread(target=asyncJson.loop)
  9. a.start()
  10. # 开启 flask 服务
  11. app.run(host='0.0.0.0', port=88, debug=True)

5. 饼图 - JSON 数据格式

[{"name": "头条", "value": 602}, {"name": "百度", "value": 1409}, {"name": "搜狗", "value": 5215}, {"name": "app分享", "value": 1207}, {"name": "google", "value": 168}]

6. 饼图 - AJAX动态刷新数据

  1. $.getJSON(filename).done(function (data) {
  2. var myChart = echarts.init(document.getElementById(container));
  3. myChart.setOption({
  4. series: [
  5. { data: data },
  6. {
  7. data: data
  8. .sort(function (a, b) {
  9. return b.value[2] - a.value[2];
  10. })
  11. .slice(0, 5),
  12. },
  13. ],
  14. });
  15. });
  16. }

五. 源码下载

https://download.csdn.net/download/lildkdkdkjf/85327819

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/790830
推荐阅读
相关标签
  

闽ICP备14008679号