小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

Spring Boot开发实战——echarts图标填充数据

前端开发,# Spring Boot,layui,ajax,交互,echarts 额外说明

收录于:17天前

echarts模块的导入

我们先来看看成品吧!

在这里插入图片描述

有些图标的数据使用了一些计算框架,而不是直接查询数据库,所以速度有点慢。

ok!- 上正文,接上节Spring Boot项目开发实践-(LayUI实现前后端数据交换并定义渲染数据的方法)讲解了一般的单个数据的填充,和前端模板layui.laytpl的使用LayUI模板引擎渲染数据,本节将介绍echarts的使用。

layui.use(['layer','echarts','jquery','laytpl'], function () {
    
    var $ = layui.$,   //jQuery复制
        layer = layui.layer,
        echarts = layui.echarts,
        laytpl = layui.laytpl;
});   

注意,使用echart时,需要将echart配置为layui的内部组件,并遵循layui的模块化原则。

还不知道如何引入请移步layui使用echarts感谢作者!

//初始化容器
var echartsRecords = echarts.init(document.getElementById('echarts-records'), 'walden');
//设置option填入数据
var optionRecords = {
    
    tooltip: {
    
        trigger: 'axis'
    },
    legend: {
    
        data: ['邮件营销', '联盟广告', '视频广告', '直接访问', '搜索引擎']
    },
    grid: {
    
        left: '3%',
        right: '4%',
        bottom: '3%',
        containLabel: true
    },
    toolbox: {
    
        feature: {
    
            saveAsImage: {
    }
        }
    },
    xAxis: {
    
        type: 'category',
        boundaryGap: false,
        data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
    },
    yAxis: {
    
        type: 'value'
    },
    series: [
        {
    
            name: '邮件营销',
            type: 'line',
            data: [120, 132, 101, 134, 90, 230, 210]
        },
        {
    
            name: '联盟广告',
            type: 'line',
            data: [220, 182, 191, 234, 290, 330, 310]
        },
        {
    
            name: '视频广告',
            type: 'line',
            data: [150, 232, 201, 154, 190, 330, 410]
        },
        {
    
            name: '直接访问',
            type: 'line',
            data: [320, 332, 301, 334, 390, 330, 320]
        },
        {
    
            name: '搜索引擎',
            type: 'line',
            data: [820, 932, 901, 934, 1290, 1330, 1320]
        }
    ]
};
//
echartsRecords.setOption(optionRecords);

在这里插入图片描述

您必须首先选择echarts图标并关注数据本身。后面的接口会返回匹配表格数据的数据,方便渲染。

echarts官网

以下是我的数据库文件,是电子消费的数据集(需要的请私信我)

在这里插入图片描述

下面来看echarts的option,数据中中返回了5组字典和一个列表,如上图小编的数据库数据结构,这里将通过event_timebrand两个字段,计算最近一年销售最多的4个品牌,联系起来就应该返回4列表和一个时间列表,设计的model层对象如下:

public class MenuTableParam {
    
    private List<String> xList;

    /** * 品牌和销售数据 */
    private String brandName;
    private List<String> brandSale;

}

这样设计的意义在于,xList返回所有品牌名称,brandName字段返回单个品牌的销售数据。然后直接在列表中返回多个具有相同数据的对象。

创建数据库表对象映射:(orm框架是mybatis-plus)

@Data
@TableName("productsales")
public class ProductSales {
    

    private Integer id;

    private String eventTime;
    private String orderId;
    private String productId;
    private String categoryId;
    private String categoryCode;
    private String brand;
    private Float price;
    private String userId;
    private Integer age;
    private String sex;
    private String local;
    private Long total;

}

Mapper层找出品牌和时间信息、价格信息,并返回去年的消费数据。查询数据库可以通过映射对象来接收,比较方便。

 @Select("select brand,count(*) AS total from productsales GROUP BY brand ORDER BY total DESC")
 List<ProductSaleResult> getMenuTable();

