diff --git a/bonus-admin/src/main/java/com/bonus/web/controller/common/CommonDownloadModel.java b/bonus-admin/src/main/java/com/bonus/web/controller/common/CommonDownloadModel.java new file mode 100644 index 0000000..8b4432b --- /dev/null +++ b/bonus-admin/src/main/java/com/bonus/web/controller/common/CommonDownloadModel.java @@ -0,0 +1,32 @@ +package com.bonus.web.controller.common; + +import com.bonus.web.service.common.CommonDownloadService; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @className:CommonDownloadModel + * @author:cwchen + * @date:2025-10-31-14:19 + * @version:1.0 + * @description:下载模板的公共方法 + */ +@RestController +@RequestMapping("/commonDownload") +public class CommonDownloadModel { + + @Resource(name = "CommonDownloadService") + private CommonDownloadService service; + + @ApiOperation(value = "下载工器具模板", notes = "下载工器具模板") + @GetMapping("downLoadToolModel") + public void downLoadToolModel(HttpServletRequest request, HttpServletResponse response) { + service.downLoadToolModel(request,response); + } +} diff --git a/bonus-admin/src/main/java/com/bonus/web/service/common/CommonDownloadService.java b/bonus-admin/src/main/java/com/bonus/web/service/common/CommonDownloadService.java new file mode 100644 index 0000000..eda99d6 --- /dev/null +++ b/bonus-admin/src/main/java/com/bonus/web/service/common/CommonDownloadService.java @@ -0,0 +1,44 @@ +package com.bonus.web.service.common; + +import com.bonus.common.constant.ModelConstants; +import com.bonus.mainDataBase.service.impl.DownloadModelService; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.util.IOUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +/** + * @className:CommonDownloadService + * @author:cwchen + * @date:2025-10-31-14:21 + * @version:1.0 + * @description:下载模板公共方法-业务层 + */ +@Service("CommonDownloadService") +@Slf4j +public class CommonDownloadService { + + @Resource(name = "DownloadModelService") + private DownloadModelService downloadModelService; + + /** + * 下载工器具模板 + * @param request + * @param response + * @return void + * @author cwchen + * @date 2025/10/31 14:25 + */ + public void downLoadToolModel(HttpServletRequest request, HttpServletResponse response) { + downloadModelService.downLoadToolModel(request, response); + } + +} diff --git a/bonus-common/src/main/java/com/bonus/common/constant/ModelConstants.java b/bonus-common/src/main/java/com/bonus/common/constant/ModelConstants.java new file mode 100644 index 0000000..7eeb0c8 --- /dev/null +++ b/bonus-common/src/main/java/com/bonus/common/constant/ModelConstants.java @@ -0,0 +1,14 @@ +package com.bonus.common.constant; + +/** + * @className:ModelConstants + * @author:cwchen + * @date:2025-10-31-14:27 + * @version:1.0 + * @description:模板常量 + */ +public class ModelConstants { + + /**工器具模板*/ + public static final String TOOL_MODEL = "download/tool_model.xlsx"; +} diff --git a/bonus-common/src/main/java/com/bonus/common/utils/DownloadModelUtil.java b/bonus-common/src/main/java/com/bonus/common/utils/DownloadModelUtil.java new file mode 100644 index 0000000..979503c --- /dev/null +++ b/bonus-common/src/main/java/com/bonus/common/utils/DownloadModelUtil.java @@ -0,0 +1,93 @@ +package com.bonus.common.utils; + +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.util.IOUtils; +import org.springframework.stereotype.Component; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +/** + * @className:DownloadModelUtil + * @author:cwchen + * @date:2025-10-31-15:39 + * @version:1.0 + * @description: + */ +@Component(value = "DownloadModelUtil") +@Slf4j +public class DownloadModelUtil { + + public void commonDownLoadExcelModel(HttpServletResponse response, String fileName) { + // 参数校验 + if (response == null || fileName == null || fileName.trim().isEmpty()) { + throw new IllegalArgumentException("Response and fileName must not be null or empty"); + } + + String path = fileName.trim(); + + try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(path); + ServletOutputStream servletOutputStream = response.getOutputStream()) { + + // 检查文件是否存在 + if (inputStream == null) { + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + log.error("File not found: {}", path); + return; + } + + // 设置响应头 + setupResponseHeaders(response, fileName); + + // 拷贝数据 + IOUtils.copy(inputStream, servletOutputStream); + response.flushBuffer(); + + } catch (Exception e) { + log.error("File download failed: {}", e.getMessage(), e); + handleDownloadException(response, e); + } + } + + /** + * 设置下载响应头 + */ + private void setupResponseHeaders(HttpServletResponse response, String fileName) throws IOException { + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding(StandardCharsets.UTF_8.name()); + + // 缓存控制 + response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + response.setHeader("Pragma", "no-cache"); + response.setDateHeader("Expires", 0); + + // 文件名编码 + String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()) + .replaceAll("\\+", "%20"); // 替换+号为%20,确保兼容性 + + // 内容处置头 + String contentDisposition = String.format("attachment; filename=\"%s\"; filename*=utf-8''%s", + encodedFileName, encodedFileName); + response.setHeader("Content-Disposition", contentDisposition); + } + + /** + * 处理下载异常 + */ + private void handleDownloadException(HttpServletResponse response, Exception e) { + try { + if (!response.isCommitted()) { + response.reset(); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + response.setContentType("application/json"); + response.getWriter().write("{\"error\": \"文件下载失败\"}"); + } + } catch (IOException ioException) { + log.error("Error sending error response: {}", ioException.getMessage(), ioException); + } + } +} diff --git a/bonus-mainDatabase/pom.xml b/bonus-mainDatabase/pom.xml index 88ec8e8..1b80b34 100644 --- a/bonus-mainDatabase/pom.xml +++ b/bonus-mainDatabase/pom.xml @@ -21,7 +21,5 @@ com.bonus bonus-common - - \ No newline at end of file diff --git a/bonus-mainDatabase/src/main/java/com/bonus/mainDataBase/service/impl/DownloadModelService.java b/bonus-mainDatabase/src/main/java/com/bonus/mainDataBase/service/impl/DownloadModelService.java new file mode 100644 index 0000000..d518988 --- /dev/null +++ b/bonus-mainDatabase/src/main/java/com/bonus/mainDataBase/service/impl/DownloadModelService.java @@ -0,0 +1,39 @@ +package com.bonus.mainDataBase.service.impl; + +import com.bonus.common.constant.ModelConstants; +import com.bonus.common.utils.DownloadModelUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @className:DownloadModelService + * @author:cwchen + * @date:2025-10-31-14:24 + * @version:1.0 + * @description:下载模板的具体业务逻辑层 + */ +@Service(value = "DownloadModelService") +@Slf4j +public class DownloadModelService { + + @Resource(name = "DownloadModelUtil") + private DownloadModelUtil downloadModelUtil; + + /** + * 下载工器具模板 + * @param request + * @param response + * @return void + * @author cwchen + * @date 2025/10/31 14:28 + */ + public void downLoadToolModel(HttpServletRequest request, HttpServletResponse response) { + downloadModelUtil.commonDownLoadExcelModel(response, ModelConstants.TOOL_MODEL); + } + + +} diff --git a/bonus-mainDatabase/src/main/resources/download/tool_model.xlsx b/bonus-mainDatabase/src/main/resources/download/tool_model.xlsx new file mode 100644 index 0000000..af92fad Binary files /dev/null and b/bonus-mainDatabase/src/main/resources/download/tool_model.xlsx differ