集成websocket

This commit is contained in:
wxl
2024-12-29 23:35:50 +08:00
parent 32f77e5382
commit b15914f219
12 changed files with 539 additions and 3 deletions

View File

@@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.dd.admin.business.author.entity.Author;
import com.dd.admin.business.author.service.AuthorService;
import com.dd.admin.business.chat.domain.ChatDto;
import com.dd.admin.business.chat.domain.ChatVo;
import com.dd.admin.business.chat.service.ChatService;
import com.dd.admin.business.file.entity.File;
import com.dd.admin.business.file.service.FileService;
import com.dd.admin.business.follow.domain.FollowDto;
@@ -79,6 +82,8 @@ public class AuthApi {
ReplyService replyService;
@Autowired
UpReplysService upReplysService;
@Autowired
ChatService chatService;
@ApiOperation(value = "获取所有笔记")
@ApiOperationSupport(order = 1)
@@ -612,4 +617,31 @@ public class AuthApi {
return ResultBean.success(isUp);
};
@ApiOperation(value = "获取聊天记录")
@ApiOperationSupport(order = 1)
@GetMapping("/api/auth/getChatList")
@OperLog(operModule = "获取所有笔记",operType = OperType.QUERY,operDesc = "获取聊天记录")
public ResultBean<IPage<ChatVo>> getChatList( ChatDto chatDto) {
String followId = String.valueOf(request.getAttribute("authorId"));
Author follow = authorService.getById(followId);
chatDto.setToId(followId);
chatDto.setToName(follow.getAuthorName());
IPage<ChatVo> chatVoIPage = chatService.selectChatPage(chatDto);
return ResultBean.success(chatVoIPage);
}
@ApiOperation(value = "获取聊天列表")
@ApiOperationSupport(order = 1)
@GetMapping("/api/auth/getMessageList")
@OperLog(operModule = "获取聊天列表",operType = OperType.QUERY,operDesc = "获取聊天列表")
public ResultBean<List<ChatVo>> getMessageList( ChatDto chatDto) {
String followId = String.valueOf(request.getAttribute("authorId"));
List<ChatVo> chatVos = chatService.selectChatList(followId);
return ResultBean.success(chatVos);
}
}

View File

@@ -0,0 +1,88 @@
package com.dd.admin.business.chat.controller;
import cn.hutool.core.bean.BeanUtil;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.dd.admin.common.model.UpdateGroup;
import com.dd.admin.common.model.result.ResultBean;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotBlank;
import com.dd.admin.business.chat.entity.Chat;
import com.dd.admin.business.chat.domain.ChatVo;
import com.dd.admin.business.chat.domain.ChatDto;
import com.dd.admin.business.chat.service.ChatService;
import java.util.List;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author 727869402@qq.com
* @since 2024-12-28
*/
@Api(tags = "")
@RestController
public class ChatController {
@Autowired
ChatService chatService;
@ApiOperation(value = "-分页列表")
@ApiOperationSupport(order = 1)
@GetMapping("/admin/chat/page")
public ResultBean<IPage<ChatVo>> page(ChatDto chatDto) {
IPage<ChatVo> pageInfo = chatService.selectChatPage(chatDto);
return ResultBean.success(pageInfo);
}
@ApiOperation(value = "-列表")
@ApiOperationSupport(order = 2)
@GetMapping("/admin/chat/list")
public ResultBean<List<ChatVo>> list(ChatDto chatDto) {
List<ChatVo> list = chatService.selectChatDetail(chatDto);
return ResultBean.success(list);
}
@ApiOperation(value = "-添加")
@ApiOperationSupport(order = 3)
@PostMapping("/admin/chat/add")
public ResultBean<Chat> add(@RequestBody @Validated ChatDto chatDto) {
Chat chat = BeanUtil.copyProperties(chatDto, Chat.class);
chatService.save(chat);
return ResultBean.success(chat);
}
@ApiOperation(value = "-查询")
@ApiOperationSupport(order = 4)
@GetMapping("/admin/chat/{chatId}")
public ResultBean<ChatVo> get(@PathVariable @NotBlank String chatId) {
Chat chat = chatService.getById(chatId);
ChatVo chatVo = BeanUtil.copyProperties(chat,ChatVo.class);
return ResultBean.success(chatVo);
}
@ApiOperation(value = "-修改")
@ApiOperationSupport(order = 5)
@PostMapping("/admin/chat/update")
public ResultBean<Chat> update(@RequestBody @Validated(UpdateGroup.class) ChatDto chatDto) {
Chat chat = BeanUtil.copyProperties(chatDto, Chat.class);
chatService.updateById(chat);
return ResultBean.success(chat);
}
@ApiOperation(value = "-删除")
@ApiOperationSupport(order = 6)
@GetMapping("/admin/chat/delete/{chatId}")
public ResultBean<Chat> delete(@PathVariable @NotBlank String chatId) {
Boolean b = chatService.removeById(chatId);
return ResultBean.success(b);
}
}

View File

