diff --git a/kernel-d-auth/auth-api/src/main/java/cn/stylefeng/roses/kernel/auth/api/loginuser/CommonLoginUserUtil.java b/kernel-d-auth/auth-api/src/main/java/cn/stylefeng/roses/kernel/auth/api/loginuser/CommonLoginUserUtil.java index 805571e79..0eb5ffe2c 100644 --- a/kernel-d-auth/auth-api/src/main/java/cn/stylefeng/roses/kernel/auth/api/loginuser/CommonLoginUserUtil.java +++ b/kernel-d-auth/auth-api/src/main/java/cn/stylefeng/roses/kernel/auth/api/loginuser/CommonLoginUserUtil.java @@ -6,7 +6,6 @@ import cn.stylefeng.roses.kernel.auth.api.exception.enums.AuthExceptionEnum; import cn.stylefeng.roses.kernel.auth.api.expander.AuthConfigExpander; import cn.stylefeng.roses.kernel.rule.util.HttpServletUtil; -import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; /** @@ -42,20 +41,6 @@ public class CommonLoginUserUtil { return authToken; } - // 3. 从cookie中获取token - String sessionCookieName = AuthConfigExpander.getSessionCookieName(); - Cookie[] cookies = request.getCookies(); - if (cookies != null && cookies.length > 0) { - for (Cookie cookie : cookies) { - - // 如果cookie有对应的值,并且不为空 - if (sessionCookieName.equals(cookie.getName()) - && StrUtil.isNotBlank(cookie.getValue())) { - return cookie.getValue(); - } - } - } - // 获取不到token,直接告诉用户 throw new AuthException(AuthExceptionEnum.TOKEN_GET_ERROR); } diff --git a/kernel-d-event/README.md b/kernel-d-event/README.md new file mode 100644 index 000000000..608b94e34 --- /dev/null +++ b/kernel-d-event/README.md @@ -0,0 +1 @@ +# 业务事件 \ No newline at end of file diff --git a/kernel-d-event/event-api/README.md b/kernel-d-event/event-api/README.md new file mode 100644 index 000000000..27e91dc89 --- /dev/null +++ b/kernel-d-event/event-api/README.md @@ -0,0 +1 @@ +# api模块,存放接口、常量、异常、枚举等模块规则相关类 \ No newline at end of file diff --git a/kernel-d-event/event-api/pom.xml b/kernel-d-event/event-api/pom.xml new file mode 100644 index 000000000..bf31650d5 --- /dev/null +++ b/kernel-d-event/event-api/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + + cn.stylefeng.roses + kernel-d-event + 8.0.0 + ../pom.xml + + + event-api + + jar + + + + + + cn.stylefeng.roses + config-api + ${roses.version} + + + + + + cn.stylefeng.roses + validator-api + ${roses.version} + + + + + diff --git a/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/annotation/BusinessListener.java b/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/annotation/BusinessListener.java new file mode 100644 index 000000000..15b7bf64e --- /dev/null +++ b/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/annotation/BusinessListener.java @@ -0,0 +1,45 @@ +/* + * Copyright [2020-2030] [https://www.stylefeng.cn] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Guns源码头部的版权声明。 + * 3.请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns + * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns + * 6.若您的项目无法满足以上几点,可申请商业授权 + */ +package cn.stylefeng.roses.kernel.event.api.annotation; + +import java.lang.annotation.*; + +/** + * 业务事件监听的注解 + * + * @author fengshuonan + * @since 2023/7/14 15:12 + */ +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface BusinessListener { + + /** + * 监听业务的编码或者标识 + */ + String businessCode() default ""; + +} diff --git a/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/constants/EventConstants.java b/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/constants/EventConstants.java new file mode 100644 index 000000000..f2408ec4b --- /dev/null +++ b/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/constants/EventConstants.java @@ -0,0 +1,45 @@ +/* + * Copyright [2020-2030] [https://www.stylefeng.cn] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Guns源码头部的版权声明。 + * 3.请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns + * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns + * 6.若您的项目无法满足以上几点,可申请商业授权 + */ +package cn.stylefeng.roses.kernel.event.api.constants; + +/** + * 业务事件业务 + * + * @author fengshuonan + * @date 2023-07-14 15:05:54 + */ +public interface EventConstants { + + /** + * 业务事件模块名称 + */ + String EVENT_MODULE_NAME = "kernel-s-event"; + + /** + * 异常枚举的步进值 + */ + String EVENT_EXCEPTION_STEP_CODE = "99"; + +} diff --git a/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/enums/DemoEnum.java b/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/enums/DemoEnum.java new file mode 100644 index 000000000..3d432eb1b --- /dev/null +++ b/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/enums/DemoEnum.java @@ -0,0 +1,33 @@ +package cn.stylefeng.roses.kernel.event.api.enums; + +import lombok.Getter; + +/** + * 一个示例 + * + * @author fengshuonan + * @date 2023-07-14 15:05:54 + */ +@Getter +public enum DemoEnum { + + /** + * markdown格式 + */ + MARKDOWN(1, "markdown格式"), + + /** + * 富文本格式 + */ + TEXT(2, "富文本格式"); + + private final Integer code; + + private final String message; + + DemoEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + +} diff --git a/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/exception/EventException.java b/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/exception/EventException.java new file mode 100644 index 000000000..4b49f013b --- /dev/null +++ b/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/exception/EventException.java @@ -0,0 +1,48 @@ +/* + * Copyright [2020-2030] [https://www.stylefeng.cn] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Guns源码头部的版权声明。 + * 3.请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns + * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns + * 6.若您的项目无法满足以上几点,可申请商业授权 + */ +package cn.stylefeng.roses.kernel.event.api.exception; + +import cn.hutool.core.util.StrUtil; +import cn.stylefeng.roses.kernel.event.api.constants.EventConstants; +import cn.stylefeng.roses.kernel.rule.exception.AbstractExceptionEnum; +import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException; + +/** + * 业务事件异常 + * + * @author fengshuonan + * @date 2023-07-14 15:05:54 + */ +public class EventException extends ServiceException { + + public EventException(AbstractExceptionEnum exception, Object... params) { + super(EventConstants.EVENT_MODULE_NAME, exception.getErrorCode(), StrUtil.format(exception.getUserTip(), params)); + } + + public EventException(AbstractExceptionEnum exception) { + super(EventConstants.EVENT_MODULE_NAME, exception); + } + +} diff --git a/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/exception/enums/EventExceptionEnum.java b/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/exception/enums/EventExceptionEnum.java new file mode 100644 index 000000000..d2bc6fe5a --- /dev/null +++ b/kernel-d-event/event-api/src/main/java/cn/stylefeng/roses/kernel/event/api/exception/enums/EventExceptionEnum.java @@ -0,0 +1,61 @@ +/* + * Copyright [2020-2030] [https://www.stylefeng.cn] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Guns源码头部的版权声明。 + * 3.请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns + * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns + * 6.若您的项目无法满足以上几点,可申请商业授权 + */ +package cn.stylefeng.roses.kernel.event.api.exception.enums; + +import cn.stylefeng.roses.kernel.event.api.constants.EventConstants; +import cn.stylefeng.roses.kernel.rule.constants.RuleConstants; +import cn.stylefeng.roses.kernel.rule.exception.AbstractExceptionEnum; +import lombok.Getter; + +/** + * 业务事件的异常枚举 + * + * @author fengshuonan + * @date 2023-07-14 15:05:54 + */ +@Getter +public enum EventExceptionEnum implements AbstractExceptionEnum { + + /** + * 查询不到对应业务事件 + */ + CANT_FIND_EVENT(RuleConstants.BUSINESS_ERROR_TYPE_CODE + EventConstants.EVENT_EXCEPTION_STEP_CODE + "01", "查询不到对应业务事件,具体信息:{}"); + + /** + * 错误编码 + */ + private final String errorCode; + + /** + * 提示用户信息 + */ + private final String userTip; + + EventExceptionEnum(String errorCode, String userTip) { + this.errorCode = errorCode; + this.userTip = userTip; + } + +} diff --git a/kernel-d-event/event-sdk/README.md b/kernel-d-event/event-sdk/README.md new file mode 100644 index 000000000..ebd748f4f --- /dev/null +++ b/kernel-d-event/event-sdk/README.md @@ -0,0 +1 @@ +# SDK模块,存放一些本模块通用的工具处理类等 \ No newline at end of file diff --git a/kernel-d-event/event-sdk/pom.xml b/kernel-d-event/event-sdk/pom.xml new file mode 100644 index 000000000..25c3c5576 --- /dev/null +++ b/kernel-d-event/event-sdk/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + + cn.stylefeng.roses + kernel-d-event + 8.0.0 + ../pom.xml + + + event-sdk + + jar + + + + + + cn.stylefeng.roses + event-api + ${roses.version} + + + + + diff --git a/kernel-d-event/event-sdk/src/main/java/cn/stylefeng/roses/kernel/event/sdk/EventAnnotationScanner.java b/kernel-d-event/event-sdk/src/main/java/cn/stylefeng/roses/kernel/event/sdk/EventAnnotationScanner.java new file mode 100644 index 000000000..1eb76e521 --- /dev/null +++ b/kernel-d-event/event-sdk/src/main/java/cn/stylefeng/roses/kernel/event/sdk/EventAnnotationScanner.java @@ -0,0 +1,128 @@ +/* + * Copyright [2020-2030] [https://www.stylefeng.cn] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Guns源码头部的版权声明。 + * 3.请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns + * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns + * 6.若您的项目无法满足以上几点,可申请商业授权 + */ +package cn.stylefeng.roses.kernel.event.sdk; + +import cn.hutool.core.util.ObjectUtil; +import cn.stylefeng.roses.kernel.event.api.annotation.BusinessListener; +import cn.stylefeng.roses.kernel.event.sdk.container.EventContainer; +import cn.stylefeng.roses.kernel.event.sdk.pojo.BusinessListenerDetail; +import cn.stylefeng.roses.kernel.rule.util.AopTargetUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +/** + * 扫描所有的业务监听事件,最终汇总到Event容器中 + * + * @author fengshuonan + * @since 2023/7/14 15:09 + */ +@Slf4j +public class EventAnnotationScanner implements BeanPostProcessor { + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + + // 如果controller是代理对象,则需要获取原始类的信息 + Object aopTarget = AopTargetUtils.getTarget(bean); + + if (aopTarget == null) { + aopTarget = bean; + } + + Class clazz = aopTarget.getClass(); + + // 判断类中是否有@BusinessListener注解 + this.doScan(clazz, beanName); + + return bean; + } + + /** + * 扫描整个类中包含的所有@BusinessListener注解 + * + * @author fengshuonan + * @since 2023/7/14 15:24 + */ + private void doScan(Class clazz, String beanName) { + Method[] declaredMethods = clazz.getDeclaredMethods(); + for (Method declaredMethod : declaredMethods) { + BusinessListener businessListener = declaredMethod.getAnnotation(BusinessListener.class); + + log.debug("扫描到业务事件监听: " + businessListener); + + if (businessListener != null) { + createEventDetail(beanName, declaredMethod, businessListener); + } + } + } + + /** + * 讲扫描到的注解信息的调用信息,封装到BusinessListenerDetail + * + * @author fengshuonan + * @since 2023/7/14 15:27 + */ + private void createEventDetail(String beanName, Method method, BusinessListener businessListener) { + + // 获取注解上的业务编码标识 + String businessCode = businessListener.businessCode(); + + // 从容器中获取本业务标识是否创建 + List listener = EventContainer.getListener(businessCode); + if (ObjectUtil.isEmpty(listener)) { + listener = new ArrayList<>(); + } + + + // 创建当前方法的调用信息 + BusinessListenerDetail businessListenerDetail = new BusinessListenerDetail(); + businessListenerDetail.setBeanName(beanName); + businessListenerDetail.setListenerMethod(method); + + // 获取方法参数信息 + int parameterCount = method.getParameterCount(); + if (parameterCount == 0) { + businessListenerDetail.setParameterClassType(null); + } else { + businessListenerDetail.setParameterClassType(method.getParameterTypes()[0]); + } + + listener.add(businessListenerDetail); + + // 放到事件容器中 + EventContainer.addListenerList(businessCode, listener); + } + +} diff --git a/kernel-d-event/event-sdk/src/main/java/cn/stylefeng/roses/kernel/event/sdk/container/EventContainer.java b/kernel-d-event/event-sdk/src/main/java/cn/stylefeng/roses/kernel/event/sdk/container/EventContainer.java new file mode 100644 index 000000000..50862057f --- /dev/null +++ b/kernel-d-event/event-sdk/src/main/java/cn/stylefeng/roses/kernel/event/sdk/container/EventContainer.java @@ -0,0 +1,44 @@ +package cn.stylefeng.roses.kernel.event.sdk.container; + +import cn.stylefeng.roses.kernel.event.sdk.pojo.BusinessListenerDetail; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 事件的容器 + * + * @author fengshuonan + * @since 2023/7/14 15:08 + */ +public class EventContainer { + + /** + * key是业务的标识,例如:ORG_ADD + *

