follow+sendMessage

Change-Id: I3e9bbcc89dfc53b9651fd8722da1b445a597629a
diff --git a/src/main/java/com/example/g8backend/service/IUserService.java b/src/main/java/com/example/g8backend/service/IUserService.java
index af94d27..1f178f8 100644
--- a/src/main/java/com/example/g8backend/service/IUserService.java
+++ b/src/main/java/com/example/g8backend/service/IUserService.java
@@ -1,11 +1,25 @@
 package com.example.g8backend.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.example.g8backend.entity.Message;
 import com.example.g8backend.entity.User;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 public interface IUserService extends IService<User> {
     User getUserByName(@Param("name") String name);
     User getUserByEmail(@Param("email") String email);
     User getUserByPasskey(@Param("passkey") String passkey);
+
+    // 关注功能
+    boolean followUser(Long followerId, Long followedId);
+    boolean unfollowUser(Long followerId, Long followedId);
+    List<User> getFollowings(Long userId);
+    List<User> getFollowers(Long userId);
+
+    // 私信功能
+    Long sendMessage(Long senderId, Long receiverId, String content);
+    List<Message> getMessages(Long userId, Long partnerId);
+    List<Message> getMessageHistory(Long userId);
 }
diff --git a/src/main/java/com/example/g8backend/service/impl/UserServiceImpl.java b/src/main/java/com/example/g8backend/service/impl/UserServiceImpl.java
index e8bcf20..1d1b6dc 100644
--- a/src/main/java/com/example/g8backend/service/impl/UserServiceImpl.java
+++ b/src/main/java/com/example/g8backend/service/impl/UserServiceImpl.java
@@ -1,12 +1,22 @@
 package com.example.g8backend.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.example.g8backend.entity.Follow;
+import com.example.g8backend.entity.Message;
 import com.example.g8backend.entity.User;
+import com.example.g8backend.mapper.FollowMapper;
+import com.example.g8backend.mapper.MessageMapper;
 import com.example.g8backend.mapper.UserMapper;
 import com.example.g8backend.service.IUserService;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
 
 @Service
 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
@@ -22,4 +32,89 @@
     @Override
     public User getUserByPasskey(String passkey) { return userMapper.getUserByPasskey(passkey);}
 
+    @Resource
+    private FollowMapper followMapper;
+    @Resource
+    private MessageMapper messageMapper;
+
+    @Override
+    public boolean followUser(Long followerId, Long followedId) {
+        if (followerId.equals(followedId)) return false;
+        Follow follow = new Follow();
+        follow.setFollowerId(followerId);
+        follow.setFollowedId(followedId);
+        return followMapper.insert(follow) > 0;
+    }
+
+    @Override
+    public boolean unfollowUser(Long followerId, Long followedId) {
+        // 删除关注关系
+        return followMapper.deleteByPair(followerId, followedId) > 0;
+    }
+
+    @Override
+    public List<User> getFollowings(Long userId) {
+        // 1. 获取关注ID列表
+        List<Long> followingIds = followMapper.selectFollowings(userId);
+        // 2. 批量查询用户信息
+        return followingIds.isEmpty() ?
+                Collections.emptyList() :
+                this.listByIds(followingIds).stream()
+                        .peek(user -> user.setPassword(null)) // 敏感信息脱敏
+                        .collect(Collectors.toList());
+    }
+
+    @Override
+    public List<User> getFollowers(Long userId) {
+        // 1. 获取粉丝ID列表
+        List<Long> followerIds = followMapper.selectFollowers(userId);
+        // 2. 批量查询用户信息
+        return followerIds.isEmpty() ?
+                Collections.emptyList() :
+                this.listByIds(followerIds).stream()
+                        .peek(user -> user.setPassword(null))
+                        .collect(Collectors.toList());
+    }
+
+    @Override
+    public Long sendMessage(Long senderId, Long receiverId, String content) {
+        // 1. 校验接收者是否存在(方案一)
+        if (userMapper.selectById(receiverId) == null) {
+            throw new RuntimeException("接收用户不存在");
+        }
+
+        // 2. 创建消息实体
+        Message message = new Message()
+                .setSenderId(senderId)
+                .setReceiverId(receiverId)
+                .setContent(content)
+                .setSentAt(LocalDateTime.now());
+
+        // 3. 插入数据库
+        messageMapper.insert(message);
+        return message.getMessageId();
+    }
+
+    @Override
+    public List<Message> getMessages(Long userId, Long partnerId) {
+        // 获取双方对话记录
+        return messageMapper.selectConversation(userId, partnerId).stream()
+                .peek(msg -> {
+                    // 标记消息为已读
+                    if (!msg.getIsRead() && msg.getReceiverId().equals(userId)) {
+                        msg.setIsRead(true);
+                        messageMapper.updateById(msg);
+                    }
+                })
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public List<Message> getMessageHistory(Long userId) {
+        // 获取用户所有相关消息
+        return messageMapper.selectUserMessages(userId).stream()
+                .sorted(Comparator.comparing(Message::getSentAt).reversed())
+                .collect(Collectors.toList());
+    }
+
 }