Browse Source

添加删除交付物时间

master
zhangye 6 years ago
parent
commit
7afb983c6c
  1. 5
      tall/src/main/java/com/ccsens/tall/bean/vo/DeliverVo.java
  2. 1
      tall/src/main/java/com/ccsens/tall/config/SpringConfig.java
  3. 29
      tall/src/main/java/com/ccsens/tall/rabbitMQ/RabbitController.java
  4. 3
      tall/src/main/java/com/ccsens/tall/service/IProTaskDetailService.java
  5. 9
      tall/src/main/java/com/ccsens/tall/service/MessageService.java
  6. 8
      tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java
  7. 2
      tall/src/main/java/com/ccsens/tall/service/TaskDeliverService.java
  8. 14
      tall/src/main/java/com/ccsens/tall/service/TaskSubTimeService.java
  9. 2
      tall/src/main/java/com/ccsens/tall/service/UserAttentionService.java
  10. 24
      tall/src/main/java/com/ccsens/tall/web/DebugController.java
  11. 2
      tall/src/main/java/com/ccsens/tall/web/UserController.java
  12. 2
      tall/src/main/resources/application-dev.yml
  13. 2
      tall/src/main/resources/druid-dev.yml
  14. 2
      tall/src/main/resources/mapper_dao/DeliverDao.xml
  15. 5
      tall/src/main/resources/mapper_dao/TaskDetailDao.xml
  16. 2
      util/src/main/java/com/ccsens/util/CodeEnum.java
  17. 353
      util/src/main/java/com/ccsens/util/JacksonUtil.java
  18. 25
      util/src/main/java/com/ccsens/util/WechatUtil.java
  19. 4
      util/src/main/java/com/ccsens/util/bean/BaseVo.java
  20. 31
      util/src/main/java/com/ccsens/util/bean/message/client/AckMessage.java
  21. 37
      util/src/main/java/com/ccsens/util/bean/message/client/AuthMessage.java
  22. 17
      util/src/main/java/com/ccsens/util/bean/message/client/ClientAuthTimeOutMessage.java
  23. 17
      util/src/main/java/com/ccsens/util/bean/message/client/ClientIdleClosedMessage.java
  24. 17
      util/src/main/java/com/ccsens/util/bean/message/client/GetStatusMessage.java
  25. 37
      util/src/main/java/com/ccsens/util/bean/message/client/HasReadMessage.java
  26. 32
      util/src/main/java/com/ccsens/util/bean/message/client/PingMessage.java
  27. 32
      util/src/main/java/com/ccsens/util/bean/message/client/SetDeletedStatusMessage.java
  28. 32
      util/src/main/java/com/ccsens/util/bean/message/client/SetRevertedStatusMessage.java
  29. 32
      util/src/main/java/com/ccsens/util/bean/message/client/SetSuccessStatusMessage.java
  30. 32
      util/src/main/java/com/ccsens/util/bean/message/client/UnExceptedErrorMessage.java
  31. 95
      util/src/main/java/com/ccsens/util/bean/message/common/InMessage.java
  32. 134
      util/src/main/java/com/ccsens/util/bean/message/common/Message.java
  33. 217
      util/src/main/java/com/ccsens/util/bean/message/common/MessageConstant.java
  34. 80
      util/src/main/java/com/ccsens/util/bean/message/common/MessageRule.java
  35. 71
      util/src/main/java/com/ccsens/util/bean/message/common/OutMessage.java
  36. 43
      util/src/main/java/com/ccsens/util/bean/message/common/OutMessageSet.java
  37. 11
      util/src/main/java/com/ccsens/util/bean/message/common/ServerMessage.java
  38. 37
      util/src/main/java/com/ccsens/util/bean/message/server/ChannelStatusMessage.java
  39. 29
      util/src/main/java/com/ccsens/util/bean/message/server/InvertedMessage.java
  40. 15
      util/src/main/java/com/ccsens/util/bean/message/server/PongMessage.java
  41. 31
      util/src/main/java/com/ccsens/util/bean/message/server/QueueStatusMessage.java
  42. 50
      util/src/main/java/com/ccsens/util/bean/message/server/ServerAckMessage.java
  43. 8
      util/src/main/java/com/ccsens/util/config/RabbitMQConfig.java
  44. 188
      util/util.iml~a7021fc1febcde2a8cd0fb8c6b2c75bbd877fb57

5
tall/src/main/java/com/ccsens/tall/bean/vo/DeliverVo.java

