From ac72f4ed8226344bf2bbde2f8409cf2242eb9c24 Mon Sep 17 00:00:00 2001 From: zlg <482370576@qq.com> Date: Wed, 3 Jul 2024 14:07:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=80=92=E5=BD=92=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E6=A0=91=EF=BC=8Ctencent=E5=9F=BA=E6=9C=AC=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SchisandraAuthPermissionController.java | 16 +- .../SchisandraAuthUserController.java | 2 + .../auth/common/entity/TreeNode.java | 24 ++ .../auth/common/utils/TreeUtils.java | 47 +++ .../domain/bo/SchisandraAuthPermissionBO.java | 4 +- ...SchisandraAuthPermissionDomainService.java | 5 + .../SchisandraAuthUserDomainService.java | 7 +- ...sandraAuthPermissionDomainServiceImpl.java | 63 +++- ...raAuthRolePermissionDomainServiceImpl.java | 2 +- .../SchisandraAuthUserDomainServiceImpl.java | 6 +- .../SchisandraAuthRolePermissionService.java | 2 +- .../SchisandraAuthUserRoleService.java | 1 + ...hisandraAuthRolePermissionServiceImpl.java | 4 +- .../SchisandraAuthUserRoleServiceImpl.java | 12 +- .../schisandra-cloud-storage-oss-api/pom.xml | 16 + .../pom.xml | 17 ++ .../SchisandraOssMinioController.java | 18 +- .../SchisandraOssTencentController.java | 204 ++++++++++++- .../oss/core/minio/MinioOssClient.java | 39 ++- .../oss/core/tencent/TencentOssClient.java | 275 ++++++++++++++++-- .../core/tencent/TencentOssConfiguration.java | 29 +- .../tencent/model/TencentOssClientConfig.java | 2 +- .../pom.xml | 5 +- .../pom.xml | 52 ++++ 24 files changed, 803 insertions(+), 49 deletions(-) create mode 100644 schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/entity/TreeNode.java create mode 100644 schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/utils/TreeUtils.java diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraAuthPermissionController.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraAuthPermissionController.java index 5210afd..5e5cf4c 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraAuthPermissionController.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraAuthPermissionController.java @@ -1,6 +1,7 @@ package com.schisandra.auth.application.controller; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.google.common.base.Preconditions; import com.schisandra.auth.application.convert.SchisandraAuthPermissionDTOConvert; import com.schisandra.auth.application.dto.SchisandraAuthPermissionDTO; @@ -9,12 +10,11 @@ import com.schisandra.auth.domain.bo.SchisandraAuthPermissionBO; import com.schisandra.auth.domain.service.SchisandraAuthPermissionDomainService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.util.HashMap; + /** * @description: 权限管理 * @author: landaiqing @@ -121,6 +121,14 @@ public class SchisandraAuthPermissionController { } } + @GetMapping("selectUserPermission") + public Result selectUserPermission(@RequestParam("userId") Long userId) { + if (userId == null) { + return Result.fail("userId不能为空"); + } + return schisandraAuthPermissionDomainService.selectUserPermissionTree(userId); + } + private void checkRoleInfo(@RequestBody SchisandraAuthPermissionDTO schisandraAuthPermissionDTO) { Preconditions.checkArgument(!StringUtils.isBlank(schisandraAuthPermissionDTO.getId().toString()), "角色名不能为空"); Preconditions.checkArgument(!StringUtils.isBlank(schisandraAuthPermissionDTO.getName()), "角色key值不能为空"); diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraAuthUserController.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraAuthUserController.java index f8dfca7..c7aa739 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraAuthUserController.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraAuthUserController.java @@ -24,6 +24,7 @@ import com.schisandra.auth.domain.service.SchisandraAuthRolePermissionDomainServ import com.schisandra.auth.domain.service.SchisandraAuthUserDomainService; import com.schisandra.auth.infra.basic.entity.SchisandraAuthPermission; import com.schisandra.auth.infra.basic.entity.SchisandraAuthRole; +import com.schisandra.auth.infra.basic.entity.SchisandraAuthRolePermission; import com.schisandra.auth.infra.basic.entity.SchisandraAuthUser; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -77,6 +78,7 @@ public class SchisandraAuthUserController { @Resource private SchisandraAuthPermissionDomainService schisandraAuthPermissionDomainService; + /** * @description: 注册 * @param: [schisandraAuthUserDTO] diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/entity/TreeNode.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/entity/TreeNode.java new file mode 100644 index 0000000..fef2853 --- /dev/null +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/entity/TreeNode.java @@ -0,0 +1,24 @@ +package com.schisandra.auth.common.entity; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; +@Data +public class TreeNode { + private Integer id; + + private Integer parentId; + + private List children; + + public TreeNode(Integer id, Integer parentId) { + this.id = id; + this.parentId = parentId; + this.children = new ArrayList<>(); + } + public TreeNode() { + } + + +} diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/utils/TreeUtils.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/utils/TreeUtils.java new file mode 100644 index 0000000..60d50b7 --- /dev/null +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/utils/TreeUtils.java @@ -0,0 +1,47 @@ +package com.schisandra.auth.common.utils; + +import java.lang.reflect.Field; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.function.Function; +public class TreeUtils { + public static List buildTree(List nodesList, R pid, String idFieldName, String parentIdFieldName, String childrenFieldName, Function, Stream> function) { + Map> map = nodesList.stream().collect(Collectors.groupingBy(a -> { + try { + Field field = a.getClass().getDeclaredField(parentIdFieldName); + field.setAccessible(true); + return field.get(a); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Error reading id field: " + e.getMessage()); + } + })); + + List roots = new ArrayList<>(); + // 逐层构建树结构 + roots.addAll(function.apply(Optional.ofNullable(map.get(pid)).orElse(new ArrayList<>()).stream()).collect(Collectors.toList())); + Queue queue = new LinkedList<>(roots); + + while (!queue.isEmpty()) { + try { + T node = queue.poll(); + Field idField = node.getClass().getDeclaredField(idFieldName); + idField.setAccessible(true); + Object nodeId = idField.get(node); + + if (map.containsKey(nodeId)) { + Field childrenField = node.getClass().getDeclaredField(childrenFieldName); + childrenField.setAccessible(true); + List list = function.apply(Optional.ofNullable(map.get(nodeId)).orElse(new ArrayList<>()).stream()).collect(Collectors.toList()); + childrenField.set(node, list); + queue.addAll(list); + } + + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Error reading id field: " + e.getMessage()); + } + } + return roots; + } + +} diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/bo/SchisandraAuthPermissionBO.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/bo/SchisandraAuthPermissionBO.java index e5b1312..b97be44 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/bo/SchisandraAuthPermissionBO.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/bo/SchisandraAuthPermissionBO.java @@ -4,6 +4,7 @@ import lombok.Data; import java.io.Serializable; import java.util.Date; +import java.util.List; /** * (SchisandraAuthPermission)实体类 @@ -16,6 +17,7 @@ public class SchisandraAuthPermissionBO implements Serializable { + private Long id; private String name; @@ -52,6 +54,6 @@ SchisandraAuthPermissionBO implements Serializable { private Integer isDeleted; - + private List routes; } diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/SchisandraAuthPermissionDomainService.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/SchisandraAuthPermissionDomainService.java index 96bdc6a..389fc78 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/SchisandraAuthPermissionDomainService.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/SchisandraAuthPermissionDomainService.java @@ -1,12 +1,17 @@ package com.schisandra.auth.domain.service; +import com.alibaba.fastjson.JSONObject; +import com.schisandra.auth.common.entity.Result; import com.schisandra.auth.domain.bo.SchisandraAuthPermissionBO; import com.schisandra.auth.infra.basic.entity.SchisandraAuthPermission; +import java.util.HashMap; import java.util.List; public interface SchisandraAuthPermissionDomainService { + + Result selectUserPermissionTree(Long userId); int update(SchisandraAuthPermissionBO schisandraAuthPermissionBO); Object delete(SchisandraAuthPermissionBO schisandraAuthPermissionBO); Object insert(SchisandraAuthPermissionBO schisandraAuthPermissionBO); diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/SchisandraAuthUserDomainService.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/SchisandraAuthUserDomainService.java index 7a94575..a6d094a 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/SchisandraAuthUserDomainService.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/SchisandraAuthUserDomainService.java @@ -1,12 +1,12 @@ package com.schisandra.auth.domain.service; -import cn.dev33.satoken.stp.SaTokenInfo; import com.schisandra.auth.common.entity.Result; import com.schisandra.auth.domain.bo.SchisandraAuthUserBO; import com.schisandra.auth.infra.basic.entity.SchisandraAuthUser; import me.zhyd.oauth.model.AuthUser; -import org.springframework.web.bind.annotation.RequestParam; + +import java.util.HashMap; /** * 用户领域service @@ -15,6 +15,9 @@ import org.springframework.web.bind.annotation.RequestParam; * @since 2024-05-23 20:00:28 */ public interface SchisandraAuthUserDomainService { + + + /** * @description: 找回密码 * @param: [schisandraAuthUserBO] diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthPermissionDomainServiceImpl.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthPermissionDomainServiceImpl.java index 30ed9e7..8513c04 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthPermissionDomainServiceImpl.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthPermissionDomainServiceImpl.java @@ -1,22 +1,81 @@ package com.schisandra.auth.domain.service.impl; +import com.alibaba.fastjson.JSONObject; +import com.schisandra.auth.common.entity.Result; import com.schisandra.auth.domain.bo.SchisandraAuthPermissionBO; import com.schisandra.auth.domain.convert.SchisandraAuthPermissionBOConverter; import com.schisandra.auth.domain.service.SchisandraAuthPermissionDomainService; import com.schisandra.auth.infra.basic.entity.SchisandraAuthPermission; +import com.schisandra.auth.infra.basic.entity.SchisandraAuthRolePermission; +import com.schisandra.auth.infra.basic.entity.SchisandraAuthUserRole; import com.schisandra.auth.infra.basic.service.SchisandraAuthPermissionService; +import com.schisandra.auth.infra.basic.service.SchisandraAuthRolePermissionService; +import com.schisandra.auth.infra.basic.service.SchisandraAuthUserRoleService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.List; +import java.util.*; @Service @Slf4j public class SchisandraAuthPermissionDomainServiceImpl implements SchisandraAuthPermissionDomainService { @Resource SchisandraAuthPermissionService schisandraAuthPermissionService; - /** + @Resource + SchisandraAuthUserRoleService schisandraAuthUserRoleService; + @Resource + SchisandraAuthRolePermissionService schisandraAuthRolePermissionService; + + public List selectTree(List schisandraAuthPermissions,List schisandraAuthPermissionsParent) { + List selectTreeList1 = new ArrayList<>(); + schisandraAuthPermissionsParent.forEach(e -> { + List schisandraAuthPermissions1 = new ArrayList<>(); + schisandraAuthPermissions.forEach(e1 -> { + if (e1.getParentId()==e.getId()){ + schisandraAuthPermissions1.add(e1); + } + }); + if (schisandraAuthPermissions1.size()==0){ + selectTreeList1.add(e); + } + else { + List list1 = selectTree(schisandraAuthPermissions,schisandraAuthPermissions1); + e.setRoutes(list1); + selectTreeList1.add(e); + } + }); + return selectTreeList1; + } + + @Override + public Result selectUserPermissionTree(Long userId) { + SchisandraAuthUserRole schisandraAuthRole = schisandraAuthUserRoleService.queryById(userId); + if (schisandraAuthRole == null||schisandraAuthRole.getRoleId()==null) { + return Result.ok("用户没有角色"); + } + List schisandraAuthRolePermissions = schisandraAuthRolePermissionService.queryByRoleId(schisandraAuthRole.getRoleId()); + if (schisandraAuthRolePermissions.size()==0){ + return Result.ok("当前角色用户没有权限"); + } + List schisandraAuthPermissions =new ArrayList<>(); + List schisandraAuthPermissionParents = new ArrayList<>(); + schisandraAuthRolePermissions.forEach(e -> { + schisandraAuthPermissions.add(SchisandraAuthPermissionBOConverter.INSTANCE.convertEntityToBO(schisandraAuthPermissionService.queryById(e.getPermissionId()))); + }); + + schisandraAuthPermissions.forEach(e -> { + if (e.getParentId()==0){ + schisandraAuthPermissionParents.add(e); + } + }); + HashMapmap=new HashMap<>(); + map.put("path","/"); + map.put("routes",selectTree(schisandraAuthPermissions,schisandraAuthPermissionParents)); + return Result.ok(map); + } + + /** * @description: 更新 * @param: [schisandraAuthPermissionBO] * @return: java.lang.Object diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthRolePermissionDomainServiceImpl.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthRolePermissionDomainServiceImpl.java index 2177323..21a8486 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthRolePermissionDomainServiceImpl.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthRolePermissionDomainServiceImpl.java @@ -50,7 +50,7 @@ public class SchisandraAuthRolePermissionDomainServiceImpl implements Schisandra @Override public List queryByRoleId(SchisandraAuthRolePermissionBO schisandraAuthRolePermissionBO) { SchisandraAuthRolePermission schisandraAuthRolePermission = SchisandraAuthRolePermissionBOConverter.INSTANCE.convertBOToEntity(schisandraAuthRolePermissionBO); - List schisandraAuthRolePermissions = schisandraAuthRolePermissionService.queryByRoleId(schisandraAuthRolePermission); + List schisandraAuthRolePermissions = schisandraAuthRolePermissionService.queryByRoleId(schisandraAuthRolePermission.getRoleId()); List schisandraAuthRolePermissionBOS = SchisandraAuthRolePermissionBOConverter.INSTANCE.convertEntityToBOList(schisandraAuthRolePermissions); return schisandraAuthRolePermissionBOS; } diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthUserDomainServiceImpl.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthUserDomainServiceImpl.java index 610a0b3..cd28442 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthUserDomainServiceImpl.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-domain/src/main/java/com/schisandra/auth/domain/service/impl/SchisandraAuthUserDomainServiceImpl.java @@ -26,8 +26,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.LinkedList; -import java.util.List; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -71,6 +70,7 @@ public class SchisandraAuthUserDomainServiceImpl implements SchisandraAuthUserDo @Resource private SchisandraAuthPermissionService schisandraAuthPermissionService; + /** * @description: 找回密码 * @param: [schisandraAuthUserBO] @@ -443,7 +443,7 @@ public class SchisandraAuthUserDomainServiceImpl implements SchisandraAuthUserDo // 查询用户权限并存入redis SchisandraAuthRolePermission schisandraAuthRolePermission = new SchisandraAuthRolePermission(); schisandraAuthRolePermission.setRoleId(UserRoleEnum.NORMAL_USER.getCode()); - List rolePermissionList = schisandraAuthRolePermissionService.queryByRoleId(schisandraAuthRolePermission); + List rolePermissionList = schisandraAuthRolePermissionService.queryByRoleId(schisandraAuthRolePermission.getRoleId()); List permissionIdList = rolePermissionList.stream() .map(SchisandraAuthRolePermission::getPermissionId).collect(Collectors.toList()); List permissionList = schisandraAuthPermissionService.queryListByIds(permissionIdList); diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/SchisandraAuthRolePermissionService.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/SchisandraAuthRolePermissionService.java index 3428c6b..123c24f 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/SchisandraAuthRolePermissionService.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/SchisandraAuthRolePermissionService.java @@ -45,5 +45,5 @@ public interface SchisandraAuthRolePermissionService { boolean deleteById(Long id); - List queryByRoleId(SchisandraAuthRolePermission schisandraAuthRolePermission); + List queryByRoleId(Long roleId); } diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/SchisandraAuthUserRoleService.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/SchisandraAuthUserRoleService.java index ced1cd1..a11303f 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/SchisandraAuthUserRoleService.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/SchisandraAuthUserRoleService.java @@ -1,5 +1,6 @@ package com.schisandra.auth.infra.basic.service; +import com.schisandra.auth.infra.basic.entity.SchisandraAuthRole; import com.schisandra.auth.infra.basic.entity.SchisandraAuthUserRole; /** diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/impl/SchisandraAuthRolePermissionServiceImpl.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/impl/SchisandraAuthRolePermissionServiceImpl.java index 971e61f..85c2ab0 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/impl/SchisandraAuthRolePermissionServiceImpl.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/impl/SchisandraAuthRolePermissionServiceImpl.java @@ -67,8 +67,8 @@ public class SchisandraAuthRolePermissionServiceImpl implements SchisandraAuthRo } @Override - public List queryByRoleId(SchisandraAuthRolePermission schisandraAuthRolePermission) { - return schisandraAuthRolePermissionDao.selectListByCondition(SchisandraAuthRolePermissionTableDef.SCHISANDRA_AUTH_ROLE_PERMISSION.ROLE_ID.eq(schisandraAuthRolePermission.getRoleId())); + public List queryByRoleId(Long roleId) { + return schisandraAuthRolePermissionDao.selectListByCondition(SchisandraAuthRolePermissionTableDef.SCHISANDRA_AUTH_ROLE_PERMISSION.ROLE_ID.eq(roleId)); } diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/impl/SchisandraAuthUserRoleServiceImpl.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/impl/SchisandraAuthUserRoleServiceImpl.java index 02f9e4e..0a73450 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/impl/SchisandraAuthUserRoleServiceImpl.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-infra/src/main/java/com/schisandra/auth/infra/basic/service/impl/SchisandraAuthUserRoleServiceImpl.java @@ -1,8 +1,15 @@ package com.schisandra.auth.infra.basic.service.impl; +import com.mybatisflex.core.query.QueryWrapper; +import com.schisandra.auth.infra.basic.dao.SchisandraAuthRoleDao; import com.schisandra.auth.infra.basic.dao.SchisandraAuthUserRoleDao; +import com.schisandra.auth.infra.basic.entity.SchisandraAuthRole; +import com.schisandra.auth.infra.basic.entity.SchisandraAuthUser; import com.schisandra.auth.infra.basic.entity.SchisandraAuthUserRole; +import com.schisandra.auth.infra.basic.entity.table.SchisandraAuthRoleTableDef; +import com.schisandra.auth.infra.basic.entity.table.SchisandraAuthUserRoleTableDef; +import com.schisandra.auth.infra.basic.entity.table.SchisandraAuthUserTableDef; import com.schisandra.auth.infra.basic.service.SchisandraAuthUserRoleService; import org.springframework.stereotype.Service; @@ -20,6 +27,9 @@ public class SchisandraAuthUserRoleServiceImpl implements SchisandraAuthUserRole @Resource private SchisandraAuthUserRoleDao schisandraAuthUserRoleDao; + @Resource + private SchisandraAuthRoleDao schisandraAuthRoleDao; + /** * 通过ID查询单条数据 @@ -29,7 +39,7 @@ public class SchisandraAuthUserRoleServiceImpl implements SchisandraAuthUserRole */ @Override public SchisandraAuthUserRole queryById(Long id) { - return this.schisandraAuthUserRoleDao.selectOneById(id); + return this.schisandraAuthUserRoleDao.selectOneByCondition(SchisandraAuthUserRoleTableDef.SCHISANDRA_AUTH_USER_ROLE.USER_ID.eq(id)); } /** diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-api/pom.xml b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-api/pom.xml index 4e1c9b6..3a06f66 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-api/pom.xml +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-api/pom.xml @@ -24,11 +24,27 @@ org.springframework.cloud spring-cloud-starter-openfeign 3.0.7 + + + slf4j-api + org.slf4j + + + spring-web + org.springframework + + org.springframework.cloud spring-cloud-loadbalancer 3.0.6 + + + reactor-core + io.projectreactor + + org.projectlombok diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/pom.xml b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/pom.xml index 82cbaea..961a64b 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/pom.xml +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/pom.xml @@ -68,11 +68,28 @@ com.schisandra schisandra-cloud-storage-oss-domain 1.0-SNAPSHOT + + + slf4j-log4j12 + org.slf4j + + com.schisandra schisandra-cloud-storage-oss-api 1.0-SNAPSHOT + + org.aspectj + aspectjweaver + 1.9.7 + compile + + + com.jd.platform + schisandra-cloud-storage-asyncTool + 1.4.1-SNAPSHOT + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssMinioController.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssMinioController.java index f697f03..bdbb761 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssMinioController.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssMinioController.java @@ -1,5 +1,6 @@ package com.schisandra.oss.application.controller; +import cn.hutool.core.util.ZipUtil; import cn.hutool.extra.spring.SpringUtil; import com.alibaba.fastjson.JSON; import com.amazonaws.util.IOUtils; @@ -8,7 +9,6 @@ import com.schisandra.oss.application.convert.SchisandraOssMinioDTOConverter; import com.schisandra.oss.application.dto.SchisandraOssMinioDTO; import com.schisandra.oss.application.oss.core.minio.MinioOssClient; import com.schisandra.oss.application.oss.core.minio.MinioOssConfiguration; -import com.schisandra.oss.application.oss.core.minio.model.MinioOssConfig; import com.schisandra.oss.application.oss.model.OssInfo; import com.schisandra.oss.common.entity.Result; import com.schisandra.oss.domain.bo.SchisandraOssMinioBO; @@ -27,7 +27,9 @@ import java.io.InputStream; import java.net.URLEncoder; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; +import java.util.HashMap; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; /** * controller @@ -96,18 +98,22 @@ public class SchisandraOssMinioController { * @date: 2024/6/26 13:56 */ @GetMapping("downloadMinioFile") - public void getMinioFile(@RequestParam String bucket, @RequestParam String userId, @RequestParam String filePath, HttpServletResponse response) throws Exception { + public void getMinioFile(@RequestParam String bucket, @RequestParam String userId, @RequestParam List listObjectsArgs , HttpServletResponse response) throws Exception { Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(userId, "不能为空"); - Preconditions.checkNotNull(filePath, "不能为空"); + Preconditions.checkNotNull(listObjectsArgs, "不能为空"); MinioOssClient bean = SpringUtil.getBean(userId); bean.getMinioOssConfig().setBucketName(bucket); - InputStream stream = bean.getMinioObject(bucket, filePath); + HashMap list=bean.getTargetDir(listObjectsArgs); ServletOutputStream output = response.getOutputStream(); - response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filePath.substring(filePath.lastIndexOf("/") + 1), "UTF-8")); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("下载.zip", "UTF-8")); response.setContentType("application/octet-stream"); response.setCharacterEncoding("UTF-8"); - IOUtils.copy(stream, output); + String[] path = new String[list.size()]; + InputStream[] inputStreams= new InputStream[list.size()]; + path=list.keySet().toArray(path); + inputStreams=list.values().toArray(inputStreams); + ZipUtil.zip(output, path, inputStreams); } /** diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssTencentController.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssTencentController.java index bd22b5c..13e7e12 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssTencentController.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssTencentController.java @@ -1,18 +1,32 @@ package com.schisandra.oss.application.controller; +import cn.hutool.extra.spring.SpringUtil; import com.alibaba.fastjson.JSON; import com.google.common.base.Preconditions; + +import com.qcloud.cos.model.CopyResult; +import com.qcloud.cos.model.DeleteObjectsRequest; +import com.qcloud.cos.model.DeleteObjectsResult; import com.schisandra.oss.application.convert.SchisandraOssTencentDTOConverter; import com.schisandra.oss.application.dto.SchisandraOssTencentDTO; + +import com.schisandra.oss.application.oss.core.minio.MinioOssClient; +import com.schisandra.oss.application.oss.core.tencent.TencentOssClient; +import com.schisandra.oss.application.oss.core.tencent.TencentOssConfiguration; import com.schisandra.oss.common.entity.Result; import com.schisandra.oss.domain.bo.SchisandraOssTencentBO; import com.schisandra.oss.domain.service.SchisandraOssTencentDomainService; +import io.minio.errors.*; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.IOException; +import java.io.InputStream; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.List; /** * 腾讯云对象存储配置表 controller @@ -27,6 +41,190 @@ public class SchisandraOssTencentController { @Resource private SchisandraOssTencentDomainService schisandraOssTencentDomainService; + @Resource + TencentOssConfiguration tencentOssConfiguration; + + @PostMapping("init") + public void initTencent(@RequestParam String userId) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException { + + + if (log.isInfoEnabled()) { + log.info("SchisandraOssTencentController.init.userId:{}", userId); + } + Preconditions.checkNotNull(userId, "用户id不能为空!"); + + Result result = tencentOssConfiguration.tencentOssClient(userId); + if (result.getSuccess()) { + log.info("用户: {}-> TencentOSS 初始化完成!", userId); + } else { + log.error("用户: {}-> TencentOSS 初始化完成!", userId); + } + + } + /** + * @description: 查询所有存储桶 + * @param: [userId] + * @return: com.schisandra.oss.common.entity.Result + * @author zlg + * @date: 2024/6/29 13:28 + */ + @PostMapping("seleteBucket") + public Result seleteBucket(@RequestParam String userId) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException { + Preconditions.checkNotNull(userId, "不能为空"); + TencentOssClient bean = SpringUtil.getBean(userId); + return Result.ok(bean.selectAllBucket()); + } + /** + * @description: 查询指定目录 + * @param: [userId, dirName, bucket] + * @return: com.schisandra.oss.common.entity.Result + * @author zlg + * @date: 2024/6/29 13:28 + */ + @GetMapping("listTencentDir") + public Result listMinioInfo(@RequestParam String userId, @RequestParam String dirName,@RequestParam String bucket) throws Exception { + Preconditions.checkNotNull(bucket, "不能为空"); + Preconditions.checkNotNull(userId, "不能为空"); + TencentOssClient bean = SpringUtil.getBean(userId); + bean.getTencentOssConfig().setBucketName(bucket); + return Result.ok(bean.listTargetDir(bucket, dirName)); + } +/** + * @description: 创建桶 + * @param: [userId, bucket, appId] + * @return: com.schisandra.oss.common.entity.Result + * @author zlg + * @date: 2024/6/29 13:27 + */ + @PostMapping("createBucket") + public Result createBucket(@RequestParam String userId, @RequestParam String bucket,@RequestParam String appId) { + Preconditions.checkNotNull(userId, "不能为空"); + Preconditions.checkNotNull(bucket, "不能为空"); + TencentOssClient bean = SpringUtil.getBean(userId); +// bean.getTencentOssConfig().setBucketName(bucket); + return Result.ok(bean.createBuctet(bucket,appId)); + } +/** + * @description: 删除腾讯云对象存储bucket + * @param: [userId, bucket, appId] + * @return: com.schisandra.oss.common.entity.Result + * @author zlg + * @date: 2024/6/29 13:27 + */ + @PostMapping("deleteBucket") + public Result deleteBucket(@RequestParam String userId, @RequestParam String bucket,@RequestParam String appId) { + Preconditions.checkNotNull(userId, "不能为空"); + Preconditions.checkNotNull(bucket, "不能为空"); + TencentOssClient bean = SpringUtil.getBean(userId); +// bean.getTencentOssConfig().setBucketName(bucket); + if (bean.deleteBucket(bucket,appId)){ + return Result.ok(); + }else { + return Result.fail(); + } + } +/** + * @description: 分享腾讯云对象存储链接 + * @param: [userId, bucket, target] + * @return: com.schisandra.oss.common.entity.Result + * @author zlg + * @date: 2024/6/29 13:27 + */ + @GetMapping("shareTencentUrl") + public Result shareTencentUrl(@RequestParam String userId, @RequestParam String bucket,@RequestParam String target) { + Preconditions.checkNotNull(userId, "不能为空"); + Preconditions.checkNotNull(bucket, "不能为空"); + TencentOssClient bean = SpringUtil.getBean(userId); + return Result.ok(bean.shareTencentObject(bucket,target)); + } + /** + * @description: 腾讯云对象存储上传文件 + * @param: [userId, bucket, target, file] + * @return: com.schisandra.oss.common.entity.Result + * @author zlg + * @date: 2024/7/1 16:01 + */ + @PostMapping("uploadTencent") + public Result uploadTencent(@RequestParam String userId, @RequestParam String bucket, @RequestParam String target, @RequestParam MultipartFile file) throws IOException { + Preconditions.checkNotNull(userId, "不能为空"); + Preconditions.checkNotNull(bucket, "不能为空"); + if (!target.isEmpty()){ + target=target+"/"+file.getOriginalFilename(); + } + TencentOssClient bean = SpringUtil.getBean(userId); + InputStream is = file.getInputStream(); + bean.getTencentOssConfig().setBucketName(bucket); + return Result.ok(bean.upLoadParts(is,target,file.getOriginalFilename())); + } + /** + * @description: 腾讯云对象存储下载文件 + * @param: [userId, bucket, target] + * @return: com.schisandra.oss.common.entity.Result + * @author zlg + * @date: 2024/7/1 16:02 + */ + @GetMapping("downloadTencent") + public Result downloadTencent(@RequestParam String userId, @RequestParam String bucket, @RequestParam String target) { + Preconditions.checkNotNull(userId, "不能为空"); + Preconditions.checkNotNull(bucket, "不能为空"); + TencentOssClient bean = SpringUtil.getBean(userId); + return Result.ok(bean.downloadTencent(bucket,target)); + } + /** + * @description: 腾讯云对象存储移动文件 + * @param: [userId, sourceBucket, targetBucket, targetName, SourceName] + * @return: com.schisandra.oss.common.entity.Result + * @author zlg + * @date: 2024/7/1 16:02 + */ + @PostMapping("moveTencent") + public Result moveTencent(@RequestParam String userId, @RequestParam String sourceBucket, @RequestParam String targetBucket, @RequestParam String targetName,@RequestParam String SourceName) throws IOException { + Preconditions.checkNotNull(userId, "不能为空"); + TencentOssClient bean = SpringUtil.getBean(userId); + CopyResult copyResult = bean.moveTencent(SourceName, targetName, sourceBucket, targetBucket); + if (copyResult==null){ + return Result.fail(); + } + return Result.ok(copyResult); + } + /** + * @description: 腾讯云对象存储复制文件 + * @param: [userId, sourceBucket, targetBucket, targetName, SourceName] + * @return: com.schisandra.oss.common.entity.Result + * @author zlg + * @date: 2024/7/1 16:02 + */ + @PostMapping("copyTencent") + public Result copyTencent(@RequestParam String userId, @RequestParam String sourceBucket, @RequestParam String targetBucket, @RequestParam String targetName,@RequestParam String SourceName) throws IOException { + Preconditions.checkNotNull(userId, "不能为空"); + TencentOssClient bean = SpringUtil.getBean(userId); + CopyResult copyResult = bean.copyTencent(SourceName,targetName , sourceBucket, targetBucket); + if (copyResult==null){ + return Result.fail(); + } + return Result.ok(copyResult); + } + /** + * @description: 腾讯云对象存储删除文件 + * @param: [userId, bucketName, target] + * @return: com.schisandra.oss.common.entity.Result + * @author zlg + * @date: 2024/7/1 16:02 + */ + @PostMapping("deleteTencent") + public Result deleteTencent(@RequestParam String userId, @RequestParam String bucketName, @RequestParam List target) throws IOException { + Preconditions.checkNotNull(userId, "不能为空"); + TencentOssClient bean = SpringUtil.getBean(userId); + DeleteObjectsResult deleteResult = bean.deleteTencent(bucketName, target); + if (deleteResult==null){ + return Result.fail(); + } + return Result.ok(deleteResult); + } + + + + /** * 新增腾讯云对象存储配置表 diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/MinioOssClient.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/MinioOssClient.java index bb21958..9da19c4 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/MinioOssClient.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/MinioOssClient.java @@ -12,6 +12,9 @@ import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.druid.util.StringUtils; import com.aliyun.oss.common.utils.HttpHeaders; +import com.jd.platform.async.executor.Async; +import com.jd.platform.async.worker.WorkResult; +import com.jd.platform.async.wrapper.WorkerWrapper; import com.schisandra.oss.application.oss.constant.OssConstant; import com.schisandra.oss.application.oss.core.StandardOssClient; import com.schisandra.oss.application.oss.core.minio.model.MinioOssConfig; @@ -41,6 +44,9 @@ import java.io.OutputStream; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.*; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** @@ -153,6 +159,37 @@ public class MinioOssClient implements StandardOssClient { return names; } + public HashMap getTargetDir(List listObjectsArgs) throws Exception { + HashMap list = new HashMap<>(); + List wrappers=new ArrayList<>(); + listObjectsArgs.forEach(args -> { + minioClient.listObjects( + ListObjectsArgs.builder().prefix(args).bucket(getBucket()).recursive(true).build()).forEach(r -> { + OssInfo info = new OssInfo(); + try { + WorkerWrapper wrapper1 = new WorkerWrapper.Builder().worker((String dirName, Map allWrappers) -> { + try { + list.put(dirName,getMinioObject(getBucket(), dirName)); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + }).param(r.get().objectName()).id(r.get().versionId()).callback((boolean success, String param,WorkResult re)->{ + System.out.println("success:"+success+" param:"); + }).build(); + wrappers.add(wrapper1); + } catch (Exception e) { + e.printStackTrace(); + } + }); + }); + + Async.beginWork(3500L,new ThreadPoolExecutor(10, 100, 5L, + TimeUnit.SECONDS, new LinkedBlockingQueue()), wrappers); + return list; + } + + /** * @description: 获取目录文件信息 * @param: [bucket, dirName] @@ -389,7 +426,7 @@ public class MinioOssClient implements StandardOssClient { }; } - private String getBucket() { + public String getBucket() { String bucketName = minioOssConfig.getBucketName(); try { if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/TencentOssClient.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/TencentOssClient.java index 61dc0a1..72518b0 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/TencentOssClient.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/TencentOssClient.java @@ -7,12 +7,16 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.io.unit.DataSizeUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import com.qcloud.cos.COSClient; +import com.qcloud.cos.exception.CosClientException; +import com.qcloud.cos.exception.CosServiceException; +import com.qcloud.cos.exception.MultiObjectDeleteException; import com.qcloud.cos.model.*; - +import com.qcloud.cos.transfer.*; import com.schisandra.oss.application.oss.constant.OssConstant; import com.schisandra.oss.application.oss.core.StandardOssClient; import com.schisandra.oss.application.oss.core.tencent.model.TencentOssConfig; @@ -24,37 +28,262 @@ import com.schisandra.oss.application.oss.model.download.DownloadCheckPoint; import com.schisandra.oss.application.oss.model.download.DownloadObjectStat; import com.schisandra.oss.application.oss.model.upload.*; import com.schisandra.oss.application.oss.utils.OssPathUtil; +import io.minio.errors.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.URL; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; import java.util.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.stream.Collectors; @Slf4j @Data -@AllArgsConstructor @NoArgsConstructor +@AllArgsConstructor +@Component public class TencentOssClient implements StandardOssClient { public static final String COS_OBJECT_NAME = "cosClient"; private COSClient cosClient; + private TencentOssConfig tencentOssConfig; + TransferManager createTransferManager() { + // 自定义线程池大小,建议在客户端与 COS 网络充足(例如使用腾讯云的 CVM,同地域上传 COS)的情况下,设置成16或32即可,可较充分的利用网络资源 + // 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。 + ExecutorService threadPool = Executors.newFixedThreadPool(32); + // 传入一个 threadpool, 若不传入线程池,默认 TransferManager 中会生成一个单线程的线程池。 + TransferManager transferManager = new TransferManager(cosClient, threadPool); + // 设置高级接口的配置项 + // 分块上传阈值和分块大小分别为 5MB 和 1MB + TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration(); + transferManagerConfiguration.setMultipartUploadThreshold(5 * 1024 * 1024); + transferManagerConfiguration.setMinimumUploadPartSize(1024 * 1024); + transferManager.setConfiguration(transferManagerConfiguration); + return transferManager; + } + + void shutdownTransferManager(TransferManager transferManager) { + // 指定参数为 true, 则同时会关闭 transferManager 内部的 COSClient 实例。 + // 指定参数为 false, 则不会关闭 transferManager 内部的 COSClient 实例。 + transferManager.shutdownNow(false); + } + + public TencentOssConfig getTencentOssConfig() { + return tencentOssConfig; + } + + public void setTencentOssConfig(TencentOssConfig tencentOssConfig) { + this.tencentOssConfig = tencentOssConfig; + } + + /** + * @description: 创建腾讯云对象存储 + * @param: [bucketName, appId] + * @return: com.qcloud.cos.model.Bucket + * @author zlg + * @date: 2024/6/29 10:13 + */ + public Bucket createBuctet(String bucketName, String appId) { + //存储桶名称,格式:BucketName-APPID + bucketName = bucketName + "-" + appId; + if (!cosClient.doesBucketExist(bucketName)) { + return null; + } + CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName); + createBucketRequest.setCannedAcl(CannedAccessControlList.Private); + Bucket bucketResult = cosClient.createBucket(createBucketRequest); + return bucketResult; + } + + + /** + * @description: 删除腾讯云对象存储 + * @param: [bucketName, appId] + * @return: java.lang.Boolean + * @author zlg + * @date: 2024/6/29 10:17 + */ + public Boolean deleteBucket(String bucketName, String appId) { + bucketName = bucketName + appId; + try { + cosClient.deleteBucket(bucketName); + } catch (CosClientException e) { + log.error("删除腾讯云对象存储失败", e); + return false; + } + return true; + } + + /** + * @description: 查找腾讯云对象存储 + * @param: [] + * @return: java.util.HashMap + * @author zlg + * @date: 2024/6/29 10:13 + */ + public HashMap selectAllBucket() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException { + List list = cosClient.listBuckets(); + HashMap names = new HashMap<>(); + list.forEach(bucket -> { + names.put(bucket.getName(), getTencentBucketSize(bucket.getName())); + }); + return names; + } + + public String getTencentBucketSize(String bucket) { + ListObjectsRequest listObjectsRequest = new ListObjectsRequest(); + listObjectsRequest.setBucketName(bucket); + listObjectsRequest.setMaxKeys(1000); + ObjectListing results = cosClient.listObjects(listObjectsRequest); + long fileSize = 0L; + for (COSObjectSummary objectSummary : results.getObjectSummaries()) { + fileSize = objectSummary.getSize() + fileSize; + } + return DataSizeUtil.format(fileSize); + } + public Download downloadTencent(String bucket, String target) { + + ExecutorService threadPool = Executors.newFixedThreadPool(4); + // 传入一个threadpool, 若不传入线程池, 默认TransferManager中会生成一个单线程的线程池。 + TransferManager transferManager = new TransferManager(cosClient, threadPool); + + try { + Download download = transferManager.download(bucket, target, + new File("D:\\java_project\\schisandra-cloud-storage\\")); + download.waitForCompletion(); + return download; + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + public HashMap listTargetDir(String bucket, String dirName) { + ListObjectsRequest listObjectsRequest = new ListObjectsRequest(); + listObjectsRequest.setBucketName(bucket); + listObjectsRequest.setPrefix(dirName); + listObjectsRequest.setMaxKeys(1000); + HashMap map = new HashMap<>(); + ObjectListing results = cosClient.listObjects(listObjectsRequest); + long fileSize = 0L; + for (COSObjectSummary objectSummary : results.getObjectSummaries()) { + if (!objectSummary.getKey().equals(dirName + "/")) { + map.put(objectSummary.getKey(), DataSizeUtil.format(objectSummary.getSize())); + } + } + return map; + } + + public String shareTencentObject(String bucket, String target) { + try { + Date expirationDate = new Date(System.currentTimeMillis() + 30 * 60 * 1000); + + URL url = cosClient.generatePresignedUrl(bucket, target, expirationDate); + return String.valueOf(url); + } catch (Exception e) { + e.printStackTrace(); + return "链接获取失败"; + } + } + + + public Upload upLoadParts(InputStream is, String targetName, String fileName) { + TransferManager transferManager = createTransferManager(); + ObjectMetadata objectMetadata = new ObjectMetadata(); +// int inputStreamLength = 1024 * 1024; +// byte data[] = new byte[inputStreamLength]; + try { + objectMetadata.setContentLength(is.available()); + } catch (IOException e) { + throw new RuntimeException(e); + } + PutObjectRequest putObjectRequest = new PutObjectRequest(getBucket(), targetName, is, objectMetadata); + try { + // 高级接口会返回一个异步结果Upload + // 可同步地调用 waitForUploadResult 方法等待上传完成,成功返回 UploadResult, 失败抛出异常 + Upload upload = transferManager.upload(putObjectRequest); + UploadResult uploadResult = upload.waitForUploadResult(); + return upload; + } catch (CosServiceException e) { + e.printStackTrace(); + } catch (CosClientException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + shutdownTransferManager(transferManager); + return null; + } + + public CopyResult copyTencent(String sourceName, String targetName, String sourceBucket, String targetBucket) { + TransferManager transferManager = createTransferManager(); + ObjectMetadata objectMetadata = new ObjectMetadata(); + + CopyObjectRequest copyObjectRequest = new CopyObjectRequest(sourceBucket, + sourceName, targetBucket, targetName); + try { + Copy copy = transferManager.copy(copyObjectRequest); + // 高级接口会返回一个异步结果 Copy + // 可同步的调用 waitForCopyResult 等待复制结束, 成功返回 CopyResult, 失败抛出异常 + CopyResult copyResult = copy.waitForCopyResult(); + return copyResult; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + public CopyResult moveTencent(String sourceName, String targetName, String sourceBucket, String targetBucket) { + TransferManager transferManager = createTransferManager(); + CopyObjectRequest copyObjectRequest = new CopyObjectRequest(sourceBucket, + sourceName, targetBucket, targetName); + ArrayList keyList = new ArrayList<>(); + keyList.add(new DeleteObjectsRequest.KeyVersion(sourceName)); + try { + Copy copy = transferManager.copy(copyObjectRequest); + // 高级接口会返回一个异步结果 Copy + // 可同步的调用 waitForCopyResult 等待复制结束, 成功返回 CopyResult, 失败抛出异常 + CopyResult moveResult = copy.waitForCopyResult(); + deleteTencent(targetBucket,keyList); + return moveResult; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public DeleteObjectsResult deleteTencent(String bucket, List targetName) { + DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucket); + deleteObjectsRequest.setKeys(targetName); + try { + DeleteObjectsResult deleteObjectsResult = cosClient.deleteObjects(deleteObjectsRequest); + List deleteObjectResultArray = deleteObjectsResult.getDeletedObjects(); + return deleteObjectsResult; + } catch (MultiObjectDeleteException mde) { + // 如果部分删除成功部分失败, 返回 MultiObjectDeleteException + List deleteObjects = mde.getDeletedObjects(); + List deleteErrors = mde.getErrors(); + mde.printStackTrace(); + } catch (CosServiceException e) { + e.printStackTrace(); + } + return null; + } + @Override public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) { - String bucketName = getBucket(); - String key = getKey(targetName, false); - - if (isOverride || !cosClient.doesObjectExist(bucketName, key)) { - cosClient.putObject(bucketName, key, is, new ObjectMetadata()); - } - return getInfo(targetName); + return null; } @Override @@ -112,7 +341,6 @@ public class TencentOssClient implements StandardOssClient { partResult = new UpLoadPartResult(partNum + 1, uploadPart.getOffset(), partSize); try { inputStream.skip(uploadPart.getOffset()); - UploadPartRequest uploadPartRequest = new UploadPartRequest(); uploadPartRequest.setBucketName(upLoadCheckPoint.getBucket()); uploadPartRequest.setKey(upLoadCheckPoint.getKey()); @@ -120,9 +348,7 @@ public class TencentOssClient implements StandardOssClient { uploadPartRequest.setInputStream(inputStream); uploadPartRequest.setPartSize(partSize); uploadPartRequest.setPartNumber(uploadPart.getNumber()); - UploadPartResult uploadPartResponse = cosClient.uploadPart(uploadPartRequest); - partResult.setNumber(uploadPartResponse.getPartNumber()); partResult.setEntityTag(new UpLoadPartEntityTag().setETag(uploadPartResponse.getETag()) .setPartNumber(uploadPartResponse.getPartNumber())); @@ -196,11 +422,26 @@ public class TencentOssClient implements StandardOssClient { @Override public void copy(String sourceName, String targetName, Boolean isOverride) { - String bucketName = getBucket(); - String targetKey = getKey(targetName, false); - if (isOverride || !cosClient.doesObjectExist(bucketName, targetKey)) { - cosClient.copyObject(getBucket(), getKey(sourceName, false), getBucket(), targetKey); + TransferManager transferManager = createTransferManager(); + ObjectMetadata objectMetadata = new ObjectMetadata(); + + CopyObjectRequest copyObjectRequest = new CopyObjectRequest(getBucket(), + sourceName, getBucket(), targetName); + + try { + Copy copy = transferManager.copy(copyObjectRequest); + // 高级接口会返回一个异步结果 Copy + // 可同步的调用 waitForCopyResult 等待复制结束, 成功返回 CopyResult, 失败抛出异常 + CopyResult copyResult = copy.waitForCopyResult(); + System.out.println(copyResult.getRequestId()); + } catch (CosServiceException e) { + e.printStackTrace(); + } catch (CosClientException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); } + } @Override @@ -265,7 +506,7 @@ public class TencentOssClient implements StandardOssClient { }; } - private String getBucket() { + public String getBucket() { String bucketName = tencentOssConfig.getBucketName(); if (!cosClient.doesBucketExist(bucketName)) { cosClient.createBucket(bucketName); diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/TencentOssConfiguration.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/TencentOssConfiguration.java index ab76c85..1cd46d6 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/TencentOssConfiguration.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/TencentOssConfiguration.java @@ -1,23 +1,32 @@ package com.schisandra.oss.application.oss.core.tencent; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; + + import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; +import com.qcloud.cos.http.HttpProtocol; +import com.qcloud.cos.region.Region; import com.schisandra.oss.application.convert.SchisandraOssTencentDTOConverter; import com.schisandra.oss.application.dto.SchisandraOssTencentDTO; import com.schisandra.oss.application.oss.core.StandardOssClient; import com.schisandra.oss.application.oss.core.tencent.model.TencentOssClientConfig; import com.schisandra.oss.application.oss.core.tencent.model.TencentOssConfig; +import com.schisandra.oss.common.entity.Result; import com.schisandra.oss.domain.bo.SchisandraOssTencentBO; import com.schisandra.oss.domain.service.SchisandraOssTencentDomainService; + import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.Optional; +import static com.tencentcloudapi.common.profile.Region.Chengdu; + /** * @author zlg * @description:腾讯云对象存储配置 @@ -33,7 +42,7 @@ public class TencentOssConfiguration { private SchisandraOssTencentDomainService schisandraOssTencentDomainService; - public StandardOssClient tencentOssClient(String userId) { + public Result tencentOssClient(String userId) { SchisandraOssTencentBO schisandraOssTencentBO = schisandraOssTencentDomainService.getTencentOssConfig(userId); SchisandraOssTencentDTO schisandraOssTencentDTO = SchisandraOssTencentDTOConverter.INSTANCE.convertBOToDTO(schisandraOssTencentBO); if (ObjectUtil.isEmpty(schisandraOssTencentDTO)) { @@ -45,11 +54,25 @@ public class TencentOssConfiguration { TencentOssConfig tencentOssConfig = new TencentOssConfig(); tencentOssConfig.setSecretId(secretId); tencentOssConfig.setSecretKey(secretKey); - return tencentOssClient(tencentOssConfig); +// COSCredentials cred = new BasicCOSCredentials(secretId, secretKey); +// Region region = new Region(); + //高级设置 + TencentOssClientConfig tencentOssClientConfig = new TencentOssClientConfig(); + tencentOssClientConfig.setRegion("ap-chengdu"); +// COSClient cosClient = new COSClient(cred, clientConfig.toClientConfig()); + tencentOssConfig.setClientConfig(tencentOssClientConfig); +// + + try { + SpringUtil.registerBean(userId, tencentOssClient(tencentOssConfig)); + return Result.ok(); + } catch (Exception e) { + log.error("TencentOssConfiguration.tencentOssClient:{}", e.getMessage(), e); + return Result.fail(); + } } - private StandardOssClient tencentOssClient(TencentOssConfig tencentOssConfig) { TencentOssClientConfig clientConfig = Optional.ofNullable(tencentOssConfig.getClientConfig()).orElse(new TencentOssClientConfig()); COSCredentials cosCredentials = cosCredentials(tencentOssConfig); diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/model/TencentOssClientConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/model/TencentOssClientConfig.java index 700da1f..1f89144 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/model/TencentOssClientConfig.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/tencent/model/TencentOssClientConfig.java @@ -90,7 +90,7 @@ public class TencentOssClientConfig { public ClientConfig toClientConfig() { ClientConfig clientConfig = new ClientConfig(); - BeanUtil.copyProperties(this, clientConfig, new CopyOptions().setIgnoreNullValue(true).setIgnoreProperties("region")); +// BeanUtil.copyProperties(this, clientConfig, new CopyOptions().setIgnoreNullValue(true).setIgnoreProperties("region")); if (ObjectUtil.isNotEmpty(region)) { clientConfig.setRegion(new Region(region)); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/pom.xml b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/pom.xml index 25d3ae9..94f3604 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/pom.xml +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/pom.xml @@ -11,6 +11,9 @@ jar schisandra-cloud-storage-oss-common + + + 8 8 @@ -176,7 +179,7 @@ com.qcloud cos_api - 5.6.69 + 5.6.219 diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/pom.xml b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/pom.xml index f64beda..abacdf5 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/pom.xml +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/pom.xml @@ -25,12 +25,24 @@ org.springframework.boot spring-boot-starter-jdbc 2.4.2 + + + spring-boot-autoconfigure + org.springframework.boot + + com.alibaba druid-spring-boot-starter 1.1.21 + + + spring-boot + org.springframework.boot + + @@ -42,6 +54,28 @@ com.mybatis-flex mybatis-flex-spring-boot-starter 1.9.3 + + + spring-beans + org.springframework + + + spring-context + org.springframework + + + spring-core + org.springframework + + + spring-jdbc + org.springframework + + + spring-boot-autoconfigure + org.springframework.boot + + com.mybatis-flex @@ -53,6 +87,24 @@ com.schisandra schisandra-cloud-storage-oss-common 1.0-SNAPSHOT + + + slf4j-log4j12 + org.slf4j + + + spring-boot-starter + org.springframework.boot + + + spring-context-support + org.springframework + + + spring-tx + org.springframework + +