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