+ * value是对应监听这个事件的所有方法信息 + */ + private static final Map> CONTEXT = new HashMap<>(); + + /** + * 获取业务对应的所有监听器 + * + * @author fengshuonan + * @since 2023/7/14 15:21 + */ + public static List getListener(String businessCode) { + return CONTEXT.get(businessCode); + } + + /** + * 添加到容器中业务监听器信息 + * + * @author fengshuonan + * @since 2023/7/14 15:22 + */ + public static void addListenerList(String businessCode, List businessListenerItemList) { + CONTEXT.put(businessCode, businessListenerItemList); + } + +} diff --git a/kernel-d-event/event-sdk/src/main/java/cn/stylefeng/roses/kernel/event/sdk/pojo/BusinessListenerDetail.java b/kernel-d-event/event-sdk/src/main/java/cn/stylefeng/roses/kernel/event/sdk/pojo/BusinessListenerDetail.java new file mode 100644 index 000000000..51cbabeb2 --- /dev/null +++ b/kernel-d-event/event-sdk/src/main/java/cn/stylefeng/roses/kernel/event/sdk/pojo/BusinessListenerDetail.java @@ -0,0 +1,33 @@ +package cn.stylefeng.roses.kernel.event.sdk.pojo; + +import lombok.Data; + +import java.lang.reflect.Method; + +/** + * 业务事件监听的详情封装 + * + * @author fengshuonan + * @since 2023/7/14 15:18 + */ +@Data +public class BusinessListenerDetail { + + /** + * Spring的Bean名称 + */ + private String beanName; + + /** + * 业务监听器对应注解的类方法 + */ + private Method listenerMethod; + + /** + * 方法参数的类型,如果方法有多个参数,这里只获取第一个参数的类型 + *

+ * 如果方法没参数,则这里为null + */ + private Class parameterClassType; + +} diff --git a/kernel-d-event/event-sdk/src/main/java/cn/stylefeng/roses/kernel/event/sdk/publish/BusinessEventPublisher.java b/kernel-d-event/event-sdk/src/main/java/cn/stylefeng/roses/kernel/event/sdk/publish/BusinessEventPublisher.java new file mode 100644 index 000000000..e4749a0b7 --- /dev/null +++ b/kernel-d-event/event-sdk/src/main/java/cn/stylefeng/roses/kernel/event/sdk/publish/BusinessEventPublisher.java @@ -0,0 +1,76 @@ +package cn.stylefeng.roses.kernel.event.sdk.publish; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import cn.stylefeng.roses.kernel.event.sdk.container.EventContainer; +import cn.stylefeng.roses.kernel.event.sdk.pojo.BusinessListenerDetail; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.List; + +/** + * 业务事件发布工具 + * + * @author fengshuonan + * @since 2023/7/14 16:21 + */ +public class BusinessEventPublisher { + + /** + * 发布一个业务事件 + *

+ * 如果有方法上加了@BusinessListener,则会自动回调那些方法 + * + * @author fengshuonan + * @since 2023/7/14 15:37 + */ + public static void publishEvent(String businessCode, T businessObject) { + + // 获取该业务是否有监听器 + List listener = EventContainer.getListener(businessCode); + + // 没有监听器则直接返回 + if (ObjectUtil.isEmpty(listener)) { + return; + } + + // 依次调用监听器方法,进行回调调用 + for (BusinessListenerDetail businessListenerDetail : listener) { + + // 监听器的Spring Bean + String beanName = businessListenerDetail.getBeanName(); + Object bean = SpringUtil.getBean(beanName); + + // 监听器的具体方法 + Method listenerMethod = businessListenerDetail.getListenerMethod(); + Class parameterClassType = businessListenerDetail.getParameterClassType(); + + // 如果发布事件的时候参数是空的,则直接调用无参的方法 + if (ObjectUtil.isEmpty(businessObject)) { + + // 如果方法的参数数量为0,则直接调用,如果不为0,则跳过执行下个 + if (parameterClassType == null) { + try { + listenerMethod.invoke(businessObject); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + } + + // 如果发布事件的时候,包含参数,则判断method的第一个参数是否和businessObject的class一样,不一样则不调用 + else { + if (parameterClassType != null && parameterClassType.equals(businessObject.getClass())) { + try { + listenerMethod.invoke(bean, businessObject); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + } + } + } + +} diff --git a/kernel-d-event/event-spring-boot-starter/README.md b/kernel-d-event/event-spring-boot-starter/README.md new file mode 100644 index 000000000..ab408c724 --- /dev/null +++ b/kernel-d-event/event-spring-boot-starter/README.md @@ -0,0 +1,2 @@ +# Spring Boot自动装配 + diff --git a/kernel-d-event/event-spring-boot-starter/pom.xml b/kernel-d-event/event-spring-boot-starter/pom.xml new file mode 100644 index 000000000..942c5d531 --- /dev/null +++ b/kernel-d-event/event-spring-boot-starter/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + + cn.stylefeng.roses + kernel-d-event + 8.0.0 + ../pom.xml + + + event-spring-boot-starter + + jar + + + + + + cn.stylefeng.roses + event-sdk + ${roses.version} + + + + + diff --git a/kernel-d-event/event-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/event/starter/EventAutoConfiguration.java b/kernel-d-event/event-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/event/starter/EventAutoConfiguration.java new file mode 100644 index 000000000..b3094bf70 --- /dev/null +++ b/kernel-d-event/event-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/event/starter/EventAutoConfiguration.java @@ -0,0 +1,51 @@ +/* + * Copyright [2020-2030] [https://www.stylefeng.cn] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Guns源码头部的版权声明。 + * 3.请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns + * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns + * 6.若您的项目无法满足以上几点,可申请商业授权 + */ +package cn.stylefeng.roses.kernel.event.starter; + +import cn.stylefeng.roses.kernel.event.sdk.EventAnnotationScanner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 业务事件自动装配 + * + * @author fengshuonan + * @date 2023-07-14 15:05:54 + */ +@Configuration +public class EventAutoConfiguration { + + /** + * 创建事件的扫描 + * + * @author fengshuonan + * @since 2023/7/14 16:00 + */ + @Bean + public EventAnnotationScanner eventAnnotationScanner() { + return new EventAnnotationScanner(); + } + +} diff --git a/kernel-d-event/event-spring-boot-starter/src/main/resources/META-INF/spring.factories b/kernel-d-event/event-spring-boot-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..8ad7fffea --- /dev/null +++ b/kernel-d-event/event-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + cn.stylefeng.roses.kernel.event.starter.EventAutoConfiguration diff --git a/kernel-d-event/pom.xml b/kernel-d-event/pom.xml new file mode 100644 index 000000000..d6bcf8d34 --- /dev/null +++ b/kernel-d-event/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + + cn.stylefeng.roses + roses-kernel + 8.0.0 + ../pom.xml + + + kernel-d-event + + pom + + + event-api + event-sdk + event-spring-boot-starter + + + + + + + cn.stylefeng.roses + kernel-a-rule + ${roses.version} + + + + + diff --git a/kernel-s-system/system-business-hr/pom.xml b/kernel-s-system/system-business-hr/pom.xml index bfaf89bdc..1a0ae59a8 100644 --- a/kernel-s-system/system-business-hr/pom.xml +++ b/kernel-s-system/system-business-hr/pom.xml @@ -17,6 +17,13 @@ + + + cn.stylefeng.roses + event-spring-boot-starter + ${roses.version} + + cn.stylefeng.roses diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/constants/OrgConstants.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/constants/OrgConstants.java index b295ac22c..bd24783d3 100644 --- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/constants/OrgConstants.java +++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/constants/OrgConstants.java @@ -37,4 +37,9 @@ public interface OrgConstants { */ String NONE_PARENT_ORG = "无上级机构"; + /** + * 添加组织机构的事件监听 + */ + String ADD_ORG_EVENT = "ADD_ORG_EVENT"; + } diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/listener/OrgOperateListener.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/listener/OrgOperateListener.java new file mode 100644 index 000000000..7a374692d --- /dev/null +++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/listener/OrgOperateListener.java @@ -0,0 +1,43 @@ +package cn.stylefeng.roses.kernel.sys.modular.org.listener; + +import cn.hutool.core.util.ObjectUtil; +import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; +import cn.stylefeng.roses.kernel.event.api.annotation.BusinessListener; +import cn.stylefeng.roses.kernel.sys.modular.org.constants.OrgConstants; +import cn.stylefeng.roses.kernel.sys.modular.org.entity.HrOrganization; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 添加组织机构的事件监听器 + * + * @author fengshuonan + * @since 2023/7/14 14:19 + */ +@Service +public class OrgOperateListener { + + @Resource(name = "sysOrgSubFlagCache") + private CacheOperatorApi sysOrgSubFlagCache; + + /** + * 监听新增组织机构,删除相关的缓存 + * + * @author fengshuonan + * @since 2023/7/14 16:22 + */ + @BusinessListener(businessCode = OrgConstants.ADD_ORG_EVENT) + public void addOrgCallback(HrOrganization businessObject) { + + if (ObjectUtil.isNotEmpty(businessObject.getOrgId())) { + sysOrgSubFlagCache.remove(String.valueOf(businessObject.getOrgId())); + } + + if (ObjectUtil.isNotEmpty(businessObject.getOrgParentId())) { + sysOrgSubFlagCache.remove(String.valueOf(businessObject.getOrgParentId())); + } + + } + +} diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrganizationServiceImpl.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrganizationServiceImpl.java index 1a9f928fb..fb7c5e7b2 100644 --- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrganizationServiceImpl.java +++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrganizationServiceImpl.java @@ -12,6 +12,7 @@ import cn.stylefeng.roses.kernel.db.api.factory.PageFactory; import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory; import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity; import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; +import cn.stylefeng.roses.kernel.event.sdk.publish.BusinessEventPublisher; import cn.stylefeng.roses.kernel.rule.constants.TreeConstants; import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException; import cn.stylefeng.roses.kernel.rule.tree.factory.DefaultTreeBuildFactory; @@ -76,6 +77,9 @@ public class HrOrganizationServiceImpl extends ServiceImpl kernel-d-email + + kernel-d-event + kernel-d-file