diff --git a/xtools-app-common/xtools-app-common-cache/src/main/java/xtools/app/common/cache/enums/AppCache.java b/xtools-app-common/xtools-app-common-cache/src/main/java/xtools/app/common/cache/enums/AppCache.java index 944e3fe..29f1bf7 100644 --- a/xtools-app-common/xtools-app-common-cache/src/main/java/xtools/app/common/cache/enums/AppCache.java +++ b/xtools-app-common/xtools-app-common-cache/src/main/java/xtools/app/common/cache/enums/AppCache.java @@ -52,10 +52,11 @@ public enum AppCache implements BaseCacheEnum { SYS_CACHE_ADDR("sys:cache:addr:", 60 * 60L), // 天气缓存 SYS_CACHE_HOME_WEATHER("sys:cache:home:weather:", 30 * 60L), + // 文件存储统计缓存 + SYS_CACHE_FILE_STATS("sys:cache:file-stats", 60 * 60L), // 系统账号密码错误次数 - COUNT_SYS_USER_PASSWD_ERR("count:sys-user:passwd-err:", -1L) - ; + COUNT_SYS_USER_PASSWD_ERR("count:sys-user:passwd-err:", -1L); /** * 系统缓存前缀 diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysFileController.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysFileController.java index 86d2809..f8dc500 100644 --- a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysFileController.java +++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysFileController.java @@ -22,6 +22,7 @@ import xtools.app.sys.model.dto.req.SysFileAddReq; import xtools.app.sys.model.dto.req.SysFileChangeReq; import xtools.app.sys.model.dto.req.SysFilePageReq; import xtools.app.sys.model.dto.req.SysFileUpdateReq; +import xtools.app.sys.model.dto.resp.SysFileBucketStatsResp; import xtools.app.sys.model.dto.resp.SysFileResp; import xtools.app.sys.service.SysFileService; import xtools.boot.api.model.dto.Result; @@ -29,6 +30,8 @@ import xtools.boot.api.model.dto.page.PageReq; import xtools.boot.api.model.dto.page.PageResp; import xtools.boot.api.model.dto.req.IdListReq; +import java.util.List; + /** *

Title : SysFileController

*

Description : 系统文件表 Controller

@@ -113,4 +116,20 @@ public class SysFileController implements SysFileApi { return sysFileService.changeDataTypeByIds(req); } + /** + * 获取统计信息 + * + * @param refresh 是否刷新缓存 + * @return 统计信息 + */ + @Operation(summary = "获取统计信息") + @GetMapping("stats/{refresh}") + public Result> getStats( + @Schema(description = "是否刷新缓存") + @PathVariable Boolean refresh + ) { + return sysFileService.getStats(refresh); +// return Result.ok(List.of()); + } + } diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/mapper/SysFileMapper.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/mapper/SysFileMapper.java index a14d93d..a18f20d 100644 --- a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/mapper/SysFileMapper.java +++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/mapper/SysFileMapper.java @@ -2,8 +2,11 @@ package xtools.app.sys.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import xtools.app.sys.model.dto.resp.SysFileBucketStatsResp; import xtools.app.sys.model.entity.SysFile; +import java.util.List; + /** *

Title : SysFileMapper

*

Description : 系统文件表 Mapper 接口

@@ -16,4 +19,11 @@ import xtools.app.sys.model.entity.SysFile; @Mapper public interface SysFileMapper extends BaseMapper { + /** + * 查询每个桶的存储统计 + * + * @return 桶存储统计列表 + */ + List selectBucketStats(); + } diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/model/dto/resp/SysFileBucketStatsResp.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/model/dto/resp/SysFileBucketStatsResp.java new file mode 100644 index 0000000..90273db --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/model/dto/resp/SysFileBucketStatsResp.java @@ -0,0 +1,43 @@ +package xtools.app.sys.model.dto.resp; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + *

Title : SysFileBucketStatsResp

+ *

Description : 文件桶统计响应对象

+ *

Company : org.xujun

+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-07-15 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysFileBucketStatsResp implements Serializable { + + /** + * 桶名称 + */ + @Schema(description = "桶名称") + private String bucket; + + /** + * 文件数量 + */ + @Schema(description = "文件数量") + private Long fileCount; + + /** + * 文件大小 + */ + @Schema(description = "文件大小") + private Long fileSize; +} diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/SysFileService.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/SysFileService.java index 0c4a6f3..0098edc 100644 --- a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/SysFileService.java +++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/SysFileService.java @@ -2,11 +2,14 @@ package xtools.app.sys.service; import xtools.app.sys.api.SysFileApi; import xtools.app.sys.model.dto.req.SysFilePageReq; +import xtools.app.sys.model.dto.resp.SysFileBucketStatsResp; import xtools.app.sys.model.dto.resp.SysFileResp; import xtools.boot.api.model.dto.Result; import xtools.boot.api.model.dto.page.PageReq; import xtools.boot.api.model.dto.page.PageResp; +import java.util.List; + /** *

Title : SysFileService

*

Description : 系统文件表 Service

@@ -26,6 +29,14 @@ public interface SysFileService extends SysFileApi { */ Result> page(PageReq pageReq); + /** + * 获取统计信息 + * + * @param refresh 是否刷新缓存 + * @return 统计信息 + */ + Result> getStats(Boolean refresh); + /** * 定时任务 */ diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/SysFileServiceImpl.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/SysFileServiceImpl.java index 9a2a180..144192c 100644 --- a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/SysFileServiceImpl.java +++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/SysFileServiceImpl.java @@ -1,5 +1,6 @@ package xtools.app.sys.service.impl; +import com.alibaba.fastjson2.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -9,12 +10,14 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import xtools.app.common.cache.enums.AppCache; import xtools.app.common.task.enums.TaskType; import xtools.app.sys.convert.SysFileConvert; import xtools.app.sys.model.dto.req.SysFileAddReq; import xtools.app.sys.model.dto.req.SysFileChangeReq; import xtools.app.sys.model.dto.req.SysFilePageReq; import xtools.app.sys.model.dto.req.SysFileUpdateReq; +import xtools.app.sys.model.dto.resp.SysFileBucketStatsResp; import xtools.app.sys.model.dto.resp.SysFileResp; import xtools.app.sys.model.entity.SysFile; import xtools.app.sys.service.SysFileService; @@ -27,6 +30,7 @@ import xtools.boot.api.model.dto.Result; import xtools.boot.api.model.dto.page.PageReq; import xtools.boot.api.model.dto.page.PageResp; import xtools.boot.api.model.dto.req.IdListReq; +import xtools.boot.cache.redis.base.RedisService; import xtools.boot.db.mybatisplus.utils.QueryUtils; import xtools.boot.log.LogBus; import xtools.boot.log.enums.LogBusBaseType; @@ -72,6 +76,9 @@ public class SysFileServiceImpl implements SysFileService, BaseParams { @Resource private StorageConfig storageConfig; + @Resource + private RedisService redisService; + /** * 分页查询 * @@ -183,6 +190,38 @@ public class SysFileServiceImpl implements SysFileService, BaseParams { return Result.ok(changeDataType(req.getIdList(), req.getDataType())); } + /** + * 获取统计信息 + * + * @param refresh 是否刷新缓存 + * @return 统计信息 + */ + @Override + public Result> getStats(Boolean refresh) { + if (Objects.isNull(refresh)) { + refresh = Boolean.FALSE; + } + AppCache cacheParam = AppCache.SYS_CACHE_FILE_STATS; + String key = cacheParam.key(); + List dataList = null; + if (refresh) { + redisService.del(key); + } else { + JSONArray array = redisService.get(key, JSONArray.class); + if (CollectionUtils.isNotEmpty(array)) { + dataList = array.toJavaList(SysFileBucketStatsResp.class); + } + } + if (CollectionUtils.isNotEmpty(dataList)) { + return Result.ok(dataList); + } + dataList = sysFileBaseService.getBaseMapper().selectBucketStats(); + if (CollectionUtils.isNotEmpty(dataList)) { + redisService.set(key, dataList, cacheParam.expireTime()); + } + return Result.ok(dataList); + } + /** * 获取分页数据 * diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/resources/mapper/SysFileMapper.xml b/xtools-app-sys/xtools-app-sys-biz/src/main/resources/mapper/SysFileMapper.xml new file mode 100644 index 0000000..7b48aac --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-biz/src/main/resources/mapper/SysFileMapper.xml @@ -0,0 +1,15 @@ + + + + + + + +