echart freemarker 模板_SpringBoot集成Freemarker模板生成Echarts图片(三)

紧接着前面两篇,本篇采用Freemarker模板来生成Echarts图片。

一. 项目结构

二. Freemarker模板

(1)柱状图

{

"title": {

"text": "${title}",

"textStyle": {

"color": "red",

"fontSize": 15,

"fontWeight": "bolder"

}

},

"tooltip": {

"formatter": "{a}
{b} : {c}",

"show": true

},

"legend": {

"textStyle": {

"color": "red",

"fontSize": 15,

"fontWeight": "bolder"

},

"data": ["${legend}"]

},

"xAxis": [{

"type": "category",

"axisLabel": {

"show": true,

"textStyle": {

"fontSize": 15,

"fontWeight": "bolder"

}

},

"axisLine":{

"lineStyle":{

"color": "#315070",

"width":4

}

},

"data": ${category}

}],

"yAxis": [{

"type": "value",

"axisLabel": {

"show": true,

"textStyle": {

"fontSize": 15,

"fontWeight": "bolder"

}

},

"axisLine":{

"lineStyle":{

"color":"#315070",

"width":4

}

}

}],

"series": [{

"name": "${legend}",

"data": ${values},

"type": "bar",

"label": {

"normal": {

"color": "green",

"fontSize": 15,

"fontWeight": "bolder",

"show": true,

"position": "top"

}

}

}]

}

(2)渐变色柱状图

{

"title": {

"text": "${title}",

"textStyle": {

"color": "red",

"fontSize": 15,

"fontWeight": "bolder"

}

},

"toolbox": {

"feature": {},

"show": true

},

"tooltip": {

"formatter": "{a}
{b} : {c}",

"show": true

},

"legend": {

"textStyle": {

"color": "red",

"fontSize": 15,

"fontWeight": "bolder"

},

"data": ["${legend}"]

},

"xAxis": [{

"type": "category",

"axisLabel": {

"show": true,

"textStyle": {

"fontSize": 15,

"fontWeight": "bolder"

}

},

"axisLine":{

"lineStyle":{

"color":'#315070',

"width":4

}

},

"data": ${category}

}],

"yAxis": [{

"type": "value",

"axisLabel": {

"show": true,

"textStyle": {

"fontSize": 15,

"fontWeight": "bolder"

}

},

"axisLine":{

"show":true,

"lineStyle":{

"color":'#315070',

"width":4

}

},

"axisTick": {

"show": true

}

}],

"series": [{

"name": "${legend}",

"type": "bar",

"label": {

"normal": {

"color": "red",

"fontSize": 15,

"fontWeight": "bolder",

"show": true,

"position": "top"

}

},

"data":${values},

"itemStyle": "__itemStyle"

}]

}

(3)折线图

{

"title": {

"text": "${title}",

"subtext": "",

"textStyle": {

"color": "red",

"fontSize": 15,

"fontWeight": "bolder"

},

"x": "left"

},

"tooltip": {

"trigger": "axis"

},

"legend": {

"textStyle": {

"color": "red",

"fontSize": 15,

"fontWeight": "bolder"

},

"data": ["${legend}"]

},

"xAxis": [{

"type": "category",

"axisLabel": {

"show": true,

"textStyle": {

"fontSize": 15,

"fontWeight": "bolder"

}

},

"axisLine":{

"lineStyle":{

"color":"#315070",

"width":4

}

},

"boundaryGap": false,

"data": ${category}

}],

"yAxis": [{

"type": "value",

"axisLabel": {

"show": true,

"textStyle": {

"fontSize": 15,

"fontWeight": "bolder"

}

},

"axisLine":{

"lineStyle":{

"color":"#315070",

"width":4

}

}

}],

"series": [{

"smooth": true,

"dataFilter": "nearest",

"lineStyle": {

"color": "red",

"width": 4

},

"legendHoverLink": true,

"name": "${legend}",

"type": "line",

"stack": "总量",

"symbolSize": "15",

"showAllSymbol": true,

"label": {

"normal": {

"color": "green",

"show": true,

"position": "right"

}

},

"data": ${values}

}]

}

(4)饼图

