wukai пре 1 година
родитељ
комит
4fbe61fd23
28 измењених фајлова са 726 додато и 278 уклоњено
  1. 3 5
      doc-admin/src/main/java/com/doc/RuoYiServletInitializer.java
  2. 105 0
      doc-admin/src/main/resources/application-test.yml
  3. 5 1
      doc-biz/pom.xml
  4. 39 0
      doc-biz/src/main/java/com/doc/biz/controller/DocMsgController.java
  5. 25 0
      doc-biz/src/main/java/com/doc/biz/controller/FileUploadController.java
  6. 15 13
      doc-biz/src/main/java/com/doc/biz/domain/DocActor.java
  7. 18 16
      doc-biz/src/main/java/com/doc/biz/domain/DocDir.java
  8. 15 13
      doc-biz/src/main/java/com/doc/biz/domain/DocDirUser.java
  9. 16 14
      doc-biz/src/main/java/com/doc/biz/domain/DocFavorite.java
  10. 14 11
      doc-biz/src/main/java/com/doc/biz/domain/DocFavoriteLabel.java
  11. 18 15
      doc-biz/src/main/java/com/doc/biz/domain/DocInfo.java
  12. 46 61
      doc-biz/src/main/java/com/doc/biz/domain/DocMsg.java
  13. 15 12
      doc-biz/src/main/java/com/doc/biz/domain/DocRecent.java
  14. 15 13
      doc-biz/src/main/java/com/doc/biz/domain/DocShare.java
  15. 20 18
      doc-biz/src/main/java/com/doc/biz/domain/DocSpace.java
  16. 19 17
      doc-biz/src/main/java/com/doc/biz/domain/DocSpaceExpansion.java
  17. 13 10
      doc-biz/src/main/java/com/doc/biz/domain/DocTransfer.java
  18. 14 12
      doc-biz/src/main/java/com/doc/biz/domain/DocVersion.java
  19. 10 0
      doc-biz/src/main/java/com/doc/biz/mapper/DocMsgMapper.java
  20. 9 0
      doc-biz/src/main/java/com/doc/biz/service/IDocMsgService.java
  21. 12 2
      doc-biz/src/main/java/com/doc/biz/service/impl/DocMsgServiceImpl.java
  22. 55 0
      doc-biz/src/main/java/com/doc/biz/ws/ChatMessageListener.java
  23. 44 0
      doc-biz/src/main/java/com/doc/biz/ws/RedisSubscriberConfig.java
  24. 21 0
      doc-biz/src/main/java/com/doc/biz/ws/WebSocketConfig.java
  25. 116 0
      doc-biz/src/main/java/com/doc/biz/ws/WebSocketServer.java
  26. 38 45
      doc-biz/src/main/resources/mapper/biz/DocMsgMapper.xml
  27. 4 0
      doc-common/src/main/java/com/doc/common/constant/Constants.java
  28. 2 0
      doc-framework/src/main/java/com/doc/framework/config/SecurityConfig.java

+ 3 - 5
doc-admin/src/main/java/com/doc/RuoYiServletInitializer.java

@@ -5,14 +5,12 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer
 
 /**
  * web容器中进行部署
- * 
+ *
  * @author ruoyi
  */
