README.md
@@ -57,7 +57,7 @@ | åå¸å¼ä»»å¡è°åº¦ | éç¨ Xxl-Job å¤©çæ¯æåå¸å¼ ç»ä¸ç管çä¸å¿ | éç¨ Quartz åºäºæ°æ®åºéæ§è½å·® é群éè¦åå¾å¤é ç½®ä¸æ¹é | | æä»¶åå¨ | éç¨ Minio åå¸å¼æä»¶åå¨ å¤©çæ¯æå¤æºãå¤ç¡¬çãå¤åçãå¤å¯æ¬åå¨<br/>æ¯ææé管ç å®å ¨å¯é æä»¶å¯å å¯åå¨ | éç¨ æ¬æºæä»¶åå¨ æä»¶è£¸æ¼ æä¸¢å¤±æ³æ¼ 䏿¯æé群æåç¹æåº | | äºåå¨ | éç¨ AWS S3 å议客æ·ç«¯ æ¯æ ä¸çãé¿éãè ¾è®¯ çä¸åæ¯æS3åè®®çåå®¶ | 䏿¯æ | | çä¿¡ | æ¯æ é¿éãè ¾è®¯ åªéå¨ymlé 置好åå®¶å¯é¥å³å¯ä½¿ç¨ æ¥å£åæ¯ææ©å±å ¶ä»åå®¶ | 䏿¯æ | | çä¿¡ | éç¨ sms4j çä¿¡èåå æ¯ææ°åç§çä¿¡åå®¶ åªéå¨ymlé 置好åå®¶å¯é¥å³å¯ä½¿ç¨ å¯å¤åå®¶å ±ç¨ | 䏿¯æ | | é®ä»¶ | éç¨ mail-api éç¨åè®®æ¯æå¤§é¨åé®ä»¶åå | 䏿¯æ | | æ¥å£ææ¡£ | éç¨ SpringDocãjavadoc æ æ³¨è§£é¶å ¥ä¾µåºäºjava注é<br/>åªéææ³¨éå好 æ éååä¸å¤§å çææ¡£æ³¨è§£äº | éç¨ Springfox å·²åæ¢ç»´æ¤ éè¦ç¼å大éçæ³¨è§£æ¥æ¯æææ¡£çæ | | æ ¡éªæ¡æ¶ | éç¨ Validation æ¯ææ³¨è§£ä¸å·¥å ·ç±»æ ¡éª æ³¨è§£æ¯æå½é å | ä» æ¯ææ³¨è§£ 䏿³¨è§£ä¸æ¯æå½é å | pom.xml
@@ -49,8 +49,7 @@ <!-- OSS é ç½® --> <aws-java-sdk-s3.version>1.12.400</aws-java-sdk-s3.version> <!-- SMS é ç½® --> <aliyun.sms.version>2.0.23</aliyun.sms.version> <tencent.sms.version>3.1.687</tencent.sms.version> <sms4j.version>2.1.1</sms4j.version> <!-- æä»¶çæ¬ --> <maven-jar-plugin.version>3.2.2</maven-jar-plugin.version> @@ -242,17 +241,11 @@ <artifactId>aws-java-sdk-s3</artifactId> <version>${aws-java-sdk-s3.version}</version> </dependency> <!--çä¿¡sms4j--> <dependency> <groupId>com.aliyun</groupId> <artifactId>dysmsapi20170525</artifactId> <version>${aliyun.sms.version}</version> </dependency> <dependency> <groupId>com.tencentcloudapi</groupId> <artifactId>tencentcloud-sdk-java-sms</artifactId> <version>${tencent.sms.version}</version> <groupId>org.dromara.sms4j</groupId> <artifactId>sms4j-spring-boot-starter</artifactId> <version>${sms4j.version}</version> </dependency> <dependency> ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java
@@ -14,11 +14,12 @@ import org.dromara.common.mail.config.properties.MailProperties; import org.dromara.common.mail.utils.MailUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.sms.config.properties.SmsProperties; import org.dromara.common.sms.core.SmsTemplate; import org.dromara.common.sms.entity.SmsResult; import org.dromara.common.web.config.properties.CaptchaProperties; import org.dromara.common.web.enums.CaptchaType; 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; @@ -31,8 +32,7 @@ import org.springframework.web.bind.annotation.RestController; import java.time.Duration; import java.util.HashMap; import java.util.Map; import java.util.LinkedHashMap; /** * éªè¯ç æä½å¤ç @@ -47,7 +47,6 @@ public class CaptchaController { private final CaptchaProperties captchaProperties; private final SmsProperties smsProperties; private final MailProperties mailProperties; /** @@ -57,21 +56,18 @@ */ @GetMapping("/resource/sms/code") public R<Void> smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { if (!smsProperties.getEnabled()) { return R.fail("å½åç³»ç»æ²¡æå¼å¯çä¿¡åè½ï¼"); } String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber; String code = RandomUtil.randomNumbers(4); RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); // éªè¯ç 模æ¿id èªè¡å¤ç (æ¥æ°æ®åºæåæ»åå¯) String templateId = ""; Map<String, String> map = new HashMap<>(1); LinkedHashMap<String, String> map = new LinkedHashMap<>(1); map.put("code", code); SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class); SmsResult result = smsTemplate.send(phonenumber, templateId, map); if (!result.isSuccess()) { log.error("éªè¯ç çä¿¡åéå¼å¸¸ => {}", result); return R.fail(result.getMessage()); SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA); SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map); if (!"OK".equals(smsResponse.getCode())) { log.error("éªè¯ç çä¿¡åéå¼å¸¸ => {}", smsResponse); return R.fail(smsResponse.getMessage()); } return R.ok(); } ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -345,7 +345,7 @@ private SysUserVo loadUserByEmail(String tenantId, String email) { SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>() .select(SysUser::getPhonenumber, SysUser::getStatus) .select(SysUser::getEmail, SysUser::getStatus) .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId) .eq(SysUser::getEmail, email)); if (ObjectUtil.isNull(user)) { @@ -414,25 +414,24 @@ String errorKey = GlobalConstants.PWD_ERR_CNT_KEY + username; String loginFail = Constants.LOGIN_FAIL; // è·åç¨æ·ç»å½é误次æ°(å¯èªå®ä¹éå¶çç¥ ä¾å¦: key + username + ip) Integer errorNumber = RedisUtils.getCacheObject(errorKey); // è·åç¨æ·ç»å½é误次æ°ï¼é»è®¤ä¸º0 (å¯èªå®ä¹éå¶çç¥ ä¾å¦: key + username + ip) int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0); // é宿¶é´å ç»å½ åè¸¢åº if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(maxRetryCount)) { if (errorNumber >= maxRetryCount) { recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); } if (supplier.get()) { // æ¯å¦ç¬¬ä¸æ¬¡ errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1; // é误次æ°éå¢ errorNumber++; RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime)); // è¾¾å°è§å®éè¯¯æ¬¡æ° åéå®ç»å½ if (errorNumber.equals(maxRetryCount)) { RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime)); if (errorNumber >= maxRetryCount) { recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); } else { // æªè¾¾å°è§å®éè¯¯æ¬¡æ° åéå¢ RedisUtils.setCacheObject(errorKey, errorNumber); // æªè¾¾å°è§å®éè¯¯æ¬¡æ° recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber)); throw new UserException(loginType.getRetryLimitCount(), errorNumber); } ruoyi-admin/src/main/resources/application-dev.yml
@@ -158,162 +158,29 @@ # Socketè¿æ¥è¶ æ¶å¼ï¼å使¯«ç§ï¼ç¼ºçå¼ä¸è¶ æ¶ connectionTimeout: 0 --- # sms çä¿¡ --- # sms çä¿¡ æ¯æ é¿éäº è ¾è®¯äº äºç ççåå¼åæ ·ççä¿¡æå¡å # https://wind.kim/doc/start ææ¡£å°å å个ååå¯åæ¶ä½¿ç¨ sms: enabled: false # é¿éäº dysmsapi.aliyuncs.com # è ¾è®¯äº sms.tencentcloudapi.com endpoint: "dysmsapi.aliyuncs.com" accessKeyId: xxxxxxx accessKeySecret: xxxxxx signName: æµè¯ # è ¾è®¯ä¸ç¨ sdkAppId: justauth: enabled: true type: QQ: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/qq/callback union-id: false WEIBO: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/weibo/callback gitee: client-id: 38eaaa1b77b5e064313057a2f5745ce3a9f3e7686d9bd302c7df2f308ef6db81 client-secret: 2e633af8780cb9fe002c4c7291b722db944402e271efb99b062811f52d7da1ff redirect-uri: http://localhost:8888/social-login?source=gitee DINGTALK: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/dingtalk/callback BAIDU: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/baidu/callback CSDN: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/csdn/callback CODING: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/coding/callback coding-group-name: xx OSCHINA: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/oschina/callback ALIPAY: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/alipay/callback alipay-public-key: MIIB**************DAQAB WECHAT_OPEN: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/wechat_open/callback WECHAT_MP: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/wechat_mp/callback WECHAT_ENTERPRISE: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/wechat_enterprise/callback agent-id: 1000002 TAOBAO: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/taobao/callback GOOGLE: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/google/callback FACEBOOK: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/facebook/callback DOUYIN: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/douyin/callback LINKEDIN: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/linkedin/callback MICROSOFT: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/microsoft/callback MI: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/mi/callback TOUTIAO: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/toutiao/callback TEAMBITION: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/teambition/callback RENREN: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/renren/callback PINTEREST: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/pinterest/callback STACK_OVERFLOW: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/stack_overflow/callback stack-overflow-key: asd*********asd HUAWEI: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/huawei/callback KUJIALE: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/kujiale/callback GITLAB: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/gitlab/callback MEITUAN: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/meituan/callback ELEME: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/eleme/callback TWITTER: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/twitter/callback XMLY: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/xmly/callback # 设å¤å¯ä¸æ è¯ID device-id: xxxxxxxxxxxxxx # 客æ·ç«¯æä½ç³»ç»ç±»åï¼1-iOSç³»ç»ï¼2-Androidç³»ç»ï¼3-Web client-os-type: 3 # 客æ·ç«¯å åï¼å¦æ clientOsType 为1æ2æ¶å¿ å¡«ã对Android客æ·ç«¯æ¯å åï¼å¯¹IOS客æ·ç«¯æ¯Bundle ID #pack-id: xxxx FEISHU: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/feishu/callback JD: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: http://oauth.xkcoding.com/demo/oauth/jd/callback 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 ruoyi-admin/src/main/resources/application-prod.yml
@@ -161,14 +161,29 @@ # Socketè¿æ¥è¶ æ¶å¼ï¼å使¯«ç§ï¼ç¼ºçå¼ä¸è¶ æ¶ connectionTimeout: 0 --- # sms çä¿¡ --- # sms çä¿¡ æ¯æ é¿éäº è ¾è®¯äº äºç ççåå¼åæ ·ççä¿¡æå¡å # https://wind.kim/doc/start ææ¡£å°å å个ååå¯åæ¶ä½¿ç¨ sms: enabled: false # é¿éäº dysmsapi.aliyuncs.com # è ¾è®¯äº sms.tencentcloudapi.com endpoint: "dysmsapi.aliyuncs.com" accessKeyId: xxxxxxx accessKeySecret: xxxxxx signName: æµè¯ # è ¾è®¯ä¸ç¨ sdkAppId: 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 ruoyi-admin/src/main/resources/application.yml
@@ -96,20 +96,14 @@ sa-token: # tokenåç§° (忶乿¯cookieåç§°) token-name: Authorization # tokenæææ 设为ä¸å¤© (å¿ å®è¿æ) åä½: ç§ timeout: 86400 # tokenä¸´æ¶æææ (æå®æ¶é´æ æä½å°±è¿æ) åä½: ç§ # tokenåºå®è¶ æ¶ è®¾ä¸ºä¸å¤© (å¿ å®è¿æ) åä½: ç§ timeout: 604800 # tokenæ´»è·è¶ æ¶æ¶é´ 30åé(æå®æ¶é´æ æä½åè¿æ) åä½: ç§ activity-timeout: 1800 # æ¯å¦å 许åä¸è´¦å·å¹¶åç»å½ (为trueæ¶å 许ä¸èµ·ç»å½, 为falseæ¶æ°ç»å½æ¤ææ§ç»å½) is-concurrent: true # å¨å¤äººç»å½åä¸è´¦å·æ¶ï¼æ¯å¦å ±ç¨ä¸ä¸ªtoken (为trueæ¶ææç»å½å ±ç¨ä¸ä¸ªtoken, 为falseæ¶æ¯æ¬¡ç»å½æ°å»ºä¸ä¸ªtoken) is-share: false # æ¯å¦å°è¯ä»headeré读åtoken is-read-header: true # æ¯å¦å°è¯ä»cookieé读åtoken is-read-cookie: false # tokenåç¼ token-prefix: "Bearer" # jwtç§é¥ jwt-secret-key: abcdefghijklmnopqrstuvwxyz @@ -156,39 +150,12 @@ mapperLocations: classpath*:mapper/**/*Mapper.xml # å®ä½æ«æï¼å¤ä¸ªpackageç¨éå·æè åå·åé typeAliasesPackage: org.dromara.**.domain # å¯å¨æ¶æ¯å¦æ£æ¥ MyBatis XML æä»¶çåå¨ï¼é»è®¤ä¸æ£æ¥ checkConfigLocation: false configuration: # èªå¨é©¼å³°å½åè§åï¼camel caseï¼æ å° mapUnderscoreToCamelCase: true # MyBatis èªå¨æ å°çç¥ # NONEï¼ä¸å¯ç¨ PARTIALï¼åªå¯¹éåµå¥ resultMap èªå¨æ å° FULLï¼å¯¹ææ resultMap èªå¨æ å° autoMappingBehavior: FULL # MyBatis èªå¨æ å°æ¶æªç¥åææªç¥å±æ§å¤çç # NONEï¼ä¸åå¤ç WARNINGï¼æå°ç¸å ³è¦å FAILINGï¼æåºå¼å¸¸å详ç»ä¿¡æ¯ autoMappingUnknownColumnBehavior: NONE # æ´è¯¦ç»çæ¥å¿è¾åº 伿æ§è½æè org.apache.ibatis.logging.stdout.StdOutImpl # å ³éæ¥å¿è®°å½ (å¯åçº¯ä½¿ç¨ p6spy åæ) org.apache.ibatis.logging.nologging.NoLoggingImpl # é»è®¤æ¥å¿è¾åº org.apache.ibatis.logging.slf4j.Slf4jImpl logImpl: org.apache.ibatis.logging.nologging.NoLoggingImpl global-config: # æ¯å¦æå° Logo banner banner: true dbConfig: # 主é®ç±»å # AUTO èªå¢ NONE 空 INPUT ç¨æ·è¾å ¥ ASSIGN_ID éªè± ASSIGN_UUID å¯ä¸ UUID # å¦éæ¹ä¸ºèªå¢ éè¦å°æ°æ®åºè¡¨å ¨é¨è®¾ç½®ä¸ºèªå¢ idType: ASSIGN_ID # é»è¾å·²å é¤å¼ logicDeleteValue: 2 # é»è¾æªå é¤å¼ logicNotDeleteValue: 0 # åæ®µéªè¯çç¥ä¹ insert,å¨ insert çæ¶åçåæ®µéªè¯çç¥ # IGNORED å¿½ç¥ NOT_NULL éNULL NOT_EMPTY é空 DEFAULT é»è®¤ NEVER ä¸å å ¥ SQL insertStrategy: NOT_NULL # åæ®µéªè¯çç¥ä¹ update,å¨ update çæ¶åçåæ®µéªè¯çç¥ updateStrategy: NOT_NULL # åæ®µéªè¯çç¥ä¹ select,å¨ select çæ¶åçåæ®µéªè¯çç¥æ¢ wrapper æ ¹æ®å é¨ entity çæç where æ¡ä»¶ where-strategy: NOT_NULL # æ°æ®å å¯ mybatis-encryptor: @@ -204,8 +171,13 @@ publicKey: privateKey: # Swaggeré ç½® swagger: springdoc: api-docs: # æ¯å¦å¼å¯æ¥å£ææ¡£ enabled: true swagger-ui: # æä¹ åè®¤è¯æ°æ® persistAuthorization: true info: # æ é¢ title: 'æ é¢ï¼${ruoyi.name}å¤ç§æ·ç®¡çç³»ç»_æ¥å£ææ¡£' @@ -225,14 +197,6 @@ type: APIKEY in: HEADER name: ${sa-token.token-name} springdoc: api-docs: # æ¯å¦å¼å¯æ¥å£ææ¡£ enabled: true swagger-ui: # æä¹ åè®¤è¯æ°æ® persistAuthorization: true #è¿éå®ä¹äºä¸¤ä¸ªåç»ï¼å¯å®ä¹å¤ä¸ªï¼ä¹å¯ä»¥ä¸å®ä¹ group-configs: - group: 1.æ¼ç¤ºæ¨¡å ruoyi-common/ruoyi-common-core/pom.xml
@@ -34,6 +34,11 @@ <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <!--常ç¨å·¥å ·ç±» --> <dependency> <groupId>org.apache.commons</groupId> ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/AsyncConfig.java
@@ -2,16 +2,14 @@ import cn.hutool.core.util.ArrayUtil; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.SpringUtils; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import java.util.Arrays; import java.util.concurrent.Executor; import java.util.concurrent.ScheduledExecutorService; /** * 弿¥é ç½® @@ -22,16 +20,12 @@ @AutoConfiguration public class AsyncConfig implements AsyncConfigurer { @Autowired @Qualifier("scheduledExecutorService") private ScheduledExecutorService scheduledExecutorService; /** * èªå®ä¹ @Async 注解使ç¨ç³»ç»çº¿ç¨æ± */ @Override public Executor getAsyncExecutor() { return scheduledExecutorService; return SpringUtils.getBean("scheduledExecutorService"); } /** ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java
@@ -22,18 +22,19 @@ */ @Bean public Validator validator(MessageSource messageSource) { LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean(); // å½é å factoryBean.setValidationMessageSource(messageSource); // è®¾ç½®ä½¿ç¨ HibernateValidator æ ¡éªå¨ factoryBean.setProviderClass(HibernateValidator.class); Properties properties = new Properties(); // 设置 å¿«éå¼å¸¸è¿å properties.setProperty("hibernate.validator.fail_fast", "true"); factoryBean.setValidationProperties(properties); // å è½½é ç½® factoryBean.afterPropertiesSet(); return factoryBean.getValidator(); try (LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean()) { // å½é å factoryBean.setValidationMessageSource(messageSource); // è®¾ç½®ä½¿ç¨ HibernateValidator æ ¡éªå¨ factoryBean.setProviderClass(HibernateValidator.class); Properties properties = new Properties(); // 设置 å¿«éå¼å¸¸è¿å properties.setProperty("hibernate.validator.fail_fast", "true"); factoryBean.setValidationProperties(properties); // å è½½é ç½® factoryBean.afterPropertiesSet(); return factoryBean.getValidator(); } } } ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,31 @@ package org.dromara.common.core.factory; import org.dromara.common.core.utils.StringUtils; import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import org.springframework.core.env.PropertiesPropertySource; import org.springframework.core.env.PropertySource; import org.springframework.core.io.support.DefaultPropertySourceFactory; import org.springframework.core.io.support.EncodedResource; import java.io.IOException; /** * yml é ç½®æºå·¥å * * @author Lion Li */ public class YmlPropertySourceFactory extends DefaultPropertySourceFactory { @Override public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException { String sourceName = resource.getResource().getFilename(); if (StringUtils.isNotBlank(sourceName) && StringUtils.endsWithAny(sourceName, ".yml", ".yaml")) { YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); factory.setResources(resource.getResource()); factory.afterPropertiesSet(); return new PropertiesPropertySource(sourceName, factory.getObject()); } return super.createPropertySource(name, resource); } } ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java
@@ -3,6 +3,7 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.springframework.context.MessageSource; import org.springframework.context.NoSuchMessageException; import org.springframework.context.i18n.LocaleContextHolder; /** @@ -23,6 +24,10 @@ * @return è·åå½é åç¿»è¯å¼ */ public static String message(String code, Object... args) { return MESSAGE_SOURCE.getMessage(code, args, LocaleContextHolder.getLocale()); try { return MESSAGE_SOURCE.getMessage(code, args, LocaleContextHolder.getLocale()); } catch (NoSuchMessageException e) { return code; } } } ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java
@@ -10,6 +10,7 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.springframework.http.MediaType; import org.springframework.util.LinkedCaseInsensitiveMap; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -19,6 +20,7 @@ import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; @@ -101,14 +103,22 @@ * è·årequest */ public static HttpServletRequest getRequest() { return getRequestAttributes().getRequest(); try { return getRequestAttributes().getRequest(); } catch (Exception e) { return null; } } /** * è·åresponse */ public static HttpServletResponse getResponse() { return getRequestAttributes().getResponse(); try { return getRequestAttributes().getResponse(); } catch (Exception e) { return null; } } /** @@ -119,8 +129,33 @@ } public static ServletRequestAttributes getRequestAttributes() { RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); return (ServletRequestAttributes) attributes; try { RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); return (ServletRequestAttributes) attributes; } catch (Exception e) { return null; } } public static String getHeader(HttpServletRequest request, String name) { String value = request.getHeader(name); if (StringUtils.isEmpty(value)) { return StringUtils.EMPTY; } return urlDecode(value); } public static Map<String, String> getHeaders(HttpServletRequest request) { Map<String, String> map = new LinkedCaseInsensitiveMap<>(); Enumeration<String> enumeration = request.getHeaderNames(); if (enumeration != null) { while (enumeration.hasMoreElements()) { String key = enumeration.nextElement(); String value = request.getHeader(key); map.put(key, value); } } return map; } /** ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java
ÎļþÃû´Ó ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SwaggerConfig.java ÐÞ¸Ä @@ -1,13 +1,13 @@ package org.dromara.common.doc.config; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.doc.config.properties.SwaggerProperties; import org.dromara.common.doc.handler.OpenApiHandler; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Paths; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.security.SecurityRequirement; import lombok.RequiredArgsConstructor; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.doc.config.properties.SpringDocProperties; import org.dromara.common.doc.handler.OpenApiHandler; import org.springdoc.core.configuration.SpringDocConfiguration; import org.springdoc.core.customizers.OpenApiBuilderCustomizer; import org.springdoc.core.customizers.OpenApiCustomizer; @@ -36,18 +36,18 @@ */ @RequiredArgsConstructor @AutoConfiguration(before = SpringDocConfiguration.class) @EnableConfigurationProperties(SwaggerProperties.class) @EnableConfigurationProperties(SpringDocProperties.class) @ConditionalOnProperty(name = "springdoc.api-docs.enabled", havingValue = "true", matchIfMissing = true) public class SwaggerConfig { public class SpringDocConfig { private final ServerProperties serverProperties; @Bean @ConditionalOnMissingBean(OpenAPI.class) public OpenAPI openApi(SwaggerProperties swaggerProperties) { public OpenAPI openApi(SpringDocProperties swaggerProperties) { OpenAPI openApi = new OpenAPI(); // ææ¡£åºæ¬ä¿¡æ¯ SwaggerProperties.InfoProperties infoProperties = swaggerProperties.getInfo(); SpringDocProperties.InfoProperties infoProperties = swaggerProperties.getInfo(); Info info = convertInfo(infoProperties); openApi.info(info); // æ©å±ææ¡£ä¿¡æ¯ @@ -65,7 +65,7 @@ return openApi; } private Info convertInfo(SwaggerProperties.InfoProperties infoProperties) { private Info convertInfo(SpringDocProperties.InfoProperties infoProperties) { Info info = new Info(); info.setTitle(infoProperties.getTitle()); info.setDescription(infoProperties.getDescription()); ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java
ÎļþÃû´Ó ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SwaggerProperties.java ÐÞ¸Ä @@ -18,8 +18,8 @@ * @author Lion Li */ @Data @ConfigurationProperties(prefix = "swagger") public class SwaggerProperties { @ConfigurationProperties(prefix = "springdoc") public class SpringDocProperties { /** * ææ¡£åºæ¬ä¿¡æ¯ ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1 +1 @@ org.dromara.common.doc.config.SwaggerConfig org.dromara.common.doc.config.SpringDocConfig ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java
@@ -7,11 +7,13 @@ import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.dromara.common.core.factory.YmlPropertySourceFactory; import org.dromara.common.mybatis.handler.InjectionMetaObjectHandler; import org.dromara.common.mybatis.interceptor.PlusDataPermissionInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.PropertySource; import org.springframework.transaction.annotation.EnableTransactionManagement; /** @@ -22,6 +24,7 @@ @EnableTransactionManagement(proxyTargetClass = true) @AutoConfiguration @MapperScan("${mybatis-plus.mapperPackage}") @PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class) public class MybatisPlusConfig { @Bean ruoyi-common/ruoyi-common-mybatis/src/main/resources/common-mybatis.yml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,33 @@ # å ç½®é ç½® ä¸å è®¸ä¿®æ¹ å¦éä¿®æ¹è¯·å¨ nacos ä¸åç¸åé ç½®è¦ç # MyBatisPlusé ç½® # https://baomidou.com/config/ mybatis-plus: # å¯å¨æ¶æ¯å¦æ£æ¥ MyBatis XML æä»¶çåå¨ï¼é»è®¤ä¸æ£æ¥ checkConfigLocation: false configuration: # èªå¨é©¼å³°å½åè§åï¼camel caseï¼æ å° mapUnderscoreToCamelCase: true # MyBatis èªå¨æ å°çç¥ # NONEï¼ä¸å¯ç¨ PARTIALï¼åªå¯¹éåµå¥ resultMap èªå¨æ å° FULLï¼å¯¹ææ resultMap èªå¨æ å° autoMappingBehavior: FULL # MyBatis èªå¨æ å°æ¶æªç¥åææªç¥å±æ§å¤çç # NONEï¼ä¸åå¤ç WARNINGï¼æå°ç¸å ³è¦å FAILINGï¼æåºå¼å¸¸å详ç»ä¿¡æ¯ autoMappingUnknownColumnBehavior: NONE # æ´è¯¦ç»çæ¥å¿è¾åº 伿æ§è½æè org.apache.ibatis.logging.stdout.StdOutImpl # å ³éæ¥å¿è®°å½ (å¯åçº¯ä½¿ç¨ p6spy åæ) org.apache.ibatis.logging.nologging.NoLoggingImpl # é»è®¤æ¥å¿è¾åº org.apache.ibatis.logging.slf4j.Slf4jImpl logImpl: org.apache.ibatis.logging.nologging.NoLoggingImpl global-config: # æ¯å¦æå° Logo banner banner: true dbConfig: # 主é®ç±»å # AUTO èªå¢ NONE 空 INPUT ç¨æ·è¾å ¥ ASSIGN_ID éªè± ASSIGN_UUID å¯ä¸ UUID idType: ASSIGN_ID # é»è¾å·²å é¤å¼(æ¡æ¶è¡¨åä½¿ç¨æ¤å¼ ç¦æ¢éæä¿®æ¹) logicDeleteValue: 2 # é»è¾æªå é¤å¼ logicNotDeleteValue: 0 insertStrategy: NOT_NULL updateStrategy: NOT_NULL whereStrategy: NOT_NULL ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/config/SaTokenConfig.java
@@ -4,10 +4,12 @@ import cn.dev33.satoken.jwt.StpLogicJwtForSimple; import cn.dev33.satoken.stp.StpInterface; import cn.dev33.satoken.stp.StpLogic; import org.dromara.common.core.factory.YmlPropertySourceFactory; import org.dromara.common.satoken.core.dao.PlusSaTokenDao; import org.dromara.common.satoken.core.service.SaPermissionImpl; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.PropertySource; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** @@ -16,6 +18,7 @@ * @author Lion Li */ @AutoConfiguration @PropertySource(value = "classpath:common-satoken.yml", factory = YmlPropertySourceFactory.class) public class SaTokenConfig implements WebMvcConfigurer { @Bean ruoyi-common/ruoyi-common-satoken/src/main/resources/common-satoken.yml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,11 @@ # å ç½®é ç½® ä¸å è®¸ä¿®æ¹ å¦éä¿®æ¹è¯·å¨ nacos ä¸åç¸åé ç½®è¦ç # Sa-Tokené ç½® sa-token: # å è®¸ä» è¯·æ±åæ° è¯»å token is-read-body: true # å è®¸ä» header 读å token is-read-header: true # å ³é cookie é´æ 仿 ¹æºæç» csrf æ¼æ´é£é© is-read-cookie: false # tokenåç¼ token-prefix: "Bearer" ruoyi-common/ruoyi-common-sms/pom.xml
@@ -16,22 +16,19 @@ </description> <dependencies> <dependency> <groupId>org.dromara</groupId> <artifactId>ruoyi-common-json</artifactId> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>dysmsapi20170525</artifactId> <optional>true</optional> <groupId>org.dromara.sms4j</groupId> <artifactId>sms4j-spring-boot-starter</artifactId> <exclusions> <!-- æé¤äº¬ä¸çä¿¡å åå¨çfastjsonçå¾ ä½è åç»ä¿®å¤ --> <exclusion> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.tencentcloudapi</groupId> <artifactId>tencentcloud-sdk-java-sms</artifactId> <optional>true</optional> </dependency> </dependencies> </project> ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsConfig.java
@@ -1,15 +1,6 @@ package org.dromara.common.sms.config; import org.dromara.common.sms.config.properties.SmsProperties; import org.dromara.common.sms.core.AliyunSmsTemplate; import org.dromara.common.sms.core.SmsTemplate; import org.dromara.common.sms.core.TencentSmsTemplate; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * çä¿¡é 置类 @@ -18,31 +9,7 @@ * @version 4.2.0 */ @AutoConfiguration @EnableConfigurationProperties(SmsProperties.class) //@EnableConfigurationProperties(SmsProperties.class) public class SmsConfig { @Configuration @ConditionalOnProperty(value = "sms.enabled", havingValue = "true") @ConditionalOnClass(com.aliyun.dysmsapi20170525.Client.class) static class AliyunSmsConfig { @Bean public SmsTemplate aliyunSmsTemplate(SmsProperties smsProperties) { return new AliyunSmsTemplate(smsProperties); } } @Configuration @ConditionalOnProperty(value = "sms.enabled", havingValue = "true") @ConditionalOnClass(com.tencentcloudapi.sms.v20190711.SmsClient.class) static class TencentSmsConfig { @Bean public SmsTemplate tencentSmsTemplate(SmsProperties smsProperties) { return new TencentSmsTemplate(smsProperties); } } } ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/properties/SmsProperties.java
@@ -1,45 +1,19 @@ package org.dromara.common.sms.config.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; /** * SMSçä¿¡ é ç½®å±æ§ * * @author Lion Li * @version 4.2.0 */ @Data @ConfigurationProperties(prefix = "sms") public class SmsProperties { private Boolean enabled; /** * é ç½®èç¹ * é¿éäº dysmsapi.aliyuncs.com * è ¾è®¯äº sms.tencentcloudapi.com */ private String endpoint; /** * key */ private String accessKeyId; /** * å¯å */ private String accessKeySecret; /* * çä¿¡ç¾å */ private String signName; /** * çä¿¡åºç¨ID (è ¾è®¯ä¸å±) */ private String sdkAppId; } //package org.dromara.common.sms.config.properties; // //import lombok.Data; //import org.springframework.boot.context.properties.ConfigurationProperties; // ///** // * SMSçä¿¡ é ç½®å±æ§ // * // * @author Lion Li // * @version 4.2.0 // */ //@Data //@ConfigurationProperties(prefix = "sms") //public class SmsProperties { // // private Boolean enabled; // // //} ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/AliyunSmsTemplate.java
ÎļþÒÑɾ³ý ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/SmsTemplate.java
ÎļþÒÑɾ³ý ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/TencentSmsTemplate.java
ÎļþÒÑɾ³ý ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/entity/SmsResult.java
ÎļþÒÑɾ³ý ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/exception/SmsException.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/pom.xml
@@ -97,16 +97,6 @@ <groupId>org.dromara</groupId> <artifactId>ruoyi-common-websocket</artifactId> </dependency> <!-- çä¿¡ ç¨åªä¸ªå¯¼å ¥åªä¸ªä¾èµ --> <!-- <dependency>--> <!-- <groupId>com.aliyun</groupId>--> <!-- <artifactId>dysmsapi20170525</artifactId>--> <!-- </dependency>--> <!-- <dependency>--> <!-- <groupId>com.tencentcloudapi</groupId>--> <!-- <artifactId>tencentcloud-sdk-java-sms</artifactId>--> <!-- </dependency>--> </dependencies> ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java
@@ -1,17 +1,17 @@ package org.dromara.demo.controller; import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.sms.config.properties.SmsProperties; import org.dromara.common.sms.core.SmsTemplate; 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; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; import java.util.LinkedHashMap; /** * çä¿¡æ¼ç¤ºæ¡ä¾ @@ -26,10 +26,6 @@ @RequestMapping("/demo/sms") public class SmsController { private final SmsProperties smsProperties; // private final SmsTemplate smsTemplate; // å¯ä»¥ä½¿ç¨springæ³¨å ¥ // private final AliyunSmsTemplate smsTemplate; // ä¹å¯ä»¥æ³¨å ¥æä¸ªåå®¶çæ¨¡æ¿å·¥å · /** * åéçä¿¡Aliyun * @@ -38,17 +34,11 @@ */ @GetMapping("/sendAliyun") public R<Object> sendAliyun(String phones, String templateId) { if (!smsProperties.getEnabled()) { return R.fail("å½åç³»ç»æ²¡æå¼å¯çä¿¡åè½ï¼"); } if (!SpringUtils.containsBean("aliyunSmsTemplate")) { return R.fail("é¿éäºä¾èµæªå¼å ¥ï¼"); } SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class); Map<String, String> map = new HashMap<>(1); LinkedHashMap<String, String> map = new LinkedHashMap<>(1); map.put("code", "1234"); Object send = smsTemplate.send(phones, templateId, map); return R.ok(send); SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA); SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map); return R.ok(smsResponse); } /** @@ -59,18 +49,12 @@ */ @GetMapping("/sendTencent") public R<Object> sendTencent(String phones, String templateId) { if (!smsProperties.getEnabled()) { return R.fail("å½åç³»ç»æ²¡æå¼å¯çä¿¡åè½ï¼"); } if (!SpringUtils.containsBean("tencentSmsTemplate")) { return R.fail("è ¾è®¯äºä¾èµæªå¼å ¥ï¼"); } SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class); Map<String, String> map = new HashMap<>(1); LinkedHashMap<String, String> map = new LinkedHashMap<>(1); // map.put("2", "æµè¯æµè¯"); map.put("1", "1234"); Object send = smsTemplate.send(phones, templateId, map); return R.ok(send); SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.TENCENT); SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map); return R.ok(smsResponse); } } ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java
@@ -2,6 +2,7 @@ import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.generator.domain.GenTableColumn; @@ -22,6 +23,6 @@ * @return åä¿¡æ¯ */ @DS("#dataName") List<GenTableColumn> selectDbTableColumnsByName(String tableName, String dataName); List<GenTableColumn> selectDbTableColumnsByName(@Param("tableName") String tableName, String dataName); } ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java
@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckRole; import com.baomidou.lock.annotation.Lock4j; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; @@ -174,7 +175,8 @@ @SaCheckPermission("system:tenant:edit") @Log(title = "ç§æ·", businessType = BusinessType.UPDATE) @GetMapping("/syncTenantPackage") public R<Void> syncTenantPackage(@NotBlank(message = "ç§æ·IDä¸è½ä¸ºç©º") String tenantId, @NotBlank(message = "å¥é¤IDä¸è½ä¸ºç©º") Long packageId) { public R<Void> syncTenantPackage(@NotBlank(message = "ç§æ·IDä¸è½ä¸ºç©º") String tenantId, @NotNull(message = "å¥é¤IDä¸è½ä¸ºç©º") Long packageId) { return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId))); } ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
@@ -94,7 +94,7 @@ * @return ç¨æ·å¯¹è±¡ä¿¡æ¯ */ @InterceptorIgnore(tenantLine = "true") SysUserVo selectTenantUserByUserName(String userName, String tenantId); SysUserVo selectTenantUserByUserName(@Param("userName") String userName, @Param("tenantId") String tenantId); /** * éè¿ææºå·æ¥è¯¢ç¨æ·(ä¸èµ°ç§æ·æä»¶) @@ -104,7 +104,7 @@ * @return ç¨æ·å¯¹è±¡ä¿¡æ¯ */ @InterceptorIgnore(tenantLine = "true") SysUserVo selectTenantUserByPhonenumber(String phonenumber, String tenantId); SysUserVo selectTenantUserByPhonenumber(@Param("phonenumber") String phonenumber, @Param("tenantId") String tenantId); /** * éè¿é®ç®±æ¥è¯¢ç¨æ·(ä¸èµ°ç§æ·æä»¶) @@ -114,7 +114,8 @@ * @return ç¨æ·å¯¹è±¡ä¿¡æ¯ */ @InterceptorIgnore(tenantLine = "true") SysUserVo selectTenantUserByEmail(String email, String tenantId); SysUserVo selectTenantUserByEmail(@Param("email") String email, @Param("tenantId") String tenantId); /** * éè¿ç¨æ·IDæ¥è¯¢ç¨æ· ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java
@@ -22,7 +22,7 @@ @Override public boolean isSensitive() { if (TenantHelper.isEnable()) { return !LoginHelper.isSuperAdmin() || !LoginHelper.isTenantAdmin(); return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); } return !LoginHelper.isSuperAdmin(); }