diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SocketContactController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SocketContactController.java index c3f721a..c12bdd9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SocketContactController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SocketContactController.java @@ -42,7 +42,6 @@ public class SocketContactController extends BaseController { /** * 查询通信目录列表 */ - @SaCheckPermission("system:contact:list") @GetMapping("/list") public TableDataInfo list(SocketContactBo bo, PageQuery pageQuery) { return iSocketContactService.queryPageList(bo, pageQuery); @@ -51,7 +50,6 @@ public class SocketContactController extends BaseController { /** * 导出通信目录列表 */ - @SaCheckPermission("system:contact:export") @Log(title = "通信目录", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(SocketContactBo bo, HttpServletResponse response) { @@ -64,17 +62,16 @@ public class SocketContactController extends BaseController { * * @param id 主键 */ - @SaCheckPermission("system:contact:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { return R.ok(iSocketContactService.queryById(id)); } + /** * 新增通信目录 */ - @SaCheckPermission("system:contact:add") @Log(title = "通信目录", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() @@ -85,7 +82,6 @@ public class SocketContactController extends BaseController { /** * 修改通信目录 */ - @SaCheckPermission("system:contact:edit") @Log(title = "通信目录", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() @@ -98,7 +94,6 @@ public class SocketContactController extends BaseController { * * @param ids 主键串 */ - @SaCheckPermission("system:contact:remove") @Log(title = "通信目录", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public R remove(@NotEmpty(message = "主键不能为空") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SocketMessageController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SocketMessageController.java new file mode 100644 index 0000000..5278989 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SocketMessageController.java @@ -0,0 +1,103 @@ +package com.ruoyi.system.controller; + +import java.util.List; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.core.validate.QueryGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.domain.vo.SocketMessageVo; +import com.ruoyi.system.domain.bo.SocketMessageBo; +import com.ruoyi.system.service.ISocketMessageService; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 对话信息 + * + * @author hdka + * @date 2024-10-27 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/message") +public class SocketMessageController extends BaseController { + + private final ISocketMessageService iSocketMessageService; + + /** + * 查询对话信息列表 + */ + @GetMapping("/list") + public TableDataInfo list(SocketMessageBo bo, PageQuery pageQuery) { + return iSocketMessageService.queryPageList(bo, pageQuery); + } + + /** + * 导出对话信息列表 + */ + @Log(title = "对话信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SocketMessageBo bo, HttpServletResponse response) { + List list = iSocketMessageService.queryList(bo); + ExcelUtil.exportExcel(list, "对话信息", SocketMessageVo.class, response); + } + + /** + * 获取对话信息详细信息 + * + * @param id 主键 + */ + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(iSocketMessageService.queryById(id)); + } + + + /** + * 新增对话信息 + */ + @Log(title = "对话信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SocketMessageBo bo) { + return toAjax(iSocketMessageService.insertByBo(bo)); + } + + /** + * 修改对话信息 + */ + @Log(title = "对话信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SocketMessageBo bo) { + return toAjax(iSocketMessageService.updateByBo(bo)); + } + + /** + * 删除对话信息 + * + * @param ids 主键串 + */ + @Log(title = "对话信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(iSocketMessageService.deleteWithValidByIds(Arrays.asList(ids), true)); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SocketContact.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SocketContact.java index 1766c93..f2bd711 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SocketContact.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SocketContact.java @@ -25,7 +25,7 @@ public class SocketContact extends BaseEntity { /** * 通信id */ - @TableId(value = "id") + @TableId(value = "id",type = IdType.AUTO) private Long id; /** * 用户id @@ -44,5 +44,9 @@ public class SocketContact extends BaseEntity { * 备注 */ private String remark; + /** + * 房间号 + */ + private Long roomId; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SocketMessage.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SocketMessage.java new file mode 100644 index 0000000..e283769 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SocketMessage.java @@ -0,0 +1,56 @@ +package com.ruoyi.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 对话信息对象 socket_message + * + * @author hdka + * @date 2024-10-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("socket_message") +public class SocketMessage extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 主键id + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 接收者id + */ + private Long contactId; + /** + * 发送者id + */ + private Long userId; + /** + * 发送信息内容 + */ + private String content; + /** + * 房间号(针对群聊开发) + */ + private Long roomId; + /** + * 删除标志 + */ + @TableLogic + private Long delFlag; + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SocketContactBo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SocketContactBo.java index 8ab9955..187ce38 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SocketContactBo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SocketContactBo.java @@ -1,5 +1,6 @@ package com.ruoyi.system.domain.bo; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.validate.AddGroup; import com.ruoyi.common.core.validate.EditGroup; import lombok.Data; @@ -7,6 +8,7 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.*; import java.util.Date; +import java.util.List; import com.ruoyi.common.core.domain.BaseEntity; @@ -42,11 +44,18 @@ public class SocketContactBo extends BaseEntity { /** * 备注 */ - @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) private String remark; /** 用户名 */ private String userName; + /** + * 房间号 + */ + @NotNull(message = "房间号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long roomId; + + private List userList; + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SocketMessageBo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SocketMessageBo.java new file mode 100644 index 0000000..aca5375 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SocketMessageBo.java @@ -0,0 +1,63 @@ +package com.ruoyi.system.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 对话信息业务对象 socket_message + * + * @author hdka + * @date 2024-10-27 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SocketMessageBo extends BaseEntity { + + /** + * 主键id + */ + @NotNull(message = "主键id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 接收者id + */ + @NotNull(message = "接收者id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long contactId; + + /** + * 发送者id + */ + @NotNull(message = "发送者id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long userId; + + /** + * 发送信息内容 + */ + @NotBlank(message = "发送信息内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String content; + + /** + * 房间号(针对群聊开发) + */ + @NotNull(message = "房间号(针对群聊开发)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long roomId; + + /** + * 备注 + */ + private String remark; + + + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SocketContactVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SocketContactVo.java index e602cd3..38efc67 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SocketContactVo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SocketContactVo.java @@ -7,7 +7,7 @@ import com.ruoyi.common.convert.ExcelDictConvert; import com.ruoyi.common.core.domain.entity.SysUser; import lombok.Data; import java.util.Date; - +import java.util.List; /** @@ -52,4 +52,15 @@ public class SocketContactVo { private SysUser user; + /** + * 对话信息表 + */ + private List messages; + + + /** + * 房间号 + */ + private Long roomId; + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SocketMessageVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SocketMessageVo.java new file mode 100644 index 0000000..8ed5e5c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SocketMessageVo.java @@ -0,0 +1,62 @@ +package com.ruoyi.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.convert.ExcelDictConvert; +import lombok.Data; +import java.util.Date; + + + +/** + * 对话信息视图对象 socket_message + * + * @author hdka + * @date 2024-10-27 + */ +@Data +@ExcelIgnoreUnannotated +public class SocketMessageVo { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @ExcelProperty(value = "主键id") + private Long id; + + /** + * 接收者id + */ + @ExcelProperty(value = "接收者id") + private Long contactId; + + /** + * 发送者id + */ + @ExcelProperty(value = "发送者id") + private Long userId; + + /** + * 发送信息内容 + */ + @ExcelProperty(value = "发送信息内容") + private String content; + + /** + * 房间号(针对群聊开发) + */ + @ExcelProperty(value = "房间号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "针=对群聊开发") + private Long roomId; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SocketMessageMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SocketMessageMapper.java new file mode 100644 index 0000000..ff0c5e6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SocketMessageMapper.java @@ -0,0 +1,15 @@ +package com.ruoyi.system.mapper; + +import com.ruoyi.system.domain.SocketMessage; +import com.ruoyi.system.domain.vo.SocketMessageVo; +import com.ruoyi.common.core.mapper.BaseMapperPlus; + +/** + * 对话信息Mapper接口 + * + * @author hdka + * @date 2024-10-27 + */ +public interface SocketMessageMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISocketContactService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISocketContactService.java index 2eefcf7..7229c11 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISocketContactService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISocketContactService.java @@ -37,6 +37,11 @@ public interface ISocketContactService { */ Boolean insertByBo(SocketContactBo bo); + /** + * 新增通信群聊目录 + */ + Boolean insertByBoAndRoom(SocketContactBo bo); + /** * 修改通信目录 */ diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISocketMessageService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISocketMessageService.java new file mode 100644 index 0000000..20a7309 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISocketMessageService.java @@ -0,0 +1,55 @@ +package com.ruoyi.system.service; + +import com.ruoyi.system.domain.SocketMessage; +import com.ruoyi.system.domain.vo.SocketMessageVo; +import com.ruoyi.system.domain.bo.SocketMessageBo; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; + +import javax.validation.constraints.NotNull; +import java.util.Collection; +import java.util.List; + +/** + * 对话信息Service接口 + * + * @author hdka + * @date 2024-10-27 + */ +public interface ISocketMessageService { + + /** + * 查询对话信息 + */ + SocketMessageVo queryById(Long id); + + /** + * 查询对话信息列表 + */ + TableDataInfo queryPageList(SocketMessageBo bo, PageQuery pageQuery); + + /** + * 查询对话信息列表 + */ + List queryList(SocketMessageBo bo); + + /** + * 新增对话信息 + */ + Boolean insertByBo(SocketMessageBo bo); + + /** + * 修改对话信息 + */ + Boolean updateByBo(SocketMessageBo bo); + + /** + * 校验并批量删除对话信息信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 根据contactId查询对应的List + */ + List queryByContactId(@NotNull(message = "主键不能为空") Long contactId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SocketContactServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SocketContactServiceImpl.java index 52d4063..8029623 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SocketContactServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SocketContactServiceImpl.java @@ -8,6 +8,8 @@ import com.ruoyi.common.core.domain.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.system.domain.SocketMessage; +import com.ruoyi.system.mapper.SocketMessageMapper; import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.system.service.ISysUserService; import liquibase.pro.packaged.S; @@ -38,12 +40,24 @@ public class SocketContactServiceImpl implements ISocketContactService { private final SysUserMapper sysUserMapper; + private final SocketMessageMapper socketMessageMapper; + /** * 查询通信目录 */ @Override - public SocketContactVo queryById(Long id){ - return baseMapper.selectVoById(id); + public SocketContactVo queryById(Long id) { + SocketContactVo socketContactVo = baseMapper.selectVoById(id); + LambdaQueryWrapper socketMessageLambdaQueryWrapper = new LambdaQueryWrapper<>(); + socketMessageLambdaQueryWrapper.eq(SocketMessage::getRoomId, socketContactVo.getRoomId()) + .and(item -> + item.eq(SocketMessage::getUserId, socketContactVo.getContactUserId()) + .or() + .eq(SocketMessage::getUserId, socketContactVo.getUserId()) + ); + + socketContactVo.setMessages(socketMessageMapper.selectVoList(socketMessageLambdaQueryWrapper)); + return socketContactVo; } /** @@ -82,12 +96,54 @@ public class SocketContactServiceImpl implements ISocketContactService { */ @Override public Boolean insertByBo(SocketContactBo bo) { + + + // 正向存 SocketContact add = BeanUtil.toBean(bo, SocketContact.class); + add.setRoomId(0L); validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setId(add.getId()); } + + + // 反向存 + add.setContactUserId(bo.getUserId()); + add.setUserId(bo.getContactUserId()); + validEntityBeforeSave(add); + flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + + /** + * 新增通信群聊目录 + */ + @Override + public Boolean insertByBoAndRoom(SocketContactBo bo) { + Long roomId = System.currentTimeMillis(); + boolean flag = false; + List userList = bo.getUserList(); + for (SysUser sysUser : userList) { + SocketContact add = BeanUtil.toBean(bo, SocketContact.class); + add.setUserId(sysUser.getUserId()); + for (SysUser user : userList) { + // 当当前用户不等于接收者用户时候再进行set + if (!user.getUserId().equals(sysUser.getUserId())) { + add.setContactUserId(user.getUserId()); + add.setRoomId(roomId); + flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + } + + } + } return flag; } @@ -104,7 +160,7 @@ public class SocketContactServiceImpl implements ISocketContactService { /** * 保存前的数据校验 */ - private void validEntityBeforeSave(SocketContact entity){ + private void validEntityBeforeSave(SocketContact entity) { //TODO 做一些数据校验,如唯一约束 } @@ -113,7 +169,7 @@ public class SocketContactServiceImpl implements ISocketContactService { */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ + if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteBatchIds(ids) > 0; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SocketMessageServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SocketMessageServiceImpl.java new file mode 100644 index 0000000..56e1f74 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SocketMessageServiceImpl.java @@ -0,0 +1,125 @@ +package com.ruoyi.system.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.ruoyi.system.domain.bo.SocketMessageBo; +import com.ruoyi.system.domain.vo.SocketMessageVo; +import com.ruoyi.system.domain.SocketMessage; +import com.ruoyi.system.mapper.SocketMessageMapper; +import com.ruoyi.system.service.ISocketMessageService; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 对话信息Service业务层处理 + * + * @author hdka + * @date 2024-10-27 + */ +@RequiredArgsConstructor +@Service +public class SocketMessageServiceImpl implements ISocketMessageService { + + private final SocketMessageMapper baseMapper; + + /** + * 查询对话信息 + */ + @Override + public SocketMessageVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询对话信息列表 + */ + @Override + public TableDataInfo queryPageList(SocketMessageBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询对话信息列表 + */ + @Override + public List queryList(SocketMessageBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SocketMessageBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getContactId() != null, SocketMessage::getContactId, bo.getContactId()); + lqw.eq(bo.getUserId() != null, SocketMessage::getUserId, bo.getUserId()); + lqw.eq(StringUtils.isNotBlank(bo.getContent()), SocketMessage::getContent, bo.getContent()); + lqw.eq(bo.getRoomId() != null, SocketMessage::getRoomId, bo.getRoomId()); + return lqw; + } + + /** + * 新增对话信息 + */ + @Override + public Boolean insertByBo(SocketMessageBo bo) { + SocketMessage add = BeanUtil.toBean(bo, SocketMessage.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改对话信息 + */ + @Override + public Boolean updateByBo(SocketMessageBo bo) { + SocketMessage update = BeanUtil.toBean(bo, SocketMessage.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SocketMessage entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除对话信息 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + /** + * 根据对话的id查询列表 + * @param contactId + * @return + */ + @Override + public List queryByContactId(Long contactId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SocketMessage::getContactId, contactId); + return baseMapper.selectVoList(lqw); + } +} diff --git a/ruoyi-system/src/main/resources/mapper/system/SocketMessageMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SocketMessageMapper.xml new file mode 100644 index 0000000..5c2cdd1 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SocketMessageMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-ui/src/api/system/message.js b/ruoyi-ui/src/api/system/message.js index e69de29..7dd6c28 100644 --- a/ruoyi-ui/src/api/system/message.js +++ b/ruoyi-ui/src/api/system/message.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询对话信息列表 +export function listMessage(query) { + return request({ + url: '/system/message/list', + method: 'get', + params: query + }) +} + +// 查询对话信息详细 +export function getMessage(id) { + return request({ + url: '/system/message/' + id, + method: 'get' + }) +} + +// 新增对话信息 +export function addMessage(data) { + return request({ + url: '/system/message', + method: 'post', + data: data + }) +} + +// 修改对话信息 +export function updateMessage(data) { + return request({ + url: '/system/message', + method: 'put', + data: data + }) +} + +// 删除对话信息 +export function delMessage(id) { + return request({ + url: '/system/message/' + id, + method: 'delete' + }) +} diff --git a/ruoyi-ui/src/components/Message/index.vue b/ruoyi-ui/src/components/Message/index.vue new file mode 100644 index 0000000..53ad000 --- /dev/null +++ b/ruoyi-ui/src/components/Message/index.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/ruoyi-ui/src/layout/components/Navbar.vue b/ruoyi-ui/src/layout/components/Navbar.vue index 8fb1ca9..b8e44e1 100644 --- a/ruoyi-ui/src/layout/components/Navbar.vue +++ b/ruoyi-ui/src/layout/components/Navbar.vue @@ -11,23 +11,15 @@ - +
+ 99 + +
{{roleGroup}} / {{user.nickName}}
- - - @@ -48,6 +40,80 @@ + + + + + + + + + + + + + + + 添加联系人 + + + + 全部 + 个人 + 群聊 + + +
+ + + + + + + + {{item.user.nickName}} + + + + + + + {{item.endMsg}} + + + + + + + + 置顶 + 删除 + + + + + + + + + + + + + + + + 暂无联系人 + + + +
+
+
+
@@ -62,7 +128,9 @@ import Search from '@/components/HeaderSearch' import RuoYiGit from '@/components/RuoYi/Git' import RuoYiDoc from '@/components/RuoYi/Doc' import {getUserProfile} from "@/api/system/user"; - +import {getContact, listContact} from "../../api/system/contact"; +import {addMessage} from "../../api/system/message"; +import {parseTime} from "../../utils/ruoyi"; export default { components: { Breadcrumb, @@ -82,6 +150,7 @@ export default { ]), setting: { get() { + return this.$store.state.settings.showSettings }, set(val) { @@ -100,12 +169,38 @@ export default { data() { return { user: {}, + chat:false, roleGroup: {}, // postGroup: {}, + + //联系人列表 + contactList: [], + contactListTotal: 0, + contactListLoading: false, + //消息记录 + msgList: [], + msgListTotal: 0, + msgListLoading: false, + inputVal: '', + search: '', + contactUserId: null, + userId: null, + contactQueryParams: { + pageSize: 10, + pageNum: 1 + }, + currentContact: {} }; }, + mounted() { + window.addEventListener("onmessageWS", this.subscribeMessage); + }, created() { + this.getUser(); + this.userId = this.$store.state.user.id; + this.subscribeMessage(); + this.getContactList(); }, methods: { toggleSideBar() { @@ -129,6 +224,99 @@ export default { location.href = process.env.VUE_APP_CONTEXT_PATH + "index"; }) }).catch(() => {}); + }, + + /***********************************************************************/ + + getContactList() { + this.contactListLoading = true; + this.contactQueryParams.userId = this.userId; + listContact(this.contactQueryParams).then(response => { + if (response.code === 200) { + this.contactList = response.rows; + this.contactListTotal = response.total; + const contactUserId = this.$route.query.userId; + if (contactUserId) { + this.contactUserId = contactUserId; + let contact = response.rows.find(row => row.contactUserId == contactUserId); + this.loadMessage(contact.id); + } + } + this.contactListLoading = false; + }) + }, + contactLoadMore() { + // this.contactQueryParams.pageSize = 5; + // this.contactQueryParams.pageNum++; + this.getContactList(); + }, + loadMessage(concatId) { + this.msgListLoading = true; + getContact(concatId).then(response => { + if (response.code === 200) { + console.log(response.data) + this.currentContact = response.data; + + this.msgList = response.data.messages; + } + this.msgListLoading = false; + this.fleshScroll(); + }) + }, + insertEmoji(emoji) { + this.inputVal += emoji.data; + }, + send() { + console.log("发送数据") + const message = { + contactId: this.currentContact.id, + userId: this.userId, + content: this.inputVal, + roomId: this.currentContact.roomId + } + this.msgList.push({ + ...message, + id: this.msgList.length + 1, + createTime: parseTime(new Date()) + }) + this.fleshLastMsg(); + addMessage(message) + const msg = { + sendUserId: this.userId, + sendUserName: this.$store.state.user.name, + userId: this.currentContact.contactUserId, + type: "chat", + detail: this.inputVal + } + this.$webSocket.sendWebsocket(JSON.stringify(msg)); + this.inputVal = ''; + this.fleshScroll(); + }, + subscribeMessage(res) { + + if (res) { + const { sendUserId, sendUserName, userId, type, detail } = res.detail.data; + const message = { + id: 1, + contactId: userId, + userId: sendUserId, + content: detail, + roomId: this.currentContact.roomId, + createTime: parseTime(new Date()) + } + this.msgList.push(message); + this.fleshLastMsg(); + this.fleshScroll(); + } + }, + fleshLastMsg() { + const index = this.contactList.findIndex(e => e.id === this.currentContact.id); + this.contactList[index].endMsg = this.msgList[this.msgList.length - 1].content; + }, + fleshScroll() { + this.$nextTick(() => { + document.getElementById("message_content_end").scrollIntoView(); + }) } } } @@ -222,4 +410,84 @@ export default { } } } +.app-container { + background: linear-gradient(180deg, rgba(0, 190, 189, .1), rgba(136, 255, 254, .2) 50%, rgba(242, 244, 247, .1)); +} +.app { + background-color: white; + border-radius: 12px 12px 0 0; +} +.msgListMain { + height: 500px; + overflow-y:auto; + margin-top: 15px; +} +.msgUserList { + border-radius: 10px; +} +.msgListMain_empty { + display: flex; + height: 500px; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; +} +.hover_down_menu { + display: none; +} +.msgUserList:hover { + background-color: #f2f2f2; + cursor: pointer; +} +.msgUserList:hover .hover_down_menu{ + display: block; +} +.el-dropdown-link { + cursor: pointer; +} +.el-icon-arrow-down { + font-size: 15px; + font-weight: 500; +} +.main { + background-color: white; + height: 600px; + margin-left: 5px; +} +.main_empty { + display: flex; + background-color: white; + height: 600px; + flex-direction: column; + justify-content: center; + align-items: center; +} +.main_empty .el-row { + text-align: center; +} +.main_empty img { + width: 25%; +} +.msg_content { + margin-top: 30px; + height: 390px; + overflow: auto; + //background-color: gray; +} +.chat_bubble { + float: right; + margin-right: 35px; + color: #333; + background-color: rgba(0, 190, 189, .2); + height: 40px; + line-height: 40px; + padding: 0 12px 0 12px; + border-radius: 5px; +} +.input_top_menu_img{ + width: 22px; + height: 22px; + cursor: pointer; +} diff --git a/ruoyi-ui/src/layout/index.vue b/ruoyi-ui/src/layout/index.vue index dba4393..808dcfe 100644 --- a/ruoyi-ui/src/layout/index.vue +++ b/ruoyi-ui/src/layout/index.vue @@ -30,7 +30,7 @@ export default { RightPanel, Settings, Sidebar, - TagsView + TagsView, }, mixins: [ResizeMixin], computed: { diff --git a/ruoyi-ui/src/main.js b/ruoyi-ui/src/main.js index 3cedcf3..09168b0 100644 --- a/ruoyi-ui/src/main.js +++ b/ruoyi-ui/src/main.js @@ -112,7 +112,7 @@ let newVue = new Vue({ }, closeSocket() { //关闭websocket连接 - this.$websocket.close(); + this.$webSocket.close(); } }, router, diff --git a/ruoyi-ui/src/utils/websocket.js b/ruoyi-ui/src/utils/websocket.js index 60e8c6b..9f3cb19 100644 --- a/ruoyi-ui/src/utils/websocket.js +++ b/ruoyi-ui/src/utils/websocket.js @@ -95,7 +95,6 @@ const webSocketOnError = (e) => { //服务器返回的数据 const webSocketOnMessage = (e)=> { //判断是否登录 - console.log("111111111111"+e) if (getToken()) { //window自定义事件 window.dispatchEvent( diff --git a/ruoyi-ui/src/views/oa/webSocket/index.vue b/ruoyi-ui/src/views/oa/webSocket/index.vue index 3f06e02..6db1507 100644 --- a/ruoyi-ui/src/views/oa/webSocket/index.vue +++ b/ruoyi-ui/src/views/oa/webSocket/index.vue @@ -212,7 +212,9 @@ export default { this.msgListLoading = true; getContact(concatId).then(response => { if (response.code === 200) { + console.log(response.data) this.currentContact = response.data; + this.msgList = response.data.messages; } this.msgListLoading = false; @@ -223,6 +225,7 @@ export default { this.inputVal += emoji.data; }, send() { + console.log("发送数据") const message = { contactId: this.currentContact.id, userId: this.userId, @@ -235,7 +238,7 @@ export default { createTime: parseTime(new Date()) }) this.fleshLastMsg(); - addMessage(message); + addMessage(message) const msg = { sendUserId: this.userId, sendUserName: this.$store.state.user.name, @@ -243,12 +246,12 @@ export default { type: "chat", detail: this.inputVal } - this.$websocket.sendWebsocket(JSON.stringify(msg)); + this.$webSocket.sendWebsocket(JSON.stringify(msg)); this.inputVal = ''; this.fleshScroll(); }, subscribeMessage(res) { - console.log(res); + if (res) { const { sendUserId, sendUserName, userId, type, detail } = res.detail.data; const message = {