From aec3a5f15ad6eb4113828d8354963940b4f53cae Mon Sep 17 00:00:00 2001 From: "xie.bx" Date: Mon, 31 Oct 2022 21:02:06 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BE=A4=E5=8F=91=E6=B6=88=E6=81=AF--=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FriendsController.java | 2 +- .../controller/GroupController.java | 58 ++++++ .../controller/GroupMessageController.java | 14 ++ .../java/com/lx/implatform/entity/Group.java | 83 ++++++++ .../com/lx/implatform/entity/GroupMember.java | 83 ++++++++ .../lx/implatform/entity/GroupMessage.java | 75 ++++++++ .../entity/GroupMessageReadPos.java | 69 +++++++ .../com/lx/implatform/mapper/GroupMapper.java | 16 ++ .../implatform/mapper/GroupMemberMapper.java | 16 ++ .../implatform/mapper/GroupMessageMapper.java | 16 ++ .../mapper/GroupMessageReadPosMapper.java | 16 ++ .../service/IGroupMemberService.java | 16 ++ .../service/IGroupMessageReadPosService.java | 16 ++ .../service/IGroupMessageService.java | 16 ++ .../lx/implatform/service/IGroupService.java | 30 +++ .../service/impl/GroupMemberServiceImpl.java | 20 ++ .../impl/GroupMessageReadPosServiceImpl.java | 20 ++ .../service/impl/GroupMessageServiceImpl.java | 20 ++ .../service/impl/GroupServiceImpl.java | 177 ++++++++++++++++++ .../impl/SingleMessageServiceImpl.java | 14 +- .../com/lx/implatform/vo/GroupInviteVO.java | 22 +++ .../java/com/lx/implatform/vo/GroupVO.java | 43 +++++ im-platform/src/main/resources/db/db.sql | 51 ++++- .../lx/implatform/imserver/IMServerApp.java | 12 +- .../imserver/websocket/WebsocketServer.java | 11 ++ 25 files changed, 889 insertions(+), 27 deletions(-) create mode 100644 im-platform/src/main/java/com/lx/implatform/controller/GroupController.java create mode 100644 im-platform/src/main/java/com/lx/implatform/controller/GroupMessageController.java create mode 100644 im-platform/src/main/java/com/lx/implatform/entity/Group.java create mode 100644 im-platform/src/main/java/com/lx/implatform/entity/GroupMember.java create mode 100644 im-platform/src/main/java/com/lx/implatform/entity/GroupMessage.java create mode 100644 im-platform/src/main/java/com/lx/implatform/entity/GroupMessageReadPos.java create mode 100644 im-platform/src/main/java/com/lx/implatform/mapper/GroupMapper.java create mode 100644 im-platform/src/main/java/com/lx/implatform/mapper/GroupMemberMapper.java create mode 100644 im-platform/src/main/java/com/lx/implatform/mapper/GroupMessageMapper.java create mode 100644 im-platform/src/main/java/com/lx/implatform/mapper/GroupMessageReadPosMapper.java create mode 100644 im-platform/src/main/java/com/lx/implatform/service/IGroupMemberService.java create mode 100644 im-platform/src/main/java/com/lx/implatform/service/IGroupMessageReadPosService.java create mode 100644 im-platform/src/main/java/com/lx/implatform/service/IGroupMessageService.java create mode 100644 im-platform/src/main/java/com/lx/implatform/service/IGroupService.java create mode 100644 im-platform/src/main/java/com/lx/implatform/service/impl/GroupMemberServiceImpl.java create mode 100644 im-platform/src/main/java/com/lx/implatform/service/impl/GroupMessageReadPosServiceImpl.java create mode 100644 im-platform/src/main/java/com/lx/implatform/service/impl/GroupMessageServiceImpl.java create mode 100644 im-platform/src/main/java/com/lx/implatform/service/impl/GroupServiceImpl.java create mode 100644 im-platform/src/main/java/com/lx/implatform/vo/GroupInviteVO.java create mode 100644 im-platform/src/main/java/com/lx/implatform/vo/GroupVO.java diff --git a/im-platform/src/main/java/com/lx/implatform/controller/FriendsController.java b/im-platform/src/main/java/com/lx/implatform/controller/FriendsController.java index 7cc302a..1a812b3 100644 --- a/im-platform/src/main/java/com/lx/implatform/controller/FriendsController.java +++ b/im-platform/src/main/java/com/lx/implatform/controller/FriendsController.java @@ -55,7 +55,7 @@ public class FriendsController { @PutMapping("/update") @ApiOperation(value = "更新好友信息",notes="更新好友头像或昵称") - public Result delFriends(@Valid @RequestBody FriendsVO vo){ + public Result modifyFriends(@Valid @RequestBody FriendsVO vo){ friendsService.update(vo); return ResultUtils.success(); } diff --git a/im-platform/src/main/java/com/lx/implatform/controller/GroupController.java b/im-platform/src/main/java/com/lx/implatform/controller/GroupController.java new file mode 100644 index 0000000..7b6ae4a --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/controller/GroupController.java @@ -0,0 +1,58 @@ +package com.lx.implatform.controller; + + +import com.lx.common.result.Result; +import com.lx.common.result.ResultUtils; +import com.lx.implatform.service.IGroupService; +import com.lx.implatform.vo.GroupInviteVO; +import com.lx.implatform.vo.GroupVO; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + + +@RestController +@RequestMapping("/group") +public class GroupController { + + @Autowired + private IGroupService groupService; + + @ApiOperation(value = "创建群聊",notes="创建群聊") + @PostMapping("/create") + public Result createGroup(@NotEmpty(message = "群名不能为空") @RequestParam String groupName){ + return ResultUtils.success(groupService.createGroup(groupName)); + } + + @ApiOperation(value = "修改群聊信息",notes="修改群聊信息") + @PutMapping("/modify") + public Result modifyGroup(@Valid @RequestBody GroupVO vo){ + return ResultUtils.success(groupService.modifyGroup(vo)); + } + + @ApiOperation(value = "修改群聊信息",notes="修改群聊信息") + @DeleteMapping("/delete/{groupId}") + public Result deleteGroup(@NotNull(message = "群聊id不能为空") @PathVariable Long groupId){ + groupService.deleteGroup(groupId); + return ResultUtils.success(); + } + + @ApiOperation(value = "查询群聊列表",notes="查询群聊列表") + @GetMapping("/list") + public Result> findGroups(){ + return ResultUtils.success(groupService.findGroups()); + } + + @ApiOperation(value = "邀请进群",notes="邀请好友进群") + @PostMapping("/invite") + public Result invite(@Valid @RequestBody GroupInviteVO vo){ + groupService.invite(vo); + return ResultUtils.success(); + } +} + diff --git a/im-platform/src/main/java/com/lx/implatform/controller/GroupMessageController.java b/im-platform/src/main/java/com/lx/implatform/controller/GroupMessageController.java new file mode 100644 index 0000000..d3e5784 --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/controller/GroupMessageController.java @@ -0,0 +1,14 @@ +package com.lx.implatform.controller; + + +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + + +@RestController +@RequestMapping("/group/message") +public class GroupMessageController { + +} + diff --git a/im-platform/src/main/java/com/lx/implatform/entity/Group.java b/im-platform/src/main/java/com/lx/implatform/entity/Group.java new file mode 100644 index 0000000..40bd11c --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/entity/Group.java @@ -0,0 +1,83 @@ +package com.lx.implatform.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.extension.activerecord.Model; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; + +import java.io.Serializable; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 群 + * @author blue + * @since 2022-10-31 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("group") +public class Group extends Model { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 群名字 + */ + private String name; + + /** + * 群主id + */ + @TableField("owner_id") + private Long ownerId; + + /** + * 头像 + */ + @TableField("head_image") + private String headImage; + + /** + * 头像缩略图 + */ + @TableField("head_image_thumb") + private String headImageThumb; + + /** + * 群公告 + */ + @TableField("notice") + private String notice; + + /** + * 群备注 + */ + @TableField("remark") + private String remark; + + /** + * 创建时间 + */ + @TableField("created_time") + private Date createdTime; + + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/im-platform/src/main/java/com/lx/implatform/entity/GroupMember.java b/im-platform/src/main/java/com/lx/implatform/entity/GroupMember.java new file mode 100644 index 0000000..0e173e3 --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/entity/GroupMember.java @@ -0,0 +1,83 @@ +package com.lx.implatform.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.extension.activerecord.Model; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; + +import java.io.Serializable; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 群成员 + *

+ * + * @author blue + * @since 2022-10-31 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("group_member") +public class GroupMember extends Model { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 群id + */ + @TableField("group_id") + private Long groupId; + + /** + * 用户id + */ + @TableField("user_id") + private Long userId; + + /** + * 群内显示名称 + */ + @TableField("user_id") + private String aliasName; + + /** + * 头像 + */ + @TableField("head_image") + private String headImage; + + + + /** + * 备注 + */ + @TableField("remarks") + private String remarks; + + /** + * 创建时间 + */ + @TableField("created_time") + private Date createdTime; + + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/im-platform/src/main/java/com/lx/implatform/entity/GroupMessage.java b/im-platform/src/main/java/com/lx/implatform/entity/GroupMessage.java new file mode 100644 index 0000000..b7efe85 --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/entity/GroupMessage.java @@ -0,0 +1,75 @@ +package com.lx.implatform.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.extension.activerecord.Model; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; + +import java.io.Serializable; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 群消息 + *

+ * + * @author blue + * @since 2022-10-31 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("group_message") +public class GroupMessage extends Model { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 群id + */ + @TableField("group_id") + private Long groupId; + + /** + * 发送用户id + */ + @TableField("send_user_id") + private Long sendUserId; + + /** + * 发送内容 + */ + @TableField("content") + private String content; + + /** + * 消息类型 0:文字 1:图片 2:文件 + */ + @TableField("type") + private Boolean type; + + /** + * 发送时间 + */ + @TableField("send_time") + private Date sendTime; + + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/im-platform/src/main/java/com/lx/implatform/entity/GroupMessageReadPos.java b/im-platform/src/main/java/com/lx/implatform/entity/GroupMessageReadPos.java new file mode 100644 index 0000000..d984d5a --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/entity/GroupMessageReadPos.java @@ -0,0 +1,69 @@ +package com.lx.implatform.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.extension.activerecord.Model; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; + +import java.io.Serializable; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 群消息读取位置 + *

+ * + * @author blue + * @since 2022-10-31 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("group_message_read_pos") +public class GroupMessageReadPos extends Model { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 群id + */ + @TableField("group_id") + private Long groupId; + + /** + * 用户id + */ + @TableField("user_id") + private Long userId; + + /** + * 已读取消息的最大消息id + */ + @TableField("read_pos") + private Long readPos; + + /** + * 最后读取时间 + */ + @TableField("last_read_time") + private Date lastReadTime; + + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/im-platform/src/main/java/com/lx/implatform/mapper/GroupMapper.java b/im-platform/src/main/java/com/lx/implatform/mapper/GroupMapper.java new file mode 100644 index 0000000..93e582d --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/mapper/GroupMapper.java @@ -0,0 +1,16 @@ +package com.lx.implatform.mapper; + +import com.lx.implatform.entity.Group; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 群 Mapper 接口 + *

+ * + * @author blue + * @since 2022-10-31 + */ +public interface GroupMapper extends BaseMapper { + +} diff --git a/im-platform/src/main/java/com/lx/implatform/mapper/GroupMemberMapper.java b/im-platform/src/main/java/com/lx/implatform/mapper/GroupMemberMapper.java new file mode 100644 index 0000000..b8fee18 --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/mapper/GroupMemberMapper.java @@ -0,0 +1,16 @@ +package com.lx.implatform.mapper; + +import com.lx.implatform.entity.GroupMember; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 群成员 Mapper 接口 + *

+ * + * @author blue + * @since 2022-10-31 + */ +public interface GroupMemberMapper extends BaseMapper { + +} diff --git a/im-platform/src/main/java/com/lx/implatform/mapper/GroupMessageMapper.java b/im-platform/src/main/java/com/lx/implatform/mapper/GroupMessageMapper.java new file mode 100644 index 0000000..1646e4b --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/mapper/GroupMessageMapper.java @@ -0,0 +1,16 @@ +package com.lx.implatform.mapper; + +import com.lx.implatform.entity.GroupMessage; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 群消息 Mapper 接口 + *

+ * + * @author blue + * @since 2022-10-31 + */ +public interface GroupMessageMapper extends BaseMapper { + +} diff --git a/im-platform/src/main/java/com/lx/implatform/mapper/GroupMessageReadPosMapper.java b/im-platform/src/main/java/com/lx/implatform/mapper/GroupMessageReadPosMapper.java new file mode 100644 index 0000000..55d1050 --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/mapper/GroupMessageReadPosMapper.java @@ -0,0 +1,16 @@ +package com.lx.implatform.mapper; + +import com.lx.implatform.entity.GroupMessageReadPos; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 群消息读取位置 Mapper 接口 + *

+ * + * @author blue + * @since 2022-10-31 + */ +public interface GroupMessageReadPosMapper extends BaseMapper { + +} diff --git a/im-platform/src/main/java/com/lx/implatform/service/IGroupMemberService.java b/im-platform/src/main/java/com/lx/implatform/service/IGroupMemberService.java new file mode 100644 index 0000000..69bf5d5 --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/service/IGroupMemberService.java @@ -0,0 +1,16 @@ +package com.lx.implatform.service; + +import com.lx.implatform.entity.GroupMember; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 群成员 服务类 + *

+ * + * @author blue + * @since 2022-10-31 + */ +public interface IGroupMemberService extends IService { + +} diff --git a/im-platform/src/main/java/com/lx/implatform/service/IGroupMessageReadPosService.java b/im-platform/src/main/java/com/lx/implatform/service/IGroupMessageReadPosService.java new file mode 100644 index 0000000..f65ee5a --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/service/IGroupMessageReadPosService.java @@ -0,0 +1,16 @@ +package com.lx.implatform.service; + +import com.lx.implatform.entity.GroupMessageReadPos; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 群消息读取位置 服务类 + *

+ * + * @author blue + * @since 2022-10-31 + */ +public interface IGroupMessageReadPosService extends IService { + +} diff --git a/im-platform/src/main/java/com/lx/implatform/service/IGroupMessageService.java b/im-platform/src/main/java/com/lx/implatform/service/IGroupMessageService.java new file mode 100644 index 0000000..546f3eb --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/service/IGroupMessageService.java @@ -0,0 +1,16 @@ +package com.lx.implatform.service; + +import com.lx.implatform.entity.GroupMessage; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 群消息 服务类 + *

+ * + * @author blue + * @since 2022-10-31 + */ +public interface IGroupMessageService extends IService { + +} diff --git a/im-platform/src/main/java/com/lx/implatform/service/IGroupService.java b/im-platform/src/main/java/com/lx/implatform/service/IGroupService.java new file mode 100644 index 0000000..ef38d6d --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/service/IGroupService.java @@ -0,0 +1,30 @@ +package com.lx.implatform.service; + +import com.lx.implatform.entity.Group; +import com.baomidou.mybatisplus.extension.service.IService; +import com.lx.implatform.vo.GroupInviteVO; +import com.lx.implatform.vo.GroupVO; + +import java.util.List; + +/** + *

+ * 群 服务类 + *

+ * + * @author blue + * @since 2022-10-31 + */ +public interface IGroupService extends IService { + + + GroupVO createGroup(String groupName); + + GroupVO modifyGroup(GroupVO vo); + + void deleteGroup(Long groupId); + + List findGroups(); + + void invite(GroupInviteVO vo); +} diff --git a/im-platform/src/main/java/com/lx/implatform/service/impl/GroupMemberServiceImpl.java b/im-platform/src/main/java/com/lx/implatform/service/impl/GroupMemberServiceImpl.java new file mode 100644 index 0000000..da6066a --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/service/impl/GroupMemberServiceImpl.java @@ -0,0 +1,20 @@ +package com.lx.implatform.service.impl; + +import com.lx.implatform.entity.GroupMember; +import com.lx.implatform.mapper.GroupMemberMapper; +import com.lx.implatform.service.IGroupMemberService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 群成员 服务实现类 + *

+ * + * @author blue + * @since 2022-10-31 + */ +@Service +public class GroupMemberServiceImpl extends ServiceImpl implements IGroupMemberService { + +} diff --git a/im-platform/src/main/java/com/lx/implatform/service/impl/GroupMessageReadPosServiceImpl.java b/im-platform/src/main/java/com/lx/implatform/service/impl/GroupMessageReadPosServiceImpl.java new file mode 100644 index 0000000..d4aae2e --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/service/impl/GroupMessageReadPosServiceImpl.java @@ -0,0 +1,20 @@ +package com.lx.implatform.service.impl; + +import com.lx.implatform.entity.GroupMessageReadPos; +import com.lx.implatform.mapper.GroupMessageReadPosMapper; +import com.lx.implatform.service.IGroupMessageReadPosService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 群消息读取位置 服务实现类 + *

+ * + * @author blue + * @since 2022-10-31 + */ +@Service +public class GroupMessageReadPosServiceImpl extends ServiceImpl implements IGroupMessageReadPosService { + +} diff --git a/im-platform/src/main/java/com/lx/implatform/service/impl/GroupMessageServiceImpl.java b/im-platform/src/main/java/com/lx/implatform/service/impl/GroupMessageServiceImpl.java new file mode 100644 index 0000000..a186758 --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/service/impl/GroupMessageServiceImpl.java @@ -0,0 +1,20 @@ +package com.lx.implatform.service.impl; + +import com.lx.implatform.entity.GroupMessage; +import com.lx.implatform.mapper.GroupMessageMapper; +import com.lx.implatform.service.IGroupMessageService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 群消息 服务实现类 + *

+ * + * @author blue + * @since 2022-10-31 + */ +@Service +public class GroupMessageServiceImpl extends ServiceImpl implements IGroupMessageService { + +} diff --git a/im-platform/src/main/java/com/lx/implatform/service/impl/GroupServiceImpl.java b/im-platform/src/main/java/com/lx/implatform/service/impl/GroupServiceImpl.java new file mode 100644 index 0000000..051c7c3 --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/service/impl/GroupServiceImpl.java @@ -0,0 +1,177 @@ +package com.lx.implatform.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.lx.common.enums.ResultCode; +import com.lx.common.util.BeanUtils; +import com.lx.implatform.entity.Friends; +import com.lx.implatform.entity.Group; +import com.lx.implatform.entity.GroupMember; +import com.lx.implatform.entity.User; +import com.lx.implatform.exception.GlobalException; +import com.lx.implatform.mapper.GroupMapper; +import com.lx.implatform.service.IFriendsService; +import com.lx.implatform.service.IGroupMemberService; +import com.lx.implatform.service.IGroupService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.lx.implatform.service.IUserService; +import com.lx.implatform.session.SessionContext; +import com.lx.implatform.session.UserSession; +import com.lx.implatform.vo.GroupInviteVO; +import com.lx.implatform.vo.GroupVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + + +@Service +public class GroupServiceImpl extends ServiceImpl implements IGroupService { + + @Autowired + private IUserService userService; + + @Autowired + private IGroupMemberService groupMemberService; + + @Autowired + private IFriendsService friendsService; + + /** + * 创建新群聊 + * + * @return GroupVO + * @Param groupName 群聊名称 + **/ + @Transactional + @Override + public GroupVO createGroup(String groupName) { + UserSession session = SessionContext.getSession(); + User user = userService.getById(session.getId()); + // 保存群组数据 + Group group = new Group(); + group.setName(groupName); + group.setOwnerId(user.getId()); + group.setHeadImage(user.getHeadImage()); + group.setHeadImageThumb(user.getHeadImageThumb()); + this.save(group); + // 把群主加入群 + GroupMember groupMember = new GroupMember(); + groupMember.setGroupId(group.getId()); + groupMember.setUserId(user.getId()); + groupMember.setAliasName(user.getNickName()); + groupMember.setHeadImage(user.getHeadImageThumb()); + groupMemberService.save(groupMember); + GroupVO vo = BeanUtils.copyProperties(group, GroupVO.class); + return vo; + } + + /** + * 修改群聊信息 + * + * @Param GroupVO 群聊信息 + * @return GroupVO + **/ + @Override + public GroupVO modifyGroup(GroupVO vo) { + UserSession session = SessionContext.getSession(); + // 校验是不是群主,只有群主能改信息 + Group group = this.getById(vo.getId()); + if(group.getOwnerId() != session.getId()){ + throw new GlobalException(ResultCode.PROGRAM_ERROR,"您不是群主,不可修改群信息"); + } + // 保存群信息 + group = BeanUtils.copyProperties(vo,Group.class); + this.save(group); + return vo; + } + + /** + * 删除群聊 + * + * @Param groupId 群聊id + * @return void + **/ + @Transactional + @Override + public void deleteGroup(Long groupId) { + UserSession session = SessionContext.getSession(); + Group group = this.getById(groupId); + if(group == null){ + throw new GlobalException(ResultCode.PROGRAM_ERROR,"群组不存在"); + } + if(group.getOwnerId() != session.getId()){ + throw new GlobalException(ResultCode.PROGRAM_ERROR,"只有群主才有权限解除群聊"); + } + // 删除群数据 + this.removeById(groupId); + // 删除成员数据 + QueryWrapper wrapper = new QueryWrapper(); + wrapper.lambda().eq(GroupMember::getGroupId,groupId); + groupMemberService.remove(wrapper); + } + + /** + * 查询当前用户的所有群聊 + * + * @return List + **/ + @Override + public List findGroups() { + UserSession session = SessionContext.getSession(); + // 查询当前用户的群id列表 + QueryWrapper memberWrapper = new QueryWrapper(); + memberWrapper.lambda().eq(GroupMember::getUserId, session.getId()); + List groupMembers = groupMemberService.list(memberWrapper); + // 拉取群信息 + List ids = groupMembers.stream().map((gm -> gm.getGroupId())).collect(Collectors.toList()); + QueryWrapper groupWrapper = new QueryWrapper(); + groupWrapper.lambda().in(Group::getId, ids); + List groups = this.list(groupWrapper); + // 转vo + List vos = groups.stream().map(g -> { + GroupVO vo = BeanUtils.copyProperties(g, GroupVO.class); + return vo; + }).collect(Collectors.toList()); + return vos; + } + + /** + * 邀请好友进群 + * + * @return + * @Param GroupInviteVO 群id、好友id列表 + **/ + @Override + public void invite(GroupInviteVO vo) { + UserSession session = SessionContext.getSession(); + // 已经在群里面用户,不可重复加入 + QueryWrapper wrapper = new QueryWrapper(); + wrapper.lambda().eq(GroupMember::getId, vo.getGroupId()) + .in(GroupMember::getUserId, vo.getFriendIds()); + if(groupMemberService.count(wrapper)>0){ + throw new GlobalException(ResultCode.PROGRAM_ERROR, "部分用户已经在群中,邀请失败"); + } + // 找出好友信息 + List friends = friendsService.findFriendsByUserId(session.getId()); + List friendsList = vo.getFriendIds().stream().map(id -> + friends.stream().filter(f -> f.getFriendId().equals(id)).findFirst().get()).collect(Collectors.toList()); + if (friendsList.size() != vo.getFriendIds().size()) { + throw new GlobalException(ResultCode.PROGRAM_ERROR, "部分用户不是您的好友,邀请失败"); + } + // 批量保存成员数据 + List groupMembers = friendsList.stream() + .map(f -> { + GroupMember groupMember = new GroupMember(); + groupMember.setGroupId(vo.getGroupId()); + groupMember.setUserId(f.getFriendId()); + groupMember.setAliasName(f.getFriendNickName()); + groupMember.setHeadImage(f.getFriendHeadImage()); + return groupMember; + }).collect(Collectors.toList()); + if(!groupMembers.isEmpty()) { + groupMemberService.saveBatch(groupMembers); + } + } +} diff --git a/im-platform/src/main/java/com/lx/implatform/service/impl/SingleMessageServiceImpl.java b/im-platform/src/main/java/com/lx/implatform/service/impl/SingleMessageServiceImpl.java index 8f64f8d..bb7ddb7 100644 --- a/im-platform/src/main/java/com/lx/implatform/service/impl/SingleMessageServiceImpl.java +++ b/im-platform/src/main/java/com/lx/implatform/service/impl/SingleMessageServiceImpl.java @@ -23,14 +23,7 @@ import java.util.Date; import java.util.List; import java.util.stream.Collectors; -/** - *

- * 单人消息服务实现类 - *

- * - * @author blue - * @since 2022-10-01 - */ + @Service public class SingleMessageServiceImpl extends ServiceImpl implements ISingleMessageService { @@ -41,20 +34,17 @@ public class SingleMessageServiceImpl extends ServiceImpl messages = this.list(queryWrapper); - // 上传至redis,等待推送 if(!messages.isEmpty()){ List infos = messages.stream().map(m->{ @@ -90,6 +79,5 @@ public class SingleMessageServiceImpl extends ServiceImpl friendIds; +} diff --git a/im-platform/src/main/java/com/lx/implatform/vo/GroupVO.java b/im-platform/src/main/java/com/lx/implatform/vo/GroupVO.java new file mode 100644 index 0000000..39efac5 --- /dev/null +++ b/im-platform/src/main/java/com/lx/implatform/vo/GroupVO.java @@ -0,0 +1,43 @@ +package com.lx.implatform.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Date; + +@Data +@ApiModel("群信息VO") +public class GroupVO { + + @NotNull(message = "群id不可为空") + @ApiModelProperty(value = "群id") + private Long id; + + @NotEmpty(message = "群名称不可为空") + @ApiModelProperty(value = "群名称") + private String name; + + @NotEmpty(message = "群主id不可为空") + @ApiModelProperty(value = "群主id") + private Long ownerId; + + @ApiModelProperty(value = "头像") + private String headImage; + + @ApiModelProperty(value = "头像缩略图") + private String headImageThumb; + + @ApiModelProperty(value = "群公告") + private String notice; + + @ApiModelProperty(value = "群备注") + private String remark; + + +} diff --git a/im-platform/src/main/resources/db/db.sql b/im-platform/src/main/resources/db/db.sql index d35ed63..d724bc0 100644 --- a/im-platform/src/main/resources/db/db.sql +++ b/im-platform/src/main/resources/db/db.sql @@ -12,7 +12,7 @@ create table `user`( `created_time` datetime DEFAULT CURRENT_TIMESTAMP comment '创建时间', unique key `idx_user_name`(user_name), key `idx_nick_name`(nick_name) -); +) ENGINE=InnoDB CHARSET=utf8mb3 comment '用户'; create table `friends`( `id` bigint not null auto_increment primary key comment 'id', @@ -23,8 +23,7 @@ create table `friends`( `created_time` datetime DEFAULT CURRENT_TIMESTAMP comment '创建时间', key `idx_user_id` (`user_id`), key `idx_friend_id` (`friend_id`) -); - +) ENGINE=InnoDB CHARSET=utf8mb3 comment '好友'; create table `single_message`( `id` bigint not null auto_increment primary key comment 'id', @@ -35,4 +34,48 @@ create table `single_message`( `status` tinyint(1) NOT NULL comment '状态 0:未读 1:已读 ', `send_time` datetime DEFAULT CURRENT_TIMESTAMP comment '发送时间', key `idx_send_recv_user_id` (`send_user_id`,`recv_user_id`) -); \ No newline at end of file +)ENGINE=InnoDB CHARSET=utf8mb3 comment '私聊消息'; + + +create table `group`( + `id` bigint not null auto_increment primary key comment 'id', + `name` varchar(255) not null comment '群名字', + `owner_id` bigint not null comment '群主id', + `head_image` varchar(255) default '' comment '群头像', + `head_image_thumb` varchar(255) default '' comment '群头像缩略图', + `notice` text comment '群公告', + `remark` varchar(255) default '' comment '群备注', + `created_time` datetime DEFAULT CURRENT_TIMESTAMP comment '创建时间' +)ENGINE=InnoDB comment '群'; + +create table `group_member`( + `id` bigint not null auto_increment primary key comment 'id', + `group_id` bigint not null comment '群id', + `user_id` bigint not null comment '用户id', + `alias_name` varchar(255) DEFAULT '' comment '组内显示名称', + `head_image` varchar(255) default '' comment '用户头像', + `remarks` varchar(255) DEFAULT '' comment '备注', + `created_time` datetime DEFAULT CURRENT_TIMESTAMP comment '创建时间', + key `idx_group_id`(`group_id`), + key `idx_user_id`(`user_id`) +)ENGINE=InnoDB comment '群成员'; + +create table `group_message`( + `id` bigint not null auto_increment primary key comment 'id', + `group_id` bigint not null comment '群id', + `send_user_id` bigint not null comment '发送用户id', + `content` text comment '发送内容', + `type` tinyint(1) NOT NULL comment '消息类型 0:文字 1:图片 2:文件', + `send_time` datetime DEFAULT CURRENT_TIMESTAMP comment '发送时间', + key `idx_group_id` (group_id) +)ENGINE=InnoDB CHARSET=utf8mb3 comment '群消息'; + + +create table `group_message_read_pos`( + `id` bigint not null auto_increment primary key comment 'id', + `group_id` bigint not null comment '群id', + `user_id` bigint not null comment '用户id', + `read_pos` bigint default 0 comment '已读取消息的最大消息id', + `last_read_time` datetime DEFAULT CURRENT_TIMESTAMP comment '最后读取时间', + key `idx_user_id`(`user_id`) +)ENGINE=InnoDB CHARSET=utf8mb3 comment '群消息读取位置'; \ No newline at end of file diff --git a/im-server/src/main/java/com/lx/implatform/imserver/IMServerApp.java b/im-server/src/main/java/com/lx/implatform/imserver/IMServerApp.java index 92ed288..0babca3 100644 --- a/im-server/src/main/java/com/lx/implatform/imserver/IMServerApp.java +++ b/im-server/src/main/java/com/lx/implatform/imserver/IMServerApp.java @@ -15,18 +15,12 @@ import org.springframework.scheduling.annotation.EnableScheduling; @EnableScheduling @ComponentScan(basePackages={"com.lx"}) @SpringBootApplication -public class IMServerApp implements CommandLineRunner { - - @Value("${websocket.port}") - private int port; +public class IMServerApp { public static void main(String[] args) { - SpringApplication.run(IMServerApp.class); + SpringApplication.run(IMServerApp.class); } - - public void run(String... args) throws Exception { - new WebsocketServer().start(port); - } } + diff --git a/im-server/src/main/java/com/lx/implatform/imserver/websocket/WebsocketServer.java b/im-server/src/main/java/com/lx/implatform/imserver/websocket/WebsocketServer.java index a346521..3305226 100644 --- a/im-server/src/main/java/com/lx/implatform/imserver/websocket/WebsocketServer.java +++ b/im-server/src/main/java/com/lx/implatform/imserver/websocket/WebsocketServer.java @@ -11,14 +11,25 @@ import io.netty.handler.codec.http.HttpServerCodec; import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; import io.netty.handler.stream.ChunkedWriteHandler; import io.netty.handler.timeout.IdleStateHandler; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; import java.util.UUID; import java.util.concurrent.TimeUnit; +@Component public class WebsocketServer { public static String LOCAL_SERVER_ID = UUID.randomUUID().toString(); + @Value("${websocket.port}") + private int port; + @PostConstruct + public void init(){ + this.start(port); + } + public void start(int port) { // 服务端启动辅助类,用于设置TCP相关参数 ServerBootstrap bootstrap = new ServerBootstrap();