diff --git a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
index 83c73fc1ca..6729d39558 100644
--- a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
+++ b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
@@ -2,17 +2,16 @@ package io.dataease.auth.filter;
import io.dataease.auth.entity.ASKToken;
import io.dataease.auth.entity.JWTToken;
-
import io.dataease.auth.handler.ApiKeyHandler;
-
+import io.dataease.commons.license.DefaultLicenseService;
+import io.dataease.commons.license.F2CLicenseResponse;
+import io.dataease.commons.utils.CommonBeanFactory;
import io.dataease.commons.utils.LogUtil;
import io.dataease.commons.utils.TokenCacheUtils;
-
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
-
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMethod;
@@ -26,6 +25,7 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
public final static String expireMessage = "Login token is expire.";
+ public final static String licMessage = "license invalid";
/**
@@ -49,6 +49,17 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
if (ApiKeyHandler.isApiKeyCall(httpServletRequest)) {
+ DefaultLicenseService licenseService = CommonBeanFactory.getBean(DefaultLicenseService.class);
+ F2CLicenseResponse licenseResponse = null;
+ try {
+ licenseResponse = licenseService.validateLicense();
+ } catch (Exception e) {
+ throw new AuthenticationException(licMessage);
+ }
+ if (licenseResponse.getStatus() != F2CLicenseResponse.Status.valid) {
+ throw new AuthenticationException(licMessage);
+ }
+
ASKToken askToken = ApiKeyHandler.buildToken(httpServletRequest);
getSubject(request, response).login(askToken);
@@ -87,6 +98,8 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
LogUtil.error(e);
if (e instanceof AuthenticationException && StringUtils.equals(e.getMessage(), expireMessage)) {
responseExpire(request, response, e);
+ } else if (StringUtils.equals(licMessage, e.getMessage())) {
+ responseLicError(request, response, e);
} else {
tokenError(request, response, e);
}
@@ -127,4 +140,10 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
httpServletResponse.setHeader("authentication-status", "login_expire");
}
+ private void responseLicError(ServletRequest req, ServletResponse resp, Exception e1) {
+ HttpServletResponse httpServletResponse = (HttpServletResponse) resp;
+ httpServletResponse.addHeader("Access-Control-Expose-Headers", "authentication-status");
+ httpServletResponse.setHeader("authentication-status", licMessage);
+ }
+
}
diff --git a/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.java b/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.java
index a1fdf5af1a..8e62c241e3 100644
--- a/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.java
+++ b/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.java
@@ -17,6 +17,8 @@ public interface ExtPanelGroupMapper {
//会级联删除pid 下的所有数据
int deleteCircle(@Param("pid") String pid, @Param("nodeType") String nodeType);
+ int deleteLinkDefaultCircle(@Param("pid") String pid);
+
int deleteCircleView(@Param("pid") String pid, @Param("nodeType") String nodeType);
int deleteCircleViewCache(@Param("pid") String pid, @Param("nodeType") String nodeType);
diff --git a/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.xml b/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.xml
index 6b3d058df8..6e54ab20fb 100644
--- a/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.xml
+++ b/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.xml
@@ -202,6 +202,10 @@
ORDER BY panel_group.node_type desc, CONVERT(panel_group.name using gbk)
+
+ delete from panel_group where FIND_IN_SET(panel_group.source, GET_PANEL_GROUP_WITH_CHILDREN(#{pid}))
+
+
delete
from panel_group
@@ -211,7 +215,6 @@
panel_group.source = #{pid}
or FIND_IN_SET(panel_group.id, GET_PANEL_GROUP_WITH_CHILDREN(#{pid}))
- or FIND_IN_SET(panel_group.source, GET_PANEL_GROUP_WITH_CHILDREN(#{pid}))
diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java
index bc5239baa8..6077bbe9eb 100644
--- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java
+++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java
@@ -725,7 +725,9 @@ public class ChartViewService {
xAxis = xAxis.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || (!desensitizationList.keySet().contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList());
yAxis = yAxis.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || (!desensitizationList.keySet().contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList());
}
-
+ Map chartFieldMap = Stream.of(xAxisBase, xAxisExt, extStack)
+ .flatMap(Collection::stream)
+ .collect(Collectors.toMap(ChartViewFieldDTO::getId, o -> o, ((p, n) -> p)));
// 过滤来自仪表板的条件
List extFilterList = new ArrayList<>();
//组件过滤条件
@@ -834,6 +836,14 @@ public class ChartViewService {
if (!desensitizationList.keySet().contains(datasetTableField.getDataeaseName()) && dataeaseNames.contains(datasetTableField.getDataeaseName())) {
request.setDatasetTableField(datasetTableField);
if (StringUtils.equalsIgnoreCase(datasetTableField.getTableId(), view.getTableId())) {
+// 设置日期格式,以视图字段设置的格式为准,先不处理组件的条件,因为格式无法统一。
+ if (request.getDatasetTableField() != null) {
+ ChartViewFieldDTO chartViewFieldDTO = chartFieldMap.get(request.getDatasetTableField().getId());
+ if (chartViewFieldDTO != null) {
+ request.setDatePattern(chartViewFieldDTO.getDatePattern());
+ request.setDateStyle(chartViewFieldDTO.getDateStyle());
+ }
+ }
if (CollectionUtils.isNotEmpty(request.getViewIds())) {
if (request.getViewIds().contains(view.getId())) {
extFilterList.add(request);
@@ -883,9 +893,6 @@ public class ChartViewService {
ChartDrillRequest head = drillRequestList.get(0);
Map dimValMap = new HashMap<>();
head.getDimensionList().forEach(item -> dimValMap.put(item.getId(), item.getValue()));
- Map fieldMap = Stream.of(xAxisBase, xAxisExt, extStack)
- .flatMap(Collection::stream)
- .collect(Collectors.toMap(ChartViewFieldDTO::getId, o -> o, ((p, n) -> p)));
for (int i = 0; i < drillRequestList.size(); i++) {
ChartDrillRequest request = drillRequestList.get(i);
ChartViewFieldDTO chartViewFieldDTO = drill.get(i);
@@ -896,7 +903,7 @@ public class ChartViewService {
fieldsToFilter.add(chartViewFieldDTO);
dimValMap.put(requestDimension.getId(), requestDimension.getValue());
if (!checkDrillExist(xAxis, extStack, requestDimension.getId(), view)) {
- fieldMap.put(chartViewFieldDTO.getId(), chartViewFieldDTO);
+ chartFieldMap.put(chartViewFieldDTO.getId(), chartViewFieldDTO);
xAxis.add(chartViewFieldDTO);
}
if (i == drillRequestList.size() - 1) {
@@ -916,8 +923,8 @@ public class ChartViewService {
DatasetTableField datasetTableField = dataSetTableFieldsService.get(tmpField.getId());
tmpFilter.setDatasetTableField(datasetTableField);
tmpFilter.setOperator("in");
- tmpFilter.setDateStyle(fieldMap.get(tmpField.getId()).getDateStyle());
- tmpFilter.setDatePattern(fieldMap.get(tmpField.getId()).getDatePattern());
+ tmpFilter.setDateStyle(chartFieldMap.get(tmpField.getId()).getDateStyle());
+ tmpFilter.setDatePattern(chartFieldMap.get(tmpField.getId()).getDatePattern());
tmpFilter.setFieldId(tmpField.getId());
tmpFilter.setValue(Collections.singletonList(dimValMap.get(tmpField.getId())));
extFilterList.add(tmpFilter);
diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java
index 2a5fa85389..41098d1a72 100644
--- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java
+++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java
@@ -1070,7 +1070,7 @@ public class DataSetTableService {
defaultsSqlVariableDetail.getDefaultValueScope().equals(SqlVariableDetails.DefaultValueScope.ALLSCOPE) && StringUtils.isNotEmpty(defaultsSqlVariableDetail.getDefaultValue())) {
sql = sql.replace(matcher.group(), defaultsSqlVariableDetail.getDefaultValue());
}
- if (isEdit && defaultsSqlVariableDetail != null && StringUtils.isNotEmpty(defaultsSqlVariableDetail.getDefaultValue())){
+ if (isEdit && defaultsSqlVariableDetail != null && StringUtils.isNotEmpty(defaultsSqlVariableDetail.getDefaultValue())) {
sql = sql.replace(matcher.group(), defaultsSqlVariableDetail.getDefaultValue());
}
}
@@ -1170,7 +1170,7 @@ public class DataSetTableService {
if (binaryExpression != null) {
if (!(binaryExpression.getLeftExpression() instanceof BinaryExpression) && !(binaryExpression.getLeftExpression() instanceof InExpression) && hasVariable(binaryExpression.getRightExpression().toString())) {
stringBuilder.append(SubstitutedSql);
- }else {
+ } else {
expr.accept(getExpressionDeParser(stringBuilder));
}
} else {
@@ -1257,7 +1257,7 @@ public class DataSetTableService {
throw new Exception(Translator.get("i18n_invalid_ds"));
}
String tmpSql = removeVariables(sql, ds.getType());
- if(!realData){
+ if (!realData) {
tmpSql.replaceAll(SubstitutedSql, SubstitutedSqlVirtualData);
}
if (dataSetTableRequest.getMode() == 1 && (tmpSql.contains(SubstitutedParams) || tmpSql.contains(SubstitutedSql.trim()))) {
@@ -2021,7 +2021,9 @@ public class DataSetTableService {
// custom 创建doris视图
createDorisView(TableUtils.tableName(datasetTable.getId()), sql);
- datasourceRequest.setQuery(sql);
+ // getQuerySql to get field
+ QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
+ datasourceRequest.setQuery(qp.createSQLPreview(sql, null));
fields = datasourceProvider.fetchResultField(datasourceRequest);
for (DatasetTableField field : fieldList) {
for (TableField tableField : fields) {
@@ -2044,8 +2046,9 @@ public class DataSetTableService {
String sql = (String) sqlMap.get("sql");
List fieldList = (List) sqlMap.get("field");
-
- datasourceRequest.setQuery(sql);
+ // getQuerySql to get field
+ QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
+ datasourceRequest.setQuery(qp.createSQLPreview(sql, null));
fields = datasourceProvider.fetchResultField(datasourceRequest);
for (DatasetTableField field : fieldList) {
diff --git a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java
index 7f22ac1a7a..964155492b 100644
--- a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java
+++ b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java
@@ -305,6 +305,7 @@ public class PanelGroupService {
extPanelGroupMapper.deleteCircleView(id, nodeType);
extPanelGroupMapper.deleteCircleViewCache(id, nodeType);
// 同时会删除对应默认仪表盘
+ extPanelGroupMapper.deleteLinkDefaultCircle(id);
extPanelGroupMapper.deleteCircle(id, nodeType);
storeService.removeByPanelId(id);
shareService.delete(id, null);
diff --git a/frontend/src/views/panel/filter/FilterDialog.vue b/frontend/src/views/panel/filter/FilterDialog.vue
index 916727fae7..5b3f467da7 100644
--- a/frontend/src/views/panel/filter/FilterDialog.vue
+++ b/frontend/src/views/panel/filter/FilterDialog.vue
@@ -447,12 +447,13 @@ export default {
this.currentElement = JSON.parse(JSON.stringify(this.element))
this.myAttrs = this.currentElement.options.attrs
this.treeNode(this.groupForm)
-
+ this.loadViews()
if (this.myAttrs && this.myAttrs.dragItems) {
this.enableSureButton()
}
+
this.initWithField()
- this.loadViews()
+
this.ProhibitMultiple()
},
mounted() {
@@ -462,7 +463,29 @@ export default {
bus.$off('valid-values-change', this.validateFilterValue)
},
methods: {
-
+ checkSuperior(list) {
+ let fieldValid = false
+ const fieldId = this.myAttrs?.fieldId
+ if (fieldId && list?.length) {
+ const stack = [...list]
+ while (stack.length) {
+ const item = stack.pop()
+ if (item.id === fieldId) {
+ fieldValid = true
+ break
+ }
+ if (item.children?.length) {
+ item.children.forEach(kid => stack.push(kid))
+ }
+ }
+ }
+ if (!fieldValid) {
+ this.myAttrs.fieldId = null
+ this.myAttrs.dragItems = []
+ this.myAttrs.fieldsParent = null
+ }
+ return fieldValid
+ },
treeNode(cache) {
const modelInfo = localStorage.getItem('dataset-tree')
const userCache = (modelInfo && cache)
@@ -471,6 +494,7 @@ export default {
const results = this.buildTree(this.tData)
this.defaultData = JSON.parse(JSON.stringify(results))
this.treeData = JSON.parse(JSON.stringify(results))
+ return
}
queryAuthModel({ modelType: 'dataset' }, !userCache).then(res => {
localStorage.setItem('dataset-tree', JSON.stringify(res.data))
@@ -488,8 +512,8 @@ export default {
if (this.myAttrs.fieldsParent) {
this.fieldsParent = this.myAttrs.fieldsParent
this.$nextTick(() => {
- this.activeName === 'dataset' && this.showFieldData(this.fieldsParent)
- this.activeName !== 'dataset' && this.comShowFieldData(this.fieldsParent)
+ this.activeName === 'dataset' && this.showFieldData(this.fieldsParent, true)
+ this.activeName !== 'dataset' && this.comShowFieldData(this.fieldsParent, true)
})
}
}
@@ -692,7 +716,7 @@ export default {
},
removeTail(bread) {
- if (!bread.id) {
+ if (!bread?.id) {
this.dataSetBreads = this.dataSetBreads.slice(0, 1)
this.dataSetBreads[this.dataSetBreads.length - 1]['link'] = false
return
@@ -718,7 +742,7 @@ export default {
this.expandedArray = []
this.keyWord = ''
this.isTreeSearch = false
- if (bread.id) {
+ if (bread?.id) {
const node = this.getNode(bread.id, this.treeData)
if (node) {
this.tempTreeData = node.children
@@ -736,15 +760,17 @@ export default {
this.comRemoveTail()
},
- loadField(tableId) {
- fieldListWithPermission(tableId).then(res => {
- let data = res.data
- if (this.widget && this.widget.filterFieldMethod) {
- data = this.widget.filterFieldMethod(data)
- }
- this.originFieldData = data
- this.fieldData = JSON.parse(JSON.stringify(data))
- })
+ async loadField(tableId, init) {
+ const res = await fieldListWithPermission(tableId)
+ let data = res.data || []
+ if (init && !this.checkSuperior(data)) {
+ this.backToLink()
+ }
+ if (this.widget && this.widget.filterFieldMethod) {
+ data = this.widget.filterFieldMethod(data)
+ }
+ this.originFieldData = data
+ this.fieldData = JSON.parse(JSON.stringify(data))
},
loadDatasetParams(tableId) {
var type = 'TEXT'
@@ -758,22 +784,24 @@ export default {
this.datasetParams = res.data || []
})
},
- comLoadField(tableId) {
- fieldListWithPermission(tableId).then(res => {
- let data = res.data
- if (this.widget && this.widget.filterFieldMethod) {
- data = this.widget.filterFieldMethod(data)
- }
- this.originComFieldData = data
- this.comFieldData = JSON.parse(JSON.stringify(data))
- })
+ async comLoadField(tableId, init) {
+ const res = await fieldListWithPermission(tableId)
+ let data = res.data || []
+ if (init && !this.checkSuperior(data)) {
+ this.comBackLink()
+ }
+ if (this.widget && this.widget.filterFieldMethod) {
+ data = this.widget.filterFieldMethod(data)
+ }
+ this.originComFieldData = data
+ this.comFieldData = JSON.parse(JSON.stringify(data))
},
- showFieldData(row) {
+ showFieldData(row, init) {
this.keyWord = ''
this.showDomType = 'field'
this.addQueue(row)
this.fieldsParent = row
- this.loadField(row.id)
+ this.loadField(row.id, init)
this.loadDatasetParams(row.id)
},
showNextGroup(row) {
@@ -782,13 +810,13 @@ export default {
this.showDomType = 'tree'
this.addQueue(row)
},
- comShowFieldData(row) {
+ comShowFieldData(row, init) {
this.viewKeyWord = ''
this.comShowDomType = 'field'
this.comSetTailLink(row)
this.comAddTail(row)
this.fieldsParent = row
- this.comLoadField(row.tableId)
+ this.comLoadField(row.tableId, init)
},
onMove(e, originalEvent) {
this.showTips = false
diff --git a/frontend/src/views/panel/list/PanelViewShow.vue b/frontend/src/views/panel/list/PanelViewShow.vue
index 5e532e5080..043100070e 100644
--- a/frontend/src/views/panel/list/PanelViewShow.vue
+++ b/frontend/src/views/panel/list/PanelViewShow.vue
@@ -17,7 +17,7 @@
style="border-bottom: 1px solid;border-bottom-color:#E6E6E6;"
>
-
+
- {{ panelInfo.name || '测试仪表板' }}
- ({{ $t('panel.default_panel_name') }}:{{ panelInfo.defaultPanelName }})
- ({{ $t('panel.source_panel_name') }}:{{ panelInfo.sourcePanelName }})
-
+ {{ panelInfo.name || '测试仪表板' }}
+ ({{ $t('panel.default_panel_name') }}:{{ panelInfo.defaultPanelName }})
+ ({{ $t('panel.source_panel_name') }}:{{ panelInfo.sourcePanelName }})
+
+
+
-
+
-
-
-
+
+
+
{{ $t('panel.create_by') + ':' + panelInfo.creatorName }}
-
-
-
-
-
+
+
+
+
+
+
+
@@ -427,6 +436,17 @@ export default {
}
},
computed: {
+ showName(){
+ let name = this.panelInfo.name || '测试仪表板'
+ if(this.panelInfo.isDefault){
+ name = name +'('+ this.$t('panel.default_panel_name') +':'+ this.panelInfo.defaultPanelName +')'
+ }
+
+ if(this.panelInfo.sourcePanelName){
+ name = name +'('+ this.$t('panel.source_panel_name') +':'+ this.panelInfo.sourcePanelName +')'
+ }
+ return name
+ },
mainCanvasComponentData() {
return getNowCanvasComponentData(this.canvasId)
},
@@ -841,6 +861,7 @@ export default {
font-size: 16px;
font-weight: 500;
line-height: 24px;
+ flex: 1;
color: var(--deTextPrimary, #1F2329);
}