当前位置: 首页 > news >正文

SpringBoot+WebSocket实现即时通讯(三)

前言

紧接着上文《SpringBoot+WebSocket实现即时通讯(二)》

本博客姊妹篇

  • SpringBoot+WebSocket实现即时通讯(一)
  • SpringBoot+WebSocket实现即时通讯(二)
  • SpringBoot+WebSocket实现即时通讯(三)
  • SpringBoot+WebSocket实现即时通讯(四)

一、功能描述

  • 用户管理:业务自己实现,暂从数据库添加
  • 好友管理:添加好友、删除好友、修改备注、好友列表等
  • 群组管理:新建群、解散群、编辑群、变更群主、拉人进群、踢出群等
  • 聊天模式:私聊、群聊
  • 消息类型:系统、文本、语音、图片、视频
  • 聊天管理:删除聊天、置顶聊天、查看聊天记录等

二、好友、群组功能实现

2.1 好友

mapper

package com.qiangesoft.im.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qiangesoft.im.entity.ImFriend;/*** <p>* 好友 Mapper 接口* </p>** @author qiangesoft* @date 2024-02-07*/
public interface ImFriendMapper extends BaseMapper<ImFriend> {}

service

package com.qiangesoft.im.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.qiangesoft.im.entity.ImFriend;
import com.qiangesoft.im.pojo.dto.ImFriendDTO;
import com.qiangesoft.im.pojo.vo.ImFriendVO;import java.util.List;/*** <p>* 好友 服务类* </p>** @author qiangesoft* @date 2024-02-07*/
public interface IImFriendService extends IService<ImFriend> {/*** 添加好友** @param friendDTO*/void addFriend(ImFriendDTO friendDTO);/*** 删除好友** @param id*/void removeFriend(Long id);/*** 编辑好友信息** @param id* @param friendDTO*/void updateFriend(Long id, ImFriendDTO friendDTO);/*** 好友列表** @param keyword* @return*/List<ImFriendVO> listFriend(String keyword);/*** 好友详情** @param id* @return*/ImFriendVO getFriendInfo(Long id);
}
package com.qiangesoft.im.service.impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qiangesoft.im.auth.UserUtil;
import com.qiangesoft.im.entity.ImFriend;
import com.qiangesoft.im.exception.ServiceException;
import com.qiangesoft.im.mapper.ImFriendMapper;
import com.qiangesoft.im.pojo.dto.ImFriendDTO;
import com.qiangesoft.im.pojo.vo.ImFriendVO;
import com.qiangesoft.im.pojo.vo.SysUserVo;
import com.qiangesoft.im.service.IImFriendService;
import com.qiangesoft.im.service.ISysUserService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** <p>* 好友 服务实现类* </p>** @author qiangesoft* @date 2024-02-07*/
@RequiredArgsConstructor
@Service
public class ImFriendServiceImpl extends ServiceImpl<ImFriendMapper, ImFriend> implements IImFriendService {private final ISysUserService sysUserService;@Transactional(rollbackFor = RuntimeException.class)@Overridepublic void addFriend(ImFriendDTO friendDTO) {Long userId = UserUtil.getUserId();Long friendUserId = friendDTO.getFriendUserId();if (userId.equals(friendUserId)) {throw new ServiceException("不能添加自己!");}LambdaQueryWrapper<ImFriend> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(ImFriend::getUserId, userId).eq(ImFriend::getFriendUserId, friendUserId).eq(ImFriend::getDelFlag, false);Long count = baseMapper.selectCount(queryWrapper);if (count > 0) {throw new ServiceException("已添加过好友!");}ImFriend friend = new ImFriend();friend.setUserId(userId);friend.setFriendUserId(friendDTO.getFriendUserId());friend.setRemark(friendDTO.getRemark());friend.setDelFlag(false);baseMapper.insert(friend);}@Overridepublic void removeFriend(Long id) {LambdaUpdateWrapper<ImFriend> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(ImFriend::getId, id).set(ImFriend::getDelFlag, true);baseMapper.update(null, updateWrapper);}@Overridepublic void updateFriend(Long id, ImFriendDTO friendDTO) {LambdaUpdateWrapper<ImFriend> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(ImFriend::getId, id).set(ImFriend::getRemark, friendDTO.getRemark());baseMapper.update(null, updateWrapper);}@Overridepublic List<ImFriendVO> listFriend(String keyword) {LambdaQueryWrapper<ImFriend> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.like(StringUtils.isNotBlank(keyword), ImFriend::getRemark, keyword).eq(ImFriend::getDelFlag, false);List<ImFriend> friendList = baseMapper.selectList(queryWrapper);List<ImFriendVO> friendVOList = new ArrayList<>();if (CollectionUtils.isEmpty(friendList)) {return friendVOList;}List<Long> userIdList = friendList.stream().map(ImFriend::getFriendUserId).collect(Collectors.toList());Map<Long, SysUserVo> sysUserVoMap = sysUserService.listByIds(userIdList).stream().map(SysUserVo::fromEntity).collect(Collectors.toMap(SysUserVo::getId, sysUserVo -> sysUserVo));for (ImFriend friend : friendList) {ImFriendVO friendVO = new ImFriendVO();friendVO.setId(friend.getId());friendVO.setFriendUser(sysUserVoMap.get(friend.getFriendUserId()));friendVO.setRemark(friend.getRemark());friendVOList.add(friendVO);}return friendVOList;}@Overridepublic ImFriendVO getFriendInfo(Long id) {LambdaQueryWrapper<ImFriend> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(ImFriend::getId, id).eq(ImFriend::getDelFlag, false);ImFriend friend = baseMapper.selectOne(queryWrapper);if (friend == null) {throw new ServiceException("未添加为好友!");}SysUserVo sysUserVo = SysUserVo.fromEntity(sysUserService.getById(friend.getFriendUserId()));ImFriendVO friendVO = new ImFriendVO();friendVO.setId(friend.getId());friendVO.setFriendUser(sysUserVo);friendVO.setRemark(friend.getRemark());return friendVO;}
}

