From 81f66a5e6c31284a8b650e3a29be227c6ee6d2e2 Mon Sep 17 00:00:00 2001 From: zflzqy <1396954535@qq.com> Date: Thu, 16 Mar 2023 11:27:18 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix=20=E4=BB=A5=E6=B8=B8=E6=A0=87=E7=9A=84?= =?UTF-8?q?=E5=BD=A2=E4=BC=BC=E6=9B=BF=E6=8D=A2=E7=99=BB=E5=BD=95=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=9A=84=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/moxi/mogublog/utils/RedisUtil.java | 8 +++ .../xo/service/impl/AdminServiceImpl.java | 57 ++++++++++++++++--- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/mogu_utils/src/main/java/com/moxi/mogublog/utils/RedisUtil.java b/mogu_utils/src/main/java/com/moxi/mogublog/utils/RedisUtil.java index 84f4e3855..29b610854 100644 --- a/mogu_utils/src/main/java/com/moxi/mogublog/utils/RedisUtil.java +++ b/mogu_utils/src/main/java/com/moxi/mogublog/utils/RedisUtil.java @@ -1329,6 +1329,14 @@ public Cursor> zScan(String key, ScanOptions options) { return redisTemplate.opsForZSet().scan(key, options); } + /** + * 获取redisTemplate + * @return + */ + public StringRedisTemplate getRedisTemplate() { + return redisTemplate; + } + /** * 获取Redis List 序列化 * diff --git a/mogu_xo/src/main/java/com/moxi/mogublog/xo/service/impl/AdminServiceImpl.java b/mogu_xo/src/main/java/com/moxi/mogublog/xo/service/impl/AdminServiceImpl.java index 77b92e801..bd6f7d38c 100644 --- a/mogu_xo/src/main/java/com/moxi/mogublog/xo/service/impl/AdminServiceImpl.java +++ b/mogu_xo/src/main/java/com/moxi/mogublog/xo/service/impl/AdminServiceImpl.java @@ -1,6 +1,8 @@ package com.moxi.mogublog.xo.service.impl; +import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.CharsetUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -24,8 +26,12 @@ import com.moxi.mougblog.base.global.Constants; import com.moxi.mougblog.base.holder.RequestHolder; import com.moxi.mougblog.base.serviceImpl.SuperServiceImpl; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.ScanOptions; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -33,7 +39,9 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.*; +import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; /** * 管理员表 服务实现类 @@ -42,6 +50,7 @@ * @since 2018-09-04 */ @Service +@Slf4j public class AdminServiceImpl extends SuperServiceImpl implements AdminService { @Autowired @@ -66,19 +75,49 @@ public Admin getAdminByUid(String uid) { @Override public String getOnlineAdminList(AdminVO adminVO) { - // 获取Redis中匹配的所有key - Set keys = redisUtil.keys(RedisConf.LOGIN_TOKEN_KEY + "*"); - List onlineAdminJsonList = redisUtil.multiGet(keys); // 拼装分页信息 int pageSize = adminVO.getPageSize().intValue(); int currentPage = adminVO.getCurrentPage().intValue(); - int total = onlineAdminJsonList.size(); + AtomicReference total = new AtomicReference(0); int startIndex = Math.max((currentPage - 1) * pageSize, 0); - int endIndex = Math.min(currentPage * pageSize, total); - //TODO 截取出当前分页下的内容,后面考虑用Redis List做分页 - List onlineAdminSubList = onlineAdminJsonList.subList(startIndex, endIndex); + + // 获取Redis中匹配的key + Set keys = redisUtil.getRedisTemplate().execute((RedisCallback>) connection -> { + Set keySetTemp = new ConcurrentSkipListSet<>(); + int index = 0; + try (Cursor cursor = connection.scan(ScanOptions.scanOptions() + .match(RedisConf.LOGIN_TOKEN_KEY + "*") + .count(100000) + .build())) { + + // 获取登录用户的key + while (cursor.hasNext()) { + index ++; + // 先偏移起始位置个数据 + if (index(); + } + return keySetTemp; + }); + + // 获取在线用户数据 + List onlineAdminJsonList = redisUtil.multiGet(keys); List onlineAdminList = new ArrayList<>(); - for (String item : onlineAdminSubList) { + for (String item : onlineAdminJsonList) { OnlineAdmin onlineAdmin = JsonUtils.jsonToPojo(item, OnlineAdmin.class); // 数据脱敏【移除用户的token令牌】 onlineAdmin.setToken(""); @@ -86,7 +125,7 @@ public String getOnlineAdminList(AdminVO adminVO) { } Page page = new Page<>(); page.setCurrent(currentPage); - page.setTotal(total); + page.setTotal(total.get()); page.setSize(pageSize); page.setRecords(onlineAdminList); return ResultUtil.successWithData(page); From b12a4e2a3e2142223b2e9f8afe67f542f3165732 Mon Sep 17 00:00:00 2001 From: zflzqy <1396954535@qq.com> Date: Thu, 23 Mar 2023 13:24:16 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E6=9C=AA=E6=8C=87?= =?UTF-8?q?=E5=AE=9Aspring-boot-maven-plugin=E7=89=88=E6=9C=AC=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E6=89=93=E5=8C=85=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mogu_admin/pom.xml | 1 + mogu_gateway/pom.xml | 1 + mogu_monitor/pom.xml | 1 + mogu_picture/pom.xml | 1 + mogu_search/pom.xml | 1 + mogu_sms/pom.xml | 1 + mogu_spider/pom.xml | 1 + mogu_web/pom.xml | 1 + pom.xml | 3 ++- 9 files changed, 10 insertions(+), 1 deletion(-) diff --git a/mogu_admin/pom.xml b/mogu_admin/pom.xml index c02575494..25dd07c87 100644 --- a/mogu_admin/pom.xml +++ b/mogu_admin/pom.xml @@ -86,6 +86,7 @@ org.springframework.boot spring-boot-maven-plugin + ${spring-boot-dependencies.version} com.moxi.mogublog.admin.AdminApplication diff --git a/mogu_gateway/pom.xml b/mogu_gateway/pom.xml index c96422301..43e9dde04 100644 --- a/mogu_gateway/pom.xml +++ b/mogu_gateway/pom.xml @@ -76,6 +76,7 @@ org.springframework.boot spring-boot-maven-plugin + ${spring-boot-dependencies.version} com.moxi.mogublog.gateway.GateWayApplication diff --git a/mogu_monitor/pom.xml b/mogu_monitor/pom.xml index 4703b37ca..c9354d2b2 100644 --- a/mogu_monitor/pom.xml +++ b/mogu_monitor/pom.xml @@ -62,6 +62,7 @@ org.springframework.boot spring-boot-maven-plugin + ${spring-boot-dependencies.version} com.moxi.mogublog.monitor.MonitorApplication diff --git a/mogu_picture/pom.xml b/mogu_picture/pom.xml index 507338a81..15f685977 100644 --- a/mogu_picture/pom.xml +++ b/mogu_picture/pom.xml @@ -127,6 +127,7 @@ org.springframework.boot spring-boot-maven-plugin + ${spring-boot-dependencies.version} com.moxi.mogublog.picture.PictureApplication diff --git a/mogu_search/pom.xml b/mogu_search/pom.xml index de47866d6..a81c30efc 100644 --- a/mogu_search/pom.xml +++ b/mogu_search/pom.xml @@ -104,6 +104,7 @@ org.springframework.boot spring-boot-maven-plugin + ${spring-boot-dependencies.version} com.moxi.mogublog.search.SearchApplication diff --git a/mogu_sms/pom.xml b/mogu_sms/pom.xml index 0d99dd139..377a9ed28 100644 --- a/mogu_sms/pom.xml +++ b/mogu_sms/pom.xml @@ -105,6 +105,7 @@ org.springframework.boot spring-boot-maven-plugin + ${spring-boot-dependencies.version} com.moxi.mogublog.sms.SmsApplication diff --git a/mogu_spider/pom.xml b/mogu_spider/pom.xml index 3bdf973ea..6590f2d8a 100644 --- a/mogu_spider/pom.xml +++ b/mogu_spider/pom.xml @@ -105,6 +105,7 @@ org.springframework.boot spring-boot-maven-plugin + ${spring-boot-dependencies.version} com.moxi.mogublog.spider.SpiderApplication diff --git a/mogu_web/pom.xml b/mogu_web/pom.xml index a5cf29061..272477c0b 100644 --- a/mogu_web/pom.xml +++ b/mogu_web/pom.xml @@ -113,6 +113,7 @@ org.springframework.boot spring-boot-maven-plugin + ${spring-boot-dependencies.version} com.moxi.mogublog.web.WebApplication diff --git a/pom.xml b/pom.xml index f3f8efbce..51d9a07eb 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,7 @@ 2.0.8 3.0.2 2.2.4.RELEASE + 2.2.5.RELEASE @@ -78,7 +79,7 @@ org.springframework.boot spring-boot-dependencies - 2.2.5.RELEASE + ${spring-boot-dependencies.version} pom import From 5c02f6c75c9b3e1bf4e832af44e11db598ad3071 Mon Sep 17 00:00:00 2001 From: zflzqy <1396954535@qq.com> Date: Sun, 26 Mar 2023 13:13:03 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix=20=E4=BC=98=E5=8C=96=E4=B8=83=E7=89=9B?= =?UTF-8?q?=E4=BA=91=E5=92=8Cminio=E6=89=B9=E9=87=8F=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moxi/mogublog/picture/util/MinioUtil.java | 11 +++-- .../moxi/mogublog/picture/util/QiniuUtil.java | 48 +++++++++++++------ 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/mogu_picture/src/main/java/com/moxi/mogublog/picture/util/MinioUtil.java b/mogu_picture/src/main/java/com/moxi/mogublog/picture/util/MinioUtil.java index b2917e4fe..c548a5dbe 100644 --- a/mogu_picture/src/main/java/com/moxi/mogublog/picture/util/MinioUtil.java +++ b/mogu_picture/src/main/java/com/moxi/mogublog/picture/util/MinioUtil.java @@ -5,9 +5,8 @@ import com.moxi.mogublog.utils.FileUtils; import com.moxi.mogublog.utils.ResultUtil; import com.moxi.mougblog.base.global.Constants; -import io.minio.MinioClient; -import io.minio.PutObjectArgs; -import io.minio.RemoveObjectArgs; +import io.minio.*; +import io.minio.messages.DeleteObject; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -15,6 +14,7 @@ import java.io.InputStream; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; /** @@ -89,10 +89,11 @@ public String deleteBatchFile(List fileNameList) { SystemConfig systemConfig = feignUtil.getSystemConfig(); MinioClient minioClient = MinioClient.builder().endpoint(systemConfig.getMinioEndPoint()).credentials(systemConfig.getMinioAccessKey(), systemConfig.getMinioSecretKey()).build(); try { + List objects = new LinkedList<>(); for (String fileName : fileNameList) { - minioClient.removeObject( - RemoveObjectArgs.builder().bucket(systemConfig.getMinioBucket()).object(fileName).build()); + objects.add(new DeleteObject(fileName)); } + minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(systemConfig.getMinioBucket()).objects(objects).build()); } catch (Exception e) { log.error("批量删除文件失败, 错误消息: {}", e.getMessage()); return ResultUtil.errorWithData(MessageConf.DELETE_DEFAULT_ERROR); diff --git a/mogu_picture/src/main/java/com/moxi/mogublog/picture/util/QiniuUtil.java b/mogu_picture/src/main/java/com/moxi/mogublog/picture/util/QiniuUtil.java index 443c9220b..1e806126b 100644 --- a/mogu_picture/src/main/java/com/moxi/mogublog/picture/util/QiniuUtil.java +++ b/mogu_picture/src/main/java/com/moxi/mogublog/picture/util/QiniuUtil.java @@ -1,5 +1,7 @@ package com.moxi.mogublog.picture.util; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; import com.google.gson.Gson; import com.moxi.mogublog.commons.entity.SystemConfig; import com.moxi.mogublog.picture.global.MessageConf; @@ -27,9 +29,7 @@ import javax.servlet.http.HttpServletRequest; import java.io.File; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 七牛云工具类 @@ -133,6 +133,9 @@ public int deleteFile(String fileName, Map qiNiuConfig) { * @return */ public Boolean deleteFileList(List fileNameList, Map qiNiuConfig) { + if (CollUtil.isEmpty(fileNameList)){ + return true; + } //构造一个带指定Zone对象的配置类 Configuration cfg = setQiNiuArea(qiNiuConfig.get(SysConf.QI_NIU_AREA)); //获取上传凭证 @@ -140,18 +143,35 @@ public Boolean deleteFileList(List fileNameList, Map qiN String secretKey = qiNiuConfig.get(SysConf.QI_NIU_SECRET_KEY); String bucket = qiNiuConfig.get(SysConf.QI_NIU_BUCKET); int successCount = 0; - for (String fileName : fileNameList) { - String key = fileName; - Auth auth = Auth.create(accessKey, secretKey); - BucketManager bucketManager = new BucketManager(auth, cfg); - try { - Response delete = bucketManager.delete(bucket, key); - log.info("{七牛云文件 {} 删除成功", fileName); - successCount += 1; - } catch (QiniuException ex) { - //如果遇到异常,说明删除失败 - log.error(ex.getMessage()); + + Auth auth = Auth.create(accessKey, secretKey); + BucketManager bucketManager = new BucketManager(auth, cfg); + + try { + List deleteObjects = new LinkedList<>(); + for (String fileName:fileNameList){ + deleteObjects.add(fileName); + // 七牛云规定不超过1000 + if (deleteObjects.size()==999){ + // 构建批量删除项 + BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations(); + batchOperations.addDeleteOp(bucket, ArrayUtil.toArray(deleteObjects,String.class)); + bucketManager.batch(batchOperations); + log.info("{七牛云文件 {} 删除成功", deleteObjects); + deleteObjects = new LinkedList<>(); + } + } + + // 删除剩下的部分 + if (CollUtil.isNotEmpty(deleteObjects)){ + BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations(); + batchOperations.addDeleteOp(bucket, ArrayUtil.toArray(deleteObjects,String.class)); + bucketManager.batch(batchOperations); + log.info("{七牛云文件 {} 删除成功", deleteObjects); } + } catch (QiniuException e) { + //如果遇到异常,说明删除失败 + log.error("删除失败:",e); } return successCount == fileNameList.size(); }