diff --git a/core/core-frontend/src/locales/zh-CN.ts b/core/core-frontend/src/locales/zh-CN.ts
index 59206f94ac..b13585bfd0 100644
--- a/core/core-frontend/src/locales/zh-CN.ts
+++ b/core/core-frontend/src/locales/zh-CN.ts
@@ -4200,7 +4200,11 @@ export default {
retrying_rate: '重试间隔(分钟)',
please_input_positive_int: '请输入 {0} 正整数',
rate: '发送频率',
- ext_wait_time: '额外等待时间(秒)'
+ ext_wait_time: '额外等待时间(秒)',
+ data_permission: '数据权限',
+ creator_permission: '创建人权限',
+ reci_permission: '接收人权限',
+ data_permission_tips: '接收人若为系统内用户,则遵循设置的数据权限规则;否则使用创建人的权限'
},
filter: {
title: '设置查询组件默认值',
diff --git a/pom.xml b/pom.xml
index 396565a277..e16862d36d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,6 +47,7 @@
33.0.0-jre
3.8.0
4.19.1
+ 1.55.0
2.0.3
8.2.0
8.0.4
diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/report/dto/ReportCreator.java b/sdk/api/api-base/src/main/java/io/dataease/api/report/dto/ReportCreator.java
index 1fb9f097a4..a5dc14cb04 100644
--- a/sdk/api/api-base/src/main/java/io/dataease/api/report/dto/ReportCreator.java
+++ b/sdk/api/api-base/src/main/java/io/dataease/api/report/dto/ReportCreator.java
@@ -65,6 +65,8 @@ public class ReportCreator implements Serializable {
private List reportFilter;
+ private Integer dataPermission = 0;
+
@JsonIgnore
private Long logTaskId;
}
diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/report/vo/ReportInfoVO.java b/sdk/api/api-base/src/main/java/io/dataease/api/report/vo/ReportInfoVO.java
index 4c9f1596ea..02c108ef71 100644
--- a/sdk/api/api-base/src/main/java/io/dataease/api/report/vo/ReportInfoVO.java
+++ b/sdk/api/api-base/src/main/java/io/dataease/api/report/vo/ReportInfoVO.java
@@ -64,4 +64,6 @@ public class ReportInfoVO implements Serializable {
private Integer retryLimit;
private Integer retryInterval;
+
+ private Integer dataPermission = 0;
}
diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/api/AuthApi.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/api/AuthApi.java
index 45a65a0d64..1a2b0dc810 100644
--- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/api/AuthApi.java
+++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/api/AuthApi.java
@@ -5,7 +5,9 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.dataease.api.permissions.auth.dto.*;
import io.dataease.api.permissions.auth.vo.PermissionVO;
+import io.dataease.api.permissions.auth.vo.ResourceItemVO;
import io.dataease.api.permissions.auth.vo.ResourceVO;
+import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -72,4 +74,8 @@ public interface AuthApi {
void saveMenuTargetPer(@RequestBody MenuTargetPerCreator creator);
+ @Hidden
+ @PostMapping("/busiTargetPermissionAll")
+ List busiTargetPermissionAll(@RequestBody BusiPermissionRequest request);
+
}
diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/vo/ResourceItemVO.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/vo/ResourceItemVO.java
new file mode 100644
index 0000000000..f24c07e1ce
--- /dev/null
+++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/vo/ResourceItemVO.java
@@ -0,0 +1,14 @@
+package io.dataease.api.permissions.auth.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class ResourceItemVO extends ResourceNodeVO {
+ private String account;
+}
diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/vo/ResourceNodeVO.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/vo/ResourceNodeVO.java
index 7920b38be4..03a8c63c98 100644
--- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/vo/ResourceNodeVO.java
+++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/vo/ResourceNodeVO.java
@@ -1,12 +1,19 @@
package io.dataease.api.permissions.auth.vo;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
+@NoArgsConstructor
+@AllArgsConstructor
@Data
public class ResourceNodeVO implements Serializable {
+ @JsonSerialize(using= ToStringSerializer.class)
private Long id;
private String name;
diff --git a/sdk/common/src/main/java/io/dataease/utils/HttpClientUtil.java b/sdk/common/src/main/java/io/dataease/utils/HttpClientUtil.java
index 93a4af5069..00bf0480ce 100755
--- a/sdk/common/src/main/java/io/dataease/utils/HttpClientUtil.java
+++ b/sdk/common/src/main/java/io/dataease/utils/HttpClientUtil.java
@@ -1,11 +1,13 @@
package io.dataease.utils;
import io.dataease.exception.DEException;
+import lombok.Data;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.EntityBuilder;
import org.apache.http.client.entity.UrlEncodedFormEntity;
@@ -38,6 +40,8 @@ import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.cert.X509Certificate;
import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static io.dataease.result.ResultCode.SYSTEM_INNER_ERROR;
@@ -666,4 +670,113 @@ public class HttpClientUtil {
}
}
}
+
+ public static MultipartResponse postForScreenshot(
+ String url, Map body, HttpClientConfig config) throws IOException {
+ CloseableHttpClient httpClient = null;
+ try {
+ httpClient = buildHttpClient(url);
+ HttpPost httpPost = new HttpPost(url);
+ if (config == null) {
+ config = new HttpClientConfig();
+ }
+ httpPost.setConfig(config.buildRequestConfig());
+ Map header = config.getHeader();
+ for (String key : header.keySet()) {
+ httpPost.addHeader(key, header.get(key));
+ }
+ EntityBuilder entityBuilder = EntityBuilder.create();
+ String json = JsonUtil.toJSONString(body).toString();
+ entityBuilder.setText(json);
+ entityBuilder.setContentType(ContentType.APPLICATION_JSON);
+ HttpEntity requestEntity = entityBuilder.build();
+ httpPost.setEntity(requestEntity);
+
+
+ try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
+ if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
+ throw new DEException(response.getStatusLine().getStatusCode(), response.toString());
+ }
+ HttpEntity entity = response.getEntity();
+ byte[] bytes = EntityUtils.toByteArray(entity); // raw bytes
+ String contentType = response.getFirstHeader("Content-Type").getValue();
+ if (contentType.startsWith("multipart/")) {
+ return MultipartParser.parse(bytes, contentType); // see util below
+ } else {
+ throw new IOException("unexpected response: " + contentType);
+ }
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Data
+ public static class MultipartResponse {
+ Map metadata;
+ byte[] image;
+ }
+
+ public class MultipartParser {
+ public static MultipartResponse parse(byte[] body, String contentType) throws IOException {
+ String boundary = extractBoundary(contentType);
+ String delim = "--" + boundary;
+ byte[] delimBytes = delim.getBytes();
+ MultipartResponse resp = new MultipartResponse();
+ resp.metadata = new HashMap<>();
+
+ int idx = 0;
+ while (idx < body.length) {
+ int start = indexOf(body, delimBytes, idx);
+ if (start < 0) break;
+ idx = start + delimBytes.length;
+ if (idx + 1 < body.length && body[idx] == '-' && body[idx+1] == '-') break; // final boundary
+ // skip CRLF
+ if (body[idx] == '\r' && body[idx+1] == '\n') idx += 2;
+
+ // read headers
+ int headerEnd = indexOf(body, "\r\n\r\n".getBytes(), idx);
+ String headers = new String(body, idx, headerEnd - idx);
+ idx = headerEnd + 4;
+
+ boolean isImage = headers.contains("name=\"image\"");
+ int nextBoundary = indexOf(body, delimBytes, idx);
+ if (nextBoundary < 0) break;
+
+ byte[] part = new byte[nextBoundary - idx - 2]; // strip trailing CRLF
+ System.arraycopy(body, idx, part, 0, part.length);
+
+ if (isImage) {
+ resp.image = part;
+ } else {
+ String json = new String(part);
+ // 最简单把整个 JSON 字符串放到 metadata map;
+ // 你也可以用 Jackson/Gson 解析成具体字段
+ resp.metadata = JsonUtil.parseObject(json, Map.class);
+ }
+ idx = nextBoundary;
+ }
+ return resp;
+ }
+
+ private static String extractBoundary(String contentType) {
+ Pattern p = Pattern.compile("boundary=(.*)");
+ Matcher m = p.matcher(contentType);
+ if (m.find()) {
+ return m.group(1);
+ }
+ throw new IllegalArgumentException("No boundary in content-type");
+ }
+
+ private static int indexOf(byte[] array, byte[] target, int start) {
+ outer:
+ for (int i = start; i <= array.length - target.length; i++) {
+ for (int j = 0; j < target.length; j++) {
+ if (array[i+j] != target[j]) continue outer;
+ }
+ return i;
+ }
+ return -1;
+ }
+ }
}