Browse Source

消息推送

master
liupopo 2 years ago
parent
commit
cd96921473
  1. 14
      docs/databases/tables_create.sql
  2. 151
      mallplus-admin/src/main/java/com/zscat/mallplus/unipush/UniPushService.java
  3. 8
      mallplus-admin/src/main/resources/application-dev.properties
  4. 4
      mallplus-mbg/src/main/java/com/zscat/mallplus/ums/entity/SysMessage.java
  5. 4
      mallplus-mbg/src/main/java/com/zscat/mallplus/unipush/entity/PushCids.java
  6. 3
      mallplus-mbg/src/main/java/com/zscat/mallplus/utils/PhoneUtil.java
  7. 15
      mallplus-portal/src/main/java/com/zscat/mallplus/single/SingelHomeController.java
  8. 16
      mallplus-portal/src/main/java/com/zscat/mallplus/unipush/PushCidsService.java
  9. 3
      mallplus-portal/src/main/resources/application-dev.properties
  10. 8
      mallplus-portal/src/main/resources/application.properties
  11. 4
      mallplusui-web-admin/config/dev.env.js
  12. BIN
      mallplusui-web-admin/static/tz.png
  13. BIN
      mallplusui-web-admin/static/tzf.png
  14. BIN
      mallplusui-web-admin/static/tzy.png

14
docs/databases/tables_create.sql