接下来是服务层:服务层最重要的是如何返回最简单的数据,让控制器不需要处理太多,如下图:

在这里插入图片描述

@Service
public class MenuTableServiceImpl implements MenuTableService {
    

    @Autowired
    private ProductMapper productMapper;

    @Autowired
    private JavaSparkContext sc;

    @Override
    public List<MenuTableResult> getMenuTableResult() {
    
        //获取数据
        List<ProductSaleResult> menuTable = productMapper.getMenuTable();
        //取出前7名 防止出现空字符
        List<ProductSaleResult> productSaleResults = menuTable.subList(0, 8);
        //取出前四名获取最近一年数据
        List<String> brandList = new ArrayList<>();
        for (ProductSaleResult pr:productSaleResults
             ) {
    
            if (pr.getBrand() !=null && pr.getBrand() !=""){
    
                brandList.add(pr.getBrand());
            }
        }
        //取出4个季度
        List<String> newbrandList = brandList.subList(0,5);

        List<String> list = productMapper.itemList(newbrandList.get(0)).subList(0,99);
        List<String> list1 = productMapper.itemList(newbrandList.get(1)).subList(0,99);
        List<String> list2 = productMapper.itemList(newbrandList.get(2)).subList(0,99);
        List<String> list3 = productMapper.itemList(newbrandList.get(3)).subList(0,99);

        MenuTableResult result = new MenuTableResult();

        List<MenuTableResult> results = new ArrayList<>();

        MenuTableResult one = new MenuTableResult();
        one.setBrandName(newbrandList.get(0));
        one.setBrandSale(list);

        MenuTableResult two = new MenuTableResult();
        two.setBrandName(newbrandList.get(1));
        two.setBrandSale(list1);

        MenuTableResult three = new MenuTableResult();
        three.setBrandName(newbrandList.get(2));
        three.setBrandSale(list2);

        MenuTableResult four = new MenuTableResult();
        four.setBrandName(newbrandList.get(3));
        four.setBrandSale(list3);
        List<String> list4 = productMapper.timeList().subList(0, 99);

        one.setXList(list4);
        one.setBrandList(brandList.subList(0,4));

        results.add(one);results.add(two);results.add(three);results.add(four);

        return results;
    }
}    

服务层使用spark的框架进行了一些计算,spark的使用会在后续更新出来,不要关注这个代码本身,这点直接掠过即可,要关注返回的数据的过程也就是构建4个MenuTableResult。每个对象都会setBrandNamesetBrandSale,最后用数组包裹就可以通过索引获取了。

service的数据结构也让controller更容易返回:

@RestController
@RequestMapping("/product")
public class MenuTableController {
    

    @Autowired
    private MenuTableService menuTableService;
    @CrossOrigin
    @GetMapping("/menuTable")
    public List<MenuTableResult> getMenuTable(){
    
        List<MenuTableResult> menuTableResult = menuTableService.getMenuTableResult();
        return menuTableResult;
    }
    
}

返回的数据如下:

在这里插入图片描述

数据按照上面的方式构造出来之后,渲染起来就比较容易了。

