好友相关后端
Change-Id: I4838ea80d0e9173d97c0afc60b4d8b4de926bf41
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());
+ }
+}