Răsfoiți Sursa

Merge remote-tracking branch 'origin/master'

YunaiV 2 ani în urmă
părinte
comite
f38c783152

+ 5 - 3
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、阿里云、腾讯云、七牛云等云存储服务。
 
 | 项目名                | 说明                     | 传说门                                                                                                                                 |
 |--------------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------|

+ 0 - 5
yudao-module-infra/yudao-module-infra-impl/pom.xml

@@ -19,11 +19,6 @@
     </description>
 
     <dependencies>
-        <dependency>
-            <groupId>cn.iocoder.boot</groupId>
-            <artifactId>yudao-module-member-api</artifactId>
-            <version>${revision}</version>
-        </dependency>
         <dependency>
             <groupId>cn.iocoder.boot</groupId>
             <artifactId>yudao-module-system-api</artifactId>

+ 0 - 5
yudao-module-system/yudao-module-system-impl/pom.xml

@@ -23,11 +23,6 @@
             <artifactId>yudao-module-system-api</artifactId>
             <version>${revision}</version>
         </dependency>
-        <dependency>
-            <groupId>cn.iocoder.boot</groupId>
-            <artifactId>yudao-module-member-api</artifactId>
-            <version>${revision}</version>
-        </dependency>
         <dependency>
             <groupId>cn.iocoder.boot</groupId>
             <artifactId>yudao-module-infra-api</artifactId>

+ 18 - 0
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);
+
+}

+ 41 - 0
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;
+    }
+
+}

+ 4 - 0
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;

+ 6 - 10
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<String, Object> 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<SmsSendRespDTO> 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<SmsReceiveRespDTO> receiveResults = smsClient.parseSmsReceiveStatus(text);
         if (CollUtil.isEmpty(receiveResults)) {