diff --git a/cutejava-springboot3/pom.xml b/cutejava-springboot3/pom.xml index 58e5fe28..1ab0ebf8 100644 --- a/cutejava-springboot3/pom.xml +++ b/cutejava-springboot3/pom.xml @@ -55,7 +55,7 @@ 3.11.1 2.12.7 2.0.3.RELEASE - 1.2.0 + 1.3.0 1.8.0 33.5.0-jre diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/xlsx/KitXlsxExportDataTransferRowHandler.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/xlsx/KitXlsxExportDataTransferRowHandler.java new file mode 100644 index 00000000..41c366d4 --- /dev/null +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/xlsx/KitXlsxExportDataTransferRowHandler.java @@ -0,0 +1,8 @@ +package cn.odboy.util.xlsx; + +import java.util.List; + +public interface KitXlsxExportDataTransferRowHandler { + + List doHandler(O o); +} diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/xlsx/KitXlsxExportUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/xlsx/KitXlsxExportUtil.java new file mode 100644 index 00000000..5743ae3d --- /dev/null +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/xlsx/KitXlsxExportUtil.java @@ -0,0 +1,62 @@ +package cn.odboy.util.xlsx; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import cn.idev.excel.FastExcel; +import cn.odboy.framework.exception.BadRequestException; +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import lombok.experimental.UtilityClass; + +/** + * xlsx文件导出工具 + * + * @author odboy + * @date 2025-12-29 + */ +@UtilityClass +public class KitXlsxExportUtil { + + /** + * @param response HttpServletResponse + * @param title 标题 + * @param dataObjectList 数据源,一般为从数据库直接查询的数据 + * @param targetClazz 目标对象Class + * @param rowHandler 数据对象 -> 目标对象 映射逻辑 + * @param 数据源对象类型 + * @param 目标对象类型 + * @throws IOException + */ + public static void exportFile(HttpServletResponse response, String title, List dataObjectList, Class targetClazz, KitXlsxExportDataTransferRowHandler rowHandler) throws IOException { + if (response == null) { + throw new BadRequestException("参数 HttpServletResponse(response) 必填"); + } + if (CollUtil.isEmpty(dataObjectList)) { + throw new BadRequestException("参数 数据源(dataObjectList) 必填"); + } + if (StrUtil.isBlank(title)) { + throw new BadRequestException("参数 标题(title) 必填"); + } + String sheetName = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN); + List resultList = new ArrayList<>(); + for (O o : dataObjectList) { + List rows = rowHandler.doHandler(o); + resultList.addAll(rows); + } + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + String fileName = URLEncoder.encode(sheetName + "_" + title, StandardCharsets.UTF_8); + response.setHeader("Content-disposition", + "attachment;filename*=utf-8''" + fileName + ".xlsx"); + FastExcel.write(response.getOutputStream(), targetClazz) + .sheet(sheetName) + .doWrite(resultList); + } +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemYesOrNoChConst.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemYesOrNoChConst.java new file mode 100644 index 00000000..25ab481c --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemYesOrNoChConst.java @@ -0,0 +1,6 @@ +package cn.odboy.system.constant; + +public interface SystemYesOrNoChConst { + String YES_STR = "是"; + String NO_STR = "否"; +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemZhConst.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemZhConst.java new file mode 100644 index 00000000..b295a5d7 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemZhConst.java @@ -0,0 +1,9 @@ +package cn.odboy.system.constant; + +public interface SystemZhConst { + + String YES_STR = "是"; + String NO_STR = "否"; + String ENABLE_STR = "启用"; + String DISABLE_STR = "停用"; +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemDeptExportRowVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemDeptExportRowVo.java new file mode 100644 index 00000000..c61b6a5e --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemDeptExportRowVo.java @@ -0,0 +1,19 @@ +package cn.odboy.system.dal.model; + +import cn.idev.excel.annotation.ExcelProperty; +import cn.odboy.base.KitObject; +import java.util.Date; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemDeptExportRowVo extends KitObject { + + @ExcelProperty("部门名称") + private String name; + @ExcelProperty("部门状态") + private String enabled; + @ExcelProperty("创建日期") + private Date createTime; +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemDictExportRowVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemDictExportRowVo.java new file mode 100644 index 00000000..872990e6 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemDictExportRowVo.java @@ -0,0 +1,22 @@ +package cn.odboy.system.dal.model; + +import cn.idev.excel.annotation.ExcelProperty; +import cn.odboy.base.KitObject; +import java.util.Date; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemDictExportRowVo extends KitObject { + @ExcelProperty("字典名称") + private String name; + @ExcelProperty("字典描述") + private String description; + @ExcelProperty("字典标签") + private String label; + @ExcelProperty("字典值") + private String value; + @ExcelProperty("创建日期") + private Date createTime; +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemJobExportRowVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemJobExportRowVo.java new file mode 100644 index 00000000..64bce6e2 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemJobExportRowVo.java @@ -0,0 +1,19 @@ +package cn.odboy.system.dal.model; + +import cn.idev.excel.annotation.ExcelProperty; +import cn.odboy.base.KitObject; +import java.util.Date; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemJobExportRowVo extends KitObject { + + @ExcelProperty("岗位名称") + private String name; + @ExcelProperty("岗位状态") + private String enabled; + @ExcelProperty("创建日期") + private Date createTime; +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemLocalStorageExportRowVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemLocalStorageExportRowVo.java new file mode 100644 index 00000000..9554c3b9 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemLocalStorageExportRowVo.java @@ -0,0 +1,25 @@ +package cn.odboy.system.dal.model; + +import cn.idev.excel.annotation.ExcelProperty; +import cn.odboy.base.KitObject; +import java.util.Date; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemLocalStorageExportRowVo extends KitObject { + + @ExcelProperty(value = "文件名") + private String realName; + @ExcelProperty(value = "备注名") + private String name; + @ExcelProperty(value = "文件类型") + private String type; + @ExcelProperty(value = "文件大小") + private String size; + @ExcelProperty(value = "创建者") + private String createBy; + @ExcelProperty(value = "创建日期") + private Date createTime; +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuExportRowVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuExportRowVo.java new file mode 100644 index 00000000..e23f61de --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuExportRowVo.java @@ -0,0 +1,27 @@ +package cn.odboy.system.dal.model; + +import cn.idev.excel.annotation.ExcelProperty; +import cn.odboy.base.KitObject; +import java.util.Date; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemMenuExportRowVo extends KitObject { + + @ExcelProperty("菜单标题") + private String title; + @ExcelProperty("菜单类型") + private String type; + @ExcelProperty("权限标识") + private String permission; + @ExcelProperty("外链菜单") + private String iFrame; + @ExcelProperty("菜单可见") + private String hidden; + @ExcelProperty("是否缓存") + private String cache; + @ExcelProperty("创建日期") + private Date createTime; +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemOssStorageExportRowVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemOssStorageExportRowVo.java new file mode 100644 index 00000000..a196dc95 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemOssStorageExportRowVo.java @@ -0,0 +1,29 @@ +package cn.odboy.system.dal.model; + +import cn.idev.excel.annotation.ExcelProperty; +import cn.odboy.base.KitObject; +import java.util.Date; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemOssStorageExportRowVo extends KitObject { + + @ExcelProperty("服务类型") + private String serviceType; + @ExcelProperty("服务地址") + private String endpoint; + @ExcelProperty("存储桶名称") + private String bucketName; + @ExcelProperty("文件名称") + private String fileName; + @ExcelProperty("文件大小") + private String fileSizeDesc; + @ExcelProperty("文件类型") + private String fileMime; + @ExcelProperty("创建人") + private String createBy; + @ExcelProperty("创建日期") + private Date createTime; +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQuartzJobExportRowVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQuartzJobExportRowVo.java new file mode 100644 index 00000000..e7d622f1 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQuartzJobExportRowVo.java @@ -0,0 +1,29 @@ +package cn.odboy.system.dal.model; + +import cn.idev.excel.annotation.ExcelProperty; +import cn.odboy.base.KitObject; +import java.util.Date; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemQuartzJobExportRowVo extends KitObject { + + @ExcelProperty("任务名称") + private String jobName; + @ExcelProperty("Bean名称") + private String beanName; + @ExcelProperty("执行方法") + private String methodName; + @ExcelProperty("参数") + private String params; + @ExcelProperty("表达式") + private String cronExpression; + @ExcelProperty("状态") + private String isPause; + @ExcelProperty("描述") + private String description; + @ExcelProperty("创建日期") + private Date createTime; +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQuartzLogExportRowVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQuartzLogExportRowVo.java new file mode 100644 index 00000000..4be2d0e4 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQuartzLogExportRowVo.java @@ -0,0 +1,30 @@ +package cn.odboy.system.dal.model; + +import cn.idev.excel.annotation.ExcelProperty; +import cn.odboy.base.KitObject; +import java.util.Date; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemQuartzLogExportRowVo extends KitObject { + @ExcelProperty("任务名称") + private String jobName; + @ExcelProperty("Bean名称") + private String beanName; + @ExcelProperty("执行方法") + private String methodName; + @ExcelProperty("参数") + private String params; + @ExcelProperty("表达式") + private String cronExpression; + @ExcelProperty("异常详情") + private String exceptionDetail; + @ExcelProperty("耗时/毫秒") + private Long time; + @ExcelProperty("状态") + private String status; + @ExcelProperty("创建日期") + private Date createTime; +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleExportRowVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleExportRowVo.java new file mode 100644 index 00000000..5fde2e02 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleExportRowVo.java @@ -0,0 +1,20 @@ +package cn.odboy.system.dal.model; + +import cn.idev.excel.annotation.ExcelProperty; +import cn.odboy.base.KitObject; +import java.util.Date; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemRoleExportRowVo extends KitObject { + @ExcelProperty("角色名称") + private String name; + @ExcelProperty("角色级别") + private Integer level; + @ExcelProperty("描述") + private String description; + @ExcelProperty("角色名称") + private Date createTime; +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserExportRowVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserExportRowVo.java new file mode 100644 index 00000000..da974cd7 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserExportRowVo.java @@ -0,0 +1,32 @@ +package cn.odboy.system.dal.model; + +import cn.idev.excel.annotation.ExcelProperty; +import cn.odboy.base.KitObject; +import java.util.Date; +import java.util.List; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemUserExportRowVo extends KitObject { + + @ExcelProperty("用户名") + private String username; + @ExcelProperty("角色") + private String roles; + @ExcelProperty("部门") + private String dept; + @ExcelProperty("岗位") + private String jobs; + @ExcelProperty("邮箱") + private String email; + @ExcelProperty("状态") + private String status; + @ExcelProperty("手机号码") + private String mobile; + @ExcelProperty("修改密码的时间") + private Date updatePwdTime; + @ExcelProperty("创建日期") + private Date createTime; +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserOnlineExportRowVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserOnlineExportRowVo.java new file mode 100644 index 00000000..e85c86c4 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserOnlineExportRowVo.java @@ -0,0 +1,24 @@ +package cn.odboy.system.dal.model; + +import cn.idev.excel.annotation.ExcelProperty; +import cn.odboy.base.KitObject; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemUserOnlineExportRowVo extends KitObject { + + @ExcelProperty("用户名") + private String userName; + @ExcelProperty("部门") + private String dept; + @ExcelProperty("登录IP") + private String ip; + @ExcelProperty("登录地点") + private String address; + @ExcelProperty("浏览器") + private String browser; + @ExcelProperty("登录日期") + private String loginTime; +} \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java similarity index 95% rename from cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java rename to cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java index 2a8fc92c..407481c4 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java @@ -1,180 +1,180 @@ -/* - * Copyright 2021-2025 Odboy - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.odboy.system.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import cn.odboy.base.KitPageResult; -import cn.odboy.framework.exception.BadRequestException; -import cn.odboy.framework.properties.AppProperties; -import cn.odboy.framework.properties.model.StorageOSSModel; -import cn.odboy.framework.server.core.KitFileLocalUploadHelper; -import cn.odboy.system.dal.dataobject.SystemOssStorageTb; -import cn.odboy.system.dal.model.SystemOssStorageVo; -import cn.odboy.system.dal.model.SystemQueryStorageArgs; -import cn.odboy.system.dal.mysql.SystemOssStorageMapper; -import cn.odboy.system.framework.storage.minio.MinioRepository; -import cn.odboy.system.service.SystemOssStorageService; -import cn.odboy.util.KitDateUtil; -import cn.odboy.util.KitFileUtil; -import cn.odboy.util.KitPageUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import javax.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; - -/** - *

- * OSS存储 服务实现类 - *

- * - * @author codegen - * @since 2025-07-15 - */ -@Service -public class SystemOssStorageServiceImpl extends ServiceImpl - implements SystemOssStorageService { - - @Autowired - private MinioRepository minioRepository; - @Autowired - private AppProperties properties; - @Autowired - private KitFileLocalUploadHelper fileLocalUploadHelper; - @Autowired - private SystemOssStorageMapper systemOssStorageMapper; - - @Override - public KitPageResult searchOssStorage(SystemQueryStorageArgs args, - Page page) { - IPage ossStorageTbs = this.selectOssStorageByArgs(args, page); - IPage convert = ossStorageTbs.convert(c -> { - SystemOssStorageVo storageVo = BeanUtil.copyProperties(c, SystemOssStorageVo.class); - storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize())); - return storageVo; - }); - return KitPageUtil.toPage(convert); - } - - private IPage selectOssStorageByArgs(SystemQueryStorageArgs args, - Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (args != null) { - wrapper.and(StrUtil.isNotBlank(args.getBlurry()), - c -> c.like(SystemOssStorageTb::getFileName, args.getBlurry()).or() - .like(SystemOssStorageTb::getFilePrefix, args.getBlurry()).or() - .like(SystemOssStorageTb::getFileMime, args.getBlurry()).or() - .like(SystemOssStorageTb::getFileMd5, args.getBlurry())); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemOssStorageTb::getUpdateTime, args.getCreateTime().get(0), - args.getCreateTime().get(1)); - } - } - wrapper.orderByAsc(SystemOssStorageTb::getId); - return systemOssStorageMapper.selectPage(page, wrapper); - } - - @Override - public List queryOssStorage(SystemQueryStorageArgs args) { - // 防止刷数据 - Page page = new Page<>(1, 500); - return searchOssStorage(args, page).getContent(); - } - - @Override - public void exportOssStorageExcel(List ossStorages, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemOssStorageVo ossStorage : ossStorages) { - Map map = new LinkedHashMap<>(); - map.put("服务类型", ossStorage.getServiceType()); - map.put("服务地址", ossStorage.getEndpoint()); - map.put("存储桶名称", ossStorage.getBucketName()); - map.put("文件名称", ossStorage.getFileName()); - map.put("文件大小", ossStorage.getFileSizeDesc()); - map.put("文件类型", ossStorage.getFileMime()); - map.put("创建人", ossStorage.getCreateBy()); - map.put("创建日期", ossStorage.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String uploadFile(MultipartFile file) { - String originalFilename = file.getOriginalFilename(); - if (StrUtil.isBlank(originalFilename)) { - throw new BadRequestException("文件名不能为空"); - } - StorageOSSModel ossConfig = properties.getOss(); - long fileSize = file.getSize(); - String contentType = file.getContentType(); - KitFileUtil.checkSize(ossConfig.getMaxSize(), fileSize); - // 按天分组 - String nowDateStr = KitDateUtil.getNowDateStr(); - // 上传到本地临时目录 - File tempFile = KitFileUtil.upload(file, fileLocalUploadHelper.getPath() + nowDateStr + File.separator); - if (tempFile == null) { - throw new BadRequestException("上传失败"); - } - // 校验文件md5, 看是否已存在云端(不确定, 可能云端已经删除, 但是正常来说云端是不允许私自删除的, 所以这里忽略云端不存在的情况) - String md5 = KitFileUtil.getMd5(tempFile); - SystemOssStorageTb systemOssStorageTb = this.getOssStorageByMd5(md5); - if (systemOssStorageTb != null) { - // 重新生成7天链接 - return minioRepository.generatePreviewUrl(systemOssStorageTb.getObjectName()); - } - // 上传到OSS - SystemOssStorageTb storageTb = minioRepository.upload(tempFile, originalFilename, fileSize, contentType, md5); - if (storageTb == null) { - throw new BadRequestException("文件上传失败"); - } - save(storageTb); - return minioRepository.generatePreviewUrl(storageTb.getObjectName()); - } - - /** - * 多选删除 - * - * @param ids / - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteFileByIds(Long[] ids) { - for (Long id : ids) { - SystemOssStorageTb storage = getById(id); - minioRepository.removeBucketFile(storage.getObjectName()); - removeById(storage); - } - } - - private SystemOssStorageTb getOssStorageByMd5(String md5) { - return lambdaQuery().eq(SystemOssStorageTb::getFileMd5, md5).one(); - } -} +/* + * Copyright 2021-2025 Odboy + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cn.odboy.system.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.odboy.base.KitPageResult; +import cn.odboy.framework.exception.BadRequestException; +import cn.odboy.framework.properties.AppProperties; +import cn.odboy.framework.properties.model.StorageOSSModel; +import cn.odboy.framework.server.core.KitFileLocalUploadHelper; +import cn.odboy.system.dal.dataobject.SystemOssStorageTb; +import cn.odboy.system.dal.model.SystemOssStorageVo; +import cn.odboy.system.dal.model.SystemQueryStorageArgs; +import cn.odboy.system.dal.mysql.SystemOssStorageMapper; +import cn.odboy.system.framework.storage.minio.MinioRepository; +import cn.odboy.system.service.SystemOssStorageService; +import cn.odboy.util.KitDateUtil; +import cn.odboy.util.KitFileUtil; +import cn.odboy.util.KitPageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +/** + *

+ * OSS存储 Minio服务实现类 + *

+ * + * @author codegen + * @since 2025-07-15 + */ +@Service +public class SystemMinioStorageServiceImpl extends ServiceImpl + implements SystemOssStorageService { + + @Autowired + private MinioRepository minioRepository; + @Autowired + private AppProperties properties; + @Autowired + private KitFileLocalUploadHelper fileLocalUploadHelper; + @Autowired + private SystemOssStorageMapper systemOssStorageMapper; + + @Override + public KitPageResult searchOssStorage(SystemQueryStorageArgs args, + Page page) { + IPage ossStorageTbs = this.selectOssStorageByArgs(args, page); + IPage convert = ossStorageTbs.convert(c -> { + SystemOssStorageVo storageVo = BeanUtil.copyProperties(c, SystemOssStorageVo.class); + storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize())); + return storageVo; + }); + return KitPageUtil.toPage(convert); + } + + private IPage selectOssStorageByArgs(SystemQueryStorageArgs args, + Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (args != null) { + wrapper.and(StrUtil.isNotBlank(args.getBlurry()), + c -> c.like(SystemOssStorageTb::getFileName, args.getBlurry()).or() + .like(SystemOssStorageTb::getFilePrefix, args.getBlurry()).or() + .like(SystemOssStorageTb::getFileMime, args.getBlurry()).or() + .like(SystemOssStorageTb::getFileMd5, args.getBlurry())); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemOssStorageTb::getUpdateTime, args.getCreateTime().get(0), + args.getCreateTime().get(1)); + } + } + wrapper.orderByAsc(SystemOssStorageTb::getId); + return systemOssStorageMapper.selectPage(page, wrapper); + } + + @Override + public List queryOssStorage(SystemQueryStorageArgs args) { + // 防止刷数据 + Page page = new Page<>(1, 500); + return searchOssStorage(args, page).getContent(); + } + + @Override + public void exportOssStorageExcel(List ossStorages, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemOssStorageVo ossStorage : ossStorages) { + Map map = new LinkedHashMap<>(); + map.put("服务类型", ossStorage.getServiceType()); + map.put("服务地址", ossStorage.getEndpoint()); + map.put("存储桶名称", ossStorage.getBucketName()); + map.put("文件名称", ossStorage.getFileName()); + map.put("文件大小", ossStorage.getFileSizeDesc()); + map.put("文件类型", ossStorage.getFileMime()); + map.put("创建人", ossStorage.getCreateBy()); + map.put("创建日期", ossStorage.getCreateTime()); + list.add(map); + } + KitFileUtil.downloadExcel(list, response); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String uploadFile(MultipartFile file) { + String originalFilename = file.getOriginalFilename(); + if (StrUtil.isBlank(originalFilename)) { + throw new BadRequestException("文件名不能为空"); + } + StorageOSSModel ossConfig = properties.getOss(); + long fileSize = file.getSize(); + String contentType = file.getContentType(); + KitFileUtil.checkSize(ossConfig.getMaxSize(), fileSize); + // 按天分组 + String nowDateStr = KitDateUtil.getNowDateStr(); + // 上传到本地临时目录 + File tempFile = KitFileUtil.upload(file, fileLocalUploadHelper.getPath() + nowDateStr + File.separator); + if (tempFile == null) { + throw new BadRequestException("上传失败"); + } + // 校验文件md5, 看是否已存在云端(不确定, 可能云端已经删除, 但是正常来说云端是不允许私自删除的, 所以这里忽略云端不存在的情况) + String md5 = KitFileUtil.getMd5(tempFile); + SystemOssStorageTb systemOssStorageTb = this.getOssStorageByMd5(md5); + if (systemOssStorageTb != null) { + // 重新生成7天链接 + return minioRepository.generatePreviewUrl(systemOssStorageTb.getObjectName()); + } + // 上传到OSS + SystemOssStorageTb storageTb = minioRepository.upload(tempFile, originalFilename, fileSize, contentType, md5); + if (storageTb == null) { + throw new BadRequestException("文件上传失败"); + } + save(storageTb); + return minioRepository.generatePreviewUrl(storageTb.getObjectName()); + } + + /** + * 多选删除 + * + * @param ids / + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteFileByIds(Long[] ids) { + for (Long id : ids) { + SystemOssStorageTb storage = getById(id); + minioRepository.removeBucketFile(storage.getObjectName()); + removeById(storage); + } + } + + private SystemOssStorageTb getOssStorageByMd5(String md5) { + return lambdaQuery().eq(SystemOssStorageTb::getFileMd5, md5).one(); + } +} diff --git a/cutejava/pom.xml b/cutejava/pom.xml index aa21126e..424a5895 100644 --- a/cutejava/pom.xml +++ b/cutejava/pom.xml @@ -367,7 +367,7 @@ cn.idev.excel fastexcel - 1.2.0 + 1.3.0 compile