From b7f6d3477d481b293faa58da28e18a96ad133c70 Mon Sep 17 00:00:00 2001 From: merlin Date: Wed, 3 Dec 2025 15:01:35 +0800 Subject: [PATCH] feat: group related logic refactor --- .../controller/GroupController.java | 175 ++++++++++++++++++ .../merlin/myplayerbackend/entity/Groups.java | 4 + .../entity/http/GroupDetails.java | 28 +++ .../service/impl/GroupServiceImpl.java | 110 ++++++++++- .../service/impl/GroupsServiceImpl.java | 16 ++ .../service/impl/PlayroomServiceImpl.java | 6 +- .../utils/result/ResultCode.java | 7 +- 7 files changed, 342 insertions(+), 4 deletions(-) create mode 100644 src/main/java/xin/merlin/myplayerbackend/controller/GroupController.java create mode 100644 src/main/java/xin/merlin/myplayerbackend/entity/http/GroupDetails.java diff --git a/src/main/java/xin/merlin/myplayerbackend/controller/GroupController.java b/src/main/java/xin/merlin/myplayerbackend/controller/GroupController.java new file mode 100644 index 0000000..1976b74 --- /dev/null +++ b/src/main/java/xin/merlin/myplayerbackend/controller/GroupController.java @@ -0,0 +1,175 @@ +package xin.merlin.myplayerbackend.controller; + + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; +import xin.merlin.myplayerbackend.entity.GroupInfo; +import xin.merlin.myplayerbackend.entity.Groups; +import xin.merlin.myplayerbackend.entity.Playrooms; +import xin.merlin.myplayerbackend.entity.UserInfo; +import xin.merlin.myplayerbackend.service.impl.GroupServiceImpl; +import xin.merlin.myplayerbackend.service.impl.GroupsServiceImpl; +import xin.merlin.myplayerbackend.utils.JwtUtil; +import xin.merlin.myplayerbackend.utils.result.Response; +import xin.merlin.myplayerbackend.utils.result.ResultCode; + +import static com.baomidou.mybatisplus.extension.ddl.DdlScriptErrorHandler.PrintlnLogErrorHandler.log; + +@RestController +@RequestMapping("/group") +@RequiredArgsConstructor +public class GroupController { + + private final GroupServiceImpl groupService; + + private final GroupsServiceImpl groupsService; + + private final JwtUtil jwtUtil; + + private Boolean isAdmin(Integer id,Integer g_id){ + return groupsService.groupIsAdmin(id,g_id)==0; + } + + @PostMapping("/create") + Response createGroup(@RequestHeader("Authorization")String token, @RequestBody GroupInfo groupInfo){ + try { + token = token.substring(7); + Integer id = jwtUtil.getId(token); + return Response.success(ResultCode.SUCCESS, groupService.createGroup(id,groupInfo)); + } catch (Exception e) { + log.error(e.getMessage()); + return Response.fail(ResultCode.SERVER_ERROR); + } + } + + @GetMapping("/get") + Response getGroup(@RequestHeader("Authorization")String token){ + try { + token = token.substring(7); + Integer id = jwtUtil.getId(token); + return Response.success(ResultCode.SUCCESS,groupService.getGroups(id)); + } catch (Exception e) { + log.error(e.getMessage()); + return Response.fail(ResultCode.SERVER_ERROR); + } + } + + @PostMapping("/search") + Response searchGroup(@RequestHeader("Authorization")String token, @RequestBody GroupInfo groupInfo){ + // TODO:视情况开放api参数currentPage和 pageSize + try { + Integer currentPage = 1; + Integer pageSize = 10; + return Response.success(ResultCode.SUCCESS,groupService.searchGroups(groupInfo,currentPage,pageSize)); + } catch (Exception e) { + log.error(e.getMessage()); + return Response.fail(ResultCode.SERVER_ERROR); + } + } + +// 主动加入群聊 + @GetMapping("/join/{g_id}") + Response joinGroup(@RequestHeader("Authorization")String token, @PathVariable Integer g_id){ + try { + token = token.substring(7); + Integer id = jwtUtil.getId(token); + if(!groupService.joinGroup(id,g_id)) return Response.success(ResultCode.GROUP_USER_EXISTED); + return Response.success(ResultCode.SUCCESS); + } catch (Exception e) { + log.error(e.getMessage()); + return Response.fail(ResultCode.SERVER_ERROR); + } + + } + + @PostMapping("/join/{g_id}") + Response joinGroup(@PathVariable Integer g_id,@RequestBody UserInfo userInfo){ + try { + if(!groupService.joinGroup(userInfo.getId(),g_id)) return Response.success(ResultCode.GROUP_USER_EXISTED); + return Response.success(ResultCode.SUCCESS); + } catch (Exception e) { + log.error(e.getMessage()); + return Response.fail(ResultCode.SERVER_ERROR); + } + } + + @GetMapping("/leave/{g_id}") + Response leaveGroup(@RequestHeader("Authorization")String token, @PathVariable Integer g_id){ + try { + token = token.substring(7); + Integer id = jwtUtil.getId(token); + if(!groupService.leaveGroup(id,g_id)) return Response.success(ResultCode.GROUP_USER_NOT_EXISTED); + return Response.success(ResultCode.SUCCESS); + } catch (Exception e) { + log.error(e.getMessage()); + return Response.fail(ResultCode.SERVER_ERROR); + } + } + + @PostMapping("/leave/{g_id}") + Response leaveGroup(@RequestHeader("Authorization")String token,@PathVariable Integer g_id,@RequestBody UserInfo userInfo){ + try { + token = token.substring(7); + Integer id = jwtUtil.getId(token); + if(!isAdmin(id,g_id)) return Response.success(ResultCode.ACCOUNT_PERMISSION_DENY); + if(!groupService.leaveGroup(id,g_id)) return Response.success(ResultCode.GROUP_USER_NOT_EXISTED); + return Response.success(ResultCode.SUCCESS); + } catch (Exception e) { + log.error(e.getMessage()); + return Response.fail(ResultCode.SERVER_ERROR); + } + } + + + @PostMapping("/update") + Response updatePlayroom(@RequestHeader("Authorization")String token, @RequestBody GroupInfo groupInfo) { + try { + token = token.substring(7); + Integer id = jwtUtil.getId(token); + if(!isAdmin(id,groupInfo.getG_id())) return Response.success(ResultCode.ACCOUNT_PERMISSION_DENY); + groupService.updateById(groupInfo); + return Response.success(ResultCode.SUCCESS); + } catch (Exception e) { + log.error(e.getMessage()); + return Response.fail(ResultCode.SERVER_ERROR); + } + } + + @PostMapping("/delete") + Response deletePlayroom(@RequestHeader("Authorization")String token, @RequestBody GroupInfo groupInfo) { + try { + token = token.substring(7); + Integer id = jwtUtil.getId(token); + if(!isAdmin(id,groupInfo.getG_id())) return Response.success(ResultCode.ACCOUNT_PERMISSION_DENY); + return Response.success(ResultCode.SUCCESS,groupService.deletePlayroom(groupInfo)); + } catch (Exception e) { + log.error(e.getMessage()); + return Response.fail(ResultCode.SERVER_ERROR); + } + } + + @GetMapping("/member/{g_id}") + Response getMember(@PathVariable("g_id")Integer g_id,@RequestParam Integer currentPage,@RequestParam Integer pageSize){ + try { + return Response.success(ResultCode.SUCCESS,groupService.getMember(g_id,currentPage,pageSize)); + } catch (Exception e) { + log.error(e.getMessage()); + return Response.fail(ResultCode.SERVER_ERROR); + } + } + + @PostMapping("/member/delete/{g_id}") + Response deleteMember(@RequestHeader("Authorization")String token, @PathVariable("g_id")Integer g_id, @RequestBody UserInfo userInfo){ + try { + token = token.substring(7); + Integer id = jwtUtil.getId(token); + if(!isAdmin(id,g_id)) return Response.success(ResultCode.ACCOUNT_PERMISSION_DENY); + groupsService.remove(Wrappers.lambdaQuery().eq(Groups::getG_id,g_id).eq(Groups::getId,userInfo.getId())); + return Response.success(ResultCode.SUCCESS); + } catch (Exception e) { + log.error(e.getMessage()); + return Response.fail(ResultCode.SERVER_ERROR); + } + } +} diff --git a/src/main/java/xin/merlin/myplayerbackend/entity/Groups.java b/src/main/java/xin/merlin/myplayerbackend/entity/Groups.java index 927a413..826bd99 100644 --- a/src/main/java/xin/merlin/myplayerbackend/entity/Groups.java +++ b/src/main/java/xin/merlin/myplayerbackend/entity/Groups.java @@ -1,10 +1,14 @@ package xin.merlin.myplayerbackend.entity; import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; @Data @TableName("groups") +@AllArgsConstructor +@NoArgsConstructor public class Groups { private Integer g_id; private Integer id; diff --git a/src/main/java/xin/merlin/myplayerbackend/entity/http/GroupDetails.java b/src/main/java/xin/merlin/myplayerbackend/entity/http/GroupDetails.java new file mode 100644 index 0000000..984dded --- /dev/null +++ b/src/main/java/xin/merlin/myplayerbackend/entity/http/GroupDetails.java @@ -0,0 +1,28 @@ +package xin.merlin.myplayerbackend.entity.http; + + +import lombok.Data; +import lombok.NoArgsConstructor; +import xin.merlin.myplayerbackend.entity.GroupInfo; +import xin.merlin.myplayerbackend.entity.Groups; + +@Data +@NoArgsConstructor +public class GroupDetails { + private Integer g_id; + private String g_name; + private String g_introduction; + private String g_avatar; + private Integer id; + private Integer role; + + public GroupDetails(GroupInfo groupInfo, Groups groups) { + this.g_id = groupInfo.getG_id(); + this.g_name = groupInfo.getG_name(); + this.g_introduction = groupInfo.getG_introduction(); + this.g_avatar = groupInfo.getG_avatar(); + this.id = groups.getId(); + this.role = groups.getRole(); + } + +} diff --git a/src/main/java/xin/merlin/myplayerbackend/service/impl/GroupServiceImpl.java b/src/main/java/xin/merlin/myplayerbackend/service/impl/GroupServiceImpl.java index ea76e25..3897fc3 100644 --- a/src/main/java/xin/merlin/myplayerbackend/service/impl/GroupServiceImpl.java +++ b/src/main/java/xin/merlin/myplayerbackend/service/impl/GroupServiceImpl.java @@ -1,10 +1,118 @@ package xin.merlin.myplayerbackend.service.impl; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import xin.merlin.myplayerbackend.entity.GroupInfo; +import org.springframework.transaction.annotation.Transactional; +import xin.merlin.myplayerbackend.entity.*; +import xin.merlin.myplayerbackend.entity.http.GroupDetails; +import xin.merlin.myplayerbackend.entity.http.PlayroomDetails; import xin.merlin.myplayerbackend.mapper.GroupMapper; +import xin.merlin.myplayerbackend.mapper.GroupsMapper; +import xin.merlin.myplayerbackend.mapper.UserMapper; + +import java.util.ArrayList; +import java.util.List; @Service +@RequiredArgsConstructor public class GroupServiceImpl extends ServiceImpl { + + private final UserMapper userMapper; + + private final GroupMapper groupMapper; + + private final GroupsMapper groupsMapper; + + @Transactional + public GroupInfo createGroup(Integer id, GroupInfo groupInfo) { + try { + groupMapper.insert(groupInfo); + groupsMapper.insert(new Groups(groupInfo.getG_id(),id,0)); + return groupInfo; + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException(e); + } + } + +// TODO: 优化点:使用xml语句写关联查询 + public List getGroups(Integer id) { + try { + List groups = groupsMapper.selectList(Wrappers.lambdaQuery().eq(Groups::getId,id)); +// System.out.println(groups); + List groupDetails = new ArrayList<>(); + for (Groups group : groups) { + groupDetails.add(new GroupDetails(groupMapper.selectById(group.getG_id()),group)); + } + return groupDetails; + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException(e); + } + } + + public Page searchGroups(GroupInfo groupInfo, Integer currentPage, Integer pageSize) { + try { + return groupMapper.selectPage(new Page<>(currentPage,pageSize),Wrappers.lambdaQuery().like(GroupInfo::getG_name,groupInfo.getG_name())); + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException(e); + } + } + + @Transactional + public Integer deletePlayroom(GroupInfo groupInfo) { + try { + groupsMapper.delete(Wrappers.lambdaQuery().eq(Groups::getG_id,groupInfo.getG_id())); + return groupMapper.deleteById(groupInfo.getG_id()); + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException(e); + } + } + + public List getMember(Integer g_id, Integer currentPage, Integer pageSize) { + try { + List ids = groupsMapper.selectPage(new Page<>(currentPage,pageSize),Wrappers.lambdaQuery().eq(Groups::getG_id,g_id)).getRecords(); + List members = new ArrayList<>(); + for(Groups group:ids){ + members.add(userMapper.selectById(group.getId())); + } + return members; + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException(e); + } + } + + @Transactional + public Boolean joinGroup(Integer id, Integer g_id) { + try { + if(groupsMapper.selectOne(Wrappers.lambdaQuery().eq(Groups::getG_id,g_id).eq(Groups::getId,id))!=null) return false; + else { + groupsMapper.insert(new Groups(g_id,id,1)); + return true; + } + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException(e); + } + } + + public Boolean leaveGroup(Integer id, Integer g_id) { + try { + if(groupsMapper.selectOne(Wrappers.lambdaQuery().eq(Groups::getG_id,g_id).eq(Groups::getId,id))==null) return false; + else { + groupsMapper.delete(Wrappers.lambdaQuery().eq(Groups::getG_id,g_id).eq(Groups::getId,id)); + return true; + } + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException(e); + } + } + } diff --git a/src/main/java/xin/merlin/myplayerbackend/service/impl/GroupsServiceImpl.java b/src/main/java/xin/merlin/myplayerbackend/service/impl/GroupsServiceImpl.java index 3995404..ec80edf 100644 --- a/src/main/java/xin/merlin/myplayerbackend/service/impl/GroupsServiceImpl.java +++ b/src/main/java/xin/merlin/myplayerbackend/service/impl/GroupsServiceImpl.java @@ -1,10 +1,26 @@ package xin.merlin.myplayerbackend.service.impl; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import xin.merlin.myplayerbackend.entity.Groups; import xin.merlin.myplayerbackend.mapper.GroupsMapper; @Service +@RequiredArgsConstructor public class GroupsServiceImpl extends ServiceImpl { + + private final GroupsMapper groupsMapper; + + public Integer groupIsAdmin(Integer id, Integer g_id) { + try { + Groups groups = groupsMapper.selectOne(Wrappers.lambdaQuery().eq(Groups::getId,id).eq(Groups::getG_id,g_id)); + if (groups == null) return 1; + else return groups.getRole(); + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException(e); + } + } } diff --git a/src/main/java/xin/merlin/myplayerbackend/service/impl/PlayroomServiceImpl.java b/src/main/java/xin/merlin/myplayerbackend/service/impl/PlayroomServiceImpl.java index d68477b..b9bc17e 100644 --- a/src/main/java/xin/merlin/myplayerbackend/service/impl/PlayroomServiceImpl.java +++ b/src/main/java/xin/merlin/myplayerbackend/service/impl/PlayroomServiceImpl.java @@ -43,7 +43,8 @@ public class PlayroomServiceImpl extends ServiceImpl getPlayrooms(Integer id) { try { - List playrooms = playroomsMapper.selectObjs(Wrappers.lambdaQuery().eq(Playrooms::getId,id)); + List playrooms = playroomsMapper.selectList(Wrappers.lambdaQuery().eq(Playrooms::getId,id)); +// System.out.println(playrooms); List playroomDetails = new ArrayList<>(); for (Playrooms playroom : playrooms) { playroomDetails.add(new PlayroomDetails(playroomMapper.selectById(playroom.getR_id()),playroom)); @@ -68,7 +69,8 @@ public class PlayroomServiceImpl extends ServiceImpllambdaQuery().eq(Playrooms::getR_id,playroomInfo.getR_id())); + playroomsMapper.delete(Wrappers.lambdaQuery().eq(Playrooms::getR_id,playroomInfo.getR_id())); + return playroomMapper.deleteById(playroomInfo.getR_id()); } catch (Exception e) { log.error(e.getMessage()); throw new RuntimeException(e); diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/result/ResultCode.java b/src/main/java/xin/merlin/myplayerbackend/utils/result/ResultCode.java index ca354c7..d8ac0ec 100644 --- a/src/main/java/xin/merlin/myplayerbackend/utils/result/ResultCode.java +++ b/src/main/java/xin/merlin/myplayerbackend/utils/result/ResultCode.java @@ -52,7 +52,12 @@ public enum ResultCode { INVITING_ILLEGAL_REQUEST("4302","非法邀请"), INVITING_ILLEGAL_RESPONSE("4303","非法邀请"), INVITING_RE_REQUEST("4304","重复请求"), - INVITING_AUTH_ERROR("4305","权限错误"); + INVITING_AUTH_ERROR("4305","权限错误"), + + //群组相关 + GROUP_USER_EXISTED("4401","用户已加入群组"), + GROUP_USER_NOT_EXISTED("4402","用户不在群组") + ;