Compare commits

...

5 Commits

@ -0,0 +1,24 @@
package com.mashibing.api.adcvice;
import com.mashibing.common.exception.ApiException;
import com.mashibing.common.pojo.JsonResult;
import com.mashibing.common.utils.JsonResultUtil;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* @author heqijun
* @ClassName: ApiExceptionHandler
* @Description: TODO()
* @date 2025/6/6 16:44
*/
@RestControllerAdvice
public class ApiExceptionHandler {
@ExceptionHandler(ApiException.class)
public JsonResult handleApiException(ApiException e) {
return JsonResultUtil.error(e.getCode(), e.getMessage());
}
}

@ -1,6 +1,7 @@
package com.mashibing.api.controller;
import com.mashibing.api.pojo.SingleSendRequest;
import com.mashibing.api.pojo.SingleSendResponse;
import com.mashibing.api.service.SmsService;
import com.mashibing.api.service.sendCheck.SendCheckContext;
import com.mashibing.common.pojo.JsonResult;
@ -37,22 +38,26 @@ public class SMSController {
SmsService smsService;
@PostMapping("singleSend")
public JsonResult singleSend(@RequestBody @Validated SingleSendRequest request,
HttpServletRequest httpServletRequest) {
sendCheckContext.check(request);
public JsonResult singleSend(@RequestBody @Validated SingleSendRequest request, HttpServletRequest httpServletRequest) {
//获取真实ip
String realIp = smsService.getRealIP(httpServletRequest);
log.info("real ip: {}", realIp);
log.info("获取到客户端真实IP: {}", realIp);
//TODO 构建StandardSubmit,各种业务处理
// 构建StandardSubmit
StandardSubmit standardSubmit = new StandardSubmit();
standardSubmit.setRealIp(realIp);
BeanUtils.copyProperties(request, standardSubmit);
//请求参数校验
sendCheckContext.check(standardSubmit);
//TODO 发送到MQ
return JsonResultUtil.ok();
SingleSendResponse singleSendResponse = new SingleSendResponse();
singleSendResponse.setCode(0);
singleSendResponse.setMsg("发送中。。。");
singleSendResponse.setCount(1);
return JsonResultUtil.ok(singleSendResponse);
}

@ -1,34 +0,0 @@
package com.mashibing.api.feignClient;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* @author heqijun
* @ClassName: BeaconCacheClient
* @Description: TODO()
* @date 2025/6/5 20:13
*/
@FeignClient("beacon-cache")
@RequestMapping("cache")
public interface BeaconCacheClient {
@GetMapping("get/{key}")
public String get(@PathVariable String key);
@GetMapping("set/{key}/{value}")
public void set(@PathVariable String key, @PathVariable String value);
@GetMapping("hget/{key}")
public Map hget(@PathVariable String key);
@PostMapping("hset/{key}")
public void hset(@PathVariable String key, @RequestBody Map hash);
@PostMapping("/sadd/{key}")
public void sadd(@PathVariable(value = "key") String key, @RequestBody Map<String, Object>... maps);
}

@ -0,0 +1,42 @@
package com.mashibing.api.feignClient;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
import java.util.Set;
/**
* @author heqijun
* @ClassName: BeaconCacheClient
* @Description: openFeignClient
* @date 2025/6/5 20:13
*/
@FeignClient("beacon-cache")
@RequestMapping("cache")
public interface CacheClient {
@GetMapping("get/{key}")
String get(@PathVariable String key);
@GetMapping("set/{key}/{value}")
void set(@PathVariable String key, @PathVariable String value);
@GetMapping("hget/{key}")
Map hget(@PathVariable String key);
@GetMapping("/hget/{key}/{field}")
Object hget(@PathVariable(value = "key") String key, @PathVariable(value = "field") String field);
@GetMapping("/hgetString/{key}/{field}")
String hgetString(@PathVariable(value = "key") String key, @PathVariable(value = "field") String field);
@PostMapping("hset/{key}")
void hset(@PathVariable String key, @RequestBody Map hash);
@PostMapping("/sadd/{key}")
void sadd(@PathVariable(value = "key") String key, @RequestBody Map<String, Object>... maps);
@PostMapping("/smember/{key}")
Set<Map> smember(@PathVariable(value = "key") String key);
}

@ -1,6 +1,6 @@
package com.mashibing.api.service.sendCheck;
import com.mashibing.api.pojo.SingleSendRequest;
import com.mashibing.common.pojo.StandardSubmit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
@ -28,11 +28,11 @@ public class SendCheckContext {
@Value("${filters}")
private String[] filters;
public void check(SingleSendRequest request) {
public void check(StandardSubmit standardSubmit) {
for (String filter : filters) {
SendCheckService check = sendCheckServiceMap.get(filter);
if (check != null) {
check.check(request);
check.check(standardSubmit);
}
}
}

@ -1,6 +1,6 @@
package com.mashibing.api.service.sendCheck;
import com.mashibing.api.pojo.SingleSendRequest;
import com.mashibing.common.pojo.StandardSubmit;
/**
* @author heqijun
@ -11,6 +11,10 @@ import com.mashibing.api.pojo.SingleSendRequest;
public interface SendCheckService {
void check(SingleSendRequest request);
/**
*
* @param standardSubmit
*/
void check(StandardSubmit standardSubmit);
}

@ -1,10 +1,20 @@
package com.mashibing.api.service.sendCheck.impl;
import com.mashibing.api.pojo.SingleSendRequest;
import com.alibaba.nacos.common.utils.MapUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mashibing.api.feignClient.CacheClient;
import com.mashibing.api.service.sendCheck.SendCheckService;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.common.entity.ClientBusiness;
import com.mashibing.common.enums.ExceptionEnums;
import com.mashibing.common.exception.ApiException;
import com.mashibing.common.pojo.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* @author heqijun
* @ClassName: ApikeyServiceImpl
@ -16,8 +26,24 @@ import org.springframework.stereotype.Service;
@Service("ApikeySendCheck")
public class ApikeySendCheckServiceImpl implements SendCheckService {
@Autowired
CacheClient cacheClient;
@Override
public void check(SingleSendRequest request) {
log.info("Check apikey...");
public void check(StandardSubmit submit) {
log.info("【接口模块】发送短信前apikey校验。。。");
Map<String, String> clientBusinessMap = (Map<String, String>) cacheClient.hget(CacheConstant.CLIENT_BUSINESS + submit.getApikey());
log.info("【接口模块】缓存中查询到客户信息:{}", clientBusinessMap);
if (MapUtils.isEmpty(clientBusinessMap)) {
log.error("【接口模块】apikey校验不通过{}{}", submit.getApikey(), ExceptionEnums.ERROR_APIKEY.getMsg());
throw new ApiException(ExceptionEnums.ERROR_APIKEY);
}
ObjectMapper objectMapper = new ObjectMapper();
ClientBusiness clientBusiness = objectMapper.convertValue(clientBusinessMap, ClientBusiness.class);
// BeanUtils.copyProperties(clientBusiness, submit);
submit.setClientId(clientBusiness.getId());
// submit.setIpAddress(clientBusiness.getIpAddress());
log.info("【接口模块】apikey校验通过{}", submit.getApikey());
}
}

@ -1,8 +1,11 @@
package com.mashibing.api.service.sendCheck.impl;
import com.mashibing.api.feignClient.CacheClient;
import com.mashibing.api.pojo.SingleSendRequest;
import com.mashibing.api.service.sendCheck.SendCheckService;
import com.mashibing.common.pojo.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
@ -15,8 +18,12 @@ import org.springframework.stereotype.Service;
@Slf4j
@Service("FeeSendCheck")
public class FeeSendCheckServiceImpl implements SendCheckService {
@Autowired
CacheClient cacheClient;
@Override
public void check(SingleSendRequest request) {
public void check(StandardSubmit standardSubmit) {
log.info("Check Fee Send Check");
}
}

@ -1,8 +1,14 @@
package com.mashibing.api.service.sendCheck.impl;
import com.mashibing.api.pojo.SingleSendRequest;
import com.mashibing.api.feignClient.CacheClient;
import com.mashibing.api.service.sendCheck.SendCheckService;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.common.enums.ExceptionEnums;
import com.mashibing.common.exception.ApiException;
import com.mashibing.common.pojo.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
@ -15,8 +21,27 @@ import org.springframework.stereotype.Service;
@Slf4j
@Service("IpSendCheck")
public class IpSendCheckServiceImpl implements SendCheckService {
@Autowired
CacheClient cacheClient;
private final static String IP_ADDRESS = "ipAddress";
@Override
public void check(SingleSendRequest request) {
log.info("Check IpSendCheck");
public void check(StandardSubmit submit) {
log.info("【接口模块-校验ip】校验ing…………");
//1. 根据CacheClient根据客户的apikey以及ipAddress去查询客户的IP白名单
String ip = cacheClient.hgetString(CacheConstant.CLIENT_BUSINESS + submit.getApikey(), IP_ADDRESS);
submit.setIpAddress(ip);
//2. 如果IP白名单为null直接放行
if (StringUtils.isEmpty(ip) || ip.contains(submit.getRealIp())) {
log.info("【接口模块-校验ip】客户端请求IP合法{}", submit.getIpAddress());
return;
}
//3. IP白名单不为空并且客户端请求不在IP报名单内
log.info("【接口模块-校验ip】请求的ip不在白名单内{}", submit.getIpAddress());
throw new ApiException(ExceptionEnums.IP_NOT_WHITE);
}
}

@ -2,6 +2,7 @@ package com.mashibing.api.service.sendCheck.impl;
import com.mashibing.api.pojo.SingleSendRequest;
import com.mashibing.api.service.sendCheck.SendCheckService;
import com.mashibing.common.pojo.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -16,7 +17,7 @@ import org.springframework.stereotype.Service;
@Service("MobileSendCheck")
public class MobileSendCheckServiceImpl implements SendCheckService {
@Override
public void check(SingleSendRequest request) {
public void check(StandardSubmit standardSubmit) {
log.info("Check mobile send check");
}
}

@ -1,10 +1,20 @@
package com.mashibing.api.service.sendCheck.impl;
import com.mashibing.api.feignClient.CacheClient;
import com.mashibing.api.pojo.SingleSendRequest;
import com.mashibing.api.service.sendCheck.SendCheckService;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.common.constant.SMSConstant;
import com.mashibing.common.enums.ExceptionEnums;
import com.mashibing.common.exception.ApiException;
import com.mashibing.common.pojo.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.Set;
/**
* @author heqijun
* @ClassName: SignSendCheckServiceImpl
@ -15,8 +25,46 @@ import org.springframework.stereotype.Service;
@Slf4j
@Service("SignSendCheck")
public class SignSendCheckServiceImpl implements SendCheckService {
@Autowired
CacheClient cacheClient;
@Override
public void check(SingleSendRequest request) {
log.info("Check SignSendCheck");
public void check(StandardSubmit standardSubmit) {
log.info("【接口模块】短信客户签名校验。。。");
String text = standardSubmit.getText();
//短信正确格式:【签名】短信内容。。。
//短信内容为空,显然不可能包含签名
if (text == null || text.isEmpty()) {
log.info("【接口模块-校验签名】短信无可用签名 text = {}", text);
throw new ApiException(ExceptionEnums.ERROR_SIGN);
}
//短信不以“【”开头或者不包含“】”,签名格式不正确
if (!text.startsWith(SMSConstant.SIGN_PREFIX) || !text.contains(SMSConstant.SIGN_PREFIX)) {
log.info("【接口模块-校验签名】短信无可用签名 text = {}", text);
throw new ApiException(ExceptionEnums.ERROR_SIGN);
}
//截取签名
String signInText = text.substring(1, text.indexOf(SMSConstant.SIGN_SUFFIX));
//查询缓存中的客户签名信息
Set<Map> clientSigns = cacheClient.smember(CacheConstant.CLIENT_SIGN + standardSubmit.getClientId());
if (clientSigns == null || clientSigns.isEmpty()) {
log.info("【接口模块-校验签名】客户无可用签名");
throw new ApiException(ExceptionEnums.ERROR_SIGN);
}
//取出签名做匹配
for (Map clientSign : clientSigns) {
String signInCache = (String) clientSign.get("signInfo");
if (signInCache.equals(signInText)) {
log.info("【接口模块】签名校验通过text = {}", text);
standardSubmit.setSign(signInText);
standardSubmit.setSignId(clientSign.get("id").toString());
return;
}
}
//没有匹配成功
log.info("【接口模块-校验签名】短信无可用签名 text = {}", text);
throw new ApiException(ExceptionEnums.ERROR_SIGN);
}
}

@ -1,10 +1,20 @@
package com.mashibing.api.service.sendCheck.impl;
import com.mashibing.api.feignClient.CacheClient;
import com.mashibing.api.pojo.SingleSendRequest;
import com.mashibing.api.service.sendCheck.SendCheckService;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.common.constant.SMSConstant;
import com.mashibing.common.enums.ExceptionEnums;
import com.mashibing.common.exception.ApiException;
import com.mashibing.common.pojo.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.Set;
/**
* @author heqijun
* @ClassName: TemplateSendCheckServiceImpl
@ -15,8 +25,55 @@ import org.springframework.stereotype.Service;
@Slf4j
@Service("TemplateSendCheck")
public class TemplateSendCheckServiceImpl implements SendCheckService {
@Autowired
CacheClient cacheClient;
private final String TEMPLATE_TEXT = "templateText";
private final String TEMPLATE_PLACEHOLDER = "#";
@Override
public void check(SingleSendRequest request) {
log.info("Check TemplateSendCheckServiceImpl");
public void check(StandardSubmit standardSubmit) {
log.info("【接口模块-校验模板】 校验ing…………");
// 1、从submit中获取到短信内容签名信息签名id
String text = standardSubmit.getText();
String sign = standardSubmit.getSign();
String signId = standardSubmit.getSignId();
// 2、将短信内容中的签名直接去掉获取短信具体内容
text = text.replace(SMSConstant.SIGN_PREFIX + sign + SMSConstant.SIGN_SUFFIX, "");
// 3、从缓存中获取到签名id绑定的所有模板
Set<Map> templates = cacheClient.smember(CacheConstant.CLIENT_TEMPLATE + signId);
// 4、在tempaltes不为null时遍历签名绑定的所有模板信息
if (templates != null && !templates.isEmpty()) {
for (Map template : templates) {
// 4.1 将模板内容和短信具体内容做匹配-true-匹配成功
String templateText = (String) template.get(TEMPLATE_TEXT);
if (text.equals(templateText)) {
// 短信具体内容和模板是匹配的。
log.info("【接口模块-校验模板】 校验模板通过 templateText = {}", templateText);
return;
}
// 4.2 判断模板中是否只包含一个变量,如果是,直接让具体短信内容匹配前缀和后缀
// 例子您的验证码是123434。如非本人操作请忽略本短信
// 例子:您的验证码是#code#。如非本人操作,请忽略本短信
if (templateText != null && templateText.contains(TEMPLATE_PLACEHOLDER) && templateText.length() - templateText.replaceAll(TEMPLATE_PLACEHOLDER, "").length() == 2) {
// 可以确认模板不为空,并且包含#符号,而且#符号有2个代表是一个占位符变量
// 获取模板撇去占位符之后的前缀和后缀
String templateTextPrefix = templateText.substring(0, templateText.indexOf(TEMPLATE_PLACEHOLDER));
String templateTextSuffix = templateText.substring(templateText.lastIndexOf(TEMPLATE_PLACEHOLDER) + 1);
// 判断短信的具体内容是否匹配前缀和后缀
if (text.startsWith(templateTextPrefix) && text.endsWith(templateTextSuffix)) {
// 当前的短信内容匹配短信模板
log.info("【接口模块-校验模板】 校验模板通过 templateText = {}", templateText);
return;
}
}
}
}
// 5、 模板校验失败
log.info("【接口模块-校验模板】 无可用模板 text = {}", text);
throw new ApiException(ExceptionEnums.ERROR_TEMPLATE);
}
}

@ -9,9 +9,9 @@ spring:
cloud:
nacos:
discovery:
server-addr: 192.168.1.10:8848
server-addr: 192.168.1.13:8848
# nacos配置中心地址:
config:
server-addr: 192.168.1.10:8848
server-addr: 192.168.1.13:8848
file-extension: yml
# beacon-api-dev.yml

@ -7,6 +7,7 @@ import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
import java.util.Set;
/**
* @author heqijun
@ -25,22 +26,38 @@ public class CacheController {
@GetMapping("get/{key}")
public String get(@PathVariable String key) {
log.info("【缓存模块】getString:{}", key);
log.info("【缓存模块】getkey={}", key);
return redisClient.get(key);
}
@GetMapping("set/{key}/{value}")
public void set(@PathVariable String key, @PathVariable String value) {
log.info("【缓存模块】setString: key = {}\nvalue = {}", key, value);
log.info("【缓存模块】setkey = {}\nvalue = {}", key, value);
redisClient.set(key, value);
}
@GetMapping("hget/{key}")
public Map hget(@PathVariable String key) {
log.info("【缓存模块】getHash:{}", key);
log.info("【缓存模块】hgetkey={}", key);
return redisClient.hGetAll(key);
}
@GetMapping("hget/{key}/{field}")
public Object hget(@PathVariable(value = "key") String key, @PathVariable(value = "field") String field) {
log.info("【缓存模块】hgetkey={}field={}", key, field);
Object o = redisClient.hGet(key, field);
log.info("【缓存模块】hgetkey={}field={}value={}", key, field, o);
return o;
}
@GetMapping("hgetString/{key}/{field}")
public String hgetString(@PathVariable(value = "key") String key, @PathVariable(value = "field") String field) {
log.info("【缓存模块】hgetkey={}field={}", key, field);
String str = redisClient.hGet(key, field);
log.info("【缓存模块】hgetkey={}field={}value={}", key, field, str);
return str;
}
@PostMapping("hset/{key}")
public void hset(@PathVariable String key, @RequestBody Map hash) {
log.info("【缓存模块】setHash: key = {}\nvalue = {}", key, hash.toString());
@ -53,4 +70,12 @@ public class CacheController {
redisClient.sAdd(key, value);
}
@PostMapping("/smember/{key}")
public Set smember(@PathVariable(value = "key") String key) {
log.info("【缓存模块】smember: key = {}", key);
Set value = redisClient.sMembers(key);
log.info("【缓存模块】sadd: key = {}\nvalue = {}", key, value);
return value;
}
}

@ -9,10 +9,10 @@ spring:
cloud:
nacos:
discovery:
server-addr: 192.168.1.10:8848
server-addr: 192.168.1.13:8848
# nacos配置中心地址:
config:
server-addr: 192.168.1.10:8848
server-addr: 192.168.1.13:8848
file-extension: yml
# beacon-cache-dev.yml

@ -0,0 +1,28 @@
package com.mashibing.common.constant;
import com.mashibing.common.annotation.Description;
/**
* @author heqijun
* @ClassName: CachePrefixConstant
* @Description: rediskeyfield
* @date 2025/6/6 15:51
*/
public class CacheConstant {
@Description("客户信息")
public static final String CLIENT_BUSINESS = "client_business:";
@Description("客户签名")
public static final String CLIENT_SIGN = "client_sign:";
@Description("客户短信模板")
public static final String CLIENT_TEMPLATE = "client_template:";
@Description("客户余额")
public static final String CLIENT_BALANCE = "client_balance:";
@Description("客户信息ip白名单ipAddress")
public static final String CLIENT_BUSINESS_IPADDRESS = "ipAddress";
}

@ -3,16 +3,18 @@ package com.mashibing.common.constant;
/**
* @author heqijun
* @ClassName: Constant
* @Description: TODO()
* @Description:
* @date 2025/6/5 17:10
*/
public class SMSConstant {
public static final double EARTH_RADIUS = 6378.137;
public static final String UNKNOWN = "unknown";
public static final String X_FORWARDED_FOR = "x-forwarded-for";
public static final String SIGN_PREFIX = "【";
public static final String SIGN_SUFFIX = "】";
}

@ -0,0 +1,129 @@
package com.mashibing.common.entity;
import lombok.ToString;
@ToString
public class ClientBalance {
private long id;
private long clientId;
private long balance;
private java.sql.Timestamp created;
private long createId;
private java.sql.Timestamp updated;
private long updateId;
private long isDelete;
private String extend1;
private String extend2;
private String extend3;
private String extend4;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public long getClientId() {
return clientId;
}
public void setClientId(long clientId) {
this.clientId = clientId;
}
public long getBalance() {
return balance;
}
public void setBalance(long balance) {
this.balance = balance;
}
public java.sql.Timestamp getCreated() {
return created;
}
public void setCreated(java.sql.Timestamp created) {
this.created = created;
}
public long getCreateId() {
return createId;
}
public void setCreateId(long createId) {
this.createId = createId;
}
public java.sql.Timestamp getUpdated() {
return updated;
}
public void setUpdated(java.sql.Timestamp updated) {
this.updated = updated;
}
public long getUpdateId() {
return updateId;
}
public void setUpdateId(long updateId) {
this.updateId = updateId;
}
public long getIsDelete() {
return isDelete;
}
public void setIsDelete(long isDelete) {
this.isDelete = isDelete;
}
public String getExtend1() {
return extend1;
}
public void setExtend1(String extend1) {
this.extend1 = extend1;
}
public String getExtend2() {
return extend2;
}
public void setExtend2(String extend2) {
this.extend2 = extend2;
}
public String getExtend3() {
return extend3;
}
public void setExtend3(String extend3) {
this.extend3 = extend3;
}
public String getExtend4() {
return extend4;
}
public void setExtend4(String extend4) {
this.extend4 = extend4;
}
}

@ -0,0 +1,188 @@
package com.mashibing.common.entity;
import lombok.ToString;
@ToString
public class ClientBusiness {
private long id;
private String corpname;
private String apikey;
private String ipAddress;
private long isCallback;
private String callbackUrl;
private String clientLinkname;
private String clientPhone;
private String clientFilters;
private java.sql.Timestamp created;
private long createId;
private java.sql.Timestamp updated;
private long updateId;
private long isDelete;
private String extend1;
private String extend2;
private String extend3;
private String extend4;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getCorpname() {
return corpname;
}
public void setCorpname(String corpname) {
this.corpname = corpname;
}
public String getApikey() {
return apikey;
}
public void setApikey(String apikey) {
this.apikey = apikey;
}
public String getIpAddress() {
return ipAddress;
}
public void setIpAddress(String ipAddress) {
this.ipAddress = ipAddress;
}
public long getIsCallback() {
return isCallback;
}
public void setIsCallback(long isCallback) {
this.isCallback = isCallback;
}
public String getCallbackUrl() {
return callbackUrl;
}
public void setCallbackUrl(String callbackUrl) {
this.callbackUrl = callbackUrl;
}
public String getClientLinkname() {
return clientLinkname;
}
public void setClientLinkname(String clientLinkname) {
this.clientLinkname = clientLinkname;
}
public String getClientPhone() {
return clientPhone;
}
public void setClientPhone(String clientPhone) {
this.clientPhone = clientPhone;
}
public String getClientFilters() {
return clientFilters;
}
public void setClientFilters(String clientFilters) {
this.clientFilters = clientFilters;
}
public java.sql.Timestamp getCreated() {
return created;
}
public void setCreated(java.sql.Timestamp created) {
this.created = created;
}
public long getCreateId() {
return createId;
}
public void setCreateId(long createId) {
this.createId = createId;
}
public java.sql.Timestamp getUpdated() {
return updated;
}
public void setUpdated(java.sql.Timestamp updated) {
this.updated = updated;
}
public long getUpdateId() {
return updateId;
}
public void setUpdateId(long updateId) {
this.updateId = updateId;
}
public long getIsDelete() {
return isDelete;
}
public void setIsDelete(long isDelete) {
this.isDelete = isDelete;
}
public String getExtend1() {
return extend1;
}
public void setExtend1(String extend1) {
this.extend1 = extend1;
}
public String getExtend2() {
return extend2;
}
public void setExtend2(String extend2) {
this.extend2 = extend2;
}
public String getExtend3() {
return extend3;
}
public void setExtend3(String extend3) {
this.extend3 = extend3;
}
public String getExtend4() {
return extend4;
}
public void setExtend4(String extend4) {
this.extend4 = extend4;
}
}

@ -0,0 +1,178 @@
package com.mashibing.common.entity;
import lombok.ToString;
@ToString
public class ClientSign {
private long id;
private long clientId;
private String signInfo;
private long signState;
private long signType;
private String businessWeb;
private String proveDescr;
private String proveFile;
private java.sql.Timestamp created;
private long createId;
private java.sql.Timestamp updated;
private long updateId;
private long isDelete;
private String extend1;
private String extend2;
private String extend3;
private String extend4;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public long getClientId() {
return clientId;
}
public void setClientId(long clientId) {
this.clientId = clientId;
}
public String getSignInfo() {
return signInfo;
}
public void setSignInfo(String signInfo) {
this.signInfo = signInfo;
}
public long getSignState() {
return signState;
}
public void setSignState(long signState) {
this.signState = signState;
}
public long getSignType() {
return signType;
}
public void setSignType(long signType) {
this.signType = signType;
}
public String getBusinessWeb() {
return businessWeb;
}
public void setBusinessWeb(String businessWeb) {
this.businessWeb = businessWeb;
}
public String getProveDescr() {
return proveDescr;
}
public void setProveDescr(String proveDescr) {
this.proveDescr = proveDescr;
}
public String getProveFile() {
return proveFile;
}
public void setProveFile(String proveFile) {
this.proveFile = proveFile;
}
public java.sql.Timestamp getCreated() {
return created;
}
public void setCreated(java.sql.Timestamp created) {
this.created = created;
}
public long getCreateId() {
return createId;
}
public void setCreateId(long createId) {
this.createId = createId;
}
public java.sql.Timestamp getUpdated() {
return updated;
}
public void setUpdated(java.sql.Timestamp updated) {
this.updated = updated;
}
public long getUpdateId() {
return updateId;
}
public void setUpdateId(long updateId) {
this.updateId = updateId;
}
public long getIsDelete() {
return isDelete;
}
public void setIsDelete(long isDelete) {
this.isDelete = isDelete;
}
public String getExtend1() {
return extend1;
}
public void setExtend1(String extend1) {
this.extend1 = extend1;
}
public String getExtend2() {
return extend2;
}
public void setExtend2(String extend2) {
this.extend2 = extend2;
}
public String getExtend3() {
return extend3;
}
public void setExtend3(String extend3) {
this.extend3 = extend3;
}
public String getExtend4() {
return extend4;
}
public void setExtend4(String extend4) {
this.extend4 = extend4;
}
}

@ -0,0 +1,169 @@
package com.mashibing.common.entity;
import lombok.ToString;
@ToString
public class ClientTemplate {
private long id;
private long signId;
private String templateText;
private long templateType;
private long templateState;
private long useId;
private String useWeb;
private java.sql.Timestamp created;
private long createId;
private java.sql.Timestamp updated;
private long updateId;
private long isDelete;
private String extend1;
private String extend2;
private String extend3;
private String extend4;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public long getSignId() {
return signId;
}
public void setSignId(long signId) {
this.signId = signId;
}
public String getTemplateText() {
return templateText;
}
public void setTemplateText(String templateText) {
this.templateText = templateText;
}
public long getTemplateType() {
return templateType;
}
public void setTemplateType(long templateType) {
this.templateType = templateType;
}
public long getTemplateState() {
return templateState;
}
public void setTemplateState(long templateState) {
this.templateState = templateState;
}
public long getUseId() {
return useId;
}
public void setUseId(long useId) {
this.useId = useId;
}
public String getUseWeb() {
return useWeb;
}
public void setUseWeb(String useWeb) {
this.useWeb = useWeb;
}
public java.sql.Timestamp getCreated() {
return created;
}
public void setCreated(java.sql.Timestamp created) {
this.created = created;
}
public long getCreateId() {
return createId;
}
public void setCreateId(long createId) {
this.createId = createId;
}
public java.sql.Timestamp getUpdated() {
return updated;
}
public void setUpdated(java.sql.Timestamp updated) {
this.updated = updated;
}
public long getUpdateId() {
return updateId;
}
public void setUpdateId(long updateId) {
this.updateId = updateId;
}
public long getIsDelete() {
return isDelete;
}
public void setIsDelete(long isDelete) {
this.isDelete = isDelete;
}
public String getExtend1() {
return extend1;
}
public void setExtend1(String extend1) {
this.extend1 = extend1;
}
public String getExtend2() {
return extend2;
}
public void setExtend2(String extend2) {
this.extend2 = extend2;
}
public String getExtend3() {
return extend3;
}
public void setExtend3(String extend3) {
this.extend3 = extend3;
}
public String getExtend4() {
return extend4;
}
public void setExtend4(String extend4) {
this.extend4 = extend4;
}
}

@ -0,0 +1,30 @@
package com.mashibing.common.enums;
import lombok.Getter;
/**
* @author heqijun
* @ClassName: ExecptionEnums
* @Description: TODO()
* @date 2025/6/6 16:12
*/
@Getter
public enum ExceptionEnums {
ERROR_APIKEY(-1, "非法的apikey"),
IP_NOT_WHITE(-2, "请求的ip不在白名单内"),
ERROR_SIGN(-3, "无可用签名"),
ERROR_TEMPLATE(-4, "无可用模板"),
ERROR_MOBILE(-5, "手机号格式不正确"),
BALANCE_NOT_ENOUGH(-6, "手客户余额不足"),
;
private int code;
private String msg;
ExceptionEnums(int code, String msg) {
this.code = code;
this.msg = msg;
}
}

@ -0,0 +1,30 @@
package com.mashibing.common.exception;
import com.mashibing.common.enums.ExceptionEnums;
import lombok.Getter;
/**
* @author heqijun
* @ClassName: APIException
* @Description: TODO()
* @date 2025/6/6 16:09
*/
@Getter
public class ApiException extends RuntimeException {
private static final long serialVersionUID = 1L;
private final Integer code;
public ApiException(Integer code, String message) {
super(message);
this.code = code;
}
public ApiException(ExceptionEnums exceptionEnums) {
super(exceptionEnums.getMsg());
this.code = exceptionEnums.getCode();
}
}

@ -22,11 +22,11 @@ public class StandardSubmit {
@Description("当前短信的唯一标识")
private Long sequenceId;
@Description("客户ID")
@Description("客户ID")
private Long clientId;
@Description("客户端的ip白名单")
private String ip;
private String ipAddress;
@Description("客户业务内的uid")
private String uid;
@ -37,6 +37,9 @@ public class StandardSubmit {
@Description("短信内容的签名")
private String sign;
@Description("签名id")
private String signId;
@Description("短信内容")
private String text;

@ -8,7 +8,7 @@ import java.util.Map;
/**
* @author heqijun
* @ClassName: BeaconCacheClient
* @Description: TODO()
* @Description: openFeignClient
* @date 2025/6/5 20:13
*/

@ -6,11 +6,11 @@ spring:
cloud:
nacos:
discovery:
server-addr: 192.168.1.10:8848
server-addr: 192.168.1.13:8848
# datasource
datasource:
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://192.168.1.10:3306/beacon_cloud?characterEncoding=utf-8&useSSL=false
url: jdbc:mysql://192.168.1.13:3306/beacon_cloud?characterEncoding=utf-8&useSSL=false
username: root
password: root
# 端口号

@ -14,7 +14,7 @@ import java.util.Map;
@SpringBootTest
@RunWith(SpringRunner.class)
public class ClientBusinessMapperTest {
class ClientBusinessMapperTest {
@Autowired
private ClientBusinessMapper mapper;
@ -25,6 +25,8 @@ public class ClientBusinessMapperTest {
@Test
public void findById() {
ClientBusiness cb = mapper.findById(1L);
cb.setIpAddress("192.168.1.5");
// System.out.println("\"22.220.124.110\".equals(cb.getIpAddress()) = " + "22.220.124.110".equals(cb.getIpAddress()));
System.out.println(cb);
ObjectMapper mapper = new ObjectMapper();
beaconCacheClient.hset("client_business:" + cb.getApikey(), mapper.convertValue(cb, Map.class));

@ -25,7 +25,7 @@
<properties>
<spring.cloud-version>Hoxton.SR12</spring.cloud-version>
<spring.cloud.alibaba-version>2.2.7.RELEASE</spring.cloud.alibaba-version>
<spring.cloud.alibaba-version>2.2.6.RELEASE</spring.cloud.alibaba-version>
<horse-version>1.0.0</horse-version>
</properties>

Loading…
Cancel
Save