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

news2024/9/20 14:47:18

概要

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])
                   }

               });
           }
       });

小结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud中怎么使用Resilience4j RateLimiter对接口进行限流

在微服务架构中&#xff0c;限流是保护系统稳定性的重要手段之一。限流可以防止某个服务因流量过大而过载&#xff0c;影响整个系统的稳定性和性能。Resilience4j 提供了多种限流策略&#xff0c;其中 RateLimiter 是一种常用的限流机制。本文将详细介绍如何在 Spring Cloud 项…

组内第一次会议

会议内容 1、科研平台使用 增删改查对文件 cp -r /root/mmdetection/dataset/ /root/user/wbzExperiment/mmdetection/ rm -r /root/user/yolov5-master tar -czvf test03.tar.gz test03/ unzip abc.zip 上传文件、解压文件&#xff1a;要在自己的目录中&#xff0c;进入…

普中51单片机:LED点阵屏组成结构及实现方法详解(九)

文章目录 引言什么是LED点阵屏&#xff1f;工作原理74HC595移位寄存器基本引脚作用级联工作原理 电路图代码演示——16*16LED点阵屏轮播点亮每行LED代码演示——显示数字0代码演示——16*16游动字幕显示 引言 LED点阵屏作为一种广泛应用于现代显示技术的设备&#xff0c;因其能…

Linux_线程的使用

目录 1、线程与进程的关系 2、线程的优缺点 3、创建线程 4、查看启动的线程 5、验证线程是共享地址空间的 6、pthread_create的重要形参 6.1 线程id 6.2 线程实参 7、线程等待 8、线程退出 9、线程取消 10、线程tcb 10.1 线程栈 11、创建多线程 12、__th…

学生信息管理系统设计

学生信息管理系统的设计是一个综合性的项目&#xff0c;涉及到数据的存储、检索、更新和删除等基本操作&#xff0c;同时也需要考虑系统的易用性、安全性和扩展性。以下是一些关键步骤和要素&#xff0c;用于指导设计这样一个系统&#xff1a; 1. 需求分析 目标用户&#xff…

wls2下的centos使用桥接模式连接宿主机网络独立静态ip

前提&#xff1a;wsl2已安装&#xff0c;可正常更新 1.在控制面板中&#xff0c;打开开启或关闭windows功能&#xff0c;将里面的 Hyper-V功能打开&#xff0c;此处涉及重启 2. 按一下win键&#xff0c;输入hy&#xff0c;上面可以看到Hyper-V Manager,点进去 3.选择右边的 Vi…

Redis系列命令更新--Redis有序集合命令

Redis有序集合&#xff08;sorted set&#xff09; &#xff08;1&#xff09;说明&#xff1a; A、Redis有序集合和集合一样也是string类型元素的集合&#xff0c;且不允许重复的成员&#xff1b;不同的是每个元素都会关联一个double类型的分数&#xff1b;redis正式通过分数…

Java语言程序设计——篇五(1)

数组 概述数组定义实例展示实战演练 二维数组定义数组元素的使用数组初始化器实战演练&#xff1a;矩阵计算 &#x1f4ab;不规则二维数组实战演练&#xff1a;杨辉三角形 概述 ⚡️数组是相同数据类型的元素集合。各元素是有先后顺序的&#xff0c;它们在内存中按照这个先后顺…

【ProtoBuf】通讯录实现(网络版)

Protobuf 还常用于通讯协议、服务端数据交换场景。那么在这个示例中&#xff0c;我们将实现一个网络版本的通讯录&#xff0c;模拟实现客户端与服务端的交互&#xff0c;通过 Protobuf 来实现各端之间的协议序列化。 需求如下&#xff1a; 客户端可以选择对通讯录进行以下操…

电脑文件恢复哪个好?分享四个建议记住常备的方法!

当我们发现电脑误删文件的时候&#xff0c;一定会感到焦虑和困惑&#xff0c;但是一味地焦虑和困惑是没有任何帮助的。我们需要保持冷静&#xff0c;然后通过以下几个方法找回。 电脑文件恢复的方法有很多&#xff0c;选对适合自己的数据恢复软件很重要&#xff0c;本文罗列了几…

