DataEase
N_Docker N_Docker Compose Apache Doris
DataEase 是开源的数据可视化分析工具, 能够通过拖拉拽方式快速制作图表 比以前的大屏项目, 可好太多了…
源码启动
.
├── Dockerfile # 构建容器镜像使用的 dockerfile
├── LICENSE # License 申明
├── README.md
├── backend # 后端项目主目录
├── frontend # 前端项目主目录
├── mobile # 移动端项目主目录
└── pom.xml # 整体 maven 项目使用的 pom 文件
后端
后端主源码在: /DataEase/core/backend
数据库配置
- 数据库配置在
backend/src/main/resources/generatorConfig.xml引用了file:///opt/dataease/conf/dataease.properties文件 读取${spring.datasource.url}等数据库配置变量
<!-- 配置数据库连接的位置-->
<properties url="file:///opt/dataease/conf/dataease.properties"/>
......
<!-- jdbc连接信息 --> <!-- EduLoanManage EduTestDataBase -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="${spring.datasource.url}&nullCatalogMeansCurrent=true"
userId="${spring.datasource.username}" password="${spring.datasource.password}"/>修改 opt/dataease/conf/dataease.properties 文件位置或 增加spring.datasource.url 等配置在Spring 上下文内;
下用 spring active 的方式修改
- 新建一个 active 配置文件
backend/src/main/resources/application-dev.properties内容
spring.datasource.url=jdbc:mysql://192.168.2.254:3306/db_dataease?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
spring.datasource.username=
spring.datasource.password=.com
carte.host=kettle
carte.port=18080
carte.user=cluster
carte.passwd=cluster
doris.db=dataease
doris.user=root
doris.password=Password123@doris
doris.host=doris-fe
doris.port=9030
doris.httpPort=8030
#新建用户初始密码
dataease.init_password=de123456
#登录超时时间单位min 如果不设置 默认8小时也就是480
dataease.login_timeout=480
logger.level=INFO
#DE运行模式,可选值有 local、simple、cluster,分别对应本地模式、精简模式、集群模式
engine_mode=simple- 修改
backend/src/main/resources/application.propertiesspring 的 activespring.profiles.active=dev
DataEase 使用 MySQL 数据库,推荐使用 MySQL 5.7 版本。同时 DataEase 对数据库部分配置项有要求,请参考下附的数据库配置,修改开发环境中的数据库配置文件(以下配置有部分参数可能并不适用 MySQL 8.x 版本)
MySQL 8.x 实际能设的 sql_mode
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONlogback.xml
也用到数据库??
替换之
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- logback -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39})::%M-%L%clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<!-- Console 输出设置 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<appender name="INFO_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/info.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 按天来回滚,如果需要按小时来回滚,则设置为{yyyy-MM-dd_HH} -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 回滚文件名 -->
<fileNamePattern>./logs/info-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 如果按天来回滚,则最大保存时间为maxHistory 天,maxHistory天之前的都将被清理掉 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<!-- 日志输出格式 -->
<encoder>
<Pattern>%d -%-4r [%t] %-5p %c: %m%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="WARN_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/warn.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 按天来回滚,如果需要按小时来回滚,则设置为{yyyy-MM-dd_HH} -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 回滚文件名 -->
<fileNamePattern>./logs/warn-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 如果按天来回滚,则最大保存时间为maxHistory 天,maxHistory天之前的都将被清理掉 -->
<maxHistory>90</maxHistory>
</rollingPolicy>
<!-- 日志输出格式 -->
<encoder>
<Pattern>%d -%-4r [%t] %-5p %c: %m%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/error.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<!-- 按天来回滚,如果需要按小时来回滚,则设置为{yyyy-MM-dd_HH} -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>./logs/error-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 如果按天来回滚,则最大保存时间为maxHistory天,maxHistory天之前的都将被清理掉 -->
<maxHistory>120</maxHistory>
</rollingPolicy>
<!-- 日志输出格式 -->
<encoder>
<Pattern>%d -%-4r [%t] %-5p %c: %m%n</Pattern>
</encoder>
</appender>
<!-- 异步输出,异步的log片段必须在同步段后面,否则不起作用 -->
<appender name="ASYNC_INFO_FILE" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>10000</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="INFO_FILE" />
</appender>
<appender name="ASYNC_WARN_FILE" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>10000</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="WARN_FILE" />
</appender>
<appender name="ASYNC_ERROR_FILE" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>10000</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="ERROR_FILE" />
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ASYNC_INFO_FILE" />
<appender-ref ref="ASYNC_WARN_FILE" />
<appender-ref ref="ASYNC_ERROR_FILE" />
</root>
<!--监控sql日志输出 -->
<logger name="jdbc.sqlonly" level="INFO" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="jdbc.resultset" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="jdbc.resultsettable" level="OFF" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="jdbc.connection" level="OFF" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="jdbc.sqltiming" level="OFF" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="jdbc.audit" level="OFF" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
</configuration>前端
前端主要源码: /DataEase/core/frontend
cd frontend/
npm install
npm serveDataEase 成功安装后,默认内置了两个用户:
- 管理员用户为 admin ,密码为 dataease
- 体验用户为 demo ,密码为 dataease
踩坑
演示数据 DataEaseException: java.lang.Exception?
io.dataease.exception.DataEaseException: java.lang.Exception: 无效数据源,无法正常显示 有点不兼容 mysql 8 ?
Row 28 was cut by GROUP_CONCAT() 数据会被剪切?
调整 GROUP_CONCAT 函数最大值限制: SET group_concat_max_len = 102400
my.ini
sync_binlog=0
group_concat_max_len=1024000
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
字符集问题, 建库语句应该是
CREATE DATABASE `db_dataease` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
set collation_database=utf8_general_ci;
set collation_connection=utf8_general_ci;
set collation_server=utf8_general_ci;丢失geo数据? /geo/full/156/156650000_full.json not found.
DataEase 从 1.2 版本开始支持地图组件。在 DataEase 源码工程的目录下有一个地图文件目录 mapFiles/full,需要将该目录下的文件放置到 /opt/dataease/data/feature/full 目录下。 如果是 Windows 的话,可以在工程目录所在盘的根目录下,创建 opt/dataease/data/feature/full 目录。
插件
DataEase 从 1.9 版本开始支持以插件的形式导入组件与数据源,可以下载 dataease-extensions 工程源码,在本地打包下,需要将打包后生成的 jar 包放置到 /opt/dataease/plugins/default 目录下。 如果是 Windows 的话,可以在工程所在盘的根目录下,创建 /opt/dataease/plugins/default 目录,如下示例图。
在线安装
https://dataease.io/docs/installation/online_installation/
安装模式介绍
v1.9.0 及以后版本安装模式分为本地模式(local)、精简模式(simple)、集群模式(cluster),v1.9.0 以前版本不涉及该内容,等同于安装的本地模式。
安装模式对应 DataEase 中的配置参数为 DE_ENGINE_MODE,在不做修改的情况下,系统默认安装精简模式。
本地模式
DE_ENGINE_MODE=local 或源码application.properties的 engine_mode=local
使用本地模式安装,DataEase 会自带 Doris 与 Kettle 组件,无需再做额外配置,但各组件均为单点,不具备高可用特性。
在此模式下,Excel 数据集、API 数据集以及定时同步的数据默认保存在自带的 Doris 组件中。
精简模式
DE_ENGINE_MODE=simple 或源码application.properties的 engine_mode=simple
使用精简模式安装,系统不会额外安装 Doris 与 Kettle 组件,提供用户轻量级的应用系统,尤其是对接数据量较小的情况。
在此模式下,Excel 数据集或 API 数据集的相关数据存储在数据引擎中(默认配置自带的 MySQL 组件,用户可在系统管理界面配置数据引擎,数据引擎目前仅支持 MySQL 类型)。
注意:由于精简模式未配置 Kettle 与 Doris,故精简模式不提供定时同步模式。
集群模式
DE_ENGINE_MODE=cluster 或源码application.properties的 engine_mode=cluster
使用集群模式安装,系统不会额外安装 Doris 与 Kettle 组件,但会在系统管理模块提供 Doris 与 Kettle 的链接配置界面(请参考【系统管理】的【系统参数】说明),用户可独立安装 Doris 集群及 Kettle 并配置在 DataEase 中。集群模式下 Excel 数据集,API 数据集以及定时同步的数据通过 Kettle 抽取到 Doris 集群中。
下载安装
curl -sSL https://dataease.oss-cn-hangzhou.aliyuncs.com/quick_start.sh | sh
简而言之: 下载这个脚本执行之
它默认部署模式为 simple,如需切换模式 请修改 /opt/dataease/.env 中的 DE_ENGINE_MODE 变量后,重新执行该脚本
最终拉取了五个镜像
| CONTAINER ID | IMAGE | NAMES |
|---|---|---|
| c521c24aedb6 | /dataease/dataease:v1.18.11 | dataease |
| 043b28a73d20 | /dataease/doris:v1.2.4.1-0606 | doris-be |
| 35dfa29d1578 | /dataease/mysql:5.7.43 | mysql |
| cc037825c831 | /dataease/doris:v1.2.4.1-0606 | doris-fe |
| b8fea1e7f85f | /dataease/kettle:v8.3-0318 | kettle |
dataease 绑定的端口: 0.0.0.0:80→8081/tcp, :::80→8081/tcp mysql 绑定的端口: 0.0.0.0:3306→3306/tcp, :::3306→3306/tcp, 33060/tcp
图表数据 获取流程
逻辑是:
- 先保存图表
POST
http://localhost:8081/chart/view/viewEditSave/063f5896-ac4c-11ed-9018-19daa611788c
{
"id": "35b4cff9-d21c-4bba-9f09-bbbb27595a51",
"type": "bar",
"name":"新建视图",
....
"customAttr": {自定义属性},
"customStyle": {样式?},
"senior":{高级?},
"customFilter":[过滤器],
"yaxis": [X轴配置],
"xaxis": [Y轴配置],
"yaxisExt": "[]",
"xaxisExt": "[]"
}- 再获取图表的数据
POST
http://localhost:8081/chart/view/getData/35b4cff9-d21c-4bba-9f09-bbbb27595a51/063f5896-ac4c-11ed-9018-19daa611788c
请求结构
{
"filter": [],
"linkageFilters": [],
"drill": [],
"resultCount": 1000,
"resultMode": "all",
"queryFrom": "panel_edit",
"cache": false
}响应数据结构
{
"success": true,
"message": null,
"data": {
"id": "6a9913ff-6231-4695-896d-001b0950688b",
"name": "基地地块数量",
"title": "基地地块数量",
"sceneId": "aaac1c8e-6743-11ee-a201-cd89cd525b5e",
"tableId": "38acdf9f-bdec-4957-bce8-37b46fa77593",
...
"extBubble": "[]",
"customAttr": "{}",//"自定义配置",
"customStyle": "{}",// "样式"配置?,
"customFilter": "[]",
"drillFields": "[]",//下取维度 配置
"senior": "{\"functionCfg\":{\"sliderShow\":false,\"sliderRange\":[0,10],\"sliderBg\":\"#FFFFFF\",\"sliderFillBg\":\"#BCD6F1\",\"sliderTextClolor\":\"#999999\",\"emptyDataStrategy\":\"ignoreData\",\"emptyDataFieldCtrl\":[]},\"assistLine\":[],\"threshold\":{}}",
"snapshot": null,
"viewFields": "[]",
"data": {
"sourceFields": [
{
"id": "22cb2d39-d74d-4c27-b213-2fd19d0a5c22",
"tableId": "38acdf9f-bdec-4957-bce8-37b46fa77593",
"originName": "f_c0c1567d70077c90",
"dataeaseName": "C_0a9c90b025084d4a36d3a4da188e23eb",
"name": "地块数量",
"type": "VARCHAR",
"checked": true,
"columnIndex": 23,
"lastSyncTime": 1696925167686,
"chartType": "bar",
"compareCalc": {
"type": "none",
"resultData": "percent",
"field": "",
"custom": {
"field": "",
"calcType": "0",
"timeType": "0",
"currentTime": "",
"compareTime": "",
"currentTimeRange": [],
"compareTimeRange": []
}
},
"logic": null,
"filterType": null,
"chartId": null,
"dateFormat": "",
"filter": [],
"customSort": null,
"busiType": null
},
{
"id": "006bec8f-6ef8-4817-8554-8a97fb7e210c",
"tableId": "38acdf9f-bdec-4957-bce8-37b46fa77593",
"originName": "f_7c9f9a1117f7678d",
"dataeaseName": "C_6aa304939d53a47fd02d2c4d8afb1a66",
"name": "人员数量",
"type": "INT",
"extField": 0,
"chartType": "bar",
"compareCalc": {
"type": "none",
"resultData": "percent",
"field": "",
"custom": {
"field": "",
"calcType": "0",
"timeType": "0",
"currentTime": "",
"compareTime": "",
"currentTimeRange": [],
"compareTimeRange": []
}
},
"logic": null,
"filterType": null,
"chartId": null,
"dateFormat": "",
"filter": [],
"customSort": null,
"busiType": null
}
],
"tableRow": [
{
"C_886021df717a21beac4ed40c45a42ce9": "123445",
"C_0a9c90b025084d4a36d3a4da188e23eb": "0",
"C_641585573956b1555f6ad60c7c82fa43": "4028a82b873cbc51018749da50a20011",
"C_6aa304939d53a47fd02d2c4d8afb1a66": 1.00000000
},
{
"C_886021df717a21beac4ed40c45a42ce9": "农装基地",
"C_0a9c90b025084d4a36d3a4da188e23eb": "15",
"C_641585573956b1555f6ad60c7c82fa43": "4028a82b8736a06401873c3ded3d003c",
"C_6aa304939d53a47fd02d2c4d8afb1a66": 15.00000000
}
]
},
"privileges": null,
"isLeaf": null,
"pid": null,
// base64 编码的 sql 语句
"sql": "U0VMRUNUDQogICAgKg0KRlJPTQ0KICAgIChTRUxFQ1QNCiAgICAgICAgdF9hXzAuYGZfZWM2ZWIzMzZiZDk4Y2JhNGAgQVMgZl9heF8wLA0KICAgICAgICB0X2FfMC5gZl8xYWU3YjY4M2ZlZmYyN2E2YCBBUyBmX2F4XzENCiAgICAgICAgLA0KICAgICAgICBjb3VudCh0X2FfMC5gZl9jMGMxNTY3ZDcwMDc3YzkwYCkgQVMgZl9heV8wLA0KICAgICAgICBjb3VudChDQVNUKHRfYV8wLmBmXzdjOWY5YTExMTdmNzY3OGRgIEFTIERFQ0lNQUwoMjAsMCkpKSBBUyBmX2F5XzENCiAgICBGUk9NDQogICAgICAgIChTRUxFQ1QgYG9yZ19sYW5kX2luZm9gLmBpZGAgQVMgZl9lYzZlYjMzNmJkOThjYmE0LGBvcmdfbGFuZF9pbmZvYC5gbmFtZV9gIEFTIGZfMWFlN2I2ODNmZWZmMjdhNixgb3JnX2xhbmRfaW5mb2AuYGNvZGVfYCBBUyBmXzhmNGFmZmQyYTNmMTgyYjUsYG9yZ19sYW5kX2luZm9gLmBhcmVhX2AgQVMgZl9hYTNhMjZhOTdkMGE5MGJmLGBvcmdfbGFuZF9pbmZvYC5gYWRkcmVzc19gIEFTIGZfZTNhMWQzYThlNDVmOTMxMixgb3JnX2xhbmRfaW5mb2AuYGxvbmdpdHVkZV9gIEFTIGZfNzUyY2EyODFmZTgzY2MyZCxgb3JnX2xhbmRfaW5mb2AuYHdkX2AgQVMgZl9hOGFmZThlNTdmNzljN2Y4LGBvcmdfbGFuZF9pbmZvYC5gbGlua01hbl9gIEFTIGZfNWY5MTM4NGI1ZDgxZDI3YSxgb3JnX2xhbmRfaW5mb2AuYHBpY19gIEFTIGZfZmY5YjEzODcxMzUwYzdiOSxgb3JnX2xhbmRfaW5mb2AuYG1hc3NpZl9udW1fYCBBUyBmXzJmOTY4ZDE1NWE0YzZhYTUsYG9yZ19sYW5kX2luZm9gLmBkZXZfbnVtX2AgQVMgZl9jZTVhZGMyNGQ4MDdlMTI4LGBvcmdfbGFuZF9pbmZvYC5gcGVyc29uX251bV9gIEFTIGZfN2M5ZjlhMTExN2Y3Njc4ZCxgb3JnX2xhbmRfaW5mb2AuYGxhbmRfc19gIEFTIGZfYmI4OTgxYjY0NWQ3ZTc4MSxgb3JnX2xhbmRfbWFzc2lmYC5gbmFtZV9gIEFTIGZfMDA5ZTlkMWY0ZmFjYjA5NSxgb3JnX2xhbmRfbWFzc2lmYC5gY29kZV9gIEFTIGZfZjZiZTIwMTJhY2RjZGI0NSxgb3JnX2xhbmRfbWFzc2lmYC5gZmFybV9pbmZvX2NvZGVfYCBBUyBmXzc2YTY1OGFmZTExNGJiZjcsYG9yZ19sYW5kX21hc3NpZmAuYG1hcEdlb21ldHJ5X2AgQVMgZl80MWVjYjQwZTI5NDQ3OWJhLGBvcmdfbGFuZF9tYXNzaWZgLmBmYXJtX2luZm9faWRfYCBBUyBmXzY2MGE4YThhMGRhMGNhMTUsYG9yZ19sYW5kX21hc3NpZmAuYGhlYWRNYW5fbmFtZV9gIEFTIGZfNGViMWQ5MGQ0ZjY4M2Q4Myxgb3JnX2xhbmRfbWFzc2lmYC5gcGljX2AgQVMgZl8yY2I5ZmQxMGQ1ODQ1OGM1LGBvcmdfbGFuZF9tYXNzaWZgLmBpc0VuYWJsZWRfYCBBUyBmXzBkMmI2MzYwYzY5YzZmMTUsYG9yZ19sYW5kX21hc3NpZmAuYG9yZ19mYXJtX2luZm9faWRfYCBBUyBmXzRjMDI2OTc4NWI2ZWE1ZGQsYG9yZ19sYW5kX21hc3NpZmAuYGFkZHJlc3NfYCBBUyBmXzc4YzVjZDRiNjRiODk0ODIsYG9yZ19sYW5kX21hc3NpZmAuYGlkYCBBUyBmX2MwYzE1NjdkNzAwNzdjOTAgRlJPTSBgb3JnX2xhbmRfaW5mb2AgIExFRlQgSk9JTiAgYG9yZ19sYW5kX21hc3NpZmAgT04gYG9yZ19sYW5kX2luZm9gLmBpZGAgPSBgb3JnX2xhbmRfbWFzc2lmYC5gZmFybV9pbmZvX2lkX2ApICAgdF9hXzANCiAgICBHUk9VUCBCWQ0KICAgICAgICB0X2FfMC5gZl9lYzZlYjMzNmJkOThjYmE0YCwNCiAgICAgICAgdF9hXzAuYGZfMWFlN2I2ODNmZWZmMjdhNmANCiAgICApICAgdF9hXzENCk9SREVSIEJZDQogICAgZl9heF8xIGFzYw0KIExJTUlUIDAsMTAwMA==",
"drill": false,
"drillFilters": [],
"position": null,
"totalPage": 0,
"totalItems": 0,
"datasetMode": 0,
"datasourceType": "mysql",
"xaxisExt": "[]",
"yaxis": "[]",//x轴配置
"xaxis": "[]",//y轴配置
"yaxisExt": "[]"
}
}