SpringBoot+MongoDB+Echarts实现简易报表数据可视化

版权声明:本文为博主原创文章,转载请注明出处 浅然的专栏 https://blog.csdn.net/w_linux/article/details/81150217

该篇博客通过SpringBoot+MongoDB+Echarts实现报表数据可视化的一个简易折线报表demo,该博客是前后分离架构,所以笔者会从后端实现、前端实现来分别阐述

一、Demo效果(实现一个每天人流量的折线图demo)

这里写图片描述


二、MongoDB造假数据

MongoDB中的数据因为是demo,所以数据都是非真实的

  • 数据库名称:test
  • 集合名称:time_flow
  • 造假数据

    {
    "_id" : ObjectId("5b53271bbe55049796eed1aa"),
    "id" : 1,
    "2018-01-03" : 21,
    "2018-01-04" : 2,
    "2018-01-05" : 33,
    "2018-01-06" : 3,
    "2018-01-07" : 44,
    "2018-01-08" : 43,
    "2018-01-09" : 22,
    "2018-01-10" : 12
    }
    

这里写图片描述


三、SpringBoot后台搭建开发

1、后台项目目录

这里写图片描述

2、配置application.properties

#服务器端口
server.port=8080
#项目路径
server.servlet.context-path=/api
#mongodb配置
spring.data.mongo.host=127.0.0.1
spring.data.mongo.port=27017
spring.data.mongo.database=test

3、实体类(EchartsPOJO)

package com.example.demo.domain;

/**
 * @Author: linjie
 * @Description: 时间\人流量实体类
 * @Date: 下午 15:55 2018/7/21 0021
 */
public class EchartsPOJO {
    private String datetime;    //时间
    private Integer flow;   //流量
    /**
     *构造方法
     **/
    public EchartsPOJO(String datetime, Integer flow) {
        this.datetime = datetime;
        this.flow = flow;
    }
    public EchartsPOJO(){}

    /**
     *setter and getter
     **/
    public String getDatetime() {
        return datetime;
    }

    public void setDatetime(String datetime) {
        this.datetime = datetime;
    }

    public Integer getFlow() {
        return flow;
    }

    public void setFlow(Integer flow) {
        this.flow = flow;
    }

    /**
     *toString方法
     **/
    @Override
    public String toString() {
        return "EchartsPOJO{" +
                "datetime='" + datetime + '\'' +
                ", flow=" + flow +
                '}';
    }
}

4、服务层接口及其实现类

ITimeFlow接口

package com.example.demo.service;

import java.util.Map;

/**
 * @Author: linjie
 * @Description: 时间 人流量接口
 * @Date: 下午 16:02 2018/7/21 0021
 */

public interface ITimeFlow {
    Map GetTimeFlow();
}

TimeFlowImpl实现类

package com.example.demo.service.impl;

import com.example.demo.domain.EchartsPOJO;
import com.example.demo.service.ITimeFlow;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.springframework.stereotype.Service;

import java.util.*;
/**
 * @Author: linjie
 * @Description: 时间 人流量接口实现类
 * @Date: 下午 16:04 2018/7/21 0022
 */
@Service
public class TimeFlowImpl implements ITimeFlow{
    @Override
    public Map GetTimeFlow() {
        //创建MongoDB数据库对象,连接MongoDB
        MongoClient mongoClient = new MongoClient("localhost",27017);
        //指定使用的数据库和集合
        MongoDatabase mongoDatabase = mongoClient.getDatabase("test");
        MongoCollection<Document> collection = mongoDatabase.getCollection("time_flow");
        //设定条件
        //获取数据
        Document query = new Document("id",1);
        FindIterable<Document> findIterable = collection.find(query);
        /**
         *遍历findIterable
         *获取时间和流量
         **/
        int count = 0;//计数器,保证获取的key是date而不是其他数据
        List<EchartsPOJO> list = new ArrayList<>();//存储EchartsPOJO
        for (Document fi : findIterable){
            Iterator<String> iterator = fi.keySet().iterator();
            /**
             *迭代器遍历
             *获取key和value(日期和流量)
             **/
            while (iterator.hasNext()){
                //获得key
                String key = iterator.next();
                if(count > 1){
                    Integer value = fi.getInteger(key);
                    list.add(new EchartsPOJO(key,value));
                }
                count++;
            }
        }
        Map map = new HashMap();
        map.put("list",list);
        return map;
    }
}

