diff --git a/README.md b/README.md
index 4352dd9327..ccdc83186e 100644
--- a/README.md
+++ b/README.md
@@ -6,24 +6,25 @@
+
+|说明|
+|------------------|
+|此分支为 DataEase v2 版本的开发分支。DataEase v2 正在快速迭代中,如是在生产环境部署 DataEase,建议使用 v1.18.* 的最新稳定版本。|
## 什么是 DataEase?
DataEase 是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化。DataEase 支持丰富的数据源连接,能够通过拖拉拽方式快速制作图表,并可以方便的与他人分享。
-**DataEase 的功能包括:**
+**DataEase 的工作原理:**
-- 图表展示:支持 PC 端、移动端、大屏及嵌入式使用场景;
-- 图表制作:支持丰富的图表类型、支持拖拉拽方式快速制作仪表板;
-- 数据引擎:基于 Apache Calcite,实现统一的 SQL 解析、验证、优化和执行;
-- 数据连接:支持数据仓库/数据湖、OLAP 数据库、OLTP 数据库、Excel 数据文件、API 等各种数据源。
+
**DataEase 的优势:**
-- 开源开放:零门槛,线上快速获取和安装;快速获取用户反馈、按月发布新版本;
+- 开源开放:零门槛,线上快速获取和安装,按月迭代;
- 简单易用:极易上手,通过鼠标点击和拖拽即可完成分析;
-- 全场景支持:多平台支持、多种嵌入式方案支持;
+- 全场景支持:多平台安装和多样化嵌入支持;
- 安全分享:支持多种数据分享方式,确保数据安全。
**DataEase 支持的数据源:**
@@ -39,30 +40,11 @@ DataEase 是开源的数据可视化分析工具,帮助用户快速分析数
-
-## 快速开始
-
-**一键安装**
-
-仅需两步快速安装 DataEase:
-
-1. 准备一台不小于 8 G内存的 64位 Linux 主机;
-2. 以 root 用户执行如下命令一键安装 DataEase。
-
-```sh
-curl -sSL https://dataease.oss-cn-hangzhou.aliyuncs.com/quick_start.sh | bash
-```
-
-**学习资料**
-
-- [在线文档](https://dataease.io/docs/)
-- [社区论坛](https://bbs.fit2cloud.com/c/de/6)
-
-## DataEase 的技术栈
+**DataEase 的技术栈:**
- 前端:[Vue.js](https://vuejs.org/)、[Element](https://element.eleme.cn/)
- 图库:[AntV](https://antv.vision/zh)
@@ -71,13 +53,12 @@ curl -sSL https://dataease.oss-cn-hangzhou.aliyuncs.com/quick_start.sh | bash
- 数据处理:[Apache Calcite](https://github.com/apache/calcite/)
- 基础设施:[Docker](https://www.docker.com/)
-## Star History
+## DataEase 快速入门
-[](https://star-history.com/#dataease/dataease&Date)
-
-## FOSSA Status
-
-[](https://app.fossa.com/projects/git%2Bgithub.com%2Fdataease%2Fdataease?ref=badge_large)
+- 安装部署教程
+- 快速入门视频
+- 完整在线文档
+- 中文论坛支持
## License
diff --git a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java
index 7aae62ade0..d74064398a 100644
--- a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java
+++ b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java
@@ -821,9 +821,11 @@ public class ChartDataManage {
return list;
}
- String assistLine = (String) JsonUtil.toJSONString(senior.get("assistLine"));
- List assistLines = JsonUtil.parseList(assistLine, new TypeReference<>() {
- });
+ var assistLineCfg = JsonUtil.parseObject((String) JsonUtil.toJSONString(senior.get("assistLineCfg")), ChartSeniorAssistCfgDTO.class);
+ if (null == assistLineCfg || !assistLineCfg.isEnable()) {
+ return list;
+ }
+ List assistLines = assistLineCfg.getAssistLine();
if (ObjectUtils.isEmpty(assistLines)) {
return list;
diff --git a/core/core-frontend/src/models/chart/chart-senior.d.ts b/core/core-frontend/src/models/chart/chart-senior.d.ts
index dc16c49047..610b5f2467 100644
--- a/core/core-frontend/src/models/chart/chart-senior.d.ts
+++ b/core/core-frontend/src/models/chart/chart-senior.d.ts
@@ -9,7 +9,7 @@ declare interface ChartSenior {
/**
* 辅助线
*/
- assistLine: AssistLine[]
+ assistLineCfg: ChartAssistLineCfg
/**
* 阈值
*/
@@ -61,6 +61,19 @@ declare interface ChartFunctionCfg {
/**
* 辅助线设置
*/
+declare interface ChartAssistLineCfg {
+ /**
+ * 是否启用
+ */
+ enable: boolean
+ /**
+ * 辅助线配置
+ */
+ assistLine: AssistLine[]
+}
+/**
+ * 辅助线
+ */
declare interface AssistLine {
/**
* 辅助线名称
@@ -100,6 +113,10 @@ declare interface AssistLine {
* 阈值设置
*/
declare interface ChartThreshold {
+ /**
+ * 是否启用
+ */
+ enable: boolean
/**
* 仪表盘阈值: x,y,z
*/
diff --git a/core/core-frontend/src/views/chart/components/editor/editor-senior/Senior.vue b/core/core-frontend/src/views/chart/components/editor/editor-senior/Senior.vue
index 5dc2aaf5b5..eac2f1b597 100644
--- a/core/core-frontend/src/views/chart/components/editor/editor-senior/Senior.vue
+++ b/core/core-frontend/src/views/chart/components/editor/editor-senior/Senior.vue
@@ -5,7 +5,7 @@ import ScrollCfg from '@/views/chart/components/editor/editor-senior/components/
import AssistLine from '@/views/chart/components/editor/editor-senior/components/AssistLine.vue'
import Threshold from '@/views/chart/components/editor/editor-senior/components/Threshold.vue'
import CollapseSwitchItem from '@/components/collapse-switch-item/src/CollapseSwitchItem.vue'
-import { computed, PropType, ref, toRefs } from 'vue'
+import { computed, PropType, ref, toRefs, watch } from 'vue'
import LinkJumpSet from '@/components/visualization/LinkJumpSet.vue'
import LinkageSet from '@/components/visualization/LinkageSet.vue'
import { canvasSave } from '@/utils/canvasUtils'
@@ -15,6 +15,8 @@ import { updateLinkageActive } from '@/api/visualization/linkage'
import { includesAny } from '../util/StringUtils'
import { ElIcon, ElMessage } from 'element-plus-secondary'
import { storeToRefs } from 'pinia'
+import { BASE_VIEW_CONFIG } from '../util/chart'
+import { cloneDeep, defaultsDeep } from 'lodash-es'
const dvMainStore = dvMainStoreWithOut()
const { dvInfo } = storeToRefs(dvMainStore)
@@ -70,7 +72,12 @@ const props = defineProps({
})
const { chart, themes, properties, propertyInnerAll } = toRefs(props)
-
+watch(
+ () => chart.value?.senior,
+ () => {
+ chart.value.senior = defaultsDeep(chart.value?.senior || {}, cloneDeep(BASE_VIEW_CONFIG.senior))
+ }
+)
const seniorCounts = computed(() => {
let linkageCount = 0
let jumpCount = 0
@@ -187,11 +194,14 @@ const linkageActiveChange = () => {
/>
- onAssistLineChange({ data: val })"
>
{
:property-inner="propertyInnerAll['assist-line']"
@onAssistLineChange="onAssistLineChange"
/>
-
+
{
/>
-
{
:property-inner="propertyInnerAll['threshold']"
@onThresholdChange="onThresholdChange"
/>
-
+
,
required: true
},
quotaData: {
@@ -32,28 +33,26 @@ const quotaFields = computed>(() => {
})
const state = reactive({
- assistLine: [],
+ assistLineCfg: {
+ enable: false,
+ assistLine: []
+ },
editLineDialog: false,
lineArr: [],
quotaFields: []
})
watch(
- () => props.chart,
+ () => props.chart.senior.assistLineCfg,
() => {
init()
- }
+ },
+ { deep: true }
)
const changeAssistLine = () => {
- let flag = false
- const arr = state.assistLine.filter(ele => {
- return ele.field === '1'
- })
- if (arr && arr.length > 0) {
- flag = true
- }
- emit('onAssistLineChange', { data: state.assistLine, requestData: flag })
+ const flag = state.assistLineCfg.assistLine.findIndex(ele => ele.field === '1') !== -1
+ emit('onAssistLineChange', { data: state.assistLineCfg, requestData: flag })
}
const lineChange = val => {
@@ -68,7 +67,6 @@ const closeEditLine = () => {
}
const changeLine = () => {
- console.log(state.lineArr)
// check line config
for (let i = 0; i < state.lineArr.length; i++) {
const ele = state.lineArr[i]
@@ -96,35 +94,29 @@ const changeLine = () => {
}
}
}
- state.assistLine = JSON.parse(JSON.stringify(state.lineArr))
+ state.assistLineCfg.assistLine = JSON.parse(JSON.stringify(state.lineArr))
changeAssistLine()
closeEditLine()
}
function existField(line) {
- return !!_.find(quotaFields.value, d => d.id === line.id)
+ return !!find(quotaFields.value, d => d.id === line.id)
}
const init = () => {
const chart = JSON.parse(JSON.stringify(props.chart))
if (chart.senior) {
- let senior = null
- if (Object.prototype.toString.call(chart.senior) === '[object Object]') {
- senior = JSON.parse(JSON.stringify(chart.senior))
- } else {
- senior = JSON.parse(chart.senior)
- }
- if (senior.assistLine) {
- for (let i = 0; i < senior.assistLine.length; i++) {
- if (!senior.assistLine[i].fontSize) {
- senior.assistLine[i].fontSize = '10'
+ const senior = chart.senior
+ if (senior.assistLineCfg?.assistLine) {
+ const assistLine = senior.assistLineCfg.assistLine
+ for (let i = 0; i < assistLine.length; i++) {
+ if (!assistLine[i].fontSize) {
+ assistLine[i].fontSize = 10
}
}
- state.assistLine = senior.assistLine
- } else {
- state.assistLine = []
+ state.assistLineCfg = defaultsDeep(senior.assistLineCfg, DEFAULT_ASSIST_LINE_CFG)
}
- state.lineArr = JSON.parse(JSON.stringify(state.assistLine))
+ state.lineArr = JSON.parse(JSON.stringify(state.assistLineCfg.assistLine))
}
}
@@ -141,16 +133,17 @@ onMounted(() => {
已设置
@@ -162,7 +155,7 @@ onMounted(() => {
-
+
{{ item.name }}
@@ -199,7 +192,7 @@ onMounted(() => {
class="dialog-css"
>
diff --git a/core/core-frontend/src/views/chart/components/editor/editor-senior/components/Threshold.vue b/core/core-frontend/src/views/chart/components/editor/editor-senior/components/Threshold.vue
index 71e6b8da0c..70e6c3ce5f 100644
--- a/core/core-frontend/src/views/chart/components/editor/editor-senior/components/Threshold.vue
+++ b/core/core-frontend/src/views/chart/components/editor/editor-senior/components/Threshold.vue
@@ -7,12 +7,13 @@ import TableThresholdEdit from '@/views/chart/components/editor/editor-senior/co
import TextLabelThresholdEdit from '@/views/chart/components/editor/editor-senior/components/dialog/TextLabelThresholdEdit.vue'
import TextThresholdEdit from '@/views/chart/components/editor/editor-senior/components/dialog/TextThresholdEdit.vue'
import { fieldType } from '@/utils/attr'
+import { defaultsDeep } from 'lodash-es'
const { t } = useI18n()
const props = defineProps({
chart: {
- type: Object,
+ type: Object as PropType,
required: true
},
themes: {
@@ -28,14 +29,15 @@ const showProperty = prop => props.propertyInner?.includes(prop)
const emit = defineEmits(['onThresholdChange'])
watch(
- () => props.chart,
+ () => props.chart.senior.threshold,
() => {
init()
- }
+ },
+ { deep: true }
)
const state = reactive({
- thresholdForm: JSON.parse(JSON.stringify(DEFAULT_THRESHOLD)),
+ thresholdForm: {} as ChartThreshold,
editTextLabelThresholdDialog: false,
textThresholdArr: [],
editLabelThresholdDialog: false,
@@ -47,14 +49,9 @@ const state = reactive({
const init = () => {
const chart = JSON.parse(JSON.stringify(props.chart))
if (chart.senior) {
- let senior = null
- if (Object.prototype.toString.call(chart.senior) === '[object Object]') {
- senior = JSON.parse(JSON.stringify(chart.senior))
- } else {
- senior = JSON.parse(chart.senior)
- }
+ const senior = chart.senior
if (senior.threshold) {
- state.thresholdForm = senior.threshold
+ state.thresholdForm = defaultsDeep(senior.threshold, DEFAULT_THRESHOLD)
}
state.textThresholdArr = JSON.parse(JSON.stringify(state.thresholdForm.textLabelThreshold))
state.thresholdArr = JSON.parse(JSON.stringify(state.thresholdForm.labelThreshold))
@@ -243,9 +240,10 @@ init()
0,
diff --git a/core/core-frontend/src/views/chart/components/editor/editor-senior/components/dialog/TableThresholdEdit.vue b/core/core-frontend/src/views/chart/components/editor/editor-senior/components/dialog/TableThresholdEdit.vue
index 92e6ef8b4b..6826c757c2 100644
--- a/core/core-frontend/src/views/chart/components/editor/editor-senior/components/dialog/TableThresholdEdit.vue
+++ b/core/core-frontend/src/views/chart/components/editor/editor-senior/components/dialog/TableThresholdEdit.vue
@@ -562,7 +562,7 @@ span {
.series-select-option {
display: flex;
align-items: center;
- justify-content: start;
+ justify-content: flex-start;
padding: 0 11px;
}
diff --git a/core/core-frontend/src/views/chart/components/editor/editor-style/components/LabelSelector.vue b/core/core-frontend/src/views/chart/components/editor/editor-style/components/LabelSelector.vue
index fcc5b5a5f8..8406c6e0cc 100644
--- a/core/core-frontend/src/views/chart/components/editor/editor-style/components/LabelSelector.vue
+++ b/core/core-frontend/src/views/chart/components/editor/editor-style/components/LabelSelector.vue
@@ -814,7 +814,7 @@ onMounted(() => {
.series-select-option {
display: flex;
align-items: center;
- justify-content: start;
+ justify-content: flex-start;
padding: 0 11px;
}
.m-divider {
diff --git a/core/core-frontend/src/views/chart/components/editor/editor-style/components/MiscSelector.vue b/core/core-frontend/src/views/chart/components/editor/editor-style/components/MiscSelector.vue
index b8e56891ec..f06bd01af6 100644
--- a/core/core-frontend/src/views/chart/components/editor/editor-style/components/MiscSelector.vue
+++ b/core/core-frontend/src/views/chart/components/editor/editor-style/components/MiscSelector.vue
@@ -863,12 +863,12 @@ onMounted(() => {
.series-select-option {
display: flex;
align-items: center;
- justify-content: start;
+ justify-content: flex-start;
padding: 0 11px;
}
.invalid-field {
- ::v-deep(.ed-input__wrapper) {
+ :deep(.ed-input__wrapper) {
box-shadow: 0 0 0 1px rgb(245, 74, 69) inset !important;
}
}
diff --git a/core/core-frontend/src/views/chart/components/editor/index.vue b/core/core-frontend/src/views/chart/components/editor/index.vue
index d4e6d92910..71bc3bacd8 100644
--- a/core/core-frontend/src/views/chart/components/editor/index.vue
+++ b/core/core-frontend/src/views/chart/components/editor/index.vue
@@ -666,7 +666,7 @@ const onBackgroundChange = val => {
}
const onAssistLineChange = val => {
- view.value.senior.assistLine = val.data
+ view.value.senior.assistLineCfg = val.data
if (val.requestData) {
calcData(view.value)
} else {
diff --git a/core/core-frontend/src/views/chart/components/editor/util/chart.ts b/core/core-frontend/src/views/chart/components/editor/util/chart.ts
index 1b7c06e9b4..75b406991e 100644
--- a/core/core-frontend/src/views/chart/components/editor/util/chart.ts
+++ b/core/core-frontend/src/views/chart/components/editor/util/chart.ts
@@ -604,7 +604,12 @@ export const DEFAULT_FUNCTION_CFG: ChartFunctionCfg = {
emptyDataStrategy: 'breakLine',
emptyDataFieldCtrl: []
}
+export const DEFAULT_ASSIST_LINE_CFG: ChartAssistLineCfg = {
+ enable: false,
+ assistLine: []
+}
export const DEFAULT_THRESHOLD: ChartThreshold = {
+ enable: false,
gaugeThreshold: '',
labelThreshold: [],
tableThreshold: [],
@@ -1268,7 +1273,7 @@ export const BASE_VIEW_CONFIG = {
},
senior: {
functionCfg: DEFAULT_FUNCTION_CFG,
- assistLine: [],
+ assistLineCfg: DEFAULT_ASSIST_LINE_CFG,
threshold: DEFAULT_THRESHOLD,
scrollCfg: DEFAULT_SCROLL
}
diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/others/gauge.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/others/gauge.ts
index d3c4f47af3..144ef73ff4 100644
--- a/core/core-frontend/src/views/chart/components/js/panel/charts/others/gauge.ts
+++ b/core/core-frontend/src/views/chart/components/js/panel/charts/others/gauge.ts
@@ -143,7 +143,7 @@ export class Gauge extends G2PlotChartView {
if (chart.senior) {
const senior = parseJson(chart.senior)
const threshold = senior.threshold ?? DEFAULT_THRESHOLD
- if (threshold.gaugeThreshold) {
+ if (threshold.enable && threshold.gaugeThreshold) {
hasThreshold = true
const arr = threshold.gaugeThreshold.split(',')
for (let i = 0; i < arr.length; i++) {
diff --git a/core/core-frontend/src/views/chart/components/js/panel/common/common_antv.ts b/core/core-frontend/src/views/chart/components/js/panel/common/common_antv.ts
index bf4039b52c..09f8da1e6f 100644
--- a/core/core-frontend/src/views/chart/components/js/panel/common/common_antv.ts
+++ b/core/core-frontend/src/views/chart/components/js/panel/common/common_antv.ts
@@ -534,7 +534,11 @@ export function getSlider(chart: Chart) {
export function getAnalyse(chart: Chart) {
const assistLine = []
const senior = parseJson(chart.senior)
- if (senior.assistLine?.length > 0) {
+ if (!senior.assistLineCfg?.enable) {
+ return assistLine
+ }
+ const assistLineArr = senior.assistLineCfg.assistLine
+ if (assistLineArr?.length > 0) {
const customStyle = parseJson(chart.customStyle)
let yAxisPosition, axisFormatterCfg
if (customStyle.yAxis) {
@@ -545,8 +549,8 @@ export function getAnalyse(chart: Chart) {
: DEFAULT_YAXIS_STYLE.axisLabelFormatter
}
- const fixedLines = senior.assistLine.filter(ele => ele.field === '0')
- const dynamicLineFields = senior.assistLine
+ const fixedLines = assistLineArr.filter(ele => ele.field === '0')
+ const dynamicLineFields = assistLineArr
.filter(ele => ele.field === '1')
.map(item => item.fieldId)
const quotaFields = _.filter(chart.yAxis, ele => ele.summary !== '' && ele.id !== '-1')
@@ -589,7 +593,11 @@ export function getAnalyse(chart: Chart) {
export function getAnalyseHorizontal(chart: Chart) {
const assistLine = []
const senior = parseJson(chart.senior)
- if (senior.assistLine?.length > 0) {
+ if (!senior.assistLineCfg?.enable) {
+ return assistLine
+ }
+ const assistLineArr = senior.assistLineCfg.assistLine
+ if (assistLineArr?.length > 0) {
const customStyle = parseJson(chart.customStyle)
let xAxisPosition, axisFormatterCfg
if (customStyle.xAxis) {
@@ -600,8 +608,8 @@ export function getAnalyseHorizontal(chart: Chart) {
: DEFAULT_XAXIS_STYLE.axisLabelFormatter
}
- const fixedLines = senior.assistLine.filter(ele => ele.field === '0')
- const dynamicLineFields = senior.assistLine
+ const fixedLines = assistLineArr.filter(ele => ele.field === '0')
+ const dynamicLineFields = assistLineArr
.filter(ele => ele.field === '1')
.map(item => item.fieldId)
const quotaFields = _.filter(chart.yAxis, ele => ele.summary !== '' && ele.id !== '-1')
diff --git a/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts b/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts
index ea409401ec..91e4785276 100644
--- a/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts
+++ b/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts
@@ -329,11 +329,15 @@ export function getCurrentField(valueFieldList: Axis[], field: ChartViewField) {
}
export function getConditions(chart: Chart) {
+ const { threshold } = parseJson(chart.senior)
+ if (!threshold.enable) {
+ return
+ }
const res = {
text: [],
background: []
}
- const conditions = parseJson(chart.senior).threshold.tableThreshold ?? []
+ const conditions = threshold.tableThreshold ?? []
if (conditions?.length > 0) {
const { tableCell, basicStyle } = parseJson(chart.customAttr)
diff --git a/core/core-frontend/src/views/chart/components/views/components/ChartComponentG2Plot.vue b/core/core-frontend/src/views/chart/components/views/components/ChartComponentG2Plot.vue
index dba0aa5748..62d83a8883 100644
--- a/core/core-frontend/src/views/chart/components/views/components/ChartComponentG2Plot.vue
+++ b/core/core-frontend/src/views/chart/components/views/components/ChartComponentG2Plot.vue
@@ -290,7 +290,7 @@ onBeforeUnmount(() => {
.canvas-content {
width: 100% !important;
height: 100% !important;
- ::v-deep(.g2-tooltip) {
+ :deep(.g2-tooltip) {
position: fixed !important;
}
}
diff --git a/core/core-frontend/src/views/dashboard/index.vue b/core/core-frontend/src/views/dashboard/index.vue
index 50df9dd562..7f3d8de1f2 100644
--- a/core/core-frontend/src/views/dashboard/index.vue
+++ b/core/core-frontend/src/views/dashboard/index.vue
@@ -18,8 +18,10 @@ import { useCache } from '@/hooks/web/useCache'
const { wsCache } = useCache()
const eventCheck = e => {
if (e.key === 'panel-weight' && !compareStorage(e.oldValue, e.newValue)) {
- const { resourceId } = window.DataEaseBi || router.currentRoute.value.query
- check(wsCache.get('panel-weight'), resourceId)
+ const { resourceId, opt } = window.DataEaseBi || router.currentRoute.value.query
+ if (!(opt && opt === 'create')) {
+ check(wsCache.get('panel-weight'), resourceId)
+ }
}
}
const dvMainStore = dvMainStoreWithOut()
diff --git a/core/core-frontend/src/views/data-visualization/index.vue b/core/core-frontend/src/views/data-visualization/index.vue
index 29eca43066..92c1a4eb0c 100644
--- a/core/core-frontend/src/views/data-visualization/index.vue
+++ b/core/core-frontend/src/views/data-visualization/index.vue
@@ -28,8 +28,10 @@ import { useCache } from '@/hooks/web/useCache'
const { wsCache } = useCache()
const eventCheck = e => {
if (e.key === 'screen-weight' && !compareStorage(e.oldValue, e.newValue)) {
- const { dvId } = window.DataEaseBi || router.currentRoute.value.query
- check(wsCache.get('screen-weight'), dvId)
+ const { dvId, opt } = window.DataEaseBi || router.currentRoute.value.query
+ if (!(opt && opt === 'create')) {
+ check(wsCache.get('screen-weight'), dvId)
+ }
}
}
const mainCanvasCoreRef = ref(null)
diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/chart/dto/ChartSeniorAssistCfgDTO.java b/sdk/api/api-base/src/main/java/io/dataease/api/chart/dto/ChartSeniorAssistCfgDTO.java
new file mode 100644
index 0000000000..d51c175e10
--- /dev/null
+++ b/sdk/api/api-base/src/main/java/io/dataease/api/chart/dto/ChartSeniorAssistCfgDTO.java
@@ -0,0 +1,11 @@
+package io.dataease.api.chart.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ChartSeniorAssistCfgDTO {
+ private boolean enable;
+ private List assistLine;
+}