添加文件统计信息
This commit is contained in:
Vendored
+3
-2
@@ -52,10 +52,11 @@ public enum AppCache implements BaseCacheEnum {
|
|||||||
SYS_CACHE_ADDR("sys:cache:addr:", 60 * 60L),
|
SYS_CACHE_ADDR("sys:cache:addr:", 60 * 60L),
|
||||||
// 天气缓存
|
// 天气缓存
|
||||||
SYS_CACHE_HOME_WEATHER("sys:cache:home:weather:", 30 * 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);
|
||||||
;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 系统缓存前缀
|
* 系统缓存前缀
|
||||||
|
|||||||
+19
@@ -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.SysFileChangeReq;
|
||||||
import xtools.app.sys.model.dto.req.SysFilePageReq;
|
import xtools.app.sys.model.dto.req.SysFilePageReq;
|
||||||
import xtools.app.sys.model.dto.req.SysFileUpdateReq;
|
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.dto.resp.SysFileResp;
|
||||||
import xtools.app.sys.service.SysFileService;
|
import xtools.app.sys.service.SysFileService;
|
||||||
import xtools.boot.api.model.dto.Result;
|
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.page.PageResp;
|
||||||
import xtools.boot.api.model.dto.req.IdListReq;
|
import xtools.boot.api.model.dto.req.IdListReq;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>Title : SysFileController</p>
|
* <p>Title : SysFileController</p>
|
||||||
* <p>Description : 系统文件表 Controller</p>
|
* <p>Description : 系统文件表 Controller</p>
|
||||||
@@ -113,4 +116,20 @@ public class SysFileController implements SysFileApi {
|
|||||||
return sysFileService.changeDataTypeByIds(req);
|
return sysFileService.changeDataTypeByIds(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取统计信息
|
||||||
|
*
|
||||||
|
* @param refresh 是否刷新缓存
|
||||||
|
* @return 统计信息
|
||||||
|
*/
|
||||||
|
@Operation(summary = "获取统计信息")
|
||||||
|
@GetMapping("stats/{refresh}")
|
||||||
|
public Result<List<SysFileBucketStatsResp>> getStats(
|
||||||
|
@Schema(description = "是否刷新缓存")
|
||||||
|
@PathVariable Boolean refresh
|
||||||
|
) {
|
||||||
|
return sysFileService.getStats(refresh);
|
||||||
|
// return Result.ok(List.of());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+10
@@ -2,8 +2,11 @@ package xtools.app.sys.mapper;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import xtools.app.sys.model.dto.resp.SysFileBucketStatsResp;
|
||||||
import xtools.app.sys.model.entity.SysFile;
|
import xtools.app.sys.model.entity.SysFile;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>Title : SysFileMapper</p>
|
* <p>Title : SysFileMapper</p>
|
||||||
* <p>Description : 系统文件表 Mapper 接口</p>
|
* <p>Description : 系统文件表 Mapper 接口</p>
|
||||||
@@ -16,4 +19,11 @@ import xtools.app.sys.model.entity.SysFile;
|
|||||||
@Mapper
|
@Mapper
|
||||||
public interface SysFileMapper extends BaseMapper<SysFile> {
|
public interface SysFileMapper extends BaseMapper<SysFile> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询每个桶的存储统计
|
||||||
|
*
|
||||||
|
* @return 桶存储统计列表
|
||||||
|
*/
|
||||||
|
List<SysFileBucketStatsResp> selectBucketStats();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+43
@@ -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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Title : SysFileBucketStatsResp</p>
|
||||||
|
* <p>Description : 文件桶统计响应对象</p>
|
||||||
|
* <p>Company : org.xujun</p>
|
||||||
|
*
|
||||||
|
* @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;
|
||||||
|
}
|
||||||
+11
@@ -2,11 +2,14 @@ package xtools.app.sys.service;
|
|||||||
|
|
||||||
import xtools.app.sys.api.SysFileApi;
|
import xtools.app.sys.api.SysFileApi;
|
||||||
import xtools.app.sys.model.dto.req.SysFilePageReq;
|
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.app.sys.model.dto.resp.SysFileResp;
|
||||||
import xtools.boot.api.model.dto.Result;
|
import xtools.boot.api.model.dto.Result;
|
||||||
import xtools.boot.api.model.dto.page.PageReq;
|
import xtools.boot.api.model.dto.page.PageReq;
|
||||||
import xtools.boot.api.model.dto.page.PageResp;
|
import xtools.boot.api.model.dto.page.PageResp;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>Title : SysFileService</p>
|
* <p>Title : SysFileService</p>
|
||||||
* <p>Description : 系统文件表 Service</p>
|
* <p>Description : 系统文件表 Service</p>
|
||||||
@@ -26,6 +29,14 @@ public interface SysFileService extends SysFileApi {
|
|||||||
*/
|
*/
|
||||||
Result<PageResp<SysFileResp>> page(PageReq<SysFilePageReq> pageReq);
|
Result<PageResp<SysFileResp>> page(PageReq<SysFilePageReq> pageReq);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取统计信息
|
||||||
|
*
|
||||||
|
* @param refresh 是否刷新缓存
|
||||||
|
* @return 统计信息
|
||||||
|
*/
|
||||||
|
Result<List<SysFileBucketStatsResp>> getStats(Boolean refresh);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 定时任务
|
* 定时任务
|
||||||
*/
|
*/
|
||||||
|
|||||||
+39
@@ -1,5 +1,6 @@
|
|||||||
package xtools.app.sys.service.impl;
|
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.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
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.context.annotation.Primary;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import xtools.app.common.cache.enums.AppCache;
|
||||||
import xtools.app.common.task.enums.TaskType;
|
import xtools.app.common.task.enums.TaskType;
|
||||||
import xtools.app.sys.convert.SysFileConvert;
|
import xtools.app.sys.convert.SysFileConvert;
|
||||||
import xtools.app.sys.model.dto.req.SysFileAddReq;
|
import xtools.app.sys.model.dto.req.SysFileAddReq;
|
||||||
import xtools.app.sys.model.dto.req.SysFileChangeReq;
|
import xtools.app.sys.model.dto.req.SysFileChangeReq;
|
||||||
import xtools.app.sys.model.dto.req.SysFilePageReq;
|
import xtools.app.sys.model.dto.req.SysFilePageReq;
|
||||||
import xtools.app.sys.model.dto.req.SysFileUpdateReq;
|
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.dto.resp.SysFileResp;
|
||||||
import xtools.app.sys.model.entity.SysFile;
|
import xtools.app.sys.model.entity.SysFile;
|
||||||
import xtools.app.sys.service.SysFileService;
|
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.PageReq;
|
||||||
import xtools.boot.api.model.dto.page.PageResp;
|
import xtools.boot.api.model.dto.page.PageResp;
|
||||||
import xtools.boot.api.model.dto.req.IdListReq;
|
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.db.mybatisplus.utils.QueryUtils;
|
||||||
import xtools.boot.log.LogBus;
|
import xtools.boot.log.LogBus;
|
||||||
import xtools.boot.log.enums.LogBusBaseType;
|
import xtools.boot.log.enums.LogBusBaseType;
|
||||||
@@ -72,6 +76,9 @@ public class SysFileServiceImpl implements SysFileService, BaseParams {
|
|||||||
@Resource
|
@Resource
|
||||||
private StorageConfig storageConfig;
|
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()));
|
return Result.ok(changeDataType(req.getIdList(), req.getDataType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取统计信息
|
||||||
|
*
|
||||||
|
* @param refresh 是否刷新缓存
|
||||||
|
* @return 统计信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Result<List<SysFileBucketStatsResp>> getStats(Boolean refresh) {
|
||||||
|
if (Objects.isNull(refresh)) {
|
||||||
|
refresh = Boolean.FALSE;
|
||||||
|
}
|
||||||
|
AppCache cacheParam = AppCache.SYS_CACHE_FILE_STATS;
|
||||||
|
String key = cacheParam.key();
|
||||||
|
List<SysFileBucketStatsResp> 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);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取分页数据
|
* 获取分页数据
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="xtools.app.sys.mapper.SysFileMapper">
|
||||||
|
|
||||||
|
<!-- 查询每个桶的存储统计 -->
|
||||||
|
<select id="selectBucketStats" resultType="xtools.app.sys.model.dto.resp.SysFileBucketStatsResp">
|
||||||
|
SELECT bucket,
|
||||||
|
COUNT(*) AS fileCount,
|
||||||
|
IFNULL(SUM(file_size), 0) AS fileSize
|
||||||
|
FROM sys_file
|
||||||
|
GROUP BY bucket
|
||||||
|
ORDER BY fileSize DESC
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</mapper>
|
||||||
Reference in New Issue
Block a user