5、控制层请求处理控制器(EchartsController)

package com.example.demo.controller;

import com.example.demo.domain.EchartsPOJO;
import com.example.demo.service.ITimeFlow;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.Map;

/**
 * @Author: linjie
 * @Description: 请求处理控制器
 * @Date: 下午 17:06 2018/7/21 0021
 */
@RestController
//实现跨域
@CrossOrigin(origins = "*",maxAge = 3600)
public class EchartsController {
    @Resource
    private ITimeFlow iTimeFlow;

    @GetMapping("/timeflow")
    public Map timeflow(){
        return iTimeFlow.GetTimeFlow();
    }
}

6、后台数据回显测试

这里写图片描述


四、前台Echarts+ajax实现

1、前台项目目录

这里写图片描述

2、index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>折线demo</title>
        <script type="text/javascript" src="js/echarts.min.js"></script>
        <script type="text/javascript" src="js/echarts-gl.min.js"></script>
        <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
    </head>
    <body>
    <!--定义一个Echarts容器-->
    <div id="TwoLineChart" style="width: 600px;height:400px;"></div>

    <script src="js/timeflow.js"></script>
    </body>
</html>

3、timeflow.js

function loadTwoLine() {
    var myChart = echarts.init(document.getElementById('TwoLineChart'));
    // 显示标题,图例和空的坐标轴
    myChart.setOption({
        title: {
            text: '时间流量趋势图'
        },
        tooltip: {
            trigger: 'axis'
        },
        legend: {
            data: ['日流量趋势图']
        },
        toolbox: {
            show: true,
            feature: {
                mark: { show: true },
                dataView: { show: true, readOnly: false },
                magicType: { show: true, type: ['line', 'bar'] },
                restore: { show: true },
                saveAsImage: { show: true }
            }
        },
        calculable: true,
        xAxis: {
            type: 'category',
            boundaryGap: false, //取消左侧的间距
            data: []
        },
        yAxis: {
            type: 'value',
            splitLine: { show: false },//去除网格线
            name: ''
        },
        series: [{
            name: '日流量趋势图',
            type: 'line',
            markPoint: {
                data: [
                    {type: 'max', name: '最大值'},
                    {type: 'min', name: '最小值'}
                ]
            },
            markLine: { 
                data: [
                    {type: 'average', name: '平均值'}
                ]
            },
            symbol: 'emptydiamond',    //设置折线图中表示每个坐标点的符号 emptycircle:空心圆;emptyrect:空心矩形;circle:实心圆;emptydiamond:菱形
            data: []
        }]
    });
    myChart.showLoading();    //数据加载完之前先显示一段简单的loading动画
    var datetimes = [];    //类别数组(实际用来盛放X轴坐标值)    
    var flows = [];
    $.ajax({
        type: 'get',
        url: 'http://localhost:8080/api/timeflow',//请求数据的地址
        dataType: "json",        //返回数据形式为json
        success: function (result) {
//              alert(result.itemId)
//              console.info(result.itemId);
                //请求成功时执行该函数内容,result即为服务器返回的json对象           
                $.each(result.list, function (index, item) {
                    datetimes.push(item.datetime);    //挨个取出类别并填入类别数组
                    flows.push(item.flow);
                });  
                myChart.hideLoading();    //隐藏加载动画
                myChart.setOption({ 
                    //加载数据图表
                    title:{
                        text: "每日流量趋势图"
                    },
                    xAxis: {
                        data: datetimes
                    },
                    yAxis:{},
                    series: [{                    
                        data: flows
                    }]
                });
            },
            error: function (errorMsg) {
                //请求失败时执行该函数
                alert("图表请求数据失败!");
                myChart.hideLoading();
            }
        });
    };
    loadTwoLine();

关于该项目的跨域解决方案可与转战笔者的另一篇博客,如下

SpringBoot解决CORS跨域(@CrossOrigin)

OK,这个报表数据可视化demo就已经完成了
工程下载

猜你喜欢

转载自blog.csdn.net/w_linux/article/details/81150217
今日推荐