diff --git a/src/main/java/com/pt5/pthouduan/controller/FriendsListController.java b/src/main/java/com/pt5/pthouduan/controller/FriendsListController.java
new file mode 100644
index 0000000..367114b
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/controller/FriendsListController.java
@@ -0,0 +1,65 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.FriendsList;
+import com.pt5.pthouduan.service.FriendsListService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.stereotype.Controller;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ *  好友关系前端控制器
+ * </p>
+ *
+ * 功能：添加好友、删除好友、查询好友
+ *
+ * @author ym
+ * @since 2025-04-14
+ */
+@CrossOrigin(origins = "http://localhost:5173")
+@Controller
+@RequestMapping("/friends")
+public class FriendsListController {
+
+    @Autowired
+    private FriendsListService friendsListService;
+
+    // 添加好友（只是发起请求）
+    @PostMapping("/add")
+    @ResponseBody
+    public boolean addFriend(@RequestBody FriendsList friendsList) {
+        friendsList.setRequestTime(LocalDateTime.now());
+        friendsList.setStatus("pending"); // 初始状态为申请中
+        return friendsListService.addFriend(friendsList);
+    }
+
+    // 同意好友申请
+    @PostMapping("/accept")
+    @ResponseBody
+    public boolean acceptFriend(@RequestParam Long friend1, @RequestParam Long friend2) {
+        return friendsListService.acceptFriend(friend1, friend2);
+    }
+
+    @DeleteMapping("/delete")
+    @ResponseBody
+    public boolean deleteFriendByFriends(@RequestParam Long friend1, @RequestParam Long friend2) {
+        return friendsListService.deleteFriendByFriends(friend1, friend2);
+    }
+
+    // 查询某用户的所有已通过好友
+    @GetMapping("/list/{userid}")
+    @ResponseBody
+    public List<FriendsList> getFriendsByUserId(@PathVariable Long userid) {
+        return friendsListService.getAcceptedFriendsByUserId(userid);
+    }
+
+    // （可选）查看自己收到的申请（自己是 friend2，status=pending）
+    @GetMapping("/pending/{userid}")
+    @ResponseBody
+    public List<FriendsList> getPendingRequests(@PathVariable Long userid) {
+        return friendsListService.getPendingRequests(userid);
+    }
+}
diff --git a/src/main/java/com/pt5/pthouduan/entity/FriendsList.java b/src/main/java/com/pt5/pthouduan/entity/FriendsList.java
index 36c164a..6de05b8 100644
--- a/src/main/java/com/pt5/pthouduan/entity/FriendsList.java
+++ b/src/main/java/com/pt5/pthouduan/entity/FriendsList.java
@@ -11,49 +11,48 @@
  * 用户好友关系列表
  * </p>
  *
- * @author ljx
+ * @author ym
  * @since 2025-04-14
  */
-@TableName("friends_list")
+@TableName("friendslist")
 public class FriendsList implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    @TableId(value = "relation_id", type = IdType.AUTO)
-    private Long relationId;
+    @TableId(value = "relationid", type = IdType.AUTO)
+    private Long relationid;
 
-    private Long userid;
+    private Long friend1;
 
-    private Long friendId;
+    private Long friend2;
 
     private LocalDateTime requestTime;
 
-    private String type;
+    private String status; // pending（申请中），accepted（已通过）
 
-    private String rightLevel;
 
