chenrui
2025-03-25 b2174bdc2c7906b0f6fa65be7a8564e64107581f
Merge branch 'radio_frequency' of http://114.132.189.42:9002/r/lims-ruoyi-after into radio_frequency
已修改9个文件
已重命名1个文件
208 ■■■■■ 文件已修改
basic-server/src/main/java/com/ruoyi/basic/controller/WorkShopController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/WorkShopFile.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/WorkShopFileService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/WorkShopService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/WorkShopFileServiceImpl.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/WorkShopServiceImpl.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-druid.yml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/config/MinioConfig.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MinioUtils.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/WorkShopController.java
ÎļþÃû´Ó inspect-server/src/main/java/com/ruoyi/inspect/controller/WorkShopController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.inspect.controller;
package com.ruoyi.basic.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.WorkShopDto;
@@ -42,7 +42,7 @@
    @ApiOperation(value = "车间文件上传")
    @PostMapping("/uploadFile")
    public Result uploadFile(Integer id, MultipartFile file) {
    public Result uploadFile(Integer id, MultipartFile file)throws Exception {
        return Result.success(workShopService.uploadFile(id,file));
    }
@@ -55,6 +55,6 @@
    @ApiOperation(value = "删除附件")
    @DeleteMapping("/delFile")
    public Result<?> delFile(Integer id) {
        return Result.success(workShopFileService.removeById(id));
        return Result.success(workShopFileService.delFile(id));
    }
}
basic-server/src/main/java/com/ruoyi/basic/pojo/WorkShopFile.java
@@ -43,4 +43,7 @@
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("预览地址")
    private String fileMinioUrl;
}
basic-server/src/main/java/com/ruoyi/basic/service/WorkShopFileService.java
@@ -9,5 +9,6 @@
 * @createDate 2024-03-17
 */
public interface WorkShopFileService extends IService<WorkShopFile> {
    int delFile(Integer id);
}
basic-server/src/main/java/com/ruoyi/basic/service/WorkShopService.java
@@ -20,5 +20,5 @@
    int delWorkShop(Integer id);
    int uploadFile(Integer id, MultipartFile file);
    int uploadFile(Integer id, MultipartFile file) throws Exception;
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/WorkShopFileServiceImpl.java
@@ -5,7 +5,11 @@
import com.ruoyi.basic.mapper.WorkShopFileMapper;
import com.ruoyi.basic.pojo.WorkShopFile;
import com.ruoyi.basic.service.WorkShopFileService;
import com.ruoyi.common.utils.file.MinioUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
 * @description é’ˆå¯¹è¡¨ã€work_shop_file(车间附件名称)】的数据库操作Service实现
