Browse Source

添加消息模块

hym 4 years ago
parent
commit
2e8622c513
35 changed files with 2710 additions and 0 deletions
  1. 5 0
      common/src/main/java/com/huaxu/util/UserUtil.java
  2. 11 0
      message/src/main/java/com/huaxu/Dto/MessageDto.java
  3. 14 0
      message/src/main/java/com/huaxu/Dto/MessageStatic.java
  4. 13 0
      message/src/main/java/com/huaxu/Dto/RequsetMessageQuery.java
  5. 16 0
      message/src/main/java/com/huaxu/MessageMain.java
  6. 56 0
      message/src/main/java/com/huaxu/config/RabbitConfig.java
  7. 26 0
      message/src/main/java/com/huaxu/config/ResourceServerConfig.java
  8. 22 0
      message/src/main/java/com/huaxu/config/WebSocketAutoConfig.java
  9. 112 0
      message/src/main/java/com/huaxu/controller/MessageController.java
  10. 69 0
      message/src/main/java/com/huaxu/controller/MessageTemplateController.java
  11. 67 0
      message/src/main/java/com/huaxu/controller/MessageTypeController.java
  12. 92 0
      message/src/main/java/com/huaxu/dao/MessageMapper.java
  13. 84 0
      message/src/main/java/com/huaxu/dao/MessageTemplateMapper.java
  14. 84 0
      message/src/main/java/com/huaxu/dao/MessageTypeMapper.java
  15. 112 0
      message/src/main/java/com/huaxu/entity/Message.java
  16. 40 0
      message/src/main/java/com/huaxu/entity/MessageTemplate.java
  17. 70 0
      message/src/main/java/com/huaxu/entity/MessageType.java
  18. 11 0
      message/src/main/java/com/huaxu/entity/WebsocketConnectInfo.java
  19. 81 0
      message/src/main/java/com/huaxu/mq/DispatchMessage.java
  20. 27 0
      message/src/main/java/com/huaxu/mq/ReceiveMessage.java
  21. 89 0
      message/src/main/java/com/huaxu/service/MessageService.java
  22. 80 0
      message/src/main/java/com/huaxu/service/MessageTemplateService.java
  23. 80 0
      message/src/main/java/com/huaxu/service/MessageTypeService.java
  24. 166 0
      message/src/main/java/com/huaxu/service/impl/MessageServiceImpl.java
  25. 122 0
      message/src/main/java/com/huaxu/service/impl/MessageTemplateServiceImpl.java
  26. 123 0
      message/src/main/java/com/huaxu/service/impl/MessageTypeServiceImpl.java
  27. 177 0
      message/src/main/java/com/huaxu/util/Parser.java
  28. 36 0
      message/src/main/java/com/huaxu/util/SpringContextUtil.java
  29. 126 0
      message/src/main/java/com/huaxu/util/WebSocketUtil.java
  30. 64 0
      message/src/main/resources/application-dev.properties
  31. 1 0
      message/src/main/resources/application.properties
  32. 276 0
      message/src/main/resources/mapper/MessageMapper.xml
  33. 176 0
      message/src/main/resources/mapper/MessageTemplateMapper.xml
  34. 181 0
      message/src/main/resources/mapper/MessageTypeMapper.xml
  35. 1 0
      user_auth/src/main/resources/mapper/UserMapper.xml

+ 5 - 0
common/src/main/java/com/huaxu/util/UserUtil.java

@@ -51,11 +51,16 @@ public class UserUtil {
                     loginUser.setTenantId(userJson.getString("tenantId"));
                     JSONArray programItemListArray = userJson.getJSONArray("programItemList");
                     loginUser.setPermissonType(userJson.getInteger("permissonType"));
+                    JSONArray appIds = userJson.getJSONArray("appIds");
                     if (programItemListArray != null) {
                         List<ProgramItem> collection =
                                 JSONObject.parseArray(programItemListArray.toJSONString(), ProgramItem.class);
                         loginUser.setProgramItemList(collection);
                     }
+                    if(appIds!=null){
+                        List<String> appIdString = JSONObject.parseArray(appIds.toJSONString(), String.class);
+                        loginUser.setAppIds(appIdString);
+                    }
                     return loginUser;
                 }
             }

+ 11 - 0
message/src/main/java/com/huaxu/Dto/MessageDto.java

@@ -0,0 +1,11 @@
+package com.huaxu.Dto;
+
+import lombok.Data;
+
+@Data
+public class MessageDto {
+    private String content;
+    private String date;
+    private String type;
+    private String userId;
+}

+ 14 - 0
message/src/main/java/com/huaxu/Dto/MessageStatic.java

@@ -0,0 +1,14 @@
+package com.huaxu.Dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class MessageStatic {
+    @ApiModelProperty(value = "类型")
+    private String type;
+    @ApiModelProperty(value = "数量")
+    private Integer cn;
+    @ApiModelProperty(value = "类型Id")
+    private Integer typeId;
+}

+ 13 - 0
message/src/main/java/com/huaxu/Dto/RequsetMessageQuery.java

@@ -0,0 +1,13 @@
+package com.huaxu.Dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+@Data
+public class RequsetMessageQuery {
+    @ApiModelProperty(value = "消息id")
+    private List<Integer>ids;
+    @ApiModelProperty(value = "消息状态")
+    private Integer status;
+}

+ 16 - 0
message/src/main/java/com/huaxu/MessageMain.java

@@ -0,0 +1,16 @@
+package com.huaxu;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.ApplicationContext;
+
+@EnableDiscoveryClient
+@SpringBootApplication
+public class MessageMain {
+    public static void main(String[] args) {
+        ApplicationContext context = SpringApplication.run(MessageMain.class, args);
+
+
+    }
+}

+ 56 - 0
message/src/main/java/com/huaxu/config/RabbitConfig.java

@@ -0,0 +1,56 @@
+package com.huaxu.config;
+
+import org.springframework.amqp.core.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class RabbitConfig {
+    @Value("${receive.queue.name}")
+    private  String receiveQueueName;
+    @Value("${receive.exchange.name}")
+    private  String receiveExchangeName;
+    @Value("${receive.routing.key}")
+    private  String receiveRoutingKey;
+    @Value("${dispath.routing.key}")
+    private  String dispathRoutingKey;
+    @Value("${dispath.queue}")
+    private  String dispathQueue;
+
+
+    @Bean
+    public Queue dispathQueue() {
+        return QueueBuilder.nonDurable(dispathQueue).build();
+    }
+    @Bean
+    public Queue receiveQueue() {
+
+        return new Queue(receiveQueueName, false, false, false, null);
+    }
+
+    @Bean
+    public Exchange exchange() {
+
+        return new TopicExchange(receiveExchangeName, false, false, null);
+    }
+
+
+    @Bean
+    public Binding receiveBinding() {
+        return new Binding(receiveQueueName,
+                Binding.DestinationType.QUEUE,
+                receiveExchangeName,
+                receiveRoutingKey,
+                null);
+    }
+    @Bean
+    public Binding dispathBinding() {
+        return new Binding(dispathQueue,
+                Binding.DestinationType.QUEUE,
+                receiveExchangeName,
+                dispathRoutingKey,
+                null);
+    }
+
+}

+ 26 - 0
message/src/main/java/com/huaxu/config/ResourceServerConfig.java

@@ -0,0 +1,26 @@
+package com.huaxu.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
+import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
+
+@Configuration
+@EnableResourceServer
+public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
+
+    @Override
+    public void configure(HttpSecurity http) throws Exception {
+        http
+                .csrf().disable()
+                .requestMatchers().antMatchers("/**")
+                .and()
+                .authorizeRequests()
+                .antMatchers("/swagger-ui.html","/webjars/**", "/webjars/**", "/swagger-resources/**",
+                       "/webSocket/**","/message/sendToOne","/v2/**")
+                .permitAll() //配置不需要身份认证的请求路径
+                .anyRequest().authenticated() //其他所有访问路径都需要身份认证
+                .and()
+                .httpBasic();
+    }
+}

+ 22 - 0
message/src/main/java/com/huaxu/config/WebSocketAutoConfig.java

@@ -0,0 +1,22 @@
+package com.huaxu.config;
+
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
+import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
+import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+//@Configuration
+
+@Configuration
+@EnableWebSocket
+public class WebSocketAutoConfig  {
+    @Bean
+    public ServerEndpointExporter serverEndpoint() {
+        return new ServerEndpointExporter();
+    }
+
+}

+ 112 - 0
message/src/main/java/com/huaxu/controller/MessageController.java

@@ -0,0 +1,112 @@
+package com.huaxu.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huaxu.Dto.MessageStatic;
+import com.huaxu.Dto.RequsetMessageQuery;
+import com.huaxu.entity.Message;
+import com.huaxu.model.AjaxMessage;
+import com.huaxu.model.Pagination;
+import com.huaxu.model.ResultStatus;
+import com.huaxu.service.MessageService;
+
+import com.huaxu.util.WebSocketUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.amqp.core.AmqpTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * (Message)控制层
+ *
+ * @author makejava
+ * @since 2020-11-12 10:53:19
+ */
+@RestController
+@RequestMapping("/message")
+@Api(tags = "消息服务")
+public class MessageController {
+    /**
+     * 服务对象
+     */
+    @Autowired
+    private MessageService messageService;
+
+    @Autowired
+    private AmqpTemplate rabbitTemplate;
+    @Value("${receive.exchange.name}")
+    private  String receiveExchangeName;
+    @Value("${dispath.routing.key}")
+    private  String dispathRoutingKey;
+   /**
+     * 分页查询
+     *
+     * @param pageNum  偏移
+     * @param pageSize 条数
+     * @return Response对象
+     */
+    @RequestMapping(value = "selectPage", method = RequestMethod.POST)
+    @ApiOperation(value = "查询消息列表(分页)",notes = "全部的时候不传typeid")
+    public AjaxMessage<Pagination<Message>> selectPage(Integer pageNum, Integer pageSize,Integer typeId,
+                                                       Integer messageStatus) {
+        Message message = new Message();
+        message.setMessageType(typeId);
+        message.setMessageStatus(messageStatus);
+        IPage<Message> iPage = new Page<>(pageNum, pageSize);
+        iPage = messageService.selectPage(message, iPage);
+        Pagination<Message> pages = new Pagination<>(iPage);
+        return new AjaxMessage<>(ResultStatus.OK, pages);
+    }
+    /**
+     * 分页查询
+     *
+     * @param num  偏移
+     * @param num 条数
+     * @return Response对象
+     */
+    @RequestMapping(value = "queryLastMessage", method = RequestMethod.POST)
+    @ApiOperation(value = "查询最新消息")
+    public AjaxMessage<List<Message>> queryLastMessage(int num) {
+
+       return new AjaxMessage<>(ResultStatus.OK,messageService.queryLastMessage(num));
+    }
+    /**
+     * 分页查询
+     *
+     *
+     *
+     * @return Response对象
+     */
+    @RequestMapping(value = "queryUnreadMessageStatic", method = RequestMethod.POST)
+    @ApiOperation(value = "统计未读消息数量")
+    public AjaxMessage<List<MessageStatic>> queryUnreadMessageStatic() {
+        ;
+        return new AjaxMessage<>(ResultStatus.OK,messageService.queryUnreadMessageStatic());
+    }
+    @ResponseBody
+    @RequestMapping(value="/sendToOne", produces = {"application/json; charset=utf-8"},method= RequestMethod.POST)
+    public String sendToOne( @RequestBody Message message){
+        rabbitTemplate.convertAndSend(receiveExchangeName,dispathRoutingKey, JSONObject.toJSONString(message));
+        return "成功";
+    }
+    /**
+     * 修改一条数据
+     *
+     * @param message 实体类
+     * @return Response对象
+     */
+    @RequestMapping(value = "updateMultiple", method = RequestMethod.POST)
+    @ApiOperation(value = "更改多个消息状态")
+    public AjaxMessage<Integer> updateMultiple(@ApiParam(value = "设置配置", required = true) @RequestBody RequsetMessageQuery message) {
+        int result = messageService.updateMultiple(message);
+        return new AjaxMessage<>(ResultStatus.OK, result);
+
+    }
+}

