Coder Social home page Coder Social logo

echartsannotation's Introduction

ECharts的Java注解框架 EChartsAnnotation

用原生Java注解来映射ECharts的Option类,提供Annotation到JSON的转换功能。

思路 How it works

1在后台使用Annotation来标注Bean类
2注解处理器转换成JSON树
3使用JSON系列化工具包(fastjson/gson)输出到前端页面

注解 Annotation

基于ECharts3.0制作
Option定义
总共有3700+个注解!这里生成的注解只能用于标记Bean类的域Field
根据JSON树的叶子节点的Type属性中的不同类型,3700多注解分成6种不同类型:

JS类型 Java类型 默认值 文件名后缀 备注
boolean boolean false Boolean 布尔类型
Color int 0 Hex Web颜色映射成Java整型,由于常用16进制表示所以后缀是Hex
number Number 0 Number 抽象类Number是int、double等基本类型的父类,一律转为double
string String "" String 字符串类型
Array List Array 数组类型一律转成泛型List
Function Object Function 由于Java不支持函数类型,所以需要实现fastjson接口JSONAware的toJSONString方法输出字符串的“函数”
* Object All 参考Function类型

按注解的参数个数分,可以分为两种:
######标记注解 标记注解没有参数。如果被标记的元素为null或者等于默认值,注解处理器将不会输出任何东西
######单值注解 单值注解只有一个参数。该参数的类型跟注解名件名末尾的单词有关。
由于许多叶子节点有多种类型,所以一个叶子节点可能生成多个注解,但是注解处理器把这些注解当作同一个注解输出。
在单值注解的参数不为空和被标记的元素不为null且不等于默认值的情况下,注解处理器会优先输出被注解元素的值。

注解处理器 AnnotationProcessor

######注解处理器专用的注解:
SingleChartDuplexChart用来标记需要被转换成JSON的Java Bean类,
这两个注解不同之处在于处理seriesdataZoomvisualMap下面的注解时,
同一个类多次同个注解文件,前者把重复出现的注解合并处理;
后者通过AddSeriesAddDataZoomAddVisualMap三种注解提取被SingleChart标记的Java文件中的
seriesdataZoomvisualmap,并添加到当前被DouplexChart标记的文件中。 ######SingleChart 参数 exportTo 默认值是"",不等于默认值时向本地磁盘写入"exportTo".json
参数 extendsFrom 默认值是"",不等于默认值时,将继承自"extendsFrom.json"
######DupelxChart 参数 exportTo 默认值是"",不等于默认值时向本地磁盘写入"exportTo".json
参数 extendsFrom 默认值是"",不等于默认值时,将继承自"extendsFrom.json"
######AddSeries 只能用于DuplexChart的域Field,若域不为null且域的类源文件被SingleChart注解标记,
将会提取源文件中series下的注解并添加到DuplexChart
######AddDataZoom 只能用于DuplexChart的域Field,若域不为null且域的类源文件被SingleChart注解标记,
将会提取源文件中dataZoom下的注解并添加到DuplexChart
######AddVisualMap 只能用于DuplexChart的域Field,若域不为null且域的类源文件被SingleChart注解标记,
将会提取源文件中visualMap下的注解并添加到DuplexChart

如何使用 Get Started

phraseSingleChartphraseDuplexChart已合并到parseChart,不用再区分两者。
1添加EChartsAnnotation到项目
maven

<dependency>
  <groupId>cn.edu.gdut.zaoying</groupId>
  <artifactId>EChartsAnnotation</artifactId>
  <version>1.0.2</version>
  <type>pom</type>
</dependency>

gradle

compile('cn.edu.gdut.zaoying:EChartsAnnotation:1.0.2')

jar
下载Jar包
2增加LineChart折线图

@SingleChart(exportTo = "templates/lineChart.json")
public class LineChart {
    @NameString
    String name;
    @DataArray
    double[] data;
    @cn.edu.gdut.zaoying.Option.xAxis.NameString("横轴")
    String xAxisName;
    @TypeString("category")
    String type;
    @cn.edu.gdut.zaoying.Option.xAxis.DataArray
    int[] xAxisData=new int[]{1,2,3,4};
    @cn.edu.gdut.zaoying.Option.yAxis.NameString("纵轴")
    String yAxisName;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double[] getData() {
        return data;
    }

    public void setData(double[] data) {
        this.data = data;
    }

}

之前的例子因为少了xAxisyAxis没法正常显示,这是ECharts的要求。
3调用图表处理器

public class EChartsTest {
    public static void main(String[] args) {
      LineChart lineChart=new LineChart();
      lineChart.name="线性表一";
      lineChart.data=new double[]{1,2,3,4};
      Object json=EChartsAnnotationProcessor.parseChart(lineChart);
      System.out.print(JSON.toJSONString(json));
    }
}

4编写更复杂的组合图表
######编写条形图

import cn.edu.gdut.zaoying.Option.series.bar.DataArray;
import cn.edu.gdut.zaoying.Option.series.bar.NameString;
import cn.edu.gdut.zaoying.SingleChart;

