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; } }