+ 69 - 0
message/src/main/java/com/huaxu/controller/MessageTemplateController.java

@@ -0,0 +1,69 @@
+package com.huaxu.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huaxu.entity.MessageTemplate;
+import com.huaxu.model.AjaxMessage;
+import com.huaxu.model.Pagination;
+import com.huaxu.model.ResultStatus;
+import com.huaxu.service.MessageTemplateService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * (MessageTemplate)控制层
+ *
+ * @author makejava
+ * @since 2020-11-13 10:48:57
+ */
+@RestController
+@RequestMapping("/messageTemplate")
+@Api(tags = "模板管理")
+public class MessageTemplateController {
+    /**
+     * 服务对象
+     */
+    @Autowired
+    private MessageTemplateService messageTemplateService;
+
+
+
+    /**
+     * 新增一条数据
+     *
+     * @param messageTemplate 实体类
+     * @return Response对象
+     */
+    @RequestMapping(value = "insert", method = RequestMethod.POST)
+    @ApiOperation(value = "增加模板")
+    public AjaxMessage<Integer> insert(@ApiParam(value = "设置配置", required = true) @RequestBody MessageTemplate messageTemplate) {
+        int result = messageTemplateService.insert(messageTemplate);
+
+        return new AjaxMessage<>(ResultStatus.OK, result);
+    }
+
+    /**
+     * 修改一条数据
+     *
+     * @param templateName 名称
+     * @return Response对象
+     */
+    @RequestMapping(value = "delete", method = RequestMethod.POST)
+    @ApiOperation(value = "删除模板")
+    public AjaxMessage<Integer> update(@ApiParam(value = "设置配置", required = true) @RequestParam Integer id) {
+        MessageTemplate messageTemplate=new MessageTemplate();
+        messageTemplate.setStatus(0);
+        messageTemplate.setId(id);
+        int result = messageTemplateService.update(messageTemplate);
+        return new AjaxMessage<>(ResultStatus.OK, result);
+
+    }
+
+
+
+
+
+}

+ 67 - 0
message/src/main/java/com/huaxu/controller/MessageTypeController.java

@@ -0,0 +1,67 @@
+package com.huaxu.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huaxu.entity.MessageType;
+import com.huaxu.model.AjaxMessage;
+import com.huaxu.model.ResultStatus;
+import com.huaxu.service.MessageTypeService;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * (MessageType)控制层
+ *
+ * @author makejava
+ * @since 2020-11-12 10:54:08
+ */
+@RestController
+@RequestMapping("/messageType")
+@Api(tags = "消息类型管理")
+public class MessageTypeController {
+    /**
+     * 服务对象
+     */
+    @Autowired
+    private MessageTypeService messageTypeService;
+
+    /**
+     * 新增一条数据
+     *
+     * @param messageType 实体类
+     * @return Response对象
+     */
+    @RequestMapping(value = "insert", method = RequestMethod.POST)
+    @ApiOperation(value = "增加消息类型")
+    public AjaxMessage<Integer> insert(@ApiParam(value = "设置配置", required = true) @RequestBody MessageType messageType) {
+        int result = messageTypeService.insert(messageType);
+
+        return new AjaxMessage<>(ResultStatus.OK, result);
+    }
+
+    /**
+     * 修改一条数据
+     *
+     * @param typeName 实体类
+     * @return Response对象
+     */
+    @RequestMapping(value = "delete", method = RequestMethod.POST)
+    @ApiOperation(value = "删除消息类型")
+    public AjaxMessage<Integer> update(@ApiParam(value = "设置配置", required = true) @RequestParam Integer id) {
+        MessageType messageType=new MessageType();
+        messageType.setStatus(0);
+        messageType.setId(id);
+        int result = messageTypeService.update(messageType);
+        return new AjaxMessage<>(ResultStatus.OK, result);
+
+    }
+
+
+
+
+
+}

+ 92 - 0
message/src/main/java/com/huaxu/dao/MessageMapper.java

@@ -0,0 +1,92 @@
+package com.huaxu.dao;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.huaxu.Dto.MessageStatic;
+import com.huaxu.Dto.RequsetMessageQuery;
+import com.huaxu.entity.Message;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * (Message)表数据库访问层
+ *
+ * @author makejava
+ * @since 2020-11-12 10:53:24
+ */
+@Mapper
+public interface MessageMapper {
+
+    /**
+     * 通过ID查询单条数据
+     *
+     * @param id 主键
+     * @return 实例对象
+     */
+    Message selectById(Integer id);
+
+
+    /**
+     * 查询全部
+     *
+     * @return 对象列表
+     */
+    List<Message> selectAll();
+
+    /**
+     * 通过实体作为筛选条件查询
+     *
+     * @param message 实例对象
+     * @return 对象列表
+     */
+    List<Message> selectList(Message message);
+
+    /**
+     * 新增数据
+     *
+     * @param message 实例对象
+     * @return 影响行数
+     */
+    int insert(Message message);
+
+    /**
+     * 批量新增
+     *
+     * @param messages 实例对象的集合
+     * @return 影响行数
+     */
+    int batchInsert(@Param("messages") List<Message> messages);
+
+    /**
+     * 修改数据
+     *
+     * @param message 实例对象
+     * @return 影响行数
+     */
+    int update(Message message);
+
+    /**
+     * 通过主键删除数据
+     *
+     * @param id 主键
+     * @return 影响行数
+     */
+    int deleteById(Integer id);
+
+    /**
+     * 查询总数据数
+     *
+     * @return 数据总数
+     */
+    int count();
+
+    IPage<Message> selectPage(IPage<Message> page, Message message);
+
+    List<Message> queryLastMessage(@Param("num") int num,@Param("id") Integer id);
+
+    List<MessageStatic> queryUnreadMessageStatic(Integer id);
+
+    int updateMultiple(RequsetMessageQuery requsetMessageQuery);
+    List<MessageStatic>getUserMessageTypeByApp( List<String>appIds);
+}

+ 84 - 0
message/src/main/java/com/huaxu/dao/MessageTemplateMapper.java

@@ -0,0 +1,84 @@
+package com.huaxu.dao;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.huaxu.entity.MessageTemplate;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * (MessageTemplate)表数据库访问层
+ *
+ * @author makejava
+ * @since 2020-11-13 10:48:58
+ */
+@Mapper
+public interface MessageTemplateMapper {
+
+    /**
+     * 通过ID查询单条数据
+     *
+     * @param id 主键
+     * @return 实例对象
+     */
+    MessageTemplate selectById(Integer id);
+
+
+    /**
+     * 查询全部
+     *
+     * @return 对象列表
+     */
+    List<MessageTemplate> selectAll();
+
+    /**
+     * 通过实体作为筛选条件查询
+     *
+     * @param messageTemplate 实例对象
+     * @return 对象列表
+     */
+    List<MessageTemplate> selectList(MessageTemplate messageTemplate);
+
+    /**
+     * 新增数据
+     *
+     * @param messageTemplate 实例对象
+     * @return 影响行数
+     */
+    int insert(MessageTemplate messageTemplate);
+
+    /**
+     * 批量新增
+     *
+     * @param messageTemplates 实例对象的集合
+     * @return 影响行数
+     */
+    int batchInsert(@Param("messageTemplates") List<MessageTemplate> messageTemplates);
+
+    /**
+     * 修改数据
+     *
+     * @param messageTemplate 实例对象
+     * @return 影响行数
+     */
+    int update(MessageTemplate messageTemplate);
+
+    /**
+     * 通过主键删除数据
+     *
+     * @param id 主键
+     * @return 影响行数
+     */
+    int deleteById(Integer id);
+
+    /**
+     * 查询总数据数
+     *
+     * @return 数据总数
+     */
+    int count();
+
+    IPage<MessageTemplate> selectPage(IPage<MessageTemplate> page, MessageTemplate messageTemplate);
+
+}

+ 84 - 0
message/src/main/java/com/huaxu/dao/MessageTypeMapper.java

@@ -0,0 +1,84 @@
+package com.huaxu.dao;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.huaxu.entity.MessageType;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * (MessageType)表数据库访问层
+ *
+ * @author makejava
+ * @since 2020-11-16 17:34:22
+ */
+@Mapper
+public interface MessageTypeMapper {
+
+    /**
+     * 通过ID查询单条数据
+     *
+     * @param id 主键
+     * @return 实例对象
+     */
+    MessageType selectById(Integer id);
+
+
+    /**
+     * 查询全部
+     *
+     * @return 对象列表
+     */
+    List<MessageType> selectAll();
+
+    /**
+     * 通过实体作为筛选条件查询
+     *
+     * @param messageType 实例对象
+     * @return 对象列表
+     */
+    List<MessageType> selectList(MessageType messageType);
+
+    /**
+     * 新增数据
+     *
+     * @param messageType 实例对象
+     * @return 影响行数
+     */
+    int insert(MessageType messageType);
+
+    /**
+     * 批量新增
+     *
+     * @param messageTypes 实例对象的集合
+     * @return 影响行数
+     */
+    int batchInsert(@Param("messageTypes") List<MessageType> messageTypes);
+
+    /**
+     * 修改数据
+     *
+     * @param messageType 实例对象
+     * @return 影响行数
+     */
+    int update(MessageType messageType);
+
+    /**
+     * 通过主键删除数据
+     *
+     * @param id 主键
+     * @return 影响行数
+     */
+    int deleteById(Integer id);
+
+    /**
+     * 查询总数据数
+     *
+     * @return 数据总数
+     */
+    int count();
+
+    IPage<MessageType> selectPage(IPage<MessageType> page, MessageType messageType);
+
+}

