SpringBoot整合echarts,前后端逻辑

​官方网站:https://echarts.apache.org/examples/zh/index.html

一、前端

0.安装echarts

npm install echarts --save

1.编写html

用来显示图表,触发显示图标的按钮

<el-button :disabled="btnDisabled" type="primary" icon="el-icon-search" @click="showChart()">查询</el-button>

2.引入echart

四版本

import echarts from 'echarts'

五版本

import * as echarts from 'echarts'

3.编写调用方法

编写方法getDataSta(),用来获取后端数据

//用来获取后端数据
getDataSta(searchObj) {
    return request({
        url: `/staservice/sta/showData/${searchObj.type}/${searchObj.begin}/${searchObj.end}`,
        method: 'get'
    })
}

4.编写JS

showChart():用来获取后端传来的数据

其中格式必须为json数组格式

setChart()固定写法

一般只修改x,y轴数据就可以

methods: {
    showChart() {
        staApi.getDataSta(this.searchObj).then(response => {
            console.log('*****' + response) this.yData = response.data.numDataList this.xData = response.data
                .date_calculatedList

            //调用下面生成图表的方法,改变值
            this.setChart()
        })
    },
    setChart() { // 基于准备好的dom,初始化echarts实例 this.chart = echarts.init(document.getElementById('chart')) // console.log(this.chart)

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: '数据统计'
            },
            tooltip: {
                trigger: 'axis'
            },
            dataZoom: [{
                    show: true,
                    height: 30,
                    xAxisIndex: [0],
                    bottom: 30,
                    start: 10,
                    end: 80,
                    handleIcon: 'path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z',
                    handleSize: '110%',
                    handleStyle: {
                        color: '#d3dee5'
                    },
                    textStyle: {
                        color: '#fff'
                    },
                    borderColor: '#90979c'
  },
                {
                    type: 'inside',
                    show: true,
                    height: 15,
                    start: 1,
                    end: 35
    }],
            // x轴是类目轴(离散数据),必须通过data设置类目数据
            xAxis: {
                type: 'category',
                data: this.xData
            },
            // y轴是数据轴(连续数据)
            yAxis: {
                type: 'value'
            },
            // 系列列表。每个系列通过 type 决定自己的图表类型
            series: [{
                // 系列中的数据内容数组
                data: this.yData,
                // 折线图
                type: 'line'
  }]
        }
        this.chart.setOption(option)
    }
}

二、后端

1.控制层接受前端数据

 /** * 图表显示,返回日期和数量数组 * @param begin 开始日期 * @param end 结束日期 * @param type 查询类型 * @return */
 @ApiOperation("图表显示,返回日期和数量数组")
 @GetMapping("showData/{type}/{begin}/{end}") 
 public Result showData(@PathVariable String type,
     @PathVariable String begin, @PathVariable String end) {
     Map < String, Object > map = statisticsDailyService.getData(type, begin, end);
     return Result.ok().data(map);
 }

2.实现类的方法

获取数据库中的数据,将结果封装在两个list中日期list和数量list

 /**
 * 获取统计数据 
 * @param type 查询类型(注册、播放数量等) 
 * @param begin 开始时间 
 * @param end 结束时间 
 * @return map 
 */   		
 @Override 
 public Map < String, Object > getData(String type, String begin, String end) {
     QueryWrapper < StatisticsDaily > queryWrapper = new QueryWrapper < > ();
     //筛选日期
     queryWrapper.between("date_calculated", begin, end);
     //精准查询日期和选择的类型 
     queryWrapper.select("date_calculated", type);
     List < StatisticsDaily > statisticsDailies = baseMapper.selectList(queryWrapper);
     //将结果封装在两个list中 
     //日期list 
     List < String > dateCalculatedList = new ArrayList < > ();
     //数量list 
     List < Integer > countList = new ArrayList < > ();
     for (StatisticsDaily daily: statisticsDailies) {
         dateCalculatedList.add(daily.getDateCalculated());
         switch (type) {
             case "login_num":
                 countList.add(daily.getLoginNum());
                 break;
             case "register_num":
                 countList.add(daily.getRegisterNum());
                 break;
             case "video_view_num":
                 countList.add(daily.getVideoViewNum());
                 break;
             case "course_num":
                 countList.add(daily.getCourseNum());
                 break;
             default:
                 break;
         }
     }
     HashMap < String, Object > map = new HashMap < > ();
     map.put("date_calculatedList", dateCalculatedList);
     map.put("numDataList", countList);
     return map;
 }