{

"calculable": true,

"legend": {

"data": ${types},

"orient": "vertical",

"x": "left",

"textStyle": {

"color": "red",

"fontSize": 15,

"fontWeight": "bolder"

}

},

"series": [{

"center": ["50%", "60%"],

"data": ${datas},

"name": "${title}",

"radius": "65%",

"type": "pie",

"avoidLabelOverlap": true,

"label": {

"normal": {

"show": true,

"position": "top",

"textStyle": {

"color":"red",

"fontSize": "15",

"fontWeight": "bold"

}

},

"emphasis": {

"show": true,

"textStyle": {

"fontSize": "20",

"fontWeight": "bold"

}

}

},

"labelLine": {

"normal": {

"show": true

}

}

}],

"title": {

"subtext": "",

"text": "${title}",

"x": "center",

"textStyle": {

"color": "green",

"fontSize": 20,

"fontWeight": "bolder"

}

},

"toolbox": {

"feature": {

"mark": {

"lineStyle": {

"color": "#1e90ff",

"type": "dashed",

"width": 2

},

"show": true

},

"dataView": {

"lang": ["数据视图", "关闭", "刷新"],

"readOnly": false,

"show": true,

"title": "数据视图"

},

"magicType": {

"show": true,

"title": {

"bar": "柱形图切换",

"stack": "堆积",

"tiled": "平铺",

"line": "折线图切换"

},

"type": ["pie", "funnel"]

},

"restore": {

"show": true,

"title": "还原"

},

"saveAsImage": {

"lang": ["点击保存"],

"show": true,

"title": "保存为图片",

"type": "png"

}

},

"show": true

},

"tooltip": {

"formatter": "{a} 
{b} : {c} ({d}%)",

"trigger": "item"

}

}

三.插件js(

(1)echarts-util-one.js

phantom.outputEncoding = "gbk";// 为防止输出中文时出现乱码,可设置输出编码格式,写在最顶部

var params = require('system');// 获取系统参数

var server = require('webserver').create(); // 服务端

var port = params.args[3];// 端口,与启动命令有关,不一定是3

var listen = server.listen(port, function(request, response) {// 监听端口

var args = serverGetArgs(request);// 得到网络请求参数

args.response = response;

methodDis(args);

});

var jslib = {

jquery : phantom.libraryPath + '/lib/jquery-3.2.1.min.js',

echarts : phantom.libraryPath + '/lib/echarts.min.js',

china : phantom.libraryPath + '/lib/china.js',

};

/**

* 请求分发

*

* @author liansh

* @data 2019年9月19日 下午11:32:59

* @param args

*/

function methodDis(args) {

if (args.reqMethod == "table") {

table(args);

} else if (args.reqMethod == "echarts") {

echarts(args);

}

if (args.exit == "true") {

writeResponse(args.response, {

error_no : 0

});

phantom.exit();

}

}

function table(args) {

var page = require('webpage').create();// 打开页面

// 设置分辨率

page.viewportSize = {

width : 1000,

height : 1200

};

// 打开页面

page.open(args.url || 'http://127.0.0.1:8080/hello', function(status) {

if (status == "fail") {

writeResponse(args.response, {

error_no : -1

});

return;

}

page.injectJs(jslib.jquery);

var tableheight = page.evaluate(function() {

return $('body').height() + 20;

});

// 定义剪切范围

page.clipRect = {

top : 0,

left : 0,

width : 1000,

height : tableheight

};

// var base64 = 'data:image/png;base64,' + page.renderBase64('png');

page.render(args.file);// 将整个page保存为文件,可以是png,jpg, gif,pdf

page.close();

writeResponse(args.response, {

error_no : 0

});

});

page.onError = function(msg, trace) {

writeResponse(args.response, {

error_no : -1,

error_info : trace

});

};

}

function echarts(args) {

var page = require('webpage').create(); // 客户端

page.open("about:blank", function(status) {// 空白页

/**

* 报错{"file":"undefined","line":3,"function":""},{"file":"","line":18,"function":""}

* "file":"undefined" 为所引用的jslib文件路径不对,需要重新检查路径

*/

page.injectJs(jslib.jquery);

page.injectJs(jslib.echarts);

page.injectJs(jslib.china);

var pageBody = page.evaluate(function(args) {

// 动态加载js,获取options数据  实现渐变效果

var itemStyle = '{"normal":{"color" : new echarts.graphic.LinearGradient(0, 0, 0, 1, [ '

+ '{offset : 0,    color : "#83bff6"}, {offset : 0.5,color : "#188df0"}, {offset : 1,color : "#188df0"} ])}}';

// 动态加载js,获取options数据

$('

+ JSON.stringify(args.opt).replace('\"__itemStyle"', itemStyle)).appendTo(document.head);

// 取消动画,否则生成图片过快,会出现无数据

if (options !== undefined) {

options.animation = false;

}

// body背景设置为白色

$(document.body).css('backgroundColor', 'white');

// echarts容器

var container = $("

").attr('id', 'container').css({

width : args.width,

height : args.height

}).appendTo(document.body);

var eChart = echarts.init(container[0]);

eChart.setOption(options);

}, args);

// 定义剪切范围

page.clipRect = {

top : 0,

left : 0,

width : args.width - 100,

height : args.height + 10

};

// var base64 = 'data:image/png;base64,' + page.renderBase64('png');

// writeResponse(args.response, {// 返回给http请求

// error_no : 0,

// base64 : base64

// });

page.render(args.file);// 将整个page保存为文件,可以是png,jpg, gif,pdf

page.close();

writeResponse(args.response, {

error_no : 0

});

});

page.onError = function(msg, trace) {

writeResponse(args.response, {

error_no : -1,

error_info : trace

});

};

}

