视频86(敏感词,黑名单,携号转网)

master
Administrator 3 years ago
parent e90cbff146
commit 29ee4f7ad6

@ -23,6 +23,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
/** /**
* @author zjw * @author zjw
@ -91,8 +92,9 @@ public class SmsController {
//=========================调用策略模式的校验链========================================= //=========================调用策略模式的校验链=========================================
checkFilterContext.check(submit); checkFilterContext.check(submit);
//========================基于雪花算法生成唯一id并添加到StandardSubmit对象中========================================= //========================基于雪花算法生成唯一id并添加到StandardSubmit对象中,并设置发送时间=========================================
submit.setSequenceId(snowFlakeUtil.nextId()); submit.setSequenceId(snowFlakeUtil.nextId());
submit.setSendTime(LocalDateTime.now());
//=========================发送到MQ交给策略模块处理========================================= //=========================发送到MQ交给策略模块处理=========================================
rabbitTemplate.convertAndSend(RabbitMQConstants.SMS_PRE_SEND,submit,new CorrelationData(submit.getSequenceId().toString())); rabbitTemplate.convertAndSend(RabbitMQConstants.SMS_PRE_SEND,submit,new CorrelationData(submit.getSequenceId().toString()));

@ -33,5 +33,20 @@ public interface CacheConstant {
*/ */
String DIRTY_WORD = "dirty_word"; String DIRTY_WORD = "dirty_word";
/**
*
*/
String BLACK = "black:";
/**
*
*/
String SEPARATE = ":";
/**
*
*/
String TRANSFER = "transfer:";
} }

@ -17,4 +17,16 @@ public interface RabbitMQConstants {
* & * &
*/ */
String MOBILE_AREA_OPERATOR = "mobile_area_operator_topic"; String MOBILE_AREA_OPERATOR = "mobile_area_operator_topic";
/**
* Elasticsearch
*/
String SMS_WRITE_LOG = "sms_write_log_topic";
/**
*
*/
String SMS_PUSH_REPORT = "sms_push_report_topic";
} }

@ -0,0 +1,20 @@
package com.mashibing.common.constant;
/**
*
* @author zjw
* @description
*/
public interface SmsConstant {
/**
*
*/
int REPORT_SUCCESS = 1;
/**
*
*/
int REPORT_FAIL = 2;
}

