Springboot+echarts:ajax前后端分离交互

news2024/11/24 12:26:03

文章目录

  • 一、样例说明
  • 二、后端代码实现
    • 2.1 依赖
    • 2.2 applicaiton.properties配置
    • 2.3 TotalCountData类实现
    • 2.4 totalCountDataMapper接口
    • 2.5 totalCountDataMapper.xml实现
    • 2.6 Controller层代码
  • 三、前端代码


一、样例说明

通过mysql存储数据,springboot整合mybatis框架获取mysql数据库中数据,然后前端echarts通过ajax获取后端数据,展现在页面中。
效果如下:
在这里插入图片描述
在这里插入图片描述

二、后端代码实现

项目文件目录如下:
在这里插入图片描述

2.1 依赖

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

2.2 applicaiton.properties配置

配置数据库用户名,密码,路径,数据源;mybatis中别名设置,mapper文件路径。

#热部署开关,true开启,false关闭
spring.devtools.restart.enabled=true

#mybatis配置
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.url=jdbc:mysql://localhost:3306/musicrsdb?useSSL=true&useUnicode=true\
  &characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#整合mybatis
mybatis.type-aliases-package=com.hsy.pojo
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

2.3 TotalCountData类实现

实体类代码编写,与mysql数据库中所读取的表属性一致。

package com.hsy.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class TotalCountData {
    private Date date;
    private int totalPlayCount;
    private int totalDownloadCount;
    private int totalCollectionCount;
    private int totalUserCount;
}

2.4 totalCountDataMapper接口

package com.hsy.mapper;

import com.hsy.pojo.TotalCountData;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface totalCountDataMapper {
    List<TotalCountData> queryTotalCountData();
}

2.5 totalCountDataMapper.xml实现

sql语句编写。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--configuration core file-->
<mapper namespace="com.hsy.mapper.totalCountDataMapper">

    <select id="queryTotalCountData" resultType="TotalCountData">
        select * from musicrsdb.totalcountdata;
    </select>

</mapper>

2.6 Controller层代码

简化了后端设置,未添加service层,直接在controller层进行数据操纵。
简化了跨域的配置,直接通过crossorigin局部跨域处理。通过get请求进行数据的传送。

package com.hsy.controller;

import com.hsy.mapper.totalCountDataMapper;
import com.hsy.pojo.TotalCountData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@CrossOrigin(origins = "*")
@RequestMapping("/TotalCount")
public class TotalCountDataController {
    @Autowired
    private totalCountDataMapper totalCountDataMapper;

    @GetMapping("/getTotalCountData")
    @ResponseBody
    public List<TotalCountData> getAllData(){
        List<TotalCountData> totalList = totalCountDataMapper.queryTotalCountData();
        return totalList;
    }
}

运行查看后端数据效果:
在这里插入图片描述

三、前端代码

通过ajax实现对后端接口数据的获取。其核心代码如下:

    $.ajax({
        type: 'GET', //请求的方式
        url: 'http://localhost:8080/TotalCount/getTotalCountData', // 请求的URL地址
        data: {},// 这次请求要携带的数据
        success: function(res) { //请求成功之后的回调函数
            var playCount=new Array();
            var dateList=new Array();
            var userCount=new Array();
            var downloadCount=new Array();
            var collectionCount=new Array();
            // 获取每日数据
            for(var i=0;i<res.length;i++){
                var item=res[i];
                playCount.push(item.totalPlayCount);
                var tmpDate=new Date(item.date);
                dateList.push(tmpDate.format('Y-m-d'));
                userCount.push(item.totalUserCount);
                downloadCount.push(item.totalDownloadCount);
                collectionCount.push(item.totalCollectionCount);
            }
        }
    });

整合echarts后的完整代码如下:

