lzy 1 week ago
parent
commit
c5b13b9a15

+ 36 - 3
src/main/java/com/zhentao/groups/controller/groupsController.java

@@ -1,8 +1,6 @@
 package com.zhentao.groups.controller;
 
-import com.zhentao.groups.dto.AddGroupMembers;
-import com.zhentao.groups.dto.AddGroupsDto;
-import com.zhentao.groups.dto.DelGroupMembers;
+import com.zhentao.groups.dto.*;
 import com.zhentao.groups.service.GroupsService;
 import com.zhentao.tool.TokenUtils;
 import com.zhentao.vo.Result;
@@ -33,6 +31,14 @@ public class groupsController {
         return groupsService.AddGroupMembers(addGroupMembers);
     }
 
+//    展示可以拉取的好友
+    @PostMapping("/selectAddGroup")
+    public Result selectAddGroup(@RequestBody AddUserLoginDto addUserLoginDto,@RequestHeader("token") String token){
+        Long userIdFromToken = Long.valueOf(TokenUtils.getUserIdFromToken(token));
+        addUserLoginDto.setUid(userIdFromToken);
+        return groupsService.selectAddGroup(addUserLoginDto);
+    }
+
 //    提出群聊
     @PostMapping("/DelGroupMembers")
     public Result DelGroupMembers(@RequestBody DelGroupMembers delGroupMembers,@RequestHeader("token") String token){
@@ -40,4 +46,31 @@ public class groupsController {
         delGroupMembers.setUId(userIdFromToken);
         return groupsService.DelGroupMembers(delGroupMembers);
     }
+
+//  查询群聊聊的用户
+    @PostMapping("/getGroupUsers")
+    public Result getGroupUsers(@RequestBody AddUserLoginDto addUserLoginDto){
+        return groupsService.getGroupUsers(addUserLoginDto);
+    }
+
+    // 根据群ID获取群详细信息
+    @GetMapping("/getGroupDetails/{groupId}")
+    public Result getGroupDetails(@PathVariable Long groupId, @RequestHeader("token") String token){
+        // 可以选择在这里添加权限验证,确保只有群成员或管理员才能查看
+        return groupsService.getGroupDetails(groupId);
+    }
+
+//    更改用户角色
+    @PostMapping("/updateGroupMemberRole")
+    public Result updateGroupMemberRole(@RequestBody UpdateGroupMemberRoleDto updateGroupMemberRoleDto){
+        return groupsService.updateGroupMemberRole(updateGroupMemberRoleDto);
+    }
+
+
+
+
+
+
+
+
 }

+ 14 - 0
src/main/java/com/zhentao/groups/dto/AddUserLoginDto.java

@@ -0,0 +1,14 @@
+package com.zhentao.groups.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+@Data
+public class AddUserLoginDto {
+//    群id
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long id;
+//    登录的用户
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long uid;
+}

+ 13 - 0
src/main/java/com/zhentao/groups/dto/UpdateGroupMemberRoleDto.java

@@ -0,0 +1,13 @@
+package com.zhentao.groups.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+@Data
+public class UpdateGroupMemberRoleDto {
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long groupssId;
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long userId;
+    private Integer role; // 0-普通成员, 1-管理员
+} 

+ 17 - 3
src/main/java/com/zhentao/groups/service/GroupsService.java

@@ -1,11 +1,10 @@
 package com.zhentao.groups.service;
 
 
-import com.zhentao.groups.dto.AddGroupMembers;
-import com.zhentao.groups.dto.DelGroupMembers;
-import com.zhentao.groups.dto.GroupDto;
+import com.zhentao.groups.dto.*;
 import com.zhentao.groups.pojo.Groupss;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhentao.user.domain.UserLogin;
 import com.zhentao.vo.Result;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
@@ -25,9 +24,24 @@ public interface GroupsService extends IService<Groupss> {
 
 //        添加人数
     Result AddGroupMembers(AddGroupMembers addGroupMembers);
+//    拉人的列表
+    Result selectAddGroup(AddUserLoginDto addUserLoginDto);
+
+
 
 //    删除人数
     Result DelGroupMembers(DelGroupMembers delGroupMembers);
 //  查询所有的一个群ID
     List<GroupDto> getList();
+
+
+//    查询该群聊的用户信息
+    public Result getGroupUsers(AddUserLoginDto groupId);
+
+//    根据群ID查询群详细信息
+    Result getGroupDetails(Long groupId);
+
+    // 更新群成员角色
+    Result updateGroupMemberRole(UpdateGroupMemberRoleDto updateGroupMemberRoleDto);
+
 }

+ 139 - 8
src/main/java/com/zhentao/groups/service/impl/GroupsServiceImpl.java

@@ -1,22 +1,27 @@
 package com.zhentao.groups.service.impl;
 
 import cn.hutool.core.util.IdUtil;