controller

package com.qiangesoft.im.controller;import com.qiangesoft.im.pojo.dto.ImFriendDTO;
import com.qiangesoft.im.pojo.vo.ImFriendVO;
import com.qiangesoft.im.pojo.vo.ResultInfo;
import com.qiangesoft.im.service.IImFriendService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** <p>* 好友 前端控制器* </p>** @author qiangesoft* @date 2024-02-07*/
@Api(tags = "好友")
@RequiredArgsConstructor
@RestController
@RequestMapping("/im/friend")
public class ImFriendController {private final IImFriendService friendService;@PostMapping@ApiOperation(value = "添加好友")public ResultInfo<Void> addFriend(@RequestBody ImFriendDTO friendDTO) {friendService.addFriend(friendDTO);return ResultInfo.ok();}@DeleteMapping("/{id}")@ApiOperation(value = "删除好友")public ResultInfo<Void> removeFriend(@PathVariable Long id) {friendService.removeFriend(id);return ResultInfo.ok();}@PutMapping("/{id}")@ApiOperation(value = "编辑好友")public ResultInfo<Void> updateFriend(@PathVariable Long id, @RequestBody ImFriendDTO friendDTO) {friendService.updateFriend(id, friendDTO);return ResultInfo.ok();}@GetMapping@ApiOperation(value = "好友列表")public ResultInfo<List<ImFriendVO>> listFriend(String keyword) {return ResultInfo.ok(friendService.listFriend(keyword));}@GetMapping("/{id}")@ApiOperation(value = "好友详情")public ResultInfo<ImFriendVO> getFriendInfo(@PathVariable Long id) {return ResultInfo.ok(friendService.getFriendInfo(id));}}

2.2 群组

mapper