-public class RuoYiServletInitializer extends SpringBootServletInitializer
-{
+public class RuoYiServletInitializer extends SpringBootServletInitializer {
     @Override
-    protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
-    {
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
         return application.sources(RuoYiApplication.class);
     }
 }

+ 105 - 0
doc-admin/src/main/resources/application-test.yml

@@ -0,0 +1,105 @@
+# 开发环境配置
+server:
+  # 服务器的HTTP端口,默认为8080
+  port: 8080
+# 项目相关配置
+ruoyi:
+  # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
+  profile: D:/ruoyi/uploadPath
+# Spring配置
+spring:
+  #mongodb配置
+  data:
+    mongodb:
+      host: 127.0.0.1
+      port: 27017
+      database: document
+
+  # redis 配置
+  redis:
+    # 地址
+    host: 127.0.0.1
+    # 端口,默认为6379
+    port: 6379
+    # 数据库索引
+    database: 0
+    # 密码
+    password: redis123
+    # 连接超时时间
+    timeout: 10s
+    lettuce:
+      pool:
+        # 连接池中的最小空闲连接
+        min-idle: 0
+        # 连接池中的最大空闲连接
+        max-idle: 8
+        # 连接池的最大数据库连接数
+        max-active: 8
+        # #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+  #数据源配置
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 主库数据源
+      master:
+        url: jdbc:mysql://127.0.0.1:3306/doc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: 123456
+      # 从库数据源
+      slave:
+        # 从数据源开关/默认关闭
+        enabled: false
+        url:
+        username:
+        password:
+      # 初始连接数
+      initialSize: 5
+      # 最小连接池数量
+      minIdle: 10
+      # 最大连接池数量
+      maxActive: 20
+      # 配置获取连接等待超时的时间
+      maxWait: 60000
+      # 配置连接超时时间
+      connectTimeout: 30000
+      # 配置网络超时时间
+      socketTimeout: 60000
+      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+      timeBetweenEvictionRunsMillis: 60000
+      # 配置一个连接在池中最小生存的时间,单位是毫秒
+      minEvictableIdleTimeMillis: 300000
+      # 配置一个连接在池中最大生存的时间,单位是毫秒
+      maxEvictableIdleTimeMillis: 900000
+      # 配置检测连接是否有效
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 设置白名单,不填则允许所有访问
+        allow:
+        url-pattern: /druid/*
+        # 控制台管理用户名和密码
+        login-username: admin
+        login-password: admin
+      filter:
+        stat:
+          enabled: true
+          # 慢SQL记录
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+
+# 日志配置
+logging:
+  level:
+    com.doc: debug
+    org.springframework: warn

+ 5 - 1
doc-biz/pom.xml

@@ -16,7 +16,6 @@
     </description>
 
     <dependencies>
-
         <!-- 通用工具-->
         <dependency>
             <groupId>com.jjt</groupId>
@@ -26,6 +25,11 @@
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
+        <!-- SpringBoot Websocket -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 39 - 0
doc-biz/src/main/java/com/doc/biz/controller/DocMsgController.java

@@ -1,19 +1,25 @@
 package com.doc.biz.controller;
 
+import com.alibaba.fastjson2.JSON;
 import com.doc.biz.domain.DocMsg;
 import com.doc.biz.service.IDocMsgService;
 import com.doc.common.annotation.Log;
+import com.doc.common.constant.Constants;
 import com.doc.common.core.controller.BaseController;
 import com.doc.common.core.domain.AjaxResult;
 import com.doc.common.core.page.TableDataInfo;
 import com.doc.common.enums.BusinessType;
+import com.doc.common.utils.SecurityUtils;
 import com.doc.common.utils.poi.ExcelUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -25,9 +31,42 @@ import java.util.List;
 @Api(tags = "消息管理")
 @RestController
 @RequestMapping("/biz/msg")
+@Slf4j
 public class DocMsgController extends BaseController {
     @Resource
     private IDocMsgService docMsgService;
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+
+    /**
+     * 发送消息
+     *
+     * @param msg
+     * @return
+     */
+    @ApiOperation("发送消息")
+    @PostMapping("/send")
+    public AjaxResult send(@RequestBody DocMsg msg) {
+        msg.setFrom(SecurityUtils.getUserId());
+        msg.setCreateTime(new Date());
+        stringRedisTemplate.convertAndSend(Constants.CHANNEL, JSON.toJSONString(msg));
+        docMsgService.insertDocMsg(msg);
+        return success();
+    }
+
+    /**
+     * 消息记录
+     *
+     * @param to 用户ID
+     * @return
+     */
+    @ApiOperation("消息记录")
+    @GetMapping("/record/{to}")
+    public TableDataInfo record(@PathVariable Long to) {
+        startPage();
+        List<DocMsg> list = docMsgService.selectRecordList(SecurityUtils.getUserId(), to);
+        return getDataTable(list);
+    }
 
     /**
      * 查询消息管理列表

+ 25 - 0
doc-biz/src/main/java/com/doc/biz/controller/FileUploadController.java

@@ -1,10 +1,15 @@
 package com.doc.biz.controller;
 
+import com.alibaba.fastjson2.JSON;
+import com.doc.biz.domain.DocMsg;
 import com.doc.biz.service.IMongoService;
 import com.doc.biz.vo.DocumentVO;
 import com.doc.common.core.controller.BaseController;
 import com.doc.common.core.domain.AjaxResult;
+import com.doc.common.utils.SecurityUtils;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -32,6 +37,26 @@ public class FileUploadController extends BaseController {
      */
     @Resource
     private IMongoService mongoService;
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+
+    /**
+     * 文件上传
+     *
+     * @param msg
+     * @return
+     */
+    @PostMapping("/send")
+    public AjaxResult send(@RequestBody DocMsg msg) {
+        try {
+            msg.setFrom(SecurityUtils.getUserId());
+            stringRedisTemplate.convertAndSend("ws-chat", JSON.toJSONString(msg));
+            return success();
+        } catch (Exception e) {
+            log.error("文件上传失败:", e);
+            return error(e.getMessage());
+        }
+    }
 
     /**
      * 文件上传

+ 15 - 13
doc-biz/src/main/java/com/doc/biz/domain/DocActor.java

@@ -1,19 +1,20 @@
 package com.doc.biz.domain;
 
-import com.doc.common.annotation.Excel;
-import com.doc.common.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.BaseEntity;
 
 /**
  * 文档协作对象 doc_actor
  *
  * @author wukai
- * @date 2023-08-18
+ * @date 2023-08-21
  */
-@ApiModel(value = "DocActor", description = "文档协作")
+@ApiModel(value = "DocActor" , description = "文档协作")
 public class DocActor extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
@@ -21,6 +22,7 @@ public class DocActor extends BaseEntity {
      * 自增ID
      */
     @ApiModelProperty("自增ID")
+    @TableId
     private Long autoId;
 
     /**
@@ -77,15 +79,15 @@ public class DocActor extends BaseEntity {
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("autoId", getAutoId())
-                .append("docId", getDocId())
-                .append("userId", getUserId())
-                .append("isCompleted", getIsCompleted())
-                .append("createBy", getCreateBy())
-                .append("createTime", getCreateTime())
-                .append("updateBy", getUpdateBy())
-                .append("updateTime", getUpdateTime())
-                .append("remark", getRemark())
+                .append("autoId" , getAutoId())
+                .append("docId" , getDocId())
+                .append("userId" , getUserId())
+                .append("isCompleted" , getIsCompleted())
+                .append("createBy" , getCreateBy())
+                .append("createTime" , getCreateTime())
+                .append("updateBy" , getUpdateBy())
+                .append("updateTime" , getUpdateTime())
+                .append("remark" , getRemark())
                 .toString();
     }
 }

+ 18 - 16
doc-biz/src/main/java/com/doc/biz/domain/DocDir.java

@@ -1,19 +1,20 @@
 package com.doc.biz.domain;
 
-import com.doc.common.annotation.Excel;
-import com.doc.common.core.domain.TreeEntity;
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.TreeEntity;
 
 /**
  * 文档目录管理对象 doc_dir
  *
  * @author wukai
- * @date 2023-08-18
+ * @date 2023-08-21
  */
-@ApiModel(value = "DocDir", description = "文档目录管理")
+@ApiModel(value = "DocDir" , description = "文档目录管理")
 public class DocDir extends TreeEntity {
     private static final long serialVersionUID = 1L;
 
@@ -21,6 +22,7 @@ public class DocDir extends TreeEntity {
      * 目录ID
      */
     @ApiModelProperty("目录ID")
+    @TableId
     private Long dirId;
 
     /**
@@ -107,18 +109,18 @@ public class DocDir extends TreeEntity {
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("dirId", getDirId())
-                .append("spaceId", getSpaceId())
-                .append("dirType", getDirType())
-                .append("dirRole", getDirRole())
-                .append("dirName", getDirName())
-                .append("parentId", getParentId())
-                .append("dirPath", getDirPath())
-                .append("createBy", getCreateBy())
-                .append("createTime", getCreateTime())
-                .append("updateBy", getUpdateBy())
-                .append("updateTime", getUpdateTime())
-                .append("remark", getRemark())
+                .append("dirId" , getDirId())
+                .append("spaceId" , getSpaceId())
+                .append("dirType" , getDirType())
+                .append("dirRole" , getDirRole())
+                .append("dirName" , getDirName())
+                .append("parentId" , getParentId())
+                .append("dirPath" , getDirPath())
+                .append("createBy" , getCreateBy())
+                .append("createTime" , getCreateTime())
+                .append("updateBy" , getUpdateBy())
+                .append("updateTime" , getUpdateTime())
+                .append("remark" , getRemark())
                 .toString();
     }
 }

+ 15 - 13
doc-biz/src/main/java/com/doc/biz/domain/DocDirUser.java

@@ -1,19 +1,20 @@
 package com.doc.biz.domain;
 
-import com.doc.common.annotation.Excel;
-import com.doc.common.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.BaseEntity;
 
 /**
  * 组织目录成员对象 doc_dir_user
  *
  * @author wukai
- * @date 2023-08-18
+ * @date 2023-08-21
  */
-@ApiModel(value = "DocDirUser", description = "组织目录成员")
+@ApiModel(value = "DocDirUser" , description = "组织目录成员")
 public class DocDirUser extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
@@ -21,6 +22,7 @@ public class DocDirUser extends BaseEntity {
      * 自增ID
      */
     @ApiModelProperty("自增ID")
+    @TableId
     private Long autoId;
 
     /**
@@ -77,15 +79,15 @@ public class DocDirUser extends BaseEntity {
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("autoId", getAutoId())
-                .append("dirId", getDirId())
-                .append("userId", getUserId())
-                .append("isManager", getIsManager())
-                .append("createBy", getCreateBy())
-                .append("createTime", getCreateTime())
-                .append("updateBy", getUpdateBy())
-                .append("updateTime", getUpdateTime())
-                .append("remark", getRemark())
+                .append("autoId" , getAutoId())
+                .append("dirId" , getDirId())
+                .append("userId" , getUserId())
+                .append("isManager" , getIsManager())
+                .append("createBy" , getCreateBy())
+                .append("createTime" , getCreateTime())
+                .append("updateBy" , getUpdateBy())
+                .append("updateTime" , getUpdateTime())
+                .append("remark" , getRemark())
                 .toString();
     }
 }

+ 16 - 14
doc-biz/src/main/java/com/doc/biz/domain/DocFavorite.java

@@ -1,19 +1,20 @@
 package com.doc.biz.domain;
 
-import com.doc.common.annotation.Excel;
-import com.doc.common.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.BaseEntity;
 
 /**
  * 文件收藏对象 doc_favorite
  *
  * @author wukai
- * @date 2023-08-18
+ * @date 2023-08-21
  */
-@ApiModel(value = "DocFavorite", description = "文件收藏")
+@ApiModel(value = "DocFavorite" , description = "文件收藏")
 public class DocFavorite extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
@@ -21,6 +22,7 @@ public class DocFavorite extends BaseEntity {
      * 收藏ID
      */
     @ApiModelProperty("收藏ID")
+    @TableId
     private Long favoriteId;
 
     /**
@@ -91,16 +93,16 @@ public class DocFavorite extends BaseEntity {
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("favoriteId", getFavoriteId())
-                .append("labelId", getLabelId())
-                .append("isFolder", getIsFolder())
-                .append("relaId", getRelaId())
-                .append("owner", getOwner())
-                .append("createBy", getCreateBy())
-                .append("createTime", getCreateTime())
-                .append("updateBy", getUpdateBy())
-                .append("updateTime", getUpdateTime())
-                .append("remark", getRemark())
+                .append("favoriteId" , getFavoriteId())
+                .append("labelId" , getLabelId())
+                .append("isFolder" , getIsFolder())
+                .append("relaId" , getRelaId())
+                .append("owner" , getOwner())
+                .append("createBy" , getCreateBy())
+                .append("createTime" , getCreateTime())
+                .append("updateBy" , getUpdateBy())
+                .append("updateTime" , getUpdateTime())
+                .append("remark" , getRemark())
                 .toString();
     }
 }

+ 14 - 11
doc-biz/src/main/java/com/doc/biz/domain/DocFavoriteLabel.java

@@ -1,18 +1,20 @@
 package com.doc.biz.domain;
 
-import com.doc.common.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.BaseEntity;
 
 /**
  * 文件收藏标签对象 doc_favorite_label
  *
  * @author wukai
- * @date 2023-08-18
+ * @date 2023-08-21
  */
-@ApiModel(value = "DocFavoriteLabel", description = "文件收藏标签")
+@ApiModel(value = "DocFavoriteLabel" , description = "文件收藏标签")
 public class DocFavoriteLabel extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
@@ -20,6 +22,7 @@ public class DocFavoriteLabel extends BaseEntity {
      * 收藏标签ID
      */
     @ApiModelProperty("收藏标签ID")
+    @TableId
     private Long labelId;
 
     /**
@@ -61,14 +64,14 @@ public class DocFavoriteLabel extends BaseEntity {
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("labelId", getLabelId())
-                .append("labelName", getLabelName())
-                .append("owner", getOwner())
-                .append("createBy", getCreateBy())
-                .append("createTime", getCreateTime())
-                .append("updateBy", getUpdateBy())
-                .append("updateTime", getUpdateTime())
-                .append("remark", getRemark())
+                .append("labelId" , getLabelId())
+                .append("labelName" , getLabelName())
+                .append("owner" , getOwner())
+                .append("createBy" , getCreateBy())
+                .append("createTime" , getCreateTime())
+                .append("updateBy" , getUpdateBy())
+                .append("updateTime" , getUpdateTime())
+                .append("remark" , getRemark())
                 .toString();
     }
 }

+ 18 - 15
doc-biz/src/main/java/com/doc/biz/domain/DocInfo.java

@@ -1,18 +1,20 @@
 package com.doc.biz.domain;
 
-import com.doc.common.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.BaseEntity;
 
 /**
  * 文件基本信息表对象 doc_info
  *
  * @author wukai
- * @date 2023-08-18
+ * @date 2023-08-21
  */
-@ApiModel(value = "DocInfo", description = "文件基本信息表")
+@ApiModel(value = "DocInfo" , description = "文件基本信息表")
 public class DocInfo extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
@@ -20,6 +22,7 @@ public class DocInfo extends BaseEntity {
      * 文件ID
      */
     @ApiModelProperty("文件ID")
+    @TableId
     private Long docId;
 
     /**
@@ -117,18 +120,18 @@ public class DocInfo extends BaseEntity {
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("docId", getDocId())
-                .append("spaceId", getSpaceId())
-                .append("dirId", getDirId())
-                .append("fileName", getFileName())
-                .append("fileId", getFileId())
-                .append("fileSize", getFileSize())
-                .append("fileType", getFileType())
-                .append("createBy", getCreateBy())
-                .append("createTime", getCreateTime())
-                .append("updateBy", getUpdateBy())
-                .append("updateTime", getUpdateTime())
-                .append("remark", getRemark())
+                .append("docId" , getDocId())
+                .append("spaceId" , getSpaceId())
+                .append("dirId" , getDirId())
+                .append("fileName" , getFileName())
+                .append("fileId" , getFileId())
+                .append("fileSize" , getFileSize())
+                .append("fileType" , getFileType())
+                .append("createBy" , getCreateBy())
+                .append("createTime" , getCreateTime())
+                .append("updateBy" , getUpdateBy())
+                .append("updateTime" , getUpdateTime())
+                .append("remark" , getRemark())
                 .toString();
     }
 }

+ 46 - 61
doc-biz/src/main/java/com/doc/biz/domain/DocMsg.java

@@ -1,104 +1,89 @@
 package com.doc.biz.domain;
 
-import com.doc.common.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.BaseEntity;
 
 /**
  * 消息管理对象 doc_msg
  *
  * @author wukai
- * @date 2023-08-18
+ * @date 2023-08-22
  */
 @ApiModel(value = "DocMsg", description = "消息管理")
-public class DocMsg extends BaseEntity {
+public class DocMsg extends BaseEntity
+{
     private static final long serialVersionUID = 1L;
 
-    /**
-     * 消息ID
-     */
+    /** 消息ID */
     @ApiModelProperty("消息ID")
+    @TableId
     private Long msgId;
 
-    /**
-     * 发送方用户ID
-     */
+    /** 发送方用户ID */
     @ApiModelProperty("发送方用户ID")
-    private String senderId;
+    @Excel(name = "发送方用户ID")
+    private Long from;
 
-    /**
-     * 接受方用户ID
-     */
+    /** 接受方用户ID */
     @ApiModelProperty("接受方用户ID")
-    private String receiverId;
+    @Excel(name = "接受方用户ID")
+    private Long to;
 
-    /**
-     * 消息内容
-     */
+    /** 消息内容 */
     @ApiModelProperty("消息内容")
-    private String msgContent;
-
-    /**
-     * 文件列表
-     */
-    @ApiModelProperty("文件列表")
-    private String msgFiles;
+    @Excel(name = "消息内容")
+    private String content;
 
-    public void setMsgId(Long msgId) {
+    public void setMsgId(Long msgId)
+    {
         this.msgId = msgId;
     }
 
-    public Long getMsgId() {
+    public Long getMsgId()
+    {
         return msgId;
     }
-
-    public void setSenderId(String senderId) {
-        this.senderId = senderId;
-    }
-
-    public String getSenderId() {
-        return senderId;
+    public void setFrom(Long from)
+    {
+        this.from = from;
     }
 
-    public void setReceiverId(String receiverId) {
-        this.receiverId = receiverId;
+    public Long getFrom()
+    {
+        return from;
     }
-
-    public String getReceiverId() {
-        return receiverId;
+    public void setTo(Long to)
+    {
+        this.to = to;
     }
 
-    public void setMsgContent(String msgContent) {
-        this.msgContent = msgContent;
+    public Long getTo()
+    {
+        return to;
     }
-
-    public String getMsgContent() {
-        return msgContent;
-    }
-
-    public void setMsgFiles(String msgFiles) {
-        this.msgFiles = msgFiles;
+    public void setContent(String content)
+    {
+        this.content = content;
     }
 
-    public String getMsgFiles() {
-        return msgFiles;
+    public String getContent()
+    {
+        return content;
     }
 
     @Override
     public String toString() {
-        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("msgId", getMsgId())
-                .append("senderId", getSenderId())
-                .append("receiverId", getReceiverId())
-                .append("msgContent", getMsgContent())
-                .append("msgFiles", getMsgFiles())
-                .append("createBy", getCreateBy())
-                .append("createTime", getCreateTime())
-                .append("updateBy", getUpdateBy())
-                .append("updateTime", getUpdateTime())
-                .append("remark", getRemark())
-                .toString();
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("msgId", getMsgId())
+            .append("from", getFrom())
+            .append("to", getTo())
+            .append("content", getContent())
+            .append("createTime", getCreateTime())
+            .toString();
     }
 }

+ 15 - 12
doc-biz/src/main/java/com/doc/biz/domain/DocRecent.java

@@ -1,18 +1,20 @@
 package com.doc.biz.domain;
 
-import com.doc.common.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.BaseEntity;
 
 /**
  * 最近文件对象 doc_recent
  *
  * @author wukai
- * @date 2023-08-18
+ * @date 2023-08-21
  */
-@ApiModel(value = "DocRecent", description = "最近文件")
+@ApiModel(value = "DocRecent" , description = "最近文件")
 public class DocRecent extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
@@ -20,6 +22,7 @@ public class DocRecent extends BaseEntity {
      * 自增ID
      */
     @ApiModelProperty("自增ID")
+    @TableId
     private Long recentId;
 
     /**
@@ -75,15 +78,15 @@ public class DocRecent extends BaseEntity {
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("recentId", getRecentId())
-                .append("isFolder", getIsFolder())
-                .append("relaId", getRelaId())
-                .append("owner", getOwner())
-                .append("createBy", getCreateBy())
-                .append("createTime", getCreateTime())
-                .append("updateBy", getUpdateBy())
-                .append("updateTime", getUpdateTime())
-                .append("remark", getRemark())
+                .append("recentId" , getRecentId())
+                .append("isFolder" , getIsFolder())
+                .append("relaId" , getRelaId())
+                .append("owner" , getOwner())
+                .append("createBy" , getCreateBy())
+                .append("createTime" , getCreateTime())
+                .append("updateBy" , getUpdateBy())
+                .append("updateTime" , getUpdateTime())
+                .append("remark" , getRemark())
                 .toString();
     }
 }

+ 15 - 13
doc-biz/src/main/java/com/doc/biz/domain/DocShare.java

@@ -1,19 +1,20 @@
 package com.doc.biz.domain;
 
-import com.doc.common.annotation.Excel;
-import com.doc.common.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.BaseEntity;
 
 /**
  * 文档分享对象 doc_share
  *
  * @author wukai
- * @date 2023-08-18
+ * @date 2023-08-21
  */
-@ApiModel(value = "DocShare", description = "文档分享")
+@ApiModel(value = "DocShare" , description = "文档分享")
 public class DocShare extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
@@ -21,6 +22,7 @@ public class DocShare extends BaseEntity {
      * 分享ID
      */
     @ApiModelProperty("分享ID")
+    @TableId
     private Long shareId;
 
     /**
@@ -77,15 +79,15 @@ public class DocShare extends BaseEntity {
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("shareId", getShareId())
-                .append("docId", getDocId())
-                .append("userId", getUserId())
-                .append("userName", getUserName())
-                .append("createBy", getCreateBy())
-                .append("createTime", getCreateTime())
-                .append("updateBy", getUpdateBy())
-                .append("updateTime", getUpdateTime())
-                .append("remark", getRemark())
+                .append("shareId" , getShareId())
+                .append("docId" , getDocId())
+                .append("userId" , getUserId())
+                .append("userName" , getUserName())
+                .append("createBy" , getCreateBy())
+                .append("createTime" , getCreateTime())
+                .append("updateBy" , getUpdateBy())
+                .append("updateTime" , getUpdateTime())
+                .append("remark" , getRemark())
                 .toString();
     }
 }

+ 20 - 18
doc-biz/src/main/java/com/doc/biz/domain/DocSpace.java

@@ -1,21 +1,22 @@
 package com.doc.biz.domain;
 
-import com.doc.common.annotation.Excel;
-import com.doc.common.core.domain.BaseEntity;
+import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
-
-import java.math.BigDecimal;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.BaseEntity;
 
 /**
  * 文档空间管理对象 doc_space
  *
  * @author wukai
- * @date 2023-08-18
+ * @date 2023-08-21
  */
-@ApiModel(value = "DocSpace", description = "文档空间管理")
+@ApiModel(value = "DocSpace" , description = "文档空间管理")
 public class DocSpace extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
@@ -23,6 +24,7 @@ public class DocSpace extends BaseEntity {
      * 空间ID
      */
     @ApiModelProperty("空间ID")
+    @TableId
     private Long spaceId;
 
     /**
@@ -126,18 +128,18 @@ public class DocSpace extends BaseEntity {
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("spaceId", getSpaceId())
-                .append("spaceType", getSpaceType())
-                .append("spaceName", getSpaceName())
-                .append("spaceCap", getSpaceCap())
-                .append("usedCap", getUsedCap())
-                .append("freeCap", getFreeCap())
-                .append("owner", getOwner())
-                .append("createBy", getCreateBy())
-                .append("createTime", getCreateTime())
-                .append("updateBy", getUpdateBy())
-                .append("updateTime", getUpdateTime())
-                .append("remark", getRemark())
+                .append("spaceId" , getSpaceId())
+                .append("spaceType" , getSpaceType())
+                .append("spaceName" , getSpaceName())
+                .append("spaceCap" , getSpaceCap())
+                .append("usedCap" , getUsedCap())
+                .append("freeCap" , getFreeCap())
+                .append("owner" , getOwner())
+                .append("createBy" , getCreateBy())
+                .append("createTime" , getCreateTime())
+                .append("updateBy" , getUpdateBy())
+                .append("updateTime" , getUpdateTime())
+                .append("remark" , getRemark())
                 .toString();
     }
 }

+ 19 - 17
doc-biz/src/main/java/com/doc/biz/domain/DocSpaceExpansion.java

@@ -1,21 +1,22 @@
 package com.doc.biz.domain;
 
-import com.doc.common.annotation.Excel;
-import com.doc.common.core.domain.BaseEntity;
+import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
-
-import java.math.BigDecimal;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.BaseEntity;
 
 /**
  * 空间扩容管理对象 doc_space_expansion
  *
  * @author wukai
- * @date 2023-08-18
+ * @date 2023-08-21
  */
-@ApiModel(value = "DocSpaceExpansion", description = "空间扩容管理")
+@ApiModel(value = "DocSpaceExpansion" , description = "空间扩容管理")
 public class DocSpaceExpansion extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
@@ -23,6 +24,7 @@ public class DocSpaceExpansion extends BaseEntity {
      * 自增ID
      */
     @ApiModelProperty("自增ID")
+    @TableId
     private Long autoId;
 
     /**
@@ -110,17 +112,17 @@ public class DocSpaceExpansion extends BaseEntity {
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("autoId", getAutoId())
-                .append("spaceId", getSpaceId())
-                .append("spaceName", getSpaceName())
-                .append("currentCap", getCurrentCap())
-                .append("expandCap", getExpandCap())
-                .append("expandReson", getExpandReson())
-                .append("createBy", getCreateBy())
-                .append("createTime", getCreateTime())
-                .append("updateBy", getUpdateBy())
-                .append("updateTime", getUpdateTime())
-                .append("remark", getRemark())
+                .append("autoId" , getAutoId())
+                .append("spaceId" , getSpaceId())
+                .append("spaceName" , getSpaceName())
+                .append("currentCap" , getCurrentCap())
+                .append("expandCap" , getExpandCap())
+                .append("expandReson" , getExpandReson())
+                .append("createBy" , getCreateBy())
+                .append("createTime" , getCreateTime())
+                .append("updateBy" , getUpdateBy())
+                .append("updateTime" , getUpdateTime())
+                .append("remark" , getRemark())
                 .toString();
     }
 }

+ 13 - 10
doc-biz/src/main/java/com/doc/biz/domain/DocTransfer.java

@@ -1,18 +1,20 @@
 package com.doc.biz.domain;
 
-import com.doc.common.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.BaseEntity;
 
 /**
  * 文件传输对象 doc_transfer
  *
  * @author wukai
- * @date 2023-08-18
+ * @date 2023-08-21
  */
-@ApiModel(value = "DocTransfer", description = "文件传输")
+@ApiModel(value = "DocTransfer" , description = "文件传输")
 public class DocTransfer extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
@@ -20,6 +22,7 @@ public class DocTransfer extends BaseEntity {
      * 传输ID
      */
     @ApiModelProperty("传输ID")
+    @TableId
     private Long tranId;
 
     /**
@@ -47,13 +50,13 @@ public class DocTransfer extends BaseEntity {
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("tranId", getTranId())
-                .append("docId", getDocId())
-                .append("createBy", getCreateBy())
-                .append("createTime", getCreateTime())
-                .append("updateBy", getUpdateBy())
-                .append("updateTime", getUpdateTime())
-                .append("remark", getRemark())
+                .append("tranId" , getTranId())
+                .append("docId" , getDocId())
+                .append("createBy" , getCreateBy())
+                .append("createTime" , getCreateTime())
+                .append("updateBy" , getUpdateBy())
+                .append("updateTime" , getUpdateTime())
+                .append("remark" , getRemark())
                 .toString();
     }
 }

+ 14 - 12
doc-biz/src/main/java/com/doc/biz/domain/DocVersion.java

@@ -1,19 +1,20 @@
 package com.doc.biz.domain;
 
-import com.doc.common.annotation.Excel;
-import com.doc.common.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.BaseEntity;
 
 /**
  * 文档版本信息对象 doc_version
  *
  * @author wukai
- * @date 2023-08-18
+ * @date 2023-08-21
  */
-@ApiModel(value = "DocVersion", description = "文档版本信息")
+@ApiModel(value = "DocVersion" , description = "文档版本信息")
 public class DocVersion extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
@@ -21,6 +22,7 @@ public class DocVersion extends BaseEntity {
      * 自增ID
      */
     @ApiModelProperty("自增ID")
+    @TableId
     private Long versionId;
 
     /**
@@ -63,14 +65,14 @@ public class DocVersion extends BaseEntity {
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("versionId", getVersionId())
-                .append("docId", getDocId())
-                .append("fileId", getFileId())
-                .append("createBy", getCreateBy())
-                .append("createTime", getCreateTime())
-                .append("updateBy", getUpdateBy())
-                .append("updateTime", getUpdateTime())
-                .append("remark", getRemark())
+                .append("versionId" , getVersionId())
+                .append("docId" , getDocId())
+                .append("fileId" , getFileId())
+                .append("createBy" , getCreateBy())
+                .append("createTime" , getCreateTime())
+                .append("updateBy" , getUpdateBy())
+                .append("updateTime" , getUpdateTime())
+                .append("remark" , getRemark())
                 .toString();
     }
 }

+ 10 - 0
doc-biz/src/main/java/com/doc/biz/mapper/DocMsgMapper.java

@@ -2,6 +2,7 @@ package com.doc.biz.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doc.biz.domain.DocMsg;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -59,4 +60,13 @@ public interface DocMsgMapper extends BaseMapper<DocMsg> {
      * @return 结果
      */
     public int deleteDocMsgByMsgIds(Long[] msgIds);
+
+    /**
+     * 查询聊天记录
+     *
+     * @param from 当前用户ID
+     * @param to   对方用户ID
+     * @return
+     */
+    List<DocMsg> selectRecordList(@Param("from") Long from, @Param("to") Long to);
 }

+ 9 - 0
doc-biz/src/main/java/com/doc/biz/service/IDocMsgService.java

@@ -58,4 +58,13 @@ public interface IDocMsgService {
      * @return 结果
      */
     public int deleteDocMsgByMsgId(Long msgId);
+
+    /**
+     * 查询聊天记录
+     *
+     * @param from 当前用户ID
+     * @param to     对方用户ID
+     * @return
+     */
+    List<DocMsg> selectRecordList(Long from, Long to);
 }

+ 12 - 2
doc-biz/src/main/java/com/doc/biz/service/impl/DocMsgServiceImpl.java

@@ -50,7 +50,6 @@ public class DocMsgServiceImpl implements IDocMsgService {
      */
     @Override
     public int insertDocMsg(DocMsg docMsg) {
-        docMsg.setCreateTime(DateUtils.getNowDate());
         return docMsgMapper.insertDocMsg(docMsg);
     }
 
@@ -62,7 +61,6 @@ public class DocMsgServiceImpl implements IDocMsgService {
      */
     @Override
     public int updateDocMsg(DocMsg docMsg) {
-        docMsg.setUpdateTime(DateUtils.getNowDate());
         return docMsgMapper.updateDocMsg(docMsg);
     }
 
@@ -87,4 +85,16 @@ public class DocMsgServiceImpl implements IDocMsgService {
     public int deleteDocMsgByMsgId(Long msgId) {
         return docMsgMapper.deleteDocMsgByMsgId(msgId);
     }
+
+    /**
+     * 查询聊天记录
+     *
+     * @param from 当前用户ID
+     * @param to   对方用户ID
+     * @return
+     */
+    @Override
+    public List<DocMsg> selectRecordList(Long from, Long to) {
+        return docMsgMapper.selectRecordList(from, to);
+    }
 }

+ 55 - 0
doc-biz/src/main/java/com/doc/biz/ws/ChatMessageListener.java

@@ -0,0 +1,55 @@
+package com.doc.biz.ws;
+
+import com.doc.biz.domain.DocMsg;
+import com.doc.common.utils.StringUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.redis.connection.Message;
+import org.springframework.data.redis.connection.MessageListener;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 集群聊天消息监听器
+ *
+ * @author wukai
+ * @date 2023/8/23 17:52
+ */
+
+@Component
+@Slf4j
+public class ChatMessageListener implements MessageListener {
+
+    @Resource
+    private RedisTemplate redisTemplate;
+
+    @Resource
+    private WebSocketServer websocketEndpoint;
+
+    @Override
+    public void onMessage(Message message, byte[] pattern) {
+        RedisSerializer<String> valueSerializer = redisTemplate.getStringSerializer();
+        String value = valueSerializer.deserialize(message.getBody());
+
+        if (StringUtils.isNotBlank(value)) {
+            log.info("监听集群websocket消息--- {}", value);
+            //集群模式 推送消息
+            ObjectMapper mapper = new ObjectMapper();
+            DocMsg msg;
+            try {
+                msg = mapper.readValue(value, DocMsg.class);
+            } catch (JsonProcessingException e) {
+                throw new RuntimeException(e);
+            }
+            websocketEndpoint.sendClusterWebsocketMessage(msg);
+        }
+    }
+
+}
+

+ 44 - 0
doc-biz/src/main/java/com/doc/biz/ws/RedisSubscriberConfig.java

@@ -0,0 +1,44 @@
+package com.doc.biz.ws;
+
+import com.doc.common.constant.Constants;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.listener.PatternTopic;
+import org.springframework.data.redis.listener.RedisMessageListenerContainer;
+import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
+
+/**
+ * 消息订阅配置类
+ *
+ * @author wukai
+ * 2023-08-23
+ */
+@Configuration
+public class RedisSubscriberConfig {
+    /**
+     * 消息监听适配器,注入接受消息方法
+     *
+     * @param receiver
+     * @return
+     */
+    @Bean
+    public MessageListenerAdapter messageListenerAdapter(ChatMessageListener receiver) {
+        return new MessageListenerAdapter(receiver);
+    }
+
+    /**
+     * 创建消息监听容器
+     *
+     * @param redisConnectionFactory
+     * @param messageListenerAdapter
+     * @return
+     */
+    @Bean
+    public RedisMessageListenerContainer getRedisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory, MessageListenerAdapter messageListenerAdapter) {
+        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
+        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
+        redisMessageListenerContainer.addMessageListener(messageListenerAdapter, new PatternTopic(Constants.CHANNEL));
+        return redisMessageListenerContainer;
+    }
+}

+ 21 - 0
doc-biz/src/main/java/com/doc/biz/ws/WebSocketConfig.java

@@ -0,0 +1,21 @@
+package com.doc.biz.ws;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+/**
+ *  开启WebSocket支持
+ *
+ * @author ruoyi
+ */
+@Configuration
+public class WebSocketConfig {
+    /**
+     * 这个bean的注册,用于扫描带有@ServerEndpoint的注解成为websocket,如果你使用外置的tomcat就不需要该配置文件
+     */
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+}

+ 116 - 0
doc-biz/src/main/java/com/doc/biz/ws/WebSocketServer.java

@@ -0,0 +1,116 @@
+package com.doc.biz.ws;
+
+import com.alibaba.fastjson2.JSON;
+import com.doc.biz.domain.DocMsg;
+import com.doc.biz.mapper.DocMsgMapper;
+import com.doc.common.constant.Constants;
+import com.doc.common.core.redis.RedisCache;
+import com.doc.common.utils.spring.SpringUtils;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.OnClose;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.Date;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * websocket聊天
+ *
+ * @author wukai
+ */
+@ServerEndpoint(value = "/websocket/message/{uid}")
+@Component
+@Slf4j
+public class WebSocketServer {
+    private DocMsgMapper msgMapper = SpringUtils.getBean(DocMsgMapper.class);
+    private RedisTemplate redisTemplate = SpringUtils.getBean(StringRedisTemplate.class);
+    /**
+     * 保存 组id->组成员 的映射关系
+     * 之所以使用ConcurrentHashMap因为这个是线程安全的
+     */
+    private static ConcurrentHashMap<Long, Session> currentMap = new ConcurrentHashMap<>();
+
+    /**
+     * 连接建立成功调用
+     */
+    @OnOpen
+    public void onOpen(@PathParam("uid") Long uid, Session session) {
+        //需要通知其他的客户端,将所有的用户的用户名发送给客户端
+        //将当前连接的session存储到redis中
+        currentMap.put(uid, session);
+        log.info("用户(ID:{})建立连接!", uid);
+        try {
+            session.getBasicRemote().sendText("连接成功");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 发布集群的消息
+     *
+     * @param msg
+     */
+    private void sendClusterMessage(String msg) {
+        redisTemplate.convertAndSend(Constants.CHANNEL, msg);
+    }
+
+    /**
+     * 接收到客服端发送的数据消息时被调用
+     */
+    @OnMessage
+    public void onMessage(@PathParam("uid") Long uid, String message) {
+        try {
+            //获取客户端发送来的数据  {"toId":2,"message":"你好"}
+            ObjectMapper mapper = new ObjectMapper();
+            DocMsg msg = mapper.readValue(message, DocMsg.class);
+            msg.setFrom(uid);
+            msg.setCreateTime(new Date());
+            // 保存到数据库
+            msgMapper.insertDocMsg(msg);
+            //发布集群消息
+            this.sendClusterMessage(message);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 连接关闭时调用
+     */
+    @OnClose
+    public void onClose(@PathParam("uid") Long uid, Session session) {
+        log.info("用户(ID:{})关闭连接!", uid);
+        currentMap.remove(uid);
+    }
+
+    /**
+     * 发布websocket消息
+     *
+     * @param msg
+     * @return
+     */
+    public void sendClusterWebsocketMessage(DocMsg msg) {
+        if (msg != null) {
+            //获取对方用户的连接会话
+            try {
+                Session session = currentMap.get(msg.getTo());
+                if (session != null) {
+                    session.getBasicRemote().sendText(JSON.toJSONString(msg));
+                }
+            } catch (Exception e) {
+                log.info("会话异常!" + e.getMessage());
+                e.printStackTrace();
+            }
+        }
+    }
+}

+ 38 - 45
doc-biz/src/main/resources/mapper/biz/DocMsgMapper.xml

@@ -1,85 +1,78 @@
 <?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">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.doc.biz.mapper.DocMsgMapper">
-    
+
     <resultMap type="DocMsg" id="DocMsgResult">
-        <result property="msgId"    column="MSG_ID"    />
-        <result property="senderId"    column="SENDER_ID"    />
-        <result property="receiverId"    column="RECEIVER_ID"    />
-        <result property="msgContent"    column="MSG_CONTENT"    />
-        <result property="msgFiles"    column="MSG_FILES"    />
-        <result property="createBy"    column="CREATE_BY"    />
-        <result property="createTime"    column="CREATE_TIME"    />
-        <result property="updateBy"    column="UPDATE_BY"    />
-        <result property="updateTime"    column="UPDATE_TIME"    />
-        <result property="remark"    column="REMARK"    />
+        <result property="msgId" column="MSG_ID"/>
+        <result property="from" column="FROM"/>
+        <result property="to" column="TO"/>
+        <result property="content" column="CONTENT"/>
+        <result property="createTime" column="CREATE_TIME"/>
     </resultMap>
 
     <sql id="selectDocMsgVo">
-        select MSG_ID, SENDER_ID, RECEIVER_ID, MSG_CONTENT, MSG_FILES, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, REMARK from doc_msg
+        select MSG_ID, `FROM`, `TO`, CONTENT, CREATE_TIME
+        from doc_msg
     </sql>
 
     <select id="selectDocMsgList" parameterType="DocMsg" resultMap="DocMsgResult">
         <include refid="selectDocMsgVo"/>
-        <where>  
+        <where>
+            <if test="from != null ">and FROM = #{from}</if>
+            <if test="to != null ">and TO = #{to}</if>
+            <if test="content != null  and content != ''">and CONTENT = #{content}</if>
+            <if test="createTime != null ">and CREATE_TIME = #{createTime}</if>
         </where>
     </select>
-    
+
     <select id="selectDocMsgByMsgId" parameterType="Long" resultMap="DocMsgResult">
         <include refid="selectDocMsgVo"/>
         where MSG_ID = #{msgId}
     </select>
-        
+    <select id="selectRecordList" resultType="com.doc.biz.domain.DocMsg">
+        <include refid="selectDocMsgVo"/>
+        where (`FROM` = #{from} and `TO` = #{to})
+        or (`FROM` = #{to} and `TO` = #{from})
+        order by CREATE_TIME desc
+    </select>
+
     <insert id="insertDocMsg" parameterType="DocMsg" useGeneratedKeys="true" keyProperty="msgId">
         insert into doc_msg
         <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="senderId != null">SENDER_ID,</if>
-            <if test="receiverId != null">RECEIVER_ID,</if>
-            <if test="msgContent != null">MSG_CONTENT,</if>
-            <if test="msgFiles != null">MSG_FILES,</if>
-            <if test="createBy != null">CREATE_BY,</if>
+            <if test="from != null">`FROM`,</if>
+            <if test="to != null">`TO`,</if>
+            <if test="content != null">CONTENT,</if>
             <if test="createTime != null">CREATE_TIME,</if>
-            <if test="updateBy != null">UPDATE_BY,</if>
-            <if test="updateTime != null">UPDATE_TIME,</if>
-            <if test="remark != null">REMARK,</if>
-         </trim>
+        </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
-            <if test="senderId != null">#{senderId},</if>
-            <if test="receiverId != null">#{receiverId},</if>
-            <if test="msgContent != null">#{msgContent},</if>
-            <if test="msgFiles != null">#{msgFiles},</if>
-            <if test="createBy != null">#{createBy},</if>
+            <if test="from != null">#{from},</if>
+            <if test="to != null">#{to},</if>
+            <if test="content != null">#{content},</if>
             <if test="createTime != null">#{createTime},</if>
-            <if test="updateBy != null">#{updateBy},</if>
-            <if test="updateTime != null">#{updateTime},</if>
-            <if test="remark != null">#{remark},</if>
-         </trim>
+        </trim>
     </insert>
 
     <update id="updateDocMsg" parameterType="DocMsg">
         update doc_msg
         <trim prefix="SET" suffixOverrides=",">
-            <if test="senderId != null">SENDER_ID = #{senderId},</if>
-            <if test="receiverId != null">RECEIVER_ID = #{receiverId},</if>
-            <if test="msgContent != null">MSG_CONTENT = #{msgContent},</if>
-            <if test="msgFiles != null">MSG_FILES = #{msgFiles},</if>
-            <if test="createBy != null">CREATE_BY = #{createBy},</if>
+            <if test="from != null">`FROM` = #{from},</if>
+            <if test="to != null">`TO` = #{to},</if>
+            <if test="content != null">CONTENT = #{content},</if>
             <if test="createTime != null">CREATE_TIME = #{createTime},</if>
-            <if test="updateBy != null">UPDATE_BY = #{updateBy},</if>
-            <if test="updateTime != null">UPDATE_TIME = #{updateTime},</if>
-            <if test="remark != null">REMARK = #{remark},</if>
         </trim>
         where MSG_ID = #{msgId}
     </update>
 
     <delete id="deleteDocMsgByMsgId" parameterType="Long">
-        delete from doc_msg where MSG_ID = #{msgId}
+        delete
+        from doc_msg
+        where MSG_ID = #{msgId}
     </delete>
 
     <delete id="deleteDocMsgByMsgIds" parameterType="String">
-        delete from doc_msg where MSG_ID in 
+        delete from doc_msg where MSG_ID in
         <foreach item="msgId" collection="array" open="(" separator="," close=")">
             #{msgId}
         </foreach>

+ 4 - 0
doc-common/src/main/java/com/doc/common/constant/Constants.java

@@ -143,4 +143,8 @@ public class Constants {
      * 大于该值使用gridFS存储,小于等于该值的直接二进制存储
      */
     public static final long MONGO_FILE_SIZE = 16 * 16 * 1024;
+    /**
+     * 聊天消息订阅/发布通道
+     */
+    public static final String CHANNEL = "ws-chat";
 }

+ 2 - 0
doc-framework/src/main/java/com/doc/framework/config/SecurityConfig.java

@@ -115,6 +115,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/login", "/register", "/captchaImage").permitAll()
                 // 增加API接口允许匿名访问
                 .antMatchers("/api/**").permitAll()
+                // 增加websocket允许匿名访问
+                .antMatchers("/websocket/**").permitAll()
                 // 静态资源,可匿名访问
                 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()