+ 112 - 0
message/src/main/java/com/huaxu/entity/Message.java

@@ -0,0 +1,112 @@
+package com.huaxu.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * (Message)实体类
+ *
+ * @author makejava
+ * @since 2020-11-16 14:31:15
+ */
+@Data
+@ApiModel
+public class Message implements Serializable {
+    private static final long serialVersionUID = 218863842329351978L;
+    /**
+     * 主键
+     */
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+    /**
+     * 消息业务id
+     */
+    @ApiModelProperty(value = "消息业务id")
+    private String messageId;
+    /**
+     * 消息类型
+     */
+    @ApiModelProperty(value = "消息类型")
+    private Integer messageType;
+    /**
+     * 消息内容,如果需要动态使用,配合模板使用{key:value}形式
+     */
+    @ApiModelProperty(value = "消息内容,如果需要动态使用,配合模板使用{key:value}形式")
+    private String messageContent;
+    /**
+     * 模板id
+     */
+    @ApiModelProperty(value = "模板id")
+    private Integer messageTemplateId;
+    /**
+     * 跳转相对路径
+     */
+    @ApiModelProperty(value = "跳转相对路径")
+    private String url;
+    /**
+     * 消息状态
+     */
+    @ApiModelProperty(value = "消息状态")
+    private Integer messageStatus;
+    /**
+     * 用户标识
+     */
+    @ApiModelProperty(value = "用户标识")
+    private Integer userId;
+    /**
+     * 渠道
+     */
+    @ApiModelProperty(value = "渠道")
+    private Integer channel;
+    /**
+     * 标题
+     */
+    @ApiModelProperty(value = "标题")
+    private String title;
+    /**
+     * 租户标识
+     */
+    @ApiModelProperty(value = "租户标识")
+    private String tenantId;
+    /**
+     * 删除标识
+     */
+    @ApiModelProperty(value = "删除标识")
+    private Integer status;
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    private Date dateCreate;
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+    /**
+     * 更新人
+     */
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+    /**
+     * 保留字段
+     */
+    @ApiModelProperty(value = "保留字段")
+    private Integer uniqueFlag;
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    private Date dateUpdate;
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "消息类型")
+    private String typeName;
+    @ApiModelProperty(value = "类型名简称")
+    private String shortName;
+}

+ 40 - 0
message/src/main/java/com/huaxu/entity/MessageTemplate.java

@@ -0,0 +1,40 @@
+package com.huaxu.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * (MessageTemplate)实体类
+ *
+ * @author makejava
+ * @since 2020-11-13 10:48:59
+ */
+@Data
+@ApiModel
+public class MessageTemplate implements Serializable {
+    private static final long serialVersionUID = 352487528630439038L;
+    @ApiModelProperty(value = "")
+    private Integer id;
+    @ApiModelProperty(value = "")
+    private String name;
+    @ApiModelProperty(value = "")
+    private String content;
+    @ApiModelProperty(value = "")
+    private Integer paramTotal;
+    @ApiModelProperty(value = "")
+    private Date dateCreate;
+    @ApiModelProperty(value = "")
+    private String createBy;
+    @ApiModelProperty(value = "")
+    private String updateBy;
+    @ApiModelProperty(value = "")
+    private Integer appId;
+    @ApiModelProperty(value = "")
+    private Date dateUpdate;
+    @ApiModelProperty(value = "")
+    private Integer status;
+}

+ 70 - 0
message/src/main/java/com/huaxu/entity/MessageType.java

@@ -0,0 +1,70 @@
+package com.huaxu.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * (MessageType)实体类
+ *
+ * @author makejava
+ * @since 2020-11-16 17:34:23
+ */
+@Data
+@ApiModel
+public class MessageType implements Serializable {
+    private static final long serialVersionUID = 568253371589969871L;
+    /**
+     * 主键id
+     */
+    @ApiModelProperty(value = "主键id")
+    private Integer id;
+    /**
+     * 类型名称
+     */
+    @ApiModelProperty(value = "类型名称")
+    private String type;
+    /**
+     * 应用根路径
+     */
+    @ApiModelProperty(value = "应用根路径")
+    private String path;
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    private Date dateCreate;
+    /**
+     * 应用id
+     */
+    @ApiModelProperty(value = "应用id")
+    private String appId;
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+    /**
+     * 修改人
+     */
+    @ApiModelProperty(value = "修改人")
+    private String updateBy;
+    /**
+     * 删除标识
+     */
+    @ApiModelProperty(value = "删除标识")
+    private Integer status;
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    private Date dateUpdate;
+    /**
+     * 简称
+     */
+    @ApiModelProperty(value = "简称")
+    private String shortName;
+}

+ 11 - 0
message/src/main/java/com/huaxu/entity/WebsocketConnectInfo.java

@@ -0,0 +1,11 @@
+package com.huaxu.entity;
+
+import lombok.Data;
+
+@Data
+public class WebsocketConnectInfo {
+    private String userId;
+    private String connectServerExchange;
+    private String connectServerRoutingKey;
+
+}

+ 81 - 0
message/src/main/java/com/huaxu/mq/DispatchMessage.java

@@ -0,0 +1,81 @@
+package com.huaxu.mq;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huaxu.Dto.MessageDto;
+import com.huaxu.dao.MessageMapper;
+import com.huaxu.dao.MessageTemplateMapper;
+import com.huaxu.dao.MessageTypeMapper;
+import com.huaxu.entity.Message;
+import com.huaxu.entity.MessageTemplate;
+import com.huaxu.entity.MessageType;
+import com.huaxu.entity.WebsocketConnectInfo;
+import com.huaxu.util.Parser;
+import com.huaxu.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.AmqpTemplate;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Map;
+
+@Component
+@Slf4j
+public class DispatchMessage {
+    @Autowired
+    private RedisUtil redisUtil;
+    @Value("${user.connections}")
+    private String userConnections;
+    @Autowired
+    private AmqpTemplate rabbitTemplate;
+    @Autowired
+    private MessageTypeMapper messageTypeMapper;
+    @Autowired
+    private MessageTemplateMapper messageTemplateMapper;
+    @Autowired
+    private MessageMapper messageMapper;
+    @RabbitListener(queues = "${dispath.queue}")
+    public void dispatch(String message){
+        Long size = redisUtil.opsForList().size(userConnections);
+        Message receiveMessage= JSONObject.parseObject(message, Message.class);
+        receiveMessage.setStatus(1);
+        receiveMessage.setMessageStatus(0);
+        Integer messageTemplateId = receiveMessage.getMessageTemplateId();
+        Integer messageTypeId = receiveMessage.getMessageType();
+        MessageTemplate messageTemplate = messageTemplateMapper.selectById(messageTemplateId);
+        MessageType messageType = messageTypeMapper.selectById(messageTypeId);
+        MessageDto messageDto = new MessageDto();
+        if(messageTemplate!=null){
+            String content = messageTemplate.getContent();
+            Map<String,String> param = JSONObject.parseObject(receiveMessage.getMessageContent(), Map.class);
+            String replaceContent = Parser.replaceAllClearBlanks(content, param);
+            receiveMessage.setMessageContent(replaceContent);
+        }
+
+        messageMapper.insert(receiveMessage);
+        messageDto.setContent(receiveMessage.getMessageContent());
+        messageDto.setType(messageType==null?"未知":messageType.getShortName());
+        messageDto.setUserId(receiveMessage.getUserId()+"");
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        String date=dtf2.format(now);
+        messageDto.setDate(date);
+        List<String> connectInfos = redisUtil.opsForList().range(userConnections, 0, size);
+        connectInfos.forEach(connectInfo ->{
+            WebsocketConnectInfo websocketConnectInfo =
+                    JSONObject.parseObject(connectInfo, WebsocketConnectInfo.class);
+            String sendMessage = JSONObject.toJSONString(messageDto);
+            if(websocketConnectInfo.getUserId().equals(receiveMessage.getUserId()+"")){
+                log.info("向用户:"+websocketConnectInfo.getUserId()+"发送消息:"+sendMessage);
+
+               rabbitTemplate.convertAndSend(websocketConnectInfo.getConnectServerExchange(),
+                        websocketConnectInfo.getConnectServerRoutingKey(), sendMessage);
+
+            }
+         });
+    }
+}

+ 27 - 0
message/src/main/java/com/huaxu/mq/ReceiveMessage.java

@@ -0,0 +1,27 @@
+package com.huaxu.mq;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huaxu.Dto.MessageDto;
+import com.huaxu.dao.MessageTypeMapper;
+import com.huaxu.entity.Message;
+import com.huaxu.entity.MessageType;
+import com.huaxu.entity.WebsocketConnectInfo;
+import com.huaxu.util.WebSocketUtil;
+
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class ReceiveMessage {
+    @Autowired
+    private WebSocketUtil webSocketUtil;
+    @RabbitListener(queues = "${receive.queue.name}")
+    public void receive(String message){
+        MessageDto sendMessage = JSONObject.parseObject(message, MessageDto.class);
+        webSocketUtil.sendInfo(sendMessage.getUserId(),
+               JSONObject.toJSONString(sendMessage));
+    }
+
+}

+ 89 - 0
message/src/main/java/com/huaxu/service/MessageService.java

