Browse Source

🚀 消息推送模块

master
wangxiang 2 years ago
parent
commit
fe634c3192
  1. 17
      docker-cloud/Jenkins/docker-compose.yml
  2. 46
      kicc-platform/kicc-platform-api/kicc-common-api/src/main/java/com/cloud/kicc/commonbiz/api/entity/Message.java
  3. 2
      kicc-platform/kicc-platform-api/kicc-common-api/src/main/java/com/cloud/kicc/commonbiz/api/entity/PushApplication.java
  4. 36
      kicc-platform/kicc-platform-api/kicc-common-api/src/main/java/com/cloud/kicc/commonbiz/api/entity/UserPush.java
  5. 2
      kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/controller/MapTaskController.java
  6. 1
      kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/controller/MessageController.java
  7. 10
      kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/controller/PushApplicationController.java
  8. 16
      kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/mapper/UserPushMapper.java
  9. 10
      kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/service/IPushApplicationService.java
  10. 16
      kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/service/UserPushService.java
  11. 97
      kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/service/impl/PushApplicationServiceImpl.java
  12. 20
      kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/service/impl/UserPushServiceImpl.java
  13. 7
      kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/util/PushClientUtil.java
  14. 5
      kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/resources/mapper/UserPushMapper.xml

17
docker-cloud/Jenkins/docker-compose.yml

@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
version: "3"
services:
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
hostname: jenkins
volumes:
- jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
restart: always
ports:
- 8080:8080
volumes:
jenkins_home:

46
kicc-platform/kicc-platform-api/kicc-common-api/src/main/java/com/cloud/kicc/commonbiz/api/entity/Message.java