@ -18,9 +18,12 @@ public enum ExceptionEnums {
PARAMETER_ERROR(-10,"参数不合法!"), PARAMETER_ERROR(-10,"参数不合法!"),
SNOWFLAKE_OUT_OF_RANGE(-11,"雪花算法的机器id或服务id超出最大范围"), SNOWFLAKE_OUT_OF_RANGE(-11,"雪花算法的机器id或服务id超出最大范围"),
SNOWFLAKE_TIME_BACK(-12,"雪花算法的服务器出现时间回拨问题!"), SNOWFLAKE_TIME_BACK(-12,"雪花算法的服务器出现时间回拨问题!"),
HAVE_DIRTY_WORD(-13,"当前短信内容中包含敏感词信息!"),
BLACK_GLOBAL(-14,"当前手机号为平台黑名单!"),
BLACK_CLIENT(-15,"当前手机号为客户黑名单!"),
; ;
private Integer code;
private Integer code;
private String msg; private String msg;
ExceptionEnums(Integer code, String msg) { ExceptionEnums(Integer code, String msg) {

@ -0,0 +1,27 @@
package com.mashibing.common.exception;
import com.mashibing.common.enums.ExceptionEnums;
import lombok.Getter;
/**
*
* @author zjw
* @description
*/
@Getter
public class StrategyException extends RuntimeException {
private Integer code;
public StrategyException(String message, Integer code) {
super(message);
this.code = code;
}
public StrategyException(ExceptionEnums enums) {
super(enums.getMsg());
this.code = enums.getCode();
}
}

@ -0,0 +1,62 @@
package com.mashibing.common.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
*
* @author zjw
* @description
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class StandardReport implements Serializable {
/**
*
*/
private Long sequenceId;
/**
* IDapikeyID
*/
private Long clientId;
/**
* uid
*/
private String uid;
/**
*
*/
private String mobile;
/**
*
*/
private LocalDateTime sendTime;
/**
* 0-/ing1-2- 0
*/
private int reportState;
/**
*
*/
private String errorMsg;
/**
*
*/
private Integer isCallback;
private String callbackUrl;
}

@ -70,7 +70,7 @@ public class StandardSubmit implements Serializable {
/** /**
* 0451 0455 * 0451 0455
*/ */
private Integer areaCode; private Integer areaCode;
@ -94,6 +94,11 @@ public class StandardSubmit implements Serializable {
*/ */
private int reportState; private int reportState;
/**
*
*/
private String errorMsg;
// ============================================================================= // =============================================================================
/** /**
* IP * IP
@ -115,6 +120,10 @@ public class StandardSubmit implements Serializable {
*/ */
private Long signId; private Long signId;
/**
* isTransfer = true
*/
private Boolean isTransfer = false;
// 后续再做封装~~~~ // 后续再做封装~~~~

@ -50,6 +50,12 @@
<artifactId>ikanalyzer</artifactId> <artifactId>ikanalyzer</artifactId>
<version>2012_u6</version> <version>2012_u6</version>
</dependency> </dependency>
<!-- 导入hutool工具类-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-dfa</artifactId>
<version>5.8.12</version>
</dependency>
</dependencies> </dependencies>

@ -18,9 +18,15 @@ public interface BeaconCacheClient {
@GetMapping("/cache/hget/{key}/{field}") @GetMapping("/cache/hget/{key}/{field}")
String hget(@PathVariable(value = "key")String key, @PathVariable(value = "field")String field); String hget(@PathVariable(value = "key")String key, @PathVariable(value = "field")String field);
@GetMapping("/cache/hget/{key}/{field}")
Integer hgetInteger(@PathVariable(value = "key")String key, @PathVariable(value = "field")String field);
@GetMapping(value = "/cache/get/{key}") @GetMapping(value = "/cache/get/{key}")
String getString(@PathVariable(value = "key") String key); String getString(@PathVariable(value = "key") String key);
@PostMapping(value = "/cache/sinterstr/{key}/{sinterKey}") @PostMapping(value = "/cache/sinterstr/{key}/{sinterKey}")
Set<Object> sinterStr(@PathVariable(value = "key")String key, @PathVariable String sinterKey, @RequestBody String... value); Set<Object> sinterStr(@PathVariable(value = "key")String key, @PathVariable String sinterKey, @RequestBody String... value);
@GetMapping("/cache/smember/{key}")
Set<String> smember(@PathVariable(value = "key")String key);
} }

@ -23,4 +23,22 @@ public class RabbitMQConfig {
return QueueBuilder.durable(RabbitMQConstants.MOBILE_AREA_OPERATOR).build(); return QueueBuilder.durable(RabbitMQConstants.MOBILE_AREA_OPERATOR).build();
} }
/**
*
* @return
*/
@Bean
public Queue writeLogQueue(){
return QueueBuilder.durable(RabbitMQConstants.SMS_WRITE_LOG).build();
}
/**
*
* @return
*/
@Bean
public Queue pushReportQueue(){
return QueueBuilder.durable(RabbitMQConstants.SMS_PUSH_REPORT).build();
}
} }

@ -0,0 +1,53 @@
package com.mashibing.strategy.filter.impl;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.common.enums.ExceptionEnums;
import com.mashibing.common.exception.StrategyException;
import com.mashibing.common.model.StandardSubmit;
import com.mashibing.strategy.client.BeaconCacheClient;
import com.mashibing.strategy.filter.StrategyFilter;
import com.mashibing.strategy.util.ErrorSendMsgUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
*
* @author zjw
* @description
*/
@Service(value = "blackClient")
@Slf4j
public class BlackClientStrategyFilter implements StrategyFilter {
@Autowired
private ErrorSendMsgUtil sendMsgUtil;
@Autowired
private BeaconCacheClient cacheClient;
// 黑名单的默认value
private final String TRUE = "1";
@Override
public void strategy(StandardSubmit submit) {
log.info("【策略模块-客户级别黑名单校验】 校验ing…………");
//1、获取发送短信的手机号,以及客户的ID
String mobile = submit.getMobile();
Long clientId = submit.getClientId();
//2、调用Redis查询
String value = cacheClient.getString(CacheConstant.BLACK + clientId + CacheConstant.SEPARATE + mobile);
//3、如果查询的结果为"1",代表是黑名单
if(TRUE.equals(value)){
log.info("【策略模块-客户级别黑名单校验】 当前发送的手机号是客户黑名单! mobile = {}",mobile);
submit.setErrorMsg(ExceptionEnums.BLACK_CLIENT + ",mobile = " + mobile);
sendMsgUtil.sendWriteLog(submit);
sendMsgUtil.sendPushReport(submit);
throw new StrategyException(ExceptionEnums.BLACK_CLIENT);
}
//4、不是1正常结束
log.info("【策略模块-客户级别黑名单校验】 当前手机号不是客户黑名单! ");
}
}

@ -0,0 +1,52 @@
package com.mashibing.strategy.filter.impl;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.common.enums.ExceptionEnums;
import com.mashibing.common.exception.StrategyException;
import com.mashibing.common.model.StandardSubmit;
import com.mashibing.strategy.client.BeaconCacheClient;
import com.mashibing.strategy.filter.StrategyFilter;
import com.mashibing.strategy.util.ErrorSendMsgUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
*
* @author zjw
* @description
*/
@Service(value = "blackGlobal")
@Slf4j
public class BlackGlobalStrategyFilter implements StrategyFilter {
@Autowired
private ErrorSendMsgUtil sendMsgUtil;
@Autowired
private BeaconCacheClient cacheClient;
// 黑名单的默认value
private final String TRUE = "1";
@Override
public void strategy(StandardSubmit submit) {
log.info("【策略模块-全局级别黑名单校验】 校验ing…………");
//1、获取发送短信的手机号
String mobile = submit.getMobile();
//2、调用Redis查询
String value = cacheClient.getString(CacheConstant.BLACK + mobile);
//3、如果查询的结果为"1",代表是黑名单
if(TRUE.equals(value)){
log.info("【策略模块-全局级别黑名单校验】 当前手机号是黑名单! mobile = {}",mobile);
submit.setErrorMsg(ExceptionEnums.BLACK_GLOBAL.getMsg() + ",mobile = " + mobile);
sendMsgUtil.sendWriteLog(submit);
sendMsgUtil.sendPushReport(submit);
throw new StrategyException(ExceptionEnums.BLACK_GLOBAL);
}
//4、不是1正常结束
log.info("【策略模块-全局级别黑名单校验】 当前手机号不是黑名单!");
}
}

@ -1,20 +0,0 @@
package com.mashibing.strategy.filter.impl;
import com.mashibing.common.model.StandardSubmit;
import com.mashibing.strategy.filter.StrategyFilter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
*
* @author zjw
* @description
*/
@Service(value = "black")
@Slf4j
public class BlackStrategyFilter implements StrategyFilter {
@Override
public void strategy(StandardSubmit submit) {
log.info("【策略模块-黑名单校验】 校验ing…………");
}
}

@ -0,0 +1,46 @@
package com.mashibing.strategy.filter.impl;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.common.model.StandardSubmit;
import com.mashibing.strategy.client.BeaconCacheClient;
import com.mashibing.strategy.filter.StrategyFilter;
import com.mashibing.strategy.util.DFAUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
import java.io.IOException;
import java.io.StringReader;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
/**
*
*
* @author zjw
* @description
*/
@Service(value = "dfaDirtyWord")
@Slf4j
public class DirtyWordDFAStrategyFilter implements StrategyFilter {
@Override
public void strategy(StandardSubmit submit) {
log.info("【策略模块-敏感词校验】 校验ing…………");
//1、 获取短信内容
String text = submit.getText();
//2、 调用DFA查看敏感词
Set<String> dirtyWords = DFAUtil.getDirtyWord(text);
//4、 根据返回的set集合判断是否包含敏感词
if (dirtyWords != null && dirtyWords.size() > 0) {
//5、 如果有敏感词,抛出异常 / 其他操作。。
log.info("【策略模块-敏感词校验】 短信内容包含敏感词信息, dirtyWords = {}", dirtyWords);
// 还需要做其他处理
}
}
}

@ -0,0 +1,73 @@
package com.mashibing.strategy.filter.impl;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.common.constant.RabbitMQConstants;
import com.mashibing.common.constant.SmsConstant;
import com.mashibing.common.enums.ExceptionEnums;
import com.mashibing.common.exception.StrategyException;
import com.mashibing.common.model.StandardReport;
import com.mashibing.common.model.StandardSubmit;
import com.mashibing.strategy.client.BeaconCacheClient;
import com.mashibing.strategy.filter.StrategyFilter;
import com.mashibing.strategy.util.DFAUtil;
import com.mashibing.strategy.util.ErrorSendMsgUtil;
import com.mashibing.strategy.util.HutoolDFAUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Set;
/**
*
*
* @author zjw
* @description
*/
@Service(value = "hutoolDFADirtyWord")
@Slf4j
public class DirtyWordHutoolDFAStrategyFilter implements StrategyFilter {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private BeaconCacheClient cacheClient;
@Autowired
private ErrorSendMsgUtil sendMsgUtil;
@Override
public void strategy(StandardSubmit submit) {
log.info("【策略模块-敏感词校验】 校验ing…………");
//1、 获取短信内容
String text = submit.getText();
//2、 调用DFA查看敏感词
List<String> dirtyWords = HutoolDFAUtil.getDirtyWord(text);
//4、 根据返回的set集合判断是否包含敏感词
if (dirtyWords != null && dirtyWords.size() > 0) {
//5、 如果有敏感词,抛出异常 / 其他操作。。
log.info("【策略模块-敏感词校验】 短信内容包含敏感词信息, dirtyWords = {}", dirtyWords);
// ================================发送写日志================================
submit.setErrorMsg(ExceptionEnums.HAVE_DIRTY_WORD.getMsg() + "dirtyWords = " + dirtyWords.toString());
sendMsgUtil.sendWriteLog(submit);
// ================================发送状态报告的消息前需要将report对象数据封装================================
sendMsgUtil.sendPushReport(submit);
// // ================================抛出异常================================
throw new StrategyException(ExceptionEnums.HAVE_DIRTY_WORD);
}
log.info("【策略模块-敏感词校验】 校验通过,没有敏感词信息");
}
}

@ -18,6 +18,7 @@ import java.util.UUID;
/** /**
* *
*
* @author zjw * @author zjw
* @description * @description
*/ */

@ -0,0 +1,48 @@
package com.mashibing.strategy.filter.impl;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.common.model.StandardSubmit;
import com.mashibing.strategy.client.BeaconCacheClient;
import com.mashibing.strategy.filter.StrategyFilter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
*
* @author zjw
* @description
*/
@Service(value = "transfer")
@Slf4j
public class TransferStrategyFilter implements StrategyFilter {
// 代表携号转网了!
private final Boolean TRANSFER = true;
@Autowired
private BeaconCacheClient cacheClient;
@Override
public void strategy(StandardSubmit submit) {
log.info("【策略模块-携号转网策略】 ing…………");
//1、获取用户手机号
String mobile = submit.getMobile();
//2、直接基于Redis查询携号转网信息
String value = cacheClient.getString(CacheConstant.TRANSFER + mobile);
//3、如果存在携号转网设置运营商信息
if(!StringUtils.isEmpty(value)){
// 代表携号转网了
submit.setOperatorId(Integer.valueOf(value));
submit.setIsTransfer(TRANSFER);
log.info("【策略模块-携号转网策略】 当前手机号携号转网了!");
return;
}
log.info("【策略模块-携号转网策略】 嘛事没有!");
}
}

@ -1,6 +1,7 @@
package com.mashibing.strategy.mq; package com.mashibing.strategy.mq;
import com.mashibing.common.constant.RabbitMQConstants; import com.mashibing.common.constant.RabbitMQConstants;
import com.mashibing.common.exception.StrategyException;
import com.mashibing.common.model.StandardSubmit; import com.mashibing.common.model.StandardSubmit;
import com.mashibing.strategy.filter.StrategyFilterContext; import com.mashibing.strategy.filter.StrategyFilterContext;
import com.rabbitmq.client.Channel; import com.rabbitmq.client.Channel;
@ -9,6 +10,7 @@ import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import rx.BackpressureOverflow;
import java.io.IOException; import java.io.IOException;
@ -31,14 +33,17 @@ public class PreSendListener {
@RabbitListener(queues = RabbitMQConstants.SMS_PRE_SEND) @RabbitListener(queues = RabbitMQConstants.SMS_PRE_SEND)
public void listen(StandardSubmit submit, Message message, Channel channel) throws IOException { public void listen(StandardSubmit submit, Message message, Channel channel) throws IOException {
log.info("【策略模块-接收消息】 接收到接口模块发送的消息 submit = {}",submit); log.info("【策略模块-接收消息】 接收到接口模块发送的消息 submit = {}",submit);
System.out.println("start:" + System.currentTimeMillis());
// 处理业务………… // 处理业务…………
try { try {
filterContext.strategy(submit); filterContext.strategy(submit);
log.info("【策略模块-消费完毕】手动ack"); log.info("【策略模块-消费完毕】手动ack");
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false); channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
} catch (IOException e) { } catch (StrategyException e) {
e.printStackTrace(); log.info("【策略模块-消费失败】校验未通过, msg = {}",e.getMessage());
log.error("【策略模块-消费失败】凉凉~~~"); channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
}finally {
System.out.println("end:" + System.currentTimeMillis());
} }
} }
} }

