From c9b78f9a699a12ab9ed6736baeca22f78791a1e5 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Sat, 12 Apr 2025 17:02:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E9=93=BE=E6=8E=A5=E8=8E=B7?= =?UTF-8?q?=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/config/language/msg/msg_en.yml | 18 ++-- .../resources/config/language/msg/msg_jp.yml | 18 ++-- .../back/controller/CommonController.java | 21 ++-- .../resources/config/application.properties | 7 +- .../mappers/ex/BasicUserMapperExt.xml | 2 +- .../viewer/back/dto/api/ObjectKey.java | 12 +++ .../dto/building/DeleteBuildingParams.java | 2 + model2d3d-viewer-back-service/pom.xml | 8 ++ .../viewer/back/service/CommonService.java | 4 +- .../back/service/impl/CommonServiceImpl.java | 99 +++++++++++++++++-- pom.xml | 15 +++ 11 files changed, 171 insertions(+), 35 deletions(-) create mode 100644 model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/api/ObjectKey.java diff --git a/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_en.yml b/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_en.yml index 32a6f23..e2701a1 100644 --- a/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_en.yml +++ b/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_en.yml @@ -1,14 +1,14 @@ msgen: argumentNotValid: - 1000: 未通过参数校验 - 1001: 参数不能为空 - 1002: 长度不能超过{0} - 1003: 长度无效 - 1004: 无效的邮箱 - 1005: 数值范围在{0}到{1}之间 - 1006: 必须大于或等于{0} - 1007: 必须小于或等于{0} - 1008: 无效的参数 + 1000: Parameter validation failed + 1001: Parameter cannot be null or empty + 1002: Length must not exceed {0} + 1003: Invalid length + 1004: Invalid email address + 1005: Value must be between {0} and {1} + 1006: Must be greater than or equal to {0} + 1007: Must be less than or equal to {0} + 1008: Invalid parameter parameterMap: serviceError: Internal service error. tokenError: API authentication failed. diff --git a/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_jp.yml b/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_jp.yml index 583f1ec..681d55b 100644 --- a/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_jp.yml +++ b/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_jp.yml @@ -1,14 +1,14 @@ msgjp: argumentNotValid: - 1000: 未通过参数校验 - 1001: 参数不能为空 - 1002: 长度不能超过{0} - 1003: 长度无效 - 1004: 无效的邮箱 - 1005: 数值范围在{0}到{1}之间 - 1006: 必须大于或等于{0} - 1007: 必须小于或等于{0} - 1008: 无效的参数 + 1000: パラメーター検証に失敗しました + 1001: パラメーターは空にできません + 1002: 長さは{0}文字以内でなければなりません + 1003: 無効な長さです + 1004: 無効なメールアドレスです + 1005: 値の範囲は{0}から{1}の間でなければなりません + 1006: "{0}以上でなければなりません" + 1007: "{0}以下でなければなりません" + 1008: 無効なパラメーターです parameterMap: serviceError: 内部サービスのエラー tokenError: インターフェイスの認証に失敗 diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/CommonController.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/CommonController.java index f1c752e..8e8b262 100644 --- a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/CommonController.java +++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/CommonController.java @@ -2,19 +2,18 @@ package com.model2d3d.viewer.back.controller; import java.util.List; +import com.model2d3d.viewer.back.dto.api.ObjectKey; +import com.model2d3d.viewer.back.dto.building.DeleteBuildingParams; 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.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; import com.alibaba.fastjson.JSONObject; import com.model2d3d.viewer.back.common.response.SimpleDataResponse; @@ -45,4 +44,14 @@ public class CommonController{ @Parameter(name="apikey",description="apikey值",required=true) @RequestParam String apikey){ return commonService.checkApikey(apikey); } + + + @Operation(summary = "Get temporary link") + @RequestMapping(value = "/getTemporaryLink", method = RequestMethod.POST) + public SimpleDataResponse getTemporaryLink( + @RequestBody @Validated ObjectKey objectKey, + @Parameter(name="Apikey", description="Apikey", required=true, schema = @Schema(defaultValue = "12345678")) @RequestHeader(required=false) Long Apikey, + @Parameter(name = "LanguageType", description = "Language type", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType){ + return commonService.getTemporaryLink(objectKey, Apikey, LanguageType); + } } diff --git a/model2d3d-viewer-back-controller/src/main/resources/config/application.properties b/model2d3d-viewer-back-controller/src/main/resources/config/application.properties index 600777a..6ece9cf 100644 --- a/model2d3d-viewer-back-controller/src/main/resources/config/application.properties +++ b/model2d3d-viewer-back-controller/src/main/resources/config/application.properties @@ -95,4 +95,9 @@ web.login.url=${webLoginUrl} springdoc.swagger-ui.doc-expansion=none springdoc.swagger-ui.operations-sorter=alpha -springdoc.swagger-ui.tags-sorter=alpha \ No newline at end of file +springdoc.swagger-ui.tags-sorter=alpha + + +amazon.aws.accesskey=${awsAccesskey} +amazon.aws.secretkey=${awsSecretkey} +amazon.aws.bucket.image=${awsBucketImage} \ No newline at end of file diff --git a/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicUserMapperExt.xml b/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicUserMapperExt.xml index f2f148a..904162c 100644 --- a/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicUserMapperExt.xml +++ b/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicUserMapperExt.xml @@ -90,7 +90,7 @@ FROM basic_user buser inner join basic_company bcom on bcom.id = buser.company_id - WHERE buser.flag != 1 and bcom.flag != 1 and (buser.login_name = #{loginname} OR buser.email = #{loginName}) + WHERE buser.flag != 1 and bcom.flag != 1 and (buser.login_name = #{loginname} OR buser.email = #{loginname}) \ No newline at end of file diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/api/ObjectKey.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/api/ObjectKey.java new file mode 100644 index 0000000..42bf3b8 --- /dev/null +++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/api/ObjectKey.java @@ -0,0 +1,12 @@ +package com.model2d3d.viewer.back.dto.api; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +@Data +public class ObjectKey { + + @NotBlank(message = "1001") + private String objectKey; + +} diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/building/DeleteBuildingParams.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/building/DeleteBuildingParams.java index 5acda2c..eb72696 100644 --- a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/building/DeleteBuildingParams.java +++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/building/DeleteBuildingParams.java @@ -1,6 +1,7 @@ package com.model2d3d.viewer.back.dto.building; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; import lombok.Data; import java.util.List; @@ -12,6 +13,7 @@ import java.util.List; @Data public class DeleteBuildingParams{ + @NotEmpty(message = "1001") @Schema(description ="Building IDs, array", example = "[\"acbdef2738967\",\"abcc556587\"]") private List buildingIds; diff --git a/model2d3d-viewer-back-service/pom.xml b/model2d3d-viewer-back-service/pom.xml index 94d7c3b..6b2c393 100644 --- a/model2d3d-viewer-back-service/pom.xml +++ b/model2d3d-viewer-back-service/pom.xml @@ -51,5 +51,13 @@ 2.3.2 + + + software.amazon.awssdk + s3 + 2.31.20 + compile + + diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/CommonService.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/CommonService.java index 3ff248f..30cdb3f 100644 --- a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/CommonService.java +++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/CommonService.java @@ -1,6 +1,7 @@ package com.model2d3d.viewer.back.service; import com.model2d3d.viewer.back.common.response.SimpleDataResponse; +import com.model2d3d.viewer.back.dto.api.ObjectKey; /** * @@ -10,5 +11,6 @@ import com.model2d3d.viewer.back.common.response.SimpleDataResponse; public interface CommonService { SimpleDataResponse checkApikey(String apikey); - + + SimpleDataResponse getTemporaryLink(ObjectKey objectKey, Long apikey, Integer languageType); } diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/CommonServiceImpl.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/CommonServiceImpl.java index bce34d9..1cc0049 100644 --- a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/CommonServiceImpl.java +++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/CommonServiceImpl.java @@ -1,7 +1,10 @@ package com.model2d3d.viewer.back.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.model2d3d.viewer.back.common.response.ResponseCode; +import com.model2d3d.viewer.back.dto.api.ObjectKey; import com.model2d3d.viewer.back.model.BasicCompany; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -12,6 +15,19 @@ import com.model2d3d.viewer.back.common.response.SimpleDataResponse; import com.model2d3d.viewer.back.dao.ex.BasicCompanyMapperExt; import com.model2d3d.viewer.back.service.CommonService; import com.model2d3d.viewer.back.service.common.CommonOpt; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.HeadObjectRequest; +import software.amazon.awssdk.services.s3.model.HeadObjectResponse; +import software.amazon.awssdk.services.s3.model.NoSuchKeyException; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; +import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest; +import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest; + +import java.net.URL; +import java.time.Duration; /** * @@ -21,14 +37,16 @@ import com.model2d3d.viewer.back.service.common.CommonOpt; @Service public class CommonServiceImpl implements CommonService { - private static Logger logger = LoggerFactory.getLogger(CommonServiceImpl.class); - - @Value("${spring.datasource.url}") - private String dbUrl; - @Value("${spring.datasource.username}") - private String dbUsername; - @Value("${spring.datasource.password}") - private String dbPassword; + private static final Logger logger = LoggerFactory.getLogger(CommonServiceImpl.class); + + @Value("${amazon.aws.accesskey}") + private String awsAccessKeyId; + + @Value("${amazon.aws.secretkey}") + private String awsAccessSecret; + + @Value("${amazon.aws.bucket.image:}") + private String awsBucketAdress; @Autowired private CommonOpt commonOpt; @@ -57,4 +75,69 @@ public class CommonServiceImpl implements CommonService { } return resp; } + + @Override + public SimpleDataResponse getTemporaryLink(ObjectKey objectKey, Long apikey, Integer languageType) { + + String bucketName = awsBucketAdress; + String accessKey = awsAccessKeyId; + String secretKey = awsAccessSecret; + String objKey = objectKey.getObjectKey(); // 文件名 + + URL url = null; + S3Presigner presigner = null; + try { + AwsBasicCredentials awsCredentials = AwsBasicCredentials.create(accessKey, secretKey); + + // Try to get the object metadata + HeadObjectRequest headObjectRequest = HeadObjectRequest.builder() + .bucket(bucketName) + .key(objKey) + .build(); + // First, check if the object exists in the S3 bucket + S3Client s3Client = S3Client.builder() + .region(Region.AP_NORTHEAST_1) + .credentialsProvider(StaticCredentialsProvider.create(awsCredentials)) + .build(); + HeadObjectResponse headObjectResponse = s3Client.headObject(headObjectRequest); + if (headObjectResponse != null) { + + // Generate a presigned URL using S3Prestige + presigner = S3Presigner.builder() + .region(Region.AP_NORTHEAST_1) + .credentialsProvider(StaticCredentialsProvider.create(awsCredentials)) + .build(); + // expiration time (e.g. 12 hour) + software.amazon.awssdk.services.s3.model.GetObjectRequest getObjectRequest = software.amazon.awssdk.services.s3.model.GetObjectRequest.builder() + .bucket(bucketName) + .key(objKey) + .build(); + + GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder() + .signatureDuration(Duration.ofHours(12)) // expiration time (e.g. 12 hour) + .getObjectRequest(getObjectRequest) + .build(); + + // presigned URL + PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(presignRequest); + url = presignedRequest.url(); + + // Temporary URL +// logger.info("Temporary URL: {}", url); + } + + return SimpleDataResponse.success(url); + + } catch (NoSuchKeyException e) { + logger.error("getTemporaryLink NoSuchKeyException", e); + return new SimpleDataResponse(ResponseCode.MSG_ERROR, "File not found"); + } catch (Exception e) { + logger.error("getTemporaryLink error", e); + return new SimpleDataResponse(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG); + } finally { + if (null != presigner) { + presigner.close(); + } + } + } } diff --git a/pom.xml b/pom.xml index 1d597b6..9ba4afe 100644 --- a/pom.xml +++ b/pom.xml @@ -178,6 +178,11 @@ http://49.234.37.33:92/#/user/login DEBUG + + AKIA5OFH5OOZHM3U3KX4 + Plkid7RDnHc1gGbp2yAv/Scc+ukI0q8vzBuyEBN2 + tokyobuild-stg-databucket-923770123186 + @@ -220,6 +225,11 @@ http://49.234.37.33:92/#/user/login DEBUG + + AKIA5OFH5OOZHM3U3KX4 + Plkid7RDnHc1gGbp2yAv/Scc+ukI0q8vzBuyEBN2 + tokyobuild-stg-databucket-923770123186 + @@ -263,6 +273,11 @@ http://49.234.37.33:92/#/user/login DEBUG + + AKIA5OFH5OOZHM3U3KX4 + Plkid7RDnHc1gGbp2yAv/Scc+ukI0q8vzBuyEBN2 + tokyobuild-stg-databucket-923770123186 +