@ -7,6 +7,7 @@ import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
import java.util.List;
@Data
public class DeliverVo {
@ -30,10 +31,14 @@ public class DeliverVo {
private Long fileId;
@JsonIgnore
private Long postLogId;
@JsonIgnore
private Date updateTime;
@ApiModelProperty("交付物详情(备注)")
private String description;
@ApiModelProperty("上传交付物的时间")
private Long time;
@ApiModelProperty("上传交付物的时间")
private Long deleteTime;
@ApiModelProperty("交付物访问路径")
private String url;
@ApiModelProperty("是否是历史交付物 1是 0不是")

1
tall/src/main/java/com/ccsens/tall/config/SpringConfig.java

@ -131,6 +131,7 @@ public class SpringConfig implements WebMvcConfigurer {
.excludePathPatterns("/users/password")
.excludePathPatterns("/users/account")
.excludePathPatterns("/users/token")
.excludePathPatterns("/users/claims")
.addPathPatterns("/plugins/**")
.addPathPatterns("/delivers/**")
.addPathPatterns("/tasks/**")

29
tall/src/main/java/com/ccsens/tall/rabbitMQ/RabbitController.java

@ -0,0 +1,29 @@
package com.ccsens.tall.rabbitMQ;
import com.ccsens.util.config.RabbitMQConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@RabbitListener(queues = RabbitMQConfig.TALL_MESSAGE_2)
public class RabbitController {
private Logger logger = LoggerFactory.getLogger(RabbitController.class);
@RabbitHandler
public void process(String messageJson) {
logger.info("Rabbit Received: {}",messageJson);
try {
System.out.println("Rabbit Received: " + messageJson);
}catch (Exception e){
e.printStackTrace();
}
}
}

3
tall/src/main/java/com/ccsens/tall/service/IProTaskDetailService.java

@ -1,6 +1,7 @@
package com.ccsens.tall.service;
import com.ccsens.tall.bean.dto.TaskDto;
import com.ccsens.tall.bean.po.ProSubTimeMember;
import com.ccsens.tall.bean.po.ProTaskDetail;
import com.ccsens.tall.bean.vo.TaskVo;
@ -21,6 +22,8 @@ public interface IProTaskDetailService {
TaskVo.NormalTask selectTaskByParentId(Long parentId, Long startTime, Long endTime);
ProSubTimeMember getProcessByUserIdAndTask(Long userId, Long subTimeId) throws Exception;
void deleteTask(Long currentUserId,Long taskId) throws Exception;
void deleteTaskByRoleId(Long taskId) throws Exception;

9
tall/src/main/java/com/ccsens/tall/service/MessageService.java

@ -59,7 +59,7 @@ public class MessageService implements IMessageService{
SyncMessageWithStartDto message = new SyncMessageWithStartDto(projectId, sender, receivers, roleId, taskId, null, time, duration);
//FixMe 发送到消息队列
rabbitTemplate.convertAndSend(RabbitMQConfig.RabbitMQ_QUEUE_NAME,
rabbitTemplate.convertAndSend(RabbitMQConfig.TALL_MESSAGE_1,
JacksonUtil.beanToJson(message));
}
}
@ -68,7 +68,7 @@ public class MessageService implements IMessageService{
public void sendDeliverMessageWithUpload(DeliverMessageWithUploadDto uploadMessage) throws Exception {
System.out.println(JacksonUtil.beanToJson(message));
//FixMe 发送到消息队列
rabbitTemplate.convertAndSend(RabbitMQConfig.RabbitMQ_QUEUE_NAME,
rabbitTemplate.convertAndSend(RabbitMQConfig.TALL_MESSAGE_1,
JacksonUtil.beanToJson(message));
}
@ -76,7 +76,7 @@ public class MessageService implements IMessageService{
public void sendDeliverMessageWithChecker(DeliverMessageWithCheckerDto message) throws Exception {
System.out.println(JacksonUtil.beanToJson(message));
//FixMe 发送到消息队列
rabbitTemplate.convertAndSend(RabbitMQConfig.RabbitMQ_QUEUE_NAME,
rabbitTemplate.convertAndSend(RabbitMQConfig.TALL_MESSAGE_1,
JacksonUtil.beanToJson(message));
}
@ -84,7 +84,8 @@ public class MessageService implements IMessageService{
public void sendDeliverMessageWithDelete(DeliverMessageWithDeleteDto message) throws Exception {
System.out.println(JacksonUtil.beanToJson(message));
//FixMe 发送到消息队列
rabbitTemplate.convertAndSend(RabbitMQConfig.RabbitMQ_QUEUE_NAME,
rabbitTemplate.convertAndSend(RabbitMQConfig.TALL_MESSAGE_1 ,
JacksonUtil.beanToJson(message));
}
}

8
tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java

@ -799,7 +799,8 @@ public class ProTaskDetailService implements IProTaskDetailService {
/**
* 查看任务的完成状态
*/
private ProSubTimeMember getProcessByUserIdAndTask(Long userId, Long subTimeId) throws Exception {
@Override
public ProSubTimeMember getProcessByUserIdAndTask(Long userId, Long subTimeId) throws Exception {
ProSubTimeMember subTimeMember = null;
ProTaskSubTime subTime = taskSubTimeDao.selectByPrimaryKey(subTimeId);
ProTaskDetail taskDetail = taskDetailDao.selectByPrimaryKey(subTime.getTaskDetailId());
@ -829,6 +830,7 @@ public class ProTaskDetailService implements IProTaskDetailService {
//查找任务负责人下的所有成员
List<ProMember> memberList = proMemberService.selectByRole(taskDetail.getExecutorRole());
if (CollectionUtil.isNotEmpty(memberList)) {
boolean flag = false;
for (ProMember member : memberList) {
ProSubTimeMemberExample subTimeMemberExample = new ProSubTimeMemberExample();
subTimeMemberExample.createCriteria().andTaskSubTimeIdEqualTo(subTimeId)
@ -836,10 +838,14 @@ public class ProTaskDetailService implements IProTaskDetailService {
subTimeMemberExample.setOrderByClause("real_finish_time");
List<ProSubTimeMember> subTimeMemberList = proSubTimeMemberDao.selectByExample(subTimeMemberExample);
if (CollectionUtil.isEmpty(subTimeMemberList)) {
flag = true;
break;
}
subTimeMember = subTimeMemberList.get(0);
}
if(flag){
subTimeMember = null;
}
}
}
}

2
tall/src/main/java/com/ccsens/tall/service/TaskDeliverService.java

@ -433,6 +433,7 @@ public class TaskDeliverService implements ITaskDeliverService {
List<DeliverVo.FilePath> fileIds = taskDeliverDao.selectFileIdByDeliverId(deliver.getId(), subTimeId);
if (CollectionUtil.isNotEmpty(fileIds)) {
for (DeliverVo.FilePath filePath : fileIds) {
filePath.setDeleteTime(filePath.getUpdateTime().getTime());
//修改文件路径为可下载路径
filePath.setUrl(WebConstant.TEST_URL_BASE + filePath.getUrl());
if (ObjectUtil.isNotNull(filePath.getUploaderId())) {
@ -696,6 +697,7 @@ public class TaskDeliverService implements ITaskDeliverService {
if (currentUserId.longValue() == deliverPostLog.getUserId().longValue()) {
if (deliverPostLog.getIsHistory() == 0) {
deliverPostLog.setIsHistory(1);
deliverPostLog.setUpdatedAt(new Date());
deliverPostLogDao.updateByPrimaryKeySelective(deliverPostLog);
}
ProTaskDeliverPostLogCheckerExample checkerExample = new ProTaskDeliverPostLogCheckerExample();

14
tall/src/main/java/com/ccsens/tall/service/TaskSubTimeService.java

@ -47,6 +47,8 @@ public class TaskSubTimeService implements ITaskSubTimeService {
@Autowired
private IProMemberService proMemberService;
@Autowired
private IProTaskDetailService taskDetailService;
@Autowired
private IMessageService messageService;
@Autowired
private IProLogService proLogService;
@ -69,17 +71,20 @@ public class TaskSubTimeService implements ITaskSubTimeService {
//查找taskSubTime
ProTaskSubTime taskSubTime = taskSubTimeDao.selectByPrimaryKey(subTimeId.getId());
if(ObjectUtil.isNull(taskSubTime)){
log.info("找不到此任务:subTimeId{}",subTimeId.getId());
throw new BaseException(CodeEnum.NOT_TASK);
}
//查找taskDetail
ProTaskDetail taskDetail = taskDetailDao.selectByPrimaryKey(taskSubTime.getTaskDetailId());
if(ObjectUtil.isNull(taskDetail)){
log.info("找不到此任务:taskId{}",taskSubTime.getTaskDetailId());
throw new BaseException(CodeEnum.NOT_TASK);
}
//该用户是否是任务的负责人
ProRole role = proRoleDao.selectByPrimaryKey(taskDetail.getExecutorRole());
Boolean isBelongRole = proMemberService.userIsBelongRole(currentUserId, role.getId());
if (!role.getName().equalsIgnoreCase(WebConstant.ROLE_NAME.AllMember.phase) && !isBelongRole) {
log.info("此用户不是该任务的检查人:{}",role);
throw new BaseException(CodeEnum.IS_NOT_EXECUTOR);
}
//查找此用户在任务下的成员
@ -88,12 +93,13 @@ public class TaskSubTimeService implements ITaskSubTimeService {
if(taskDetail.getFinishNeedAll()==0) {
//是否有分组
if (taskDetail.getHasGroup() == 1) {
//查找分组下的任务(taskSubTime)
//检查分组下的任务的完成状态
List<ProTaskSubTime> subTimeList = taskDetailDao.selectSubTaskByGroupId(taskDetail.getId(), taskSubTime.getBeginTime(), taskSubTime.getEndTime());
if (CollectionUtil.isNotEmpty(subTimeList)) {
if(CollectionUtil.isNotEmpty(subTimeList)){
for (ProTaskSubTime subTime : subTimeList) {
//是否有未完成的任务
if (subTime.getComplatedStatus() != 2) {
ProSubTimeMember subTimeMember = taskDetailService.getProcessByUserIdAndTask(currentUserId, subTime.getId());
if(ObjectUtil.isNull(subTimeMember) || subTimeMember.getComplatedStatus() != 2){
log.info("分组下任务未全部完成:{}",subTime.getId());
throw new BaseException(CodeEnum.SUB_TASK_IS_NOT_FINISH);
}
}

2
tall/src/main/java/com/ccsens/tall/service/UserAttentionService.java

@ -48,6 +48,8 @@ public class UserAttentionService implements IUserAttentionService{
projectList.add(sysProject);
}
}
}else {
log.info("该用户没有关注的项目");
}
return projectList;
}

24
tall/src/main/java/com/ccsens/tall/web/DebugController.java

@ -1,9 +1,16 @@
package com.ccsens.tall.web;
import com.ccsens.util.JacksonUtil;
import com.ccsens.util.JsonResponse;
import com.ccsens.util.bean.message.common.InMessage;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import com.ccsens.util.config.RabbitMQConfig;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@ -14,6 +21,9 @@ import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping("/debug")
public class DebugController {
@Autowired
private AmqpTemplate rabbitTemplate;
@ApiOperation(value = "/测试",notes = "")
@ApiImplicitParams({
@ -25,5 +35,19 @@ public class DebugController {
}
@ApiOperation(value = "消息测试",notes = "")
@ApiImplicitParams({
})
@RequestMapping(value="message",method = RequestMethod.GET,produces = {"application/json;charset=UTF-8"})
public JsonResponse messageTest(HttpServletRequest request) throws Exception {
ServerMessage serverMessage = new ServerMessage();
serverMessage.setType("Ping");
InMessage inMessage = InMessage.newToServerMessage(MessageConstant.DomainType.Server,serverMessage);
String j = JacksonUtil.beanToJson(inMessage);
System.out.println(j);
//FixMe 发送到消息队列
rabbitTemplate.convertAndSend(RabbitMQConfig.TALL_MESSAGE_1,j);
return JsonResponse.newInstance().ok(j);
}
}

2
tall/src/main/java/com/ccsens/tall/web/UserController.java

@ -194,7 +194,7 @@ public class UserController {
@ApiImplicitParam(name="token",value = "token",required = true,paramType = "query")
})
@RequestMapping(value = "claims",method = RequestMethod.GET,produces = {"application/json;charset=UTF-8"})
public JsonResponse<UserVo.TokenToUserId> getNodeMessage(HttpServletRequest request, @RequestParam(required = true) String token) throws Exception {
public JsonResponse<UserVo.TokenToUserId> getNodeMessage(@RequestParam(required = true) String token) throws Exception {
//验证token是否有效
UserVo.TokenToUserId tokenToUserId = new UserVo.TokenToUserId();
Claims claims = null;

2
tall/src/main/resources/application-dev.yml

@ -8,7 +8,7 @@ spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
rabbitmq:
host: api.ccsens.com
host: 49.233.89.188
password: 111111
port: 5672
username: admin

2
tall/src/main/resources/druid-dev.yml

@ -27,7 +27,7 @@ spring:
testOnReturn: false
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
url: jdbc:mysql://49.233.89.188:3306/tall?useUnicode=true&characterEncoding=UTF-8
url: jdbc:mysql://49.233.89.188:3306/tall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
validationQuery: SELECT 1 FROM DUAL
env: CCSENS_TALL

2
tall/src/main/resources/mapper_dao/DeliverDao.xml

@ -36,6 +36,7 @@
<resultMap id="resultMap_FilePath" type="com.ccsens.tall.bean.vo.DeliverVo$FilePath">
<id column="fileId" property="fileId"/>
<id column="postLogId" property="postLogId"/>
<result column="updateTime" property="updateTime"/>
<result column="description" property="description"/>
<result column="url" property="url"/>
<result column="uploadTime" property="time"/>
@ -131,6 +132,7 @@
SELECT
l.id as postLogId,
f.id as fileId,
l.updated_at as updateTime,
l.description as description,
f.path as url,
l.time as uploadTime,

5
tall/src/main/resources/mapper_dao/TaskDetailDao.xml

@ -184,7 +184,10 @@
<select id="selectSubTaskByGroupId" parameterType="java.util.Map"
resultType="com.ccsens.tall.bean.po.ProTaskSubTime">
SELECT
*
s.id,
s.begin_time,
s.end_time,
s.complated_status
FROM
t_pro_task_sub_time s JOIN t_pro_task_detail t ON s.task_detail_id = t.id
WHERE

2
util/src/main/java/com/ccsens/util/CodeEnum.java

@ -52,7 +52,7 @@ public enum CodeEnum {
NOT_DELIVER_FILE(40,"对不起,找不到文件",true),
IS_NOT_EXECUTOR(41,"对不起,您不是该任务负责人",true),
NOT_CHECKER(42,"请选择检查人",true),
SUB_TASK_IS_NOT_FINISH(43,"分组内任务未全部完成",true),
SUB_TASK_IS_NOT_FINISH(43,"分组内任务未全部完成,无法完成任务",true),
IS_NOT_CHECKER(44,"您不是该交付物的检查人",true),
NOT_POWER(45,"对不起,您的权限不足,无法进行此操作",true),
SMS_CODE_CORRECT(46,"验证信息错误",true),

353
util/src/main/java/com/ccsens/util/JacksonUtil.java

@ -1,13 +1,13 @@
package com.ccsens.util;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.IOException;
@ -15,141 +15,298 @@ import java.io.InputStream;
import java.util.List;
import java.util.Map;
/**
* @author wei
* @date 2019.11.25
*/
public class JacksonUtil {
private static ObjectMapper getDefaultObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
private static ObjectMapper objectMapper = new ObjectMapper();
private static XmlMapper xmlMapper = new XmlMapper();
static {
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
return objectMapper;
}
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
private static XmlMapper getDefaultXmlMapper() {
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
return xmlMapper;
}
public static <T> T jsonToBean(String json, Class<T> clazz, boolean isSet) throws IOException {
T t = null;
if (!isSet)
t = getDefaultObjectMapper().readValue(json, clazz);
else
t = getDefaultObjectMapper().readValue(json, new TypeReference<T>() {});
return t;
}
public static <T> T jsonToBean(String json, Class<T> clazz) throws IOException {
return jsonToBean(json,clazz,false);
}
/**
* 获取泛型的Collection Type
* eg: collectionClass==List.class elementClasses == MessageBean.class 则返回 List<MessageBean>对应的java类型
* @param collectionClass 泛型的Collection
* @param elementClasses 元素类
* @return JavaType Java类型
* @since 1.0
*/
public static JavaType getCollectionType(ObjectMapper mapper, Class<?> collectionClass, Class<?>... elementClasses) {
private static JavaType getCollectionType(ObjectMapper mapper, Class<?> collectionClass, Class<?>... elementClasses) {
return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
}
//------------------------------------ Json and Bean ----------------------------0
public static <T> List<T> jsonToBean(String json, Class<T> clazz, Class<?> setClazz) throws IOException {
List<T> tList = null;
ObjectMapper mapper = getDefaultObjectMapper();
JavaType javaType = getCollectionType(mapper,setClazz,clazz);
tList = getDefaultObjectMapper().readValue(json, javaType);
return tList;
/**
* Json And Bean Converter
* @param json 要转换的json
* @param clazz 目标类型类对象
* @param isSet 是否集合类型
* @param <T> 目标类型
* @return 集合如果只有1个对象则添加到集合中返回
* @throws IOException IO异常
*/
public static <T> List<T> jsonToBean(String json, Class<T> clazz, boolean isSet) throws IOException {
if (!isSet) {
return CollectionUtil.newArrayList(objectMapper.readValue(json, clazz));
}
else {
JavaType javaType = getCollectionType(objectMapper,List.class,clazz);
return objectMapper.readValue(json, javaType);
}
}
public static <T> String beanToJson(T bean) throws JsonProcessingException {
String json = null;
json = getDefaultObjectMapper().writeValueAsString(bean);
return json;
public static <T> T jsonToBean(String json, Class<T> clazz) throws IOException {
return objectMapper.readValue(json, clazz);
}
public static <T> String beanToJson(T bean, boolean pretty) throws JsonProcessingException {
String json = null;
if (!pretty)
json = getDefaultObjectMapper().writeValueAsString(bean);
else
json = getDefaultObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(bean);
return json;
if (!pretty) {
return objectMapper.writeValueAsString(bean);
}
else {
return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(bean);
}
}
public static <T> String beanToJson(T bean) throws JsonProcessingException {
return beanToJson(bean,false);
}
//------------------------------------ Json and Map ----------------------------0
/**
* Json And Map Converter
*
* @param json 要转换的json
* eg: {"time":"1574602523","from":{"id":"1","name":"zs"},"to":[{"id":"1","name":"ls","avatar":"xx.jpg"}],"rule":{"offlineDiscard":1}}
* @return Map<String,Object> 如果value还是一个json对象则也会被转化为map
* eg: entry1: "time"->String entry2: "from"--> Map<id:1,name:zs> entry3: "to"->List<Map> entry4: "rule"-->Map
* @throws IOException
*/
public static Map<String,Object> jsonToMap(String json) throws IOException {
Map<String,Object> map = null;
ObjectMapper mapper = getDefaultObjectMapper();
map = getDefaultObjectMapper().readValue(json,Map.class);
return map;
JavaType javaType = getCollectionType(objectMapper,Map.class,String.class,Object.class);
return objectMapper.readValue(json,javaType);
}
public static String mapToJson(Map<String,String> map) throws JsonProcessingException {
String json = null;
json = getDefaultObjectMapper().writeValueAsString(map);
return json;
public static String mapToJson(Map<String,Object> map,boolean pretty) throws JsonProcessingException {
if(!pretty){
return objectMapper.writeValueAsString(map);
}else{
return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(map);
}
}
public static String mapToJson(Map<String,Object> map) throws JsonProcessingException {
return mapToJson(map,false);
}
public static <T> T mapToBean(Map<String,String> map,Class<T> clazz) {
/**
* Map And Bean Converter
* @param map 要转换的集合
* @param clazz 目标类型类对象
* @param <T> 目标类型
* @return JavaBean
* @throws IOException IO异常
*/
public static <T> T mapToBean(Map<String,Object> map,Class<T> clazz) throws IOException {
return jsonToBean(mapToJson(map),clazz);
}
try {
return jsonToBean(mapToJson(map),clazz,false);
} catch (IOException e) {
e.printStackTrace();
public static <T> Map<String,Object> beanToMap(T bean) throws IOException {
return jsonToMap(beanToJson(bean));
}
/**
* Xml And Bean Converter
* Javabean可以使用Jackson xml标注 @JacksonXmlRootElement(localName = "Class") 指定root元素名称
* 其他标注@JacksonXmlElementWrapper(localName = "Students")指定List类型包装元素名称比如学生列表 @JacksonXmlProperty(localName = "Stu") 指定字段元素名称比如学生
* @param bean 要转换的JavaBean
* @param root xml root元素名称建议使用@JacksonXmlElementWrapper表示
* @param pretty 是否启用pretty模式
* @param <T> Javabean类型
* @return xml字符串
* @throws JsonProcessingException Json处理异常
*/
public static <T> String beanToXml(T bean,String root,boolean pretty) throws JsonProcessingException {
if(!pretty) {
if(StrUtil.isEmpty(root)) {
return xmlMapper.writeValueAsString(bean);
}else{
return xmlMapper.writer().with(SerializationFeature.WRAP_ROOT_VALUE).withRootName(root).writeValueAsString(bean);
}
}else{
if(StrUtil.isEmpty(root)) {
return xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(bean);
}else{
return xmlMapper.writer().with(SerializationFeature.WRAP_ROOT_VALUE).withRootName(root).withDefaultPrettyPrinter().writeValueAsString(bean);
}
}
return null;
}
//------------------------------------ Xml and Bean ----------------------------0
public static <T> T xmlToBean(InputStream xmlInStream, Class<T> clazz) throws IOException {
T t = null;
t = getDefaultXmlMapper().readValue(xmlInStream, clazz);
return t;
public static <T> String beanToXml(T bean,String root) throws JsonProcessingException {
return beanToXml(bean,root,false);
}
public static <T> String beanToXml(T bean,boolean pretty) throws JsonProcessingException {
return beanToXml(bean,null,pretty);
}
public static <T> String beanToXml(T bean) throws JsonProcessingException {
String xmlString = null;
xmlString = getDefaultXmlMapper().writeValueAsString(bean);
return xmlString;
}
//这个方法可能有点问题,必须配合其他jar包才能使用
// <dependency>
// <groupId>org.codehaus.woodstox</groupId>
// <artifactId>woodstox-core-asl</artifactId>
// <version>4.4.1</version>
// </dependency>
// public static <T> String beanToXml(T bean, boolean pretty) throws JsonProcessingException {
//
// String xmlString = null;
// if (!pretty)
// xmlString = getDefaultXmlMapper().writeValueAsString(bean);
// else
// xmlString = getDefaultXmlMapper().writerWithDefaultPrettyPrinter().writeValueAsString(bean);
// return xmlString;
// }
return beanToXml(bean,null,false);
}
public static <T> String beanToXml(T bean,String root) throws JsonProcessingException {
String xmlString = null;
xmlString = getDefaultXmlMapper().writer().with(SerializationFeature.WRAP_ROOT_VALUE)
.withRootName(root).writeValueAsString(bean);
return xmlString;
public static <T> T xmlToBean(String xml, Class<T> clazz) throws IOException {
return xmlMapper.readValue(xml, clazz);
}
//------------------------------------ Xml and Map ----------------------------
public static Map<String,String> xmlToMap(InputStream xmlInStream) throws IOException {
Map<String,String> map = getDefaultXmlMapper().readValue(xmlInStream, Map.class);
return map;
public static <T> T xmlToBean(InputStream xmlInStream, Class<T> clazz) throws IOException {
return xmlMapper.readValue(xmlInStream, clazz);
}
public static String mapToXml(Map<String,String> map,String root) throws JsonProcessingException {
String xmlString = null;
xmlString = getDefaultXmlMapper().writer().with(SerializationFeature.WRAP_ROOT_VALUE)
.withRootName(root).writeValueAsString(map);
return xmlString;
/**
* Xml And Map Converter
* 注意存在一直问题 xml转map时对于相同属性比如<receivers><to>123</to><to>234</to></receivers>不会自动转化为list而还是map由于map不能重复因此导致第二个to丢失
* 暂未找到解决办法
* 暂时解决办法xml转map时先转成beanbean再转map
* @param xml 要转换的xml字符串
* @return Map
* @throws IOException IO异常
*/
public static Map<String,Object> xmlToMap(String xml) throws IOException {
JavaType javaType = getCollectionType(objectMapper,Map.class,String.class,Object.class);
return xmlMapper.readValue(xml, javaType);
}
public static Map<String,Object> xmlToMap(InputStream xmlInStream) throws IOException {
JavaType javaType = getCollectionType(objectMapper,Map.class,String.class,Object.class);
return xmlMapper.readValue(xmlInStream, javaType);
}
public static String mapToXml(Map<String,Object> map,String root,boolean pretty) throws JsonProcessingException {
if(!pretty) {
if(StrUtil.isEmpty(root)) {
return xmlMapper.writeValueAsString(map);
}else{
return xmlMapper.writer().with(SerializationFeature.WRAP_ROOT_VALUE).withRootName(root).writeValueAsString(map);
}
}else{
if(StrUtil.isEmpty(root)) {
return xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(map);
}else{
return xmlMapper.writer().with(SerializationFeature.WRAP_ROOT_VALUE).withRootName(root).withDefaultPrettyPrinter().writeValueAsString(map);
}
}
}
public static String mapToXml(Map<String,Object> map,String root) throws JsonProcessingException {
return mapToXml(map,root,false);
}
public static String mapToXml(Map<String,Object> map,boolean pretty) throws JsonProcessingException {
return mapToXml(map,null,pretty);
}
public static String mapToXml(Map<String,Object> map) throws JsonProcessingException {
return mapToXml(map,null,false);
}
/**
* Json And Xml Converter
* @param json 要转换的json字符串
* @return xml
* @throws IOException IO异常
*/
public static String jsonToXml(String json) throws IOException {
return mapToXml(jsonToMap(json));
}
public static String jsonToXml(String json,String root) throws IOException {
return mapToXml(jsonToMap(json),root);
}
public static String jsonToXml(String json,boolean pretty) throws IOException {
return mapToXml(jsonToMap(json),pretty);
}
public static String jsonToXml(String json,String root,boolean pretty) throws IOException {
return mapToXml(jsonToMap(json),root,pretty);
}
public static String xmlToJson(String xml) throws IOException {
return mapToJson(xmlToMap(xml));
}
public static String xmlToJson(String xml,boolean pretty) throws IOException {
return mapToJson(xmlToMap(xml),pretty);
}
/**
* 获取单个字段值
* @param json
* @param property
* @return
* @throws IOException
*
* JsonNode tmpNode, node = objectMapper.readTree(json);
* System.out.println("voName:" + node.get("voName").textValue());
* System.out.println("pers: " + node.get("pers").toString());
* System.out.println("age: " + node.get("age").toString());
* JsonNode persNode = node.get("pers");
* if (persNode.isArray()) {
* for (int i = 0; i < persNode.size(); i++) {
* tmpNode = persNode.get(i);
* System.out.println(tmpNode.get("name"));
* JsonNode childNode = tmpNode.get("childs");
* if(!childNode.isNull() && childNode.isArray()){
* for(int j=0;j<childNode.size();j++){
* tmpNode = childNode.get(j);
* System.out.println("\t" + tmpNode.get("name"));
* }
* }
* }
* }
*/
public static JsonNode getJsonProperty(String json, String property) throws IOException {
return objectMapper.readTree(json).get(property);
}
public static JsonNode getJsonProperty(JsonNode jsonNode, String property) throws IOException {
return jsonNode.get(property);
}
/**
* 根据表达式返回对应的JsonNode
* @param json 要解析的Json字符串
* @param path JsonPath表达式 类似 $.a.b.c[2].d
* @return 对应的JsonNode
* @throws IOException IO异常
*/
public static JsonNode getJsonPropertyByPath(String json, String path) throws IOException{
//TODO
return null;
}
/**
* 根据表达式返回对应的JsonNode
* @param json 要解析的Json字符串
* @param path JsonPath表达式 类似 $.a.b.c[2].d
* @param t 预期类型
* @return 对应的JsonNode
* @throws IOException IO异常
*/
public static <T> T getJsonPropertyValueByPath(String json,String path,T t) throws IOException{
//TODO
return null;
}
}

25
util/src/main/java/com/ccsens/util/WechatUtil.java

@ -155,7 +155,7 @@ public class WechatUtil {
try {
response = HttpsUtil.httpsRequest(url_login, "GET", null);
wechatUser = JacksonUtil.jsonToBean(response, WechatUser.class, false);
wechatUser = JacksonUtil.jsonToBean(response, WechatUser.class);
}catch (Exception e){
throw new GetUserInfoException(-1,e.getMessage());
}
@ -184,7 +184,7 @@ public class WechatUtil {
if(StrUtil.isEmpty(response)) {
return null;
}
wechatToken = JacksonUtil.jsonToBean(response,WechatToken.class,false);
wechatToken = JacksonUtil.jsonToBean(response,WechatToken.class);
wechatToken.create_at = new Date();
return wechatToken;
}
@ -227,7 +227,7 @@ public class WechatUtil {
preparePayBean.nonce_str = createNonceStr();
// 把请求参数打包成数组
Map<String,String> sParaTemp = new HashMap();
Map<String,Object> sParaTemp = new HashMap();
sParaTemp.put("appid", preparePayBean.appid);
sParaTemp.put("mch_id", preparePayBean.mch_id);
sParaTemp.put("openid", preparePayBean.openid);
@ -292,7 +292,7 @@ public class WechatUtil {
* @param sParaTemp
* @return
*/
public static String createSign(Map<String,String> sParaTemp){
public static String createSign(Map<String,Object> sParaTemp){
// 除去数组中的空值和签名参数
Map sPara = paraFilter(sParaTemp);
String prestr = createLinkString(sPara); // 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
@ -306,15 +306,16 @@ public class WechatUtil {
* @param sArray 签名参数组
* @return 去掉空值与签名参数后的新签名参数组
*/
private static Map paraFilter(Map<String,String> sArray) {
private static Map paraFilter(Map<String,Object> sArray) {
Map result = new HashMap();
if (sArray == null || sArray.size() <= 0) {
return result;
}
for (String key : sArray.keySet()) {
String value = "" + sArray.get(key);
if (StrUtil.isEmpty(value) || key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type"))
if (StrUtil.isEmpty(value) || key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type")) {
continue;
}
result.put(key, value);
}
return result;
@ -375,11 +376,11 @@ public class WechatUtil {
return UUID.randomUUID().toString().replace("-","");
}
public static Map<String,String> payToUsrWx(
public static Map<String,Object> payToUsrWx(
String partner_trade_no,String openid,int total_fee,String desc,String spbill_create_ip)
throws Exception{
//1.构造请求字符串
Map<String,String> reqMap = new HashMap<String,String>();
Map<String,Object> reqMap = new HashMap<String,Object>();
reqMap.put("mch_appid",appid);
reqMap.put("mchid",mchid);
//reqMap.put("device_info",null); //不能添加空字段,Jackson会生成闭包xml <device_info/>导致签名失败
@ -404,10 +405,10 @@ public class WechatUtil {
System.out.println("---------------PayToUsrWx end-----------------");
//3.判断成功失败
Map<String,String> respMap = JacksonUtil.xmlToMap(new ByteArrayInputStream(respXml.getBytes()));
Map<String,Object> respMap = JacksonUtil.xmlToMap(new ByteArrayInputStream(respXml.getBytes()));
String return_code,result_code;
return_code = respMap.get("return_code");
result_code = respMap.get("result_code");
return_code = (String) respMap.get("return_code");
result_code = (String) respMap.get("result_code");
if(!StrUtil.isEmpty(return_code) && !StrUtil.isEmpty(result_code)){
if(return_code.equals("SUCCESS") && return_code.equals(result_code)){
@ -417,7 +418,7 @@ public class WechatUtil {
+ respMap.get("err_code_des"));
}
}else {
throw new PayException(respMap.get("return_msg"));
throw new PayException((String) respMap.get("return_msg"));
}
//return null;
}

4
util/src/main/java/com/ccsens/util/bean/BaseVo.java

@ -1,4 +0,0 @@
package com.ccsens.util.bean;
public class BaseVo {
}

31
util/src/main/java/com/ccsens/util/bean/message/client/AckMessage.java

@ -0,0 +1,31 @@
package com.ccsens.util.bean.message.client;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* @author wei
*/
@Data
public class AckMessage extends ServerMessage {
@Setter
@Getter
public static class Data {
String ackId;
}
private Data data;
public AckMessage(){
setType(MessageConstant.ClientMessageType.Ack.name());
}
public AckMessage(String ackId){
this();
data = new Data();
data.setAckId(ackId);
}
}

37
util/src/main/java/com/ccsens/util/bean/message/client/AuthMessage.java

@ -0,0 +1,37 @@
package com.ccsens.util.bean.message.client;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* @author wei
* 客户端认证 (user)
*/
@Data
public class AuthMessage extends ServerMessage {
@Setter
@Getter
public static class Data{
private String token;
private int major;
private int minor;
}
private Data data;
public AuthMessage(){
setType(MessageConstant.ClientMessageType.Auth.name());
}
public AuthMessage(String token,int major,int minor){
this();
data = new Data();
data.setToken(token);
data.setMajor(major);
data.setMinor(minor);
}
}

17
util/src/main/java/com/ccsens/util/bean/message/client/ClientAuthTimeOutMessage.java

@ -0,0 +1,17 @@
package com.ccsens.util.bean.message.client;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
/**
* @author wei
* 客户端向服务器请求当前连接状态
*/
@Data
public class ClientAuthTimeOutMessage extends ServerMessage {
public ClientAuthTimeOutMessage(){
setType(MessageConstant.ClientMessageType.ClientAuthTimeOut.name());
}
}

17
util/src/main/java/com/ccsens/util/bean/message/client/ClientIdleClosedMessage.java

@ -0,0 +1,17 @@
package com.ccsens.util.bean.message.client;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
/**
* @author wei
* 客户端向服务器请求当前连接状态
*/
@Data
public class ClientIdleClosedMessage extends ServerMessage {
public ClientIdleClosedMessage(){
setType(MessageConstant.ClientMessageType.ClientIdleClosed.name());
}
}

17
util/src/main/java/com/ccsens/util/bean/message/client/GetStatusMessage.java

@ -0,0 +1,17 @@
package com.ccsens.util.bean.message.client;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
/**
* @author wei
* 客户端向服务器请求当前连接状态
*/
@Data
public class GetStatusMessage extends ServerMessage {
public GetStatusMessage(){
setType(MessageConstant.ClientMessageType.GetChannelStatus.name());
}
}

37
util/src/main/java/com/ccsens/util/bean/message/client/HasReadMessage.java

@ -0,0 +1,37 @@
package com.ccsens.util.bean.message.client;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* @author wei
*/
@Data
public class HasReadMessage extends ServerMessage {
/**
* fromDomain域的fromUserId用户 给我发送的所有 时间<lastMsgId时间的消息 都已读
*/
@Setter
@Getter
public static class Data {
private Long time;
private String fromUserId;
private String fromDomain;
}
private Data data;
public HasReadMessage(){
setType(MessageConstant.ClientMessageType.HasRead.name());
}
public HasReadMessage(Long time){
this();
data = new Data();
data.setTime(time);
}
}

32
util/src/main/java/com/ccsens/util/bean/message/client/PingMessage.java

@ -0,0 +1,32 @@
package com.ccsens.util.bean.message.client;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* @author wei
*/
@Data
public class PingMessage extends ServerMessage {
@Setter
@Getter
public static class Data{
private Integer major;
private Integer minor;
}
private Data data;
public PingMessage(){
setType(MessageConstant.ClientMessageType.Ping.name());
}
public PingMessage(Integer major,Integer minor){
this();
data = new Data();
data.setMajor(major);
data.setMinor(minor);
}
}

32
util/src/main/java/com/ccsens/util/bean/message/client/SetDeletedStatusMessage.java

@ -0,0 +1,32 @@
package com.ccsens.util.bean.message.client;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* @author wei
*/
@Data
public class SetDeletedStatusMessage extends ServerMessage {
@Setter
@Getter
public static class Data {
String msgId;
}
private Data data;
public SetDeletedStatusMessage(){
setType(MessageConstant.ClientMessageType.SetMsgDeleted.name());
}
public SetDeletedStatusMessage(String msgId){
this();
data = new Data();
data.setMsgId(msgId);
}
}

32
util/src/main/java/com/ccsens/util/bean/message/client/SetRevertedStatusMessage.java

@ -0,0 +1,32 @@
package com.ccsens.util.bean.message.client;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* @author wei
*/
@Data
public class SetRevertedStatusMessage extends ServerMessage {
@Setter
@Getter
public static class Data {
String msgId;
}
private Data data;
public SetRevertedStatusMessage(){
setType(MessageConstant.ClientMessageType.SetMsgReverted.name());
}
public SetRevertedStatusMessage(String msgId){
this();
data = new Data();
data.setMsgId(msgId);
}
}

32
util/src/main/java/com/ccsens/util/bean/message/client/SetSuccessStatusMessage.java

@ -0,0 +1,32 @@
package com.ccsens.util.bean.message.client;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* @author wei
*/
@Data
public class SetSuccessStatusMessage extends ServerMessage {
@Setter
@Getter
public static class Data {
String msgId;
}
private Data data;
public SetSuccessStatusMessage(){
setType(MessageConstant.ClientMessageType.SetMsgSuccess.name());
}
public SetSuccessStatusMessage(String msgId){
this();
data = new Data();
data.setMsgId(msgId);
}
}

32
util/src/main/java/com/ccsens/util/bean/message/client/UnExceptedErrorMessage.java

@ -0,0 +1,32 @@
package com.ccsens.util.bean.message.client;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* @author wei
* 客户端向服务器请求当前连接状态
*/
@Data
public class UnExceptedErrorMessage extends ServerMessage {
@Getter@Setter
public static class Data{
private String errorString;
}
private Data data;
public UnExceptedErrorMessage(){
setType(MessageConstant.ClientMessageType.UnExceptedError.name());
}
public UnExceptedErrorMessage(String errorString){
this();
data = new Data();
data.setErrorString(errorString);
}
}

95
util/src/main/java/com/ccsens/util/bean/message/common/InMessage.java

@ -0,0 +1,95 @@
package com.ccsens.util.bean.message.common;
import cn.hutool.core.date.DateUtil;
import com.ccsens.util.JacksonUtil;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import lombok.Data;
import java.util.Set;
/**
* @author wei
*/
@Data
public class InMessage {
/**
* 消息ID
*/
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private String id;
/**
* 发送时间(s)
* Notice: 指的是服务器收到发送请求的时间不是服务器发出消息的时间
*/
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Long time;
/**
* 消息来自于那个域
*/
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private MessageConstant.DomainType fromDomain;
/**
* 发送者信息
*/
private String from;
/**
* 消息要发送到哪个域
*/
private MessageConstant.DomainType toDomain;
/**
* 接受者信息列表
*/
private Set<String> tos;
/**
* 消息的标示符通常是由用户传过来的消息ID该消息在用户系统中的ID
*/
private String unikey;
/**
* 发送规则
* DeSerialize but not serialize @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
*/
private MessageRule rule;
/**
* 发送内容
* 如果toDomain是Server 代表消息是发给当前服务器的必须是MessageSysData的子类型
* 其他格式不限由用户指定
*/
private String data;
public InMessage(){
this.time = DateUtil.currentSeconds();
}
public static InMessage newToServerMessage(MessageConstant.DomainType fromDomain,ServerMessage serverMessage) throws JsonProcessingException {
InMessage inMessage = new InMessage();
inMessage.setFromDomain(fromDomain);
inMessage.setToDomain(MessageConstant.DomainType.Server);
inMessage.setData(JacksonUtil.beanToJson(serverMessage));
return inMessage;
}
public static InMessage newToQueueMessage(String from, Set<String> tos, String unikey, MessageRule rule, String data) throws JsonProcessingException {
InMessage inMessage = new InMessage();
inMessage.setToDomain(MessageConstant.DomainType.Queue);
inMessage.setFrom(from);
inMessage.setTos(tos);
inMessage.setUnikey(unikey);
inMessage.setRule(rule);
inMessage.setData(data);
return inMessage;
}
public static InMessage newToUserMessage(String from, Set<String> tos, String unikey, MessageRule rule, String data) throws JsonProcessingException {
InMessage inMessage = new InMessage();
inMessage.setToDomain(MessageConstant.DomainType.User);
inMessage.setFrom(from);
inMessage.setTos(tos);
inMessage.setUnikey(unikey);
inMessage.setRule(rule);
inMessage.setData(data);
return inMessage;
}
//TODO
//添加方便链式调用的构造方法,类似builder
}

134
util/src/main/java/com/ccsens/util/bean/message/common/Message.java

@ -0,0 +1,134 @@
package com.ccsens.util.bean.message.common;
import cn.hutool.core.date.DateUtil;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* @author wei
*/
@Data
public class Message {
/**
* 消息ID (Message's ID)
*/
private String id;
/**
* 原始消息ID (InMessage's ID)
*/
private String rawId;
/**
* 发送时间(s)
* Notice: 指的是服务器收到发送请求的时间不是服务器发出消息的时间
*/
private Long time;
/**
* 消息来自于那个域
*/
private MessageConstant.DomainType fromDomain;
/**
* 发送者信息
*/
private String from;
/**
* 消息要发送到哪个域
*/
private MessageConstant.DomainType toDomain;
/**
* 接受者信息列表
*/
private String to;
/**
* 发送规则
* DeSerialize but not serialize @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
*/
private MessageRule rule;
/**
* 发送内容
* 如果toDomain是Server 代表消息是发给当前服务器的必须是MessageSysData的子类型
* 其他格式不限由用户指定
*/
private String data;
/**
* 是否收到用户的ack消息
*/
private byte acked;
/**
* 是否收到用户的已读消息
*/
private byte hasRead;
/**
* 消息状态
* 发送成功标志根据配置由三种情况
* 1. 配置不需要客户端ack
* 发送完毕自动设置 ack = true;
* rule -> ackIsSuccess = true 发送即代表成功
* rule -> ackIsSuccess = false 等待用户手动设置成功标志
* 2. 配置需要ack则发送并受到ack代表成功
* rule -> ackIsSuccess = true 发送并收到ack即代表成功
* rule -> ackIsSuccess = false 等待用户手动设置成功标志
*/
private MessageConstant.Status status;
/**
* 发送次数
*/
private int sendTimes;
/**
* 发送时间
*/
private List<Long> sendTimeInSecondList;
public Message(){
}
public Message(MessageConstant.DomainType fromDomain,String from,MessageConstant.DomainType toDomain,String to,String data,MessageRule rule){
this.time = DateUtil.currentSeconds();
this.fromDomain = fromDomain;
this.from = from;
this.toDomain = toDomain;
this.to = to;
this.data = data;
this.rule = rule;
}
public Message(InMessage inEntity, String to){
this.rawId = inEntity.getId();
this.time = inEntity.getTime();
this.fromDomain = inEntity.getFromDomain();
this.from = inEntity.getFrom();
this.toDomain = inEntity.getToDomain();
this.to = to;
this.rule = inEntity.getRule();
this.data = inEntity.getData();
this.acked = 0;
this.hasRead = 0;
this.status = MessageConstant.Status.Pending;
this.sendTimes = 0;
}
public void incrementSendTimes() {
this.sendTimes++;
if(this.sendTimeInSecondList == null){
this.sendTimeInSecondList = new ArrayList<>();
}
this.sendTimeInSecondList.add(DateUtil.currentSeconds());
}
public boolean isSendTimesUpLimit() {
if((rule.getNoAckRetryTimes() > 0) && (sendTimes >= rule.getNoAckRetryTimes())){
return true;
}
return false;
}
public boolean isExpired() {
return DateUtil.currentSeconds() >= rule.getExpireAt();
}
}

217
util/src/main/java/com/ccsens/util/bean/message/common/MessageConstant.java

@ -0,0 +1,217 @@
package com.ccsens.util.bean.message.common;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* @author wei
* 消息相关常量
*/
public class MessageConstant {
public enum ClientMessageType{
//客户端心跳
Ping(0x00),
//客户端认证
Auth(0x01),
//客户端收到消息ACK
Ack(0x02),
//客户端收到消息ACK
HasRead(0x03),
//客户端请求连接状态
GetChannelStatus(0x04),
//不可预期的错误
UnExceptedError(0x21),
ClientIdleClosed(0x22),
ClientAuthTimeOut(0x23),
//设置消息状态消息(disable撤销消息,适用于,消息撤回),针对消息本身(eg:消息撤回)
SetMsgSuccess(0x52),
SetMsgReverted(0x53),
SetMsgDeleted(0x54);
public int value;
ClientMessageType(int value){
this.value = value;
}
/**
* 从int到enum的转换函数
* @param value 枚举int值
* @return 对应的枚举找不到则返回null
*/
public static ClientMessageType valueOf(int value) {
for(ClientMessageType type : values()){
if(type.value == value){
return type;
}
}
return null;
}
}
public enum ServerMessageType{
//客户端心跳
Pong(0x00),
//客户端收到消息ACK
Ack(0x02),
//客户端请求连接状态
ChannelStatus(0x03);
//撤销某个消息
//DelMessage(0x04),
//客户端请求连接状态
//QueueStatus(0x05);
public int value;
ServerMessageType(int value){
this.value = value;
}
/**
* 从int到enum的转换函数
* @param value 枚举int值
* @return 对应的枚举找不到则返回null
*/
public static ServerMessageType valueOf(int value) {
for(ServerMessageType type : values()){
if(type.value == value){
return type;
}
}
return null;
}
}
/**
* JsonFormat是Json Serialize相关配置
*/
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum Error{
//Ok
Ok(200,"Ok"),
/**
* 通用消息错误
*/
//消息无接收者错误
MessageNoReceiversError(1001,"[用户]消息至少应该有一个接收者"),
//消息无数据错误
MessageNoDataError(1002,"不允许消息内容为空"),
/**
* server消息错误
*/
//server消息无type错误
MessageNoTypeError(1003,"发送至Server域的消息必须有type字段"),
//Ack参数错误,没有找到对应的msgId
AckParameterError(1103,"Ack参数错误,没有找到对应的msgId"),
//SetSuccess参数错误,没有找到对应的msgId
SetSuccessParameterError(1104,"SetSuccess参数错误,没有找到对应的msgId"),
//SetStatusParameterError
SetStatusParameterError(1105,"SetStatus参数错误,没有找到对应的msgId"),
//HasRead参数错误,没有找到对应的msgId
HasReadParameterError(1106,"HasRead参数错误,没有找到对应的msgId"),
/**
* 身份认证错误
*/
//无权限
UnAuthed(1021, "未认证的用户"),
/**
* 业务错误
*/
//认证失败
AuthFailed(1301,"认证失败"),
//空闲断开连接(连续Ns没有收到数据)
ChannelIdle(1302,"连接断开:连续N秒没有从收到客户端收到任何数据"),
//认证超时断开连接
ChannelAuthTimeOut(1303,"连接断开:认证超时"),
//不可预期错误
UnExpectedError(1304,"不可预期异常");
public int code;
public String text;
public String extra;
Error(int code,String text) {
this.code = code;
this.text = text;
}
Error(int code,String text,String extra) {
this.code = code;
this.text = text;
this.extra = extra;
}
public Error joinExtra(String extra){
this.extra = extra;
return this;
}
}
/**
* (UserQueueRestServer)
*/
public enum DomainType{
//Netty Client
User(1),
//Queue Client
Queue(2),
//Rest Client
Rest(3),
//系统
Server(4);
public int value;
DomainType(int value){
this.value = value;
}
public static DomainType valueOf(int value) {
for(DomainType domainType : values()){
if(domainType.value == value){
return domainType;
}
}
return null;
}
}
public enum Status{
//未决状态(未完成)
Pending(0),
//发送成功(投递成功)
Succeed(1),
//发送失败(投递失败)
Failed(2),
//消息过期
Expired(3),
//消息被撤回
Reverted(4),
//消息被删除
Deleted(5),
//消息达到重试次数上限
SendTimesUpLimit(6),
//临时完成状态,当ackIsSuccess==0时,一旦ack设置消息为此状态
TempSucceed(10);
public int value;
Status(int value){
this.value = value;
}
public static Status valueOf(int value){
for(Status status : values()){
if(status.value == value){
return status;
}
}
return null;
}
}
}

80
util/src/main/java/com/ccsens/util/bean/message/common/MessageRule.java

@ -0,0 +1,80 @@
package com.ccsens.util.bean.message.common;
import lombok.Data;
/**
* 发送规则实体类
* @author wei
*/
@Data
public class MessageRule {
public enum AckRule{
//不需要ack
NONE,
//产生错误时回复ack
ERROR,
//总是回复ack
ALWAYS
}
/**
* 离线丢弃标志
*/
private byte offlineDiscard;
/**
* 消息是否需要ack如果不需要ack则发送完毕即代表成功
*/
private AckRule ackRule;
/**
* 没有收到ack重试次数
*/
private Integer noAckRetryTimes;
/**
* 收到ack代表发送成功不再发送
* 如果该标志为0则代表每次上线都发送直到用户手动设置成功
*/
private byte ackIsSuccess;
/**
* 消息过期时间(s)
*/
private Long expireAt;
public MessageRule(){
}
public MessageRule(byte offlineDiscard,AckRule ackRule,Integer noAckRetryTimes,byte ackIsSuccess){
this.offlineDiscard = offlineDiscard;
this.ackRule = ackRule;
this.noAckRetryTimes = noAckRetryTimes;
this.ackIsSuccess = ackIsSuccess;
}
public MessageRule(byte offlineDiscard,AckRule ackRule,Integer noAckRetryTimes,byte ackIsSuccess,Long expireAt){
this.offlineDiscard = offlineDiscard;
this.ackRule = ackRule;
this.noAckRetryTimes = noAckRetryTimes;
this.ackIsSuccess = ackIsSuccess;
this.expireAt = expireAt;
}
public static MessageRule defaultRule(MessageConstant.DomainType fromDomain) {
MessageRule messageRule = null;
switch(fromDomain) {
case User:
messageRule = new MessageRule((byte) 0, AckRule.ALWAYS, 10, (byte) 1,0L);
break;
case Queue:
messageRule = new MessageRule((byte) 1, AckRule.ALWAYS, 10, (byte) 1,0L);
break;
case Rest:
messageRule = new MessageRule((byte) 1, AckRule.ALWAYS, 10, (byte) 1,0L);
break;
case Server:
messageRule = new MessageRule((byte) 1, AckRule.ALWAYS, 10, (byte) 1,0L);
break;
default:
break;
}
return messageRule;
}
}

71
util/src/main/java/com/ccsens/util/bean/message/common/OutMessage.java

@ -0,0 +1,71 @@
package com.ccsens.util.bean.message.common;
import cn.hutool.core.date.DateUtil;
import lombok.Data;
/**
* @author wei
*/
@Data
public class OutMessage {
/**
* 消息ID
*/
private String id;
/**
* sender发送消息时间(s)
* Notice: 指的是服务器收到发送请求的时间不是服务器发出消息的时间服务器发出消息的时间客户端很好确定就是当前时间
*/
private Long time;
/**
* 消息来自于那个域通常不需要知道toDomain
*/
private MessageConstant.DomainType fromDomain;
/**
* 发送者信息
*/
private String from;
/**
* 如果toDomain是Server 代表消息是发给当前服务器的必须是MessageSysData的子类型
* 其他格式不限由用户指定消息系统会将data字段原封不动投递到接收方由接收方进行解析
*/
private String data;
public OutMessage(){
}
public OutMessage(String id, Long time, String from, String data){
this.id = id;
this.time = time;
this.from = from;
this.data = data;
}
public OutMessage(InMessage messageEntity){
this.id = messageEntity.getId();
this.time = messageEntity.getTime();
this.fromDomain = messageEntity.getFromDomain();
this.from = messageEntity.getFrom();
this.data = messageEntity.getData();
}
public OutMessage(String data){
this.time = DateUtil.currentSeconds();
this.fromDomain = MessageConstant.DomainType.Server;
this.data = data;
}
public OutMessage(MessageConstant.DomainType fromDomain, String data) {
this.time = DateUtil.currentSeconds();
this.fromDomain = fromDomain;
this.data = data;
}
public OutMessage(Message message){
this.id = message.getId();
this.time = message.getTime();
this.fromDomain = message.getFromDomain();
this.from = message.getFrom();
this.data = message.getData();
}
}

43
util/src/main/java/com/ccsens/util/bean/message/common/OutMessageSet.java

@ -0,0 +1,43 @@
package com.ccsens.util.bean.message.common;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
/**
* @author __zHangSan
*/
@Getter @Setter @ToString
public class OutMessageSet {
private String ackId;
private Set<OutMessage> messageSet;
public OutMessageSet ackId(String ackId){
this.ackId = ackId;
return this;
}
public static OutMessageSet newInstance(){
return new OutMessageSet();
}
public OutMessageSet add(OutMessage messageOutEntity){
if(messageSet == null){
messageSet = new HashSet<>();
}
messageSet.add(messageOutEntity);
return this;
}
public OutMessageSet addAll(Collection<OutMessage> theMessageSet){
if(messageSet == null){
messageSet = new HashSet<>();
}
messageSet.addAll(theMessageSet);
return this;
}
}

11
util/src/main/java/com/ccsens/util/bean/message/common/ServerMessage.java

@ -0,0 +1,11 @@
package com.ccsens.util.bean.message.common;
import lombok.Data;
/**
* @author wei
*/
@Data
public class ServerMessage {
private String type;
}

37
util/src/main/java/com/ccsens/util/bean/message/server/ChannelStatusMessage.java

@ -0,0 +1,37 @@
package com.ccsens.util.bean.message.server;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* @author zhangsan
*/
@Data
public class ChannelStatusMessage extends ServerMessage {
@Setter
@Getter
public static class Data{
//认证状态
private Boolean authed;
//已认证时长(s)
private Long onlineSeconds;
//错误信息
private MessageConstant.Error error;
}
private Data data;
public ChannelStatusMessage(){
setType(MessageConstant.ServerMessageType.ChannelStatus.name());
}
public ChannelStatusMessage(Boolean authed,Long onlineSeconds,MessageConstant.Error error){
this();
data = new Data();
data.authed = authed;
data.onlineSeconds = onlineSeconds;
data.error = error;
}
}

29
util/src/main/java/com/ccsens/util/bean/message/server/InvertedMessage.java

@ -0,0 +1,29 @@
package com.ccsens.util.bean.message.server;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Getter;
import lombok.Setter;
/**
* @author __zHangSan
*/
public class InvertedMessage extends ServerMessage {
@Setter
@Getter
public static class Data{
private String msgId;
}
private Data data;
public InvertedMessage(){
setType(MessageConstant.ServerMessageType.Pong.name());
}
public InvertedMessage(String msgId){
this();
data = new Data();
data.setMsgId(msgId);
}
}

15
util/src/main/java/com/ccsens/util/bean/message/server/PongMessage.java

@ -0,0 +1,15 @@
package com.ccsens.util.bean.message.server;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
/**
* @author zhangsan
*/
@Data
public class PongMessage extends ServerMessage {
public PongMessage(){
setType(MessageConstant.ServerMessageType.Pong.name());
}
}

31
util/src/main/java/com/ccsens/util/bean/message/server/QueueStatusMessage.java

@ -0,0 +1,31 @@
package com.ccsens.util.bean.message.server;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* @author zhangsan
*/
@Data
public class QueueStatusMessage extends ServerMessage {
@Setter
@Getter
public static class Data{
private MessageConstant.Error error;
}
private Data data;
public QueueStatusMessage(){
setType(MessageConstant.ServerMessageType.ChannelStatus.name());
}
public QueueStatusMessage(MessageConstant.Error error){
this();
data = new Data();
data.error = error;
}
}

50
util/src/main/java/com/ccsens/util/bean/message/server/ServerAckMessage.java

@ -0,0 +1,50 @@
package com.ccsens.util.bean.message.server;
import com.ccsens.util.bean.message.common.MessageConstant;
import com.ccsens.util.bean.message.common.ServerMessage;
import lombok.Data;
/**
* @author zhangsan
*/
@Data
public class ServerAckMessage extends ServerMessage {
@lombok.Data
public static class Data{
/**
* 消息ID
*/
private String msgId;
/**
* 发送者指定的unikey如果发送者未指定则为null
*/
private String unikey;
/**
* 消息状态
*/
private MessageConstant.Error error;
public Data(String msgId,String unikey,MessageConstant.Error error){
this.msgId = msgId;
this.unikey = unikey;
this.error = error;
}
}
private Data data;
public ServerAckMessage(){
setType(MessageConstant.ServerMessageType.Ack.name());
}
public ServerAckMessage(MessageConstant.Error status){
this();
this.data = new Data(null,null,status);
}
public ServerAckMessage(String msgId,String unikey,MessageConstant.Error status){
this();
this.data = new Data(msgId,unikey,status);
}
}

8
util/src/main/java/com/ccsens/util/config/RabbitMQConfig.java

@ -6,15 +6,15 @@ import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
public static final String RabbitMQ_QUEUE_NAME = "Queue_Anyring";
public static final String RabbitMQ_QUEUE_NAME_ptpro = "Queue_Anyring_ptpro";
public static final String TALL_MESSAGE_1 = "tall_message_1";
public static final String TALL_MESSAGE_2 = "tall_message_2";
@Bean
public Queue queue(){
return new Queue(RabbitMQ_QUEUE_NAME);
return new Queue(TALL_MESSAGE_1);
}
@Bean
public Queue queue1(){
return new Queue(RabbitMQ_QUEUE_NAME_ptpro);
return new Queue(TALL_MESSAGE_2);
}

188
util/util.iml~a7021fc1febcde2a8cd0fb8c6b2c75bbd877fb57

@ -1,188 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="Spring" name="Spring">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.2" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.28" level="project" />
<orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.39.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.39.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.39.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.39.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.39.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.39.Final" level="project" />
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.12.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.9" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.9" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.9" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.17.Final" level="project" />
<orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.3.Final" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jetty:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-servlets:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-continuation:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-http:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-util:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-io:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-webapp:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-xml:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-servlet:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-security:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-server:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-server:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-common:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-api:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-client:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-client:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-servlet:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:javax-websocket-server-impl:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-annotations:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-plus:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.ow2.asm:asm:7.1" level="project" />
<orderEntry type="library" name="Maven: org.ow2.asm:asm-commons:7.1" level="project" />
<orderEntry type="library" name="Maven: org.ow2.asm:asm-tree:7.1" level="project" />
<orderEntry type="library" name="Maven: org.ow2.asm:asm-analysis:7.1" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:javax-websocket-client-impl:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: javax.websocket:javax.websocket-api:1.1" level="project" />
<orderEntry type="library" name="Maven: org.mortbay.jasper:apache-el:8.5.40" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework.boot:spring-boot-devtools:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-configuration-processor:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.8" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.1.8.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.1.8.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.1.8.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.11.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:2.23.4" level="project" />
<orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.16" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.9.16" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.9.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.1.9.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.6.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-actuator:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-actuator-autoconfigure:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-actuator:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.micrometer:micrometer-core:1.1.6" level="project" />
<orderEntry type="library" name="Maven: org.hdrhistogram:HdrHistogram:2.1.9" level="project" />
<orderEntry type="library" name="Maven: org.latencyutils:LatencyUtils:2.0.3" level="project" />
<orderEntry type="library" name="Maven: cn.hutool:hutool-all:4.1.21" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi:3.17" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:3.17" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:3.17" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:2.6.0" level="project" />
<orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
<orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.04" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-websocket:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-messaging:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-websocket:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-amqp:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.amqp:spring-rabbit:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.amqp:spring-amqp:2.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.retry:spring-retry:1.2.4.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.rabbitmq:amqp-client:5.4.3" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:1.1.1" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.1.1" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.0" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.0" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:4.1.4" level="project" />
<orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:0.9.5" level="project" />
<orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.17" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:druid:1.1.10" level="project" />
<orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.7.0" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.9.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.9.0" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.9" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.9.9" level="project" />
<orderEntry type="library" name="Maven: org.codehaus.woodstox:stax2-api:3.1.4" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.woodstox:woodstox-core:5.0.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" />
<orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" />
<orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" />
<orderEntry type="library" name="Maven: net.sourceforge.htmlcleaner:htmlcleaner:2.22" level="project" />
<orderEntry type="library" name="Maven: org.jdom:jdom2:2.0.6" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.28" level="project" />
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.generator:mybatis-generator-core:1.3.7" level="project" />
<orderEntry type="library" name="Maven: org.beanshell:bsh:2.0b5" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.3.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.3.1" level="project" />
<orderEntry type="library" name="Maven: com.github.qcloudsms:qcloudsms:1.0.5" level="project" />
<orderEntry type="library" name="Maven: org.json:json:20170516" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.5.9" level="project" />
</component>
</module>
Loading…
Cancel
Save