@ -0,0 +1,130 @@
package com.mashibing.strategy.util;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.strategy.client.BeaconCacheClient;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* @author zjw
* @description
*/
public class DFAUtil {
// 敏感词树
private static Map dfaMap = new HashMap<>();
private static final String IS_END = "isEnd";
private static final String NOT_END = "0";
private static final String ALREADY_END = "1";
/**
*
*/
static {
// 获取Spring容器中的cacheClient
BeaconCacheClient cacheClient = (BeaconCacheClient) SpringUtil.getBeanByClass(BeaconCacheClient.class);
// 获取存储在Redis中的全部敏感词
Set<String> dirtyWords = cacheClient.smember(CacheConstant.DIRTY_WORD);
// 调用create将dfaMap的敏感词树构建
create(dirtyWords);
}
/**
*
* @param dirtyWords
*/
public static void create(Set<String> dirtyWords) {
//1、 声明一个Map作为临时存储
Map nowMap;
//2、遍历敏感词库
for (String dirtyWord : dirtyWords) {
nowMap = dfaMap;
// 每个词,依次获取
for (int i = 0; i < dirtyWord.length(); i++) {
// 获取敏感词的每个字
String word = String.valueOf(dirtyWord.charAt(i));
// 判断当前的敏感词树中是否包含当前的字
Map map = (Map) nowMap.get(word);
if (map == null) {
// 当前敏感词树中没有这个字
map = new HashMap();
// 将当前的敏感词存入
nowMap.put(word, map);
}
// 操作当前key对应的value的map
nowMap = map;
// 如果当前的字已经有IS_END了并且值为1直接不管
if (nowMap.containsKey(IS_END) && nowMap.get(IS_END).equals(ALREADY_END)) {
continue;
}
// 如果当前的isEnd没有或者是0需要考虑需要改为1
if (i == dirtyWord.length() - 1) {
// 到最后一个字了。
nowMap.put(IS_END, ALREADY_END);
} else {
// isEnd之前就是0或者压根就没有isEnd
nowMap.putIfAbsent(IS_END, NOT_END);
}
}
}
}
/**
*
* @param text
* @return
*/
public static Set<String> getDirtyWord(String text) {
// 1、作为返回结果存储敏感词的位置
Set<String> dirtyWords = new HashSet<>();
// 2、循环遍历文本内容
for (int i = 0; i < text.length(); i++) {
// 临时存储索引位置的变量
int nextLength = 0;
int dirtyLength = 0;
// 获取最外层key的map
Map nowMap = dfaMap;
// 外层是索引向后动匹配最外层的key
// 内层是在匹配上一个后继续向内部匹配内部的key
for (int j = i; j < text.length(); j++) {
// 获取当前索引位置的字
String word = String.valueOf(text.charAt(j));
// 先匹配最外层的key
nowMap = (Map) nowMap.get(word);
// 判断
if (nowMap == null) {
// 没有这个字开头的敏感词
break;
} else {
// 敏感词长度从i开始算现在的是dirtyLength
dirtyLength++;
// 出口即是当前的map的isEnd是1代表结束了。已经找到完整的敏感词
if (ALREADY_END.equals(nowMap.get(IS_END))) {
// 代表敏感词匹配到一个完整的
nextLength = dirtyLength;
break;
}
}
}
// 判断是否匹配上了敏感词
if (nextLength > 0) {
// 匹配上了添加敏感词到set同时移动外层索引
dirtyWords.add(text.substring(i, i + nextLength));
// -1的原因是外层for循环会对i进行++
i = i + nextLength - 1;
}
}
// 返回
return dirtyWords;
}
}