三、数据库

1.建表语句

CREATE TABLE `statistics_daily` ( `id` char(19) NOT NULL COMMENT '主键', `date_calculated` varchar(20) NOT NULL COMMENT '统计日期', `register_num` int(11) NOT NULL DEFAULT '0' COMMENT '注册人数', `login_num` int(11) NOT NULL DEFAULT '0' COMMENT '登录人数', `video_view_num` int(11) NOT NULL DEFAULT '0' COMMENT '每日播放视频数', `course_num` int(11) NOT NULL DEFAULT '0' COMMENT '每日新增课程数', `gmt_create` datetime NOT NULL COMMENT '创建时间', `gmt_modified` datetime NOT NULL COMMENT '更新时间',
		 PRIMARY KEY (`id`),
		 KEY `statistics_day` (`date_calculated`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='网站统计日数据';

2.记录来源

方法一:在控制层有可以主动调用的接口来查询注册人数等数据信息
方法二:在定时任务中可以每天定时调用service的方法来统计

定时任务

@Component
public class ScheduleTask {
	@Autowired 
	private StatisticsDailyService statisticsDailyService; 
	/** * 定时任务 * 每天凌晨1点自动查询前一天的统计数据 */ 
	@Scheduled(cron = "0 0 1 * * ?")
    public void updateStatisticsInfo() {
        //计算前一天日期 
        String preDay = DateUtil.formatDate(DateUtil.addDays(new Date(), -1));
        statisticsDailyService.countRegister(preDay);
    }
}

统计方法

/** * 统计人数 * @param day 日期 */ 
@Transactional(rollbackFor = Exception.class)
@Override
public void countRegister(String day) {
    //防止重复添加,先删除 
    baseMapper.delete(new QueryWrapper < StatisticsDaily > ().eq("date_calculated", day));
    Result result = ucenterClient.countRegister(day);
    int countRegister = (int) result.getData().get("countRegister");
    StatisticsDaily statisticsDaily = new StatisticsDaily();
    //赋值统计的数据 
    statisticsDaily.setRegisterNum(countRegister);
    statisticsDaily.setDateCalculated(day);
    // TODO 随机数改为真实数据 
    statisticsDaily.setVideoViewNum(RandomUtils.nextInt(100, 200));
    statisticsDaily.setLoginNum(RandomUtils.nextInt(100, 200));
    statisticsDaily.setCourseNum(RandomUtils.nextInt(100, 200));
    //添加到数据库中 
    baseMapper.insert(statisticsDaily);
}

四、实体数据

@TableField(fill = FieldFill.INSERT_UPDATE)注解 需要配置类

/** 网站统计日数据 **/ 
@Data 
@EqualsAndHashCode(callSuper = false) 
@Accessors(chain = true) 
@ApiModel(value="StatisticsDaily对象", description="网站统计日数据") 
public class StatisticsDaily implements Serializable {
	private static final long serialVersionUID=1L;
	@ApiModelProperty(value = "主键")
	@TableId(value = "id", type = IdType.ID_WORKER_STR)
	private String id;
	
	@ApiModelProperty(value = "统计日期")
	private String dateCalculated;
	
	@ApiModelProperty(value = "注册人数")
	private Integer registerNum;
	
	@ApiModelProperty(value = "登录人数")
	private Integer loginNum;
	
	@ApiModelProperty(value = "每日播放视频数")
	private Integer videoViewNum;
	
	@ApiModelProperty(value = "每日新增课程数")
	private Integer courseNum;
	
	@ApiModelProperty(value = "创建时间")
	@TableField(fill = FieldFill.INSERT)
	private Date gmtCreate;
	
	@ApiModelProperty(value = "更新时间")
	@TableField(fill = FieldFill.INSERT_UPDATE)
	private Date gmtModified;
} 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go语言基础----Go语言简介

【原文链接】Go语言基础----Go语言简介 一、Go语言简介 Go语言&#xff0c;又称Golang&#xff0c;是Google公司的Robert Griesemer&#xff0c;Rob Pike 及 Ken Thompson开发的一种静态强类型、编译型的语言。Go语言语法和C语言接近&#xff0c;但是功能上内存安全&#xff…

一文弄懂Jupyter的配置与使用(呕心沥血版)

Jupyter 是一个基于 Web 的交互式计算平台&#xff0c;使用户能够创建和共享文档&#xff0c;这些文档包含实时代码、方程式、可视化图表和解释文字。Jupyter 在数据分析领域被广泛应用&#xff0c;它提供了一个直观、交互式的操作界面&#xff0c;使得用户能够更容易地探索数据…

【WinForm】Android手机群控工具-桌面程序开发实现

如何将手下多个Android手机统一管理起来呢&#xff0c;这里是用通过终端输入adb命令来实现控制多个手机的&#xff0c;具体怎么做&#xff0c;接下来给讲一讲。 使用adb工具包 首先&#xff0c;需要准备一套工具&#xff0c;以下是adb工具套件&#xff0c;是在Android SDK开发…

5天学会Linux C高级

day1 用C语言的理论知识点去推断结果 需求&#xff1a;让面试官知道你懂这个内容 一、C语言补充内容 【1】结构体补充内容&#xff1a; 1&#xff09;结构体.等法 结构体.等法代码 #include <stdio.h> struct student { int num; float score; char name[32…

Rust之泛型、特性和生命期(一):基本概念

开发环境 Windows 10Rust 1.69.0 VS Code 1.77.3 项目工程 这里继续沿用上次工程rust-demo 泛型、特性和生命期 每种编程语言都有有效处理概念重复的工具。在Rust中&#xff0c;一个这样的工具就是泛型&#xff1a;具体类型或其他属性的抽象替身。我们可以表达泛型的行为或…

【世界读书日】2023年通信好书推荐

今天是世界读书日&#xff08;4月23日&#xff09;。按照老规矩&#xff0c;小编给大家推荐一些通信类的优秀书籍。 过去一年&#xff0c;通信行业的关注热点&#xff0c;主要是&#xff1a;5G-Advanced&#xff08;5.5G&#xff09;、算力网络、东数西算、6G、卫星互联网、智…

如何正确高效地学习android开发?

每一个能成为行业大佬的人&#xff0c;一定有自己独特的方法… 之所以能成为大佬&#xff0c;是因为他们会有自己独特的见解&#xff0c;在一次次的尝试中不断否定&#xff0c;然后一次次的确定&#xff0c;一个程序员想要精益求精&#xff0c;必须要有高效的学习方法和良好的…

历史上的今天大事件查询工具推荐 - 历史上的今天 API

引言 历史上的今天&#xff0c;总会有一些特别的事件发生&#xff0c;这些事件对人类的发展产生了深远的影响。想要了解这些事件&#xff0c;往往需要花费大量的时间和精力去查阅历史资料。但现在&#xff0c;有了历史上的今天 API&#xff0c;一切变得方便了许多。 如果你对…

3年外包终上岸,我只能说这类公司能不去就不去····

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司&#xff0c;一干就是3年。现在终于跳槽到了互联网公司了&#xff0c;我想说的是&#xff0c;但凡有点机会&#xff0c;千万…

SAP KANBAN 从入门到放弃系列之调拨模式

之前已经有三篇文章写了后台配置相关的介绍&#xff0c;这里不赘述。详见&#xff1a; PP-KANBAN-看板概述 SAP KANBAN 从入门到放弃系列之生产补货模式 SAP KANBAN 从入门到放弃系列之采购补货模式 第一步&#xff1a;补货策略-转库。不同的补充策略的控制类型有不同的作用…

6.3 收敛性与稳定性

6.3.1 收敛性 数值计算方法的收敛性是指&#xff0c;当取步长趋近于零时&#xff0c;数值解趋近于精确解的速度。一般来说&#xff0c;数值计算方法的收敛性是判断其优劣的重要指标之一。 数值计算方法的收敛性可以通过数学分析来研究&#xff0c;一般需要对数值解和精确解之…

淘宝天猫数据分析:2023年健康养生三大品类数据分析

随着人们健康意识的不断增强&#xff0c;越来越多的年轻人都开始加入养生大军的队伍中&#xff0c;我国的健康养生产业也迎来了发展机遇。 在天猫平台上&#xff0c;养生茶、养生壶和滋补养生原料是养生市场的几大重点类目&#xff0c;接下来&#xff0c;结合鲸参谋电商数据分析…

【论文笔记】VideoGPT: Video Generation using VQ-VAE and Transformers

论文标题&#xff1a;VideoGPT: Video Generation using VQ-VAE and Transformers 论文代码&#xff1a;https://wilson1yan. github.io/videogpt/index.html. 论文链接&#xff1a;https://arxiv.org/abs/2104.10157 发表时间&#xff1a; 2021年9月 Abstract 作者提出了…

Java 之 String、StringBuffer与StringBuilder 区别

String String 是被 final 修饰的类&#xff0c;不能被继承&#xff1b;String实现了 Serializable 和Comparable接口&#xff0c;表示String支持序列化和可以比较大小&#xff1b;String底层是通过char类型的数据实现的&#xff0c;并且被final修饰&#xff0c;所以字符串的值…

Discourse Google Analytics 3 的升级提示

根据 Google 官方的消息&#xff1a; Google Analytics&#xff08;分析&#xff09;4 是我们的新一代效果衡量解决方案&#xff0c;即将取代 Universal Analytics。自 2023 年 7 月 1 日起&#xff0c;标准 Universal Analytics 媒体资源将停止处理新的命中数据。如果您仍在使…

camunda流程引擎receive task节点用途

Camunda的Receive Task用于在流程中等待外部系统或服务发送消息。当接收到消息后&#xff0c;Receive Task将流程继续执行。Receive Task通常用于与Send Task配合使用&#xff0c;以便流程可以在发送和接收消息之间进行交互。 Receive Task可以用于以下场景&#xff1a; 1、等…

abaqus和ansys做仿真哪个更好

当你要模拟仿真一个机械模型时&#xff0c;通常会听到ABAQUS或ANSYS&#xff0c;最常见的问题是哪个更好&#xff1f;无论是工程设计师还是初学者&#xff0c;通常会问这个问题或类似的问题。在本文中介绍了 Abaqus 与 Ansys&#xff0c;您将了解这些问题的答案。 1-ANSYS&…

C++类与对象—上

本期我们来学习类与对象 目录 面向过程和面向对象初步认识 类的引入 访问限定符 类的定义 封装 类的作用域 类的实例化 this指针 C语言和C实现Stack的对比 面向过程和面向对象初步认识 C 语言是 面向过程 的&#xff0c; 关注 的是 过程 &#xff0c;分析出求解问题的…

ajax写法和json的知识点

1. JQuery方式来实现AJAX 1.1 $.ajax()方式来实现AJAX 语法&#xff1a;$.ajax(url,[settings]);但是我们一般这么写$.ajax({键值对});。 $.ajax()来实现ajax的案例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"…

第二十六章 案例TodoList 之实现Footer组件

本小节&#xff0c;我们来实现最后的Footer组件的功能&#xff0c;它的功能主要有&#xff1a; 记录已完成和全部的任务列表数量点击【复选框】可以实现全选和全不选点击【删除已完成】按钮&#xff0c;可以将选中的任务项删除掉 实现已完成和全部的任务列表数量 步骤1&#…
最新文章