feat: group related logic refactor

This commit is contained in:
merlin
2025-12-03 15:01:35 +08:00
parent 4597623cd9
commit b7f6d3477d
7 changed files with 342 additions and 4 deletions

View File

@@ -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.<Groups>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);
}
}
}

View File

@@ -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;

View File

@@ -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();
}
}

View File

@@ -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<GroupMapper, GroupInfo> {
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<GroupDetails> getGroups(Integer id) {
try {
List<Groups> groups = groupsMapper.selectList(Wrappers.<Groups>lambdaQuery().eq(Groups::getId,id));
// System.out.println(groups);
List<GroupDetails> 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<GroupInfo> searchGroups(GroupInfo groupInfo, Integer currentPage, Integer pageSize) {
try {
return groupMapper.selectPage(new Page<>(currentPage,pageSize),Wrappers.<GroupInfo>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.<Groups>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<UserInfo> getMember(Integer g_id, Integer currentPage, Integer pageSize) {
try {
List<Groups> ids = groupsMapper.selectPage(new Page<>(currentPage,pageSize),Wrappers.<Groups>lambdaQuery().eq(Groups::getG_id,g_id)).getRecords();
List<UserInfo> 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.<Groups>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.<Groups>lambdaQuery().eq(Groups::getG_id,g_id).eq(Groups::getId,id))==null) return false;
else {
groupsMapper.delete(Wrappers.<Groups>lambdaQuery().eq(Groups::getG_id,g_id).eq(Groups::getId,id));
return true;
}
} catch (Exception e) {
log.error(e.getMessage());
throw new RuntimeException(e);
}
}
}

View File

@@ -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<GroupsMapper, Groups> {
private final GroupsMapper groupsMapper;
public Integer groupIsAdmin(Integer id, Integer g_id) {
try {
Groups groups = groupsMapper.selectOne(Wrappers.<Groups>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);
}
}
}

View File

@@ -43,7 +43,8 @@ public class PlayroomServiceImpl extends ServiceImpl<PlayroomMapper, PlayroomInf
// TODO: 优化点使用xml语句写关联查询
public List<PlayroomDetails> getPlayrooms(Integer id) {
try {
List<Playrooms> playrooms = playroomsMapper.selectObjs(Wrappers.<Playrooms>lambdaQuery().eq(Playrooms::getId,id));
List<Playrooms> playrooms = playroomsMapper.selectList(Wrappers.<Playrooms>lambdaQuery().eq(Playrooms::getId,id));
// System.out.println(playrooms);
List<PlayroomDetails> 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 ServiceImpl<PlayroomMapper, PlayroomInf
@Transactional
public Integer deletePlayroom(PlayroomInfo playroomInfo) {
try {
return playroomsMapper.delete(Wrappers.<Playrooms>lambdaQuery().eq(Playrooms::getR_id,playroomInfo.getR_id()));
playroomsMapper.delete(Wrappers.<Playrooms>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);

View File

@@ -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","用户不在群组")
;