package com.qiangesoft.im.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qiangesoft.im.entity.ImGroup;/*** <p>* 群组 Mapper 接口* </p>** @author qiangesoft* @date 2024-02-07*/
public interface ImGroupMapper extends BaseMapper<ImGroup> {}
package com.qiangesoft.im.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qiangesoft.im.entity.ImGroupUser;/*** <p>* 群成员 Mapper 接口* </p>** @author qiangesoft* @date 2024-02-07*/
public interface ImGroupUserMapper extends BaseMapper<ImGroupUser> {}
package com.qiangesoft.im.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.qiangesoft.im.entity.ImGroup;
import com.qiangesoft.im.pojo.dto.ImGroupDTO;
import com.qiangesoft.im.pojo.dto.ImGroupMasterDTO;
import com.qiangesoft.im.pojo.vo.ImGroupInfoVO;
import com.qiangesoft.im.pojo.vo.ImGroupVO;import java.util.List;/*** <p>* 群组 服务类* </p>** @author qiangesoft* @date 2024-02-07*/
public interface IImGroupService extends IService<ImGroup> {/*** 建群** @param groupDTO*/void addGroup(ImGroupDTO groupDTO);/*** 解散群** @param id*/void removeGroup(Long id);/*** 编辑群** @param id* @param groupDTO*/void updateGroup(Long id, ImGroupDTO groupDTO);/*** 群列表** @param keyword* @return*/List<ImGroupVO> listGroup(String keyword);/*** 群详情** @param id* @return*/ImGroupInfoVO getGroupInfo(Long id);/*** 变更群主** @param groupMasterDTO*/void updateMaster(ImGroupMasterDTO groupMasterDTO);/*** 校验群组** @param id* @return*/ImGroup validateGroup(Long id);
}
package com.qiangesoft.im.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.qiangesoft.im.entity.ImGroupUser;
import com.qiangesoft.im.pojo.dto.ImGroupUserDTO;
import com.qiangesoft.im.pojo.vo.SysUserVo;import java.util.List;/*** <p>* 群成员 服务类* </p>** @author qiangesoft* @date 2024-02-07*/
public interface IImGroupUserService extends IService<ImGroupUser> {/*** 添加群成员** @param groupUserDTO*/void addGroupUser(ImGroupUserDTO groupUserDTO);/*** 删除群成员** @param groupUserDTO*/void removeGroupUser(ImGroupUserDTO groupUserDTO);/*** 群成员列表** @param id* @return*/List<SysUserVo> listGroupUser(Long id);}
package com.qiangesoft.im.service.impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qiangesoft.im.auth.UserUtil;
import com.qiangesoft.im.entity.ImGroup;
import com.qiangesoft.im.entity.ImGroupUser;
import com.qiangesoft.im.entity.SysUser;
import com.qiangesoft.im.exception.ServiceException;
import com.qiangesoft.im.mapper.ImGroupMapper;
import com.qiangesoft.im.pojo.dto.ImGroupDTO;
import com.qiangesoft.im.pojo.dto.ImGroupMasterDTO;
import com.qiangesoft.im.pojo.vo.ImGroupInfoVO;
import com.qiangesoft.im.pojo.vo.ImGroupVO;
import com.qiangesoft.im.pojo.vo.SysUserVo;
import com.qiangesoft.im.service.IImGroupService;
import com.qiangesoft.im.service.IImGroupUserService;
import com.qiangesoft.im.service.ISysUserService;
import com.qiangesoft.im.util.IdSplitUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** <p>* 群组 服务实现类* </p>** @author qiangesoft* @date 2024-02-07*/
@Service
public class ImGroupServiceImpl extends ServiceImpl<ImGroupMapper, ImGroup> implements IImGroupService {@Autowiredprivate IImGroupUserService groupUserService;@Autowiredprivate ISysUserService sysUserService;@Transactional(rollbackFor = RuntimeException.class)@Overridepublic void addGroup(ImGroupDTO groupDTO) {Long userId = UserUtil.getUserId();ImGroup group = new ImGroup();group.setName(groupDTO.getName());group.setAvatar(groupDTO.getAvatar());group.setMaster(userId);group.setManager(IdSplitUtil.listToStr(groupDTO.getManager()));group.setNotice(groupDTO.getNotice());group.setRemark(groupDTO.getRemark());group.setDelFlag(false);baseMapper.insert(group);// 群成员List<ImGroupUser> groupUserList = new ArrayList<>();List<Long> memberIdList = groupDTO.getMemberIdList();if (!memberIdList.contains(userId)) {memberIdList.add(userId);}for (Long memberId : memberIdList) {ImGroupUser groupUser = new ImGroupUser();groupUser.setGroupId(group.getId());groupUser.setUserId(memberId);groupUser.setDelFlag(false);groupUserList.add(groupUser);}groupUserService.saveBatch(groupUserList);}@Overridepublic void removeGroup(Long id) {LambdaUpdateWrapper<ImGroup> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(ImGroup::getId, id).set(ImGroup::getDelFlag, true);baseMapper.update(null, updateWrapper);}@Overridepublic void updateGroup(Long id, ImGroupDTO groupDTO) {ImGroup group = this.validateGroup(id);if (group.getDelFlag()) {throw new ServiceException("群组已解散!");}group.setName(groupDTO.getName());group.setAvatar(groupDTO.getAvatar());group.setManager(IdSplitUtil.listToStr(groupDTO.getManager()));group.setNotice(groupDTO.getNotice());group.setRemark(groupDTO.getRemark());baseMapper.updateById(group);}@Overridepublic List<ImGroupVO> listGroup(String keyword) {LambdaQueryWrapper<ImGroup> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.like(StringUtils.isNotBlank(keyword), ImGroup::getRemark, keyword).eq(ImGroup::getDelFlag, false);List<ImGroup> groupList = baseMapper.selectList(queryWrapper);List<ImGroupVO> groupVOList = new ArrayList<>();if (CollectionUtils.isEmpty(groupList)) {return groupVOList;}for (ImGroup group : groupList) {ImGroupVO groupVO = new ImGroupVO();groupVO.setId(group.getId());groupVO.setName(group.getName());groupVO.setAvatar(group.getAvatar());groupVO.setRemark(group.getRemark());groupVO.setCreateTime(group.getCreateTime().getTime());groupVOList.add(groupVO);}return groupVOList;}@Overridepublic ImGroupInfoVO getGroupInfo(Long id) {ImGroup group = this.validateGroup(id);ImGroupInfoVO vo = new ImGroupInfoVO();vo.setId(group.getId());vo.setName(group.getName());vo.setAvatar(group.getAvatar());vo.setNotice(group.getNotice());vo.setRemark(group.getRemark());vo.setCreateTime(group.getCreateTime().getTime());// 群主Long masterId = group.getMaster();if (masterId != null) {SysUser master = sysUserService.getById(masterId);if (master != null) {SysUserVo masterVo = SysUserVo.fromEntity(master);vo.setMaster(masterVo);}}// 群管理String manager = group.getManager();List<Long> managerIdList = IdSplitUtil.strToList(manager);if (!CollectionUtils.isEmpty(managerIdList)) {List<SysUserVo> managerUserList = sysUserService.listByIds(managerIdList).stream().map(SysUserVo::fromEntity).collect(Collectors.toList());vo.setManagerList(managerUserList);}// 群成员List<SysUserVo> userVoList = new ArrayList<>();LambdaQueryWrapper<ImGroupUser> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(ImGroupUser::getGroupId, id).eq(ImGroupUser::getDelFlag, false);List<ImGroupUser> groupUserList = groupUserService.list(queryWrapper);if (CollectionUtils.isEmpty(groupUserList)) {vo.setMemberList(userVoList);return vo;}List<Long> userIdList = groupUserList.stream().map(ImGroupUser::getUserId).collect(Collectors.toList());Map<Long, SysUserVo> sysUserVOMap = sysUserService.listByIds(userIdList).stream().map(SysUserVo::fromEntity).collect(Collectors.toMap(SysUserVo::getId, sysUserVo -> sysUserVo));for (ImGroupUser groupUser : groupUserList) {SysUserVo sysUserVo = sysUserVOMap.get(groupUser.getUserId());if (sysUserVo != null) {userVoList.add(sysUserVo);}}vo.setMemberList(userVoList);return vo;}@Overridepublic void updateMaster(ImGroupMasterDTO groupMasterDTO) {Long id = groupMasterDTO.getId();ImGroup group = this.validateGroup(id);if (group.getDelFlag()) {throw new ServiceException("群组已解散!");}LambdaUpdateWrapper<ImGroup> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(ImGroup::getId, id).set(ImGroup::getMaster, groupMasterDTO.getMaster());baseMapper.update(null, updateWrapper);}@Overridepublic ImGroup validateGroup(Long id) {ImGroup group = baseMapper.selectById(id);if (group == null) {throw new ServiceException("群组不存在");}return group;}
}
package com.qiangesoft.im.service.impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qiangesoft.im.auth.UserUtil;
import com.qiangesoft.im.entity.ImGroup;
import com.qiangesoft.im.entity.ImGroupUser;
import com.qiangesoft.im.exception.ServiceException;
import com.qiangesoft.im.mapper.ImGroupUserMapper;
import com.qiangesoft.im.pojo.dto.ImGroupUserDTO;
import com.qiangesoft.im.pojo.vo.SysUserVo;
import com.qiangesoft.im.service.IImGroupService;
import com.qiangesoft.im.service.IImGroupUserService;
import com.qiangesoft.im.service.ISysUserService;
import com.qiangesoft.im.util.IdSplitUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** <p>* 群成员 服务实现类* </p>** @author qiangesoft* @date 2024-02-07*/
@Service
public class ImGroupUserServiceImpl extends ServiceImpl<ImGroupUserMapper, ImGroupUser> implements IImGroupUserService {@Autowiredprivate ISysUserService sysUserService;@Lazy@Autowiredprivate IImGroupService groupService;@Transactional(rollbackFor = RuntimeException.class)@Overridepublic void addGroupUser(ImGroupUserDTO groupUserDTO) {Long groupId = groupUserDTO.getGroupId();ImGroup group = groupService.validateGroup(groupId);if (group.getDelFlag()) {throw new ServiceException("群组已解散!");}Long userId = UserUtil.getUserId();List<Long> managerIdList = IdSplitUtil.strToList(group.getManager());if (group.getMaster().equals(userId)) {throw new ServiceException("无添加好友权限!");} else {if (!managerIdList.contains(userId)) {throw new ServiceException("无添加好友权限!");}}List<Long> memberIdList = groupUserDTO.getMemberIdList();if (memberIdList.contains(userId)) {throw new ServiceException("你是群主,不可添加!");}LambdaQueryWrapper<ImGroupUser> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(ImGroupUser::getGroupId, groupId).eq(ImGroupUser::getDelFlag, false);List<Long> existMemberIdList = baseMapper.selectList(queryWrapper).stream().map(ImGroupUser::getUserId).collect(Collectors.toList());List<Long> notExistMemberIdList = memberIdList.stream().filter(e -> !existMemberIdList.contains(e)).collect(Collectors.toList());List<ImGroupUser> groupUserList = new ArrayList<>();for (Long memberId : notExistMemberIdList) {ImGroupUser groupUser = new ImGroupUser();groupUser.setGroupId(groupId);groupUser.setUserId(memberId);groupUser.setDelFlag(false);groupUserList.add(groupUser);}this.saveBatch(groupUserList);}@Transactional(rollbackFor = RuntimeException.class)@Overridepublic void removeGroupUser(ImGroupUserDTO groupUserDTO) {Long groupId = groupUserDTO.getGroupId();ImGroup group = groupService.validateGroup(groupId);if (group.getDelFlag()) {throw new ServiceException("群组已解散!");}Long userId = UserUtil.getUserId();List<Long> managerIdList = IdSplitUtil.strToList(group.getManager());if (group.getMaster().equals(userId)) {throw new ServiceException("无移除好友权限!");} else {if (!managerIdList.contains(userId)) {throw new ServiceException("无移除好友权限!");}}List<Long> memberIdList = groupUserDTO.getMemberIdList();if (memberIdList.contains(userId)) {throw new ServiceException("不能移除自己!");}LambdaUpdateWrapper<ImGroupUser> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(ImGroupUser::getGroupId, groupId).in(ImGroupUser::getUserId, memberIdList).set(ImGroupUser::getDelFlag, true);baseMapper.update(null, updateWrapper);// 去除管理员权限List<Long> collect = managerIdList.stream().filter(e -> !memberIdList.contains(e)).collect(Collectors.toList());LambdaUpdateWrapper<ImGroup> updateWrapper1 = new LambdaUpdateWrapper<>();updateWrapper1.eq(ImGroup::getId, groupId).set(ImGroup::getManager, IdSplitUtil.listToStr(collect));groupService.update(updateWrapper1);}@Overridepublic List<SysUserVo> listGroupUser(Long id) {groupService.validateGroup(id);List<SysUserVo> userVoList = new ArrayList<>();LambdaQueryWrapper<ImGroupUser> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(ImGroupUser::getGroupId, id).eq(ImGroupUser::getDelFlag, false);List<ImGroupUser> groupUserList = baseMapper.selectList(queryWrapper);if (CollectionUtils.isEmpty(groupUserList)) {return userVoList;}List<Long> userIdList = groupUserList.stream().map(ImGroupUser::getUserId).collect(Collectors.toList());Map<Long, SysUserVo> sysUserVOMap = sysUserService.listByIds(userIdList).stream().map(SysUserVo::fromEntity).collect(Collectors.toMap(SysUserVo::getId, sysUserVo -> sysUserVo));for (ImGroupUser groupUser : groupUserList) {SysUserVo sysUserVo = sysUserVOMap.get(groupUser.getUserId());if (sysUserVo != null) {userVoList.add(sysUserVo);}}return userVoList;}
}

controller

package com.qiangesoft.im.controller;import com.qiangesoft.im.pojo.dto.ImGroupDTO;
import com.qiangesoft.im.pojo.dto.ImGroupMasterDTO;
import com.qiangesoft.im.pojo.vo.ImGroupInfoVO;
import com.qiangesoft.im.pojo.vo.ImGroupVO;
import com.qiangesoft.im.pojo.vo.ResultInfo;
import com.qiangesoft.im.service.IImGroupService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** <p>* 群组 前端控制器* </p>** @author qiangesoft* @date 2024-02-07*/
@Api(tags = "群组")
@RestController
@RequestMapping("/im/group")
public class ImGroupController {@Autowiredprivate IImGroupService groupService;@PostMapping@ApiOperation(value = "建群")public ResultInfo<Void> addGroup(@RequestBody ImGroupDTO groupDTO) {groupService.addGroup(groupDTO);return ResultInfo.ok();}@DeleteMapping("/{id}")@ApiOperation(value = "解散群")public ResultInfo<Void> removeGroup(@PathVariable Long id) {groupService.removeGroup(id);return ResultInfo.ok();}@PutMapping("/{id}")@ApiOperation(value = "编辑群")public ResultInfo<Void> updateGroup(@PathVariable Long id, @RequestBody ImGroupDTO groupDTO) {groupService.updateGroup(id, groupDTO);return ResultInfo.ok();}@GetMapping@ApiOperation(value = "群列表")public ResultInfo<List<ImGroupVO>> listGroup(String keyword) {return ResultInfo.ok(groupService.listGroup(keyword));}@GetMapping("/{id}")@ApiOperation(value = "群详情")public ResultInfo<ImGroupInfoVO> getGroupInfo(@PathVariable Long id) {return ResultInfo.ok(groupService.getGroupInfo(id));}@GetMapping("/updateMaster")@ApiOperation(value = "变更群主")public ResultInfo<Void> updateMaster(@RequestBody ImGroupMasterDTO groupMasterDTO) {groupService.updateMaster(groupMasterDTO);return ResultInfo.ok();}
}
package com.qiangesoft.im.controller;import com.qiangesoft.im.pojo.dto.ImGroupUserDTO;
import com.qiangesoft.im.pojo.vo.ResultInfo;
import com.qiangesoft.im.pojo.vo.SysUserVo;
import com.qiangesoft.im.service.IImGroupUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** <p>* 群成员 前端控制器* </p>** @author qiangesoft* @date 2024-02-07*/
@Api(tags = "群成员")
@RestController
@RequestMapping("/im/groupUser")
public class ImGroupUserController {@Autowiredprivate IImGroupUserService groupUserService;@PostMapping@ApiOperation(value = "添加群成员")public ResultInfo<Void> addGroupUser(@RequestBody ImGroupUserDTO groupUserDTO) {groupUserService.addGroupUser(groupUserDTO);return ResultInfo.ok();}@DeleteMapping@ApiOperation(value = "删除群成员")public ResultInfo<Void> removeGroupUser(@RequestBody ImGroupUserDTO groupUserDTO) {groupUserService.removeGroupUser(groupUserDTO);return ResultInfo.ok();}@GetMapping("/{id}")@ApiOperation(value = "群成员列表")public ResultInfo<List<SysUserVo>> listGroupUser(@PathVariable Long id) {return ResultInfo.ok(groupUserService.listGroupUser(id));}}

三、源码地址

源码地址:https://gitee.com/qiangesoft/boot-business/tree/master/boot-business-im

后续内容见下章

相关文章:

SpringBoot+WebSocket实现即时通讯(三)

前言 紧接着上文《SpringBootWebSocket实现即时通讯&#xff08;二&#xff09;》 本博客姊妹篇 SpringBootWebSocket实现即时通讯&#xff08;一&#xff09;SpringBootWebSocket实现即时通讯&#xff08;二&#xff09;SpringBootWebSocket实现即时通讯&#xff08;三&…...

vue3前端项目开发,具备纯天然的防止爬虫采集的特征

vue3前端项目开发,具备纯天然的防止爬虫采集的特征&#xff01;众所周知&#xff0c;网络爬虫可以在网上爬取到一些数据&#xff0c;很多公司&#xff0c;为了自己公司的数据安全&#xff0c; 尤其是web端项目&#xff0c;不希望被爬虫采集。那么&#xff0c;您可以使用vue技术…...

js 多对象去重(多属性去重)

需求中发现后端可能没有处理重复数据&#xff0c;这个时候前段可以直接解决。 在 JavaScript 中&#xff0c;可以使用 Set 数据结构来进行多对象的去重。Set 是 ES6 新引入的集合类型&#xff0c;其特点是元素不会重复且无序。 下面是一个示例代码&#xff0c;展示如何通过 S…...

在 JavaScript 中,Map 与 object 的差别?为什么有 object 还需要 Map?

ES6 推出了Map 物件&#xff0c;让开发者可以透过这个特制资料结构进行键值对(key-value pairs) 的操作。然而 JavaScript 原始物件 (plain object) 就可以用来做键值对的操作&#xff0c;为什么还需要 Map 物件呢? Map 物件解决了什么问题? 原始物件的键 (key) 只可以是字串…...

【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——自我介绍(英文)

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 自我介绍 英文 自我介绍 英文 第一段&#xff1a; Good afternoon, dear professors, thank you for the chance to introduce myself. My name is Yan Zhen …...

ACP科普:IDEAL含义及应用

一、IDEAL介绍 IDEAL模型是一种组织改进模型&#xff0c;描述了组织在实施变革过程中可能经历的五个阶段&#xff1a; 启动诊断确立执行学习 这个模型可以应用于各种组织&#xff0c;包括软件开发团队、项目管理团队以及整个组织的变革过程。 二、IDEAL拆解 当应用IDEAL模型…...

【GO语言卵细胞级别教程】06.GO语言的字符串操作

【GO语言卵细胞级别教程】06.GO语言的字符串操作 温馨提示&#xff1a; 本文中使用的项目模块均是 【05.项目创建和函数讲解】 中创建的&#xff0c;具体如何创建项目&#xff0c;请参考 【GO语言卵细胞级别教程】05.项目创建和函数讲解 目录&#xff1a; 【GO语言卵细胞级别…...

【笔记】【算法设计与分析 - 北航童咏昕教授】绪论

算法设计与分析 - 北航童咏昕教授 文章目录 算法的定义定义性质 算法的表示自然语言编程语言伪代码 算法的分析算法分析的原则渐近分析 算法的定义 定义 给定计算问题&#xff0c;算法是一系列良定义的计算步骤&#xff0c;逐一执行计算步骤即可得预期的输出。 性质 有穷性确…...

大语言模型LLM中Transformer模型的调用过程与步骤

在LLM&#xff08;Language Model&#xff09;中&#xff0c;Transformer是一种用来处理自然语言任务的模型架构。下面是Transformer模型中的调用过程和步骤的简要介绍&#xff1a; 数据预处理&#xff1a;将原始文本转换为模型可以理解的数字形式。这通常包括分词、编码和填充…...

mysql connect unblock with mysqladmin flush-hosts

原因 同一个ip在短时间内产生太多&#xff08;超过max_connect_errors的最大值&#xff09;中断的数据库连接而导致的阻塞。 查看 max_connect_errors show variables like max_connect_errors; 解决 前提&#xff1a;需要换一个IP地址连接 方法一 增大 max_connect_err…...

每日一练:前端js实现算法之两数之和

方法一&#xff1a;暴力法 function twoSum(nums, target) {for (let i 0; i < nums.length; i) {for (let j i 1; j < nums.length; j) {if (nums[i] nums[j] target) {return [i, j];}}}return null; }方法二&#xff1a;哈希表 function twoSum(nums, target) …...

17.隐式参数的定义和使用

目录 概述实践代码执行 结束 概述 实践 代码 package com.fun.scalaobject ImplicitParamsApp {def main(args: Array[String]): Unit {say("天下")implicit val word "spark"// 多个报错 // implicit val word2 "flink"implicit val con…...

简单介绍一下WebRTC中NACK机制

WebRTC中的NACK&#xff08;Negative Acknowledgement&#xff09;是一种用于实时通信的网络协议&#xff0c;用于在传输过程中检测和纠正丢包。当接收方检测到数据包丢失时&#xff0c;它会发送一个NACK消息给发送方&#xff0c;请求重新发送丢失的数据包。 NACK的工作原理如…...

05 Flink 的 WordCount

前言 本文对应于 spark 系列的 Spark 的 WordCount 这里主要是 从宏观上面来看一下 flink 这边的几个角色, 以及其调度的整个流程 一个宏观 大局上的任务的处理, 执行 基于 一个本地的 flink 集群 测试用例 /*** com.hx.test.Test01WordCount** author Jerry.X.He* ver…...

2024云服务器ECS_云主机_服务器托管_e实例-阿里云

阿里云服务器ECS英文全程Elastic Compute Service&#xff0c;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如ECS经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云服务器网al…...

掌握这8大工具,自媒体ai写作之路畅通无阻! #经验分享#科技#媒体

这些宝藏AI 写作神器&#xff0c;我不允许你还不知道~国内外免费付费都有&#xff0c;还有AI写作小程序分享&#xff0c;大幅度提高写文章、写报告的效率&#xff0c;快来一起试试吧&#xff01; 1.元芳写作 这是一个微信公众号 面向专业写作领域的ai写作工具&#xff0c;写作…...

CTFHub技能树web之文件上传(一)

一.前置知识 文件上传漏洞&#xff1a;文件上传功能是许多Web应用程序的常见功能之一&#xff0c;但在实施不当的情况下&#xff0c;可能会导致安全漏洞。文件上传漏洞的出现可能会使攻击者能够上传恶意文件&#xff0c;执行远程代码&#xff0c;绕过访问控制等。 文件类型验证…...

蔚来面试解答

你的问题包含了多个方面&#xff0c;我会尽力逐一回答&#xff1a; 锁机制及锁膨胀过程&#xff1a; 锁机制是并发编程中用于控制多线程对共享资源访问的一种机制&#xff0c;以避免资源冲突导致的数据不一致问题。锁膨胀是指锁在运行时根据竞争情况可以升级的过程&#xff0c;…...

Springboot 中使用 Redisson+AOP+自定义注解 实现访问限流与黑名单拦截

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…...

Java使用企业邮箱发送预警邮件

前言&#xff1a;最近接到一个需求&#xff0c;需要根据所监控设备的信息&#xff0c;在出现问题时发送企业微信进行预警。 POM依赖 <!-- 邮件 --> <dependency><groupId>com.sun.mail</groupId><artifactId>jakarta.mail</artifactId>…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...