diff --git a/src/main/java/com/pt5/pthouduan/controller/RequestResourcesController.java b/src/main/java/com/pt5/pthouduan/controller/RequestResourcesController.java
new file mode 100644
index 0000000..8e730e7
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/controller/RequestResourcesController.java
@@ -0,0 +1,184 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.request_resources;
+import com.pt5.pthouduan.service.RequestResourcesService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * <p>
+ *  求助帖信息前端控制器
+ * </p>
+ *
+ * 功能：创建求助帖、修改金额、删除、按名称/用户查找、计算某名称总金额
+ * 支持上传图片
+ *
+ * @author ym
+ * @since 2025-05-10
+ */
+@CrossOrigin(origins = "http://localhost:5174")
+@Controller
+@RequestMapping("/request")
+public class RequestResourcesController {
+
+    @Autowired
+    private RequestResourcesService requestResourcesService;
+
+    @Value("${torrent.helppost-image-dir}")
+    private String uploadDir;
+
+    // 创建新的求助帖（移除 loaduser 参数）
+    @PostMapping("/create")
+    @ResponseBody
+    public boolean createRequest(
+            @RequestParam("userid") Long userid,
+            @RequestParam("name") String name,
+            @RequestParam("plot") String plot,
+            @RequestParam("money") Integer money,
+            @RequestParam(value = "photo", required = false) MultipartFile photoFile,
+            @RequestParam(value = "year", required = false) Integer year,
+            @RequestParam(value = "country", required = false) String country
+    ) {
+        request_resources request = new request_resources();
+        request.setUserid(userid);
+        request.setLoaduser(null); // 初始为空
+        request.setName(name);
+        request.setPlot(plot);
+        request.setMoney(money);
+        request.setYear(year);
+        request.setCountry(country);
+        request.setRequestTime(LocalDateTime.now());
+
+        if (photoFile != null && !photoFile.isEmpty()) {
+            try {
+                File dir = new File(uploadDir);
+                if (!dir.exists()) {
+                    boolean created = dir.mkdirs();  // 递归创建目录
+                    if (!created) {
+                        throw new IOException("无法创建目录：" + uploadDir);
+                    }
+                }
+                //String coverImageDir = "D:/torrenttest/covers/"; // 封面图片存储目录
+                String filename = System.currentTimeMillis()+"_"+photoFile.getOriginalFilename();
+                Path helprequestImagePath = Paths.get(uploadDir, filename);
+
+                try {
+                    Files.createDirectories(helprequestImagePath.getParent()); // 创建目录
+                    Files.copy(photoFile.getInputStream(), helprequestImagePath, StandardCopyOption.REPLACE_EXISTING);
+                } catch (IOException e) {
+                    throw new RuntimeException("无法存储需求贴图片", e);
+                }
+
+                // 设置访问URL
+                request.setPhoto('/' + uploadDir + filename);
+            } catch (IOException e) {
+                e.printStackTrace();
+                return false;
+            }
+        }
+
+        return requestResourcesService.createRequest(request);
+    }
+
+    // 修改求助帖的金额
+    @PutMapping("/updateMoney/{requestid}")
+    @ResponseBody
+    public boolean updateMoney(@PathVariable Integer requestid, @RequestParam Integer money) {
+        return requestResourcesService.updateMoney(requestid, money);
+    }
+
+    // 删除求助帖
+    @DeleteMapping("/delete/{requestid}")
+    @ResponseBody
+    public boolean deleteRequest(@PathVariable Integer requestid) {
+        return requestResourcesService.deleteRequest(requestid);
+    }
+
+    // 根据名称查找求助帖
+    @GetMapping("/findByName")
+    @ResponseBody
+    public List<request_resources> findByName(@RequestParam String name) {
+        return requestResourcesService.findByName(name);
+    }
+
+    // 根据用户查找求助帖
+    @GetMapping("/findByUserid")
+    @ResponseBody
+    public List<request_resources> findByUserid(@RequestParam Long userid) {
+        return requestResourcesService.findByUserid(userid);
+    }
+
+    // 计算某个名称对应的总金额
+    @GetMapping("/totalMoneyByName")
+    @ResponseBody
+    public Integer getTotalMoneyByName(@RequestParam String name) {
+        return requestResourcesService.calculateTotalMoneyByName(name);
+    }
+
+    // 根据被协助用户（loaduser）查找求助帖
+    @GetMapping("/findByLoaduser")
+    @ResponseBody
+    public List<request_resources> findByLoaduser(@RequestParam Long loaduser) {
+        return requestResourcesService.findByLoaduser(loaduser);
+    }
+
+    // ✅ 新增：根据名称批量更新 loaduser 字段
+    @PostMapping("/updateLoaduserByName")
+    @ResponseBody
+    public boolean updateLoaduserByName(@RequestParam String name, @RequestParam Long loaduser) {
+        return requestResourcesService.updateLoaduserByName(name, loaduser);
+    }
+
+    // ✅ 1. 更新指定 requestid 的 torrentid
+    @PutMapping("/updateTorrentid/{requestid}")
+    @ResponseBody
+    public boolean updateTorrentid(@PathVariable Integer requestid, @RequestParam Long torrentid) {
+        return requestResourcesService.updateTorrentid(requestid, torrentid);
+    }
+
+    // ✅ 2. 查询指定 requestid 的 torrentid
+    @GetMapping("/getTorrentid/{requestid}")
+    @ResponseBody
+    public Long getTorrentid(@PathVariable Integer requestid) {
+        request_resources request = requestResourcesService.findByRequestid(requestid);
+        return request != null ? request.getTorrentid() : null;
+    }
+
+    @GetMapping("/info/{requestid}")
+    @ResponseBody
+    public Map<String, Object> getInfoByRequestId(@PathVariable Integer requestid) {
+        request_resources request = requestResourcesService.findByRequestid(requestid);
+        if (request == null) {
+            return null; // 或返回一个空 Map，或自定义错误处理
+        }
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("torrentid", request.getTorrentid());
+        result.put("money", request.getMoney());
+        result.put("loaduser", request.getLoaduser());
+        return result;
+    }
+
+
+    @GetMapping("/all")
+    @ResponseBody
+    public List<request_resources> getAllRequests() {
+        return requestResourcesService.getAllRequests();
+    }
+
+}
diff --git a/src/main/java/com/pt5/pthouduan/entity/request_resources.java b/src/main/java/com/pt5/pthouduan/entity/request_resources.java
new file mode 100644
index 0000000..68800c6
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/entity/request_resources.java
@@ -0,0 +1,163 @@
+package com.pt5.pthouduan.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author ym
+ * @since 2025-05-10
+ */
+@TableName("request_resources")
+public class request_resources implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId("requestid")
+    private Integer requestid;
+
+    private Integer money;
+
+    private Integer year;
+
+    private String name;
+
+    private String plot;
+
+    private Long userid;
+
+    private Long loaduser;
+
+    private Long torrentid;
+
+
+    private String photo;
+
+
+    private String country;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime requesttime;
+
+    public Integer getRequestid() {
+        return requestid;
+    }
+
+    public void setRequestid(Integer requestid) {
+        this.requestid = requestid;
+    }
+
+
+
+    public String getName() {//获取标签
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+    public String getPlot() {//获取标签
+        return plot;
+    }
+
+    public void setPlot(String plot) {
+        this.plot = plot;
+    }
+
+
+    public Long getUserid() {
+        return userid;
+    }
+
+    public void setUserid(Long userid) {
+        this.userid = userid;
+    }
+
+
+    public Long getTorrentid() {
+        return torrentid;
+    }
+
+    public void setTorrentid(Long torrentid) {
+        this.torrentid = torrentid;
+    }
+
+
+    public Long getLoaduser() {
+        return loaduser;
+    }
+
+    public void setLoaduser(Long loaduser) {
+        this.loaduser = loaduser;
+    }
+
+
+    public Integer getMoney() {
+        return money;
+    }
+
+    public void setMoney(Integer money) {
+        this.money = money;
+    }
+
+
+    public String getPhoto() {//获取标签
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    public Integer getYear() {
+        return year;
+    }
+
+    public void setYear(Integer year) {
+        this.year = year;
+    }
+
+    public String getCountry() {//获取标签
+        return country;
+    }
+
+    public void setCountry(String country) {
+        this.country = country;
+    }
+
+    public LocalDateTime getRequestTime() {
+        return requesttime;
+    }
+
+    public void setRequestTime(LocalDateTime requestTime) {
+        this.requesttime = requestTime;
+    }
+
+
+
+    @Override
+    public String toString() {
+        return "request_resources{" +
+                "requestid = " + requestid +
+                ", name = " + name +
+                ", plot = " + plot +
+                ", userid = " + userid +
+                ", loaduser = " + loaduser +
+                ", money = " + money +
+                ", photo = " + photo +
+                ", year = " + year +
+                ", requesttime = " + requesttime +
+                ", country='" + country + '\'' +
+                ", torrentid = " + torrentid +
+                "}";
+    }
+}
diff --git a/src/main/java/com/pt5/pthouduan/mapper/RequestResourcesMapper.java b/src/main/java/com/pt5/pthouduan/mapper/RequestResourcesMapper.java
new file mode 100644
index 0000000..e7937a8
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/mapper/RequestResourcesMapper.java
@@ -0,0 +1,58 @@
+package com.pt5.pthouduan.mapper;
+
+import com.pt5.pthouduan.entity.request_resources;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 求助帖 Mapper 接口
+ * </p>
+ *
+ * 功能：创建、修改金额、删除、按名称/用户/被协助用户查询、统计某名称总金额
+ * 可扩展自定义 SQL
+ *
+ * @author ym
+ * @since 2025-05-10
+ */
+@Mapper
+public interface RequestResourcesMapper extends BaseMapper<request_resources> {
+
+    // 创建求助帖（可选，BaseMapper 已有 insert 方法）
+    void save(request_resources request);
+
+    // 修改求助帖金额
+    int updateMoney(@Param("requestid") Integer requestid, @Param("money") Integer money);
+
+    // 根据名称查询求助帖
+    List<request_resources> selectByName(@Param("name") String name);
+
+    // 计算某个名称对应的总金额
+    Integer sumMoneyByName(@Param("name") String name);
+
+    // 根据发帖人 ID 查询求助帖
+    List<request_resources> selectByUserid(@Param("userid") Long userid);
+
+    // 根据被协助人 ID 查询求助帖
+    List<request_resources> selectByLoaduser(@Param("loaduser") Long loaduser);
+
+    // ✅ 批量更新被协助用户 ID（loaduser）
+    int updateLoaduserByName(@Param("name") String name, @Param("loaduser") Long loaduser);
+
+    // ✅ 获取所有求助帖
+    List<request_resources> selectAllRequests();
+
+    // ✅ 1. 根据 requestid 更新 torrentid
+    int updateTorrentid(@Param("requestid") Integer requestid, @Param("torrentid") Long torrentid);
+
+    // ✅ 2. 根据 requestid 查询单个求助帖（BaseMapper 已有 selectById，但保留自定义扩展性）
+    request_resources selectByRequestid(@Param("requestid") Integer requestid);
+
+    // ✅ 3. 根据 userid + name + plot 查询唯一 request（用于获取 requestid）
+    request_resources findByUseridNamePlot(@Param("userid") Long userid,
+                                           @Param("name") String name,
+                                           @Param("plot") String plot);
+}
diff --git a/src/main/java/com/pt5/pthouduan/service/RequestResourcesService.java b/src/main/java/com/pt5/pthouduan/service/RequestResourcesService.java
new file mode 100644
index 0000000..9a8fb20
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/RequestResourcesService.java
@@ -0,0 +1,44 @@
+package com.pt5.pthouduan.service;
+
+import com.pt5.pthouduan.entity.request_resources;
+
+import java.util.List;
+
+public interface RequestResourcesService {
+
+    // 创建求助帖
+    boolean createRequest(request_resources request);
+
+    // 修改求助帖金额
+    boolean updateMoney(Integer requestid, Integer money);
+
+    // 删除求助帖
+    boolean deleteRequest(Integer requestid);
+
+    // 根据名称查找求助帖
+    List<request_resources> findByName(String name);
+
+    // 计算某名称的求助帖总金额
+    Integer calculateTotalMoneyByName(String name);
+
+    // 根据发帖用户ID查找求助帖
+    List<request_resources> findByUserid(Long userid);
+
+    // 根据被协助用户ID查找求助帖
+    List<request_resources> findByLoaduser(Long loaduser);
+
+    // 根据帖子名称批量更新loaduser字段
+    boolean updateLoaduserByName(String name, Long loaduser);
+
+    // 展示所有求助帖
+    List<request_resources> getAllRequests();
+
+    // ✅ 新增：根据 requestid 更新 torrentid
+    boolean updateTorrentid(Integer requestid, Long torrentid);
+
+    // ✅ 新增：根据 requestid 查询 request 对象
+    request_resources findByRequestid(Integer requestid);
+
+    // ✅（可选）根据 userid + name + plot 查询 requestid
+    request_resources findByUseridAndNameAndPlot(Long userid, String name, String plot);
+}
diff --git a/src/main/java/com/pt5/pthouduan/service/impl/RequestResourcesServiceImpl.java b/src/main/java/com/pt5/pthouduan/service/impl/RequestResourcesServiceImpl.java
new file mode 100644
index 0000000..abc23cb
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/impl/RequestResourcesServiceImpl.java
@@ -0,0 +1,114 @@
+package com.pt5.pthouduan.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.pt5.pthouduan.entity.request_resources;
+import com.pt5.pthouduan.mapper.RequestResourcesMapper;
+import com.pt5.pthouduan.service.RequestResourcesService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class RequestResourcesServiceImpl implements RequestResourcesService {
+
+    @Autowired
+    private RequestResourcesMapper requestResourcesMapper;
+
+    // 创建求助帖
+    @Override
+    public boolean createRequest(request_resources request) {
+        return requestResourcesMapper.insert(request) > 0;
+    }
+
+    // 修改求助帖金额
+    @Override
+    public boolean updateMoney(Integer requestid, Integer money) {
+        request_resources request = requestResourcesMapper.selectById(requestid);
+        if (request != null) {
+            request.setMoney(money);
+            return requestResourcesMapper.updateById(request) > 0;
+        }
+        return false;
+    }
+
+    // 删除求助帖
+    @Override
+    public boolean deleteRequest(Integer requestid) {
+        return requestResourcesMapper.deleteById(requestid) > 0;
+    }
+
+    // 根据名称查找求助帖
+    @Override
+    public List<request_resources> findByName(String name) {
+        QueryWrapper<request_resources> wrapper = new QueryWrapper<>();
+        wrapper.eq("name", name);
+        return requestResourcesMapper.selectList(wrapper);
+    }
+
+    // 计算某名称的求助帖总金额
+    @Override
+    public Integer calculateTotalMoneyByName(String name) {
+        QueryWrapper<request_resources> wrapper = new QueryWrapper<>();
+        wrapper.eq("name", name).select("money");
+        List<request_resources> list = requestResourcesMapper.selectList(wrapper);
+        return list.stream()
+                .map(request_resources::getMoney)
+                .reduce(0, Integer::sum);
+    }
+
+    // 根据发帖用户ID查找求助帖
+    @Override
+    public List<request_resources> findByUserid(Long userid) {
+        QueryWrapper<request_resources> wrapper = new QueryWrapper<>();
+        wrapper.eq("userid", userid);
+        return requestResourcesMapper.selectList(wrapper);
+    }
+
+    // 根据被协助用户ID查找求助帖
+    @Override
+    public List<request_resources> findByLoaduser(Long loaduser) {
+        QueryWrapper<request_resources> wrapper = new QueryWrapper<>();
+        wrapper.eq("loaduser", loaduser);
+        return requestResourcesMapper.selectList(wrapper);
+    }
+
+    // 批量更新 loaduser
+    @Override
+    public boolean updateLoaduserByName(String name, Long loaduser) {
+        UpdateWrapper<request_resources> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq("name", name).set("loaduser", loaduser);
+        return requestResourcesMapper.update(null, updateWrapper) > 0;
+    }
+
+    // 获取所有求助帖
+    @Override
+    public List<request_resources> getAllRequests() {
+        return requestResourcesMapper.selectList(null);
+    }
+
+    // ✅ 新增：根据 requestid 更新 torrentid
+    @Override
+    public boolean updateTorrentid(Integer requestid, Long torrentid) {
+        UpdateWrapper<request_resources> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq("requestid", requestid).set("torrentid", torrentid);
+        return requestResourcesMapper.update(null, updateWrapper) > 0;
+    }
+
+    // ✅ 新增：根据 requestid 查询对象
+    @Override
+    public request_resources findByRequestid(Integer requestid) {
+        return requestResourcesMapper.selectById(requestid);
+    }
+
+    // ✅ 新增：根据 userid + name + plot 查找唯一 request（获取 requestid 用）
+    @Override
+    public request_resources findByUseridAndNameAndPlot(Long userid, String name, String plot) {
+        QueryWrapper<request_resources> wrapper = new QueryWrapper<>();
+        wrapper.eq("userid", userid)
+                .eq("name", name)
+                .eq("plot", plot);
+        return requestResourcesMapper.selectOne(wrapper);
+    }
+}
