diff --git a/src/main/java/com/pt5/pthouduan/controller/ComplainController.java b/src/main/java/com/pt5/pthouduan/controller/ComplainController.java
new file mode 100644
index 0000000..45ef0e2
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/controller/ComplainController.java
@@ -0,0 +1,78 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.Complain;
+import com.pt5.pthouduan.service.ComplainService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.stereotype.Controller;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  投诉前端控制器
+ * </p>
+ *
+ * 功能：增、删、改、查（按被投诉用户ID）
+ *
+ * @author ym
+ * @since 2025-04-14
+ */
+@CrossOrigin(origins = {"http://localhost:5173", "http://localhost:3000"})
+@Controller
+@RequestMapping("/complain")
+public class ComplainController {
+
+    @Autowired
+    private ComplainService complainService;
+
+    // 创建投诉
+    @PostMapping("/create")
+    @ResponseBody
+    public Complain createComplain(@RequestBody Complain complain) {
+        System.out.println("Received complain: " + complain);  // 输出接收到的投诉数据
+        return complainService.createComplain(complain);
+    }
+
+    // 删除投诉（根据complainid）
+    @DeleteMapping("/delete/{complainid}")
+    @ResponseBody
+    public boolean deleteComplain(@PathVariable Integer complainid) {
+        return complainService.deleteComplain(complainid);
+    }
+
+    // 更新投诉内容
+    @PutMapping("/update")
+    @ResponseBody
+    public boolean updateComplain(@RequestBody Complain complain) {
+        return complainService.updateComplain(complain);
+    }
+
+    // 获取某个用户被投诉的所有记录（根据duser）
+    @GetMapping("/target/{duser}")
+    @ResponseBody
+    public List<Complain> getComplainsByTargetUser(@PathVariable Long duser) {
+        return complainService.getComplainsByTargetUser(duser);
+    }
+
+    // 获取某个用户提交的所有投诉记录（根据puse）
+    @GetMapping("/from/{puse}")
+    @ResponseBody
+    public List<Complain> getComplainsByPostingUser(@PathVariable Long puse) {
+        return complainService.getComplainsByPostingUser(puse);
+    }
+
+    // 获取所有投诉记录（管理员查看用）
+    @GetMapping("/all")
+    @ResponseBody
+    public List<Complain> getAllComplains() {
+        return complainService.getAllComplains();
+    }
+
+    // 根据投诉号获取对应的投诉人、被投诉人和种子号
+    @GetMapping("/info/{complainid}")
+    @ResponseBody
+    public Complain getComplainInfo(@PathVariable Integer complainid) {
+        return complainService.getComplainById(complainid);
+    }
+}
diff --git a/src/main/java/com/pt5/pthouduan/entity/Complain.java b/src/main/java/com/pt5/pthouduan/entity/Complain.java
new file mode 100644
index 0000000..6a57648
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/entity/Complain.java
@@ -0,0 +1,82 @@
+package com.pt5.pthouduan.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 投诉记录实体类
+ * </p>
+ *
+ * @author ym
+ * @since 2025-04-14
+ */
+@TableName("complain")
+public class Complain implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId("complainid")
+    private Integer complainid;
+
+    private Long puse;
+
+    private Long duser;
+
+    private String content;
+
+    private Long torrentid;
+
+    public Integer getComplainid() {
+        return complainid;
+    }
+
+    public void setComplainid(Integer complainid) {
+        this.complainid = complainid;
+    }
+
+    public Long getPuse() {
+        return puse;
+    }
+
+    public void setPuse(Long puse) {
+        this.puse = puse;
+    }
+
+    public Long getDuser() {
+        return duser;
+    }
+
+    public void setDuser(Long duser) {
+        this.duser = duser;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Long getTorrentid() {
+        return torrentid;
+    }
+
+    public void setTorrentid(Long torrentid) {
+        this.torrentid = torrentid;
+    }
+
+    @Override
+    public String toString() {
+        return "Complain{" +
+                "complainid=" + complainid +
+                ", puse=" + puse +
+                ", duser=" + duser +
+                ", content='" + content + '\'' +
+                ", torrentid=" + torrentid +
+                '}';
+    }
+}
diff --git a/src/main/java/com/pt5/pthouduan/mapper/ComplainMapper.java b/src/main/java/com/pt5/pthouduan/mapper/ComplainMapper.java
new file mode 100644
index 0000000..c39557d
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/mapper/ComplainMapper.java
@@ -0,0 +1,45 @@
+package com.pt5.pthouduan.mapper;
+
+import com.pt5.pthouduan.entity.Complain;
+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>
+ *
+ * 功能：增、删、改、查（按被投诉用户ID和投诉发起人ID）
+ *
+ * @author ym
+ * @since 2025-04-14
+ */
+@Mapper
+public interface ComplainMapper extends BaseMapper<Complain> {
+
+    // 创建投诉
+    void save(Complain complain);
+
+    // 根据投诉ID删除
+    int deleteByComplainid(@Param("complainid") Integer complainid);
+
+    // 更新投诉
+    int updateComplain(Complain complain);
+
+    // 根据被投诉用户ID查询投诉列表
+    List<Complain> selectByDuser(@Param("duser") Long duser);
+
+    // 根据投诉发起人ID查询投诉列表
+    List<Complain> selectByPuse(@Param("puse") Long puse);
+
+    // 根据投诉ID查询投诉记录
+    Complain selectByComplainId(@Param("complainid") Integer complainid);
+
+    // 获取所有投诉记录
+    List<Complain> selectAllComplains();
+
+
+}
diff --git a/src/main/java/com/pt5/pthouduan/service/ComplainService.java b/src/main/java/com/pt5/pthouduan/service/ComplainService.java
new file mode 100644
index 0000000..896f748
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/ComplainService.java
@@ -0,0 +1,38 @@
+package com.pt5.pthouduan.service;
+
+import com.pt5.pthouduan.entity.Complain;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 投诉服务接口
+ * </p>
+ *
+ * 功能：增、删、改、查（按被投诉用户ID、投诉发起人ID）
+ *
+ * @author ym
+ * @since 2025-04-14
+ */
+public interface ComplainService {
+
+    // 创建投诉
+    Complain createComplain(Complain complain);
+
+    // 删除投诉
+    boolean deleteComplain(Integer complainid);
+
+    // 更新投诉
+    boolean updateComplain(Complain complain);
+
+    // 根据被投诉用户ID查询投诉
+    List<Complain> getComplainsByTargetUser(Long duser);
+
+    // 根据投诉发起人ID查询投诉
+    List<Complain> getComplainsByPostingUser(Long puse);
+
+    List<Complain> getAllComplains();
+
+    Complain getComplainById(Integer complainid);
+
+}
diff --git a/src/main/java/com/pt5/pthouduan/service/impl/ComplainServiceImpl.java b/src/main/java/com/pt5/pthouduan/service/impl/ComplainServiceImpl.java
new file mode 100644
index 0000000..84b0be2
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/impl/ComplainServiceImpl.java
@@ -0,0 +1,64 @@
+package com.pt5.pthouduan.service.impl;
+
+import com.pt5.pthouduan.entity.Complain;
+import com.pt5.pthouduan.mapper.ComplainMapper;
+import com.pt5.pthouduan.service.ComplainService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 投诉服务实现类
+ * </p>
+ *
+ * 实现了投诉的增删改查逻辑
+ *
+ * @author ym
+ * @since 2025-04-14
+ */
+@Service
+public class ComplainServiceImpl implements ComplainService {
+
+    @Autowired
+    private ComplainMapper complainMapper;
+
+    @Override
+    public Complain createComplain(Complain complain) {
+        complainMapper.save(complain);
+        return complain;
+    }
+
+    @Override
+    public boolean deleteComplain(Integer complainid) {
+        return complainMapper.deleteByComplainid(complainid) > 0;
+    }
+
+    @Override
+    public boolean updateComplain(Complain complain) {
+        return complainMapper.updateComplain(complain) > 0;
+    }
+
+    @Override
+    public List<Complain> getComplainsByTargetUser(Long duser) {
+        return complainMapper.selectByDuser(duser);
+    }
+
+    @Override
+    public List<Complain> getComplainsByPostingUser(Long puse) {
+        return complainMapper.selectByPuse(puse);
+    }
+
+    @Override
+    public List<Complain> getAllComplains() {
+        return complainMapper.selectList(null); // 查询全部记录
+    }
+
+    @Override
+    public Complain getComplainById(Integer complainid) {
+        return complainMapper.selectById(complainid); // 根据主键查记录
+    }
+
+
+}
