From a846a8fe74f1e2e5a2c3bae6aa05a0a352024541 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Tue, 8 Feb 2022 10:55:20 +0800 Subject: [PATCH 01/47] =?UTF-8?q?fix:=20=E6=97=A5=E6=9C=9F=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E9=BB=98=E8=AE=A4=E5=80=BC=E5=85=BC=E5=AE=B9=E8=80=81?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/widget/serviceImpl/TimeDateRangeServiceImpl.js | 2 +- .../src/components/widget/serviceImpl/TimeDateServiceImpl.js | 2 +- .../src/components/widget/serviceImpl/TimeMonthServiceImpl.js | 2 +- .../src/components/widget/serviceImpl/TimeYearServiceImpl.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js b/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js index c078919a9e..d06b70a722 100644 --- a/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js @@ -227,7 +227,7 @@ class TimeDateRangeServiceImpl extends WidgetService { } getParam(element) { let timeArr = [] - if (element.options.attrs.default.isDynamic) { + if (element.options.attrs.default && element.options.attrs.default.isDynamic) { let value = this.dynamicDateFormNow(element) value = this.formatFilterValue(value) timeArr = this.formatValues(value, element) diff --git a/frontend/src/components/widget/serviceImpl/TimeDateServiceImpl.js b/frontend/src/components/widget/serviceImpl/TimeDateServiceImpl.js index 8e5024cc45..6dfba9a4a4 100644 --- a/frontend/src/components/widget/serviceImpl/TimeDateServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TimeDateServiceImpl.js @@ -157,7 +157,7 @@ class TimeDateServiceImpl extends WidgetService { } getParam(element) { let timeArr = [] - if (element.options.attrs.default.isDynamic) { + if (element.options.attrs.default && element.options.attrs.default.isDynamic) { let value = this.dynamicDateFormNow(element) value = this.formatFilterValue(value) timeArr = this.formatValues(value, element) diff --git a/frontend/src/components/widget/serviceImpl/TimeMonthServiceImpl.js b/frontend/src/components/widget/serviceImpl/TimeMonthServiceImpl.js index 7471c381c4..53f8c277f6 100644 --- a/frontend/src/components/widget/serviceImpl/TimeMonthServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TimeMonthServiceImpl.js @@ -123,7 +123,7 @@ class TimeMonthServiceImpl extends WidgetService { } getParam(element) { let timeArr = [] - if (element.options.attrs.default.isDynamic) { + if (element.options.attrs.default && element.options.attrs.default.isDynamic) { let value = this.dynamicDateFormNow(element) value = this.formatFilterValue(value) timeArr = this.formatValues(value, element) diff --git a/frontend/src/components/widget/serviceImpl/TimeYearServiceImpl.js b/frontend/src/components/widget/serviceImpl/TimeYearServiceImpl.js index 2ae0a78234..67ce9ec172 100644 --- a/frontend/src/components/widget/serviceImpl/TimeYearServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TimeYearServiceImpl.js @@ -114,7 +114,7 @@ class TimeYearServiceImpl extends WidgetService { } getParam(element) { let timeArr = [] - if (element.options.attrs.default.isDynamic) { + if (element.options.attrs.default && element.options.attrs.default.isDynamic) { let value = this.dynamicDateFormNow(element) value = this.formatFilterValue(value) timeArr = this.formatValues(value, element) From 81fe530fd9c51dd22f2da79aa0d3a91fadb4cb86 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Tue, 8 Feb 2022 11:36:12 +0800 Subject: [PATCH 02/47] =?UTF-8?q?fix:=20api=E6=9D=83=E9=99=90=E5=8D=95?= =?UTF-8?q?=E7=8B=AC=E5=A4=84=E7=90=86admin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aop/DePermissionAnnotationHandler.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/backend/src/main/java/io/dataease/auth/aop/DePermissionAnnotationHandler.java b/backend/src/main/java/io/dataease/auth/aop/DePermissionAnnotationHandler.java index 5bc267b60d..5654a987b6 100644 --- a/backend/src/main/java/io/dataease/auth/aop/DePermissionAnnotationHandler.java +++ b/backend/src/main/java/io/dataease/auth/aop/DePermissionAnnotationHandler.java @@ -27,7 +27,11 @@ public class DePermissionAnnotationHandler { @Around(value = "@annotation(io.dataease.auth.annotation.DePermissions)") public Object PermissionsAround(ProceedingJoinPoint point) { + try { + if (AuthUtils.getUser().getIsAdmin()) { + return point.proceed(point.getArgs()); + } MethodSignature ms = (MethodSignature) point.getSignature(); Method method = ms.getMethod(); DePermissions annotation = method.getAnnotation(DePermissions.class); @@ -47,13 +51,13 @@ public class DePermissionAnnotationHandler { Boolean someAccess = false; for (int i = 0; i < dePermissions.length; i++) { DePermission permission = dePermissions[i]; - try{ + try { boolean currentAccess = access(args[permission.paramIndex()], permission, 0); if (currentAccess) { someAccess = true; break; } - }catch (Exception e) { + } catch (Exception e) { exceptions.add(e); } } @@ -71,6 +75,9 @@ public class DePermissionAnnotationHandler { @Around(value = "@annotation(io.dataease.auth.annotation.DePermission)") public Object PermissionAround(ProceedingJoinPoint point) { try { + if (AuthUtils.getUser().getIsAdmin()) { + return point.proceed(point.getArgs()); + } MethodSignature ms = (MethodSignature) point.getSignature(); Method method = ms.getMethod(); @@ -88,20 +95,22 @@ public class DePermissionAnnotationHandler { } private Boolean access(Object arg, DePermission annotation, int layer) throws Exception { - if (ObjectUtils.isEmpty(arg)) return true; + if (ObjectUtils.isEmpty(arg)) + return true; String type = annotation.type().name().toLowerCase(); String value = annotation.value(); Integer requireLevel = annotation.level().getLevel(); Set resourceIds = AuthUtils.permissionByType(type).stream().filter( - item -> item.getLevel() >= requireLevel - ).map(AuthItem::getAuthSource).collect(Collectors.toSet()); + item -> item.getLevel() >= requireLevel).map(AuthItem::getAuthSource).collect(Collectors.toSet()); Class parameterType = arg.getClass(); if (parameterType.isPrimitive() || isWrapClass(parameterType) || isString(parameterType)) { boolean permissionValid = resourceIds.contains(arg); - if (permissionValid) return true; - throw new UnauthorizedException("Subject does not have permission[" + annotation.level().name() +":"+ annotation.type() + ":" + arg + "]"); + if (permissionValid) + return true; + throw new UnauthorizedException("Subject does not have permission[" + annotation.level().name() + ":" + + annotation.type() + ":" + arg + "]"); } else if (isArray(parameterType)) { for (int i = 0; i < Array.getLength(arg); i++) { Object o = Array.get(arg, i); @@ -124,7 +133,7 @@ public class DePermissionAnnotationHandler { Object o = argMap.get(values[layer]); return access(o, annotation, ++layer); } else { - //当作自定义类处理 + // 当作自定义类处理 String[] values = value.split("u002E"); String fieldName = values[layer]; @@ -135,7 +144,7 @@ public class DePermissionAnnotationHandler { return true; } - private Object getFieldValue(Object o, String fieldName) throws Exception{ + private Object getFieldValue(Object o, String fieldName) throws Exception { Class aClass = o.getClass(); while (null != aClass.getSuperclass()) { Field[] declaredFields = aClass.getDeclaredFields(); @@ -183,5 +192,4 @@ public class DePermissionAnnotationHandler { return Arrays.stream(wrapClasies).anyMatch(item -> StringUtils.equals(item, clz.getName())); } - } From 95641feef743ebb2411de83faf5e555fbb850b01 Mon Sep 17 00:00:00 2001 From: junjie Date: Tue, 8 Feb 2022 13:50:43 +0800 Subject: [PATCH 03/47] feat: S2 pivot --- .../base/domain/ChartViewWithBLOBs.java | 2 + .../dataease/base/mapper/ChartViewMapper.xml | 37 ++- .../service/chart/ChartViewService.java | 5 + .../main/resources/db/migration/V32__1.8.sql | 2 + .../src/main/resources/generatorConfig.xml | 2 +- frontend/src/icons/svg/table-normal.svg | 2 +- frontend/src/icons/svg/table-pivot.svg | 1 + frontend/src/lang/en.js | 4 +- frontend/src/lang/tw.js | 4 +- frontend/src/lang/zh.js | 4 +- .../views/chart/chart/common/common_table.js | 44 ++++ .../src/views/chart/chart/table/table-info.js | 114 +++++++- .../chart/components/ChartComponentS2.vue | 8 +- .../components/drag-item/DimensionExtItem.vue | 248 ++++++++++++++++++ .../components/drag-item/DimensionItem.vue | 1 + .../shape-attr/SizeSelectorAntV.vue | 2 +- frontend/src/views/chart/group/Group.vue | 1 + frontend/src/views/chart/view/ChartEdit.vue | 95 ++++++- frontend/src/views/chart/view/ChartType.vue | 11 +- 19 files changed, 561 insertions(+), 26 deletions(-) create mode 100644 backend/src/main/resources/db/migration/V32__1.8.sql create mode 100644 frontend/src/icons/svg/table-pivot.svg create mode 100644 frontend/src/views/chart/components/drag-item/DimensionExtItem.vue diff --git a/backend/src/main/java/io/dataease/base/domain/ChartViewWithBLOBs.java b/backend/src/main/java/io/dataease/base/domain/ChartViewWithBLOBs.java index 61779e0cdd..6fdd140eac 100644 --- a/backend/src/main/java/io/dataease/base/domain/ChartViewWithBLOBs.java +++ b/backend/src/main/java/io/dataease/base/domain/ChartViewWithBLOBs.java @@ -13,6 +13,8 @@ import lombok.ToString; public class ChartViewWithBLOBs extends ChartView implements Serializable { @ApiModelProperty("x轴") private String xAxis; + @ApiModelProperty("x轴(Row)") + private String xAxisExt; @ApiModelProperty("y轴") private String yAxis; @ApiModelProperty("副y轴") diff --git a/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml index 1bdedbf438..5cd892b888 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml @@ -18,6 +18,7 @@ + @@ -91,8 +92,8 @@ create_by, create_time, update_time, style_priority - x_axis, y_axis, y_axis_ext, ext_stack, ext_bubble, custom_attr, custom_style, custom_filter, - drill_fields, snapshot + x_axis, x_axis_ext, y_axis, y_axis_ext, ext_stack, ext_bubble, custom_attr, custom_style, + custom_filter, drill_fields, snapshot