SpringBoot+Vue+Echarts实现多条折线图

先上效果图
在这里插入图片描述

后端

项目需求:从txt文件中读取数据,然后前端进行展示。

后端根据需要返回数据,可以将需要显示的数据封装为一个类,例如横坐标为时间,纵坐标为时延,这样就可以将时间和时延封装为一个类,向前端返回该类的list集合。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class DataVis {
    private String second; // 当前秒      X轴数据
    private String delay;  // 时延        Y轴数据
}
@RequestMapping("/getData")
public List<DataVis> getData(String path){   // 前端传来一个文件名
    String realPath = "async"+"\\"+path;     // 拼接为实际路径
    String[][] strings = DataHandler.get(realPath); // 这块是调用自己写的函数,实际就是从txt中读取数据,返回多行两列的数组
    List<DataVis> dataVisList = new ArrayList<>();
    for (String[] string : strings) {  // 每一行实现一个对象,最后返回对象列表
        DataVis dataVis = new DataVis();
        dataVis.setSecond(string[0]);
        dataVis.setDelay(string[1]);
        dataVisList.add(dataVis);
    }
    return dataVisList;
}

前端

<template>
  <div>
    <el-container>
      <el-aside width="200px">
        侧边栏
      </el-aside>
      <el-main>
        <div id="myChart1" :style="{width:'100%',height:'600px'}"> </div>
      </el-main>
    </el-container>

  </div>
</template>

<script>
import * as $echarts from 'echarts';
import axios from "axios";

export default {
  name: "timeData",
  data() {
    return {
      chart1: '',
    }
  },
  mounted() {
    this.drawLine1();
    this.initData();
  },
  methods: {
    async initData() {
      const second45 = [];
      const delay45 = [];
      let formData= new FormData();
      formData.append("path","result1.txt"); // 往后端传需要解析的文件,这是本项目需要的,实际可以不传参数
      await axios.post("/getData",formData).then(res => { // 接收返回值,因为返回的是
        for (let re of res.data){
          second45.push(re.second);
          delay45.push(re.delay);
        }
      });
      const secondSend = [];
      const delaySend = [];
      let formData1= new FormData();
      formData1.append("path","result2.txt");
      await axios.post("/getData",formData1).then(res => {
        for (let re of res.data){
          secondSend.push(re.second);
          delaySend.push(re.delay);
        }
      });
      const secondServer = [];
      const delayServer = [];
      let formData2= new FormData();
      formData2.append("path","result3.txt");
      await axios.post("/getData",formData2).then(res => {
        for (let re of res.data){
          secondServer.push(re.second);
          delayServer.push(re.delay);
        }
      });
      this.chart1.setOption({
        xAxis: {                // X轴
          data: second45,       // X轴的数据,是一个数组
          name: '时间(秒)',     // X轴名字 字体颜色和大小
          nameTextStyle: {     
            color: '#0e9e9e',
            fontSize: 10,
          },
          axisLabel: {         // X轴刻度值的颜色和大小
            show: true,
            textStyle: {
              color: '#0e9e9e',
              fontSize: 15,
            },
            //解决横坐标自动隐藏问题
            // interval: 0
          }
        },
        yAxis: {        
          type: 'value',
          name: '数据包(个)',     // Y轴的名字 字体颜色和大小
          nameTextStyle: {
            color: '#0e9e9e',
            fontSize: 15,
          },
          axisLabel: {            // Y轴刻度的颜色和大小
            show: true,
            textStyle: {
              color: '#0e9e9e',
              fontSize: 15,
            },
          }
        },
        series: [           // Y轴的数据
          {
            name: '45端口',  // 每一个是一个Y轴的折线
            type: 'line',
            stack: 'Total',
            data: count45   // 对应的数据数组
          },
          {
            name: '发送端',
            type: 'line',
            stack: 'Total',
            data: countSend
          },
          {
            name: '服务端',
            type: 'line',
            stack: 'Total',
            data: countServer
          },
        ]
      });
    },
    drawLine1() {
      this.chart1 = $echarts.init(document.getElementById('myChart1'));
      let option = {
        title: {               // 标题名称
          text: '时间数据包图',
          textStyle: {
            fontSize: 20,
            color: '#009229',
          },
          left: 'right'
        },
        tooltip: {
          trigger: 'axis'
        },
        color: ['#ff4141','#69fa20','#2c3f6d'],  // Y轴折线的颜色,与legend的data数据相匹配
        legend: {
          data: ['45端口', '发送端', '服务端'],
        },
        grid: {
          left: '3%',
          right: '4%',
          bottom: '3%',
          containLabel: true
        },
        xAxis: {
          type: 'category',
          boundaryGap: false,
          data: []
        },
        yAxis: {
          type: 'value'
        },
        animation: true,           // 是否展示动画
        animationDuration: 20000,  // 动画时长  单位毫秒  此处设为20秒完成数据展示
        series: [{}]
      };
      this.chart1.setOption(option);
    },
  }
}
</script>

<style scoped>

</style>

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个基于Spring框架的快速开发Web应用程序的框架,Vue是一种流行的JavaScript框架,用于构建用户界面,MySQL是一种流行的关系型数据库,Echarts是一个基于JavaScript的图表库,用于可视化数据。结合这些技术可以构建一个功能强大的Web应用程序,以下是一个简单的演示: 1.后端使用Spring Boot和Mybatis Plus连接MySQL数据库,提供API接口供前端调用,以下是一个简单的示例代码: ```java @RestController @RequestMapping("/api") public class DataController { @Autowired private DataService dataService; @GetMapping("/data") public List<Data> getData() { return dataService.getData(); } } ``` 2.前端使用Vue和Element-UI构建用户界面,使用Echarts可视化数据,以下是一个简单的示例代码: ```vue <template> <div> <el-table :data="tableData"> <el-table-column prop="name" label="名称"></el-table-column> <el-table-column prop="value" label="值"></el-table-column> </el-table> <div ref="chart" style="height: 400px;"></div> </div> </template> <script> import axios from 'axios' import echarts from 'echarts' export default { data() { return { tableData: [] } }, mounted() { axios.get('/api/data').then(response => { this.tableData = response.data this.renderChart() }) }, methods: { renderChart() { const chart = echarts.init(this.$refs.chart) const data = this.tableData.map(item => ({ name: item.name, value: item.value })) chart.setOption({ title: { text: '数据可视化' }, tooltip: {}, xAxis: { data: data.map(item => item.name) }, yAxis: {}, series: [{ name: '值', type: 'bar', data: data.map(item => item.value) }] }) } } } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值