function writeResponse(response, msg) {

response.write(JSON.stringify(msg || {

error_no : 0

}));

response.close();

}

/**

* 获取请求参数

*

* @author liansh

* @data 2019年9月19日 下午11:27:16

* @param request

* @returns

*/

function serverGetArgs(request) {

var args = {};

if ('GET' === request.method) {

var index = request.url.indexOf('?');

if (index !== -1) {

pairs = request.url.substr(index + 1).split("&");

for (var i = 0; i < pairs.length; i++) {

var pos = pairs[i].indexOf('=');

if (pos === -1)

continue;

var key = pairs[i].substring(0, pos);

var value = pairs[i].substring(pos + 1);

// 中文解码,必须写两层

value = decodeURIComponent(decodeURIComponent(value));

args[key] = value;

}

}

} else if ('POST' === request.method) {

args = JSON.parse(request.post);

}

args.width = args.width || 1000;

args.height = args.height || 400;

return args;

};

另外涉及到的js(jquery-3.2.1.min.js    echarts.min.js   china.js) 请到https://gitee.com/saintlee/echartsconvert/tree/master 这里下载。

说明:echarts-util-one.js是重新改造的,之前是利用echartsconvert这个插件来生成图表的,但是echartsconvert这个插件不能生成饼图,所以就改造了echarts-util-one.js

三.环境配置说明

可以结合前面两篇看,首先安装phantomjs-2.1.1-windows,然后在其bin目录下,放入echarts-util-one.js以及相关lib包下的js(jquery-3.2.1.min.js    echarts.min.js   china.js),然后启动服务即可,命令如下:

D:\>cd D:\softpack\echarts\phantomjs-2.1.1-windows\bin

D:\softpack\echarts\phantomjs-2.1.1-windows\bin>phantomjs D:\softpack\echarts\phantomjs-2.1.1-windows\bin\echarts-util-one.js -s -p 6668

四.测试效果

(1)柱状图{

"barParamList": {

"barName": [

"A罩杯", "B罩杯", "C罩杯", "D罩杯", "E罩杯", "F罩杯","G罩杯"

],

"barValue": [

43364, 13899, 12000, 2181, 21798, 1796, 1300

],

"legendName": "胸罩图例"

},

"horizontal": true,

"title": "胸罩使用人数"

}

(2)折线图{

"horizontal": true,

"lineParam": {

"legendName": "胸罩图例",

"xdatas": [

[

43364, 13899, 12000, 2181, 21798, 1796, 1300

]

],

"ydatas": [

"A罩杯", "B罩杯", "C罩杯", "D罩杯", "E罩杯", "F罩杯","G罩杯"

]

},

"title": "胸罩使用人数"

}

(3)饼图{

"datas": [

43364, 13899, 12000, 2181, 21798, 1796, 1300

],

"title": "胸罩图例",

"types": [

"A罩杯", "B罩杯", "C罩杯", "D罩杯", "E罩杯", "F罩杯","G罩杯"

]

}

效果展示:

AAffA0nNPuCLAAAAAElFTkSuQmCC

渐变色柱状图

AAffA0nNPuCLAAAAAElFTkSuQmCC

AAffA0nNPuCLAAAAAElFTkSuQmCC

