From fa1d6029c40e1270ea45e55d8757f42e00ef794c Mon Sep 17 00:00:00 2001 From: lzq Date: Tue, 26 Aug 2025 18:46:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0=20?= =?UTF-8?q?=E9=98=BF=E9=87=8C=E4=BA=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../njzscloud-common-minio/pom.xml | 5 + .../minio/config/AliOSSAutoConfiguration.java | 38 ++++++ .../common/minio/config/MinioProperties.java | 4 +- .../minio/controller/OSSController.java | 9 +- .../njzscloud/common/minio/util/AliOSS.java | 118 ++++++++++++++++++ .../main/resources/META-INF/spring.factories | 2 +- .../common/security/contant/Constants.java | 1 + .../common/security/util/SecurityUtil.java | 20 +++ .../tsp/service/TempStoragePointService.java | 2 +- .../src/main/resources/application-dev.yml | 9 +- .../resources/mapper/DisposeRecordMapper.xml | 2 +- .../main/resources/mapper/SysMenuMapper.xml | 2 +- .../resources/mapper/SysResourceMapper.xml | 4 +- .../mapper/TempStoragePointMapper.xml | 1 + z-doc/http/其他.http | 6 + 15 files changed, 205 insertions(+), 18 deletions(-) create mode 100644 njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/config/AliOSSAutoConfiguration.java create mode 100644 njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/util/AliOSS.java diff --git a/njzscloud-common/njzscloud-common-minio/pom.xml b/njzscloud-common/njzscloud-common-minio/pom.xml index 66fd54b..0929039 100644 --- a/njzscloud-common/njzscloud-common-minio/pom.xml +++ b/njzscloud-common/njzscloud-common-minio/pom.xml @@ -33,6 +33,11 @@ minio 8.5.17 + + com.aliyun.oss + aliyun-sdk-oss + 3.17.4 + diff --git a/njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/config/AliOSSAutoConfiguration.java b/njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/config/AliOSSAutoConfiguration.java new file mode 100644 index 0000000..9738bdf --- /dev/null +++ b/njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/config/AliOSSAutoConfiguration.java @@ -0,0 +1,38 @@ +package com.njzscloud.common.minio.config; + +import com.aliyun.oss.ClientBuilderConfiguration; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.common.auth.DefaultCredentialProvider; +import com.aliyun.oss.common.comm.SignVersion; +import com.njzscloud.common.minio.controller.OSSController; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(MinioProperties.class) +public class AliOSSAutoConfiguration { + @Bean(destroyMethod = "shutdown") + public OSS ossClient(MinioProperties minioProperties) { + String endpoint = minioProperties.getEndpoint(); + String accessKey = minioProperties.getAccessKey(); + String secretKey = minioProperties.getSecretKey(); + String region = minioProperties.getRegion(); + + ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); + clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); + DefaultCredentialProvider credentialProvider = new DefaultCredentialProvider(accessKey, secretKey); + return OSSClientBuilder.create() + .endpoint(endpoint) + .region(region) + .credentialsProvider(credentialProvider) + .clientConfiguration(clientBuilderConfiguration) + .build(); + } + + @Bean + public OSSController ossController() { + return new OSSController(); + } +} diff --git a/njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/config/MinioProperties.java b/njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/config/MinioProperties.java index da05dc2..3efd0cb 100644 --- a/njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/config/MinioProperties.java +++ b/njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/config/MinioProperties.java @@ -2,16 +2,14 @@ package com.njzscloud.common.minio.config; import lombok.Getter; import lombok.Setter; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; -import java.util.List; - @Getter @Setter @ConfigurationProperties("oss.minio") public class MinioProperties { private String endpoint; + private String region; private String accessKey; private String secretKey; private String bucketName; diff --git a/njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/controller/OSSController.java b/njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/controller/OSSController.java index 3279c25..8e54477 100644 --- a/njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/controller/OSSController.java +++ b/njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/controller/OSSController.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.njzscloud.common.core.tuple.Tuple2; import com.njzscloud.common.core.utils.R; +import com.njzscloud.common.minio.util.AliOSS; import com.njzscloud.common.minio.util.Minio; import com.njzscloud.common.mvc.util.FileResponseUtil; import org.springframework.web.bind.annotation.*; @@ -33,14 +34,12 @@ public class OSSController { } @GetMapping("/obtain_presigned_url") - public R> obtainPresignedUrl( - @RequestParam(value = "bucketName") String bucketName, - @RequestParam(value = "filename") String filename) { + public R> obtainPresignedUrl(@RequestParam(value = "filename") String filename) { String objectName = IdUtil.fastSimpleUUID(); if (StrUtil.isNotBlank(filename)) { objectName = objectName + "." + FileUtil.extName(filename); } - return R.success(Minio.obtainPresignedUrl(bucketName, objectName)); + return R.success(AliOSS.obtainPresignedUrl(objectName)); } @GetMapping("/download/{bucketName}/{objectName}") @@ -48,7 +47,7 @@ public class OSSController { @PathVariable("bucketName") String bucketName, @PathVariable("objectName") String objectName, HttpServletResponse response) { - Tuple2 tuple2 = Minio.obtainFile(bucketName, objectName); + Tuple2 tuple2 = AliOSS.obtainFile(bucketName, objectName); FileResponseUtil.download(response, tuple2.get_0(), tuple2.get_1(), objectName); } } diff --git a/njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/util/AliOSS.java b/njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/util/AliOSS.java new file mode 100644 index 0000000..a86673e --- /dev/null +++ b/njzscloud-common/njzscloud-common-minio/src/main/java/com/njzscloud/common/minio/util/AliOSS.java @@ -0,0 +1,118 @@ +package com.njzscloud.common.minio.util; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.aliyun.oss.ClientException; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSException; +import com.aliyun.oss.common.utils.BinaryUtil; +import com.aliyun.oss.model.GetObjectRequest; +import com.aliyun.oss.model.OSSObject; +import com.aliyun.oss.model.ObjectMetadata; +import com.aliyun.oss.model.PolicyConditions; +import com.njzscloud.common.core.tuple.Tuple2; +import com.njzscloud.common.minio.config.MinioProperties; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class AliOSS { + private static final OSS CLIENT; + private static final String BUCKET_NAME; + private static final String ACCESS_KEY; + + static { + CLIENT = SpringUtil.getBean(OSS.class); + BUCKET_NAME = SpringUtil.getBean(MinioProperties.class).getBucketName(); + ACCESS_KEY = SpringUtil.getBean(MinioProperties.class).getAccessKey(); + if (StrUtil.isNotBlank(BUCKET_NAME)) { + createBucket(BUCKET_NAME); + } + } + + public static void createBucket(String bucketName) { + Assert.notBlank(bucketName, "未指明存储位置"); + try { + boolean exists = CLIENT.doesBucketExist(bucketName); + if (exists) return; + CLIENT.createBucket(bucketName); + } catch (Exception e) { + log.error("存储桶创建失败", e); + } + } + + public static Map obtainPresignedUrl(String objectName) { + Map data = new HashMap<>(); + try { + long expireEndTime = System.currentTimeMillis() + 3600 * 1000; + Date expiration = new Date(expireEndTime); + PolicyConditions policyConds = new PolicyConditions(); + policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000); + String postPolicy = CLIENT.generatePostPolicy(expiration, policyConds); + byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8); + String encodedPolicy = BinaryUtil.toBase64String(binaryData); + String postSignature = CLIENT.calculatePostSignature(postPolicy); + data.put("OSSAccessKeyId", ACCESS_KEY); + data.put("policy", encodedPolicy); + data.put("signature", postSignature); + data.put("success_action_status", "200"); + data.put("name", objectName); + data.put("key", objectName); + data.put("bucketName", BUCKET_NAME); + data.put("objectName", objectName); + } catch ( + OSSException oe) { + System.out.println("Caught an OSSException, which means your request made it to OSS, " + + "but was rejected with an error response for some reason."); + // 假设此方法存在 + System.out.println("HTTP Status Code: " + oe.getRawResponseError()); + System.out.println("Error Message: " + oe.getErrorMessage()); + System.out.println("Error Code: " + oe.getErrorCode()); + System.out.println("Request ID: " + oe.getRequestId()); + System.out.println("Host ID: " + oe.getHostId()); + } catch (ClientException ce) { + System.out.println("Caught an ClientException, which means the client encountered " + + "a serious internal problem while trying to communicate with OSS, " + + "such as not being able to access the network."); + System.out.println("Error Message: " + ce.getMessage()); + } + return data; + } + + public static Tuple2 obtainFile(String bucketName, String objectName) { + try { + // 下载Object到本地文件,并保存到指定的本地路径中。如果指定的本地文件存在会覆盖,不存在则新建。 + // 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。 + OSSObject response = CLIENT.getObject(new GetObjectRequest(bucketName, objectName)); + ObjectMetadata objectMetadata = response.getObjectMetadata(); + String contentType = objectMetadata.getContentType(); + InputStream objectContent = response.getObjectContent(); + return Tuple2.create(objectContent, contentType); + + } catch (OSSException oe) { + System.out.println("Caught an OSSException, which means your request made it to OSS, " + + "but was rejected with an error response for some reason."); + System.out.println("Error Message:" + oe.getErrorMessage()); + System.out.println("Error Code:" + oe.getErrorCode()); + System.out.println("Request ID:" + oe.getRequestId()); + System.out.println("Host ID:" + oe.getHostId()); + } catch (ClientException ce) { + System.out.println("Caught an ClientException, which means the client encountered " + + "a serious internal problem while trying to communicate with OSS, " + + "such as not being able to access the network."); + System.out.println("Error Message:" + ce.getMessage()); + } + return null; + } + +} diff --git a/njzscloud-common/njzscloud-common-minio/src/main/resources/META-INF/spring.factories b/njzscloud-common/njzscloud-common-minio/src/main/resources/META-INF/spring.factories index bca7e99..e03f96e 100644 --- a/njzscloud-common/njzscloud-common-minio/src/main/resources/META-INF/spring.factories +++ b/njzscloud-common/njzscloud-common-minio/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration = \ - com.njzscloud.common.minio.config.MinioAutoConfiguration + com.njzscloud.common.minio.config.AliOSSAutoConfiguration diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/contant/Constants.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/contant/Constants.java index f5f544a..367cea1 100644 --- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/contant/Constants.java +++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/contant/Constants.java @@ -14,6 +14,7 @@ public final class Constants { public static final String ROLE_AUTHENTICATED = "ROLE_AUTHENTICATED"; public static final String ROLE_ANONYMOUS = "ROLE_ANONYMOUS"; + public static final String ROLE_ADMIN = "ROLE_ADMIN"; // Redis 订阅频道 权限更新 public static final String REDIS_TOPIC_PERMISSION_UPDATE = "permission_update"; diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/util/SecurityUtil.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/util/SecurityUtil.java index 0c35d8e..81cff0a 100644 --- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/util/SecurityUtil.java +++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/util/SecurityUtil.java @@ -24,6 +24,26 @@ public class SecurityUtil { return userDetail == null ? Constants.ANONYMOUS_USER : userDetail; } + /** + * 是否是管理员 + * + * @return true/false + */ + public static boolean isAdmin() { + UserDetail userDetail = SecurityUtil.loginUser(); + return userDetail.getRoles().contains(Constants.ROLE_ADMIN); + } + + /** + * 获取当前登录用户 ID + * + * @return 用户 ID + */ + public static Long currentUserId() { + UserDetail userDetail = SecurityUtil.loginUser(); + return userDetail.getUserId(); + } + /** * 保存用户信息和 TOKEN * diff --git a/njzscloud-svr/src/main/java/com/njzscloud/supervisory/tsp/service/TempStoragePointService.java b/njzscloud-svr/src/main/java/com/njzscloud/supervisory/tsp/service/TempStoragePointService.java index ce80fe3..9ae8b6e 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/supervisory/tsp/service/TempStoragePointService.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/supervisory/tsp/service/TempStoragePointService.java @@ -72,7 +72,7 @@ public class TempStoragePointService extends ServiceImpl paging(PageParam pageParam, TempStoragePointEntity tempStoragePointEntity) { UserDetail userDetail = SecurityUtil.loginUser(); - boolean isAdmin = userDetail.getRoles().contains("admin"); + boolean isAdmin = userDetail.getRoles().contains("ROLE_ADMIN"); Long userId = userDetail.getUserId(); String pointName = tempStoragePointEntity.getPointName(); PointStatus status = tempStoragePointEntity.getStatus(); diff --git a/njzscloud-svr/src/main/resources/application-dev.yml b/njzscloud-svr/src/main/resources/application-dev.yml index dda1e70..3b305cb 100644 --- a/njzscloud-svr/src/main/resources/application-dev.yml +++ b/njzscloud-svr/src/main/resources/application-dev.yml @@ -25,10 +25,11 @@ spring: oss: path: D:/ProJects/gov_manage/njzscloud-supervisory-svr/logs minio: - endpoint: http://localhost:9000 - access-key: minioadmin - secret-key: minioadmin - bucket-name: zsy + endpoint: oss-cn-shanghai.aliyuncs.com + access-key: LTAI5tJJu2WayYchExrT5W1E + secret-key: zllX0ZJ1EwsZXT6dE6swCLgTF4ImGg + region: cn-shanghai + bucket-name: cdn-zsy app: district: diff --git a/njzscloud-svr/src/main/resources/mapper/DisposeRecordMapper.xml b/njzscloud-svr/src/main/resources/mapper/DisposeRecordMapper.xml index 5de8089..f65753a 100644 --- a/njzscloud-svr/src/main/resources/mapper/DisposeRecordMapper.xml +++ b/njzscloud-svr/src/main/resources/mapper/DisposeRecordMapper.xml @@ -23,7 +23,7 @@ FROM dispose_record WHERE deleted = 0 AND DATE_FORMAT(out_time, '%Y-%m') = '${date}' - GROUP BY DATE_FORMAT(out_time, '%Y-%m-%d'), garbage_category + GROUP BY CAST(DATE_FORMAT(out_time, '%d') AS SIGNED), garbage_category ORDER BY CAST(DATE_FORMAT(out_time, '%d') AS SIGNED) DESC, garbage_category diff --git a/njzscloud-svr/src/main/resources/mapper/SysMenuMapper.xml b/njzscloud-svr/src/main/resources/mapper/SysMenuMapper.xml index b4ff8bb..cb24fee 100644 --- a/njzscloud-svr/src/main/resources/mapper/SysMenuMapper.xml +++ b/njzscloud-svr/src/main/resources/mapper/SysMenuMapper.xml @@ -4,7 +4,7 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - SELECT a.id, + SELECT DISTINCT a.id, a.sn, a.pid, a.title, @@ -27,7 +27,7 @@