-    public Long getRelationId() {
-        return relationId;
+    public Long getRelationid() {
+        return relationid;
     }
 
-    public void setRelationId(Long relationId) {
-        this.relationId = relationId;
+    public void setRelationid(Long relationid) {
+        this.relationid = relationid;
     }
 
-    public Long getUserid() {
-        return userid;
+    public Long getFriend1() {
+        return friend1;
     }
 
-    public void setUserid(Long userid) {
-        this.userid = userid;
+    public void setFriend1(Long friend1) {
+        this.friend1 = friend1;
     }
 
-    public Long getFriendId() {
-        return friendId;
+    public Long getFriend2() {
+        return friend2;
     }
 
-    public void setFriendId(Long friendId) {
-        this.friendId = friendId;
+    public void setFriend2(Long friend2) {
+        this.friend2 = friend2;
     }
 
     public LocalDateTime getRequestTime() {
@@ -64,31 +63,23 @@
         this.requestTime = requestTime;
     }
 
-    public String getType() {
-        return type;
+    public String getStatus() {
+        return status;
     }
 
-    public void setType(String type) {
-        this.type = type;
+    public void setStatus(String status) {
+        this.status = status;
     }
 
-    public String getRightLevel() {
-        return rightLevel;
-    }
-
-    public void setRightLevel(String rightLevel) {
-        this.rightLevel = rightLevel;
-    }
 
     @Override
     public String toString() {
         return "FriendsList{" +
-        "relationId = " + relationId +
-        ", userid = " + userid +
-        ", friendId = " + friendId +
+        "relationid = " + relationid +
+        ", friend1 = " + friend1 +
+        ", friend2 = " + friend2 +
         ", requestTime = " + requestTime +
-        ", type = " + type +
-        ", rightLevel = " + rightLevel +
+                ", status = " + status +
         "}";
     }
 }
diff --git a/src/main/java/com/pt5/pthouduan/mapper/FriendsListMapper.java b/src/main/java/com/pt5/pthouduan/mapper/FriendsListMapper.java
index a6d5b56..2465af5 100644
--- a/src/main/java/com/pt5/pthouduan/mapper/FriendsListMapper.java
+++ b/src/main/java/com/pt5/pthouduan/mapper/FriendsListMapper.java
@@ -3,16 +3,43 @@
 import com.pt5.pthouduan.entity.FriendsList;
 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 接口
+ *  好友关系 Mapper 接口
  * </p>
  *
- * @author ljx
+ * 功能：
+ *  - 添加好友请求
+ *  - 同意好友请求
+ *  - 删除好友
+ *  - 查询某用户所有好友
+ *  - 查询待处理的好友请求
+ *
+ * @author 杨蔓
  * @since 2025-04-14
  */
 @Mapper
 public interface FriendsListMapper extends BaseMapper<FriendsList> {
 
+    // 插入好友申请（status = "pending"）
+    int insertFriendRequest(FriendsList friendsList);
+
+    // 同意好友申请（更新 status = "accepted"）
+    int updateFriendStatus(@Param("friend1") Long friend1,
+                           @Param("friend2") Long friend2,
+                           @Param("status") String status);
+
+    // 删除好友（无论谁是 friend1 或 friend2）
+    int deleteByFriendPair(@Param("friend1") Long friend1,
+                           @Param("friend2") Long friend2);
+
+    // 查询某用户所有已通过好友（status = "accepted"）
+    List<FriendsList> selectAcceptedFriends(@Param("userid") Long userid);
+
+    // 查询自己收到的好友请求（自己是 friend2，status = "pending"）
+    List<FriendsList> selectPendingRequests(@Param("userid") Long userid);
 }
diff --git a/src/main/java/com/pt5/pthouduan/service/FriendsListService.java b/src/main/java/com/pt5/pthouduan/service/FriendsListService.java
new file mode 100644
index 0000000..5fade0f
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/FriendsListService.java
@@ -0,0 +1,33 @@
+package com.pt5.pthouduan.service;
+
+import com.pt5.pthouduan.entity.FriendsList;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  好友关系服务接口
+ * </p>
+ *
+ * 功能：
+ *  - 发起好友申请（待确认）
+ *  - 同意好友申请（状态变更）
+ *  - 删除好友
+ *  - 查询用户所有已通过好友
+ *  - 查询用户所有待确认好友请求
+ *
+ * @author 杨蔓
+ * @since 2025-04-14
+ */
+public interface FriendsListService {
+
+    boolean addFriend(FriendsList friendsList);              // 发起好友申请
+
+    boolean acceptFriend(Long friend1, Long friend2);        // 同意好友申请（状态设为 accepted）
+
+    boolean deleteFriendByFriends(Long friend1, Long friend2); // 删除好友关系
+
+    List<FriendsList> getAcceptedFriendsByUserId(Long userid); // 查询某用户的所有已通过好友
+
+    List<FriendsList> getPendingRequests(Long userid);         // 查询待确认好友请求（自己是 friend2）
+}
diff --git a/src/main/java/com/pt5/pthouduan/service/impl/FriendsListServiceImpl.java b/src/main/java/com/pt5/pthouduan/service/impl/FriendsListServiceImpl.java
new file mode 100644
index 0000000..50d5f07
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/impl/FriendsListServiceImpl.java
@@ -0,0 +1,61 @@
+package com.pt5.pthouduan.service.impl;
+
+import com.pt5.pthouduan.entity.FriendsList;
+import com.pt5.pthouduan.mapper.FriendsListMapper;
+import com.pt5.pthouduan.service.FriendsListService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  好友服务实现类
+ * </p>
+ *
+ * 功能：
+ *  - 发起好友申请
+ *  - 同意好友请求
+ *  - 删除好友
+ *  - 查询所有好友
+ *  - 查询所有待同意请求
+ *
+ * @author 杨蔓
+ * @since 2025-04-14
+ */
+@Service
+public class FriendsListServiceImpl implements FriendsListService {
+
+    @Autowired
+    private FriendsListMapper friendsListMapper;
+
+    /** 发起好友申请（status = pending） */
+    @Override
+    public boolean addFriend(FriendsList friendsList) {
+        return friendsListMapper.insertFriendRequest(friendsList) > 0;
+    }
+
+    /** 同意好友申请（更新 status = accepted） */
+    @Override
+    public boolean acceptFriend(Long friend1, Long friend2) {
+        return friendsListMapper.updateFriendStatus(friend1, friend2, "accepted") > 0;
+    }
+
+    /** 删除好友（无论谁是 friend1 或 friend2） */
+    @Override
+    public boolean deleteFriendByFriends(Long friend1, Long friend2) {
+        return friendsListMapper.deleteByFriendPair(friend1, friend2) > 0;
+    }
+
+    /** 查询某用户所有已通过的好友 */
+    @Override
+    public List<FriendsList> getAcceptedFriendsByUserId(Long userid) {
+        return friendsListMapper.selectAcceptedFriends(userid);
+    }
+
+    /** 查询所有待同意的好友申请（自己是 friend2 且 status = pending） */
+    @Override
+    public List<FriendsList> getPendingRequests(Long userid) {
+        return friendsListMapper.selectPendingRequests(userid);
+    }
+}
diff --git a/src/main/resources/mapper/xml/FriendsListMapper.xml b/src/main/resources/mapper/xml/FriendsListMapper.xml
new file mode 100644
index 0000000..3053fc2
--- /dev/null
+++ b/src/main/resources/mapper/xml/FriendsListMapper.xml
@@ -0,0 +1,44 @@
+<?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.FriendsListMapper">
+
+    <!-- 插入好友申请 -->
+    <insert id="insertFriendRequest" parameterType="com.pt5.pthouduan.entity.FriendsList">
+        INSERT INTO friendslist (relationid, friend1, friend2, requestTime, status)
+        VALUES (#{relationid}, #{friend1}, #{friend2}, #{requestTime}, #{status})
+    </insert>
+
+    <!-- 同意好友申请（更新 status） -->
+    <update id="updateFriendStatus">
+        UPDATE friendslist
+        SET status = #{status}
+        WHERE (friend1 = #{friend1} AND friend2 = #{friend2})
+           OR (friend1 = #{friend2} AND friend2 = #{friend1})
+    </update>
+
+    <!-- 删除好友关系（不区分 friend1 和 friend2） -->
+    <delete id="deleteByFriendPair">
+        DELETE FROM friendslist
+        WHERE (friend1 = #{friend1} AND friend2 = #{friend2})
+           OR (friend1 = #{friend2} AND friend2 = #{friend1})
+    </delete>
+
+    <!-- 查询某用户所有已通过好友 -->
+    <select id="selectAcceptedFriends" parameterType="long" resultType="com.pt5.pthouduan.entity.FriendsList">
+        SELECT * FROM friendslist
+        WHERE (friend1 = #{userid} OR friend2 = #{userid})
+          AND status = 'accepted'
+    </select>
+
+    <!-- 查询自己收到的好友请求（自己是 friend2 且 status = 'pending'） -->
+    <select id="selectPendingRequests" parameterType="long" resultType="com.pt5.pthouduan.entity.FriendsList">
+        SELECT * FROM friendslist
+        WHERE friend2 = #{userid}
+          AND status = 'pending'
+        ORDER BY requestTime DESC
+    </select>
+
+</mapper>
diff --git a/src/test/java/com/pt5/pthouduan/controller/FriendsListControllerTest.java b/src/test/java/com/pt5/pthouduan/controller/FriendsListControllerTest.java
new file mode 100644
index 0000000..7c5048b
--- /dev/null
+++ b/src/test/java/com/pt5/pthouduan/controller/FriendsListControllerTest.java
@@ -0,0 +1,97 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.FriendsList;
+import com.pt5.pthouduan.service.FriendsListService;
+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.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+class FriendsListControllerTest {
+
+    @Mock
+    private FriendsListService friendsListService;
+
+    @InjectMocks
+    private FriendsListController friendsListController;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+    }
+
+    @Test
+    void addFriend_ShouldReturnTrue_WhenSuccessful() {
+        FriendsList request = new FriendsList();
+        request.setFriend1(1L);
+        request.setFriend2(2L);
+
+        when(friendsListService.addFriend(any(FriendsList.class))).thenReturn(true);
+
+        boolean result = friendsListController.addFriend(request);
+
+        assertTrue(result);
+        verify(friendsListService).addFriend(any(FriendsList.class));
+    }
+
+    @Test
+    void acceptFriend_ShouldReturnTrue_WhenSuccessful() {
+        when(friendsListService.acceptFriend(1L, 2L)).thenReturn(true);
+
+        boolean result = friendsListController.acceptFriend(1L, 2L);
+
+        assertTrue(result);
+        verify(friendsListService).acceptFriend(1L, 2L);
+    }
+
+    @Test
+    void deleteFriend_ShouldReturnTrue_WhenSuccessful() {
+        when(friendsListService.deleteFriendByFriends(1L, 2L)).thenReturn(true);
+
+        boolean result = friendsListController.deleteFriendByFriends(1L, 2L);
+
+        assertTrue(result);
+        verify(friendsListService).deleteFriendByFriends(1L, 2L);
+    }
+
+    @Test
+    void getFriendsByUserId_ShouldReturnFriendList() {
+        FriendsList f1 = new FriendsList();
+        f1.setFriend1(1L);
+        f1.setFriend2(2L);
+        f1.setStatus("accepted");
+
+        when(friendsListService.getAcceptedFriendsByUserId(1L)).thenReturn(List.of(f1));
+
+        List<FriendsList> result = friendsListController.getFriendsByUserId(1L);
+
+        assertEquals(1, result.size());
+        assertEquals("accepted", result.get(0).getStatus());
+    }
+
+    @Test
+    void getPendingRequests_ShouldReturnPendingList() {
+        FriendsList pending = new FriendsList();
+        pending.setFriend1(3L);
+        pending.setFriend2(1L);
+        pending.setStatus("pending");
+        pending.setRequestTime(LocalDateTime.now());
+
+        when(friendsListService.getPendingRequests(1L)).thenReturn(Arrays.asList(pending));
+
+        List<FriendsList> result = friendsListController.getPendingRequests(1L);
+
+        assertEquals(1, result.size());
+        assertEquals("pending", result.get(0).getStatus());
+        assertEquals(3L, result.get(0).getFriend1());
+        assertEquals(1L, result.get(0).getFriend2());
+    }
+}