@SingleChart
public class BarChart {
    @NameString
    String name;
    @DataArray
    double[] data;
}

######CombinedChart组合图表

@DuplexChart
public class CombinedChart {
    @TextString
    String title;
    @BackgroundColorHex(value = 0xfff)
    int backgroundColor;
    @AddSeries
    LineChart lineChart;
    @AddSeries
    LineChart lineChart2;
    @AddSeries
    BarChart barChart;

    public CombinedChart(String title) {
        this.title = title;
        lineChart = new LineChart();
        lineChart.setName("折线图");
        lineChart.setData(new double[]{1,2,3,4});
        lineChart2 = new LineChart();
        lineChart2.setName("折线图二");
        lineChart2.setData(new double[]{3,6,8,9});
        barChart = new BarChart();
        barChart.setName("条形图");
        barChart.setData(new double[]{5,6,7,8});
    }
}

5调用图表处理器

public class EChartsTest {
    public static void main(String[] args) {
        Object json=EChartsAnnotationProcessor.parseChart(new CombinedChart("组合图表"));
        System.out.print(JSON.toJSONString(json));
    }
}

6使用继承 ######编写view.json

{
  "title":{"text":"组合图表"},
  "backgroundColor":"#fff"
}

######修改CombinedChart.java

@DuplexChart(extendFrom = "view.json")//view.json放在同一个目录,不然要加上完整路径
public class CombinedChart {
//    @TextString
//    String title;
//    @BackgroundColorHex(value = 0xfff)
//    int backgroundColor;
    @AddSeries
    LineChart lineChart;
    @AddSeries
    Line2Chart line2Chart;
    @AddSeries
    BarChart barChart;

    public CombinedChart(String title) {
//        this.title = title;//使用view.json提供的值
        lineChart = new LineChart();
        lineChart.setName("折线图");
        lineChart.setData(new double[]{1,2,3,4});
        line2Chart = new Line2Chart();
        line2Chart.setName("折线图二");
        line2Chart.setData(new double[]{1,2,3,4});
        barChart = new BarChart();
        barChart.setName("条形图");
        barChart.setData(new double[]{5,6,7,8});
    }
}

######调用图表处理器

public class EChartsTest {
    public static void main(String[] args) {
        Object json=EChartsAnnotationProcessor.parseChart(new CombinedChart("组合图表"));
        System.out.print(JSON.toJSONString(json));
    }
}

7导出json文件
导出json文件供其它图表继承

@DuplexChart(exportTo = "templates/view.json")//调用图表处理器解析的同时,导出json文件
@SingleChart(exportTo = "templates/view.json")//不建议和DuplexChart注解在同一个类中使用

8添加Function

import com.alibaba.fastjson.JSONAware;
public class Function implements JSONAware{//实现JSONAware接口
    String method;
    String arguments;
    String body;
    
    public Function(String method, String arguments, String body) {
        this.method = method;
        this.arguments = arguments;
        this.body = body;
    }
    @Override
    public String toJSONString() {
        return "function "+method+" ("+arguments+"){\n"+body+"\n}";
    }
}

9测试

import com.alibaba.fastjson.JSON;

public class ECharts {
    public static void main(String[] args) {
        Function function=new Function("toString","str","alert();");
        System.out.println(JSON.toJSONString(function));
    }
}

##写在最后 项目进度已基本完成,后期除了bug fix,不会再有大修改。请放心集成! Taglib项目 电梯

echartsannotation's People

Contributors

zaoying avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

echartsannotation's Issues

你好,我是个echart的初学者,想问个问题

假如我现在要使用timeline组件,要实现官网的下面data数组,[
'2002-01-01',
'2003-01-01',
'2004-01-01',
{
value: '2005-01-01',
tooltip: { // 让鼠标悬浮到此项时能够显示 tooltip
formatter: '{b} xxxx'
},
symbol: 'diamond', // 此项的图形的特别设置。
symbolSize: 16 // 此项的图形大小的特别设置。
},
'2006-01-01'

]
我现在的写法是,
TimeLineCharts charts=new TimeLineCharts();
Map<String, Object> map=new HashMap<String,Object>();
Map<String, Object> mtool=new HashMap<>();
mtool.put("formatter", "what");
map.put("value", "2005-01-01");
map.put("tooltip", mtool);
map.put("symbol", "diamond");
map.put("symbolSize", 16);
charts.setData(new Object[]{"2002-01-01","2003-01-01","2004-01-01",map,"2006-01-01"});
Object json=EChartsAnnotationProcessor.phraseSingleChart(charts);
System.out.print(JSON.toJSONString(json));
请问我这种写法对么?还是有其它更简洁的写法,还有echarts3中说把公共的组建都放到baseOptions里,这个,我怎么能把我的这个timeline放到options里面,生成json字符串到时候,我把baseOption 并在生成好的字符串中?谢谢了

兼容性

大神,这是不是只兼容JDK1.8?

使用问题

你好,我想要个
data:[{name:'广州',selected:true}]
格式应该怎么写呀?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.