pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-admin/src/main/resources/application-dev.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-admin/src/main/resources/application-prod.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/ruoyi-common-sms/pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/dao/PlusSmsDao.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
pom.xml
@@ -47,7 +47,7 @@ <aws.sdk.version>2.23.0</aws.sdk.version> <aws.crt.version>0.29.6</aws.crt.version> <!-- SMS é ç½® --> <sms4j.version>2.2.0</sms4j.version> <sms4j.version>3.1.1</sms4j.version> <!-- éå¶æ¡æ¶ä¸çfastjsonçæ¬ --> <fastjson.version>1.2.83</fastjson.version> ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java
@@ -5,6 +5,9 @@ import cn.hutool.captcha.generator.CodeGenerator; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.RandomUtil; import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.domain.R; @@ -21,11 +24,7 @@ import org.dromara.sms4j.api.SmsBlend; import org.dromara.sms4j.api.entity.SmsResponse; import org.dromara.sms4j.core.factory.SmsFactory; import org.dromara.sms4j.provider.enumerate.SupplierType; import org.dromara.web.domain.vo.CaptchaVo; import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; @@ -66,11 +65,11 @@ String templateId = ""; LinkedHashMap<String, String> map = new LinkedHashMap<>(1); map.put("code", code); SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA); SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map); if (!"OK".equals(smsResponse.getCode())) { if (!smsResponse.isSuccess()) { log.error("éªè¯ç çä¿¡åéå¼å¸¸ => {}", smsResponse); return R.fail(smsResponse.getMessage()); return R.fail(smsResponse.getData().toString()); } return R.ok(); } ruoyi-admin/src/main/resources/application-dev.yml
@@ -149,31 +149,36 @@ connectionTimeout: 0 --- # sms çä¿¡ æ¯æ é¿éäº è ¾è®¯äº äºç ççåå¼åæ ·ççä¿¡æå¡å # https://wind.kim/doc/start ææ¡£å°å å个ååå¯åæ¶ä½¿ç¨ # https://sms4j.com/doc3/ å·®å¼é ç½®ææ¡£å°å æ¯æåååå¤é ç½®ï¼å¯ä»¥é ç½®å¤ä¸ªåæ¶ä½¿ç¨ sms: # é¿éäº dysmsapi.aliyuncs.com alibaba: #请æ±å°å é»è®¤ä¸º dysmsapi.aliyuncs.com 妿 ç¹æ®æ¹åå¯ä»¥ä¸ç¨è®¾ç½® requestUrl: dysmsapi.aliyuncs.com #é¿éäºçaccessKey accessKeyId: xxxxxxx #é¿éäºçaccessKeySecret accessKeySecret: xxxxxxx #çä¿¡ç¾å signature: æµè¯ tencent: #请æ±å°åé»è®¤ä¸º sms.tencentcloudapi.com 妿 ç¹æ®æ¹åå¯ä¸ç¨è®¾ç½® requestUrl: sms.tencentcloudapi.com #è ¾è®¯äºçaccessKey accessKeyId: xxxxxxx #è ¾è®¯äºçaccessKeySecret accessKeySecret: xxxxxxx #çä¿¡ç¾å signature: æµè¯ #çä¿¡sdkAppId sdkAppId: appid #å°åä¿¡æ¯é»è®¤ä¸º ap-guangzhou 妿 ç¹æ®æ¹åå¯ä¸ç¨è®¾ç½® territory: ap-guangzhou # é ç½®æºç±»åç¨äºæ å®é ç½®æ¥æº(interface,yaml) config-type: yaml # ç¨äºæ å®ymlä¸çé ç½®æ¯å¦å¼å¯çä¿¡æ¦æªï¼æ¥å£é ç½®ä¸åæ¤éå¶ restricted: true # çä¿¡æ¦æªéå¶åææºå·æ¯åéæå¤§åéï¼åªå¯¹å¼å¯äºæ¦æªçé ç½®ææ minute-max: 1 # çä¿¡æ¦æªéå¶åææºå·æ¯æ¥æå¤§åééï¼åªå¯¹å¼å¯äºæ¦æªçé ç½®ææ account-max: 30 # 以ä¸é ç½®æ¥èªäº org.dromara.sms4j.provider.config.BaseConfigç±»ä¸ blends: # å¯ä¸ID ç¨äºåéç信寻æ¾å ·ä½é ç½® é便å®ä¹å«ç¨ä¸æå³å¯ # å¯ä»¥åæ¶åå¨ä¸¤ä¸ªç¸ååå ä¾å¦: ali1 ali2 两个ä¸åçé¿éçä¿¡è´¦å· ä¹å¯ç¨äºåºåç§æ· config1: # æ¡æ¶å®ä¹çåååç§°æ è¯ï¼æ 宿¤é ç½®æ¯åªä¸ªååï¼è¯¦ç»è¯·çååæ è¯ä»ç»é¨å supplier: alibaba # æäºç§°ä¸ºaccessKeyæäºç§°ä¹ä¸ºapiKeyï¼ä¹æç§°ä¸ºsdkKeyæè appIdã access-key-id: æ¨çaccessKey # 称为accessSecretæäºç§°ä¹ä¸ºapiSecret access-key-secret: æ¨çaccessKeySecret signature: æ¨ççä¿¡ç¾å sdk-app-id: æ¨çsdkAppId config2: # ååæ è¯ï¼æ 宿¤é ç½®æ¯åªä¸ªååï¼è¯¦ç»è¯·çååæ è¯ä»ç»é¨å supplier: tencent access-key-id: æ¨çaccessKey access-key-secret: æ¨çaccessKeySecret signature: æ¨ççä¿¡ç¾å sdk-app-id: æ¨çsdkAppId --- # 䏿¹ææ ruoyi-admin/src/main/resources/application-prod.yml
@@ -152,31 +152,36 @@ connectionTimeout: 0 --- # sms çä¿¡ æ¯æ é¿éäº è ¾è®¯äº äºç ççåå¼åæ ·ççä¿¡æå¡å # https://wind.kim/doc/start ææ¡£å°å å个ååå¯åæ¶ä½¿ç¨ # https://sms4j.com/doc3/ å·®å¼é ç½®ææ¡£å°å æ¯æåååå¤é ç½®ï¼å¯ä»¥é ç½®å¤ä¸ªåæ¶ä½¿ç¨ sms: # é¿éäº dysmsapi.aliyuncs.com alibaba: #请æ±å°å é»è®¤ä¸º dysmsapi.aliyuncs.com 妿 ç¹æ®æ¹åå¯ä»¥ä¸ç¨è®¾ç½® requestUrl: dysmsapi.aliyuncs.com #é¿éäºçaccessKey accessKeyId: xxxxxxx #é¿éäºçaccessKeySecret accessKeySecret: xxxxxxx #çä¿¡ç¾å signature: æµè¯ tencent: #请æ±å°åé»è®¤ä¸º sms.tencentcloudapi.com 妿 ç¹æ®æ¹åå¯ä¸ç¨è®¾ç½® requestUrl: sms.tencentcloudapi.com #è ¾è®¯äºçaccessKey accessKeyId: xxxxxxx #è ¾è®¯äºçaccessKeySecret accessKeySecret: xxxxxxx #çä¿¡ç¾å signature: æµè¯ #çä¿¡sdkAppId sdkAppId: appid #å°åä¿¡æ¯é»è®¤ä¸º ap-guangzhou 妿 ç¹æ®æ¹åå¯ä¸ç¨è®¾ç½® territory: ap-guangzhou # é ç½®æºç±»åç¨äºæ å®é ç½®æ¥æº(interface,yaml) config-type: yaml # ç¨äºæ å®ymlä¸çé ç½®æ¯å¦å¼å¯çä¿¡æ¦æªï¼æ¥å£é ç½®ä¸åæ¤éå¶ restricted: true # çä¿¡æ¦æªéå¶åææºå·æ¯åéæå¤§åéï¼åªå¯¹å¼å¯äºæ¦æªçé ç½®ææ minute-max: 1 # çä¿¡æ¦æªéå¶åææºå·æ¯æ¥æå¤§åééï¼åªå¯¹å¼å¯äºæ¦æªçé ç½®ææ account-max: 30 # 以ä¸é ç½®æ¥èªäº org.dromara.sms4j.provider.config.BaseConfigç±»ä¸ blends: # å¯ä¸ID ç¨äºåéç信寻æ¾å ·ä½é ç½® é便å®ä¹å«ç¨ä¸æå³å¯ # å¯ä»¥åæ¶åå¨ä¸¤ä¸ªç¸ååå ä¾å¦: ali1 ali2 两个ä¸åçé¿éçä¿¡è´¦å· ä¹å¯ç¨äºåºåç§æ· config1: # æ¡æ¶å®ä¹çåååç§°æ è¯ï¼æ 宿¤é ç½®æ¯åªä¸ªååï¼è¯¦ç»è¯·çååæ è¯ä»ç»é¨å supplier: alibaba # æäºç§°ä¸ºaccessKeyæäºç§°ä¹ä¸ºapiKeyï¼ä¹æç§°ä¸ºsdkKeyæè appIdã access-key-id: æ¨çaccessKey # 称为accessSecretæäºç§°ä¹ä¸ºapiSecret access-key-secret: æ¨çaccessKeySecret signature: æ¨ççä¿¡ç¾å sdk-app-id: æ¨çsdkAppId config2: # ååæ è¯ï¼æ 宿¤é ç½®æ¯åªä¸ªååï¼è¯¦ç»è¯·çååæ è¯ä»ç»é¨å supplier: tencent access-key-id: æ¨çaccessKey access-key-secret: æ¨çaccessKeySecret signature: æ¨ççä¿¡ç¾å sdk-app-id: æ¨çsdkAppId --- # 䏿¹ææ justauth: ruoyi-common/ruoyi-common-sms/pom.xml
@@ -20,13 +20,12 @@ <dependency> <groupId>org.dromara.sms4j</groupId> <artifactId>sms4j-spring-boot-starter</artifactId> <exclusions> <!-- æé¤äº¬ä¸çä¿¡å åå¨çfastjsonçå¾ ä½è åç»ä¿®å¤ --> <exclusion> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </exclusion> </exclusions> </dependency> <!-- RuoYi Common Redis--> <dependency> <groupId>org.dromara</groupId> <artifactId>ruoyi-common-redis</artifactId> </dependency> </dependencies> ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java
@@ -1,14 +1,24 @@ package org.dromara.common.sms.config; import org.dromara.common.sms.core.dao.PlusSmsDao; import org.dromara.sms4j.api.dao.SmsDao; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; /** * çä¿¡é 置类(ææ¶æ²¡ç¨ é¢çæ©å±) * çä¿¡é 置类 * * @author Lion Li * @version 4.2.0 * @author Feng */ @AutoConfiguration @AutoConfiguration(after = {RedisAutoConfiguration.class}) public class SmsAutoConfiguration { @Primary @Bean public SmsDao smsDao() { return new PlusSmsDao(); } } ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/dao/PlusSmsDao.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,72 @@ package org.dromara.common.sms.core.dao; import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.sms4j.api.dao.SmsDao; import java.time.Duration; /** * SmsDaoç¼åé ç½® (ä½¿ç¨æ¡æ¶èªå¸¦RedisUtilså®ç° åè®®ç»ä¸) * <p>主è¦ç¨äºçä¿¡éè¯åæ¦æªçç¼å * * @author Feng */ public class PlusSmsDao implements SmsDao { /** * åå¨ * * @param key é® * @param value å¼ * @param cacheTime ç¼åæ¶é´ï¼åä½ï¼ç§) */ @Override public void set(String key, Object value, long cacheTime) { RedisUtils.setCacheObject(GlobalConstants.GLOBAL_REDIS_KEY + key, value, Duration.ofSeconds(cacheTime)); } /** * åå¨ * * @param key é® * @param value å¼ */ @Override public void set(String key, Object value) { RedisUtils.setCacheObject(GlobalConstants.GLOBAL_REDIS_KEY + key, value, true); } /** * 读å * * @param key é® * @return å¼ */ @Override public Object get(String key) { return RedisUtils.getCacheObject(GlobalConstants.GLOBAL_REDIS_KEY + key); } /** * remove * <p> æ ¹æ®keyç§»é¤ç¼å * * @param key ç¼åé® * @return 被å é¤çvalue * @author :Wind */ @Override public Object remove(String key) { return RedisUtils.deleteObject(GlobalConstants.GLOBAL_REDIS_KEY + key); } /** * æ¸ ç©º */ @Override public void clean() { RedisUtils.deleteObject(GlobalConstants.GLOBAL_REDIS_KEY + "sms:"); } } ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java
@@ -1,11 +1,11 @@ package org.dromara.demo.controller; import cn.dev33.satoken.annotation.SaIgnore; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.sms4j.api.SmsBlend; import org.dromara.sms4j.api.entity.SmsResponse; import org.dromara.sms4j.core.factory.SmsFactory; import org.dromara.sms4j.provider.enumerate.SupplierType; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -20,12 +20,12 @@ * @author Lion Li * @version 4.2.0 */ @SaIgnore @Validated @RequiredArgsConstructor @RestController @RequestMapping("/demo/sms") public class SmsController { /** * åéçä¿¡Aliyun * @@ -36,7 +36,7 @@ public R<Object> sendAliyun(String phones, String templateId) { LinkedHashMap<String, String> map = new LinkedHashMap<>(1); map.put("code", "1234"); SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA); SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map); return R.ok(smsResponse); } @@ -52,9 +52,33 @@ LinkedHashMap<String, String> map = new LinkedHashMap<>(1); // map.put("2", "æµè¯æµè¯"); map.put("1", "1234"); SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.TENCENT); SmsBlend smsBlend = SmsFactory.getSmsBlend("config2"); SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map); return R.ok(smsResponse); } /** * æ·»å é»åå * * @param phone ææºå· */ @GetMapping("/addBlacklist") public R<Object> addBlacklist(String phone){ SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); smsBlend.joinInBlacklist(phone); return R.ok(); } /** * ç§»é¤é»åå * * @param phone ææºå· */ @GetMapping("/removeBlacklist") public R<Object> removeBlacklist(String phone){ SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); smsBlend.removeFromBlacklist(phone); return R.ok(); } }