var handleInteractiveChart = function () {

    $.ajax({
        type: 'GET', //请求的方式
        url: 'http://localhost:8080/TotalCount/getTotalCountData', // 请求的URL地址
        data: {},// 这次请求要携带的数据
        success: function(res) { //请求成功之后的回调函数
            var playCount=new Array();
            var dateList=new Array();
            var userCount=new Array();
            var downloadCount=new Array();
            var collectionCount=new Array();
            // 获取每日数据
            for(var i=0;i<res.length;i++){
                var item=res[i];
                playCount.push(item.totalPlayCount);
                var tmpDate=new Date(item.date);
                dateList.push(tmpDate.format('Y-m-d'));
                userCount.push(item.totalUserCount);
                downloadCount.push(item.totalDownloadCount);
                collectionCount.push(item.totalCollectionCount);
            }

            var chartDom = document.getElementById('interactive-chart');
            var myChart = echarts.init(chartDom);
            var option;

            option = {

                grid:{
                    left: '8%',
                    right: '8%',
                    bottom: '7%',
                    top: '10%'
                },
                tooltip: {
                    trigger: 'axis'
                },
                legend: {
                    right: '0%',
                },
                toolbox: {
                    show: true,
                    feature: {
                        // dataZoom: {
                        //     yAxisIndex: 'none'
                        // },
                        dataView: { readOnly: false },
                        // magicType: { type: ['line', 'bar'] },
                        // restore: {},
                        // saveAsImage: {}
                    },
                    left:'1%',
                    top:'0%'
                },
                xAxis: {
                    type: 'category',
                    boundaryGap: false,
                    data: dateList,//替换后端数据横坐标刻度日期
                    // axisLabel: 1

                },
                yAxis:[
                    {
                        type: 'value',
                        min:0,
                        max:95000,
                        splitNumber: 6,
                        interval: (95000 - 0) / 6
                    },
                    {
                        type: 'value',
                        min:10000,
                        max:50000,
                        splitNumber: 6,
                        interval: (50000 - 10000) / 6
                    },
                ],
                series: [
                    {
                        name: '每日总播放量',
                        type: 'line',
                        data: playCount,
                        markPoint: {
                            data: [
                                { type: 'max', name: 'Max' },
                                { type: 'min', name: 'Min' }
                            ]
                        },
                        markLine: {
                            data: [{ type: 'average', name: 'Avg' }]
                        },
                        yAxisIndex: 0
                    },
                    {
                        name: '每日用户使用量',
                        type: 'line',
                        data: userCount,
                        markPoint: {
                            data: [
                                { type: 'max', name: 'Max' },
                                { type: 'min', name: 'Min' }
                            ]
                        },
                        markLine: {
                            data: [{ type: 'average', name: 'Avg' }]
                        },
                        yAxisIndex: 1
                    },
                    {
                        name: '每日下载量',
                        type: 'line',
                        data: downloadCount,
                        // markPoint: {
                        //     data: [
                        //         { type: 'max', name: 'Max' },
                        //         { type: 'min', name: 'Min' }
                        //     ]
                        // },
                        markLine: {
                            data: [{ type: 'average', name: 'Avg' }]
                        },
                        yAxisIndex: 1
                    },
                ]
            };
            myChart.setOption(option);
            return myChart;
        }
    });


};

得到最终效果:
在这里插入图片描述

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

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

相关文章

从云到「链」,京东云成为中国第四朵云背后

在产业加速到数实融合加速的今年&#xff0c;云计算不再是云厂商的唯一考校指标。 作者|叶子 出品|产业家 京东云再次破圈。 信号来自接连发布的几份报告。在国际权威研究机构Forrester发布的名为《The Forrester Wave&#xff1a;Public Cloud Development And Infrast…

[HCTF 2018]WarmUp

目录 考点 writeup 考点 文件上传漏洞&#xff0c;代码审计 writeup 先进入页面先查看源码 发现source.php,打开该php文件&#xff0c;进行审计代码后发现是文件包含类题目 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$…

JaveWeb框架(三):实战项目Servlet 实现管理系统登录注册功能

MVC实战项目 仓储管理系统需求&#xff1a;实现基本的登录和注册功能MVC实战项目&#xff1a;登录和注册登录功能实现注册功能实现总结Redis章节复习已经过去&#xff0c;新的章节JavaWeb开始了&#xff0c;这个章节中将会回顾JavaWeb实战项目 仓储管理 代码会同步在我的gitee中…

Linux内核调试技术之kdump配置与使用

概述 kdump是Linux内核发生崩溃时转储内存的一种机制&#xff0c;当内核发生错误时&#xff0c;kdump会将当前内核使用的内存导出为镜像文件&#xff08;通常为vmcore&#xff09;保存到硬盘上&#xff0c;之后可以使用crash等工具对内核错误原因进行分析。 kdump基本原理 k…

R语言中回归和分类模型选择的性能指标

有多种性能指标来描述机器学习模型的质量。但是&#xff0c;问题是&#xff0c;对于问题正确的方法是什么&#xff1f;在这里&#xff0c;我讨论了选择回归模型和分类模型时最重要的性能指标。请注意&#xff0c;此处介绍的性能指标不应用于特征选择&#xff0c;因为它们没有考…

如何保证分布式事务?

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【一心同学】&#xff0c;一位上进心十足的【Java领域博主】&#xff01;&#x1f61c;&#x1f61c;&#x1f61c; ✨【一心同学】的写作风格&#x…

Docker: 容器与镜像

