From 339bc8acc390915aaabc8767a25b198ec7781deb Mon Sep 17 00:00:00 2001 From: lu17301156525 Date: Tue, 16 Dec 2025 17:37:45 -0800 Subject: [PATCH 1/3] fix: modify resource upload --- .../update_resource_table_ddl_2025_1217.sql | 2 + .../it/common/exception/ExceptionEnum.java | 6 +- .../common/utils/MultipartFileHashUtils.java | 74 +++++++++++++++++++ .../it/controller/ResourceController.java | 3 + .../it/login/controller/LoginController.java | 4 +- .../login/service/impl/LoginServiceImpl.java | 2 + .../tinyengine/it/model/entity/Resource.java | 3 + .../material/impl/ResourceServiceImpl.java | 4 +- .../main/resources/mappers/ResourceMapper.xml | 11 ++- 9 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 app/src/main/resources/sql/mysql/update_resource_table_ddl_2025_1217.sql create mode 100644 base/src/main/java/com/tinyengine/it/common/utils/MultipartFileHashUtils.java diff --git a/app/src/main/resources/sql/mysql/update_resource_table_ddl_2025_1217.sql b/app/src/main/resources/sql/mysql/update_resource_table_ddl_2025_1217.sql new file mode 100644 index 00000000..7329c08b --- /dev/null +++ b/app/src/main/resources/sql/mysql/update_resource_table_ddl_2025_1217.sql @@ -0,0 +1,2 @@ +ALTER TABLE t_resource + ADD COLUMN hash VARCHAR(100) AFTER thumbnail_url; \ No newline at end of file diff --git a/base/src/main/java/com/tinyengine/it/common/exception/ExceptionEnum.java b/base/src/main/java/com/tinyengine/it/common/exception/ExceptionEnum.java index 328a4e6b..691324a8 100644 --- a/base/src/main/java/com/tinyengine/it/common/exception/ExceptionEnum.java +++ b/base/src/main/java/com/tinyengine/it/common/exception/ExceptionEnum.java @@ -311,7 +311,11 @@ public enum ExceptionEnum implements IBaseError { /** * Cm 337 exception enum. */ - CM337("CM337", "组织不存在"); + CM337("CM337", "组织不存在"), + /** + * Cm 338 exception enum. + */ + CM338("CM338", "用户不存在,请重新注册"); /** * 错误码 diff --git a/base/src/main/java/com/tinyengine/it/common/utils/MultipartFileHashUtils.java b/base/src/main/java/com/tinyengine/it/common/utils/MultipartFileHashUtils.java new file mode 100644 index 00000000..dd2989bf --- /dev/null +++ b/base/src/main/java/com/tinyengine/it/common/utils/MultipartFileHashUtils.java @@ -0,0 +1,74 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +package com.tinyengine.it.common.utils; + +import org.springframework.web.multipart.MultipartFile; +import java.security.MessageDigest; +import java.io.InputStream; + +/** + * The type MultipartFileHashUtils. + * + * @since 2025-12-17 + */ +public class MultipartFileHashUtils { + + /** + * 计算MultipartFile的MD5哈希 + */ + public static String getMultipartFileMD5(MultipartFile file) throws Exception { + return getMultipartFileHash(file, "MD5"); + } + + /** + * 计算MultipartFile的SHA-256哈希 + */ + public static String getMultipartFileSHA256(MultipartFile file) throws Exception { + return getMultipartFileHash(file, "SHA-256"); + } + + /** + * 通用方法:计算MultipartFile的哈希值 + */ + public static String getMultipartFileHash(MultipartFile file, String algorithm) + throws Exception { + + MessageDigest digest = MessageDigest.getInstance(algorithm); + + try (InputStream inputStream = file.getInputStream()) { + byte[] buffer = new byte[8192]; + int bytesRead; + + while ((bytesRead = inputStream.read(buffer)) != -1) { + digest.update(buffer, 0, bytesRead); + } + } + + return bytesToHex(digest.digest()); + } + + /** + * 字节数组转十六进制字符串 + */ + private static String bytesToHex(byte[] bytes) { + StringBuilder hexString = new StringBuilder(); + for (byte b : bytes) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } +} diff --git a/base/src/main/java/com/tinyengine/it/controller/ResourceController.java b/base/src/main/java/com/tinyengine/it/controller/ResourceController.java index 7810f557..7a5229f0 100644 --- a/base/src/main/java/com/tinyengine/it/controller/ResourceController.java +++ b/base/src/main/java/com/tinyengine/it/controller/ResourceController.java @@ -18,6 +18,7 @@ import com.tinyengine.it.common.exception.ServiceException; import com.tinyengine.it.common.log.SystemControllerLog; import com.tinyengine.it.common.utils.ImageThumbnailGenerator; +import com.tinyengine.it.common.utils.MultipartFileHashUtils; import com.tinyengine.it.common.utils.Utils; import com.tinyengine.it.model.entity.Resource; import com.tinyengine.it.service.material.ResourceService; @@ -200,10 +201,12 @@ public Result resourceUpload(@RequestParam MultipartFile file, Integer } // 将文件转为 Base64 String base64 = ImageThumbnailGenerator.convertToBase64(file); + String imageHash = MultipartFileHashUtils.getMultipartFileMD5(file); Resource resource = new Resource(); resource.setName(fileName); resource.setResourceData(base64); resource.setAppId(appId); + resource.setHash(imageHash); Resource result = resourceService.resourceUpload(resource); return Result.success(result); } diff --git a/base/src/main/java/com/tinyengine/it/login/controller/LoginController.java b/base/src/main/java/com/tinyengine/it/login/controller/LoginController.java index 252ff776..512863b9 100644 --- a/base/src/main/java/com/tinyengine/it/login/controller/LoginController.java +++ b/base/src/main/java/com/tinyengine/it/login/controller/LoginController.java @@ -143,8 +143,8 @@ public Result login(@RequestBody User user) throws Exception { User userParam = new User(); userParam.setUsername(user.getUsername()); List users = userService.queryUserByCondition(userParam); - if (users.isEmpty()) { - Result.failed(ExceptionEnum.CM004); + if (users == null || users.isEmpty()) { + Result.failed(ExceptionEnum.CM338); } User userResult = users.get(0); diff --git a/base/src/main/java/com/tinyengine/it/login/service/impl/LoginServiceImpl.java b/base/src/main/java/com/tinyengine/it/login/service/impl/LoginServiceImpl.java index 7cd9b96c..6dce3fe3 100644 --- a/base/src/main/java/com/tinyengine/it/login/service/impl/LoginServiceImpl.java +++ b/base/src/main/java/com/tinyengine/it/login/service/impl/LoginServiceImpl.java @@ -76,6 +76,8 @@ public User createUser(User user) throws Exception { authUsersUnitsRoles.setUnitType("tenant"); authUsersUnitsRoles.setUnitId(1); authUsersUnitsRoles.setUserId(Integer.valueOf(user.getId())); + authUsersUnitsRoles.setCreatedBy(user.getId()); + authUsersUnitsRoles.setLastUpdatedBy(user.getId()); authUsersUnitsRolesMapper.createAuthUsersUnitsRoles(authUsersUnitsRoles); return result; } diff --git a/base/src/main/java/com/tinyengine/it/model/entity/Resource.java b/base/src/main/java/com/tinyengine/it/model/entity/Resource.java index 310acef1..3b6c511c 100644 --- a/base/src/main/java/com/tinyengine/it/model/entity/Resource.java +++ b/base/src/main/java/com/tinyengine/it/model/entity/Resource.java @@ -52,6 +52,9 @@ public class Resource extends BaseEntity { @Schema(name = "thumbnailUrl", description = "缩略图url") private String thumbnailUrl; + @Schema(name = "hash", description = "图片内容hash") + private String hash; + @Schema(name = "category", description = "分类") private String category; diff --git a/base/src/main/java/com/tinyengine/it/service/material/impl/ResourceServiceImpl.java b/base/src/main/java/com/tinyengine/it/service/material/impl/ResourceServiceImpl.java index 80370085..73bccaee 100644 --- a/base/src/main/java/com/tinyengine/it/service/material/impl/ResourceServiceImpl.java +++ b/base/src/main/java/com/tinyengine/it/service/material/impl/ResourceServiceImpl.java @@ -20,6 +20,7 @@ import com.tinyengine.it.common.exception.ServiceException; import com.tinyengine.it.common.log.SystemServiceLog; import com.tinyengine.it.common.utils.ImageThumbnailGenerator; +import com.tinyengine.it.common.utils.MultipartFileHashUtils; import com.tinyengine.it.common.utils.Utils; import com.tinyengine.it.mapper.ResourceGroupResourceMapper; import com.tinyengine.it.mapper.ResourceMapper; @@ -201,8 +202,7 @@ public Resource resourceUpload(Resource resource) { resource.setThumbnailData(ImageThumbnailGenerator.createThumbnail(resource.getResourceData(), 200, 200)); } QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("name", resource.getName()); - queryWrapper.eq("category", resource.getCategory()); + queryWrapper.eq("hash", resource.getHash()); // 接入租户系统需添加租户id查询 Resource resourceResult = this.baseMapper.selectOne(queryWrapper); if (resourceResult != null) { diff --git a/base/src/main/resources/mappers/ResourceMapper.xml b/base/src/main/resources/mappers/ResourceMapper.xml index 2bf0c081..b14ba0c4 100644 --- a/base/src/main/resources/mappers/ResourceMapper.xml +++ b/base/src/main/resources/mappers/ResourceMapper.xml @@ -7,7 +7,7 @@ id - , app_id, platform_id, `name`, thumbnail_name, resource_url, thumbnail_url, category, description, thumbnail_data, resource_data, + , app_id, platform_id, `name`, thumbnail_name, resource_url, thumbnail_url, hash, category, description, thumbnail_data, resource_data, public_status, is_default, created_by, last_updated_by, created_time, last_updated_time, tenant_id, renter_id, site_id @@ -28,6 +28,9 @@ AND resource_url = #{resourceUrl} + + AND hash = #{hash} + AND thumbnail_url = #{thumbnailUrl} @@ -92,6 +95,9 @@ thumbnail_url = #{thumbnailUrl}, + + hash = #{hash}, + category = #{category}, @@ -143,6 +149,7 @@ + @@ -255,6 +262,7 @@ , thumbnail_name , resource_url , thumbnail_url + , hash , category , description , thumbnail_data @@ -275,6 +283,7 @@ , #{thumbnailName} , #{resourceUrl} , #{thumbnailUrl} + , #{hash} , #{category} , #{description} , #{thumbnailData} From 4aceb46a2ea1eefce6d135156040caa4177b7225 Mon Sep 17 00:00:00 2001 From: lu17301156525 Date: Tue, 16 Dec 2025 17:41:29 -0800 Subject: [PATCH 2/3] fix: modify resource upload --- .../update_table_ddl_2025_1217.sql} | 0 app/src/main/resources/sql/mysql/update_table_ddl_2025_1217.sql | 2 ++ docker-deploy-data/mysql/init/update_table_ddl_2025_1217.sql | 2 ++ 3 files changed, 4 insertions(+) rename app/src/main/resources/sql/{mysql/update_resource_table_ddl_2025_1217.sql => h2/update_table_ddl_2025_1217.sql} (100%) create mode 100644 app/src/main/resources/sql/mysql/update_table_ddl_2025_1217.sql create mode 100644 docker-deploy-data/mysql/init/update_table_ddl_2025_1217.sql diff --git a/app/src/main/resources/sql/mysql/update_resource_table_ddl_2025_1217.sql b/app/src/main/resources/sql/h2/update_table_ddl_2025_1217.sql similarity index 100% rename from app/src/main/resources/sql/mysql/update_resource_table_ddl_2025_1217.sql rename to app/src/main/resources/sql/h2/update_table_ddl_2025_1217.sql diff --git a/app/src/main/resources/sql/mysql/update_table_ddl_2025_1217.sql b/app/src/main/resources/sql/mysql/update_table_ddl_2025_1217.sql new file mode 100644 index 00000000..7329c08b --- /dev/null +++ b/app/src/main/resources/sql/mysql/update_table_ddl_2025_1217.sql @@ -0,0 +1,2 @@ +ALTER TABLE t_resource + ADD COLUMN hash VARCHAR(100) AFTER thumbnail_url; \ No newline at end of file diff --git a/docker-deploy-data/mysql/init/update_table_ddl_2025_1217.sql b/docker-deploy-data/mysql/init/update_table_ddl_2025_1217.sql new file mode 100644 index 00000000..7329c08b --- /dev/null +++ b/docker-deploy-data/mysql/init/update_table_ddl_2025_1217.sql @@ -0,0 +1,2 @@ +ALTER TABLE t_resource + ADD COLUMN hash VARCHAR(100) AFTER thumbnail_url; \ No newline at end of file From dd15dc58567b7b693f58a30a7300306ee942b50e Mon Sep 17 00:00:00 2001 From: lu17301156525 Date: Tue, 16 Dec 2025 17:47:54 -0800 Subject: [PATCH 3/3] fix: modify resource upload --- .../com/tinyengine/it/login/controller/LoginController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/src/main/java/com/tinyengine/it/login/controller/LoginController.java b/base/src/main/java/com/tinyengine/it/login/controller/LoginController.java index 512863b9..7672caf1 100644 --- a/base/src/main/java/com/tinyengine/it/login/controller/LoginController.java +++ b/base/src/main/java/com/tinyengine/it/login/controller/LoginController.java @@ -144,7 +144,7 @@ public Result login(@RequestBody User user) throws Exception { userParam.setUsername(user.getUsername()); List users = userService.queryUserByCondition(userParam); if (users == null || users.isEmpty()) { - Result.failed(ExceptionEnum.CM338); + return Result.failed(ExceptionEnum.CM338); } User userResult = users.get(0);