AAffA0nNPuCLAAAAAElFTkSuQmCC

分享就到这里,代码后续会开源出来,如果帮助到你了,请点个赞,感谢你的支持!如果你需要源代码,可以联系我!

在此,为你推荐几门优秀的课程:

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

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

相关文章

ios 系统提示框_ios13终于能屏蔽系统更新了!附详细教程

很多人会遇到这样的烦恼&#xff0c;ios频繁更新&#xff0c;自己用惯了当前系统版本&#xff0c;系统总提示新的更新请求&#xff0c;不小心点到之后&#xff0c;系统就会自动更新安装&#xff0c;有很多小伙伴更新后&#xff0c;手机变卡顿&#xff0c;耗电量加大&#xff0c…

判断是否有小数_一线老师笔记:数学判断题拿高分的技巧

01什么是判断题&#xff1f;判断是关于对象和它属性有所肯定或者否定的思维形式。在研究数学中&#xff0c;经常要对现实世界的空间形式和数量关系&#xff0c;作出肯定或者否定的回答&#xff0c;因而要大量使用判断&#xff0c;并把一些正确的判断作为进一步研究问题的依据。…

mysql 导入 sqlite_Mysql 数据导入SQlite

SQlite 有一个很强大的管理工具名字叫做Sqlite Developer (官方网站)。在Sqlite Developer中有关于数据导入的强大功能。可以将MSSQL Oracl Aeecss等等数据库导入到Mysql中。但是&#xff0c;默认在Win7环境中没有Mysql的倒入方式。你需要一个叫做“Mysql ODBC”的win客户端工具…

centos 安装mysql 5.7.9_CentOS 6.6下RPM方式安装MySQL 5.7.9

说明&#xff1a;从MySQL5.7.4起&#xff0c;以RPM包的方式安装后的MySQL的部署&#xff0c;默认是安全的&#xff0c;并且有这些特点&#xff1a;1. 在大多数情况下&#xff0c;你只需要安装MySQL-server和MySQL-client安装包就可以安装上一个标准功能的MySQL。对于一个标准安…

mongodb 导入 mysql_将mongodb 数据指定字段导出,然后指定字段导入mysql 实例 及相关问题解决...

需求&#xff1a;将mongodb 数据指定字段导出&#xff0c;然后再指定字段导入mysql 表中直接上图吧&#xff0c;最后 会将遇到几个问题及解决方案贴出&#xff0c;以便遇到类似问题可以迅速解决(期间所用命令具体用法不在本文详解之内)将mongodb 数据指定字段导出&#xff0c;…

mysql外部排序_深入浅出MySQL优先队列(你一定会踩到的order by limit 问题)

0.先抛问题假设字段category无索引且有重复值&#xff0c;order by category 和 limit 组合使用的结果会和预期不符。问题复现&#xff1a;表结构(就是两个字段)CREATE TABLE ratings (id int(11) NOT NULL AUTO_INCREMENT,category int(11) DEFAULT NULL,PRIMARY KEY (id)) EN…

navicat fo mysql 教程_Navicat For MySQL的简单使用教程

1.前提是必须先安装好MySQL数据库(Mac下安装MySQL数据库见前一篇)2.安装Navicat3.点击navicate左上角&#xff1a;连接->MySQL->先测链接下&#xff0c;如果提示连接成功&#xff0c;就可以填写连接名&#xff0c;点击连接即可。双击刚创建的连接下面会有四个数据库用naV…

mysql官网 ab_MySQLAB同步

MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日1 . 介绍MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并…

mvc json 乱码_你了解JSON吗?——Jackson、FastJson在SpringMVC中的简单使用

原文参考分享自CSDN&#xff1a;你了解JSON吗&#xff1f;--Jackson、FastJson在SpringMVC中的简单使用_欢迎来到 Baret~H 的博客-CSDN博客1. 什么是 JSONJSON&#xff08;JavaScript Object Notation, JS 对象标记&#xff09;是一种轻量级的数据交换格式采用完全独立于编程语…

format 函数包含_Python成为专业人士笔记-高级对象Format格式化

“专业人士笔记”系列目录&#xff1a;创帆云&#xff1a;Python成为专业人士笔记--强烈建议收藏&#xff01;每日持续更新&#xff01;​zhuanlan.zhihu.com在存储和转换数据输出供查看时&#xff0c;字符串格式可能变得非常重要。Python提供了本文概述的各种字符串格式化方法…