@@ -0,0 +1,89 @@
+package com.huaxu.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.huaxu.Dto.MessageStatic;
+import com.huaxu.Dto.RequsetMessageQuery;
+import com.huaxu.entity.Message;
+
+import java.util.List;
+
+/**
+ * (Message)表服务接口
+ *
+ * @author makejava
+ * @since 2020-11-12 10:53:23
+ */
+public interface MessageService {
+
+    /**
+     * 通过ID查询单条数据
+     *
+     * @param id 主键
+     * @return 实例对象
+     */
+    Message selectById(Integer id);
+
+
+    /**
+     * 查询全部
+     *
+     * @return 对象列表
+     */
+    List<Message> selectAll();
+
+    /**
+     * 通过实体作为筛选条件查询
+     *
+     * @param message 实例对象
+     * @return 对象列表
+     */
+    List<Message> selectList(Message message);
+
+    /**
+     * 新增数据
+     *
+     * @param message 实例对象
+     * @return 影响行数
+     */
+    int insert(Message message);
+
+    /**
+     * 批量新增
+     *
+     * @param messages 实例对象的集合
+     * @return 影响行数
+     */
+    int batchInsert(List<Message> messages);
+
+    /**
+     * 修改数据
+     *
+     * @param message 实例对象
+     * @return 修改
+     */
+    int update(Message message);
+
+    /**
+     * 通过主键删除数据
+     *
+     * @param id 主键
+     * @return 影响行数
+     */
+    int deleteById(Integer id);
+
+    /**
+     * 查询总数据数
+     *
+     * @return 数据总数
+     */
+    int count();
+
+    IPage<Message> selectPage(Message message, IPage<Message> page);
+
+    int updateMultiple(RequsetMessageQuery requsetMessageQuery);
+
+
+    List<MessageStatic> queryUnreadMessageStatic();
+
+    List<Message> queryLastMessage(int num);
+}

+ 80 - 0
message/src/main/java/com/huaxu/service/MessageTemplateService.java

@@ -0,0 +1,80 @@
+package com.huaxu.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.huaxu.entity.MessageTemplate;
+
+import java.util.List;
+
+/**
+ * (MessageTemplate)表服务接口
+ *
+ * @author makejava
+ * @since 2020-11-12 10:53:46
+ */
+public interface MessageTemplateService {
+
+    /**
+     * 通过ID查询单条数据
+     *
+     * @param id 主键
+     * @return 实例对象
+     */
+    MessageTemplate selectById(Integer id);
+
+
+    /**
+     * 查询全部
+     *
+     * @return 对象列表
+     */
+    List<MessageTemplate> selectAll();
+
+    /**
+     * 通过实体作为筛选条件查询
+     *
+     * @param messageTemplate 实例对象
+     * @return 对象列表
+     */
+    List<MessageTemplate> selectList(MessageTemplate messageTemplate);
+
+    /**
+     * 新增数据
+     *
+     * @param messageTemplate 实例对象
+     * @return 影响行数
+     */
+    int insert(MessageTemplate messageTemplate);
+
+    /**
+     * 批量新增
+     *
+     * @param messageTemplates 实例对象的集合
+     * @return 影响行数
+     */
+    int batchInsert(List<MessageTemplate> messageTemplates);
+
+    /**
+     * 修改数据
+     *
+     * @param messageTemplate 实例对象
+     * @return 修改
+     */
+    int update(MessageTemplate messageTemplate);
+
+    /**
+     * 通过主键删除数据
+     *
+     * @param id 主键
+     * @return 影响行数
+     */
+    int deleteById(Integer id);
+
+    /**
+     * 查询总数据数
+     *
+     * @return 数据总数
+     */
+    int count();
+
+    IPage<MessageTemplate> selectPage(MessageTemplate messageTemplate, IPage<MessageTemplate> page);
+}

+ 80 - 0
message/src/main/java/com/huaxu/service/MessageTypeService.java

@@ -0,0 +1,80 @@
+package com.huaxu.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.huaxu.entity.MessageType;
+
+import java.util.List;
+
+/**
+ * (MessageType)表服务接口
+ *
+ * @author makejava
+ * @since 2020-11-12 10:54:08
+ */
+public interface MessageTypeService {
+
+    /**
+     * 通过ID查询单条数据
+     *
+     * @param id 主键
+     * @return 实例对象
+     */
+    MessageType selectById(Integer id);
+
+
+    /**
+     * 查询全部
+     *
+     * @return 对象列表
+     */
+    List<MessageType> selectAll();
+
+    /**
+     * 通过实体作为筛选条件查询
+     *
+     * @param messageType 实例对象
+     * @return 对象列表
+     */
+    List<MessageType> selectList(MessageType messageType);
+
+    /**
+     * 新增数据
+     *
+     * @param messageType 实例对象
+     * @return 影响行数
+     */
+    int insert(MessageType messageType);
+
+    /**
+     * 批量新增
+     *
+     * @param messageTypes 实例对象的集合
+     * @return 影响行数
+     */
+    int batchInsert(List<MessageType> messageTypes);
+
+    /**
+     * 修改数据
+     *
+     * @param messageType 实例对象
+     * @return 修改
+     */
+    int update(MessageType messageType);
+
+    /**
+     * 通过主键删除数据
+     *
+     * @param id 主键
+     * @return 影响行数
+     */
+    int deleteById(Integer id);
+
+    /**
+     * 查询总数据数
+     *
+     * @return 数据总数
+     */
+    int count();
+
+    IPage<MessageType> selectPage(MessageType messageType, IPage<MessageType> page);
+}

+ 166 - 0
message/src/main/java/com/huaxu/service/impl/MessageServiceImpl.java

@@ -0,0 +1,166 @@
+package com.huaxu.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.huaxu.Dto.MessageStatic;
+import com.huaxu.Dto.RequsetMessageQuery;
+import com.huaxu.dao.MessageMapper;
+import com.huaxu.entity.Message;
+import com.huaxu.model.LoginUser;
+import com.huaxu.service.MessageService;
+import com.huaxu.util.UserUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * (Message表)服务实现类
+ *
+ * @author makejava
+ * @since 2020-11-12 10:53:25
+ */
+@Service("messageService")
+public class MessageServiceImpl implements MessageService {
+    @Autowired
+    private MessageMapper messageMapper;
+
+    /**
+     * 通过ID查询单条数据
+     *
+     * @param id 主键
+     * @return 实例对象
+     */
+    @Override
+    public Message selectById(Integer id) {
+        return this.messageMapper.selectById(id);
+    }
+
+
+    /**
+     * 查询所有
+     *
+     * @return 实例对象的集合
+     */
+    @Override
+    public List<Message> selectAll() {
+        return this.messageMapper.selectAll();
+    }
+
+    /**
+     * 根据条件查询
+     *
+     * @return 实例对象的集合
+     */
+    @Override
+    public List<Message> selectList(Message message) {
+        return this.messageMapper.selectList(message);
+    }
+
+    /**
+     * 新增数据
+     *
+     * @param message 实例对象
+     * @return 实例对象
+     */
+    @Override
+    public int insert(Message message) {
+        return this.messageMapper.insert(message);
+    }
+
+    /**
+     * 批量新增
+     *
+     * @param messages 实例对象的集合
+     * @return 生效的条数
+     */
+    @Override
+    public int batchInsert(List<Message> messages) {
+        return this.messageMapper.batchInsert(messages);
+    }
+
+    /**
+     * 修改数据
+     *
+     * @param message 实例对象
+     * @return 实例对象
+     */
+    @Override
+    public int update(Message message) {
+
+        return this.messageMapper.update(message);
+    }
+
+    /**
+     * 通过主键删除数据
+     *
+     * @param id 主键
+     * @return 是否成功
+     */
+    @Override
+    public int deleteById(Integer id) {
+        return this.messageMapper.deleteById(id);
+    }
+
+    /**
+     * 查询总数据数
+     *
+     * @return 数据总数
+     */
+    @Override
+    public int count() {
+        return this.messageMapper.count();
+    }
+
+    /**
+     * 分页查询
+     *
+     * @return 对象列表
+     */
+    @Override
+    public IPage<Message> selectPage(Message message, IPage<Message> page) {
+        message.setUserId(UserUtil.getCurrentUser().getId());
+        return this.messageMapper.selectPage(page, message);
+    }
+
+    @Override
+    public int updateMultiple(RequsetMessageQuery requsetMessageQuery) {
+        messageMapper.updateMultiple(requsetMessageQuery);
+        return 0;
+    }
+
+    @Override
+    public List<MessageStatic> queryUnreadMessageStatic() {
+        LoginUser currentUser = UserUtil.getCurrentUser();
+        List<MessageStatic> messageStatics = messageMapper.queryUnreadMessageStatic(currentUser.getId());
+        if(currentUser.getAppIds()!=null){
+            List<String>appIds=currentUser.getAppIds();
+            List<MessageStatic> userMessageTypeByApp =
+                    messageMapper.getUserMessageTypeByApp(appIds);
+            Map<Integer,MessageStatic>staticMap=new HashMap<>();
+            messageStatics.forEach(messageStatic -> {
+                staticMap.put(messageStatic.getTypeId(),messageStatic);
+            });
+
+            userMessageTypeByApp.forEach(messageType->{
+                MessageStatic messageStatic = staticMap.get(messageType.getTypeId());
+                if(messageStatic!=null){
+                    messageType.setCn(messageStatic.getCn());
+                }
+
+            });
+            messageStatics=userMessageTypeByApp;
+        }
+
+        return messageStatics;
+    }
+
+    @Override
+    public List<Message> queryLastMessage(int num) {
+       ;
+
+        return messageMapper.queryLastMessage(num, UserUtil.getCurrentUser().getId());
+    }
+}

+ 122 - 0
message/src/main/java/com/huaxu/service/impl/MessageTemplateServiceImpl.java