@ -1,18 +1,16 @@ @@ -1,18 +1,16 @@
package com.cloud.kicc.commonbiz.api.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.cloud.kicc.common.data.entity.CommonEntity;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
*
* 消息发送
* </p>
*
* @author entfrm开发团队-王翔
@ -21,7 +19,7 @@ import lombok.experimental.Accessors; @@ -21,7 +19,7 @@ import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@TableName("common_message")
@ApiModel(value = "Message对象", description = "")
@ApiModel(value = "Message对象")
public class Message extends CommonEntity {
private static final long serialVersionUID = 1L;
@ -29,8 +27,8 @@ public class Message extends CommonEntity { @@ -29,8 +27,8 @@ public class Message extends CommonEntity {
@ApiModelProperty("主键id")
private String id;
@ApiModelProperty("消息名称")
private String name;
@ApiModelProperty("发送用户id")
private String sendUserId;
@ApiModelProperty("消息类型")
private String type;
@ -38,8 +36,38 @@ public class Message extends CommonEntity { @@ -38,8 +36,38 @@ public class Message extends CommonEntity {
@ApiModelProperty("消息状态 0-未读 1-已读")
private String status;
@ApiModelProperty("消息内容")
private String content;
@ApiModelProperty("别名类型")
private String aliasType;
@ApiModelProperty("别名,多个alias以英文逗号间隔")
private String alias;
@ApiModelProperty("消息显示类型")
private String displayType;
@ApiModelProperty("通知标题")
private String title;
@ApiModelProperty("通知文字描述")
private String text;
@ApiModelProperty("自定义通知声音 R.raw.[sound]")
private String sound;
@ApiModelProperty("收到通知是否震动")
private Boolean playVibrate;
@ApiModelProperty("收到通知是否闪灯")
private Boolean playLights;
@ApiModelProperty("收到通知是否发出声音")
private Boolean playSound;
@ApiModelProperty("自定义活动点击跳转内容")
private String custom;
@ApiModelProperty("app发送密钥")
@TableField(exist = false)
private String messageSecret;
}

2
kicc-platform/kicc-platform-api/kicc-common-api/src/main/java/com/cloud/kicc/commonbiz/api/entity/PushApplication.java

@ -32,7 +32,7 @@ public class PushApplication extends CommonEntity { @@ -32,7 +32,7 @@ public class PushApplication extends CommonEntity {
private String status;
private String url;
private String ip;
private String messageSecret;

36
kicc-platform/kicc-platform-api/kicc-common-api/src/main/java/com/cloud/kicc/commonbiz/api/entity/UserPush.java

@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
package com.cloud.kicc.commonbiz.api.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
*<p>
* 用户和消息推送关联表
*</p>
*
* @Author: entfrm开发团队-王翔
* @Date: 2022/2/24
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sys_user_push")
public class UserPush implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private String userId;
/**
* 推送ID
*/
private String pushId;
}

2
kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/controller/MapTaskController.java

@ -12,14 +12,12 @@ import com.cloud.kicc.common.core.constant.AppConstants; @@ -12,14 +12,12 @@ import com.cloud.kicc.common.core.constant.AppConstants;
import com.cloud.kicc.common.core.constant.SecurityConstants;
import com.cloud.kicc.common.security.util.SecurityUtils;
import com.cloud.kicc.commonbiz.api.entity.*;
import com.cloud.kicc.commonbiz.api.enums.MapTaskStatusEnum;
import com.cloud.kicc.commonbiz.service.*;
import com.cloud.kicc.system.api.entity.User;
import com.cloud.kicc.system.api.feign.RemoteUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Response;
import org.springframework.web.bind.annotation.*;

1
kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/controller/MessageController.java

@ -12,7 +12,6 @@ import com.cloud.kicc.commonbiz.service.IMessageService; @@ -12,7 +12,6 @@ import com.cloud.kicc.commonbiz.service.IMessageService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;

10
kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/controller/PushApplicationController.java

@ -8,9 +8,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -8,9 +8,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cloud.kicc.common.core.api.R;
import com.cloud.kicc.common.core.constant.AppConstants;
import com.cloud.kicc.common.log.annotation.SysLog;
import com.cloud.kicc.commonbiz.api.entity.MapLogisticPoint;
import com.cloud.kicc.commonbiz.api.entity.Message;
import com.cloud.kicc.commonbiz.api.entity.PushApplication;
import com.cloud.kicc.commonbiz.service.IPushApplicationService;
import com.cloud.kicc.system.api.entity.OauthClientDetails;
import com.google.gson.JsonObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@ -77,7 +80,12 @@ public class PushApplicationController { @@ -77,7 +80,12 @@ public class PushApplicationController {
}
@PostMapping("/send")
@ApiOperation(value = "消息发送")
public R mapPresetPointConfirmPushMsgTest(@Valid @RequestBody Message message) {
iPushApplicationService.messageSend(message);
return R.ok(true);
}
}

16
kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/mapper/UserPushMapper.java

@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
package com.cloud.kicc.commonbiz.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cloud.kicc.commonbiz.api.entity.UserPush;
/**
*<p>
* Mapper 接口
*</p>
*
* @Author: entfrm开发团队-王翔
* @Date: 2022/2/24
*/
public interface UserPushMapper extends BaseMapper<UserPush> {
}

10
kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/service/IPushApplicationService.java

@ -1,7 +1,8 @@ @@ -1,7 +1,8 @@
package com.cloud.kicc.commonbiz.service;
import com.cloud.kicc.commonbiz.api.entity.PushApplication;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cloud.kicc.commonbiz.api.entity.Message;
import com.cloud.kicc.commonbiz.api.entity.PushApplication;
/**
* <p>
@ -13,4 +14,11 @@ import com.baomidou.mybatisplus.extension.service.IService; @@ -13,4 +14,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IPushApplicationService extends IService<PushApplication> {
/**
* 消息发送
* @param
* @return
*/
void messageSend(Message message);
}

16
kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/service/UserPushService.java

@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
package com.cloud.kicc.commonbiz.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cloud.kicc.commonbiz.api.entity.UserPush;
/**
*<p>
* 服务类
*</p>
*
* @Author: entfrm开发团队-王翔
* @Date: 2022/2/24
*/
public interface UserPushService extends IService<UserPush> {
}

97
kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/service/impl/PushApplicationServiceImpl.java

@ -1,10 +1,37 @@ @@ -1,10 +1,37 @@
package com.cloud.kicc.commonbiz.service.impl;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.servlet.ServletUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cloud.kicc.common.core.api.R;
import com.cloud.kicc.common.core.constant.SecurityConstants;
import com.cloud.kicc.common.core.exception.CheckedException;
import com.cloud.kicc.commonbiz.api.entity.Message;
import com.cloud.kicc.commonbiz.api.entity.PushApplication;
import com.cloud.kicc.commonbiz.api.entity.UserPush;
import com.cloud.kicc.commonbiz.mapper.PushApplicationMapper;
import com.cloud.kicc.commonbiz.service.IPushApplicationService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cloud.kicc.commonbiz.service.UserPushService;
import com.cloud.kicc.commonbiz.util.PushClientUtil;
import com.cloud.kicc.system.api.entity.User;
import com.cloud.kicc.system.api.feign.RemoteUserService;
import lombok.RequiredArgsConstructor;
import okhttp3.OkHttpClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* <p>
@ -15,6 +42,74 @@ import org.springframework.stereotype.Service; @@ -15,6 +42,74 @@ import org.springframework.stereotype.Service;
* @since 2023-02-16
*/
@Service
@RequiredArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class PushApplicationServiceImpl extends ServiceImpl<PushApplicationMapper, PushApplication> implements IPushApplicationService {
private final OkHttpClient okHttpClient;
private final UserPushService userPushService;
private final RemoteUserService remoteUserService;
@Override
public void messageSend(Message message) {
if (StrUtil.isBlank(message.getSendUserId()) || StrUtil.isBlank(message.getMessageSecret())) {
throw new CheckedException("当前发送用户ID与推送应用密钥必填!");
}
R<User> user = remoteUserService.selectByUserId(message.getSendUserId(), SecurityConstants.FROM_IN);
// 第三方发送前较验数据
if (user.getData().getUserType().equals("9")) {
PushApplication pushApplication = baseMapper.selectOne(Wrappers.<PushApplication>lambdaQuery()
.eq(PushApplication::getMessageSecret, message.getMessageSecret()).eq(PushApplication::getStatus, "0"));
pushApplication = Optional.of(pushApplication).orElseThrow(() -> new CheckedException("你当前没有权限发送消息,请联系管理员!"));
HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
// 如果ip地址存在即验证发送方ip
if (StrUtil.isNotBlank(pushApplication.getIp()) && !StrUtil.contains(pushApplication.getIp(), ServletUtil.getClientIP(request))) {
throw new CheckedException("你的ip地址不正确,请检查消息应用中设置的ip地址!");
}
}
List<UserPush> pushList = userPushService.list(Wrappers.<UserPush>lambdaQuery().eq(UserPush::getUserId, message.getSendUserId()));
if (ObjectUtil.isNotEmpty(pushList)) {
// 设置默认数据
message.setDisplayType("notification");
message.setAliasType(PushClientUtil.uPushUserAliasType);
message.setAlias(pushList.stream().map(item -> item.getPushId()).collect(Collectors.joining(",")));
JSONObject custom = new JSONObject();
custom.put("sendUserId", message.getSendUserId());
message.setCustom(custom.toString());
JSONObject jsonObject = new JSONObject();
jsonObject.put("production_mode", PushClientUtil.PRODUCTION_MODE);
jsonObject.put("type", "customizedcast");
jsonObject.put("description", message.getRemarks());
jsonObject.put("alias_type", message.getAliasType());
jsonObject.put("alias", message.getAlias());
JSONObject payload = new JSONObject();
payload.put("display_type", message.getDisplayType());
JSONObject body = new JSONObject();
body.put("ticker", message.getTitle());
body.put("text", message.getText());
body.put("title", message.getTitle());
body.put("sound", message.getSound());
body.put("after_open", "go_custom");
body.put("custom", message.getCustom());
body.put("play_sound", message.getPlaySound());
body.put("play_vibrate", message.getPlayVibrate());
body.put("play_lights", message.getPlayLights());
payload.put("body", body);
jsonObject.put("payload", payload);
JSONObject policy = new JSONObject();
policy.put("expire_time", LocalDateTimeUtil.now().plusDays(3).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
policy.put("out_biz_no", LocalDateTimeUtil.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
jsonObject.put("policy", policy);
try {
PushClientUtil pushClientUtil = new PushClientUtil(okHttpClient);
pushClientUtil.send(jsonObject);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

20
kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/service/impl/UserPushServiceImpl.java

@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
package com.cloud.kicc.commonbiz.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cloud.kicc.commonbiz.api.entity.UserPush;
import com.cloud.kicc.commonbiz.mapper.UserPushMapper;
import com.cloud.kicc.commonbiz.service.UserPushService;
import org.springframework.stereotype.Service;
/**
*<p>
* 服务实现类
*</p>
*
* @Author: entfrm开发团队-王翔
* @Date: 2022/2/24
*/
@Service
public class UserPushServiceImpl extends ServiceImpl<UserPushMapper, UserPush> implements UserPushService {
}

7
kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/java/com/cloud/kicc/commonbiz/util/PushClientUtil.java

@ -22,6 +22,8 @@ public class PushClientUtil { @@ -22,6 +22,8 @@ public class PushClientUtil {
private OkHttpClient okHttpClient;
public static final Boolean PRODUCTION_MODE = false;
protected final String USER_AGENT = "Mozilla/5.0";
protected static final String host = "http://msg.umeng.com";
@ -40,6 +42,11 @@ public class PushClientUtil { @@ -40,6 +42,11 @@ public class PushClientUtil {
this.okHttpClient = okHttpClient;
}
public static void main(String[] args) {
System.out.println((System.currentTimeMillis()));
System.out.println((System.currentTimeMillis() / 1000));
}
public boolean send(JSONObject jsonObject) throws Exception {
// 配置消息推送参数

5
kicc-platform/kicc-platform-biz/kicc-common-biz/src/main/resources/mapper/UserPushMapper.xml

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
<?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.cloud.kicc.commonbiz.mapper.UserPushMapper">
</mapper>
Loading…
Cancel
Save