@@ -0,0 +1,74 @@
package com.dd.admin.business.chat.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.Version;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import com.dd.admin.common.model.UpdateGroup;
/**
* <p>
* 返回对象
* </p>
*
* @author 727869402@qq.com
* @since 2024-12-28
*/
@Data
@ApiModel(value="接收对象")
public class ChatDto {
@ApiModelProperty(value = "消息id")
@NotBlank(message = "id不能为空",groups = UpdateGroup.class)
private String chatId;
@ApiModelProperty(value = "消息发送者")
private String fromId;
@ApiModelProperty(value = "消息发送者")
private String fromName;
@ApiModelProperty(value = "接收者")
private String toId;
@ApiModelProperty(value = "接收者")
private String toName;
@ApiModelProperty(value = "0文字 1图片 2语音 3视频")
private Integer messageType;
@ApiModelProperty(value = "0发送 1已读")
private Integer messageStatus;
@ApiModelProperty(value = "内容")
private String content;
@ApiModelProperty(value = "资源地址")
private String resourceUrl;
@ApiModelProperty(value = "0正常 1删除")
private Integer deleted;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "ip地址")
private String ipAddress;
@ApiModelProperty(value = "真实ip地址")
private String ipRealAddress;
}

View File

@@ -0,0 +1,76 @@
package com.dd.admin.business.chat.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.Version;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
/**
* <p>
* 返回对象
* </p>
*
* @author 727869402@qq.com
* @since 2024-12-28
*/
@Data
@ApiModel(value="返回对象")
public class ChatVo {
@ApiModelProperty(value = "消息id")
private String chatId;
@ApiModelProperty(value = "消息发送者")
private String fromId;
@ApiModelProperty(value = "消息发送者")
private String fromName;
@ApiModelProperty(value = "接收者")
private String toId;
@ApiModelProperty(value = "接收者")
private String toName;
@ApiModelProperty(value = "0文字 1图片 2语音 3视频")
private Integer messageType;
@ApiModelProperty(value = "0发送 1已读")
private Integer messageStatus;
@ApiModelProperty(value = "内容")
private String content;
@ApiModelProperty(value = "资源地址")
private String resourceUrl;
@ApiModelProperty(value = "0正常 1删除")
private Integer deleted;
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
// @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "ip地址")
private String ipAddress;
@ApiModelProperty(value = "真实ip地址")
private String ipRealAddress;
private String fromAvatar;
private String toAvatar;
}

View File

@@ -0,0 +1,87 @@
package com.dd.admin.business.chat.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.Version;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
*
* </p>
*
* @author 727869402@qq.com
* @since 2024-12-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("business_chat")
@ApiModel(value="Chat对象", description="")
public class Chat implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "消息id")
@TableId(value = "CHAT_ID", type = IdType.ASSIGN_UUID)
private String chatId;
@ApiModelProperty(value = "消息发送者")
@TableField("FROM_ID")
private String fromId;
@ApiModelProperty(value = "消息发送者")
@TableField("FROM_NAME")
private String fromName;
@ApiModelProperty(value = "接收者")
@TableField("TO_ID")
private String toId;
@ApiModelProperty(value = "接收者")
@TableField("TO_NAME")
private String toName;
@ApiModelProperty(value = "0文字 1图片 2语音 3视频")
@TableField("MESSAGE_TYPE")
private Integer messageType;
@ApiModelProperty(value = "0发送 1已读")
@TableField("MESSAGE_STATUS")
private Integer messageStatus;
@ApiModelProperty(value = "内容")
@TableField("CONTENT")
private String content;
@ApiModelProperty(value = "资源地址")
@TableField("RESOURCE_URL")
private String resourceUrl;
@ApiModelProperty(value = "0正常 1删除")
@TableField("DELETED")
@TableLogic
private Integer deleted;
@ApiModelProperty(value = "创建时间")
@TableField(value = "CREATE_TIME", fill = FieldFill.INSERT)
private Date createTime;
@ApiModelProperty(value = "ip地址")
@TableField("IP_ADDRESS")
private String ipAddress;
@ApiModelProperty(value = "真实ip地址")
@TableField("IP_REAL_ADDRESS")
private String ipRealAddress;
}

View File

@@ -0,0 +1,29 @@
package com.dd.admin.business.chat.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dd.admin.business.chat.entity.Chat;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dd.admin.business.chat.domain.ChatVo;
import com.dd.admin.business.chat.domain.ChatDto;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author 727869402@qq.com
* @since 2024-12-28
*/
@Mapper
public interface ChatMapper extends BaseMapper<Chat> {
IPage<ChatVo> selectChatPage(Page<ChatVo> page, @Param("chatDto") ChatDto chatDto);
ChatVo selectChat(@Param("chatId") String chatId);
List<ChatVo> selectChatDetail(@Param("chatDto") ChatDto chatDto);
List<ChatVo> selectChatList(@Param("toId")String toId);
}

View File

