• 34【源码】数据可视化:基于 Echarts + Python 动态实时大屏 - 视频平台


    效果图展示

    1.动态实时更新数据效果图

    说明: 其中 今日抓拍,抓拍总数,预警信息统计,监控点位统计图表 做了动态实时更新处理

    3a16d4493655406d95d79cdcd2e85b86.gif

     2.静态切片效果图

    24c1d654b6b649c2bb00b5844c902caf.png

     

    一、确定需求方案

    1、确定产品上线部署的屏幕LED分辨率

    本案例基于16:9 屏宽比,F11全屏显示。

    2、部署方式 

    基于免安装可执行程序:支持Windows、Linux、Mac等各种操作系统;将程序复制到服务器上即可,无需其它环境依赖;

    观看方式:既可在服务器上直接观看程序界面,也可在远程用浏览器打开播放,例如Chrome浏览器、360浏览器等。

    二、整体架构设计

    1. 前端基于Echarts开源库设计,使用WebStorm编辑器;
    2. 后端基于Python Flask实现,使用 Vscode 编辑器;
    3. 数据传输格式:JSON;
    4. 数据源类型:目前采用JSON文件方式,可自行添加支持PostgreSQL、MySQL、Oracle、Microsoft SQL Server、SQLite,自行添加pandas支持Excel表格等,还可以定制HTTP API接口方式。
    5. 数据更新方式:采用http get 轮询方式 。在实际应用中,也可以视情况选择j监测后端数据实时更新,实时推送到前端的方式;

    三、编码实现 (关键代码)

    1、前端html代码 - 页面布局主要基于div

    1. <body>
    2. <div class="body">
    3. <div class="head-box">
    4. <div class="logout-box"></div>
    5. <div class="link-box"></div>
    6. 南方软件视频平台大屏中心
    7. <div class="time-box" id="time">202291</div>
    8. </div>
    9. <div class="main">
    10. <!--left-->
    11. <div class="col">
    12. <!--巡查视频问题-->
    13. <div class="col-box1">
    14. <div class="col-title">巡查视频问题</div>
    15. <div class="col-main">
    16. <ul class="xcspwt-box js-xcspwt">
    17. <li>
    18. <span>张三丰</span>
    19. <span title="南京信息工程大学地铁站1号出口监控点">南京信息工程大学地铁站1号出口监控点</span>
    20. <span title="视频信号不稳定">视频信号不稳定</span>
    21. </li>
    22. .......
    23. </ul>
    24. </div>
    25. </div>
    26. <!--巡查视频问题统计-->
    27. <div class="col-box1">
    28. <div class="col-title">巡查视频问题统计</div>
    29. <div class="col-main">
    30. <!--视频问题统计-->
    31. <ul class="spwtzgtj-box">
    32. <li>
    33. <span>问题总数</span>
    34. <span>234</span>
    35. </li>
    36. <li>
    37. <span>已整改</span>
    38. <span>34</span>
    39. </li>
    40. <li>
    41. <span>未整改</span>
    42. <span>200</span>
    43. </li>
    44. </ul>
    45. <div class="spwttj-echarts" id="spwttjEchart">
    46. </div>
    47. </div>
    48. </div>
    49. </div>
    50. <!--center-->
    51. <div class="col">
    52. <!--预警信息推送-->
    53. <div class="col-box1">
    54. <ul class="zpsl-box">
    55. <li>
    56. <span>今日抓拍</span>
    57. <span id="today_snap">1245</span>
    58. </li>
    59. <li>
    60. <span>抓拍总数</span>
    61. <span id="total_snap">3421</span>
    62. </li>
    63. </ul>
    64. <div class="col-title">预警信息推送</div>
    65. <div class="col-main js-tjxxtsxq" style="height: calc(100% - 190px);margin-top: 10px">
    66. <div class="yjxxts-box">
    67. <img src="img/12.png">
    68. </div>
    69. <div class="yjxxts-box">
    70. <img src="img/12.png">
    71. </div>
    72. <div class="yjxxts-box">
    73. <img src="img/12.png">
    74. </div>
    75. </div>
    76. </div>
    77. <!--预警信息统计-->
    78. <div class="col-box1">
    79. <div class="col-title">预警信息统计</div>
    80. <div class="col-main ">
    81. <ul class="yjxxtj-title js-tab">
    82. <li class="on">有人统计</li>
    83. <li>无人统计</li>
    84. </ul>
    85. <div class="yjxxtj-box">
    86. <ul class="wgxc-box js-wgxcBox">
    87. <li>
    88. <div class="wgxc-bar"><span id="wgxc_span1" class="wgxc-sl-bar"
    89. style="height:10%"></span></div>
    90. <div class="wgxcName">南京</div>
    91. </li>
    92. ......
    93. </ul>
    94. </div>
    95. </div>
    96. </div>
    97. </div>
    98. <!--right-->
    99. <div class="col">
    100. <!--全市监控点位统计-->
    101. <div class="col-box1">
    102. <div class="col-title">
    103. 全市监控点位统计
    104. </div>
    105. <div class="col-main">
    106. <div class="qsjk-box" id="qsjkdwEcharts">
    107. <!--全市监控点位-->
    108. </div>
    109. </div>
    110. </div>
    111. <!--系统公告&资源下载-->
    112. <div class="col-box1">
    113. <div class="col-title">
    114. <ul class="xtggzlxz-box js-tab js-xtggzlxz">
    115. <li class="on">资源下载</li>
    116. <li>系统公告</li>
    117. </ul>
    118. </div>
    119. <div class="col-main" style=" height:calc(100% - 75px);padding:20px 0;overflow: hidden">
    120. ......
    121. </div>
    122. </div>
    123. </div>
    124. <!--预警信息推送弹框-->
    125. <div class="yjxxts-tkbox js-yjxxtsTkbox">
    126. <img src="img/12.png">
    127. <div class="yjxxts-xqbox">
    128. <div class="col-title">详情</div>
    129. <div class="yjxxts-xqmain">
    130. <table>
    131. <tr>
    132. <td>监控点位</td>
    133. <td>地铁站</td>
    134. </tr>
    135. <tr>
    136. <td>预警时间</td>
    137. <td>2018-10-21</td>
    138. </tr>
    139. <tr>
    140. <td>预警类型</td>
    141. <td>无人在岗</td>
    142. </tr>
    143. <tr>
    144. <td>预警状态</td>
    145. <td>已处理</td>
    146. </tr>
    147. </table>
    148. </div>
    149. </div>
    150. </div>
    151. </div>
    152. </div>
    153. </body>

    2. 前端JS - echarts图表

    b02d67edc8514d16aee8f42efbbad7c4.png

    1. /**全市监控点位统计**/
    2. var loadqsjkdw = function () {
    3. var myCharts = echarts.init(document.getElementById('qsjkdwEcharts'));
    4. var option = {
    5. grid: {
    6. left: '5px',
    7. right: '0%',
    8. bottom: '18%',
    9. top:'10%',
    10. },
    11. tooltip: {
    12. show: "true",
    13. trigger: 'axis',
    14. axisPointer: { // 坐标轴指示器,坐标轴触发有效
    15. type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
    16. },
    17. formatter:'{b0}:{c0}'
    18. },
    19. yAxis: {
    20. show:false,
    21. splitLine: {show: false,
    22. lineStyle:{
    23. color:'#353E47'
    24. }
    25. },
    26. axisTick: {show: false},
    27. axisLine: {show: true,
    28. lineStyle:{
    29. color:'#353E47'
    30. }},
    31. axisLabel: {
    32. textStyle: {
    33. color: '#ffffff'
    34. },
    35. formatter:function(value,index){
    36. var r = '';
    37. if(value>100000000){//亿
    38. r = (value/100000000).toFixed(1) + '亿';
    39. }else if(value>10000){//
    40. r = (value/10000).toFixed(1) + '万';
    41. }else{
    42. r = value;
    43. }
    44. return r;
    45. }
    46. }
    47. },
    48. xAxis: [
    49. {
    50. type: 'category',
    51. axisTick: {
    52. show: false
    53. },
    54. axisLine: {
    55. show: true,
    56. lineStyle: {
    57. color: '#353E47',
    58. }
    59. },
    60. axisLabel:{
    61. textStyle:{
    62. color:'#fff'
    63. },
    64. interval:0
    65. },
    66. data: ["南京","苏州","无锡","常州","南通","徐州","淮安","镇江","泰州"]
    67. }
    68. ],
    69. series: [
    70. {
    71. name: '',
    72. type: 'bar',
    73. barWidth:'20px',
    74. itemStyle: {
    75. normal: {
    76. show: true,
    77. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
    78. offset: 0,
    79. color: '#00d891'
    80. }, {
    81. offset: 1,
    82. color: '#00579a'
    83. }]),
    84. barBorderRadius: 50,
    85. borderWidth: 0,
    86. borderColor: '#333',
    87. }
    88. },
    89. label: {
    90. normal: {
    91. show: true,
    92. position: 'top',
    93. textStyle: {
    94. color: '#fff'
    95. }
    96. }
    97. },
    98. data:qsjkdw,
    99. }
    100. ]
    101. };
    102. myCharts.clear();
    103. myCharts.setOption(option);
    104. myCharts.on("click",function(e){
    105. loadsqjkdw();
    106. });
    107. };

    3. 前端JS - 数据定时更新控制

    支持在每个echarts图表中独立控制定时更新的间隔。

    1. var init = function () {
    2. updateEcharts();
    3. setInterval(function() {updateEcharts()},2000);//刷新周期设置
    4. xcwttj();
    5. loadqsjkdw();;
    6. };

    4. 后端 Python Flask 代码

    1. # -*- coding:utf-8 -*-
    2. import io
    3. import os
    4. import sys
    5. import time
    6. import urllib
    7. import random
    8. import json
    9. from flask import Flask, redirect
    10. # 导入线程模块
    11. import threading
    12. app = Flask(__name__, static_folder="static", template_folder="template")
    13. @app.route('/')
    14. def index():
    15. return redirect('/static/index.html')
    16. @app.route('/get_snap')
    17. def get_snap():
    18. jsonData = {}
    19. jsonData['today_snap'] = random.randint(1, 100)
    20. jsonData['total_snap'] = random.randint(1, 1000)
    21. return json.dumps(jsonData)
    22. @app.route('/qsjkdw')
    23. def qsjkdw():
    24. jsonData = []
    25. for x in range(9):
    26. jsonData.append({"value": str(random.randint(1, 100))})
    27. return json.dumps(jsonData)
    28. @app.route('/get_yjxxtj')
    29. def get_yjxxtj():
    30. jsonData = []
    31. for x in range(6):
    32. jsonData.append(random.randint(1, 100))
    33. return json.dumps(jsonData)
    34. def loop():
    35. time.sleep(10)
    36. pass
    37. # 主程序在这里
    38. if __name__ == "__main__":
    39. # 开启线程,触发动态数据
    40. a = threading.Thread(target=loop)
    41. a.start()
    42. # 开启 flask 服务
    43. app.run(host='127.0.0.1', port=80, debug=True)

    四、运行效果

    38f1b7e12d134fbda65ea7b3922ff8e6.gif

    五、更多案例 


    YYDatav的数据可视化大屏《精彩案例汇总》(Python&Echarts源码)_YYDataV的博客-CSDN博客

    【工厂扫码打印&扫码装箱&错误追溯系统】完整案例详解(Python&PyQt 源码&Mysql数据库)_YYDataV数据可视化的博客-CSDN博客_pyqt案例

    感谢开源分享的前端代码。

     

     

  • 相关阅读:
    C3P Software 发布 Cast-Designer V7.7版本
    查网站域名历史,查域名有没有灰记录,查域名有多少外链的好工具
    前端常用的状态码
    毕业图形采集【个人】
    大语言模型LLM微调技术深度解析:Fine-tuning、Adapter-Tuning与Prompt Tuning的作用机制、流程及实践应用(LLM系列08)
    linux安全配置规范
    Spring Boot:自定义注解--annotation
    每日五问(java)
    【667. 优美的排列 II】
    C++ 特殊矩阵的压缩存储算法
  • 原文地址:https://blog.csdn.net/lildkdkdkjf/article/details/126682481