目录
一、在 pom.xml 引入 freemarker,用于解析 ftl 模板文件
二、在 templates 目录下 创建 echarts 目录,并放入 riskEchartsOption.ftl 模板文件
三、创建 EchartsFreemarkerUtils 工具类,用于读取解析 ftl 模板文件。
四、编写业务代码调用EchartsFreemarkerUtils.generate()
map结构如下:
返回json格式的option内容
一、在 pom.xml 引入 freemarker,用于解析 ftl 模板文件
<!-- 解析ftl模板文件 --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency>
二、在 templates 目录下 创建 echarts 目录,并放入 riskEchartsOption.ftl 模板文件
{ "title": { "text": "${dateRange}", "subtext": "共${carCount}台车接入德行第三方账号监管服务", "left": "center" }, "legend": { "top": "bottom" }, "tooltip": {}, "dataset": { "source": [ ["product", "共处置风险","一级报警数", "二级报警数", "三级报警数"], ["总风险数",${riskCount}, ${oneRiskLevel}, ${twoRiskLevel}, ${threeRiskLevel}], ["风险属实", ${realRiskCount}, ${oneRealRiskLevel}, ${twoRealRiskLevel}, ${threeRealRiskLevel}], ["设备误报", ${unrealRiskCount}, ${oneUnrealRiskLevel},${twoUnrealRiskLevel}, ${threeUnrealRiskLevel}] ] }, "xAxis": [ { "type": "category", "gridIndex": 0 }, { "type": "category", "gridIndex": 1 } ], "yAxis": [{ "gridIndex": 0 }, { "gridIndex": 1 }], "grid": [{ "bottom": "55%" }, { "top": "55%" }], "series": [ { "type": "bar", "seriesLayoutBy": "row","label": {"show": true,"position": "inside" } }, { "type": "bar", "seriesLayoutBy": "row","label": {"show": true,"position": "inside" } }, { "type": "bar", "seriesLayoutBy": "row","label": {"show": true,"position": "inside" } }, { "type": "bar", "xAxisIndex": 1, "yAxisIndex": 1,"label": {"show": true,"position": "inside" } }, { "type": "bar", "xAxisIndex": 1, "yAxisIndex": 1,"label": {"show": true,"position": "inside" } }, { "type": "bar", "xAxisIndex": 1, "yAxisIndex": 1,"label": {"show": true,"position": "inside" } }, { "type": "bar", "xAxisIndex": 1, "yAxisIndex": 1,"label": {"show": true,"position": "inside" } } ] }
三、创建 EchartsFreemarkerUtils 工具类,用于读取解析 ftl 模板文件。
package com.dexin.common.utils.echarts; import freemarker.template.Configuration; import freemarker.template.Template; import java.io.StringWriter; import java.util.Map; /** * 调用生成echarts option模版 * @author yuanzhouhai * @version 1.0 * @date 2024-01-18 10:29 */ public class EchartsFreemarkerUtils { private static final ClassLoader CLASS_LOADER = EchartsFreemarkerUtils.class.getClassLoader(); // 模板存放的目录 private static final String BASE_PATH = "static/echarts"; /** * 加载模板并生成ECharts的option数据字符串 * @param templateFileName * @param data * @return {@link String} */ public static String generate(String templateFileName, Map<String, Object> data) { Configuration configuration = new Configuration(Configuration.VERSION_2_3_31); // 设置默认编码 configuration.setDefaultEncoding("UTF-8"); // 将 data 写入模板并返回 try { StringWriter writer = new StringWriter(); // 设置模板所在目录,设置目录打成jar包后无法读取,所以使用类加载器 // configuration.setDirectoryForTemplateLoading(new File(BASE_PATH)); configuration.setClassLoaderForTemplateLoading(CLASS_LOADER, BASE_PATH); // 生成模板对象 Template template = configuration.getTemplate(templateFileName); template.process(data, writer); writer.flush(); return writer.getBuffer().toString(); } catch (Exception e) { } return null; } }
四、编写业务代码调用EchartsFreemarkerUtils.generate()
String riskOps = EchartsFreemarkerUtils.generate("riskEchartsOption.ftl", map);
map结构如下:
返回json格式的option内容
{ "title": { "text": "2023-11-01至2023-11-30", "subtext": "共47台车接入德行第三方账号监管服务", "left": "center" }, "legend": { "top": "bottom" }, "tooltip": {}, "dataset": { "source": [ ["product", "共处置风险","一级报警数", "二级报警数", "三级报警数"], ["总风险数",3, 0, 1, 2], ["风险属实", 3, 0, 1, 2], ["设备误报", 0, 0,0, 0] ] }, "xAxis": [ { "type": "category", "gridIndex": 0 }, { "type": "category", "gridIndex": 1 } ], "yAxis": [{ "gridIndex": 0 }, { "gridIndex": 1 }], "grid": [{ "bottom": "55%" }, { "top": "55%" }], "series": [ { "type": "bar", "seriesLayoutBy": "row","label": {"show": true,"position": "inside" } }, { "type": "bar", "seriesLayoutBy": "row","label": {"show": true,"position": "inside" } }, { "type": "bar", "seriesLayoutBy": "row","label": {"show": true,"position": "inside" } }, { "type": "bar", "xAxisIndex": 1, "yAxisIndex": 1,"label": {"show": true,"position": "inside" } }, { "type": "bar", "xAxisIndex": 1, "yAxisIndex": 1,"label": {"show": true,"position": "inside" } }, { "type": "bar", "xAxisIndex": 1, "yAxisIndex": 1,"label": {"show": true,"position": "inside" } }, { "type": "bar", "xAxisIndex": 1, "yAxisIndex": 1,"label": {"show": true,"position": "inside" } } ] }