package com.tzb.myspringboot.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.tzb.myspringboot.dao.entity.SupersetMapEntity;
import com.tzb.myspringboot.dao.repository.SupersetMapRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
@Component
public class SupersetUtil {
@Autowired
SupersetMapRepository supersetMapRepository;
============================返回组装好的iframe==================================
/**
* 获取组装好的iframe图表
* @return
*/
public String getSupersetIframe(Integer id,
String startTime,
String endTime,
String filterFieldName,
String filterFieldValue) {
String res = null;
StringBuilder iframe = new StringBuilder("");
try {
//LogUtil.print("接收消息: "+json);
//解析json消息
// JSONObject jsonobj = JSONObject.parseObject(json);
// if(!jsonobj.containsKey("id")){
// return "" ;
// }
// Integer id = jsonobj.getInteger("id");
if (null == id) {
return "";
}
//开始时间 结束时间//"time_range":"2019-04-10T00:00:00 : 2019-04-23T00:00:00",
String timeRange = "" ;
if(StringUtil.isNotBlank(startTime) && StringUtil.isNotBlank(endTime)){
try {
timeRange =
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new SimpleDateFormat("yyyyMMddHHmmss").parse(startTime))
+ " : "
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new SimpleDateFormat("yyyyMMddHHmmss").parse(endTime));
} catch (ParseException e) {
e.printStackTrace();
}
}
Map<String,Object> filterItem = null;
if(StringUtil.isNotBlank(filterFieldValue)){
filterItem = new HashMap<>();
String[] valueArr = filterFieldValue.split(",");
filterItem.put("expressionType","SIMPLE");
filterItem.put("operator","in");
filterItem.put("comparator",valueArr);
filterItem.put("clause","WHERE");
filterItem.put("sqlExpression",null);
filterItem.put("fromFormData",true);
filterItem.put("filterOptionName","filter_m9dix8z3omk_35n0yvwzuls");
}
SupersetMapEntity entity = supersetMapRepository.findById(id.longValue()).get();
if (null != entity) {
iframe.append("<iframe ");
iframe.append(" width=\"" + entity.getIframe_width() + "\"");
iframe.append(" height=\"" + entity.getIframe_height() + "\"");
iframe.append(" seamless ");
iframe.append(" frameBorder=\"" + entity.getIframe_frameBorder() + "\"");
iframe.append(" scrolling=\"" + entity.getIframe_scrolling() + "\"");
String url = "" + entity.getIframe_src_url();
JSONObject formJson = JSON.parseObject(entity.getIframe_src_form_data());
if(StringUtil.isNotBlank(timeRange)){//覆盖原有的time_range
formJson.put("time_range",timeRange);
}
if(null != filterItem){
if(StringUtil.isBlank(filterFieldName)){
if(formJson.containsKey("groupby") && formJson.getJSONArray("groupby").size() > 0){
filterItem.put("subject",formJson.getJSONArray("groupby").get(0));
}else{
//此处按说为错误
}
}else{
filterItem.put("subject",filterFieldName);
}
if(formJson.containsKey("adhoc_filters")){
formJson.getJSONArray("adhoc_filters").add(filterItem);
}
}
url += URLEncoder.encode( JSONObject.toJSONString(formJson, SerializerFeature.WriteMapNullValue),"UTF-8");
url += "&height=" + entity.getIframe_src_height();
url += "&standalone=" + (entity.getIframe_src_standalone() ? "true" : "false");
iframe.append(" src=\"" + url + "\"");
iframe.append("></iframe>");
}
} catch (Exception e) {
// e.printStackTrace();
LogUtil.error(DateUtil.fmtDateToStr(new Date(), "yyyy-MM-dd HH:mm:ss") + "http接口异常", e.getMessage(), e);
}
return iframe.toString();
}
==================================返回url=======================================
/**
* 获取组装好的iframe图表src url
* @return
*/
public String getSupersetIframeUrl(Integer id,
String startTime,
String endTime,
String filterFieldName,
String filterFieldValue) {
if (null == id) {
return "";
}
//开始时间 结束时间//"time_range":"2019-04-10T00:00:00 : 2019-04-23T00:00:00",
String timeRange = "" ;
if(StringUtil.isNotBlank(startTime) && StringUtil.isNotBlank(endTime)){
try {
timeRange =
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new SimpleDateFormat("yyyyMMddHHmmss").parse(startTime))
+ " : "
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new SimpleDateFormat("yyyyMMddHHmmss").parse(endTime));
} catch (ParseException e) {
e.printStackTrace();
}
}
Map<String,Object> filterItem = null;
if(StringUtil.isNotBlank(filterFieldValue)){
filterItem = new HashMap<>();
String[] valueArr = filterFieldValue.split(",");
filterItem.put("expressionType","SIMPLE");
filterItem.put("operator","in");
filterItem.put("comparator",valueArr);
filterItem.put("clause","WHERE");
filterItem.put("sqlExpression",null);
filterItem.put("fromFormData",true);
filterItem.put("filterOptionName","filter_m9dix8z3omk_35n0yvwzuls");
}
SupersetMapEntity entity = supersetMapRepository.findById(id.longValue()).get();
if (null != entity) {
String url = "" + entity.getIframe_src_url();
JSONObject formJson = JSON.parseObject(entity.getIframe_src_form_data());
if(StringUtil.isNotBlank(timeRange)){//覆盖原有的time_range
formJson.put("time_range",timeRange);
}
if(null != filterItem){
if(StringUtil.isBlank(filterFieldName)){
if(formJson.containsKey("groupby") && formJson.getJSONArray("groupby").size() > 0){
filterItem.put("subject",formJson.getJSONArray("groupby").get(0));
}else{
//此处按说为错误
}
}else{
filterItem.put("subject",filterFieldName);
}
if(formJson.containsKey("adhoc_filters")){
formJson.getJSONArray("adhoc_filters").add(filterItem);
}
}
try {
url += URLEncoder.encode( JSONObject.toJSONString(formJson, SerializerFeature.WriteMapNullValue),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
url += "&height=" + entity.getIframe_src_height();
url += "&standalone=" + (entity.getIframe_src_standalone() ? "true" : "false");
return url ;
}
return null ;
}
==========================================================================
/**
* 获取图表id配置数据
* @param id
* @return
*/
public SupersetMapEntity getSupersetEntityById(Integer id) {
try {
SupersetMapEntity entity = supersetMapRepository.findById(id.longValue()).get();
return entity;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 通过页面标识查询标签页所有id
* @param pageFlag
* @return
*/
public List<Long> getSupersetPageIds(String pageFlag) {
List<Long> idlis = null;
try {
List<SupersetMapEntity> list = supersetMapRepository.getSupersetPageIds(pageFlag);
idlis = new ArrayList<>();
for (SupersetMapEntity sm:list) {
idlis.add(sm.getId());
}
return idlis;
} catch (Exception e) {
e.printStackTrace();
}
return idlis;
}
}
注意我的库表格式为下图,我这里是先取出来url,然后进行里面的条件的替换,然后再次进行编码(用UTF-8),然后返回前端展示即可。
之前遇到一个错误就是编码问题,之前我指定UTF-8编码,导致编码出问题了。
看这篇:https://blog.csdn.net/weixin_38750084/article/details/90499846