引领小模型潮流!OpenAI发布功能强大且成本低的GPT-4o mini

GPT-4o mini的成本比GPT-3.5 Turbo低了超过60%&#xff0c;其聊天表现优于Google的Gemini Flash和Anthropic的Claude Haiku。该模型从周四开始对ChatGPT的免费用户、ChatGPT Plus用户和团队订阅用户开放&#xff0c;并将在下周向企业用户开放。OpenAI计划未来将图像、视频和音频…

Linux——五种IO模型

目录 一、I/O的理解 二、五种IO模型 1.阻塞式IO 2.非阻塞式IO 3.信号驱动IO 4.多路复用IO 5.异步IO 一、I/O的理解 I/O的本质就是输入输出&#xff0c;C语言的stdio&#xff0c;C的iostream&#xff0c;添加了这两个库&#xff0c;我们才能够进行printf、scanf、cin、c…

UDP网口(1)概述

文章目录 1.计算机网络知识在互联网中的应用2.认识FPGA实现UDP网口通信3.FPGA实现UDP网口通信的方案4.FPGA实现UDP网口文章安排5.传送门 1.计算机网络知识在互联网中的应用 以在浏览器中输入淘宝网为例&#xff0c;介绍数据在互联网是如何传输的。我们将要发送的数据包称作A&a…

人工智能AI合集:1、嵌入式LinuxAI开发套件OrangePI AIPRO初体验

前言 随着人工智能技术的飞速发展&#xff0c;AI已经不再是遥不可及的高科技概念&#xff0c;而是逐渐融入到我们的日常生活中。从智能手机的语音助手到家庭中的智能音箱&#xff0c;再到工业自动化和医疗诊断&#xff0c;AI的应用无处不在。然而&#xff0c;要想真正掌握并应用…

数学建模学习(111):改进遗传算法(引入模拟退火、轮盘赌和网格搜索)求解JSP问题

文章目录 一、车间调度问题1.1目前处理方法1.2简单案例 二、基于改进遗传算法求解车间调度2.1车间调度背景介绍2.2遗传算法介绍2.2.1基本流程2.2.2遗传算法的基本操作和公式2.2.3遗传算法的优势2.2.4遗传算法的不足 2.3讲解本文思路及代码2.4算法执行结果&#xff1a; 三、本文…

基于java的设计模式学习

PS &#xff1a;以作者的亲身来看&#xff0c;这东西对于初学者来说有用但不多&#xff0c;这些东西&#xff0c;更像一种经验的总结&#xff0c;在平时开发当中一般是用不到的&#xff0c;因此站在这个角度上用处不大。 1.工厂模式 1.1 简单工厂模式 我们把new 对象逻辑封装…

SpringBoot缓存注解使用

背景 除了 RedisTemplate 外&#xff0c; 自Spring3.1开始&#xff0c;Spring自带了对缓存的支持。我们可以直接使用Spring缓存技术将某些数据放入本机的缓存中&#xff1b;Spring缓存技术也可以搭配其他缓存中间件(如Redis等)进行使用&#xff0c;将某些数据写入到缓存中间件…

【Linux】信号(signal)

目录 一、信号概念&#xff1a; 二、信号的常见状态&#xff1a; 信号递达&#xff1a; 信号未决&#xff1a; 阻塞信号&#xff1a; 忽略信号&#xff1a; 信号在内核中的表示&#xff1a; 三、信号相关函数&#xff1a; sigset_t &#xff08;类型&#xff09;&…

2024.7.19 作业

1.链表的排序 int list_sort(NodePtr L) {if(NULLL || L->len<1){printf("排序失败");return -1;}int lenL->len1;NodePtr p;int i,j;for( i1;i<len;i){for( j0,pL;j<len-i;j,pp->next){if( p->data > p->next->data ){datatype tp-&…

基于51单片机的步进电机控制系统proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1jFlIJ9I5qxjW8sYKd6vrBQ?pwd9d6q 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMic…