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 }}) + +
+ - + - + + + + +
+
@@ -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); }