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); // 根据主键查记录
+    }
+
+
+}
diff --git a/src/main/resources/mapper/ComplainMapper.xml b/src/main/resources/mapper/ComplainMapper.xml
new file mode 100644
index 0000000..978ca2e
--- /dev/null
+++ b/src/main/resources/mapper/ComplainMapper.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.pt5.pthouduan.mapper.ComplainMapper">
+
+    <!-- 插入投诉 -->
+    <insert id="save" parameterType="com.pt5.pthouduan.entity.Complain" useGeneratedKeys="true" keyProperty="complainid">
+        INSERT INTO complain (puse, duser, content, torrentid)
+        VALUES (#{puse}, #{duser}, #{content}, #{torrentid})
+    </insert>
+
+    <!-- 根据投诉ID删除投诉 -->
+    <delete id="deleteByComplainid" parameterType="int">
+        DELETE FROM complain WHERE complainid = #{complainid}
+    </delete>
+
+    <!-- 更新投诉 -->
+    <update id="updateComplain" parameterType="com.pt5.pthouduan.entity.Complain">
+        UPDATE complain
+        SET puse = #{puse},
+            duser = #{duser},
+            content = #{content},
+            torrentid = #{torrentid}
+        WHERE complainid = #{complainid}
+    </update>
+
+    <!-- 根据被投诉用户ID查询投诉列表 -->
+    <select id="selectByDuser" parameterType="long" resultType="com.pt5.pthouduan.entity.Complain">
+        SELECT * FROM complain
+        WHERE duser = #{duser}
+        ORDER BY complainid DESC
+    </select>
+
+    <!-- 根据投诉发起人ID查询投诉列表 -->
+    <select id="selectByPuse" parameterType="long" resultType="com.pt5.pthouduan.entity.Complain">
+        SELECT * FROM complain
+        WHERE puse = #{puse}
+        ORDER BY complainid DESC
+    </select>
+
+    <!-- ✅ 获取所有投诉记录 -->
+    <select id="selectAllComplains" resultType="com.pt5.pthouduan.entity.Complain">
+        SELECT * FROM complain
+        ORDER BY complainid DESC
+    </select>
+
+    <!-- ✅ 根据投诉ID查询投诉详情 -->
+    <select id="selectByComplainId" parameterType="int" resultType="com.pt5.pthouduan.entity.Complain">
+        SELECT * FROM complain
+        WHERE complainid = #{complainid}
+    </select>
+
+</mapper>
diff --git a/src/test/java/com/pt5/pthouduan/controller/ComplainControllerTest.java b/src/test/java/com/pt5/pthouduan/controller/ComplainControllerTest.java
new file mode 100644
index 0000000..105cc8b
--- /dev/null
+++ b/src/test/java/com/pt5/pthouduan/controller/ComplainControllerTest.java
@@ -0,0 +1,132 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.Complain;
+import com.pt5.pthouduan.service.ComplainService;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+class ComplainControllerTest {
+
+    @Mock
+    private ComplainService complainService;
+
+    @InjectMocks
+    private ComplainController complainController;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+    }
+
+    @Test
+    void createComplain_ShouldReturnCreatedComplain() {
+        Complain complain = new Complain();
+        complain.setComplainid(1);
+        complain.setPuse(100L);
+        complain.setDuser(200L);
+        complain.setContent("Bad behavior");
+        complain.setTorrentid(123L);
+
+        when(complainService.createComplain(any(Complain.class))).thenReturn(complain);
+
+        Complain result = complainController.createComplain(complain);
+
+        assertEquals("Bad behavior", result.getContent());
+        assertEquals(100L, result.getPuse());
+        verify(complainService).createComplain(any(Complain.class));
+    }
+
+    @Test
+    void deleteComplain_ShouldReturnTrue_WhenDeleted() {
+        when(complainService.deleteComplain(1)).thenReturn(true);
+
+        boolean result = complainController.deleteComplain(1);
+
+        assertTrue(result);
+        verify(complainService).deleteComplain(1);
+    }
+
+    @Test
+    void updateComplain_ShouldReturnTrue_WhenUpdated() {
+        Complain complain = new Complain();
+        complain.setComplainid(1);
+        complain.setContent("Updated complaint");
+
+        when(complainService.updateComplain(any(Complain.class))).thenReturn(true);
+
+        boolean result = complainController.updateComplain(complain);
+
+        assertTrue(result);
+        verify(complainService).updateComplain(complain);
+    }
+
+    @Test
+    void getComplainsByTargetUser_ShouldReturnList() {
+        Complain c1 = new Complain();
+        c1.setDuser(200L);
+        c1.setContent("Cheating");
+
+        when(complainService.getComplainsByTargetUser(200L)).thenReturn(List.of(c1));
+
+        List<Complain> result = complainController.getComplainsByTargetUser(200L);
+
+        assertEquals(1, result.size());
+        assertEquals("Cheating", result.get(0).getContent());
+    }
+
+    @Test
+    void getComplainsByPostingUser_ShouldReturnList() {
+        Complain c = new Complain();
+        c.setPuse(100L);
+        c.setContent("Spam complaint");
+
+        when(complainService.getComplainsByPostingUser(100L)).thenReturn(List.of(c));
+
+        List<Complain> result = complainController.getComplainsByPostingUser(100L);
+
+        assertEquals(1, result.size());
+        assertEquals("Spam complaint", result.get(0).getContent());
+    }
+
+    @Test
+    void getAllComplains_ShouldReturnAll() {
+        Complain c1 = new Complain();
+        c1.setContent("Complain A");
+        Complain c2 = new Complain();
+        c2.setContent("Complain B");
+
+        when(complainService.getAllComplains()).thenReturn(Arrays.asList(c1, c2));
+
+        List<Complain> result = complainController.getAllComplains();
+
+        assertEquals(2, result.size());
+        assertEquals("Complain A", result.get(0).getContent());
+        assertEquals("Complain B", result.get(1).getContent());
+    }
+
+    @Test
+    void getComplainInfo_ShouldReturnComplainDetails() {
+        Complain c = new Complain();
+        c.setComplainid(1);
+        c.setPuse(100L);
+        c.setDuser(200L);
+        c.setTorrentid(500L);
+
+        when(complainService.getComplainById(1)).thenReturn(c);
+
+        Complain result = complainController.getComplainInfo(1);
+
+        assertEquals(100L, result.getPuse());
+        assertEquals(200L, result.getDuser());
+        assertEquals(500L, result.getTorrentid());
+    }
+}
