diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 3129e2d6..513918dc 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -18,6 +18,7 @@
ruoyi-common-sensitive
ruoyi-common-datascope
ruoyi-common-datasource
+ ruoyi-common-sms
ruoyi-common
diff --git a/ruoyi-common/ruoyi-common-sms/pom.xml b/ruoyi-common/ruoyi-common-sms/pom.xml
new file mode 100644
index 00000000..eb3915b2
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-sms/pom.xml
@@ -0,0 +1,59 @@
+
+
+
+ com.ruoyi
+ ruoyi-common
+ 3.6.4
+
+ 4.0.0
+
+ ruoyi-common-sms
+
+
+ ruoyi-common-sms 短信模块
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 5.7.0
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ 5.7.0
+ test
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/com/ruoyi/common/sms/XunDaYunXinAutoConfiguration.java b/ruoyi-common/ruoyi-common-sms/src/main/java/com/ruoyi/common/sms/XunDaYunXinAutoConfiguration.java
new file mode 100644
index 00000000..14ada60c
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-sms/src/main/java/com/ruoyi/common/sms/XunDaYunXinAutoConfiguration.java
@@ -0,0 +1,24 @@
+package com.ruoyi.common.sms;
+
+import com.ruoyi.common.sms.component.SmsComponent;
+import com.ruoyi.common.sms.properties.XunDaYunXinProperties;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+@EnableConfigurationProperties(XunDaYunXinProperties.class)
+public class XunDaYunXinAutoConfiguration {
+
+ @Bean
+ public SmsComponent smsComponent() {
+ return new SmsComponent();
+ }
+
+ @Bean
+ public RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/com/ruoyi/common/sms/component/SmsComponent.java b/ruoyi-common/ruoyi-common-sms/src/main/java/com/ruoyi/common/sms/component/SmsComponent.java
new file mode 100644
index 00000000..43e83526
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-sms/src/main/java/com/ruoyi/common/sms/component/SmsComponent.java
@@ -0,0 +1,145 @@
+package com.ruoyi.common.sms.component;
+
+import com.ruoyi.common.sms.entity.response.SmsEntity;
+import com.ruoyi.common.sms.entity.response.SmsResponse;
+import com.ruoyi.common.sms.properties.XunDaYunXinProperties;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.*;
+
+@Slf4j
+public class SmsComponent {
+ @Autowired
+ private XunDaYunXinProperties properties;
+
+ @Autowired
+ private RestTemplate restTemplate;
+
+ /**
+ * 点对点
+ *
+ * @param mobileContentKvp 号码内容键值对 示例 {"15100000000":"【测试】test1","15100000001":"【测试】test2"}
+ * @return SmsResponse
+ */
+ public SmsResponse sendP2PMsg(Map mobileContentKvp) {
+ Map extraParams = new HashMap<>();
+
+ for (Map.Entry entry : mobileContentKvp.entrySet()) {
+ String oldValue = entry.getValue();
+ String newValue = replaceCode(properties.getTemplate(), oldValue);
+ entry.setValue(newValue);
+ }
+ extraParams.put("mobileContentKvp", mobileContentKvp);
+ return sendSmsRequest("p2p", extraParams, new ParameterizedTypeReference() {
+ });
+ }
+
+
+ /**
+ * 发送群发信息
+ *
+ * @param mobile 电话号码按照,分割 示例 "15100000000,15100000001"
+ * @param content 内容 一般为验证码
+ * @return SmsResponse
+ */
+ public SmsResponse sendGroupMsg(String mobile, String content) {
+ Map extraParams = new HashMap<>();
+ extraParams.put("mobile", removeDuplicates(mobile));
+ extraParams.put("content", replaceCode(properties.getTemplate(), content));
+ return sendSmsRequest("send", extraParams, new ParameterizedTypeReference>() {
+ });
+ }
+
+
+ public SmsResponse> checkBalance() {
+ String url = properties.getBaseUrl() + "/smsv2";
+ Map params = new HashMap<>();
+ params.put("action", "balance");
+ params.put("account", properties.getAccount());
+ params.put("password", properties.getPassword());
+ HttpEntity