当前位置: 首页 > news >正文

C#+layui+echarts实现动态生成折线图

概要

C#+layui+echarts实现动态生成折线图

整体架构流程

后端是c#语言编写的业务流程,前端是layui和echarts

技术细节

1.先看echarts折线图需要什么样子的数据,在想后端怎么处理

2.后端代码
 

  List<ValveTempData> list = new List<ValveTempData>();
  string sql;
  //查询小区
  sql = string.Format(@"SELECT 
                                  c.village,
                                  a.AvgTemp,
                                  a.Record_Time 
                              FROM
                                 FHJL.dbo.Village AS a
                                  LEFT JOIN ICHSLocal.dbo.VillageAddress AS b ON a.villageID = b.foreignKey
                                  left join ICHSLocal.dbo.Addres c ON b.foreignKey=c.ID
                              WHERE
                                  b.heatKey = '{2}'", villageName, buildingName, CompanyID);

正常写sql最主要的是数据处理

 avgLine avgLine = new avgLine();
 List<string> xTime = new List<string>();
 List<avgTempLines> lines = new List<avgTempLines>();
 if (dt == null) return null;
 foreach (DataRow row in dt.Tables[0].Rows)
 {
     //ValveTempData data = new ValveTempData();
     //data.TMP_INDOOR = row["AvgTemp"] == DBNull.Value ? 0.0 : Convert.ToDouble(row["AvgTemp"]);                   
     //data.RTime = row["Record_Time"] == DBNull.Value ? "" : row["Record_Time"].ToString();
     //data.village = row["village"].ToString();

     if (xTime.IndexOf(row["Record_Time"].ToString()) == -1)
     {
         xTime.Add(row["Record_Time"].ToString());//所有新增的时间的时间转换为x轴的时间数据
     }
     bool lineflag = true;
     for (int i = 0; i < lines.Count; i++)//先轮询存曲线数值的数值,看是否存在该名称的数据,有就直接增加数据,没有就添加
     {
         if (lines[i].name == row["village"].ToString())
         {
             string[] ldata = new string[2] { row["Record_Time"].ToString(), row["AvgTemp"].ToString() };
             lines[i].ls.Add(ldata);
             lineflag = false;
         }
     }
     if (lineflag)//循环一遍没有对应的名称的数据则新增一条
     {
         avgTempLines avgTemp = new avgTempLines();
         avgTemp.name = row["village"].ToString();
         avgTemp.ls = new List<string[]>();
         string[] ldata = new string[2] { row["Record_Time"].ToString(), row["AvgTemp"].ToString() };
         avgTemp.ls.Add(ldata);
         lines.Add(avgTemp);
     }
     //list.Add(data);
 }
 avgLine.xData = xTime.ToArray();
 //所有查到的数据轮询完毕后,将过度用的list转为二维数组
 for (int i = 0; i < lines.Count; i++)
 {
     lines[i].data = lines[i].ls.ToArray();
 }
 avgLine.avgTemps = lines;
 return avgLine;

数据处理后存入的实体类的类型也有讲究存入一个name和一个list集合 list集合内存的是name和二维数组 还有一个中间过度集合 因为我需要在x轴展示名称和温度 需要用到二维数组

再就是前端了

   function FanCoilList(CompanyID, villageID, buildingID, unitID, roomID, parameter, startdate, enddate, todayName, flagData) {
       var TempIndoor = [];
       var Humidity = [];
       var Record_Time = [];
       console.log(villageID)
       if (villagename == '' || villagename == "请选择小区") {
           villageID == '';
       }
       $.ajax({
           type: "post",
           url: "../AJAXHandler.ashx",
           data: {
               "Method": "GetTemp", "villagename": villageID, "buildingname": buildingID, "UnitName": unitID, "RoomName": roomID, "startdate": startdate, "enddate": enddate, "todayName": todayName, "flagData": flagData
           },
           success: function (result) {
               // 初始化 ECharts 实例
               var myChart = echarts.init(document.getElementById('demolist'));
               // 清除之前的图表数据
               myChart.clear();
               result = JSON.parse(result).data;
               console.log(result);
               var seriesDatas = [];
               for (var i = 0; i < result.avgTemps.length; i++) {
                   var lineDatas = {
                       name: result.avgTemps[i].name,
                       data: result.avgTemps[i].data,
                       type: 'line',
                       // 设置数据点标记样式,这里使用默认的圆形标记
                       symbol: 'circle', // 或者 'emptyCircle',根据你的需要选择
                       // 设置标记的大小
                       symbolSize: 4, // 根据需要调整大小
                       // 设置折线弧度
                       smooth: 0.5,
                       // 允许通过图例控制显示隐藏
                       legendHoverLink: true
                   };
                   seriesDatas.push(lineDatas);
               }
               // 在 legend 组件中添加系列名称
               var legendData = seriesDatas.map(function (item) {
                   return item.name;
               });
               var option = {
                   tooltip: {
                       trigger: 'axis'
                   },
                   legend: {
                       data: legendData,
                       // 设置为 'multiple' 可以同时选择多个系列
                       selectedMode: 'multiple'
                   },
                   xAxis: {
                       type: 'category',
                       data: result.xData
                   },
                   yAxis: {
                       type: 'value',
                       name: '室内温度(℃)',
                       min: 14
                   },
                   series: seriesDatas,
                   dataZoom: [{
                       type: 'slider',
                       show: true,
                       xAxisIndex: [0],
                       start: 0,
                       end: 100
                   }]
               };
               // 使用配置项和数据显示图表
               myChart.setOption(option);
               myChart.on('click', function (params) {
                   console.log(params)
                   if (villagename == '' || villagename == "请选择小区") {
                       layer.msg("请选择小区!")
                       result;
                   } else {
                       selectScatterPlot(params.data[0])
                   }

               });
           }
       });

小结

以上就是我实现的希望可以提供参考价值

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Jvm基础(一)
  • uniapp开发钉钉小程序流程
  • 从零开始学习cartographer源码 | 02.cartographer_ros—node_main.cc
  • 智能听诊器:宠物健康监测的革新者
  • 视频压缩文件太大了怎么缩小?怎么压缩视频大小?视频压缩方法:10个!(宝藏)
  • Android TabLayout+ViewPager2如何优雅的实现联动详解
  • 网页HTTP协议 get请求和post请求区别?(HTTP中Get、Post、Put与Delete的区别)(HTTP请求方法、HTTP请求方式、HTTP方法)
  • 解决npm install(‘proxy‘ config is set properly. See: ‘npm help config‘)失败问题
  • 【虚幻引擎】C++网络通信TCP和HTTP实战开发全流程,以接入科大讯飞星火大模型和文心一言千帆大模型为案例讲解
  • 防范UDP Flood攻击的策略与实践
  • gitlab新建仓库
  • 安防视频监控/视频汇聚EasyCVR平台浏览器http可以播放,https不能播放,如何解决?
  • iPhone手机上备忘录怎么设置字数显示
  • Elasticsearch(ES)集群监控
  • 部署k8s 1.28.9版本
  • php的引用
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Github访问慢解决办法
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • js面向对象
  • nfs客户端进程变D,延伸linux的lock
  • node 版本过低
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • socket.io+express实现聊天室的思考(三)
  • spring boot 整合mybatis 无法输出sql的问题
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 测试如何在敏捷团队中工作?
  • 从零开始学习部署
  • 番外篇1:在Windows环境下安装JDK
  • 漂亮刷新控件-iOS
  • 前端性能优化--懒加载和预加载
  • 什么是Javascript函数节流?
  • 时间复杂度与空间复杂度分析
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 学习Vue.js的五个小例子
  • 中文输入法与React文本输入框的问题与解决方案
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​520就是要宠粉,你的心头书我买单
  • ​数据链路层——流量控制可靠传输机制 ​
  • #### golang中【堆】的使用及底层 ####
  • (C#)一个最简单的链表类
  • (LLM) 很笨
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十三)Flink SQL
  • (四)opengl函数加载和错误处理
  • (四)汇编语言——简单程序
  • (转)JAVA中的堆栈
  • (转)nsfocus-绿盟科技笔试题目