@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dd.admin.business.chat.mapper.ChatMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.dd.admin.business.chat.entity.Chat">
<id column="CHAT_ID" property="chatId" />
<result column="FROM_ID" property="fromId" />
<result column="FROM_NAME" property="fromName" />
<result column="TO_ID" property="toId" />
<result column="TO_NAME" property="toName" />
<result column="MESSAGE_TYPE" property="messageType" />
<result column="MESSAGE_STATUS" property="messageStatus" />
<result column="CONTENT" property="content" />
<result column="RESOURCE_URL" property="resourceUrl" />
<result column="DELETED" property="deleted" />
<result column="CREATE_TIME" property="createTime" />
<result column="IP_ADDRESS" property="ipAddress" />
<result column="IP_REAL_ADDRESS" property="ipRealAddress" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
CHAT_ID, FROM_ID, FROM_NAME, TO_ID, TO_NAME, MESSAGE_TYPE, MESSAGE_STATUS, CONTENT, RESOURCE_URL, DELETED, CREATE_TIME, IP_ADDRESS, IP_REAL_ADDRESS
</sql>
<select id="selectChatPage" resultType="com.dd.admin.business.chat.domain.ChatVo">
select
a.*,
b.AVATAR_URL as toAvatar,
c.AVATAR_URL as fromAvatar
from business_chat a
left join business_author b on a.to_id = b.author_id
left join business_author c on a.from_id = c.author_id
where
( (a.from_id = #{chatDto.fromId} and a.to_id = #{chatDto.toId})
or (a.from_id = #{chatDto.toId} and a.to_id = #{chatDto.fromId}))
order by create_time desc
</select>
<select id="selectChatDetail" resultType="com.dd.admin.business.chat.domain.ChatVo">
select
*
from business_chat where 1 = 1
</select>
<select id="selectChat" resultType="com.dd.admin.business.chat.domain.ChatVo"
parameterType="com.dd.admin.business.chat.domain.ChatDto">
select
a.*,
b.AVATAR_URL as toAvatar,
c.AVATAR_URL as fromAvatar
from business_chat a
left join business_author b on a.to_id = b.author_id
left join business_author c on a.from_id = c.author_id
where 1 = 1
<if test="chatId!= null and chatId!= ''">
and a.chat_id = #{chatId}
</if>
limit 1
</select>
<select id="selectChatList" resultType="com.dd.admin.business.chat.domain.ChatVo"
parameterType="java.lang.String">
SELECT
*, b.AVATAR_URL AS fromAvatar
FROM
business_chat a
LEFT JOIN business_author b ON a.FROM_ID = b.AUTHOR_ID
WHERE
a.TO_ID = #{toId}
GROUP BY
a.TO_ID = #{toId}
ORDER BY
a.create_time DESC
</select>
</mapper>

View File

@@ -0,0 +1,29 @@
package com.dd.admin.business.chat.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.dd.admin.business.chat.entity.Chat;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dd.admin.business.chat.domain.ChatVo;
import com.dd.admin.business.chat.domain.ChatDto;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* 服务类
* </p>
*
* @author 727869402@qq.com
* @since 2024-12-28
*/
public interface ChatService extends IService<Chat> {
//-分页列表
IPage<ChatVo> selectChatPage(ChatDto chatDto);
ChatVo selectChat(String chatId);
//-列表
List<ChatVo> selectChatDetail(ChatDto chatDto);
List<ChatVo> selectChatList(String toId);
}

View File

@@ -0,0 +1,46 @@
package com.dd.admin.business.chat.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dd.admin.common.model.PageFactory;
import com.dd.admin.business.chat.entity.Chat;
import com.dd.admin.business.chat.mapper.ChatMapper;
import com.dd.admin.business.chat.service.ChatService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.dd.admin.business.chat.domain.ChatVo;
import com.dd.admin.business.chat.domain.ChatDto;
import java.util.List;
/**
* <p>
* 服务实现类
* </p>
*
* @author 727869402@qq.com
* @since 2024-12-28
*/
@Service
public class ChatServiceImpl extends ServiceImpl<ChatMapper, Chat> implements ChatService {
@Override
public IPage<ChatVo> selectChatPage(ChatDto chatDto) {
Page page = PageFactory.defaultPage();
return baseMapper.selectChatPage(page,chatDto);
}
@Override
public ChatVo selectChat(String chatId) {
return baseMapper.selectChat(chatId);
}
@Override
public List<ChatVo> selectChatDetail(ChatDto chatDto) {
return baseMapper.selectChatDetail(chatDto);
}
@Override
public List<ChatVo> selectChatList(String toId) {
return baseMapper.selectChatList(toId);
}
}

View File

@@ -1 +1 @@
package com.dd.admin.business.webSocket;
package com.dd.admin.business.webSocket;

View File

@@ -1 +1 @@
package com.dd.admin.business.webSocket.handler;
package com.dd.admin.business.webSocket.handler;

View File

@@ -1 +1 @@
package com.dd.admin.business.webSocket.util;
package com.dd.admin.business.webSocket.util;