SmsController:
java
package com.todod.warning.controller;
import com.todod.warning.service.ISmsService;
import com.todod.warning.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/edusms/sms")
@CrossOrigin
public class SmsController {
@Autowired
private ISmsService smsService;
@GetMapping("send/{phone}")
public R sendSms(
@PathVariable String phone, // 路径变量,用于接收URL中的电话号码
@RequestParam(value = "templateParam", required = false) String[] templateParams // 查询参数,用于接收URL中的模板参数数组
){
// 调用service发送短信的方法,传入电话号码和模板参数数组
boolean isSend = smsService.send(phone, templateParams);
// 根据发送结果返回相应的响应
if (isSend) {
return R.ok(); // 发送成功,返回成功响应
} else {
return R.error("短信发送失败!"); // 发送失败,返回错误响应
}
}
}
ISmsService:
java
package com.todod.warning.service;
import java.util.List;
public interface ISmsService {
boolean send(String phone, String[] templateParam);
}
SmsServiceImpl:
java
package com.todod.warning.service.impl;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import com.todod.warning.service.ISmsService;
import com.todod.warning.utils.ConstantSmsUtils;
import com.todod.warning.utils.RandomUtil;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class SmsServiceImpl implements ISmsService {
//发送短信的方法
@Override
public boolean send(String phone, String[] templateParam) {
//判断手机号是否为空
if (StringUtils.isEmpty(phone)){
return false;
}
try{
// 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
// 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
Credential cred = new Credential("AKIDBAQhnfJlOs8OTJtEOBk5HJMFxZ0Cuc8S", "Jbv2uXzDF4gLtLbgZHm6YovvhFbjdXKt");
// 实例化一个http选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("sms.tencentcloudapi.com");
// 实例化一个client选项,可选的,没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的 第二个参数是地域信息
SmsClient client = new SmsClient(cred, "ap-beijing", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
SendSmsRequest req = new SendSmsRequest();
//设置固定的参数
req.setSmsSdkAppId("1400953332");// 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId
req.setSignName("天津浪淘科技");//短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名
req.setTemplateId("2321690");//模板 ID: 必须填写已审核通过的模板 ID
/* 用户的 session 内容: 可以携带用户侧 ID 等上下文信息,server 会原样返回 */
//设置发送相关的参数
String[] phoneNumberSet1 = {"+86"+phone};
req.setPhoneNumberSet(phoneNumberSet1);//发送的手机号
req.setTemplateParamSet(templateParam);//发送验证码
//发送短信
// 返回的resp是一个SendSmsResponse的实例,与请求对象对应
SendSmsResponse resp = client.SendSms(req);
System.out.println("resp"+resp);
// 输出json格式的字符串回包
System.out.println(SendSmsResponse.toJsonString(resp));
return true;
} catch (TencentCloudSDKException e) {
e.printStackTrace();
return false;
}
}
}
定时任务:
java
package com.todod.warning.utils;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.todod.warning.controller.SmsController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Date;
@Component
public class ScheduleTask {
private static final Logger logger = LoggerFactory.getLogger(ScheduleTask.class);
@Autowired
@Qualifier("clickhouseJdbcTemplate")
private JdbcTemplate clickhouseJdbcTemplate;
@Autowired
private SmsController smsController;
@Value("${tencent.sms.phone}")
private String phone;
// @Scheduled(cron = "0 0 3 * * ?")
@Scheduled(fixedRate = 10000)
@DS("slave")
public void doTaskEveryDayAtNoon() {
try {
String clickhouseUrl = "jdbc:clickhouse://192.168.1.106:8123/qbdata_db";
String user = "qbdata_db";
String password = "qbdata_db";
try (Connection connection = DriverManager.getConnection(clickhouseUrl, user, password);
PreparedStatement statement = connection.prepareStatement(
"SELECT count(*) FROM base_yw WHERE db_batch = formatDateTime(yesterday(), '%Y-%m-%d') AND api_type = ?")) {
statement.setString(1, "1"); // Set the api_type value
try (ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
int count1 = resultSet.getInt(1);
if (count1 == 0) {
//获取昨天的数据
// LocalDate yesterdayDate = LocalDate.now().minusDays(1);
LocalDate localDate = LocalDate.now();
int year = localDate.getYear(); // 获取年份
int month = localDate.getMonthValue(); // 获取月份(1-12)
int day = localDate.getDayOfMonth(); // 获取日(1-31)
String errorMsg = "蜜度接口数据获取失败";
String[] templateParam = new String[4];
templateParam[0] = String.valueOf(year);
templateParam[1] = String.valueOf(month);
templateParam[2] = String.valueOf(day);
templateParam[3] = errorMsg;
smsController.sendSms(phone, templateParam);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
try (Connection connection = DriverManager.getConnection(clickhouseUrl, user, password);
PreparedStatement statement = connection.prepareStatement(
"SELECT count(*) FROM base_yw WHERE db_batch = formatDateTime(yesterday(), '%Y-%m-%d') AND api_type = ?")) {
statement.setString(1, "2"); // Set the api_type value
try (ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
int count2 = resultSet.getInt(1);
if (count2 == 0) {
//获取昨天的数据
// LocalDate yesterdayDate = LocalDate.now().minusDays(1);
LocalDate localDate = LocalDate.now();
int year = localDate.getYear(); // 获取年份
int month = localDate.getMonthValue(); // 获取月份(1-12)
int day = localDate.getDayOfMonth(); // 获取日(1-31)
String errorMsg = "蚁坊接口数据获取失败";
String[] templateParam = new String[4];
templateParam[0] = String.valueOf(year);
templateParam[1] = String.valueOf(month);
templateParam[2] = String.valueOf(day);
templateParam[3] = errorMsg;
smsController.sendSms(phone, templateParam);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
try (Connection connection = DriverManager.getConnection(clickhouseUrl, user, password);
PreparedStatement statement = connection.prepareStatement(
"SELECT count(*) FROM base_yw WHERE db_batch = formatDateTime(yesterday(), '%Y-%m-%d') AND api_type = ?")) {
statement.setString(1, "3"); // Set the api_type value
try (ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
int count3 = resultSet.getInt(1);
if (count3 == 0) {
//获取昨天的数据
// LocalDate yesterdayDate = LocalDate.now().minusDays(1);
LocalDate localDate = LocalDate.now();
int year = localDate.getYear(); // 获取年份
int month = localDate.getMonthValue(); // 获取月份(1-12)
int day = localDate.getDayOfMonth(); // 获取日(1-31)
String errorMsg = "五节接口数据获取失败";
String[] templateParam = new String[4];
templateParam[0] = String.valueOf(year);
templateParam[1] = String.valueOf(month);
templateParam[2] = String.valueOf(day);
templateParam[3] = errorMsg;
smsController.sendSms(phone, templateParam);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
R:
java
package com.todod.warning.utils;
public class R<T> {
private int code;
private String message;
private T data;
private R(int code, String message) {
this.code = code;
this.message = message;
}
public static <T> R<T> ok() {
return new R<>(200, "成功");
}
public static <T> R<T> error(String message) {
return new R<>(500, message);
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
yaml:
XML
server.port=9099
#设置é>>认çæ°æ®æºæèæ°æ®æºç>>,é>>认å¼å³ä¸ºmaster
spring.datasource.dynamic.primary=master
#è®¾ç½®ä¸¥æ ¼æ¨¡å¼,é>>认falseä¸å¯å¨. å¯å¨åå¨æªå¹éå°æå®æ°æ®æºæ¶åä¼æåºå¼å¸¸,ä¸å¯å¨åå¨æªå¹éå°æå®æ°æ®æºæ¶å使ç¨é>>认æ°æ®æº
spring.datasource.dynamic.strict=false
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/qcfx_db?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=xiao1021
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.slave.url=jdbc:clickhouse://192.168.1.106:8123/qbdata_db
spring.datasource.dynamic.datasource.slave.username=qbdata_db
spring.datasource.dynamic.datasource.slave.password=qbdata_db
spring.datasource.dynamic.datasource.slave.driver-class-name=ru.yandex.clickhouse.ClickHouseDriver
server.tomcat.protocolHeader=x-forwarded-proto
server.tomcat.remoteIpHeader=x-forwarded-for
server.tomcat.basedir=
server.tomcat.backgroundProcessorDelay=30
spring.thymeleaf.prefix=classpath:/static/
spring.thymeleaf.suffix=.html
spring.thymeleaf.cache=false
mybatis-plus.mapper-locations: classpath:mapper/*Mapper.xml
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
#è¾è®¯äºçä¿¡æå¡åæ°
#è¾è®¯äºè´¦æ·secretIdï¼secretKey
tencent.sms.keyId=AKIDBAQhnfJlOs8OTJtEOBk5HJMFxZ0Cuc8S
tencent.sms.keysecret=Jbv2uXzDF4gLtLbgZHm6YovvhFbjdXKt
tencent.sms.phone=18833703503
#çä¿¡åºç¨ID: çä¿¡SdkAppIdå¨ [çä¿¡æ§å¶å°] æ·>>å åºç¨åçæçå®éSdkAppId
tencent.sms.smsSdkAppId=1400952592
#çä¿¡ç¾åå容: ä½¿ç¨ UTF-8 ç¼ç ï¼å¿é¡>>å¡<<åå·²å®¡æ ¸éè¿çç¾å
tencent.sms.signName="天津浪æ·ç§æ"
#æ¨¡æ¿ ID: å¿é¡>>å¡<<åå·²å®¡æ ¸éè¿çæ¨¡æ¿ ID
tencent.sms.templateId=2321690
# è¾è®¯äºçä¿¡æå¡
tencent:
sms:
secret-id: "AKIDBAQhnfJlOs8OTJtEOBk5HJMFxZ0Cuc8S"
secret-key:"Jbv2uXzDF4gLtLbgZHm6YovvhFbjdXKt"
sdk-app-id: 1400952592
sign-name: "天津浪æ·ç§æ"
# 模æ¿IDæ å°ï¼keyä>>>>æ设置ï¼valueä¸ºå®¡æ ¸éè¿æ¨¡æ¿ID
template-id-map:
register: "2321690"
forget: "2321690"
TencentSmsProperties:
java
package com.todod.warning.model;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;
@Data // lombok 省略get/set方法
@Component
@ConfigurationProperties(prefix = "tencent.sms") // 读取配置文件中tencent.sms 为前缀的配置信息
public class TencentSmsProperties {
/** 腾讯云账户密钥对secretId */
private String secretId;
/** 腾讯云账户密钥对secretKey */
private String secretKey;
/** 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId(位于[应用管理]中的[应用列表]),示例: 1400006666 (1400开头)*/
private String sdkAppId;
/** 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,签名信息可登录 [短信控制台] 查看 */
private String signName;
/** 模板 ID 哈希表: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看
* key: 模板名称(自定义);value: 模板 ID(腾讯云已通过模板)
* */
private Map<String, String> templateIdMap;
/** 国际/港澳台短信 SenderId: 国内短信填空,默认未开通(国内短信不需要填写此项),如需开通请联系 [sms helper] */
String senderid = "";
/**短信号码扩展号: 默认未开通,如需开通请联系 [sms helper] 个人不需要填写*/
private String extendCode = "";
}