diff --git a/ruoyi-system/src/main/java/bounty/controller/BountyController.java b/ruoyi-system/src/main/java/bounty/controller/BountyController.java
new file mode 100644
index 0000000..7c47e1b
--- /dev/null
+++ b/ruoyi-system/src/main/java/bounty/controller/BountyController.java
@@ -0,0 +1,52 @@
+package bounty.controller;
+
+import bounty.domain.Bounty;
+import bounty.domain.BountySubmission;
+import bounty.service.BountyService;
+import bounty.service.BountySubmissionService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import java.util.List;
+
+// 悬赏 Controller 类
+@RestController
+@RequestMapping("/bounties")
+public class BountyController {
+    @Autowired
+    private BountyService bountyService;
+
+    @PostMapping
+    public ResponseEntity<?> saveBounty(@RequestBody Bounty bounty) {
+        boolean result = bountyService.saveBounty(bounty);
+        if (result) {
+            return ResponseEntity.ok().build();
+        } else {
+            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
+        }
+    }
+    @GetMapping
+    // 导入 List 类
+    public List<Bounty> getBounties() {  // 移除分页参数，返回 List 而非 IPage
+        return bountyService.getBounties();  // 调用无分页的 Service 方法
+    }
+
+    @GetMapping("/{id}")
+    public ResponseEntity<Bounty> getBountyById(@PathVariable Long id) {
+        Bounty bounty = bountyService.getBountyById(id);
+        if (bounty == null) {
+            return ResponseEntity.notFound().build();
+        } else {
+            return ResponseEntity.ok(bounty);
+        }
+    }
+    // 新增：发布悬赏接口
+    @PostMapping("/publish")
+    public boolean publishBounty(@RequestBody Bounty bounty) {
+        return bountyService.publishBounty(bounty);
+    }
+}
+
diff --git a/ruoyi-system/src/main/java/bounty/controller/BountySubmissionController.java b/ruoyi-system/src/main/java/bounty/controller/BountySubmissionController.java
new file mode 100644
index 0000000..c8098f1
--- /dev/null
+++ b/ruoyi-system/src/main/java/bounty/controller/BountySubmissionController.java
@@ -0,0 +1,142 @@
+package bounty.controller;
+
+import bounty.domain.BountySubmission;
+import bounty.service.BountySubmissionService;
+import bounty.service.FileStorageService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import jakarta.validation.Valid;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.UrlResource;
+import org.springframework.http.*;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.net.MalformedURLException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+
+// 悬赏提交 Controller 类
+@RestController
+@RequestMapping("/bounty-submissions")
+public class BountySubmissionController {
+
+    @Autowired
+    private FileStorageService fileStorageService;
+
+
+
+    // BountySubmission.java
+    private String attachment; // 存储文件路径（如 /uploads/filename.ext）
+
+
+    @Autowired
+    private BountySubmissionService bountySubmissionService;
+
+
+    @PostMapping
+    public ResponseEntity<?> saveBountySubmission(
+            @RequestPart("submission") @Valid BountySubmission submission,
+            @RequestPart("file") MultipartFile file) {
+
+        try {
+            String filePath = fileStorageService.saveFile(file);
+            submission.setAttachment(filePath);
+            boolean saveResult = bountySubmissionService.saveBountySubmission(submission);
+
+            if (saveResult) {
+                return ResponseEntity.ok().body(Map.of("code", 200, "message", "提交成功", "data", submission));
+            } else {
+                return ResponseEntity.status(500).body(Map.of("code", 500, "message", "提交失败"));
+            }
+        } catch (Exception e) {
+            return ResponseEntity.status(500).body(Map.of("code", 500, "message", e.getMessage()));
+        }
+    }
+
+    @GetMapping
+    public IPage<BountySubmission> getBountySubmissions(
+            @RequestParam(defaultValue = "1") long current,
+            @RequestParam(defaultValue = "10") long size,
+            @RequestParam Long bountyId) {
+        Page<BountySubmission> page = new Page<>(current, size);
+        IPage<BountySubmission> result = bountySubmissionService.getBountySubmissionsByPage(page, bountyId);
+
+        // 👇 新增：打印分页数据
+        System.out.println("【分页数据】bountyId=" + bountyId + ", 数据量=" + result.getRecords().size());
+        result.getRecords().forEach(submission -> {
+            System.out.println("【附件路径】" + submission.getAttachment());
+        });
+
+        return result;
+    }
+
+    // ✅ 仅处理文件上传（保持原逻辑）
+    @PostMapping("/upload")
+    public String uploadAttachment(@RequestParam("file") MultipartFile file) {
+        return fileStorageService.saveFile(file);
+    }
+
+    @GetMapping("/download")
+    public ResponseEntity<Resource> downloadAttachment(@RequestParam String filename) {
+        try {
+            // ✅ 只使用文件名（避免重复拼接）
+            Path uploadDir = Paths.get("uploads/");
+            Path filePath = uploadDir.resolve(filename).normalize();
+
+            if (!filePath.startsWith(uploadDir)) {
+                return ResponseEntity.status(HttpStatus.FORBIDDEN).body(null);
+            }
+
+            Resource resource = new UrlResource(filePath.toUri());
+
+            if (resource.exists() && resource.isReadable()) {
+                HttpHeaders headers = new HttpHeaders();
+                headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+                headers.setContentDisposition(ContentDisposition.builder("attachment")
+                        .filename(filename, StandardCharsets.UTF_8)
+                        .build());
+                return ResponseEntity.ok()
+                        .headers(headers)
+                        .body(resource);
+            } else {
+                return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
+            }
+        } catch (MalformedURLException e) {
+            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
+        }
+    }
+
+    @PutMapping("/{id}/adopt")
+    public ResponseEntity<?> adoptSubmission(@PathVariable Long id) {
+        try {
+            boolean result = bountySubmissionService.adoptSubmission(id);
+
+            // 使用 HashMap 替代 Map.of()
+            Map<String, Object> response = new HashMap<>();
+            if (result) {
+                response.put("code", 200);
+                response.put("message", "采纳成功");
+                return ResponseEntity.ok(response);
+            } else {
+                response.put("code", 500);
+                response.put("message", "采纳失败");
+                return ResponseEntity.status(500).body(response);
+            }
+        } catch (Exception e) {
+            Map<String, Object> errorResponse = new HashMap<>();
+            errorResponse.put("code", 500);
+            errorResponse.put("message", e.getMessage() != null ? e.getMessage() : "未知错误");
+
+            return ResponseEntity.status(500).body(errorResponse);
+        }
+    }
+
+
+    // BountySubmissionController.java
+
+}
diff --git a/ruoyi-system/src/main/java/bounty/domain/Bounty.java b/ruoyi-system/src/main/java/bounty/domain/Bounty.java
new file mode 100644
index 0000000..f0236f2
--- /dev/null
+++ b/ruoyi-system/src/main/java/bounty/domain/Bounty.java
@@ -0,0 +1,97 @@
+package bounty.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List; // 导入List类
+
+// 悬赏实体类
+@Data
+@TableName("bounty")
+public class Bounty {
+    @TableId(type = IdType.AUTO) // 添加自增策略
+    private Long id;
+    private String title;
+    private String description;
+    private BigDecimal reward;
+    private Long creator_id;
+    private Date deadline;
+
+    //0代表发布后，还没有人回复这个悬赏   1代表这个悬赏有人回复了
+    private Integer status;
+    private Date createTime;
+
+    private List<BountySubmission> submissions;
+    public void setSubmissions(List<BountySubmission> submissions) {
+        this.submissions = submissions;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public BigDecimal getReward() {
+        return reward;
+    }
+
+    public void setReward(BigDecimal reward) {
+        this.reward = reward;
+    }
+
+    public Long getCreator_id() {
+        return creator_id;
+    }
+
+    public void setCreator_id(Long creator_id) {
+        this.creator_id = creator_id;
+    }
+
+    public Date getDeadline() {
+        return deadline;
+    }
+
+    public void setDeadline(Date deadline) {
+        this.deadline = deadline;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+}
+
diff --git a/ruoyi-system/src/main/java/bounty/domain/BountySubmission.java b/ruoyi-system/src/main/java/bounty/domain/BountySubmission.java
new file mode 100644
index 0000000..508e566
--- /dev/null
+++ b/ruoyi-system/src/main/java/bounty/domain/BountySubmission.java
@@ -0,0 +1,77 @@
+package bounty.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+// 悬赏提交实体类
+@Data
+@TableName("bounty_submissions")
+public class BountySubmission {
+    @TableId
+    private Long id;
+    private Long bountyId;
+    private Long userId;
+    private String content;
+    private String attachment;
+    private Integer status;
+    private Date createTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getBountyId() {
+        return bountyId;
+    }
+
+    public void setBountyId(Long bountyId) {
+        this.bountyId = bountyId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getAttachment() {
+        return attachment;
+    }
+
+    public void setAttachment(String attachment) {
+        this.attachment = attachment;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+}
diff --git a/ruoyi-system/src/main/java/bounty/mapper/BountyMapper.java b/ruoyi-system/src/main/java/bounty/mapper/BountyMapper.java
new file mode 100644
index 0000000..aadf152
--- /dev/null
+++ b/ruoyi-system/src/main/java/bounty/mapper/BountyMapper.java
@@ -0,0 +1,25 @@
+package bounty.mapper;
+
+import bounty.domain.Bounty;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import java.util.List;
+
+// 悬赏 Mapper 接口
+@Mapper
+public interface BountyMapper extends BaseMapper<Bounty> {
+// 导入 List 类
+    //IPage<Bounty> selectPage(Page<Bounty> page);
+    // 新增与 XML 中 insert 方法匹配的接口声明
+    int insert(Bounty bounty);
+
+    Bounty selectById(Long id);
+
+    // 新增：定义 selectList 方法
+    List<Bounty> selectList();  //
+
+}
+
diff --git a/ruoyi-system/src/main/java/bounty/mapper/BountySubmissionMapper.java b/ruoyi-system/src/main/java/bounty/mapper/BountySubmissionMapper.java
new file mode 100644
index 0000000..c3eca40
--- /dev/null
+++ b/ruoyi-system/src/main/java/bounty/mapper/BountySubmissionMapper.java
@@ -0,0 +1,25 @@
+package bounty.mapper;
+
+import bounty.domain.BountySubmission;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PutMapping;
+
+import java.util.List;
+import java.util.Map;
+
+// 悬赏提交 Mapper 接口
+@Mapper
+public interface BountySubmissionMapper extends BaseMapper<BountySubmission> {
+    // 与 XML 中 id="getBountySubmissionsByPage" 的 SQL 匹配
+    IPage<BountySubmission> getBountySubmissionsByPage(Page<BountySubmission> page, @Param("bountyId") Long bountyId);
+    // 导入 List 类
+    List<BountySubmission> getSubmissionsByBountyId(@Param("bountyId") Long bountyId);
+}
+
+
diff --git a/ruoyi-system/src/main/java/bounty/service/BountyService.java b/ruoyi-system/src/main/java/bounty/service/BountyService.java
new file mode 100644
index 0000000..a65e487
--- /dev/null
+++ b/ruoyi-system/src/main/java/bounty/service/BountyService.java
@@ -0,0 +1,26 @@
+package bounty.service;
+
+import bounty.domain.Bounty;
+import bounty.domain.BountySubmission;
+import bounty.mapper.BountyMapper;
+import bounty.mapper.BountySubmissionMapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+import java.util.List;
+
+// 悬赏 Service 接口
+public interface BountyService {
+    boolean saveBounty(Bounty bounty);
+    IPage<Bounty> getBountiesByPage(Page<Bounty> page);
+    Bounty getBountyById(Long id);
+     // 新增：发布悬赏（带业务校验）
+     boolean publishBounty(Bounty bounty);
+     List<Bounty> getBounties();  //新增直接获得所有悬赏
+}
+
+
diff --git a/ruoyi-system/src/main/java/bounty/service/BountyServiceImpl.java b/ruoyi-system/src/main/java/bounty/service/BountyServiceImpl.java
new file mode 100644
index 0000000..fd6d635
--- /dev/null
+++ b/ruoyi-system/src/main/java/bounty/service/BountyServiceImpl.java
@@ -0,0 +1,53 @@
+package bounty.service;
+
+import bounty.domain.Bounty;
+import bounty.mapper.BountyMapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.SecurityUtils; // 导入 Ruoyi 安全工具类
+import org.springframework.stereotype.Service;
+import java.util.List;
+
+@Service
+public class BountyServiceImpl extends ServiceImpl<BountyMapper, Bounty> implements BountyService {
+    @Override
+    public boolean saveBounty(Bounty bounty) {
+        return this.save(bounty);
+    }
+
+    @Override
+    public IPage<Bounty> getBountiesByPage(Page<Bounty> page) {
+        QueryWrapper<Bounty> wrapper = new QueryWrapper<>();
+        return this.page(page, wrapper);
+    }
+
+    @Override
+    public Bounty getBountyById(Long id) {
+        return this.getById(id);
+    }
+
+    @Override
+    public boolean publishBounty(Bounty bounty) {
+        // 校验标题不能为空
+        if (bounty.getTitle() == null || bounty.getTitle().trim().isEmpty()) {
+            throw new IllegalArgumentException("悬赏标题不能为空");
+        }
+
+        // 获取当前用户 ID 并设置到 Bounty 对象
+        Long currentUserId = SecurityUtils.getUserId(); // 使用 Ruoyi 工具类获取用户 ID
+        bounty.setCreator_id(currentUserId); // 设置 creator_id（需与实体类字段名一致）
+        // 设置默认状态（假设 1 为已发布）
+        bounty.setStatus(1);
+        return this.save(bounty);
+    }
+
+
+    @Override
+    public List<Bounty> getBounties() {
+    // 直接调用 MyBatis-Plus 的 list 方法查询所有数据（可根据需求添加查询条件）
+        return baseMapper.selectList();  // null 表示无查询条件，查询所有
+    }
+
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/bounty/service/BountySubmissionService.java b/ruoyi-system/src/main/java/bounty/service/BountySubmissionService.java
new file mode 100644
index 0000000..707f54c
--- /dev/null
+++ b/ruoyi-system/src/main/java/bounty/service/BountySubmissionService.java
@@ -0,0 +1,14 @@
+package bounty.service;
+
+import bounty.domain.BountySubmission;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+// 悬赏提交 Service 接口
+public interface BountySubmissionService {
+    boolean saveBountySubmission(BountySubmission bountySubmission);
+    IPage<BountySubmission> getBountySubmissionsByPage(Page<BountySubmission> page, Long bountyId);
+    boolean adoptSubmission(Long submissionId);
+}
+
+
diff --git a/ruoyi-system/src/main/java/bounty/service/BountySubmissionServiceImpl.java b/ruoyi-system/src/main/java/bounty/service/BountySubmissionServiceImpl.java
new file mode 100644
index 0000000..4300911
--- /dev/null
+++ b/ruoyi-system/src/main/java/bounty/service/BountySubmissionServiceImpl.java
@@ -0,0 +1,154 @@
+package bounty.service;
+
+import bounty.domain.Bounty;
+import bounty.domain.BountySubmission;
+import bounty.mapper.BountyMapper;
+import bounty.mapper.BountySubmissionMapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.SecurityUtils;
+import org.mybatis.spring.MyBatisSystemException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Date;
+
+@Service
+public class BountySubmissionServiceImpl extends ServiceImpl<BountySubmissionMapper, BountySubmission> implements BountySubmissionService {
+
+    @Autowired
+    private BountyMapper bountyMapper; // 注入 BountyMapper 校验悬赏存在性
+
+    @Override
+    public boolean saveBountySubmission(BountySubmission bountySubmission) {
+        // 校验 1：悬赏 ID 不能为空
+        Long bountyId = bountySubmission.getBountyId();
+        if (bountyId == null) {
+            throw new IllegalArgumentException("悬赏 ID 不能为空");
+        }
+
+        // 校验 2：目标悬赏是否存在
+        Bounty targetBounty = bountyMapper.selectById(bountyId);
+        if (targetBounty == null) {
+            throw new IllegalArgumentException("无效的悬赏 ID，未找到对应悬赏");
+        }
+
+        // 校验 3：提交内容不能为空
+        String content = bountySubmission.getContent();
+        if (!StringUtils.hasText(content)) {
+            throw new IllegalArgumentException("提交内容不能为空");
+        }
+
+        // 自动填充当前用户 ID（需用户已登录）
+        Long currentUserId = SecurityUtils.getUserId();
+        bountySubmission.setUserId(currentUserId);
+
+
+        // 调用 MyBatis-Plus 保存方法
+        boolean saveResult = this.save(bountySubmission);
+
+        // 新增：保存成功后，更新对应悬赏的状态为1（已回复）
+        if (saveResult) {
+            targetBounty.setStatus(1); // 将悬赏状态改为1
+            bountyMapper.updateById(targetBounty); // 执行更新
+        }
+
+        return saveResult;
+    }
+
+    @Override
+    public IPage<BountySubmission> getBountySubmissionsByPage(Page<BountySubmission> page, Long bountyId) {
+        QueryWrapper<BountySubmission> wrapper = new QueryWrapper<>();
+        wrapper.eq("bounty_id", bountyId);
+        return this.page(page, wrapper);
+    }
+
+    private static final Logger log = LoggerFactory.getLogger(BountySubmissionServiceImpl.class);
+
+    @Override
+    public boolean adoptSubmission(Long submissionId) {
+        log.info("【采纳流程开始】submissionId={}, 当前时间={}", submissionId, new Date());
+
+        try {
+            // 参数校验
+            if (submissionId == null || submissionId <= 0) {
+                log.warn("【参数校验失败】submissionId为空或无效");
+                throw new IllegalArgumentException("无效的回复ID");
+            }
+
+            // 获取回复详情
+            BountySubmission submission = this.getById(submissionId);
+            if (submission == null) {
+                log.warn("【回复不存在】submissionId={}", submissionId);
+                throw new IllegalArgumentException("无效的回复ID");
+            }
+
+            if (submission.getId() == null || submission.getBountyId() == null) {
+                log.warn("【无效提交数据】submissionId={}", submissionId);
+                throw new IllegalArgumentException("提交数据不完整");
+            }
+
+
+            log.debug("【原始回复数据】{}", submission);
+
+            // 获取关联悬赏
+            Bounty bounty = bountyMapper.selectById(submission.getBountyId());
+
+            if (bounty == null) {
+                log.warn("【关联悬赏不存在】bountyId={}", submission.getBountyId());
+                throw new IllegalArgumentException("关联悬赏不存在");
+            }
+
+            // 用户权限校验
+            Long currentUserId = SecurityUtils.getUserId();
+            if (currentUserId == null) {
+                log.warn("【用户未登录】");
+                throw new IllegalArgumentException("用户未登录");
+            }
+
+
+            if (!bounty.getCreator_id().equals(currentUserId)) {
+                log.warn("【权限不足】用户ID={} 试图访问悬赏ID={}", currentUserId, bounty.getId());
+                throw new IllegalArgumentException("无权操作");
+            }
+
+            // 状态校验
+            if (submission.getStatus() == 1) {
+                log.warn("【重复采纳】submissionId={}", submissionId);
+                throw new IllegalArgumentException("该回复已被采纳");
+            }
+
+            log.info("【更新前对象】{}", submission);
+
+            // 执行更新
+            submission.setStatus(1);
+            boolean submissionResult = this.updateById(submission);
+            log.info("【更新后对象】{}", this.getById(submissionId));
+
+
+            log.info("【操作结果】submissionResult={}, 新状态={}", submissionResult, submission.getStatus());
+
+            return submissionResult;
+        } catch (MyBatisSystemException e) {
+            // 显式捕获 MyBatis 异常
+            log.error("【MyBatis 异常】submissionId={}, rootCause={}", submissionId, e.getRootCause());
+            log.error("【异常详情】", e); // 打印完整堆栈
+            throw new RuntimeException("MyBatis 错误: " + e.getRootCause(), e);
+
+    } catch (IllegalArgumentException e) {
+            log.warn("【参数异常】submissionId={}, message={}", submissionId, e.getMessage());
+            throw e;
+        } catch (Exception e) {
+            log.error("【采纳异常】submissionId={}, 错误={}", submissionId, e.getMessage(), e);
+            log.error("【未分类异常】submissionId={}, exceptionClass={}", submissionId, e.getClass().getName());
+            log.error("【异常详情】", e); // 打印完整堆栈
+            throw e;
+        }
+    }
+}
diff --git a/ruoyi-system/src/main/java/bounty/service/FileStorageService.java b/ruoyi-system/src/main/java/bounty/service/FileStorageService.java
new file mode 100644
index 0000000..9f12122
--- /dev/null
+++ b/ruoyi-system/src/main/java/bounty/service/FileStorageService.java
@@ -0,0 +1,55 @@
+package bounty.service;
+
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.UUID;
+
+@Service
+public class FileStorageService {
+    public String saveFile(MultipartFile file) {
+        try {
+            // 1. 校验文件名非空
+            String originalFilename = file.getOriginalFilename();
+            if (originalFilename == null || originalFilename.isEmpty()) {
+                throw new IllegalArgumentException("上传文件名不能为空");
+            }
+
+            // 2. 生成唯一文件名
+            String fileExtension = "";
+            int dotIndex = originalFilename.lastIndexOf(".");
+            if (dotIndex > 0) {
+                fileExtension = originalFilename.substring(dotIndex);
+            }
+            String newFilename = UUID.randomUUID() + fileExtension;
+
+            // 👇 新增：打印文件名生成结果（用于调试）
+            System.out.println("【生成文件名】" + newFilename);
+
+            // 3. 指定存储路径
+            Path uploadDir = Paths.get("uploads/");
+            if (!Files.exists(uploadDir)) {
+                Files.createDirectories(uploadDir);
+            }
+
+            // 👇 新增：打印完整路径（用于调试）
+            Path filePath = uploadDir.resolve(newFilename);
+            System.out.println("【文件保存路径】" + filePath.toAbsolutePath());
+
+            // 4. 写入文件
+            Files.write(filePath, file.getBytes());
+
+            // 5. 返回访问路径
+            return "/uploads/" + newFilename;
+        } catch (IOException e) {
+            // 👇 新增：记录异常信息
+            System.err.println("【文件上传失败】" + e.getMessage());
+            throw new RuntimeException("文件上传失败: " + e.getMessage(), e);
+        }
+    }
+}
+