+import com.aliyuncs.endpoint.UserCustomizedEndpointResolver;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.zhentao.groups.dto.AddGroupMembers;
-import com.zhentao.groups.dto.AddGroupsDto;
-import com.zhentao.groups.dto.DelGroupMembers;
-import com.zhentao.groups.dto.GroupDto;
+import com.zhentao.groups.dto.*;
 import com.zhentao.groups.mapper.GroupMembersMapper;
 import com.zhentao.groups.pojo.GroupMembers;
 import com.zhentao.groups.pojo.Groupss;
 import com.zhentao.groups.service.GroupMembersService;
 import com.zhentao.groups.service.GroupsService;
 import com.zhentao.groups.mapper.GroupsMapper;
+import com.zhentao.groups.vo.GroupsVo;
+import com.zhentao.groups.vo.UserVo;
 import com.zhentao.information.cache.GroupMemberCache;
 import com.zhentao.shouye.domain.UserShouye;
 import com.zhentao.shouye.mapper.UserShouyeMapper;
 import com.zhentao.shouye.service.UserShouyeService;
+import com.zhentao.user.domain.UserLogin;
+import com.zhentao.user.dto.UserRegister;
+import com.zhentao.user.mapper.UserLoginMapper;
+import com.zhentao.userRelationships.domain.UserRelationships;
+import com.zhentao.userRelationships.mapper.UserRelationshipsMapper;
 import com.zhentao.vo.Result;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -25,10 +30,11 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static io.lettuce.core.BitFieldArgs.Builder.set;
 
 /**
 * @author lzy
@@ -53,10 +59,15 @@ public class GroupsServiceImpl extends ServiceImpl<GroupsMapper, Groupss>
     private UserShouyeService userShouyeService;
     @Autowired
     private GroupsMapper groupsMapper;
+    @Autowired
+    private UserLoginMapper userLoginMapper;
 
     @Autowired
     private GroupMemberCache groupMemberCache;
 
+    @Autowired
+    private UserRelationshipsMapper userRelationshipsMapper;
+
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout = 30)
     public Result addGroup(AddGroupsDto addGroupsDto) {
@@ -153,9 +164,39 @@ public class GroupsServiceImpl extends ServiceImpl<GroupsMapper, Groupss>
         return Result.ERR(null, "添加失败");
     }
 
+    @Override
+    public Result selectAddGroup(AddUserLoginDto addUserLoginDto) {
+        List<UserRelationships> userRelationships = userRelationshipsMapper.selectList(new LambdaQueryWrapper<UserRelationships>().eq(UserRelationships::getUserId, addUserLoginDto.getUid()));
+        if (userRelationships.size()==0){
+            return Result.ERR(null,"请先添加好友");
+        }
+        List<Long> friendId = userRelationships.stream().map(UserRelationships::getFriendId).collect(Collectors.toList());
+        List<GroupMembers> list = groupMembersMapper.selectList(new LambdaQueryWrapper<GroupMembers>().eq(GroupMembers::getGroupId, addUserLoginDto.getId()).in(GroupMembers::getUserId, friendId));
+
+        List<Long> collect = list.stream().map(GroupMembers::getUserId).collect(Collectors.toList());
+        if (collect.contains(friendId)){
+            return Result.ERR(null,"你的好友都已经加入该群了");
+        }
 
+        List<Long> collect1 = Stream.concat(collect.stream(), friendId.stream())
+                .collect(Collectors.toList())
+                .stream()
+                .filter(e -> Collections.frequency(
+                        Stream.concat(collect.stream(), friendId.stream()).collect(Collectors.toList()),
+                        e
+                ) == 1)
+                .distinct()
+                .collect(Collectors.toList());
+        if (collect1.size()==0){
+            return Result.ERR(null,"你的好友都已经在群中了");
+        }
+        List<UserLogin> userLogins = userLoginMapper.selectBatchIds(collect1);
 
-//     踢人
+        return Result.OK(userLogins,"查询成功");
+    }
+
+
+    //     踢人
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout = 30)
     public Result DelGroupMembers(DelGroupMembers delGroupMembers) {
@@ -237,7 +278,97 @@ public class GroupsServiceImpl extends ServiceImpl<GroupsMapper, Groupss>
         return list3;
     }
 
+//    查询群成员
+    @Override
+    public Result getGroupUsers(AddUserLoginDto groupId) {
+        Groupss groupss = this.baseMapper.selectById(groupId.getId());
+        Long groupId1 = groupss.getGroupId();
+        List<GroupMembers> list = groupMembersMapper.selectList(new LambdaQueryWrapper<GroupMembers>().eq(GroupMembers::getGroupId, groupId1));
+
+        List<Long> uid = list.stream().map(GroupMembers::getUserId).collect(Collectors.toList());
+        List<UserLogin> userLogins = userLoginMapper.selectBatchIds(uid);
+
+        GroupsVo groupsVos = new GroupsVo();
+        groupsVos.setName(groupss.getName());
+        groupsVos.setAvatar(groupss.getAvatar());
+        groupsVos.setDescription(groupss.getDescription());
+        groupsVos.setMaxMembers(groupss.getMaxMembers());
+        groupsVos.setStatus(groupss.getStatus());
+        groupsVos.setCreatedAt(groupss.getCreatedAt());
+        groupsVos.setUpdatedAt(groupss.getUpdatedAt());
+        groupsVos.setGroupId(groupss.getGroupId());
+        groupsVos.setCreatorId(groupss.getCreatorId());
+        groupsVos.setAnnouncement(groupss.getAnnouncement());
+        List<UserVo> userVos = new ArrayList<>();
+
+        Map<Long,GroupMembers> map = list.stream().collect(Collectors.toMap(GroupMembers::getUserId, groupMembers -> groupMembers));
+
+        for (UserLogin userLogin:userLogins){
+            UserVo userVo = new UserVo();
+            userVo.setUserId(userLogin.getId());
+            userVo.setNickName(userLogin.getNickName());
+            userVo.setImg(userLogin.getAvatar());
+            GroupMembers groupMembers1 = map.get(userLogin.getId());
+            userVo.setRole(groupMembers1.getRole());
+            userVos.add(userVo);
+        }
+        groupsVos.setUser(userVos);
+
+
+        return Result.OK(groupsVos,"查询成功");
+    }
+//  获取群的信息
+    @Override
+    public Result getGroupDetails(Long groupId) {
+        Groupss groupss = this.baseMapper.selectById(groupId);
+        if (groupss != null) {
+            return Result.OK(groupss, "查询成功");
+        } else {
+            return Result.ERR(null, "群聊不存在");
+        }
+    }
+
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout = 30)
+    public Result updateGroupMemberRole(UpdateGroupMemberRoleDto updateGroupMemberRoleDto) {
+        if (updateGroupMemberRoleDto.getGroupssId() == null || updateGroupMemberRoleDto.getUserId() == null || updateGroupMemberRoleDto.getRole() == null) {
+            return Result.ERR(null, "参数不能为空");
+        }
 
+        // 查找群成员
+        LambdaQueryWrapper<GroupMembers> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(GroupMembers::getGroupId, updateGroupMemberRoleDto.getGroupssId())
+                    .eq(GroupMembers::getUserId, updateGroupMemberRoleDto.getUserId());
+        GroupMembers groupMember = groupMembersMapper.selectOne(queryWrapper);
+
+        if (groupMember == null) {
+            return Result.ERR(null, "群成员不存在");
+        }
+
+        // 检查新的角色值是否有效
+        if (updateGroupMemberRoleDto.getRole() < 0 || updateGroupMemberRoleDto.getRole() > 1) { // 0-普通成员, 1-管理员
+            return Result.ERR(null, "无效的角色值");
+        }
+
+        // 更新角色
+        groupMember.setRole(updateGroupMemberRoleDto.getRole());
+        int rowsAffected = groupMembersMapper.updateById(groupMember);
+
+        if (rowsAffected > 0) {
+            // 更新群成员缓存 (如果需要的话,这里可以重新加载整个群的成员或者单独更新)
+            List<GroupMembers> remainingMembers = groupMembersService.list(
+                new LambdaQueryWrapper<GroupMembers>()
+                    .eq(GroupMembers::getGroupId, updateGroupMemberRoleDto.getGroupssId())
+            );
+            List<Long> memberIds = remainingMembers.stream()
+                .map(GroupMembers::getUserId)
+                .collect(Collectors.toList());
+            groupMemberCache.updateGroupMembers(updateGroupMemberRoleDto.getGroupssId(), memberIds);
+            return Result.OK(null, "成员角色更新成功");
+        } else {
+            return Result.ERR(null, "成员角色更新失败");
+        }
+    }
 }
 
 

+ 70 - 0
src/main/java/com/zhentao/groups/vo/GroupsVo.java

@@ -0,0 +1,70 @@
+package com.zhentao.groups.vo;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import jdk.internal.dynalink.linker.LinkerServices;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class GroupsVo<T> {
+
+
+
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    @TableId
+    private Long groupId;
+
+    /**
+     * 群名称
+     */
+    private String name;
+
+    /**
+     * 创建者ID
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long creatorId;
+
+    /**
+     * 群头像
+     */
+    private String avatar;
+
+    /**
+     * 群公告
+     */
+    private String announcement;
+
+    /**
+     * 群描述
+     */
+    private String description;
+
+    /**
+     * 最大成员数
+     */
+    private Integer maxMembers;
+
+    /**
+     * 状态(0-解散,1-正常)
+     */
+    private Integer status;
+
+    /**
+     * 创建时间
+     */
+    private Date createdAt;
+
+    /**
+     * 修改时间
+     */
+    private Date updatedAt;
+
+    private List<UserVo> user;
+
+
+
+}