@ -29,4 +29,16 @@ CREATE TABLE `push_cids` (
`userPhone` varchar(100) DEFAULT NULL COMMENT '用户手机号', `userPhone` varchar(100) DEFAULT NULL COMMENT '用户手机号',
`userId` bigint(32) DEFAULT NULL COMMENT '用户ID', `userId` bigint(32) DEFAULT NULL COMMENT '用户ID',
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `sys_message_task` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL DEFAULT '1' COMMENT '用户id',
`code` varchar(60) DEFAULT '系统消息' COMMENT '消息编码',
`params` varchar(5000) DEFAULT NULL COMMENT '参数',
`content` text COMMENT '内容',
`sendtime` date NOT NULL COMMENT '发送时间',
`status` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '0未发送,1已发送',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='定时消息';

151
mallplus-admin/src/main/java/com/zscat/mallplus/unipush/UniPushService.java

@ -1,16 +1,22 @@
package com.zscat.mallplus.unipush; package com.zscat.mallplus.unipush;
import cn.hutool.json.JSONUtil;
import com.getui.push.v2.sdk.ApiHelper; import com.getui.push.v2.sdk.ApiHelper;
import com.getui.push.v2.sdk.GtApiConfiguration; import com.getui.push.v2.sdk.GtApiConfiguration;
import com.getui.push.v2.sdk.api.PushApi; import com.getui.push.v2.sdk.api.PushApi;
import com.getui.push.v2.sdk.common.ApiResult; import com.getui.push.v2.sdk.common.ApiResult;
import com.getui.push.v2.sdk.dto.req.Audience; import com.getui.push.v2.sdk.dto.req.Audience;
import com.getui.push.v2.sdk.dto.req.AudienceDTO;
import com.getui.push.v2.sdk.dto.req.message.PushDTO; import com.getui.push.v2.sdk.dto.req.message.PushDTO;
import com.getui.push.v2.sdk.dto.req.message.PushMessage; import com.getui.push.v2.sdk.dto.req.message.PushMessage;
import com.getui.push.v2.sdk.dto.req.message.android.GTNotification; import com.getui.push.v2.sdk.dto.req.message.android.GTNotification;
import com.getui.push.v2.sdk.dto.res.TaskIdDTO;
import com.zscat.mallplus.ums.entity.SysMessage;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
@Component @Component
@ -130,9 +136,152 @@ public class UniPushService {
} }
public void testlist() {
String taskid = createMessageTaskaa();
AudienceDTO pdto = new AudienceDTO();
Audience audience = new Audience();
audience.addCid("89e286aee78d38faf748a690e603b1a3");
audience.addCid("e4a96929cc5f40c886cb517853356bc2");
pdto.setAudience(audience);
pdto.setTaskid(taskid);
ApiResult<Map<String, Map<String, String>>> mapApiResult = singlePushApi().pushListByCid(pdto);
System.out.println(mapApiResult);
}
public String createMessageTaskaa() {
PushDTO<Audience> pdto = new PushDTO<>();
pdto.setGroupName("群发消息");
PushMessage pushMessage = new PushMessage();
GTNotification notification = new GTNotification();
notification.setTitle("测试Titleaa");
notification.setBody("测试BodyXaa");
SysMessage msg = new SysMessage();
msg.setId(11);
msg.setUserId(1);
msg.setCode("云链助手");
msg.setParams("欢迎");
msg.setContent("欢迎注册汇融云链~");
msg.setCtime(System.currentTimeMillis());
// String payload = "{\"title\":\"lzh\",\"body\":\"liubody\",\"name\":\"hao\",\"userid\":101,\"msgtitle\":\"haha\"}";
String payload = JSONUtil.toJsonStr(msg);
notification.setPayload(payload);
notification.setClickType("payload");
pushMessage.setNotification(notification);
pdto.setPushMessage(pushMessage);
ApiResult<TaskIdDTO> msgg = this.singlePushApi().createMsg(pdto);
System.out.println(msgg);
return msgg.getData().getTaskId();
}
public static void main(String[] args) { public static void main(String[] args) {
new UniPushService().test(); List<String> clist = new ArrayList<>();
clist.add("079fb42d1f4f824a3defd471a432d0fe");
clist.add("89e286aee78d38faf748a690e603b1a3");
SysMessage msg = new SysMessage();
msg.setId(11);
msg.setUserId(1);
msg.setCode("交易物流");
msg.setParams("ABC");
msg.setContent("欢迎注册汇融云链~");
msg.setCtime(System.currentTimeMillis());
new UniPushService().sendPush(msg, clist);
// new UniPushService().testlist();
}
private static String imgUrltx = "http://mall.yyundong.com/tx.png";
private static String imgUrltz = "http://mall.yyundong.com/tz.png";
private static String imgUrlwl = "http://mall.yyundong.com/wl.png";
public void sendPush(SysMessage mess, List<String> cids) {
String code = mess.getCode();
if ("系统消息".equals(code)) {
sendTzMsg(mess);
} else {
sendUserMsg(mess, cids);
}
} }
private void sendUserMsg(SysMessage mess, List<String> cids) {
if (cids == null || cids.isEmpty())
return;
String taskid = createMessageTask(mess);
AudienceDTO pdto = new AudienceDTO();
Audience audience = new Audience();
cids.forEach(cid -> audience.addCid(cid));
pdto.setAudience(audience);
pdto.setTaskid(taskid);
ApiResult<Map<String, Map<String, String>>> mapApiResult = singlePushApi().pushListByCid(pdto);
}
private void sendTzMsg(SysMessage mess) {
PushDTO<String> pd = new PushDTO<>();
pd.setRequestId("all" + System.currentTimeMillis());
pd.setGroupName("system_notice");
pd.setAudience("all");
pd.setPushMessage(createPushMessage(mess));
ApiResult<TaskIdDTO> taskIdDTOApiResult = singlePushApi().pushAll(pd);
// System.out.println(taskIdDTOApiResult);
}
private PushMessage createPushMessage(SysMessage mess) {
String code = mess.getCode();
PushMessage pushMessage = new PushMessage();
GTNotification notification = new GTNotification();
// notification.setTitle(code);
// notification.setBody(mess.getParams());
notification.setTitle(mess.getParams());
notification.setBody(mess.getContent());
if ("交易物流".equals(code)) {
notification.setLogoUrl(imgUrlwl);
} else if ("云链助手".equals(code)) {
notification.setLogoUrl(imgUrltx);
} else {
notification.setLogoUrl(imgUrltz);
}
String payload = JSONUtil.toJsonStr(mess);
notification.setPayload(payload);
notification.setClickType("payload");
// notification.setClickType("payload_custom");
pushMessage.setNotification(notification);
return pushMessage;
}
private String createMessageTask(SysMessage mess) {
PushDTO<Audience> pdto = new PushDTO<>();
pdto.setGroupName("tolist");
pdto.setPushMessage(createPushMessage(mess));
ApiResult<TaskIdDTO> result = this.singlePushApi().createMsg(pdto);
// System.out.println(msgg);
return result.getData().getTaskId();
}
} }

