Forráskód Böngészése

聊天消息相关接口

wukai 1 éve
szülő
commit
0f217a642e

+ 4 - 0
doc-biz/pom.xml

@@ -20,6 +20,10 @@
         <dependency>
             <groupId>com.jjt</groupId>
             <artifactId>jjt-common</artifactId>
+        </dependency>  <!-- 通用工具-->
+        <dependency>
+            <groupId>com.jjt</groupId>
+            <artifactId>jjt-system</artifactId>
         </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>

+ 55 - 8
doc-biz/src/main/java/com/doc/biz/controller/DocInfoController.java

@@ -15,12 +15,17 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
+import org.yaml.snakeyaml.util.UriEncoder;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 文件基本信息表Controller
@@ -46,9 +51,9 @@ public class DocInfoController extends BaseController {
      */
     @ApiOperation("上传文件")
     @PostMapping("/upload")
-    public AjaxResult uploadFile(@ApiParam(value = "文件", required = true) @RequestPart(value = "file") MultipartFile file,
-                                 @ApiParam(value = "空间ID", required = true) @RequestParam Long spaceId,
-                                 @ApiParam(value = "目录ID", required = true) @RequestParam Long dirId) {
+    public AjaxResult uploadFile(@ApiParam(value = "文件" , required = true) @RequestPart(value = "file") MultipartFile file,
+                                 @ApiParam(value = "空间ID" , required = true) @RequestParam Long spaceId,
+                                 @ApiParam(value = "目录ID" , required = true) @RequestParam Long dirId) {
         try {
             DocumentVO vo = mongoService.uploadFile(file);
             DocInfo docInfo = new DocInfo();
@@ -61,7 +66,7 @@ public class DocInfoController extends BaseController {
             docInfo.setCreateBy(SecurityUtils.getUsername());
             return toAjax(docInfoService.insertDocInfo(docInfo));
         } catch (Exception e) {
-            log.error("文件上传失败:", e);
+            log.error("文件上传失败:" , e);
             return error(e.getMessage());
         }
     }
@@ -82,6 +87,48 @@ public class DocInfoController extends BaseController {
     }
 
     /**
+     * 文件下载
+     *
+     * @param fileId fileId
+     * @return
+     */
+    @ApiOperation("文件下载")
+    @GetMapping("/download/{fileId}")
+    public ResponseEntity<Object> download(@PathVariable(name = "fileId") String fileId) {
+        DocumentVO mongoFileVo = mongoService.downloadFile(fileId);
+        if (Objects.nonNull(mongoFileVo)) {
+            return ResponseEntity.ok()
+                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=\"" + UriEncoder.encode(mongoFileVo.getFileName()) + "\"")
+                    .header(HttpHeaders.CONTENT_TYPE, mongoFileVo.getContentType())
+                    .header(HttpHeaders.CONTENT_LENGTH, mongoFileVo.getFileSize() + "").header("Connection" , "close")
+                    .body(mongoFileVo.getData());
+        } else {
+            return ResponseEntity.status(HttpStatus.NOT_FOUND).body("file does not exist");
+        }
+    }
+
+    /**
+     * 文件下载
+     *
+     * @param fileId fileId
+     * @return
+     */
+    @ApiOperation("文件预览")
+    @GetMapping("/preview/{fileId}")
+    public ResponseEntity<Object> preview(@PathVariable(name = "fileId") String fileId) {
+        DocumentVO mongoFileVo = mongoService.downloadFile(fileId);
+        if (Objects.nonNull(mongoFileVo)) {
+            return ResponseEntity.ok()
+                    .header(HttpHeaders.CONTENT_DISPOSITION, "filename=\"" + UriEncoder.encode(mongoFileVo.getFileName()) + "\"")
+                    .header(HttpHeaders.CONTENT_TYPE, mongoFileVo.getContentType())
+                    .header(HttpHeaders.CONTENT_LENGTH, mongoFileVo.getFileSize() + "").header("Connection" , "close")
+                    .body(mongoFileVo.getData());
+        } else {
+            return ResponseEntity.status(HttpStatus.NOT_FOUND).body("file does not exist");
+        }
+    }
+
+    /**
      * 查询文件基本信息表列表
      */
     @ApiOperation("查询文件基本信息表列表")
@@ -98,7 +145,7 @@ public class DocInfoController extends BaseController {
      */
     @ApiOperation("导出文件基本信息表列表")
     //@PreAuthorize("@ss.hasPermi('biz:info:export')")
-    @Log(title = "文件基本信息表", businessType = BusinessType.EXPORT)
+    @Log(title = "文件基本信息表" , businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, DocInfo docInfo) {
         List<DocInfo> list = docInfoService.selectDocInfoList(docInfo);
@@ -121,7 +168,7 @@ public class DocInfoController extends BaseController {
      */
     @ApiOperation("新增文件基本信息表")
     //@PreAuthorize("@ss.hasPermi('biz:info:add')")
-    @Log(title = "文件基本信息表", businessType = BusinessType.INSERT)
+    @Log(title = "文件基本信息表" , businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody DocInfo docInfo) {
         return toAjax(docInfoService.insertDocInfo(docInfo));
@@ -132,7 +179,7 @@ public class DocInfoController extends BaseController {
      */
     @ApiOperation("修改文件基本信息表")
     //@PreAuthorize("@ss.hasPermi('biz:info:edit')")
-    @Log(title = "文件基本信息表", businessType = BusinessType.UPDATE)
+    @Log(title = "文件基本信息表" , businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody DocInfo docInfo) {
         docInfo.setUpdateBy(SecurityUtils.getUsername());
@@ -144,7 +191,7 @@ public class DocInfoController extends BaseController {
      */
     @ApiOperation("删除文件基本信息表")
     //@PreAuthorize("@ss.hasPermi('biz:info:remove')")
-    @Log(title = "文件基本信息表", businessType = BusinessType.DELETE)
+    @Log(title = "文件基本信息表" , businessType = BusinessType.DELETE)
     @DeleteMapping("/{docIds}")
     public AjaxResult remove(@PathVariable Long[] docIds) {
         for (Long docId : docIds) {

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

@@ -4,7 +4,7 @@ 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.constant.CacheConstants;
 import com.doc.common.core.controller.BaseController;
 import com.doc.common.core.domain.AjaxResult;
 import com.doc.common.core.page.TableDataInfo;
@@ -47,9 +47,9 @@ public class DocMsgController extends BaseController {
     @ApiOperation("发送消息")
     @PostMapping("/send")
     public AjaxResult send(@RequestBody DocMsg msg) {
-        msg.setFrom(SecurityUtils.getUserId());
+        msg.setFromUid(SecurityUtils.getUserId());
         msg.setCreateTime(new Date());
-        stringRedisTemplate.convertAndSend(Constants.CHANNEL, JSON.toJSONString(msg));
+        stringRedisTemplate.convertAndSend(CacheConstants.CHANNEL, JSON.toJSONString(msg));
         docMsgService.insertDocMsg(msg);
         return success();
     }
@@ -85,7 +85,7 @@ public class DocMsgController extends BaseController {
      */
     @ApiOperation("导出消息管理列表")
     //@PreAuthorize("@ss.hasPermi('biz:msg:export')")
-    @Log(title = "消息管理", businessType = BusinessType.EXPORT)
+    @Log(title = "消息管理" , businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, DocMsg docMsg) {
         List<DocMsg> list = docMsgService.selectDocMsgList(docMsg);
@@ -108,7 +108,7 @@ public class DocMsgController extends BaseController {
      */
     @ApiOperation("新增消息管理")
     //@PreAuthorize("@ss.hasPermi('biz:msg:add')")
-    @Log(title = "消息管理", businessType = BusinessType.INSERT)
+    @Log(title = "消息管理" , businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody DocMsg docMsg) {
         return toAjax(docMsgService.insertDocMsg(docMsg));
@@ -119,7 +119,7 @@ public class DocMsgController extends BaseController {
      */
     @ApiOperation("修改消息管理")
     //@PreAuthorize("@ss.hasPermi('biz:msg:edit')")
-    @Log(title = "消息管理", businessType = BusinessType.UPDATE)
+    @Log(title = "消息管理" , businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody DocMsg docMsg) {
         return toAjax(docMsgService.updateDocMsg(docMsg));
@@ -130,7 +130,7 @@ public class DocMsgController extends BaseController {
      */
     @ApiOperation("删除消息管理")
     //@PreAuthorize("@ss.hasPermi('biz:msg:remove')")
-    @Log(title = "消息管理", businessType = BusinessType.DELETE)
+    @Log(title = "消息管理" , businessType = BusinessType.DELETE)
     @DeleteMapping("/{msgIds}")
     public AjaxResult remove(@PathVariable Long[] msgIds) {
         return toAjax(docMsgService.deleteDocMsgByMsgIds(msgIds));

+ 1 - 22
doc-biz/src/main/java/com/doc/biz/controller/FileUploadController.java

@@ -8,7 +8,6 @@ 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;
@@ -49,7 +48,7 @@ public class FileUploadController extends BaseController {
     @PostMapping("/send")
     public AjaxResult send(@RequestBody DocMsg msg) {
         try {
-            msg.setFrom(SecurityUtils.getUserId());
+            msg.setFromUid(SecurityUtils.getUserId());
             stringRedisTemplate.convertAndSend("ws-chat", JSON.toJSONString(msg));
             return success();
         } catch (Exception e) {
@@ -89,26 +88,6 @@ public class FileUploadController extends BaseController {
         }
     }
 
-    /**
-     * 文件下载
-     *
-     * @param fileId
-     * @return
-     */
-    @GetMapping("/download/{fileId}")
-    public ResponseEntity<Object> fileDownload(@PathVariable(name = "fileId") String fileId) {
-        DocumentVO mongoFileVo = mongoService.downloadFile(fileId);
-
-        if (Objects.nonNull(mongoFileVo)) {
-            return ResponseEntity.ok()
-                    .header(HttpHeaders.CONTENT_DISPOSITION, "filename=\"" + UriEncoder.encode(mongoFileVo.getFileName()) + "\"")
-                    .header(HttpHeaders.CONTENT_TYPE, mongoFileVo.getContentType())
-                    .header(HttpHeaders.CONTENT_LENGTH, mongoFileVo.getFileSize() + "").header("Connection", "close")
-                    .body(mongoFileVo.getData());
-        } else {
-            return ResponseEntity.status(HttpStatus.NOT_FOUND).body("file does not exist");
-        }
-    }
 
     /**
      * 文件删除

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

@@ -27,12 +27,12 @@ public class DocMsg extends BaseEntity
     /** 发送方用户ID */
     @ApiModelProperty("发送方用户ID")
     @Excel(name = "发送方用户ID")
-    private Long from;
+    private Long fromUid;
 
     /** 接受方用户ID */
     @ApiModelProperty("接受方用户ID")
     @Excel(name = "接受方用户ID")
-    private Long to;
+    private Long toUid;
 
     /** 消息内容 */
     @ApiModelProperty("消息内容")
@@ -48,23 +48,23 @@ public class DocMsg extends BaseEntity
     {
         return msgId;
     }
-    public void setFrom(Long from)
+    public void setFromUid(Long fromUid)
     {
-        this.from = from;
+        this.fromUid = fromUid;
     }
 
-    public Long getFrom()
+    public Long getFromUid()
     {
-        return from;
+        return fromUid;
     }
-    public void setTo(Long to)
+    public void setToUid(Long toUid)
     {
-        this.to = to;
+        this.toUid = toUid;
     }
 
-    public Long getTo()
+    public Long getToUid()
     {
-        return to;
+        return toUid;
     }
     public void setContent(String content)
     {
@@ -80,8 +80,8 @@ public class DocMsg extends BaseEntity
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
             .append("msgId", getMsgId())
-            .append("from", getFrom())
-            .append("to", getTo())
+            .append("from", getFromUid())
+            .append("to", getToUid())
             .append("content", getContent())
             .append("createTime", getCreateTime())
             .toString();

+ 4 - 3
doc-biz/src/main/java/com/doc/biz/ws/ChatMessageListener.java

@@ -1,6 +1,7 @@
 package com.doc.biz.ws;
 
 import com.doc.biz.domain.DocMsg;
+import com.doc.chat.domain.ChatMsg;
 import com.doc.common.utils.StringUtils;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -38,12 +39,12 @@ public class ChatMessageListener implements MessageListener {
         String value = valueSerializer.deserialize(message.getBody());
 
         if (StringUtils.isNotBlank(value)) {
-            log.info("监听集群websocket消息--- {}", value);
+            log.info("监听集群websocket消息--- {}" , value);
             //集群模式 推送消息
             ObjectMapper mapper = new ObjectMapper();
-            DocMsg msg;
+            ChatMsg msg;
             try {
-                msg = mapper.readValue(value, DocMsg.class);
+                msg = mapper.readValue(value, ChatMsg.class);
             } catch (JsonProcessingException e) {
                 throw new RuntimeException(e);
             }

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

@@ -1,6 +1,6 @@
 package com.doc.biz.ws;
 
-import com.doc.common.constant.Constants;
+import com.doc.common.constant.CacheConstants;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.redis.connection.RedisConnectionFactory;
@@ -38,7 +38,7 @@ public class RedisSubscriberConfig {
     public RedisMessageListenerContainer getRedisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory, MessageListenerAdapter messageListenerAdapter) {
         RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
         redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
-        redisMessageListenerContainer.addMessageListener(messageListenerAdapter, new PatternTopic(Constants.CHANNEL));
+        redisMessageListenerContainer.addMessageListener(messageListenerAdapter, new PatternTopic(CacheConstants.CHANNEL));
         return redisMessageListenerContainer;
     }
 }

+ 13 - 15
doc-biz/src/main/java/com/doc/biz/ws/WebSocketServer.java

@@ -1,10 +1,10 @@
 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.chat.domain.ChatMsg;
+import com.doc.chat.service.IChatMsgService;
+import com.doc.chat.service.impl.ChatMsgServiceImpl;
+import com.doc.common.constant.CacheConstants;
 import com.doc.common.utils.spring.SpringUtils;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.extern.slf4j.Slf4j;
@@ -19,7 +19,6 @@ 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;
 
 /**
@@ -31,7 +30,7 @@ import java.util.concurrent.ConcurrentHashMap;
 @Component
 @Slf4j
 public class WebSocketServer {
-    private DocMsgMapper msgMapper = SpringUtils.getBean(DocMsgMapper.class);
+    private IChatMsgService msgService = SpringUtils.getBean(ChatMsgServiceImpl.class);
     private RedisTemplate redisTemplate = SpringUtils.getBean(StringRedisTemplate.class);
     /**
      * 保存 组id->组成员 的映射关系
@@ -47,7 +46,7 @@ public class WebSocketServer {
         //需要通知其他的客户端,将所有的用户的用户名发送给客户端
         //将当前连接的session存储到redis中
         currentMap.put(uid, session);
-        log.info("用户(ID:{})建立连接!", uid);
+        log.info("用户(ID:{})建立连接!" , uid);
         try {
             session.getBasicRemote().sendText("连接成功");
         } catch (IOException e) {
@@ -61,7 +60,7 @@ public class WebSocketServer {
      * @param msg
      */
     private void sendClusterMessage(String msg) {
-        redisTemplate.convertAndSend(Constants.CHANNEL, msg);
+        redisTemplate.convertAndSend(CacheConstants.CHANNEL, msg);
     }
 
     /**
@@ -72,11 +71,10 @@ public class WebSocketServer {
         try {
             //获取客户端发送来的数据  {"toId":2,"message":"你好"}
             ObjectMapper mapper = new ObjectMapper();
-            DocMsg msg = mapper.readValue(message, DocMsg.class);
-            msg.setFrom(uid);
-            msg.setCreateTime(new Date());
+            ChatMsg msg = mapper.readValue(message, ChatMsg.class);
+            msg.setFromId(uid);
             // 保存到数据库
-            msgMapper.insertDocMsg(msg);
+            msgService.insertChatMsg(msg);
             //发布集群消息
             this.sendClusterMessage(message);
         } catch (Exception e) {
@@ -89,7 +87,7 @@ public class WebSocketServer {
      */
     @OnClose
     public void onClose(@PathParam("uid") Long uid, Session session) {
-        log.info("用户(ID:{})关闭连接!", uid);
+        log.info("用户(ID:{})关闭连接!" , uid);
         currentMap.remove(uid);
     }
 
@@ -99,11 +97,11 @@ public class WebSocketServer {
      * @param msg
      * @return
      */
-    public void sendClusterWebsocketMessage(DocMsg msg) {
+    public void sendClusterWebsocketMessage(ChatMsg msg) {
         if (msg != null) {
             //获取对方用户的连接会话
             try {
-                Session session = currentMap.get(msg.getTo());
+                Session session = currentMap.get(msg.getToId());
                 if (session != null) {
                     session.getBasicRemote().sendText(JSON.toJSONString(msg));
                 }

+ 156 - 0
doc-biz/src/main/java/com/doc/chat/controller/ChatMsgController.java

@@ -0,0 +1,156 @@
+package com.doc.chat.controller;
+
+import java.util.Date;
+import java.util.List;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.fastjson2.JSON;
+import com.doc.biz.domain.DocMsg;
+import com.doc.common.constant.CacheConstants;
+import com.doc.common.constant.Constants;
+import com.doc.common.utils.SecurityUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.doc.common.annotation.Log;
+import com.doc.common.core.controller.BaseController;
+import com.doc.common.core.domain.AjaxResult;
+import com.doc.common.enums.BusinessType;
+import com.doc.chat.domain.ChatMsg;
+import com.doc.chat.service.IChatMsgService;
+import com.doc.common.utils.poi.ExcelUtil;
+import com.doc.common.core.page.TableDataInfo;
+
+/**
+ * 聊天消息管理Controller
+ *
+ * @author wukai
+ * @date 2023-08-24
+ */
+@Api(tags = "聊天消息管理")
+@RestController
+@RequestMapping("/chat/msg")
+public class ChatMsgController extends BaseController {
+    @Resource
+    private IChatMsgService chatMsgService;
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+
+    /**
+     * 发送消息
+     *
+     * @param msg
+     * @return
+     */
+    @ApiOperation("发送消息")
+    @PostMapping("/send")
+    public AjaxResult send(@RequestBody ChatMsg msg) {
+        msg.setFromId(SecurityUtils.getUserId());
+        msg.setCreateTime(new Date());
+        stringRedisTemplate.convertAndSend(CacheConstants.CHANNEL, JSON.toJSONString(msg));
+        chatMsgService.insertChatMsg(msg);
+        return success();
+    }
+
+    /**
+     * 消息记录
+     *
+     * @param toId 用户ID
+     * @return
+     */
+    @ApiOperation("消息记录")
+    @GetMapping("/record/{toId}")
+    public TableDataInfo record(@PathVariable Long toId) {
+        startPage();
+        List<ChatMsg> list = chatMsgService.selectRecordList(SecurityUtils.getUserId(), toId);
+        return getDataTable(list);
+    }
+
+    /**
+     * 好友列表功能
+     */
+    @ApiOperation("好友列表")
+    @GetMapping("/friend")
+    public TableDataInfo friend() {
+        List<ChatMsg> list = chatMsgService.selectFriendList(SecurityUtils.getUserId());
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询聊天消息管理列表
+     */
+    @ApiOperation("查询聊天消息管理列表")
+    @PreAuthorize("@ss.hasPermi('chat:msg:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ChatMsg chatMsg) {
+        startPage();
+        List<ChatMsg> list = chatMsgService.selectChatMsgList(chatMsg);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出聊天消息管理列表
+     */
+    @ApiOperation("导出聊天消息管理列表")
+    @PreAuthorize("@ss.hasPermi('chat:msg:export')")
+    @Log(title = "聊天消息管理" , businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ChatMsg chatMsg) {
+        List<ChatMsg> list = chatMsgService.selectChatMsgList(chatMsg);
+        ExcelUtil<ChatMsg> util = new ExcelUtil<ChatMsg>(ChatMsg.class);
+        util.exportExcel(response, list, "聊天消息管理数据");
+    }
+
+    /**
+     * 获取聊天消息管理详细信息
+     */
+    @ApiOperation("获取聊天消息管理详细信息")
+    @PreAuthorize("@ss.hasPermi('chat:msg:query')")
+    @GetMapping(value = "/{msgId}")
+    public AjaxResult getInfo(@PathVariable("msgId") Long msgId) {
+        return success(chatMsgService.selectChatMsgByMsgId(msgId));
+    }
+
+    /**
+     * 新增聊天消息管理
+     */
+    @ApiOperation("新增聊天消息管理")
+    @PreAuthorize("@ss.hasPermi('chat:msg:add')")
+    @Log(title = "聊天消息管理" , businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ChatMsg chatMsg) {
+        return toAjax(chatMsgService.insertChatMsg(chatMsg));
+    }
+
+    /**
+     * 修改聊天消息管理
+     */
+    @ApiOperation("修改聊天消息管理")
+    @PreAuthorize("@ss.hasPermi('chat:msg:edit')")
+    @Log(title = "聊天消息管理" , businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody ChatMsg chatMsg) {
+        return toAjax(chatMsgService.updateChatMsg(chatMsg));
+    }
+
+    /**
+     * 删除聊天消息管理
+     */
+    @ApiOperation("删除聊天消息管理")
+    @PreAuthorize("@ss.hasPermi('chat:msg:remove')")
+    @Log(title = "聊天消息管理" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{msgIds}")
+    public AjaxResult remove(@PathVariable Long[] msgIds) {
+        return toAjax(chatMsgService.deleteChatMsgByMsgIds(msgIds));
+    }
+}

+ 199 - 0
doc-biz/src/main/java/com/doc/chat/domain/ChatMsg.java

@@ -0,0 +1,199 @@
+package com.doc.chat.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.doc.biz.domain.DocInfo;
+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;
+
+import java.util.List;
+
+/**
+ * 聊天消息管理对象 chat_msg
+ *
+ * @author wukai
+ * @date 2023-08-25
+ */
+@ApiModel(value = "ChatMsg" , description = "聊天消息管理")
+public class ChatMsg extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 消息ID
+     */
+    @ApiModelProperty("消息ID")
+    @TableId
+    private Long msgId;
+
+    /**
+     * 发送方用户ID
+     */
+    @ApiModelProperty("发送方用户ID")
+    @Excel(name = "发送方用户ID")
+    private Long fromId;
+    /**
+     * 发送方用户姓名
+     */
+    @ApiModelProperty("发送方用户姓名")
+    @Excel(name = "发送方用户姓名")
+    @TableField(exist = false)
+    private String fromName;
+    /**
+     * 发送方用户头像
+     */
+    @ApiModelProperty("发送方用户头像")
+    @TableField(exist = false)
+    private String fromAvatar;
+    /**
+     * 接受方用户ID
+     */
+    @ApiModelProperty("接收方用户ID")
+    @Excel(name = "接收方用户ID")
+    private Long toId;
+    /**
+     * 接收方用户姓名
+     */
+    @ApiModelProperty("接收方用户姓名")
+    @TableField(exist = false)
+    private String toName;
+    /**
+     * 接收方用户头像
+     */
+    @ApiModelProperty("接收方用户头像")
+    @TableField(exist = false)
+    private String toAvatar;
+
+    /**
+     * 消息类型; 1.文件 2.聊天
+     */
+    @ApiModelProperty("消息类型; 1.文件 2.聊天")
+    @Excel(name = "消息类型; 1.文件 2.聊天")
+    private String msgType;
+
+    /**
+     * 消息内容
+     */
+    @ApiModelProperty("消息内容")
+    @Excel(name = "消息内容")
+    private String content;
+
+    /**
+     * ID索引
+     */
+    @ApiModelProperty("ID索引")
+    @Excel(name = "ID索引")
+    private String idIndex;
+
+    /**
+     * 文件列表
+     */
+    @ApiModelProperty("文件列表")
+    @TableField(exist = false)
+    private List<DocInfo> fileList;
+
+
+    public String getFromAvatar() {
+        return fromAvatar;
+    }
+
+    public void setFromAvatar(String fromAvatar) {
+        this.fromAvatar = fromAvatar;
+    }
+
+    public String getToAvatar() {
+        return toAvatar;
+    }
+
+    public void setToAvatar(String toAvatar) {
+        this.toAvatar = toAvatar;
+    }
+
+    public String getFromName() {
+        return fromName;
+    }
+
+    public void setFromName(String fromName) {
+        this.fromName = fromName;
+    }
+
+    public String getToName() {
+        return toName;
+    }
+
+    public void setToName(String toName) {
+        this.toName = toName;
+    }
+
+    public List<DocInfo> getFileList() {
+        return fileList;
+    }
+
+    public void setFileList(List<DocInfo> fileList) {
+        this.fileList = fileList;
+    }
+
+    public void setMsgId(Long msgId) {
+        this.msgId = msgId;
+    }
+
+    public Long getMsgId() {
+        return msgId;
+    }
+
+    public void setFromId(Long fromId) {
+        this.fromId = fromId;
+    }
+
+    public Long getFromId() {
+        return fromId;
+    }
+
+    public void setToId(Long toId) {
+        this.toId = toId;
+    }
+
+    public Long getToId() {
+        return toId;
+    }
+
+    public void setMsgType(String msgType) {
+        this.msgType = msgType;
+    }
+
+    public String getMsgType() {
+        return msgType;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setIdIndex(String idIndex) {
+        this.idIndex = idIndex;
+    }
+
+    public String getIdIndex() {
+        return idIndex;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("msgId" , getMsgId())
+                .append("fromId" , getFromId())
+                .append("toId" , getToId())
+                .append("msgType" , getMsgType())
+                .append("content" , getContent())
+                .append("idIndex" , getIdIndex())
+                .append("createTime" , getCreateTime())
+                .toString();
+    }
+}

+ 77 - 0
doc-biz/src/main/java/com/doc/chat/mapper/ChatMsgMapper.java

@@ -0,0 +1,77 @@
+package com.doc.chat.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doc.chat.domain.ChatMsg;
+
+/**
+ * 聊天消息管理;Mapper接口
+ *
+ * @author wukai
+ * @date 2023-08-24
+ */
+public interface ChatMsgMapper extends BaseMapper<ChatMsg> {
+    /**
+     * 查询聊天消息管理;
+     *
+     * @param msgId 聊天消息管理;主键
+     * @return 聊天消息管理;
+     */
+    public ChatMsg selectChatMsgByMsgId(Long msgId);
+
+    /**
+     * 查询聊天消息管理;列表
+     *
+     * @param chatMsg 聊天消息管理;
+     * @return 聊天消息管理;集合
+     */
+    public List<ChatMsg> selectChatMsgList(ChatMsg chatMsg);
+
+    /**
+     * 新增聊天消息管理;
+     *
+     * @param chatMsg 聊天消息管理;
+     * @return 结果
+     */
+    public int insertChatMsg(ChatMsg chatMsg);
+
+    /**
+     * 修改聊天消息管理;
+     *
+     * @param chatMsg 聊天消息管理;
+     * @return 结果
+     */
+    public int updateChatMsg(ChatMsg chatMsg);
+
+    /**
+     * 删除聊天消息管理;
+     *
+     * @param msgId 聊天消息管理;主键
+     * @return 结果
+     */
+    public int deleteChatMsgByMsgId(Long msgId);
+
+    /**
+     * 批量删除聊天消息管理;
+     *
+     * @param msgIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteChatMsgByMsgIds(Long[] msgIds);
+
+    /**
+     * 获取聊天记录
+     *
+     * @param idIndex ID索引
+     * @return 聊天记录列表
+     */
+    List<ChatMsg> selectRecordList(String idIndex);
+    /**
+     * 查询好友列表
+     *
+     * @param userId 当前用户ID
+     * @return
+     */
+    List<ChatMsg> selectFriendList(Long userId);
+}

+ 78 - 0
doc-biz/src/main/java/com/doc/chat/service/IChatMsgService.java

@@ -0,0 +1,78 @@
+package com.doc.chat.service;
+
+import java.util.List;
+
+import com.doc.chat.domain.ChatMsg;
+
+/**
+ * 聊天消息管理;Service接口
+ *
+ * @author wukai
+ * @date 2023-08-24
+ */
+public interface IChatMsgService {
+    /**
+     * 查询聊天消息管理;
+     *
+     * @param msgId 聊天消息管理;主键
+     * @return 聊天消息管理;
+     */
+    public ChatMsg selectChatMsgByMsgId(Long msgId);
+
+    /**
+     * 查询聊天消息管理;列表
+     *
+     * @param chatMsg 聊天消息管理;
+     * @return 聊天消息管理;集合
+     */
+    public List<ChatMsg> selectChatMsgList(ChatMsg chatMsg);
+
+    /**
+     * 新增聊天消息管理;
+     *
+     * @param chatMsg 聊天消息管理;
+     * @return 结果
+     */
+    public int insertChatMsg(ChatMsg chatMsg);
+
+    /**
+     * 修改聊天消息管理;
+     *
+     * @param chatMsg 聊天消息管理;
+     * @return 结果
+     */
+    public int updateChatMsg(ChatMsg chatMsg);
+
+    /**
+     * 批量删除聊天消息管理;
+     *
+     * @param msgIds 需要删除的聊天消息管理;主键集合
+     * @return 结果
+     */
+    public int deleteChatMsgByMsgIds(Long[] msgIds);
+
+    /**
+     * 删除聊天消息管理;信息
+     *
+     * @param msgId 聊天消息管理;主键
+     * @return 结果
+     */
+    public int deleteChatMsgByMsgId(Long msgId);
+
+    /**
+     * 获取聊天记录
+     *
+     * @param fromId 当前用户ID
+     * @param toId   接收用户ID
+     * @return 聊天记录列表
+     */
+    List<ChatMsg> selectRecordList(Long fromId, Long toId);
+
+    /**
+     * 查询好友列表
+     *
+     * @param userId 当前用户ID
+     * @return
+     */
+    List<ChatMsg> selectFriendList(Long userId);
+}

+ 151 - 0
doc-biz/src/main/java/com/doc/chat/service/impl/ChatMsgServiceImpl.java

@@ -0,0 +1,151 @@
+package com.doc.chat.service.impl;
+
+import java.util.List;
+import java.util.Map;
+
+import com.doc.common.core.domain.entity.SysUser;
+import com.doc.common.utils.DateUtils;
+import com.doc.system.service.ISysUserService;
+import org.springframework.stereotype.Service;
+import com.doc.chat.mapper.ChatMsgMapper;
+import com.doc.chat.domain.ChatMsg;
+import com.doc.chat.service.IChatMsgService;
+
+import javax.annotation.Resource;
+
+/**
+ * 聊天消息管理Service业务层处理
+ *
+ * @author wukai
+ * @date 2023-08-24
+ */
+@Service
+public class ChatMsgServiceImpl implements IChatMsgService {
+    @Resource
+    private ChatMsgMapper chatMsgMapper;
+    @Resource
+    private ISysUserService userService;
+
+    /**
+     * 查询聊天消息管理
+     *
+     * @param msgId 聊天消息管理主键
+     * @return 聊天消息管理
+     */
+    @Override
+    public ChatMsg selectChatMsgByMsgId(Long msgId) {
+        return chatMsgMapper.selectChatMsgByMsgId(msgId);
+    }
+
+    /**
+     * 查询聊天消息管理列表
+     *
+     * @param chatMsg 聊天消息管理
+     * @return 聊天消息管理
+     */
+    @Override
+    public List<ChatMsg> selectChatMsgList(ChatMsg chatMsg) {
+        return chatMsgMapper.selectChatMsgList(chatMsg);
+    }
+
+    /**
+     * 新增聊天消息管理
+     *
+     * @param chatMsg 聊天消息管理
+     * @return 结果
+     */
+    @Override
+    public int insertChatMsg(ChatMsg chatMsg) {
+        String idIndex = getIdIndex(chatMsg.getFromId(), chatMsg.getToId());
+        chatMsg.setIdIndex(idIndex);
+        chatMsg.setCreateTime(DateUtils.getNowDate());
+        return chatMsgMapper.insertChatMsg(chatMsg);
+    }
+
+    private String getIdIndex(Long fromId, Long toId) {
+        String idIndex = fromId + "" + toId;
+        if (fromId > toId) {
+            idIndex = toId + "" + fromId;
+        }
+        return idIndex;
+    }
+
+    /**
+     * 修改聊天消息管理
+     *
+     * @param chatMsg 聊天消息管理
+     * @return 结果
+     */
+    @Override
+    public int updateChatMsg(ChatMsg chatMsg) {
+        return chatMsgMapper.updateChatMsg(chatMsg);
+    }
+
+    /**
+     * 批量删除聊天消息管理
+     *
+     * @param msgIds 需要删除的聊天消息管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteChatMsgByMsgIds(Long[] msgIds) {
+        return chatMsgMapper.deleteChatMsgByMsgIds(msgIds);
+    }
+
+    /**
+     * 删除聊天消息管理信息
+     *
+     * @param msgId 聊天消息管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteChatMsgByMsgId(Long msgId) {
+        return chatMsgMapper.deleteChatMsgByMsgId(msgId);
+    }
+
+    /**
+     * 获取聊天记录
+     *
+     * @param fromId 当前用户ID
+     * @param toId   接收用户ID
+     * @return 聊天记录列表
+     */
+    @Override
+    public List<ChatMsg> selectRecordList(Long fromId, Long toId) {
+        List<ChatMsg> msgList = chatMsgMapper.selectRecordList(getIdIndex(fromId, toId));
+        setUserInfo(msgList);
+        return msgList;
+    }
+
+    /**
+     * 查询好友列表
+     *
+     * @param userId 当前用户ID
+     * @return 好友列表
+     */
+    @Override
+    public List<ChatMsg> selectFriendList(Long userId) {
+        List<ChatMsg> msgList = chatMsgMapper.selectFriendList(userId);
+        setUserInfo(msgList);
+        return msgList;
+    }
+
+    /**
+     * 设置用户信息
+     *
+     * @param msgList 消息列表
+     */
+    private void setUserInfo(List<ChatMsg> msgList) {
+        Map<Long, SysUser> userMap = userService.selectAllUser();
+        for (ChatMsg msg : msgList) {
+            SysUser fromUser = userMap.get(msg.getFromId());
+            SysUser toUser = userMap.get(msg.getToId());
+            msg.setFromName(fromUser.getNickName());
+            msg.setFromAvatar(fromUser.getAvatar());
+
+            msg.setToName(toUser.getNickName());
+            msg.setToAvatar(toUser.getAvatar());
+        }
+    }
+
+}

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

@@ -6,22 +6,22 @@
 
     <resultMap type="DocMsg" id="DocMsgResult">
         <result property="msgId" column="MSG_ID"/>
-        <result property="from" column="FROM"/>
-        <result property="to" column="TO"/>
+        <result property="fromUid" column="FROM_UID"/>
+        <result property="toUid" column="TO_UID"/>
         <result property="content" column="CONTENT"/>
         <result property="createTime" column="CREATE_TIME"/>
     </resultMap>
 
     <sql id="selectDocMsgVo">
-        select MSG_ID, `FROM`, `TO`, CONTENT, CREATE_TIME
+        select MSG_ID, FROM_UID, TO_UID, CONTENT, CREATE_TIME
         from doc_msg
     </sql>
 
     <select id="selectDocMsgList" parameterType="DocMsg" resultMap="DocMsgResult">
         <include refid="selectDocMsgVo"/>
         <where>
-            <if test="from != null ">and FROM = #{from}</if>
-            <if test="to != null ">and TO = #{to}</if>
+            <if test="fromUid != null ">and FROM = #{fromUid}</if>
+            <if test="toUid != null ">and TO = #{toUid}</if>
             <if test="content != null  and content != ''">and CONTENT = #{content}</if>
             <if test="createTime != null ">and CREATE_TIME = #{createTime}</if>
         </where>
@@ -33,22 +33,22 @@
     </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})
+        where (FROM_UID = #{from} and TO_UID = #{to})
+        or (FROM_UID = #{to} and TO_UID = #{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="from != null">`FROM`,</if>
-            <if test="to != null">`TO`,</if>
+            <if test="fromUid != null">FROM_UID,</if>
+            <if test="toUid != null">TO_UID,</if>
             <if test="content != null">CONTENT,</if>
             <if test="createTime != null">CREATE_TIME,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
-            <if test="from != null">#{from},</if>
-            <if test="to != null">#{to},</if>
+            <if test="fromUid != null">#{fromUid},</if>
+            <if test="toUid != null">#{toUid},</if>
             <if test="content != null">#{content},</if>
             <if test="createTime != null">#{createTime},</if>
         </trim>
@@ -57,8 +57,8 @@
     <update id="updateDocMsg" parameterType="DocMsg">
         update doc_msg
         <trim prefix="SET" suffixOverrides=",">
-            <if test="from != null">`FROM` = #{from},</if>
-            <if test="to != null">`TO` = #{to},</if>
+            <if test="fromUid != null">FROM_UID = #{fromUid},</if>
+            <if test="toUid != null">TO_UID = #{toUid},</if>
             <if test="content != null">CONTENT = #{content},</if>
             <if test="createTime != null">CREATE_TIME = #{createTime},</if>
         </trim>

+ 98 - 0
doc-biz/src/main/resources/mapper/chat/ChatMsgMapper.xml

@@ -0,0 +1,98 @@
+<?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.doc.chat.mapper.ChatMsgMapper">
+
+    <resultMap type="ChatMsg" id="ChatMsgResult">
+        <result property="msgId" column="MSG_ID"/>
+        <result property="fromId" column="FROM_ID"/>
+        <result property="toId" column="TO_ID"/>
+        <result property="msgType" column="MSG_TYPE"/>
+        <result property="content" column="CONTENT"/>
+        <result property="idIndex" column="ID_INDEX"/>
+        <result property="createTime" column="CREATE_TIME"/>
+    </resultMap>
+
+    <sql id="selectChatMsgVo">
+        select MSG_ID, FROM_ID, TO_ID, MSG_TYPE, CONTENT, ID_INDEX, CREATE_TIME
+        from chat_msg
+    </sql>
+
+    <select id="selectChatMsgList" parameterType="ChatMsg" resultMap="ChatMsgResult">
+        <include refid="selectChatMsgVo"/>
+        <where>
+            <if test="fromId != null ">and FROM_ID = #{fromId}</if>
+            <if test="toId != null ">and TO_ID = #{toId}</if>
+            <if test="msgType != null  and msgType != ''">and MSG_TYPE = #{msgType}</if>
+            <if test="content != null  and content != ''">and CONTENT = #{content}</if>
+            <if test="idIndex != null  and idIndex != ''">and ID_INDEX = #{idIndex}</if>
+            <if test="createTime != null ">and CREATE_TIME = #{createTime}</if>
+        </where>
+    </select>
+
+    <select id="selectChatMsgByMsgId" parameterType="Long" resultMap="ChatMsgResult">
+        <include refid="selectChatMsgVo"/>
+        where MSG_ID = #{msgId}
+    </select>
+
+    <select id="selectRecordList" resultType="com.doc.chat.domain.ChatMsg" parameterType="String">
+        <include refid="selectChatMsgVo"/>
+        where ID_INDEX = #{idIndex}
+        order by CREATE_TIME desc
+    </select>
+    <select id="selectFriendList" resultType="com.doc.chat.domain.ChatMsg">
+        <include refid="selectChatMsgVo"/>
+        where msg_id in (SELECT MAX(msg_id) msg_id
+        FROM chat_msg
+        WHERE from_id = #{user_id} OR to_id = #{user_id}
+        GROUP BY id_index)
+        ORDER BY create_time desc
+    </select>
+
+    <insert id="insertChatMsg" parameterType="ChatMsg" useGeneratedKeys="true" keyProperty="msgId">
+        insert into chat_msg
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="fromId != null">FROM_ID,</if>
+            <if test="toId != null">TO_ID,</if>
+            <if test="msgType != null">MSG_TYPE,</if>
+            <if test="content != null">CONTENT,</if>
+            <if test="idIndex != null">ID_INDEX,</if>
+            <if test="createTime != null">CREATE_TIME,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="fromId != null">#{fromId},</if>
+            <if test="toId != null">#{toId},</if>
+            <if test="msgType != null">#{msgType},</if>
+            <if test="content != null">#{content},</if>
+            <if test="idIndex != null">#{idIndex},</if>
+            <if test="createTime != null">#{createTime},</if>
+        </trim>
+    </insert>
+
+    <update id="updateChatMsg" parameterType="ChatMsg">
+        update chat_msg
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="fromId != null">FROM_ID = #{fromId},</if>
+            <if test="toId != null">TO_ID = #{toId},</if>
+            <if test="msgType != null">MSG_TYPE = #{msgType},</if>
+            <if test="content != null">CONTENT = #{content},</if>
+            <if test="idIndex != null">ID_INDEX = #{idIndex},</if>
+            <if test="createTime != null">CREATE_TIME = #{createTime},</if>
+        </trim>
+        where MSG_ID = #{msgId}
+    </update>
+
+    <delete id="deleteChatMsgByMsgId" parameterType="Long">
+        delete
+        from chat_msg
+        where MSG_ID = #{msgId}
+    </delete>
+
+    <delete id="deleteChatMsgByMsgIds" parameterType="String">
+        delete from chat_msg where MSG_ID in
+        <foreach item="msgId" collection="array" open="(" separator="," close=")">
+            #{msgId}
+        </foreach>
+    </delete>
+</mapper>

+ 9 - 0
doc-common/src/main/java/com/doc/common/constant/CacheConstants.java

@@ -41,4 +41,13 @@ public class CacheConstants
      * 登录账户密码错误次数 redis key
      */
     public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
+    /**
+     * 聊天消息订阅/发布通道
+     */
+    public static final String CHANNEL = "ws:chat";
+    /**
+     * 用户缓存
+     */
+    public static final String USER_CACHE = "user:cache";
+
 }

+ 2 - 6
doc-common/src/main/java/com/doc/common/constant/Constants.java

@@ -136,15 +136,11 @@ public class Constants {
     /**
      * 定时任务违规的字符
      */
-    public static final String[] JOB_ERROR_STR = {"java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
-            "org.springframework", "org.apache", "com.doc.common.utils.file", "com.doc.common.config"};
+    public static final String[] JOB_ERROR_STR = {"java.net.URL" , "javax.naming.InitialContext" , "org.yaml.snakeyaml" ,
+            "org.springframework" , "org.apache" , "com.doc.common.utils.file" , "com.doc.common.config"};
     /**
      * Mongo文件存储方式大小切换
      * 大于该值使用gridFS存储,小于等于该值的直接二进制存储
      */
     public static final long MONGO_FILE_SIZE = 16 * 16 * 1024;
-    /**
-     * 聊天消息订阅/发布通道
-     */
-    public static final String CHANNEL = "ws-chat";
 }

+ 37 - 29
doc-system/src/main/java/com/doc/system/service/ISysUserService.java

@@ -1,26 +1,34 @@
 package com.doc.system.service;
 
 import java.util.List;
+import java.util.Map;
+
 import com.doc.common.core.domain.entity.SysUser;
 
 /**
  * 用户 业务层
- * 
+ *
  * @author ruoyi
  */
-public interface ISysUserService
-{
+public interface ISysUserService {
     /**
      * 根据条件分页查询用户列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
     public List<SysUser> selectUserList(SysUser user);
 
     /**
+     * 查询所有用户列表
+     *
+     * @return 所有用户信息
+     */
+    Map<Long, SysUser> selectAllUser();
+
+    /**
      * 根据条件分页查询已分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -28,7 +36,7 @@ public interface ISysUserService
 
     /**
      * 根据条件分页查询未分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -36,7 +44,7 @@ public interface ISysUserService
 
     /**
      * 通过用户名查询用户
-     * 
+     *
      * @param userName 用户名
      * @return 用户对象信息
      */
@@ -44,7 +52,7 @@ public interface ISysUserService
 
     /**
      * 通过用户ID查询用户
-     * 
+     *
      * @param userId 用户ID
      * @return 用户对象信息
      */
@@ -52,7 +60,7 @@ public interface ISysUserService
 
     /**
      * 根据用户ID查询用户所属角色组
-     * 
+     *
      * @param userName 用户名
      * @return 结果
      */
@@ -60,7 +68,7 @@ public interface ISysUserService
 
     /**
      * 根据用户ID查询用户所属岗位组
-     * 
+     *
      * @param userName 用户名
      * @return 结果
      */
@@ -68,7 +76,7 @@ public interface ISysUserService
 
     /**
      * 校验用户名称是否唯一
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -92,21 +100,21 @@ public interface ISysUserService
 
     /**
      * 校验用户是否允许操作
-     * 
+     *
      * @param user 用户信息
      */
     public void checkUserAllowed(SysUser user);
 
     /**
      * 校验用户是否有数据权限
-     * 
+     *
      * @param userId 用户id
      */
     public void checkUserDataScope(Long userId);
 
     /**
      * 新增用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -114,7 +122,7 @@ public interface ISysUserService
 
     /**
      * 注册用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -122,7 +130,7 @@ public interface ISysUserService
 
     /**
      * 修改用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -130,15 +138,15 @@ public interface ISysUserService
 
     /**
      * 用户授权角色
-     * 
-     * @param userId 用户ID
+     *
+     * @param userId  用户ID
      * @param roleIds 角色组
      */
     public void insertUserAuth(Long userId, Long[] roleIds);
 
     /**
      * 修改用户状态
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -146,7 +154,7 @@ public interface ISysUserService
 
     /**
      * 修改用户基本信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -154,16 +162,16 @@ public interface ISysUserService
 
     /**
      * 修改用户头像
-     * 
+     *
      * @param userName 用户名
-     * @param avatar 头像地址
+     * @param avatar   头像地址
      * @return 结果
      */
     public boolean updateUserAvatar(String userName, String avatar);
 
     /**
      * 重置用户密码
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -171,7 +179,7 @@ public interface ISysUserService
 
     /**
      * 重置用户密码
-     * 
+     *
      * @param userName 用户名
      * @param password 密码
      * @return 结果
@@ -180,7 +188,7 @@ public interface ISysUserService
 
     /**
      * 通过用户ID删除用户
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */
@@ -188,7 +196,7 @@ public interface ISysUserService
 
     /**
      * 批量删除用户信息
-     * 
+     *
      * @param userIds 需要删除的用户ID
      * @return 结果
      */
@@ -196,10 +204,10 @@ public interface ISysUserService
 
     /**
      * 导入用户数据
-     * 
-     * @param userList 用户数据列表
+     *
+     * @param userList        用户数据列表
      * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
-     * @param operName 操作用户
+     * @param operName        操作用户
      * @return 结果
      */
     public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);

+ 33 - 3
doc-system/src/main/java/com/doc/system/service/impl/SysUserServiceImpl.java

@@ -1,9 +1,12 @@
 package com.doc.system.service.impl;
 
 import com.doc.common.annotation.DataScope;
+import com.doc.common.constant.CacheConstants;
+import com.doc.common.constant.Constants;
 import com.doc.common.constant.UserConstants;
 import com.doc.common.core.domain.entity.SysRole;
 import com.doc.common.core.domain.entity.SysUser;
+import com.doc.common.core.redis.RedisCache;
 import com.doc.common.exception.ServiceException;
 import com.doc.common.utils.SecurityUtils;
 import com.doc.common.utils.StringUtils;
@@ -24,7 +27,9 @@ import org.springframework.util.CollectionUtils;
 import javax.annotation.Resource;
 import javax.validation.Validator;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -57,6 +62,9 @@ public class SysUserServiceImpl implements ISysUserService {
     @Resource
     protected Validator validator;
 
+    @Resource
+    private RedisCache redisCache;
+
     /**
      * 根据条件分页查询用户列表
      *
@@ -64,19 +72,41 @@ public class SysUserServiceImpl implements ISysUserService {
      * @return 用户信息集合信息
      */
     @Override
-    @DataScope(deptAlias = "d", userAlias = "u")
+    @DataScope(deptAlias = "d" , userAlias = "u")
     public List<SysUser> selectUserList(SysUser user) {
         return userMapper.selectUserList(user);
     }
 
     /**
+     * 根据条件分页查询用户列表
+     *
+     * @return 用户信息集合信息
+     */
+    @Override
+    public Map<Long, SysUser> selectAllUser() {
+        List<SysUser> userList;
+        if (redisCache.hasKey(CacheConstants.USER_CACHE)) {
+            userList = redisCache.getCacheList(CacheConstants.USER_CACHE);
+        } else {
+            userList = userMapper.selectUserList(new SysUser());
+            redisCache.setCacheList(CacheConstants.USER_CACHE, userList);
+        }
+        Map<Long, SysUser> map = new HashMap<>(16);
+        for (SysUser user : userList) {
+            map.put(user.getUserId(), user);
+        }
+
+        return map;
+    }
+
+    /**
      * 根据条件分页查询已分配用户角色列表
      *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
     @Override
-    @DataScope(deptAlias = "d", userAlias = "u")
+    @DataScope(deptAlias = "d" , userAlias = "u")
     public List<SysUser> selectAllocatedList(SysUser user) {
         return userMapper.selectAllocatedList(user);
     }
@@ -88,7 +118,7 @@ public class SysUserServiceImpl implements ISysUserService {
      * @return 用户信息集合信息
      */
     @Override
-    @DataScope(deptAlias = "d", userAlias = "u")
+    @DataScope(deptAlias = "d" , userAlias = "u")
     public List<SysUser> selectUnallocatedList(SysUser user) {
         return userMapper.selectUnallocatedList(user);
     }