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实现即时通讯(二)》 本博客姊妹篇 SpringBootWebSocket实现即时通讯(一)SpringBootWebSocket实现即时通讯(二)SpringBootWebSocket实现即时通讯(三&…...

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

js 多对象去重(多属性去重)
需求中发现后端可能没有处理重复数据,这个时候前段可以直接解决。 在 JavaScript 中,可以使用 Set 数据结构来进行多对象的去重。Set 是 ES6 新引入的集合类型,其特点是元素不会重复且无序。 下面是一个示例代码,展示如何通过 S…...
在 JavaScript 中,Map 与 object 的差别?为什么有 object 还需要 Map?
ES6 推出了Map 物件,让开发者可以透过这个特制资料结构进行键值对(key-value pairs) 的操作。然而 JavaScript 原始物件 (plain object) 就可以用来做键值对的操作,为什么还需要 Map 物件呢? Map 物件解决了什么问题? 原始物件的键 (key) 只可以是字串…...
【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——自我介绍(英文)
1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 自我介绍 英文 自我介绍 英文 第一段: Good afternoon, dear professors, thank you for the chance to introduce myself. My name is Yan Zhen …...
ACP科普:IDEAL含义及应用
一、IDEAL介绍 IDEAL模型是一种组织改进模型,描述了组织在实施变革过程中可能经历的五个阶段: 启动诊断确立执行学习 这个模型可以应用于各种组织,包括软件开发团队、项目管理团队以及整个组织的变革过程。 二、IDEAL拆解 当应用IDEAL模型…...
【GO语言卵细胞级别教程】06.GO语言的字符串操作
【GO语言卵细胞级别教程】06.GO语言的字符串操作 温馨提示: 本文中使用的项目模块均是 【05.项目创建和函数讲解】 中创建的,具体如何创建项目,请参考 【GO语言卵细胞级别教程】05.项目创建和函数讲解 目录: 【GO语言卵细胞级别…...

【笔记】【算法设计与分析 - 北航童咏昕教授】绪论
算法设计与分析 - 北航童咏昕教授 文章目录 算法的定义定义性质 算法的表示自然语言编程语言伪代码 算法的分析算法分析的原则渐近分析 算法的定义 定义 给定计算问题,算法是一系列良定义的计算步骤,逐一执行计算步骤即可得预期的输出。 性质 有穷性确…...
大语言模型LLM中Transformer模型的调用过程与步骤
在LLM(Language Model)中,Transformer是一种用来处理自然语言任务的模型架构。下面是Transformer模型中的调用过程和步骤的简要介绍: 数据预处理:将原始文本转换为模型可以理解的数字形式。这通常包括分词、编码和填充…...
mysql connect unblock with mysqladmin flush-hosts
原因 同一个ip在短时间内产生太多(超过max_connect_errors的最大值)中断的数据库连接而导致的阻塞。 查看 max_connect_errors show variables like max_connect_errors; 解决 前提:需要换一个IP地址连接 方法一 增大 max_connect_err…...
每日一练:前端js实现算法之两数之和
方法一:暴力法 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; }方法二:哈希表 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(Negative Acknowledgement)是一种用于实时通信的网络协议,用于在传输过程中检测和纠正丢包。当接收方检测到数据包丢失时,它会发送一个NACK消息给发送方,请求重新发送丢失的数据包。 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,云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,阿里云提供多种云服务器ECS实例规格,如ECS经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等,阿里云服务器网al…...

掌握这8大工具,自媒体ai写作之路畅通无阻! #经验分享#科技#媒体
这些宝藏AI 写作神器,我不允许你还不知道~国内外免费付费都有,还有AI写作小程序分享,大幅度提高写文章、写报告的效率,快来一起试试吧! 1.元芳写作 这是一个微信公众号 面向专业写作领域的ai写作工具,写作…...

CTFHub技能树web之文件上传(一)
一.前置知识 文件上传漏洞:文件上传功能是许多Web应用程序的常见功能之一,但在实施不当的情况下,可能会导致安全漏洞。文件上传漏洞的出现可能会使攻击者能够上传恶意文件,执行远程代码,绕过访问控制等。 文件类型验证…...
蔚来面试解答
你的问题包含了多个方面,我会尽力逐一回答: 锁机制及锁膨胀过程: 锁机制是并发编程中用于控制多线程对共享资源访问的一种机制,以避免资源冲突导致的数据不一致问题。锁膨胀是指锁在运行时根据竞争情况可以升级的过程,…...

Springboot 中使用 Redisson+AOP+自定义注解 实现访问限流与黑名单拦截
🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…...

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

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...