8
mallplus-admin/src/main/resources/application-dev.properties

@ -18,11 +18,11 @@ spring.redis.pool.min-idle=0
# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 # \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
spring.redis.timeout=0 spring.redis.timeout=0
#===redis end=== #===redis end===
spring.datasource.url=jdbc:mysql://8.130.39.13:3306/mallplus1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8 #spring.datasource.url=jdbc:mysql://8.130.39.13:3306/mallplus1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8
#spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mallplus1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mallplus1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8
spring.datasource.username=root spring.datasource.username=root
#spring.datasource.password=root spring.datasource.password=root
spring.datasource.password=1LAiGz$t1*Iw #spring.datasource.password=1LAiGz$t1*Iw
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initialSize=5 spring.datasource.druid.initialSize=5

4
mallplus-mbg/src/main/java/com/zscat/mallplus/ums/entity/SysMessage.java

@ -64,7 +64,7 @@ public class SysMessage implements Serializable {
public String getCdate() { public String getCdate() {
String cdate = ""; String cdate = "";
if (ctime != null && ctime > 0) { if (ctime != null && ctime > 0) {
cdate = DateUtil.format(new Date(ctime), "yyyy-MM-dd"); cdate = DateUtil.format(new Date(ctime), "yyyy-MM-dd hh:mm:ss");
} }
return cdate; return cdate;
} }
@ -72,7 +72,7 @@ public class SysMessage implements Serializable {
public String getUdate() { public String getUdate() {
String udate = ""; String udate = "";
if (utime != null && utime > 0) { if (utime != null && utime > 0) {
udate = DateUtil.format(new Date(utime), "yyyy-MM-dd"); udate = DateUtil.format(new Date(utime), "yyyy-MM-dd hh:mm:ss");
} }
return udate; return udate;
} }

4
mallplus-mbg/src/main/java/com/zscat/mallplus/unipush/entity/PushCids.java

@ -26,6 +26,7 @@
package com.zscat.mallplus.unipush.entity; package com.zscat.mallplus.unipush.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
@ -66,7 +67,10 @@ public class PushCids implements Serializable {
@TableId(value = "id", type = IdType.AUTO) @TableId(value = "id", type = IdType.AUTO)
private Long id; private Long id;
@TableField("getuiCid")
private String getuiCid;// 个推的ClientID private String getuiCid;// 个推的ClientID
@TableField("userPhone")
private String userPhone;// 用户手机号 private String userPhone;// 用户手机号
@TableField("userId")
private Long userId;// 用户ID private Long userId;// 用户ID
} }

3
mallplus-mbg/src/main/java/com/zscat/mallplus/utils/PhoneUtil.java

@ -10,7 +10,8 @@ import java.util.regex.Pattern;
*/ */
public class PhoneUtil { public class PhoneUtil {
private static String REGEX = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$"; private static String REGEX = "^(1[3-9])\\d{9}$";
// private static String REGEX = "^((13[0-9])|(14[0-9])|(15([0-9]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$";
private static Pattern P = Pattern.compile(REGEX); private static Pattern P = Pattern.compile(REGEX);
/** /**

15
mallplus-portal/src/main/java/com/zscat/mallplus/single/SingelHomeController.java

@ -368,7 +368,7 @@ public class SingelHomeController {
log.info("用户名或密码错误"); log.info("用户名或密码错误");
return new CommonResult().failed("用户名或密码错误"); return new CommonResult().failed("用户名或密码错误");
} }
if (StringUtils.isNotBlank(cid) && StringUtils.isNotBlank(phone)) { if (StringUtils.isNotBlank(cid) && StringUtils.isNotBlank(phone) && !"null".equals(cid)) {
ThreadUtil.execute(() -> pushCidsService.bindPhone(cid, phone)); ThreadUtil.execute(() -> pushCidsService.bindPhone(cid, phone));
} }
return new CommonResult().success(token); return new CommonResult().success(token);
@ -399,7 +399,7 @@ public class SingelHomeController {
if (token.get("token") == null) { if (token.get("token") == null) {
return new CommonResult().validateFailed("用户名或密码错误"); return new CommonResult().validateFailed("用户名或密码错误");
} }
if (StringUtils.isNotBlank(cid) && StringUtils.isNotBlank(phone)) { if (StringUtils.isNotBlank(cid) && StringUtils.isNotBlank(phone) && !"null".equals(cid)) {
ThreadUtil.execute(() -> pushCidsService.bindPhone(cid, phone)); ThreadUtil.execute(() -> pushCidsService.bindPhone(cid, phone));
} }
return new CommonResult().success(token); return new CommonResult().success(token);
@ -470,6 +470,12 @@ public class SingelHomeController {
if (StringUtils.isBlank(type)) { if (StringUtils.isBlank(type)) {
return new CommonResult().failed("参数错误:type"); return new CommonResult().failed("参数错误:type");
} }
UmsMember byUsername = memberService.getByUsername(phone);
if (byUsername == null) {
return new CommonResult().failed("该手机号未注册!");
}
//缓存识别码 //缓存识别码
String redisKey = ""; String redisKey = "";
if (SmsEnum.SendEnum.LOGIN.getCode().equals(type)) { if (SmsEnum.SendEnum.LOGIN.getCode().equals(type)) {
@ -616,8 +622,9 @@ public class SingelHomeController {
@ApiOperation(value = "登出功能") @ApiOperation(value = "登出功能")
@RequestMapping(value = "/logout", method = RequestMethod.POST) @RequestMapping(value = "/logout", method = RequestMethod.POST)
@ResponseBody @ResponseBody
public Object logout() { public Object logout(@RequestParam("cid") String cid) {
SecurityContextHolder.getContext().setAuthentication(null); SecurityContextHolder.getContext().setAuthentication(null);
ThreadUtil.execute(() -> pushCidsService.unbindPhone(cid));
return new CommonResult().success(null); return new CommonResult().success(null);
} }
@ -629,6 +636,6 @@ public class SingelHomeController {
if (StringUtils.isNotBlank(cid)) { if (StringUtils.isNotBlank(cid)) {
ThreadUtil.execute(() -> pushCidsService.pushCid(cid)); ThreadUtil.execute(() -> pushCidsService.pushCid(cid));
} }
return new CommonResult().success(); return new CommonResult().success("OK");
} }
} }

16
mallplus-portal/src/main/java/com/zscat/mallplus/unipush/PushCidsService.java

@ -25,6 +25,7 @@
*********************************************************/ *********************************************************/
package com.zscat.mallplus.unipush; package com.zscat.mallplus.unipush;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@ -69,10 +70,8 @@ public class PushCidsService extends ServiceImpl<PushCidsMapper, PushCids> {
if (list != null && list.size() == 1) { // 只有一条cid数据,判断是否和手机号相同 if (list != null && list.size() == 1) { // 只有一条cid数据,判断是否和手机号相同
PushCids pc = list.get(0); PushCids pc = list.get(0);
if (!phone.equals(pc.getUserPhone())) { // 手机号不同或为空,更新手机号 if (!phone.equals(pc.getUserPhone())) { // 手机号不同或为空,更新手机号
UpdateWrapper<PushCids> uw = new UpdateWrapper<>(); pc.setUserPhone(phone);
uw.set("userPhone", phone); baseMapper.updateById(pc);
uw.eq("getuiCid", cid);
baseMapper.update(null, uw);
} }
return; return;
} }
@ -91,4 +90,13 @@ public class PushCidsService extends ServiceImpl<PushCidsMapper, PushCids> {
uw.eq("getuiCid", cid); uw.eq("getuiCid", cid);
baseMapper.delete(uw); baseMapper.delete(uw);
} }
public void unbindPhone(String cid) {
if (StrUtil.isBlank(cid))
return;
UpdateWrapper<PushCids> uw = new UpdateWrapper<>();
uw.set("userPhone", "");
uw.eq("getuiCid", cid);
baseMapper.update(null, uw);
}
} }