@@ -0,0 +1,122 @@
+package com.huaxu.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.huaxu.dao.MessageTemplateMapper;
+import com.huaxu.entity.MessageTemplate;
+import com.huaxu.service.MessageTemplateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * (MessageTemplate表)服务实现类
+ *
+ * @author makejava
+ * @since 2020-11-12 10:53:47
+ */
+@Service("messageTemplateService")
+public class MessageTemplateServiceImpl implements MessageTemplateService {
+    @Autowired
+    private MessageTemplateMapper messageTemplateMapper;
+
+    /**
+     * 通过ID查询单条数据
+     *
+     * @param id 主键
+     * @return 实例对象
+     */
+    @Override
+    public MessageTemplate selectById(Integer id) {
+        return this.messageTemplateMapper.selectById(id);
+    }
+
+
+    /**
+     * 查询所有
+     *
+     * @return 实例对象的集合
+     */
+    @Override
+    public List<MessageTemplate> selectAll() {
+        return this.messageTemplateMapper.selectAll();
+    }
+
+    /**
+     * 根据条件查询
+     *
+     * @return 实例对象的集合
+     */
+    @Override
+    public List<MessageTemplate> selectList(MessageTemplate messageTemplate) {
+        return this.messageTemplateMapper.selectList(messageTemplate);
+    }
+
+    /**
+     * 新增数据
+     *
+     * @param messageTemplate 实例对象
+     * @return 实例对象
+     */
+    @Override
+    public int insert(MessageTemplate messageTemplate) {
+        this.messageTemplateMapper.insert(messageTemplate);
+        return messageTemplate.getId();
+    }
+
+    /**
+     * 批量新增
+     *
+     * @param messageTemplates 实例对象的集合
+     * @return 生效的条数
+     */
+    @Override
+    public int batchInsert(List<MessageTemplate> messageTemplates) {
+        return this.messageTemplateMapper.batchInsert(messageTemplates);
+    }
+
+    /**
+     * 修改数据
+     *
+     * @param messageTemplate 实例对象
+     * @return 实例对象
+     */
+    @Override
+    public int update(MessageTemplate messageTemplate) {
+
+            this.messageTemplateMapper.update(messageTemplate);
+
+        return 0;
+    }
+
+    /**
+     * 通过主键删除数据
+     *
+     * @param id 主键
+     * @return 是否成功
+     */
+    @Override
+    public int deleteById(Integer id) {
+        return this.messageTemplateMapper.deleteById(id);
+    }
+
+    /**
+     * 查询总数据数
+     *
+     * @return 数据总数
+     */
+    @Override
+    public int count() {
+        return this.messageTemplateMapper.count();
+    }
+
+    /**
+     * 分页查询
+     *
+     * @return 对象列表
+     */
+    @Override
+    public IPage<MessageTemplate> selectPage(MessageTemplate messageTemplate, IPage<MessageTemplate> page) {
+        return this.messageTemplateMapper.selectPage(page, messageTemplate);
+    }
+}

+ 123 - 0
message/src/main/java/com/huaxu/service/impl/MessageTypeServiceImpl.java

@@ -0,0 +1,123 @@
+package com.huaxu.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.huaxu.dao.MessageTypeMapper;
+import com.huaxu.entity.MessageType;
+import com.huaxu.service.MessageTypeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * (MessageType表)服务实现类
+ *
+ * @author makejava
+ * @since 2020-11-12 10:54:09
+ */
+@Service("messageTypeService")
+public class MessageTypeServiceImpl implements MessageTypeService {
+    @Autowired
+    private MessageTypeMapper messageTypeMapper;
+
+    /**
+     * 通过ID查询单条数据
+     *
+     * @param id 主键
+     * @return 实例对象
+     */
+    @Override
+    public MessageType selectById(Integer id) {
+        return this.messageTypeMapper.selectById(id);
+    }
+
+
+    /**
+     * 查询所有
+     *
+     * @return 实例对象的集合
+     */
+    @Override
+    public List<MessageType> selectAll() {
+        return this.messageTypeMapper.selectAll();
+    }
+
+    /**
+     * 根据条件查询
+     *
+     * @return 实例对象的集合
+     */
+    @Override
+    public List<MessageType> selectList(MessageType messageType) {
+        return this.messageTypeMapper.selectList(messageType);
+    }
+
+    /**
+     * 新增数据
+     *
+     * @param messageType 实例对象
+     * @return 实例对象
+     */
+    @Override
+    public int insert(MessageType messageType)
+    {
+        this.messageTypeMapper.insert(messageType);
+        return messageType.getId();
+    }
+
+    /**
+     * 批量新增
+     *
+     * @param messageTypes 实例对象的集合
+     * @return 生效的条数
+     */
+    @Override
+    public int batchInsert(List<MessageType> messageTypes) {
+        return this.messageTypeMapper.batchInsert(messageTypes);
+    }
+
+    /**
+     * 修改数据
+     *
+     * @param messageType 实例对象
+     * @return 实例对象
+     */
+    @Override
+    public int update(MessageType messageType) {
+
+            this.messageTypeMapper.update(messageType);
+
+        return 0;
+    }
+
+    /**
+     * 通过主键删除数据
+     *
+     * @param id 主键
+     * @return 是否成功
+     */
+    @Override
+    public int deleteById(Integer id) {
+        return this.messageTypeMapper.deleteById(id);
+    }
+
+    /**
+     * 查询总数据数
+     *
+     * @return 数据总数
+     */
+    @Override
+    public int count() {
+        return this.messageTypeMapper.count();
+    }
+
+    /**
+     * 分页查询
+     *
+     * @return 对象列表
+     */
+    @Override
+    public IPage<MessageType> selectPage(MessageType messageType, IPage<MessageType> page) {
+        return this.messageTypeMapper.selectPage(page, messageType);
+    }
+}

+ 177 - 0
message/src/main/java/com/huaxu/util/Parser.java

@@ -0,0 +1,177 @@
+package com.huaxu.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Parser {
+    /**
+     * 将字符串text中由openToken和closeToken组成的占位符依次替换为args数组中的值
+     * @param openToken
+     * @param closeToken
+     * @param text
+     * @param args
+     * @return
+     */
+    public static String parse(String openToken, String closeToken, String text, Object... args) {
+        if (args == null || args.length <= 0) {
+            return text;
+        }
+        int argsIndex = 0;
+        if (text == null || text.isEmpty()) {
+            return "";
+        }
+        char[] src = text.toCharArray();
+        int offset = 0;
+        // search open token
+        int start = text.indexOf(openToken, offset);
+        if (start == -1) {
+            return text;
+        }
+        final StringBuilder builder = new StringBuilder();
+        StringBuilder expression = null;
+        while (start > -1) {
+            if (start > 0 && src[start - 1] == '\\') {
+                // this open token is escaped. remove the backslash and continue.
+                builder.append(src, offset, start - offset - 1).append(openToken);
+                offset = start + openToken.length();
+            } else {
+                // found open token. let's search close token.
+                if (expression == null) {
+                    expression = new StringBuilder();
+                } else {
+                    expression.setLength(0);
+                }
+                builder.append(src, offset, start - offset);
+                offset = start + openToken.length();
+                int end = text.indexOf(closeToken, offset);
+                while (end > -1) {
+                    if (end > offset && src[end - 1] == '\\') {
+                        // this close token is escaped. remove the backslash and continue.
+                        expression.append(src, offset, end - offset - 1).append(closeToken);
+                        offset = end + closeToken.length();
+                        end = text.indexOf(closeToken, offset);
+                    } else {
+                        expression.append(src, offset, end - offset);
+                        offset = end + closeToken.length();
+                        break;
+                    }
+                }
+                if (end == -1) {
+                    // close token was not found.
+                    builder.append(src, start, src.length - start);
+                    offset = src.length;
+                } else {
+                    ///////////////////////////////////////仅仅修改了该else分支下的个别行代码////////////////////////
+                    String value = (argsIndex <= args.length - 1) ?
+                            (args[argsIndex] == null ? "" : args[argsIndex].toString()) : expression.toString();
+                    builder.append(value);
+                    offset = end + closeToken.length();
+                    argsIndex++;
+                    ////////////////////////////////////////////////////////////////////////////////////////////////
+                }
+            }
+            start = text.indexOf(openToken, offset);
+        }
+        if (offset < src.length) {
+            builder.append(src, offset, src.length - offset);
+        }
+        return builder.toString();
+    }
+    public static String parse(String text, Object... args) {
+        return Parser.parse("${", "}", text, args);
+    }
+
+    /**
+     * 只替换第一个{key}中的内容,{}中内容首尾的空白字符去除之后作为key
+     * 但是key中的空白字符不做处理
+     * 即使第一个{key}替换失败,后面的{key}也不做处理
+     * @param source
+     * @param params
+     * @return
+     */
+    public static String replaceFirst(String source, Map<String, String> params) {
+        int begin = source.indexOf("{");
+        int end = source.indexOf("}");
+        //source存在"{",并且"{"的位置在"}"之前时进行替换
+        if((begin > -1) && (begin < end)) {
+            //取出{key}中的可以并去除首尾的空白字符
+            String sub = source.substring(begin + 1, end);
+            sub = sub.trim();	//去除首尾空白字符
+            //System.out.println(sub);
+            if(params.containsKey(sub)) {
+                //连同{和}一起进行替换
+                String regex = source.substring(begin, end + 1);
+                source = source.replace(regex, params.get(sub));
+            }
+        }
+        return source;
+    }
+
+    /**
+     * 对字符串中的所有{key}进行替换,但是key中含有的空白字符不做处理
+     * @param source
+     * @param params
+     * @return
+     */
+    public static String replaceAll(String source, Map<String, String> params) {
+        int begin = source.indexOf("{");
+        int end = 0;
+        String sub = "";
+        while(begin > -1) {
+            //end = source.indexOf("}");	//如果用此方式可能造成死循环
+            //并不能保证每个{key}都会被替换掉,所以需要从上次的{之后进行匹配
+            end = source.indexOf("}", begin);
+            if(begin < end) {
+                sub = source.substring(begin + 1, end);
+                //sub = sub.replaceAll("\\s*", "");	//去除所有空白字符
+                sub = sub.trim();	//去除首尾空白字符
+                if(params.containsKey(sub)) {
+                    String regex = source.substring(begin, end + 1);
+                    source = source.replace(regex, params.get(sub));
+                }
+                begin = source.indexOf("{", begin+1);	//如此取值方为合理
+            }
+            //begin = source.indexOf("{");	//如果用此方式可能造成死循环
+        }
+        return source;
+    }
+
+    /**
+     * 对字符串中的所有{key}进行替换,并且会清除key中包含的空白字符之后再进行匹配
+     * @param source
+     * @param params
+     * @return
+     */
+    public static String replaceAllClearBlanks(String source, Map<String, String> params) {
+        int begin = source.indexOf("${");
+        int end = 0;
+        String sub = "";
+        while(begin > -1) {
+            //end = source.indexOf("}");	//如果用此方式可能造成死循环
+            //并不能保证每个{key}都会被替换掉,所以需要从上次的{之后进行匹配
+            end = source.indexOf("}", begin);
+            if(begin < end) {
+                sub = source.substring(begin + 2, end);
+                sub = sub.replaceAll("\\$\\s*", "");	//去除所有空白字符
+                //sub = sub.trim();	//去除首尾空白字符
+                if(params.containsKey(sub)) {
+                    String regex = source.substring(begin, end + 1);
+                    source = source.replace(regex, params.get(sub));
+                }
+                begin = source.indexOf("${", begin+2);	//如此取值方为合理
+            }
+            //begin = source.indexOf("{");	//如果用此方式可能造成死循环
+        }
+        return source;
+    }
+
+
+    public static void main(String... args) {
+        String test="我喜欢${item},但是我更新换${product}";
+        Map<String,String>replace=new HashMap<>();
+        replace.put("item","money");
+        replace.put("product","flower");
+        String s = replaceAllClearBlanks(test, replace);
+        System.out.println(s);
+    }
+}

