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