/** * 报表功能 */
var echartsRecords = echarts.init(document.getElementById('echarts-records'), 'walden');
 $.ajax({
    
        type: "GET",
        url: "http://localhost:8080/product/menuTable",
        data: null,
        //dataType: "json",
        success: function (data) {
    
            //console.log(data)
            
            
            var optionRecords = {
    
                tooltip: {
    
                    trigger: 'axis'
                },
                legend: {
    
                    data: data[0].brandList
                },
                grid: {
    
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                toolbox: {
    
                    feature: {
    
                        saveAsImage: {
    }
                    }
                },
                xAxis: {
    
                    type: 'category',
                    boundaryGap: false,
                    data: data[0].xList
                },
                yAxis: {
    
                    type: 'value'
                },
                series: [
                    {
    
                        name: data[0].brandName,
                        type: 'line',
                        data: data[0].brandSale

                    },
                    {
    
                        name: data[1].brandName,
                        type: 'line',
                        data: data[1].brandSale
                    },
                    {
    
                        name: data[2].brandName,
                        type: 'line',
                        data: data[2].brandSale
                    },
                    {
    
                        name: data[3].brandName,
                        type: 'line',
                        data: data[3].brandSale
                    }
                ]
            };
            echartsRecords.setOption(optionRecords);
            
        }
        

    })

在这里插入图片描述
数据直接通过索引渲染到echarts图标上。

在这里插入图片描述

. . .

相关推荐

额外说明

nginx脚本、Nginx变量拦截字符串、拼接字符串、nginx打印日志、添加和修改HTTP请求头、添加和修改HTTP响应头

nginx变量 nginx变量命名,以$开头。 举例:'nginx.conf 文件'中有下面这一行配置: set $var "hello world"; 特点:我们看到,'Nginx 变量名'前面'有一个 $ 符号',这是'语法上'的要求 强

额外说明

csdn 查看当前等级积分

CSDNhttps://mp.csdn.net/mp_blog/creator-plan/level https://mp.csdn.net/mp_blog/creator-plan/level

额外说明

synchronize锁知识点

synchronize (偏向锁)markword 记录线程ID; (自旋锁)线程争用升级到自旋锁; (重量级锁)10次自旋后升级为重量级锁; 执行时间短(加锁代码),线程数量少,使用自旋锁。 执行时间长,线程数量多。使用系统锁重量级锁。 synchro

额外说明

人工智能AI时代:全栈程序员的人生规划

标题 人工智能AI时代:全栈程序员的人生规划 1. AI时代的背景 1.1 技术的快速发展 1.2 全栈程序员面临的挑战 2. 全栈程序员的新技能要求 2.1 机器学习与深度学习基础 2.2 数据处理与分析 2.3 云计算与边缘计算 3. 人生规划的建议

额外说明

量化交易 实战第十一课 回归法选股 part 1

量化交易 实战第十一课 回归法选股 part 1 概述 回归法选股流程 步骤分析 代码 导包 1. 准备日期数据 2. 准备因子数据 3. 获取价格 4. 计算对应的收益率 5. 填充因子收益率 6. 特征值和目标值处理 7. 建立回归方程 概述 回归法

额外说明

基础篇:数据库 SQL 入门教程

❤️ 前些天发现了一个通俗易懂,风趣幽默的 人工智能学习网站!-- 免费学习 目录 - 前言 - SQL 介绍 - 什么是 SQL - SQL 的类型 - 学习 SQL 的作用 - 数据库是什么 - SQL 基础语言学习 - CREATE TABLE –

额外说明

【前端】JavaScript详细教程(二)

❤️JavaScript必备知识详解❤️ 第一部分:JS操作符 (1)JS操作符的分类: 效果展示: (2)JS操作符的注意点: 效果展示: 第二部分:流程控制 效果展示: 第三部分:循环 效果展示: 第四部分:字符串方法 效果展示: 第五部分:数组方法

额外说明

【Rust 基础篇】Rust 闭包

文章目录 导言 一、闭包的定义和语法 二、捕获变量 三、闭包作为参数和返回值 四、闭包的使用场景 总结 导言 在 Rust 中,闭包(closures)是一种函数对象,它可以捕获其环境中的变量,并在需要时调用。闭包提供了一种方便的方式来封装行为,并在需要

额外说明

Vue axios 安装与引入

目录 一、安装 二、引入 一、安装 Vue 项目中安装 npm i axios -S 安装成功后可在 package.json 文件中查看安装的版本 二、引入 全局引入,赋在 Vue 的原型上。main.js 文件中注册。API 地址在此 import

额外说明

spring项目启动时,如何在控制台查看mybatis运行的sql语句

在mybatis配置文件添加信息 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "h

ads via 小工具