python 预测算法_Python 与金融数据使用机器学习算法预测交易策略

记得 关注、分享、点在看呀&#xff5e; 这样您就能持续收到优质的推送啦这一期&#xff0c;我们将使用上一期处理好的数据特征和标签训练机器&#xff0c;然后预测交易策略。我们将分别使用 K近邻算法和集成学习两种方法分别完成模型的训练和预测。FinTech HistoryPython 与金…

mysql 存储过程插入慢_mysql存储过程太慢怎么办

mysql存储过程太慢的解决方法&#xff1a;首先打开my.cnf配置文件&#xff1b;然后添加配置【long_query_time1】&#xff1b;接着通过【tail -f /tmp/logs/mysqld.log】命令监控sql&#xff1b;最后进行针对性的优化即可。解决方法&#xff1a;第一步&#xff1a;修改/etc/my.…

导出远程mysql数据库中的表_shell脚本实现导出远程mysql数据库表数据至本地

bin/main.sh脚本内容 #!/bin/bash#作用&#xff1a;用于同步远程mysql数据库表数据至本地#作者&#xff1a;丁艺博source /etc/profilesource ~/.bash_profileexport LANGen_US.UTF-8export RUN_HOME$(cd "$(dirname "$0")"; echo "${PWD%/*}")s…

商业智能解决方案_格至智能开关:简单便捷的商业智能照明解决方案

美莱恩智能照明推出的格至智能调光开关&#xff0c;是一款便捷、可轻松实现扩展的智能照明系统。它能够节约能源&#xff0c;并在为各种空间工作或者学习的人们&#xff0c;营造最舒适的照明环境。借助美莱恩SLT单火线传输技术&#xff0c;在新建或者改造项目中&#xff0c;你将…

vue 安装 less_解决旧Vue项目升级less-loader 6.0.0报错

作为一个爱折腾的主,我的package随时都是ncu -u! 何为ncu,就是检查nodejs npm/yarn项目依赖最新版本package.json一个插件! 这不,前几天less-loader 升级了最新版,我也迫不及待升级。 升级最新版软件依赖有很多好处,总之作为一个开发者你发布新版本肯定是升级改造的工作…

反积分饱和 程序_用抗积分饱和PID控制传递函数为G(s)的被控对象

题目&#xff1a;用抗积分饱和PID控制传递函数为G(s)的被控对象G(s)523500/(s^387.35s^210470s)二、抗积分饱和原理积分饱和现象是在系统存在一个方向的偏差&#xff0c;PID控制器的输出由于积分作用的不断加大而加大&#xff0c;从而导致执行器达到极限位置&#xff0c;如果控…

mysql top 1效率_TOP 1比不加TOP慢的疑惑

问题描述&#xff1a; 有一个查询如下&#xff0c;去掉 TOP 1 的时候&#xff0c;很快就出来结果了&#xff0c;但加上 TOP 1 的时候&#xff0c;一般要 2~3 秒才出数据&#xff0c;何解&#xff1f; SELECT TOP 1 ??? A . INVNO FROM A , B WHERE A . Item B . ItemNumber…

jieba库词频统计_用jieba库统计文本词频及云词图的生成

一、安装jieba库&#xff1a;\>pip install jieba #或者 pip3 install jieba二、jieba库解析jieba库主要提供提供分词功能&#xff0c;可以辅助自定义分词词典。jieba库中包含的主要函数如下&#xff1a;jieba.cut(s) …

mysql查看表描述_MySQL表记录操作介绍(重点介绍查询操作)

MySQL表记录操作指的是对数据库表中数据进行CRUD增删改查操作&#xff0c;一下将一一给大家介绍&#xff0c;重点介绍查询操作。一、插入数据(INSERT)二、删除数据(DELETE)三、修改数据(UPDATE)四、查询数据(SELECT)下面将以例子对数据查询进行详细讲解&#xff1a;例子&#x…

python邮件的图片放在哪里_用python保存电子邮件中的嵌入图像

我试图在一个嵌入的电子邮件中抓取图像。问题是我保存的图像不可读&#xff0c;我不知道为什么。电子邮件(保存为我在代码开头加载的文件)&#xff1a;MIME-Version: 1.0Received: by 10.100.120.7 with HTTP; Tue, 18 Oct 2011 10:36:48 -0700 (PDT)In-Reply-To: <8B4FDE07…