文章目录1、docker 环境搭建1.1、docker 安装1.1.1、centos 安装1.1.2、ubuntu 安装1.2、添加到 docker 组1.3、docker 镜像源2、docker 概念2.1、docker 背景2.2、docker 架构2.3、docker 与 vm3、docker 容器隔离4、docker 命令4.1、环境信息4.2、日志信息4.3、容器命令4.4、…

Mac最先进的API工具-RapidAPI for Mac

一、前言 当使用 Mac 进行接口测试的时候&#xff0c;一般都会想到接口测试工具 Postman、Jmeter。 Postman 以其页面友好&#xff0c;功能简单&#xff0c;可以快速上手进行接口测试。而 Jmeter 除了测接口外&#xff0c;还可以进行接口自动化测试、性能测试等。 本篇将介绍…

完整企业官网源码,前端基于Vue+ElementUI,后台基于基于core3 webapi,含数据库文件,含详情安装部署文档

完整企业官网源码&#xff0c;前端基于VueElementUI&#xff0c;后台基于基于core3 webapi&#xff0c;含数据库文件&#xff0c;含详情安装部署文档 完整代码下载地址&#xff1a;完整企业官网源码 某工程管理有限公司企业官网 前端 新版本改进 整体重构&#xff0c;结构…

利用 Flow Simulation 快速和经济高效地解决传热难题

探寻传热问题的有效解决方案已成为新产品研发过程中一个愈来愈重要的部分。几乎一切事物都会经历某种程度的发热或冷却&#xff0c;而且对于许多产品来说&#xff0c;如现代电子设备、医疗设备和空气调节 (HVAC) 系统&#xff0c;热管理已成为避免过度发热和实现功能正常运行的…

Redis实战——附近商家(GEO的使用)

1. 什么是Geo&#xff1f; GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。常见的命令有&#xff1a; GEOADD&#xff1a;添加一个地理空间信息&#…

基于WEB多媒体电子贺卡平台

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 网站前台&#xff1a;关于我们、联系我们、资讯信息、贺卡类型、贺卡信息、贺卡评论 管理员&#xff1a; 1、管理关于我…

[附源码]Python计算机毕业设计Django校园服装租赁系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

毕业设计 单片机墨水屏阅读器(单词卡) - 物联网 嵌入式

文章目录0 前言1 简介2 主要器件3 实现效果4 设计原理部分核心代码5 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自…

列表类型(sort,reverse,list(),append(),切片)、求中位数,平均数,标准差练习

映射类型和操作 映射类型是“键-值”数据项的组合&#xff0c;每个元素是一个键 值对&#xff0c;即元素是(key, value)&#xff0c;元素之间是无序的。键值对 (key, value)是一种二元关系。在Python中&#xff0c;映射类型主要以字典&#xff08;dict&#xff09;体现。 列表类…

模拟大规模电动车充电行为(Matlab实现)

目录 1 模拟大规模充电汽车充电行为 2 Matlab部分代码实现 3 Matlab代码实现 1 模拟大规模充电汽车充电行为 电动汽车EV(Electric Vehicle)具有清洁环保、高效节能的优点,不仅能缓解化石能源危机,而且能够有效地减少温室气体的排放。2015年10月&#xff0c;国务院发布加快E…

设计模式之策略模式

Strategy design pattern 策略模式的概念、策略模式的结构、策略模式的优缺点、策略模式的使用场景、策略模式的实现示例、策略模式的源码分析 1、策略模式的概念 策略模式&#xff0c;即定义一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#…

Android平台GB28181接入模块技术接入说明

技术背景 今天&#xff0c;我们主要讲讲Android平台GB28181接入模块的技术对接&#xff0c;Android平台GB28181接入模块设计的目的&#xff0c;可实现不具备国标音视频能力的 Android终端&#xff0c;通过平台注册接入到现有的GB/T28181—2016服务&#xff0c;可用于如智能监控…

【Mitigating Voltage Attacks in Multi-Tenant FPGAs 论文笔记】

减轻多租户FPGA中的电压攻击摘要引言内容背景和相关工作INTEL STRATIX 10 FPGA上的PDN攻击Stratix 10 PDN特性定位电压下降片上监控和攻击抑制结论和未来工作结论&#xff1a;未来工作作者&#xff1a;GEORGE PROVELENGIOS, University of Massachusetts Amherst, MA, USADANIE…

Python学习-9.2 程序界面-sys库介绍

可以在Python标准库大全&#xff1a;https://docs.python.org/zh-cn/3/library/index.html中查找sys标准库的解释说明 sys标准库 本章对sys标准库中的重点函数进行讲解&#xff0c;sys库的作用主要是查看python解释器信息及传递信息给python解释器。 sys库的三个重要函数&…