@@ -14,6 +18,40 @@
@Service
public class WorkShopFileServiceImpl extends ServiceImpl<WorkShopFileMapper, WorkShopFile> implements WorkShopFileService {
    @Resource
    private WorkShopFileMapper workShopFileMapper;
    @Resource
    private MinioUtils minioUtils;
    @Value("${minio.bucketName}")
    private String bucketName;
    @Override
    public int delFile(Integer id) {
        // è‹¥ id ä¸ºç©ºï¼Œç›´æŽ¥è¿”回 0,表示未删除任何记录
        if (id == null) {
            return 0;
        }
        try {
            // æŸ¥è¯¢è¦åˆ é™¤çš„æ–‡ä»¶ä¿¡æ¯
            WorkShopFile file = workShopFileMapper.selectById(id);
            if (file != null && file.getFileUrl() != null) {
                // æ£€æŸ¥ MinIO ä¸­æ–‡ä»¶æ˜¯å¦å­˜åœ¨
                if (minioUtils.objectExists(bucketName, file.getFileUrl())) {
                    // å…ˆåˆ é™¤ MinIO ä¸­çš„对象
                    minioUtils.removeObjectsResult(bucketName, file.getFileUrl());
                }
            }
            // æ‰§è¡Œæ•°æ®åº“删除操作
            int deleteResult = workShopFileMapper.deleteById(id);
            return deleteResult;
        } catch (Exception e) {
            // å¤„理异常,可根据实际情况记录日志或抛出自定义异常
            e.printStackTrace();
            return 0;
        }
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/WorkShopServiceImpl.java
@@ -1,6 +1,5 @@
package com.ruoyi.basic.service.impl;
import cn.hutool.core.lang.UUID;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -10,16 +9,16 @@
import com.ruoyi.basic.pojo.WorkShop;
import com.ruoyi.basic.pojo.WorkShopFile;
import com.ruoyi.basic.service.WorkShopService;
import com.ruoyi.common.core.domain.MinioResult;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.file.MinioUtils;
import com.ruoyi.framework.exception.ErrorException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
 * @description é’ˆå¯¹è¡¨ã€work_shop(车间名称)】的数据库操作Service实现
@@ -33,11 +32,11 @@
    @Resource
    private WorkShopFileMapper workShopFileMapper;
    @Value("${wordUrl}")
    private String wordUrl;
    @Resource
    private MinioUtils minioUtils;
    @Value("${file.path}")
    private String imgUrl;
    @Value("${minio.bucketName}")
    private String bucketName;
    @Override
@@ -58,58 +57,37 @@
    public int delWorkShop(Integer id) {
        return workShopMapper.deleteById(id);
    }
    @Override
    public int uploadFile(Integer id, MultipartFile file) {
        String username = SecurityUtils.getUsername();
        String urlString;
        String pathName;
        String path;
        String filename = file.getOriginalFilename();
        String contentType = file.getContentType();
    public int uploadFile(Integer id, MultipartFile file) throws Exception {
        // åŸºç¡€æ ¡éªŒ
        if (file == null || file.isEmpty()) {
            throw new ErrorException("上传文件为空");
        }
        WorkShopFile workShopFile = new WorkShopFile();
        workShopFile.setWorkShopId(id);
        workShopFile.setFileName(filename);
        if (contentType != null && contentType.startsWith("image/")) {
            // æ˜¯å›¾ç‰‡
            path = imgUrl;
            workShopFile.setType(1);
        } else {
            // æ˜¯æ–‡ä»¶
            path = wordUrl;
            workShopFile.setType(2);
        }
        workShopFile.setFileName(file.getOriginalFilename());
        workShopFile.setName(SecurityUtils.getUsername());
        try {
            // 1. è§£æžç»å¯¹è·¯å¾„(优先使用配置的绝对路径,否则基于项目根目录)
            String basePath = imgUrl.startsWith(File.separator) ? imgUrl : System.getProperty("user.dir") + File.separator + imgUrl;
            File realpath = new File(basePath);
            // 2. åˆ›å»ºç›®å½•(记录日志,检查是否成功)
            if (!realpath.exists()) {
                if (!realpath.mkdirs()) {
                    System.err.println("目录创建失败:{}");
                    return 0;
                }
            String contentType = file.getContentType();
            String category = contentType != null && contentType.startsWith("image/") ? "images" : "docs";
            MinioResult upload = minioUtils.upload(bucketName, file, true);
            // è®°å½•存储路径
            workShopFile.setFileUrl(upload.getBucketFileName());
            workShopFile.setFileMinioUrl(upload.getPreviewExpiry());
            workShopFile.setType(category.equals("images") ? 1 : 2);
            // æ•°æ®åº“操作
            int insertResult = workShopFileMapper.insert(workShopFile);
            if (insertResult <= 0) {
                throw new ErrorException("数据库插入失败");
            }
            // 3. ç”Ÿæˆå”¯ä¸€æ–‡ä»¶å
            String uuid = UUID.randomUUID().toString().replace("-", "");
            String suffix = filename.substring(filename.lastIndexOf("."));
            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "_" + uuid + suffix;
            File targetFile = new File(realpath, pathName);
            // 4. ä¿å­˜æ–‡ä»¶
            file.transferTo(targetFile);
            workShopFile.setFileUrl(pathName);
            workShopFile.setName(username);
            return workShopFileMapper.insert(workShopFile);
            return insertResult;
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("附件上传错误");
            return 0;
            throw new Exception("系统异常: ", e);
        }
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
@@ -1,9 +1,13 @@
package com.ruoyi.web.controller.common;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.utils.file.MinioUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -28,14 +32,16 @@
 */
@RestController
@RequestMapping("/common")
public class CommonController
{
public class CommonController {
    private static final Logger log = LoggerFactory.getLogger(CommonController.class);
    @Autowired
    private ServerConfig serverConfig;
    private static final String FILE_DELIMETER = ",";
    @Resource
    private MinioUtils minioUtils;
    /**
     * é€šç”¨ä¸‹è½½è¯·æ±‚
@@ -160,4 +166,37 @@
            log.error("下载文件失败", e);
        }
    }
    /**
     * é€šç”¨æ–‡ä»¶ä¸‹è½½æ–¹æ³•
     *
     * @param fileUrl  Minio中的文件路径(如:images/2023/report.pdf)
     * @param fileName ä¸‹è½½æ—¶æ˜¾ç¤ºçš„æ–‡ä»¶åï¼ˆå¦‚:年度报告.pdf)
     * @param response HttpServletResponse对象
     */
    @GetMapping("/downloadMinio")
    public void downloadFile(String fileUrl, String fileName, HttpServletResponse response) {
        Logger logger = LoggerFactory.getLogger(this.getClass());
        if (StringUtils.isBlank(fileUrl) || StringUtils.isBlank(fileName)) {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            try (PrintWriter writer = response.getWriter()) {
                writer.write("文件路径和文件名不能为空");
            } catch (IOException e) {
                logger.error("设置响应信息出错", e);
            }
            return;
        }
        String bucketName = "radio-frequency";
        try {
            minioUtils.download(bucketName, fileUrl, fileName, response);
        } catch (Exception e) {
            logger.error("文件下载失败", e);
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            try (PrintWriter writer = response.getWriter()) {
                writer.write("文件下载失败: " + e.getMessage());
            } catch (IOException ioException) {
                logger.error("设置响应信息出错", ioException);
            }
        }
    }
}
ruoyi-admin/src/main/resources/application-druid.yml
@@ -1,4 +1,4 @@
# æœ¬åœ°
# è£…备正式库
# æ•°æ®æºé…ç½®
spring:
@@ -111,12 +111,13 @@
    org.springframework: warn
minio:
  endpoint: http://114.132.189.42/
  port: 7019
  endpoint: http://114.132.189.42:7019
  secure: false
  accessKey: admin
  secretKey: 12345678
  preview-expiry: 24 # é¢„览地址默认24小时
  bucketName: radio-frequency
  publicUrl:
# ç…§ç‰‡å­˜å‚¨è·¯å¾„+++++++++++++++++++++++++++运维需要配置+++++++++++++++++++++++++++
file:
ruoyi-common/src/main/java/com/ruoyi/common/config/MinioConfig.java
@@ -13,14 +13,13 @@
@Data
public class MinioConfig {
    private String endpoint;
    private int port;
    private String accessKey;
    private String secretKey;
    private Boolean secure;
    @Bean
    public MinioClient getMinioClient() {
        return MinioClient.builder().endpoint(endpoint, port, secure)
        return MinioClient.builder().endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
    }
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MinioUtils.java
@@ -167,7 +167,7 @@
            minioResult.setBucketFileName(bucketFilePath);
            // è¿”回永久预览地址
            if (isPreviewExpiry) {
                String previewUrl = getPreviewUrl(bucketFilePath, bucketName, isPreviewExpiry);
                String previewUrl = getPreviewUrl(bucketFilePath, bucketName, true);
                minioResult.setPreviewExpiry(previewUrl);
            }
            minioResult.setOriginalName(originalFileName);
@@ -291,4 +291,23 @@
        }
        return null;
    }
    /**
     *  æ£€æŸ¥ MinIO ä¸­å¯¹è±¡æ˜¯å¦å­˜åœ¨
     * @param bucketName å­˜å‚¨æ¡¶åç§°
     * @param bucketFileName   æ¡¶ä¸­æ–‡ä»¶åç§°
     * @return
     */
    public boolean objectExists(String bucketName, String bucketFileName) {
        try {
            minioClient.statObject(StatObjectArgs.builder()
                    .bucket(bucketName)
                    .object(bucketFileName)
                    .build());
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}