diff --git a/doc/v2.1.0.sql b/doc/v2.1.0.sql
index 1b83845..189766c 100644
--- a/doc/v2.1.0.sql
+++ b/doc/v2.1.0.sql
@@ -1,6 +1,6 @@
ALTER TABLE `tduck`.`pr_user_project_result`
ADD COLUMN `wx_open_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '微信openId' AFTER `complete_time`,
-ADD COLUMN `wx_user_info` json NULL COMMENT '微信用户信息' AFTER `wx_open_id`,
+ADD COLUMN `wx_user_info` json NULL COMMENT '微信用户信息' AFTER `wx_open_id`;
ALTER TABLE `tduck`.`pr_user_project_setting`
ADD COLUMN `is_wx_write_once` tinyint(1) NULL AFTER `is_wx_write`;
\ No newline at end of file
diff --git a/tduck-api/src/main/resources/application-dev.yml b/tduck-api/src/main/resources/application-dev.yml
index c16f650..0279330 100644
--- a/tduck-api/src/main/resources/application-dev.yml
+++ b/tduck-api/src/main/resources/application-dev.yml
@@ -44,12 +44,13 @@ platform:
bucketName: tduck-cloud
domain: https://qiniu.smileyi.top
sms:
- secretId: mpw:EvC1LR0eGdzeQzkuO7fhEazxGtmdue8FJDzSA1l+gICuOUEDXI8zcjK+VXB2aWKS # 腾讯云账户ID
- secretKey: mpw:W3kvWxvHdgUJPAwqR6mwpfMoQMerAYcxZGHwJc259lK3m+jzceGuu0Tgnx++02Bk # 腾讯云账户key
- appId: 1400461467 # 腾讯云短信应用ID
- sign: smileyi知识分享 # 腾讯云短信签名
- validateCodeTemplateId: 808150 # 腾讯云短信模板ID
- retrievePwdValidateCodeTemplateId: 809014 # 腾讯云短信模板ID
+ type: 1 # 短信平台类型
+ secretId: mpw:EvC1LR0eGdzeQzkuO7fhEazxGtmdue8FJDzSA1l+gICuOUEDXI8zcjK+VXB2aWKS
+ secretKey: mpw:W3kvWxvHdgUJPAwqR6mwpfMoQMerAYcxZGHwJc259lK3m+jzceGuu0Tgnx++02Bk
+ appId: 1400461467
+ sign: smileyi知识分享
+ validateCodeTemplateId: 808150
+ retrievePwdValidateCodeTemplateId: 809014
front:
baseUrl: http://localhost:8888/
resetPwdUrl: http://localhost:8888/forget/password?code={}&email={}
diff --git a/tduck-api/src/main/resources/application-prod.yml b/tduck-api/src/main/resources/application-prod.yml
index 6f2c740..c3be1f9 100644
--- a/tduck-api/src/main/resources/application-prod.yml
+++ b/tduck-api/src/main/resources/application-prod.yml
@@ -1,9 +1,9 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url:
- username:
- password:
+ url: jdbc:mysql://127.0.0.1:3306/tduck?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&tinyInt1isBit=false
+ username: tduck
+ password: tduck001
type: com.zaxxer.hikari.HikariDataSource
hikari:
minimum-idle: 5
@@ -14,8 +14,8 @@ spring:
max-lifetime: 1800000
connection-test-query: SELECT 1 FROM DUAL
redis:
- database: 8
- host:
+ database: 0
+ host: 127.0.0.1
port: 6379
password:
timeout: 6000ms # 连接超时时长(毫秒)
@@ -26,9 +26,9 @@ spring:
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连接
mail:
- host:
- username:
- password:
+ host: smtp.163.com
+ username: test@163.com # 邮箱账号
+ password: DSXFPX24XOBURMDY #邮箱授权码
logging:
level:
@@ -42,29 +42,32 @@ platform:
appId:
secret:
oss:
- ossType: 1
- endpoint: 12
+ ossType: 3 #本地存储
+ endpoint:
accessKeyId:
accessKeySecret:
bucketName:
- domain:
+ domain: https://demo.tduckapp.com/profile/ #提供访问的域名
+ upload-folder: /home/tduck/profile #文件存放的位置
+ access-path-pattern: /profile/** # 文件访问路径前缀 这里更改domain也需要更改
sms:
- secretId:
- secretKey:
+ type: 1 # 短信平台类型
+ secretId: Ga2AIryi8174KXz #短信秘钥
+ secretKey: uHSpKfjtadadaezjwtN6B0dvbelv #短信秘钥
appId:
- sign:
- validateCodeTemplateId:
- retrievePwdValidateCodeTemplateId:
+ sign: tduck #短信签名
+ validateCodeTemplateId: SMS_219865038 #验证码模板
+ retrievePwdValidateCodeTemplateId: SMS_219865039 # 找回密码模板
front:
- baseUrl: https://tduck.smileyi.top/
- resetPwdUrl: https://tduck.smileyi.top/forget/password?code={}&email={}
- updateEmailUrl: https://localhost:8888/account/forget/validate?type=updateEmail&code={}&email={}
+ baseUrl: https://demo.tduckapp.com/
+ resetPwdUrl: https://demo.tduckapp.com/forget/password?code={}&email={}
+ updateEmailUrl: https://demo.tduckapp.com/account/forget/validate?type=updateEmail&code={}&email={}
wx:
mp:
configs:
- - appId:
- secret:
- token:
- aesKey:
+ - appId: #公众号appId
+ secret: #公众号秘钥
+ token: dHClTzEAcayUX0Jyy9TwBp89QrdWvvZZ
+ aesKey: 3aNsbtc8wdx92M14YszvQSU4zksx9M1Gl8k655vYOLB
diff --git a/tduck-common/pom.xml b/tduck-common/pom.xml
index bbb9058..31d7957 100644
--- a/tduck-common/pom.xml
+++ b/tduck-common/pom.xml
@@ -73,5 +73,10 @@
com.tencentcloudapi
tencentcloud-sdk-java
+
+ com.aliyun
+ dysmsapi20170525
+ 2.0.4
+
\ No newline at end of file
diff --git a/tduck-common/src/main/java/com/tduck/cloud/common/sms/AliyunSmsServiceImpl.java b/tduck-common/src/main/java/com/tduck/cloud/common/sms/AliyunSmsServiceImpl.java
new file mode 100644
index 0000000..2610224
--- /dev/null
+++ b/tduck-common/src/main/java/com/tduck/cloud/common/sms/AliyunSmsServiceImpl.java
@@ -0,0 +1,77 @@
+package com.tduck.cloud.common.sms;
+
+import cn.hutool.core.util.StrUtil;
+import com.aliyun.dysmsapi20170525.Client;
+import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
+import com.aliyun.teaopenapi.models.Config;
+import com.google.common.collect.ImmutableMap;
+import com.tduck.cloud.common.util.JsonUtils;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Map;
+
+/**
+ * @author : smalljop
+ * @description : 腾讯云短信
+ * @create : 2020-12-15 10:33
+ **/
+@Data
+@Slf4j
+public class AliyunSmsServiceImpl extends SmsService {
+
+
+ private Client client;
+
+ public AliyunSmsServiceImpl(SmsPlatformProperties properties) {
+ Config config = new Config()
+ // 您的AccessKey ID
+ .setAccessKeyId(properties.getSecretId())
+ // 您的AccessKey Secret
+ .setAccessKeySecret(properties.getSecretKey());
+ // 访问的域名
+ config.endpoint = "dysmsapi.aliyuncs.com";
+ try {
+ client = new Client(config);
+ this.properties = properties;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ @Override
+ public boolean sendSms(String phoneNumber, String templateId, String... templateParams) {
+ Map params = ImmutableMap.of("code", templateParams);
+ // 1.发送短信
+ SendSmsRequest sendReq = new SendSmsRequest()
+ .setPhoneNumbers(phoneNumber)
+ .setSignName(properties.getSign())
+ .setTemplateCode(templateId)
+ .setTemplateParam(JsonUtils.objToJson(params));
+ SendSmsResponse sendResp = null;
+ try {
+ sendResp = client.sendSms(sendReq);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ String code = sendResp.body.code;
+ if (!StrUtil.equals(code, "OK")) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean sendValidateSms(String phoneNumber, String... templateParams) {
+ this.sendSms(phoneNumber, properties.getValidateCodeTemplateId(), templateParams);
+ return true;
+ }
+
+ @Override
+ public boolean sendRetrievePwdValidateSms(String phoneNumber, String... templateParams) {
+ this.sendSms(phoneNumber, properties.getValidateCodeTemplateId(), templateParams);
+ return false;
+ }
+}
diff --git a/tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsPlatformConfig.java b/tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsPlatformConfig.java
new file mode 100644
index 0000000..129e20e
--- /dev/null
+++ b/tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsPlatformConfig.java
@@ -0,0 +1,32 @@
+package com.tduck.cloud.common.sms;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author : wangqing
+ * @description : 短信平台配置
+ * @create : 2021/07/19 10:59
+ **/
+@Configuration
+@RequiredArgsConstructor
+public class SmsPlatformConfig {
+
+ private final SmsPlatformProperties properties;
+
+
+ @Bean
+ public SmsService smsService() {
+ SmsService smsService = null;
+ switch (properties.getType()) {
+ case ALIYUN:
+ smsService = new AliyunSmsServiceImpl(properties);
+ break;
+ case TENCENT_CLOUD:
+ smsService = new TencentSmsServiceImpl(properties);
+ break;
+ }
+ return smsService;
+ }
+}
diff --git a/tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsPlatformProperties.java b/tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsPlatformProperties.java
new file mode 100644
index 0000000..8e75984
--- /dev/null
+++ b/tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsPlatformProperties.java
@@ -0,0 +1,47 @@
+package com.tduck.cloud.common.sms;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 短信配置类
+ *
+ * @author smalljop
+ */
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "platform.sms")
+public class SmsPlatformProperties {
+
+ /**
+ * secretId
+ */
+ private String secretId;
+
+
+ private SmsTypeEnum type;
+ /**
+ * 秘钥
+ */
+ private String secretKey;
+ /**
+ * appId 腾讯云使用
+ */
+ private String appId;
+ /**
+ * 短信签名 如【tduck】 需要去短信平台申请
+ */
+ private String sign;
+ /**
+ * 验证码模板Id
+ */
+ private String validateCodeTemplateId;
+ /**
+ * 找回密码验证码
+ */
+ private String retrievePwdValidateCodeTemplateId;
+
+
+
+}
\ No newline at end of file
diff --git a/tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsService.java b/tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsService.java
index 26269f4..8c3a89e 100644
--- a/tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsService.java
+++ b/tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsService.java
@@ -5,7 +5,9 @@ package com.tduck.cloud.common.sms;
* @description : 短信服务
* @create : 2020-12-15 10:30
**/
-public interface SmsService {
+public abstract class SmsService {
+
+ public SmsPlatformProperties properties;
/**
* 发送短信
@@ -15,7 +17,7 @@ public interface SmsService {
* @param templateParams 短信模板參數
* @return
*/
- boolean sendSms(String phoneNumber, String templateId, String... templateParams);
+ public abstract boolean sendSms(String phoneNumber, String templateId, String... templateParams);
/**
* 发送验证短信
@@ -24,7 +26,7 @@ public interface SmsService {
* @param templateParams 短信模板參數
* @return
*/
- boolean sendValidateSms(String phoneNumber, String... templateParams);
+ public abstract boolean sendValidateSms(String phoneNumber, String... templateParams);
/**
* 发送找回密码验证码
@@ -33,6 +35,6 @@ public interface SmsService {
* @param templateParams
* @return
*/
- boolean sendRetrievePwdValidateSms(String phoneNumber, String... templateParams);
+ public abstract boolean sendRetrievePwdValidateSms(String phoneNumber, String... templateParams);
}
diff --git a/tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsTypeEnum.java b/tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsTypeEnum.java
new file mode 100644
index 0000000..a245c00
--- /dev/null
+++ b/tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsTypeEnum.java
@@ -0,0 +1,35 @@
+package com.tduck.cloud.common.sms;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.Getter;
+
+/**
+ * @description: Oss类型
+ * @author: smalljop
+ * @create: 2020-02-18 23:06
+ **/
+@Getter
+public enum SmsTypeEnum {
+ /**
+ * 阿里云
+ */
+ ALIYUN(1),
+
+ /**
+ * 腾讯云
+ */
+ TENCENT_CLOUD(2);
+
+
+ @EnumValue
+ @JsonValue
+ public final int value;
+
+ @JsonCreator
+ SmsTypeEnum(int value) {
+ this.value = value;
+ }
+
+}
diff --git a/tduck-common/src/main/java/com/tduck/cloud/common/sms/TencentSmsServiceImpl.java b/tduck-common/src/main/java/com/tduck/cloud/common/sms/TencentSmsServiceImpl.java
index c630d02..92ed51d 100644
--- a/tduck-common/src/main/java/com/tduck/cloud/common/sms/TencentSmsServiceImpl.java
+++ b/tduck-common/src/main/java/com/tduck/cloud/common/sms/TencentSmsServiceImpl.java
@@ -8,46 +8,35 @@ import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.stereotype.Component;
-import javax.annotation.PostConstruct;
/**
* @author : smalljop
* @description : 腾讯云短信
* @create : 2020-12-15 10:33
**/
-@ConfigurationProperties(prefix = "platform.sms")
-@Component
+
@Slf4j
@Data
-public class TencentSmsServiceImpl implements SmsService {
-
- private String secretId;
-
- private String secretKey;
- private String appId;
- private String sign;
- private String validateCodeTemplateId;
- private String retrievePwdValidateCodeTemplateId;
+public class TencentSmsServiceImpl extends SmsService {
private SmsClient client;
- @PostConstruct
- public void init() {
+ public TencentSmsServiceImpl(SmsPlatformProperties properties) {
/* 必要步骤:
* 实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId 和 secretKey
* 本示例采用从环境变量读取的方式,需要预先在环境变量中设置这两个值
* 您也可以直接在代码中写入密钥对,但需谨防泄露,不要将代码复制、上传或者分享给他人
* CAM 密钥查询:https://console.cloud.tencent.com/cam/capi
*/
- Credential cred = new Credential(secretId, secretKey);
+ Credential cred = new Credential(properties.getSecretId(), properties.getSecretKey());
/* 实例化 SMS 的 client 对象
* 第二个参数是地域信息,可以直接填写字符串 ap-guangzhou,或者引用预设的常量 */
client = new SmsClient(cred, "ap-guangzhou");
+ this.properties = properties;
}
+
@Override
public boolean sendSms(String phoneNumber, String templateId, String... templateParams) {
/* 填充请求参数,这里 request 对象的成员变量即对应接口的入参
@@ -58,10 +47,10 @@ public class TencentSmsServiceImpl implements SmsService {
* sms helper:https://cloud.tencent.com/document/product/382/3773 */
SendSmsRequest req = new SendSmsRequest();
/* 短信应用 ID: 在 [短信控制台] 添加应用后生成的实际 SDKAppID,例如1400006666 */
- req.setSmsSdkAppid(appId);
+ req.setSmsSdkAppid(properties.getAppId());
/* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,可登录 [短信控制台] 查看签名信息 */
- req.setSign(sign);
+ req.setSign(properties.getSign());
/* 模板 ID: 必须填写已审核通过的模板 ID,可登录 [短信控制台] 查看模板 ID */
req.setTemplateID(templateId);
@@ -90,13 +79,13 @@ public class TencentSmsServiceImpl implements SmsService {
@Override
public boolean sendValidateSms(String phoneNumber, String... templateParams) {
- this.sendSms(phoneNumber, validateCodeTemplateId, templateParams);
+ this.sendSms(phoneNumber, properties.getValidateCodeTemplateId(), templateParams);
return true;
}
@Override
public boolean sendRetrievePwdValidateSms(String phoneNumber, String... templateParams) {
- this.sendSms(phoneNumber, retrievePwdValidateCodeTemplateId, templateParams);
+ this.sendSms(phoneNumber, properties.getRetrievePwdValidateCodeTemplateId(), templateParams);
return false;
}
}