@ -0,0 +1,64 @@
package com.mashibing.strategy.util;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.common.constant.RabbitMQConstants;
import com.mashibing.common.constant.SmsConstant;
import com.mashibing.common.enums.ExceptionEnums;
import com.mashibing.common.model.StandardReport;
import com.mashibing.common.model.StandardSubmit;
import com.mashibing.strategy.client.BeaconCacheClient;
import org.apache.commons.lang.StringUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author zjw
* @description
*/
@Component
public class ErrorSendMsgUtil {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private BeaconCacheClient cacheClient;
/**
*
* @param submit
*/
public void sendWriteLog(StandardSubmit submit) {
submit.setReportState(SmsConstant.REPORT_FAIL);
// 发送消息到写日志队列
rabbitTemplate.convertAndSend(RabbitMQConstants.SMS_WRITE_LOG,submit);
}
/**
*
*/
public void sendPushReport(StandardSubmit submit) {
// 查询当前客户的isCallback
Integer isCallback = cacheClient.hgetInteger(CacheConstant.CLIENT_BUSINESS + submit.getApikey(), "isCallback");
// 查看是否需要给客户一个回调
if(isCallback == 1){
// 如果需要回调,再查询客户的回调地址
String callbackUrl = cacheClient.hget(CacheConstant.CLIENT_BUSINESS + submit.getApikey(), "callbackUrl");
// 如果回调地址不为空。
if(!StringUtils.isEmpty(callbackUrl)){
// 封装客户的报告推送的信息开始封装StandardReport
StandardReport report = new StandardReport();
BeanUtils.copyProperties(submit,report);
report.setIsCallback(isCallback);
report.setCallbackUrl(callbackUrl);
// 发送消息到RabbitMQ
rabbitTemplate.convertAndSend(RabbitMQConstants.SMS_PUSH_REPORT,report);
}
}
}
}