+ 19 - 0
src/main/java/com/zhentao/groups/vo/UserVo.java

@@ -0,0 +1,19 @@
+package com.zhentao.groups.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import javax.persistence.criteria.CriteriaBuilder;
+
+@Data
+public class UserVo {
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long userId;
+    private String nickName;
+
+    private String img;
+
+
+    private Integer role;
+
+}

+ 6 - 2
src/main/java/com/zhentao/intercepoter/Userinterceptor.java

@@ -29,10 +29,14 @@ public class Userinterceptor implements HandlerInterceptor {
             return false;
         }
         String userIdFromToken = TokenUtils.getUserIdFromToken(token);
-        System.err.println("解析后的ID:"+userIdFromToken);
         String s = redisTemplate.opsForValue().get(userIdFromToken);
 
-        if (s!=null && s.equals(token)){
+        String userIdFromToken1 = TokenUtils.getUserIdFromToken(s);
+
+        System.err.println(userIdFromToken);
+        System.err.println(userIdFromToken1);
+
+        if (s!=null && userIdFromToken1.equals(userIdFromToken)){
             return true;
         }else {
             System.err.println("Token错误");

+ 45 - 3
src/main/java/com/zhentao/user/controller/UserController.java

@@ -78,21 +78,63 @@ public class UserController {
      */
     @PostMapping("/upload-avatar")
     @NullLogin
+    @CrossOrigin // 添加跨域支持
     public Map<String, Object> uploadAvatar(@NotNull(message = "请选择上传文件")
                                             @RequestParam("file") MultipartFile file) {
+        System.out.println("接收到文件上传请求:" + file.getOriginalFilename());
         Map<String, Object> result = new HashMap<>();
 
+        // 检查文件大小
+        if (file.isEmpty()) {
+            System.err.println("上传文件为空");
+            result.put("success", false);
+            result.put("message", "上传文件不能为空");
+            return result;
+        }
+
+        // 检查文件大小(例如限制在5MB)
+        long maxSize = 5 * 1024 * 1024; // 5MB
+        if (file.getSize() > maxSize) {
+            System.err.println("文件大小超过限制:" + file.getSize());
+            result.put("success", false);
+            result.put("message", "文件大小不能超过5MB");
+            return result;
+        }
+
+        // 检查文件类型
+        String originalFilename = file.getOriginalFilename();
+        String fileExtension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase();
+        String[] allowedExtensions = {"jpg", "jpeg", "png", "gif", "bmp"};
+        boolean isAllowedExtension = false;
+        for (String ext : allowedExtensions) {
+            if (fileExtension.equals(ext)) {
+                isAllowedExtension = true;
+                break;
+            }
+        }
+        if (!isAllowedExtension) {
+            System.err.println("不支持的文件类型:" + fileExtension);
+            result.put("success", false);
+            result.put("message", "仅支持jpg, jpeg, png, gif, bmp格式的图片");
+            return result;
+        }
+
         try {
             // 上传到OSS
             String url = ossUtil.uploadFile(file);
 
-            // TODO: 保存URL到数据库
-            // userService.updateAvatar(userId, url);
-
+            if (url == null) {
+                System.err.println("文件上传到OSS失败");
+                result.put("success", false);
+                result.put("message", "文件上传失败,请稍后重试");
+            } else {
+                System.out.println("文件上传成功:" + url);
             result.put("success", true);
             result.put("message", "上传成功");
             result.put("url", url);
+            }
         } catch (IOException e) {
+            System.err.println("文件上传异常:" + e.getMessage());
             result.put("success", false);
             result.put("message", "上传失败: " + e.getMessage());
         }

+ 8 - 4
src/main/resources/application.yml

@@ -7,13 +7,17 @@ netty:
 spring:
   application:
     name: im-server
+  servlet:
+    multipart:
+      max-file-size: 10MB
+      max-request-size: 10MB
 
   # MySQL配置
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://47.110.46.22:3306/IM?useSSL=false&useServerTime=UTC
+    url: jdbc:mysql://101.200.59.170:3306/IM?useSSL=false&useServerTime=UTC
     username: root
-    password: Fengjaijia0610
+    password: liziyang
 
   # JPA配置
   jpa:
@@ -28,11 +32,11 @@ spring:
   # MongoDB配置
   data:
     mongodb:
-      host: 47.110.46.22
+      host: 101.200.59.170
       port: 27017
       database: chat_messages
   redis:
-    host: 47.110.46.22
+    host: 101.200.59.170
     port: 6379
     database: 0
 aliyun: