diff --git a/README.md b/README.md index 8e5c5e23d..dc5cfbd40 100644 --- a/README.md +++ b/README.md @@ -7,19 +7,21 @@ ## 🐯 平台简介 -**芋道**,一套**全部开源**的**企业级**的快速开发平台,毫无保留给个人及企业免费使用。 +**芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。 > 有任何问题,或者想要的功能,可以在 _Issues_ 中提给艿艿。 +> +> 😜 给项目点点 Star 吧,这对我们真的很重要! * 前端采用 [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) ,正在支持 Vue 3 + ElementUI Plus 最新方案。 * 后端采用 Spring Boot、MySQL + MyBatis Plus、Redis + Redisson。 * 权限认证使用 Spring Security & Token & Redis,支持多终端、多种用户的认证系统。 * 支持加载动态权限菜单,按钮级别权限控制,本地缓存提升性能。 * 支持 SaaS 多租户系统,可自定义每个租户的权限,提供透明化的多租户底层封装。 -* 工作流使用 Activiti ,支持动态表单、在线设计流程、多种任务分配方式。 +* 工作流使用 Activiti + Flowable,支持动态表单、在线设计流程、多种任务分配方式。 * 高效率开发,使用代码生成器可以一键生成前后端代码 + 单元测试 + Swagger 接口文档 + Validator 参数校验。 * 集成微信小程序、微信公众号、企业微信、钉钉等三方登陆,集成支付宝、微信等支付与退款。 -* 集成阿里云、腾讯云、云片等短信渠道,集成阿里云、腾讯云、七牛云等云存储服务。 +* 集成阿里云、腾讯云、云片等短信渠道,集成 MinIO、阿里云、腾讯云、七牛云等云存储服务。 | 项目名 | 说明 | 传说门 | |--------------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------| diff --git a/yudao-module-infra/yudao-module-infra-impl/pom.xml b/yudao-module-infra/yudao-module-infra-impl/pom.xml index 19c9a1472..6c10ddd0b 100644 --- a/yudao-module-infra/yudao-module-infra-impl/pom.xml +++ b/yudao-module-infra/yudao-module-infra-impl/pom.xml @@ -19,11 +19,6 @@ - - cn.iocoder.boot - yudao-module-member-api - ${revision} - cn.iocoder.boot yudao-module-system-api diff --git a/yudao-module-system/yudao-module-system-impl/pom.xml b/yudao-module-system/yudao-module-system-impl/pom.xml index b297830b5..db2fce8b5 100644 --- a/yudao-module-system/yudao-module-system-impl/pom.xml +++ b/yudao-module-system/yudao-module-system-impl/pom.xml @@ -23,11 +23,6 @@ yudao-module-system-api ${revision} - - cn.iocoder.boot - yudao-module-member-api - ${revision} - cn.iocoder.boot yudao-module-infra-api diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/member/MemberService.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/member/MemberService.java new file mode 100644 index 000000000..d96352b15 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/member/MemberService.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.module.system.service.member; + +/** + * Member Service 接口 + * + * @author 芋道源码 + */ +public interface MemberService { + + /** + * 获得会员用户的手机号码 + * + * @param id 会员用户编号 + * @return 手机号码 + */ + String getMemberUserMobile(Long id); + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/member/MemberServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/member/MemberServiceImpl.java new file mode 100644 index 000000000..676a95a4e --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/member/MemberServiceImpl.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.system.service.member; + +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.extra.spring.SpringUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +/** + * Member Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class MemberServiceImpl implements MemberService { + + @Value("${yudao.info.base-package}") + private String basePackage; + + private volatile Object memberUserApi; + + @Override + public String getMemberUserMobile(Long id) { + if (id == null) { + return null; + } + Object user = ReflectUtil.invoke(getMemberUserApi(), "getUser", id); + if (user == null) { + return null; + } + return ReflectUtil.invoke(user, "getMobile"); + } + + private Object getMemberUserApi() { + if (memberUserApi == null) { + memberUserApi = SpringUtil.getBean(ClassUtil.loadClass(String.format("%s.module.member.api.user.MemberUserApi", basePackage))); + } + return memberUserApi; + } + +} diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/member/package-info.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/member/package-info.java new file mode 100644 index 000000000..ce080b410 --- /dev/null +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/member/package-info.java @@ -0,0 +1,4 @@ +/** + * yudao-module-member 模块的适配,解除 yudao-module-system 对它们的依赖 + */ +package cn.iocoder.yudao.module.system.service.member; diff --git a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java index 538e0f925..608985454 100644 --- a/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java +++ b/yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.system.service.sms; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -10,16 +11,14 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO; import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO; -import cn.iocoder.yudao.module.member.api.user.MemberUserApi; -import cn.iocoder.yudao.module.member.api.user.dto.UserRespDTO; import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage; import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; +import cn.iocoder.yudao.module.system.service.member.MemberService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import com.google.common.annotations.VisibleForTesting; import org.springframework.stereotype.Service; -import org.springframework.util.Assert; import javax.annotation.Resource; import java.util.List; @@ -40,7 +39,7 @@ public class SmsSendServiceImpl implements SmsSendService { @Resource private AdminUserService adminUserService; @Resource - private MemberUserApi memberUserApi; + private MemberService memberService; @Resource private SmsTemplateService smsTemplateService; @@ -70,10 +69,7 @@ public class SmsSendServiceImpl implements SmsSendService { public Long sendSingleSmsToMember(String mobile, Long userId, String templateCode, Map templateParams) { // 如果 mobile 为空,则加载用户编号对应的手机号 if (StrUtil.isEmpty(mobile)) { - UserRespDTO user = memberUserApi.getUser(userId); - if (user != null) { - mobile = user.getMobile(); - } + mobile = memberService.getMemberUserMobile(userId); } // 执行发送 return this.sendSingleSms(mobile, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams); @@ -146,7 +142,7 @@ public class SmsSendServiceImpl implements SmsSendService { public void doSendSms(SmsSendMessage message) { // 获得渠道对应的 SmsClient 客户端 SmsClient smsClient = smsClientFactory.getSmsClient(message.getChannelId()); - Assert.notNull(smsClient, String.format("短信客户端(%d) 不存在", message.getChannelId())); + Assert.notNull(smsClient, "短信客户端({}) 不存在", message.getChannelId()); // 发送短信 SmsCommonResult sendResult = smsClient.sendSms(message.getLogId(), message.getMobile(), message.getApiTemplateId(), message.getTemplateParams()); @@ -159,7 +155,7 @@ public class SmsSendServiceImpl implements SmsSendService { public void receiveSmsStatus(String channelCode, String text) throws Throwable { // 获得渠道对应的 SmsClient 客户端 SmsClient smsClient = smsClientFactory.getSmsClient(channelCode); - Assert.notNull(smsClient, String.format("短信客户端(%s) 不存在", channelCode)); + Assert.notNull(smsClient, "短信客户端({}) 不存在", channelCode); // 解析内容 List receiveResults = smsClient.parseSmsReceiveStatus(text); if (CollUtil.isEmpty(receiveResults)) {