@ -0,0 +1,35 @@
package com.mashibing.strategy.util;
import cn.hutool.dfa.WordTree;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.strategy.client.BeaconCacheClient;
import java.util.List;
import java.util.Set;
/**
* @author zjw
* @description
*/
public class HutoolDFAUtil {
private static WordTree wordTree = new WordTree();
/**
*
*/
static {
// 获取Spring容器中的cacheClient
BeaconCacheClient cacheClient = (BeaconCacheClient) SpringUtil.getBeanByClass(BeaconCacheClient.class);
// 获取存储在Redis中的全部敏感词
Set<String> dirtyWords = cacheClient.smember(CacheConstant.DIRTY_WORD);
// 调用WordTree的add方法将dfaMap的敏感词树构建
wordTree.addWords(dirtyWords);
}
public static List<String> getDirtyWord(String text){
return wordTree.matchAll(text);
}
}

@ -0,0 +1,29 @@
package com.mashibing.strategy.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* @author zjw
* @description
*/
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringUtil.applicationContext = applicationContext;
}
public static Object getBeanByName(String beanName){
return SpringUtil.applicationContext.getBean(beanName);
}
public static Object getBeanByClass(Class clazz){
return SpringUtil.applicationContext.getBean(clazz);
}
}

@ -6,6 +6,11 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.EnableFeignClients;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/** /**
* @author zjw * @author zjw
* @description * @description
@ -19,4 +24,5 @@ public class TestStarterApp {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(TestStarterApp.class,args); SpringApplication.run(TestStarterApp.class,args);
} }
} }

@ -0,0 +1,29 @@
package com.mashibing.test.entity;
/**
* @author zjw
* @description
*/
public class MobileBlack {
private String blackNumber;
private Integer clientId;
public String getBlackNumber() {
return blackNumber;
}
public void setBlackNumber(String blackNumber) {
this.blackNumber = blackNumber;
}
public Integer getClientId() {
return clientId;
}
public void setClientId(Integer clientId) {
this.clientId = clientId;
}
}