3
mallplus-portal/src/main/resources/application-dev.properties

@ -44,7 +44,8 @@ spring.redis.host=127.0.0.1
# Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\u53E3 # Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\u53E3
spring.redis.port=6379 spring.redis.port=6379
# Redis\u670D\u52A1\u5668\u8FDE\u63A5\u5BC6\u7801\uFF08\u9ED8\u8BA4\u4E3A\u7A7A\uFF09 # Redis\u670D\u52A1\u5668\u8FDE\u63A5\u5BC6\u7801\uFF08\u9ED8\u8BA4\u4E3A\u7A7A\uFF09
spring.redis.password=123456 spring.redis.password=
#spring.redis.password=123456
# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09 # \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
spring.redis.pool.max-active=8 spring.redis.pool.max-active=8
# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09 # \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09

8
mallplus-portal/src/main/resources/application.properties

@ -53,10 +53,10 @@ oss.aliyun.first.bucketName=yxt-sc
oss.aliyun.first.endPoint=oss-cn-huhehaote.aliyuncs.com oss.aliyun.first.endPoint=oss-cn-huhehaote.aliyuncs.com
oss.aliyun.first.styleName= oss.aliyun.first.styleName=
oss.aliyun.first.prefix=web oss.aliyun.first.prefix=web
oss.aliyun.second.accessKeyId=\u02A1\uFFFD\uFFFD... #oss.aliyun.second.accessKeyId=\u02A1\uFFFD\uFFFD...
oss.aliyun.second.accessKeySecret=\u02A1\uFFFD\uFFFD... #oss.aliyun.second.accessKeySecret=\u02A1\uFFFD\uFFFD...
oss.aliyun.second.accessKeyId=\u7701\u951F\u65A4\u62F7... #oss.aliyun.second.accessKeyId=\u7701\u951F\u65A4\u62F7...
oss.aliyun.second.accessKeySecret=\u7701\u951F\u65A4\u62F7... #oss.aliyun.second.accessKeySecret=\u7701\u951F\u65A4\u62F7...
oss.aliyun.second.bucketName=peterjava oss.aliyun.second.bucketName=peterjava
oss.aliyun.second.endPoint=oss-cn-huhehaote.aliyuncs.com oss.aliyun.second.endPoint=oss-cn-huhehaote.aliyuncs.com
oss.aliyun.second.styleName= oss.aliyun.second.styleName=

4
mallplusui-web-admin/config/dev.env.js

@ -4,7 +4,7 @@ const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, { module.exports = merge(prodEnv, {
NODE_ENV: '"development"', NODE_ENV: '"development"',
BASE_API: '"http://mall.yyundong.com/adminapi"', // BASE_API: '"http://mall.yyundong.com/adminapi"',
// BASE_API: '"http://192.168.3.9:8085"' // BASE_API: '"http://192.168.3.9:8085"'
// BASE_API: '"http://127.0.0.1:8085"' BASE_API: '"http://127.0.0.1:8085"'
}) })

BIN
mallplusui-web-admin/static/tz.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
mallplusui-web-admin/static/tzf.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
mallplusui-web-admin/static/tzy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Loading…
Cancel
Save