+ 36 - 0
message/src/main/java/com/huaxu/util/SpringContextUtil.java

@@ -0,0 +1,36 @@
+package com.huaxu.util;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author pengdi
+ */
+@Component
+public class SpringContextUtil implements ApplicationContextAware {
+
+    private static ApplicationContext context;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationcontext) throws BeansException {
+        SpringContextUtil.context = applicationcontext;
+    }
+
+    public static Object getBean(String beanName) {
+        return context.getBean(beanName);
+    }
+
+    public static <T> T getBean(Class<T> clazz) {
+        String[] beanNames = context.getBeanNamesForType(clazz);
+        if (ArrayUtils.isEmpty(beanNames)) {
+            throw new IllegalArgumentException("There are no bean of type " + clazz.getName());
+        } else if (beanNames.length > 1) {
+            throw new IllegalArgumentException("There are more than one bean of type " + clazz.getName());
+        }
+        return (T) getBean(beanNames[0]);
+    }
+
+}

+ 126 - 0
message/src/main/java/com/huaxu/util/WebSocketUtil.java

@@ -0,0 +1,126 @@
+package com.huaxu.util;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huaxu.entity.WebsocketConnectInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+@ServerEndpoint("/webSocket/{sid}")
+@Component
+public class WebSocketUtil {
+    @Value("${receive.exchange.name}")
+    private String exchangeName;
+    @Value("${receive.routing.key}")
+    private String routingKey;
+    @Value("${user.connections}")
+    private String connectInfo;
+    private RedisUtil redisUtil;
+
+
+    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
+    private static AtomicInteger onlineNum = new AtomicInteger();
+
+    //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
+    private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
+
+    //发送消息
+    public void sendMessage(Session session, String message) throws IOException {
+        if(session != null){
+            synchronized (session) {
+//                System.out.println("发送数据:" + message);
+                session.getBasicRemote().sendText(message);
+            }
+        }
+    }
+    //给指定用户发送信息
+    public void sendInfo(String userName, String message){
+        Session session = sessionPools.get(userName);
+        try {
+            sendMessage(session, message);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    //建立连接成功调用
+    @OnOpen
+    public void onOpen(Session session, @PathParam(value = "sid") String userName){
+        sessionPools.put(userName, session);
+
+        if(redisUtil==null){
+             redisUtil = SpringContextUtil.getBean(RedisUtil.class);
+        }
+        if(exchangeName==null){
+            Environment env = SpringContextUtil.getBean(Environment.class);
+             exchangeName = env.getProperty("receive.exchange.name");
+             routingKey = env.getProperty("receive.routing.key");
+             connectInfo = env.getProperty("user.connections");
+
+        }
+        WebsocketConnectInfo websocketConnectInfo=new WebsocketConnectInfo();
+        websocketConnectInfo.setUserId(userName);
+        websocketConnectInfo.setConnectServerExchange(exchangeName);
+        websocketConnectInfo.setConnectServerRoutingKey(routingKey);
+        //保证一个用户只有一个连接信息被记录
+        redisUtil.opsForList().remove(connectInfo,0,JSONObject.toJSONString(websocketConnectInfo));
+        redisUtil.opsForList().leftPush(connectInfo, JSONObject.toJSONString(websocketConnectInfo));
+        System.out.println(userName + "加入webSocket!" );
+        try {
+            sendMessage(session, "欢迎" + userName + "加入连接!");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    //关闭连接时调用
+    @OnClose
+    public void onClose(@PathParam(value = "sid") String userName){
+        sessionPools.remove(userName);
+        WebsocketConnectInfo websocketConnectInfo=new WebsocketConnectInfo();
+        websocketConnectInfo.setUserId(userName);
+        websocketConnectInfo.setConnectServerExchange(exchangeName);
+        websocketConnectInfo.setConnectServerRoutingKey(routingKey);
+        RedisUtil redisUtil = SpringContextUtil.getBean(RedisUtil.class);
+        redisUtil.opsForList().remove(connectInfo,0,JSONObject.toJSONString(websocketConnectInfo));
+        System.out.println(userName + "断开webSocket连接!当前人数为" + onlineNum);
+    }
+
+    //收到客户端信息
+    @OnMessage
+    public void onMessage(String message) throws IOException{
+        message = "客户端:" + message + ",已收到";
+        //System.out.println(message);
+        for (Session session: sessionPools.values()) {
+            try {
+                sendMessage(session, message);
+            } catch(Exception e){
+                e.printStackTrace();
+                continue;
+            }
+        }
+    }
+
+    //错误时调用
+    @OnError
+    public void onError(Session session, Throwable throwable){
+        System.out.println("发生错误");
+        throwable.printStackTrace();
+    }
+
+    public static void addOnlineCount(){
+        onlineNum.incrementAndGet();
+    }
+
+    public static void subOnlineCount() {
+        onlineNum.decrementAndGet();
+    }
+}

+ 64 - 0
message/src/main/resources/application-dev.properties

@@ -0,0 +1,64 @@
+server.port=8323
+spring.application.name=uims-message
+logging.level.root=info
+logging.path=./logs/uims_message
+#\u6570\u636E\u5E93\u914D\u7F6E
+spring.datasource.url=jdbc:mysql://114.135.61.188:33306/uims_message?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
+spring.datasource.username=root
+spring.datasource.password=100Zone@123
+spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+spring.datasource.hikari.max-lifetime=30000
+mybatis-plus.mapper-locations=classpath:mapper/*.xml
+mybatis-plus.type-aliases-package=com.huaxu.entity
+mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+
+spring.jackson.time-zone=GMT+8
+#spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+#spring.jackson.joda-date-time-format: yyyy-MM-dd HH:mm:ss
+
+# redis
+spring.redis.host=114.135.61.188
+spring.redis.port=26379
+spring.redis.password=zoniot
+spring.redis.database=2
+spring.redis.timeout=36000
+
+# Lettuce
+# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
+spring.redis.lettuce.pool.max-active=8
+# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
+spring.redis.lettuce.pool.max-wait=100
+# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
+spring.redis.lettuce.pool.max-idle=8
+# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
+spring.redis.lettuce.pool.min-idle=0
+# \u5173\u95ED\u8D85\u65F6\u65F6\u95F4
+spring.redis.lettuce.shutdown-timeout=100
+
+
+security.oauth2.client.client-id=smart-city-v2
+security.oauth2.client.client-secret=smart-city-v2-123
+security.oauth2.resource.id=smartcity-deivice-service
+security.oauth2.resource.user-info-uri=http://localhost:8321/user/principal
+security.oauth2.resource.prefer-token-info=false
+
+
+spring.servlet.multipart.max-file-size=100MB
+spring.servlet.multipart.max-request-size=100MB
+spring.servlet.multipart.location=${logging.path}/data
+######################################################RabbitMq\u914D\u7F6E#####################################################
+spring.rabbitmq.addresses=114.135.61.188:55672
+spring.rabbitmq.username=zoniot
+spring.rabbitmq.password=zcxk100
+spring.rabbitmq.virtual-host=/
+spring.rabbitmq.connection-timeout=15000
+spring.rabbitmq.publisher-confirm-type=correlated
+spring.rabbitmq.publisher-returns=true
+spring.rabbitmq.template.mandatory=true
+user.connections=userConnection
+dispath.queue=dispath
+receive.queue.name=receive
+receive.exchange.name=messageExchange
+receive.routing.key=receiveKey
+dispath.routing.key=dipathKey
+spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

+ 1 - 0
message/src/main/resources/application.properties

@@ -0,0 +1 @@
+spring.profiles.active=dev

+ 276 - 0
message/src/main/resources/mapper/MessageMapper.xml

@@ -0,0 +1,276 @@
+<?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.huaxu.dao.MessageMapper">
+    <!-- 结果集 -->
+    <resultMap type="com.huaxu.entity.Message" id="MessageMap">
+        <result property="id" column="id" jdbcType="INTEGER"/>
+        <result property="messageId" column="message_id" jdbcType="VARCHAR"/>
+        <result property="messageType" column="message_type" jdbcType="INTEGER"/>
+        <result property="messageContent" column="message_content" jdbcType="VARCHAR"/>
+        <result property="messageTemplateId" column="message_template_id" jdbcType="INTEGER"/>
+        <result property="url" column="url" jdbcType="VARCHAR"/>
+        <result property="messageStatus" column="message_status" jdbcType="INTEGER"/>
+        <result property="userId" column="user_id" jdbcType="INTEGER"/>
+        <result property="channel" column="channel" jdbcType="INTEGER"/>
+        <result property="title" column="title" jdbcType="VARCHAR"/>
+        <result property="tenantId" column="tenant_id" jdbcType="VARCHAR"/>
+        <result property="status" column="status" jdbcType="INTEGER"/>
+        <result property="dateCreate" column="date_create" jdbcType="TIMESTAMP"/>
+        <result property="createBy" column="create_by" jdbcType="VARCHAR"/>
+        <result property="updateBy" column="update_by" jdbcType="VARCHAR"/>
+        <result property="uniqueFlag" column="unique_flag" jdbcType="INTEGER"/>
+        <result property="dateUpdate" column="date_update" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <!-- 基本字段 -->
+    <sql id="Base_Column_List">
+        a.id, message_id, message_type, message_content, message_template_id, url, message_status, user_id, channel, title, tenant_id, a.status, a.date_create, a.create_by, a.update_by, unique_flag, a.date_update    </sql>
+
+    <!-- 查询单个 -->
+    <select id="selectById" resultMap="MessageMap">
+        select
+        <include refid="Base_Column_List"/>
+        from uims_message
+        where id = #{id}
+    </select>
+
+
+    <!-- 查询全部 -->
+    <select id="selectAll" resultMap="MessageMap">
+        select
+        <include refid="Base_Column_List"/>
+        from uims_message
+    </select>
+
+    <!--通过实体作为筛选条件查询-->
+    <select id="selectList" resultMap="MessageMap">
+        select
+        <include refid="Base_Column_List"/>
+        from uims_message
+        <where>
+            <if test="id != null">
+                and id = #{id}
+            </if>
+            <if test="messageId != null and messageId != ''">
+                and message_id = #{messageId}
+            </if>
+            <if test="messageType != null">
+                and message_type = #{messageType}
+            </if>
+            <if test="messageContent != null and messageContent != ''">
+                and message_content = #{messageContent}
+            </if>
+            <if test="messageTemplateId != null">
+                and message_template_id = #{messageTemplateId}
+            </if>
+            <if test="url != null and url != ''">
+                and url = #{url}
+            </if>
+            <if test="messageStatus != null">
+                and message_status = #{messageStatus}
+            </if>
+            <if test="userId != null">
+                and user_id = #{userId}
+            </if>
+            <if test="channel != null">
+                and channel = #{channel}
+            </if>
+            <if test="title != null and title != ''">
+                and title = #{title}
+            </if>
+            <if test="tenantId != null and tenantId != ''">
+                and tenant_id = #{tenantId}
+            </if>
+            <if test="status != null">
+                and status = #{status}
+            </if>
+            <if test="dateCreate != null">
+                and date_create = #{dateCreate}
+            </if>
+            <if test="createBy != null and createBy != ''">
+                and create_by = #{createBy}
+            </if>
+            <if test="updateBy != null and updateBy != ''">
+                and update_by = #{updateBy}
+            </if>
+            <if test="uniqueFlag != null">
+                and unique_flag = #{uniqueFlag}
+            </if>
+            <if test="dateUpdate != null">
+                and date_update = #{dateUpdate}
+            </if>
+        </where>
+    </select>
+
+    <!-- 新增所有列 -->
+    <insert id="insert" keyProperty="id" useGeneratedKeys="true">
+        insert into uims_message(id, message_id, message_type, message_content, message_template_id, url, message_status, user_id, channel, title, tenant_id, status, date_create, create_by, update_by, unique_flag, date_update)
+        values ( #{id}, #{messageId}, #{messageType}, #{messageContent}, #{messageTemplateId}, #{url}, #{messageStatus}, #{userId}, #{channel}, #{title}, #{tenantId}, #{status}, #{dateCreate}, #{createBy}, #{updateBy}, #{uniqueFlag}, #{dateUpdate})
+    </insert>
+
+    <!-- 批量新增 -->
+    <insert id="batchInsert">
+        insert into uims_message(id, message_id, message_type, message_content, message_template_id, url,
+        message_status, user_id, channel, title, tenant_id, status, date_create, create_by, update_by, unique_flag,
+        date_update)
+        values
+        <foreach collection="messages" item="item" index="index" separator=",">
+            (
+            #{item.id}, #{item.messageId}, #{item.messageType}, #{item.messageContent}, #{item.messageTemplateId},
+            #{item.url}, #{item.messageStatus}, #{item.userId}, #{item.channel}, #{item.title}, #{item.tenantId},
+            #{item.status}, #{item.dateCreate}, #{item.createBy}, #{item.updateBy}, #{item.uniqueFlag},
+            #{item.dateUpdate} )
+        </foreach>
+    </insert>
+
+    <!-- 通过主键修改数据 -->
+    <update id="update">
+        update uims_message.uims_message
+        <set>
+            <if test="messageId != null and messageId != ''">
+                message_id = #{messageId},
+            </if>
+            <if test="messageType != null">
+                message_type = #{messageType},
+            </if>
+            <if test="messageContent != null and messageContent != ''">
+                message_content = #{messageContent},
+            </if>
+            <if test="messageTemplateId != null">
+                message_template_id = #{messageTemplateId},
+            </if>
+            <if test="url != null and url != ''">
+                url = #{url},
+            </if>
+            <if test="messageStatus != null">
+                message_status = #{messageStatus},
+            </if>
+            <if test="userId != null">
+                user_id = #{userId},
+            </if>
+            <if test="channel != null">
+                channel = #{channel},
+            </if>
+            <if test="title != null and title != ''">
+                title = #{title},
+            </if>
+            <if test="tenantId != null and tenantId != ''">
+                tenant_id = #{tenantId},
+            </if>
+            <if test="status != null">
+                status = #{status},
+            </if>
+            <if test="dateCreate != null">
+                date_create = #{dateCreate},
+            </if>
+            <if test="createBy != null and createBy != ''">
+                create_by = #{createBy},
+            </if>
+            <if test="updateBy != null and updateBy != ''">
+                update_by = #{updateBy},
+            </if>
+            <if test="uniqueFlag != null">
+                unique_flag = #{uniqueFlag},
+            </if>
+            <if test="dateUpdate != null">
+                date_update = #{dateUpdate},
+            </if>
+        </set>
+        where id = #{id}
+    </update>
+
+
+    <!--通过主键删除-->
+    <delete id="deleteById">
+        delete from uims_message where id = #{id}
+    </delete>
+
+    <!-- 总数 -->
+    <select id="count" resultType="int">
+        select count(*) from uims_message
+    </select>
+    <select id="selectPage" resultMap="MessageMap">
+        select
+        <include refid="Base_Column_List"/>,b.type typeName
+        from uims_message a join uims_message_type b on a.message_type=b.id
+        <where>
+            <if test="message.id != null">
+                and id = #{message.id}
+            </if>
+            <if test="message.messageId != null and message.messageId != ''">
+                and message_id = #{message.messageId}
+            </if>
+            <if test="message.messageType != null">
+                and message_type = #{message.messageType}
+            </if>
+            <if test="message.messageContent != null and message.messageContent != ''">
+                and message_content = #{message.messageContent}
+            </if>
+            <if test="message.messageTemplateId != null">
+                and message_template_id = #{message.messageTemplateId}
+            </if>
+            <if test="message.url != null and message.url != ''">
+                and url = #{message.url}
+            </if>
+            <if test="message.messageStatus != null">
+                and message_status = #{message.messageStatus}
+            </if>
+            <if test="message.userId != null">
+                and user_id = #{message.userId}
+            </if>
+            <if test="message.channel != null">
+                and channel = #{message.channel}
+            </if>
+            <if test="message.title != null and message.title != ''">
+                and title = #{message.title}
+            </if>
+            <if test="message.tenantId != null and message.tenantId != ''">
+                and tenant_id = #{message.tenantId}
+            </if>
+            <if test="message.status != null">
+                and status = #{message.status}
+            </if>
+            <if test="message.dateCreate != null">
+                and date_create = #{message.dateCreate}
+            </if>
+            <if test="message.createBy != null and message.createBy != ''">
+                and create_by = #{message.createBy}
+            </if>
+            <if test="message.updateBy != null and message.updateBy != ''">
+                and update_by = #{message.updateBy}
+            </if>
+            <if test="message.uniqueFlag != null">
+                and unique_flag = #{message.uniqueFlag}
+            </if>
+            <if test="message.dateUpdate != null">
+                and date_update = #{message.dateUpdate}
+            </if>
+        </where>
+        order by a.date_update desc
+    </select>
+    <select id="queryLastMessage" resultType="com.huaxu.entity.Message">
+        select a.date_create,a.message_content,b.short_name from uims_message a join uims_message_type b
+         on a.message_type=b.id
+         where user_id=#{id}
+        order by date_create desc limit #{num}
+    </select>
+    <select id="queryUnreadMessageStatic" resultType="com.huaxu.Dto.MessageStatic">
+         select a.typeId,b.type,a.cn from (select message_type typeId ,
+         count(*)cn  from
+         uims_message where user_id=#{id} and message_status=0
+        group by message_type) a join uims_message_type b on a.typeId=b.id
+    </select>
+    <select id="getUserMessageTypeByApp" resultType="com.huaxu.Dto.MessageStatic">
+        select id typeId,0 cn,type from uims_message_type where app_id in
+        <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
+    <update id="updateMultiple">
+        update uims_message set status =#{status}
+        where id in
+        <foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </update>
+</mapper>

+ 176 - 0
message/src/main/resources/mapper/MessageTemplateMapper.xml

@@ -0,0 +1,176 @@
+<?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.huaxu.dao.MessageTemplateMapper">
+    <!-- 结果集 -->
+    <resultMap type="com.huaxu.entity.MessageTemplate" id="MessageTemplateMap">
+        <result property="id" column="id" jdbcType="INTEGER"/>
+        <result property="name" column="NAME" jdbcType="VARCHAR"/>
+        <result property="content" column="CONTENT" jdbcType="VARCHAR"/>
+        <result property="paramTotal" column="PARAM_TOTAL" jdbcType="INTEGER"/>
+        <result property="dateCreate" column="date_create" jdbcType="TIMESTAMP"/>
+        <result property="createBy" column="create_by" jdbcType="VARCHAR"/>
+        <result property="updateBy" column="update_by" jdbcType="VARCHAR"/>
+        <result property="appId" column="app_id" jdbcType="INTEGER"/>
+        <result property="dateUpdate" column="date_update" jdbcType="TIMESTAMP"/>
+        <result property="status" column="status" jdbcType="INTEGER"/>
+    </resultMap>
+
+    <!-- 基本字段 -->
+    <sql id="Base_Column_List">
+        id, NAME, CONTENT, PARAM_TOTAL, date_create, create_by, update_by, app_id, date_update, status    </sql>
+
+    <!-- 查询单个 -->
+    <select id="selectById" resultMap="MessageTemplateMap">
+        select
+        <include refid="Base_Column_List"/>
+        from uims_message_template
+        where id = #{id}
+    </select>
+
+
+    <!-- 查询全部 -->
+    <select id="selectAll" resultMap="MessageTemplateMap">
+        select
+        <include refid="Base_Column_List"/>
+        from uims_message_template
+    </select>
+
+    <!--通过实体作为筛选条件查询-->
+    <select id="selectList" resultMap="MessageTemplateMap">
+        select
+        <include refid="Base_Column_List"/>
+        from uims_message_template
+        <where>
+            <if test="id != null">
+                and id = #{id}
+            </if>
+            <if test="name != null and name != ''">
+                and NAME = #{name}
+            </if>
+            <if test="content != null and content != ''">
+                and CONTENT = #{content}
+            </if>
+            <if test="paramTotal != null">
+                and PARAM_TOTAL = #{paramTotal}
+            </if>
+            <if test="dateCreate != null">
+                and date_create = #{dateCreate}
+            </if>
+            <if test="createBy != null and createBy != ''">
+                and create_by = #{createBy}
+            </if>
+            <if test="updateBy != null and updateBy != ''">
+                and update_by = #{updateBy}
+            </if>
+            <if test="appId != null">
+                and app_id = #{appId}
+            </if>
+            <if test="dateUpdate != null">
+                and date_update = #{dateUpdate}
+            </if>
+            <if test="status != null">
+                and status = #{status}
+            </if>
+        </where>
+    </select>
+
+    <!-- 新增所有列 -->
+    <insert id="insert" keyProperty="id" useGeneratedKeys="true">
+        insert into uims_message_template(id, NAME, CONTENT, PARAM_TOTAL, date_create, create_by, update_by, app_id, date_update, status)
+        values ( #{id}, #{name}, #{content}, #{paramTotal}, #{dateCreate}, #{createBy}, #{updateBy}, #{appId}, #{dateUpdate}, #{status})
+    </insert>
+
+    <!-- 批量新增 -->
+    <insert id="batchInsert">
+        insert into uims_message_template(id, NAME, CONTENT, PARAM_TOTAL, date_create, create_by, update_by, app_id,
+        date_update, status)
+        values
+        <foreach collection="messageTemplates" item="item" index="index" separator=",">
+            (
+            #{item.id}, #{item.name}, #{item.content}, #{item.paramTotal}, #{item.dateCreate}, #{item.createBy},
+            #{item.updateBy}, #{item.appId}, #{item.dateUpdate}, #{item.status} )
+        </foreach>
+    </insert>
+
+    <!-- 通过主键修改数据 -->
+    <update id="update">
+        update uims_message.uims_message_template
+        <set>
+            <if test="name != null and name != ''">
+                NAME = #{name},
+            </if>
+            <if test="content != null and content != ''">
+                CONTENT = #{content},
+            </if>
+            <if test="paramTotal != null">
+                PARAM_TOTAL = #{paramTotal},
+            </if>
+            <if test="dateCreate != null">
+                date_create = #{dateCreate},
+            </if>
+            <if test="createBy != null and createBy != ''">
+                create_by = #{createBy},
+            </if>
+            <if test="updateBy != null and updateBy != ''">
+                update_by = #{updateBy},
+            </if>
+            <if test="appId != null">
+                app_id = #{appId},
+            </if>
+            <if test="dateUpdate != null">
+                date_update = #{dateUpdate},
+            </if>
+            <if test="status != null">
+                status = #{status},
+            </if>
+        </set>
+        where id = #{id}
+    </update>
+
+    <!--通过主键删除-->
+    <delete id="deleteById">
+        delete from uims_message_template where id = #{id}
+    </delete>
+
+    <!-- 总数 -->
+    <select id="count" resultType="int">
+        select count(*) from uims_message_template
+    </select>
+    <select id="selectPage" resultMap="MessageTemplateMap">
+        select
+        <include refid="Base_Column_List"/>
+        from uims_message_template
+        <where>
+            <if test="messageTemplate.id != null">
+                and id = #{messageTemplate.id}
+            </if>
+            <if test="messageTemplate.name != null and messageTemplate.name != ''">
+                and NAME = #{messageTemplate.name}
+            </if>
+            <if test="messageTemplate.content != null and messageTemplate.content != ''">
+                and CONTENT = #{messageTemplate.content}
+            </if>
+            <if test="messageTemplate.paramTotal != null">
+                and PARAM_TOTAL = #{messageTemplate.paramTotal}
+            </if>
+            <if test="messageTemplate.dateCreate != null">
+                and date_create = #{messageTemplate.dateCreate}
+            </if>
+            <if test="messageTemplate.createBy != null and messageTemplate.createBy != ''">
+                and create_by = #{messageTemplate.createBy}
+            </if>
+            <if test="messageTemplate.updateBy != null and messageTemplate.updateBy != ''">
+                and update_by = #{messageTemplate.updateBy}
+            </if>
+            <if test="messageTemplate.appId != null">
+                and app_id = #{messageTemplate.appId}
+            </if>
+            <if test="messageTemplate.dateUpdate != null">
+                and date_update = #{messageTemplate.dateUpdate}
+            </if>
+            <if test="messageTemplate.status != null">
+                and status = #{messageTemplate.status}
+            </if>
+        </where>
+    </select>
+</mapper>

+ 181 - 0
message/src/main/resources/mapper/MessageTypeMapper.xml

@@ -0,0 +1,181 @@
+<?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.huaxu.dao.MessageTypeMapper">
+    <!-- 结果集 -->
+    <resultMap type="com.huaxu.entity.MessageType" id="MessageTypeMap">
+        <result property="id" column="id" jdbcType="INTEGER"/>
+        <result property="type" column="type" jdbcType="VARCHAR"/>
+        <result property="path" column="path" jdbcType="VARCHAR"/>
+        <result property="dateCreate" column="date_create" jdbcType="TIMESTAMP"/>
+        <result property="appId" column="app_id" jdbcType="VARCHAR"/>
+        <result property="createBy" column="create_by" jdbcType="VARCHAR"/>
+        <result property="updateBy" column="update_by" jdbcType="VARCHAR"/>
+        <result property="status" column="status" jdbcType="INTEGER"/>
+        <result property="dateUpdate" column="date_update" jdbcType="TIMESTAMP"/>
+        <result property="shortName" column="short_name" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <!-- 基本字段 -->
+    <sql id="Base_Column_List">
+        id, type, path, date_create, app_id, create_by, update_by, status, date_update, short_name    </sql>
+
+    <!-- 查询单个 -->
+    <select id="selectById" resultMap="MessageTypeMap">
+        select
+        <include refid="Base_Column_List"/>
+        from uims_message_type
+        where id = #{id}
+    </select>
+
+
+    <!-- 查询全部 -->
+    <select id="selectAll" resultMap="MessageTypeMap">
+        select
+        <include refid="Base_Column_List"/>
+        from uims_message_type
+    </select>
+
+    <!--通过实体作为筛选条件查询-->
+    <select id="selectList" resultMap="MessageTypeMap">
+        select
+        <include refid="Base_Column_List"/>
+        from uims_message_type
+        <where>
+            <if test="id != null">
+                and id = #{id}
+            </if>
+            <if test="type != null and type != ''">
+                and type = #{type}
+            </if>
+            <if test="path != null and path != ''">
+                and path = #{path}
+            </if>
+            <if test="dateCreate != null">
+                and date_create = #{dateCreate}
+            </if>
+            <if test="appId != null and appId != ''">
+                and app_id = #{appId}
+            </if>
+            <if test="createBy != null and createBy != ''">
+                and create_by = #{createBy}
+            </if>
+            <if test="updateBy != null and updateBy != ''">
+                and update_by = #{updateBy}
+            </if>
+            <if test="status != null">
+                and status = #{status}
+            </if>
+            <if test="dateUpdate != null">
+                and date_update = #{dateUpdate}
+            </if>
+            <if test="shortName != null and shortName != ''">
+                and short_name = #{shortName}
+            </if>
+        </where>
+    </select>
+
+    <!-- 新增所有列 -->
+    <insert id="insert" keyProperty="id" useGeneratedKeys="true">
+        insert into uims_message_type(id, type, path, date_create, app_id, create_by, update_by, status, date_update,
+                                      short_name)
+        values (#{id}, #{type}, #{path}, #{dateCreate}, #{appId}, #{createBy}, #{updateBy}, #{status}, #{dateUpdate},
+                #{shortName})
+    </insert>
+
+    <!-- 批量新增 -->
+    <insert id="batchInsert">
+        insert into uims_message_type(id, type, path, date_create, app_id, create_by, update_by, status, date_update,
+        short_name)
+        values
+        <foreach collection="messageTypes" item="item" index="index" separator=",">
+            (
+            #{item.id}, #{item.type}, #{item.path}, #{item.dateCreate}, #{item.appId}, #{item.createBy},
+            #{item.updateBy}, #{item.status}, #{item.dateUpdate}, #{item.shortName} )
+        </foreach>
+    </insert>
+
+    <!-- 通过主键修改数据 -->
+    <update id="update">
+        update uims_message.uims_message_type
+        <set>
+            <if test="type != null and type != ''">
+                type = #{type},
+            </if>
+            <if test="path != null and path != ''">
+                path = #{path},
+            </if>
+            <if test="dateCreate != null">
+                date_create = #{dateCreate},
+            </if>
+            <if test="appId != null and appId != ''">
+                app_id = #{appId},
+            </if>
+            <if test="createBy != null and createBy != ''">
+                create_by = #{createBy},
+            </if>
+            <if test="updateBy != null and updateBy != ''">
+                update_by = #{updateBy},
+            </if>
+            <if test="status != null">
+                status = #{status},
+            </if>
+            <if test="dateUpdate != null">
+                date_update = #{dateUpdate},
+            </if>
+            <if test="shortName != null and shortName != ''">
+                short_name = #{shortName},
+            </if>
+        </set>
+        where id = #{id}
+    </update>
+
+    <!--通过主键删除-->
+    <delete id="deleteById">
+        delete
+        from uims_message_type
+        where id = #{id}
+    </delete>
+
+    <!-- 总数 -->
+    <select id="count" resultType="int">
+        select count(*)
+        from uims_message_type
+    </select>
+    <select id="selectPage" resultMap="MessageTypeMap">
+        select
+        <include refid="Base_Column_List"/>
+        from uims_message_type
+        <where>
+            <if test="messageType.id != null">
+                and id = #{messageType.id}
+            </if>
+            <if test="messageType.type != null and messageType.type != ''">
+                and type = #{messageType.type}
+            </if>
+            <if test="messageType.path != null and messageType.path != ''">
+                and path = #{messageType.path}
+            </if>
+            <if test="messageType.dateCreate != null">
+                and date_create = #{messageType.dateCreate}
+            </if>
+            <if test="messageType.appId != null and messageType.appId != ''">
+                and app_id = #{messageType.appId}
+            </if>
+            <if test="messageType.createBy != null and messageType.createBy != ''">
+                and create_by = #{messageType.createBy}
+            </if>
+            <if test="messageType.updateBy != null and messageType.updateBy != ''">
+                and update_by = #{messageType.updateBy}
+            </if>
+            <if test="messageType.status != null">
+                and status = #{messageType.status}
+            </if>
+            <if test="messageType.dateUpdate != null">
+                and date_update = #{messageType.dateUpdate}
+            </if>
+            <if test="messageType.shortName != null and messageType.shortName != ''">
+                and short_name = #{messageType.shortName}
+            </if>
+        </where>
+    </select>
+</mapper>

+ 1 - 0
user_auth/src/main/resources/mapper/UserMapper.xml

@@ -288,6 +288,7 @@
         SELECT
         a.id as "id" ,
         a.parent_menu_id as "parentMenuId" ,
+        a.app_id as appId,
         b.MENU_NAME as "name" ,
         b.MENU_IMAGE as "menuImage" ,
         a.permission_flag as "permissionFlag" ,