@ -0,0 +1,30 @@
package com.mashibing.test.entity;
/**
* @author zjw
* @description
*/
public class MobileTransfer {
// 手机号
private String transferNumber;
// 最终运营商
private Integer nowIsp;
public String getTransferNumber() {
return transferNumber;
}
public void setTransferNumber(String transferNumber) {
this.transferNumber = transferNumber;
}
public Integer getNowIsp() {
return nowIsp;
}
public void setNowIsp(Integer nowIsp) {
this.nowIsp = nowIsp;
}
}

@ -0,0 +1,18 @@
package com.mashibing.test.mapper;
import com.mashibing.test.entity.MobileArea;
import com.mashibing.test.entity.MobileBlack;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author zjw
* @description
*/
public interface MobileBlackMapper {
@Select("select black_number,client_id from mobile_black where is_delete = 0")
List<MobileBlack> findAll();
}

@ -0,0 +1,18 @@
package com.mashibing.test.mapper;
import com.mashibing.test.entity.MobileBlack;
import com.mashibing.test.entity.MobileTransfer;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author zjw
* @description
*/
public interface MobileTransferMapper {
@Select("select transfer_number,now_isp from mobile_transfer where is_transfer = 1 and is_delete = 0")
List<MobileTransfer> findAll();
}

@ -0,0 +1,40 @@
package com.mashibing.test.mapper;
import com.mashibing.test.client.CacheClient;
import com.mashibing.test.entity.MobileArea;
import com.mashibing.test.entity.MobileBlack;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SpringBootTest
@RunWith(SpringRunner.class)
public class MobileBlackMapperTest {
@Autowired
private MobileBlackMapper mapper;
@Autowired
private CacheClient cacheClient;
@Test
public void findAll() {
List<MobileBlack> mobileBlackList = mapper.findAll();
for (MobileBlack mobileBlack : mobileBlackList) {
if(mobileBlack.getClientId() == 0){
// 平台级别的黑名单 black:手机号 作为key
cacheClient.set("black:" + mobileBlack.getBlackNumber(),"1");
}else{
// 客户级别的黑名单 black:clientId:手机号
cacheClient.set("black:" + mobileBlack.getClientId() + ":" +mobileBlack.getBlackNumber(),"1");
}
}
}
}

@ -0,0 +1,33 @@
package com.mashibing.test.mapper;
import com.mashibing.test.client.CacheClient;
import com.mashibing.test.entity.MobileBlack;
import com.mashibing.test.entity.MobileTransfer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@SpringBootTest
@RunWith(SpringRunner.class)
public class MobileTransferMapperTest {
@Autowired
private MobileTransferMapper mapper;
@Autowired
private CacheClient cacheClient;
@Test
public void findAll() {
List<MobileTransfer> list = mapper.findAll();
for (MobileTransfer mobileTransfer : list) {
cacheClient.set("transfer:" + mobileTransfer.getTransferNumber(),mobileTransfer.getNowIsp());
}
}
}
Loading…
Cancel
Save