diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/handler/CommonSm4CbcTypeHandler.java b/snowy-common/src/main/java/vip/xiaonuo/common/handler/CommonSm4CbcTypeHandler.java index 6f0ce34e..0b70a808 100644 --- a/snowy-common/src/main/java/vip/xiaonuo/common/handler/CommonSm4CbcTypeHandler.java +++ b/snowy-common/src/main/java/vip/xiaonuo/common/handler/CommonSm4CbcTypeHandler.java @@ -1,3 +1,15 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ package vip.xiaonuo.common.handler; import com.baomidou.mybatisplus.core.toolkit.StringUtils; diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/listener/CommonDataChangeEventCenter.java b/snowy-common/src/main/java/vip/xiaonuo/common/listener/CommonDataChangeEventCenter.java new file mode 100644 index 00000000..0fb11878 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/listener/CommonDataChangeEventCenter.java @@ -0,0 +1,175 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.listener; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import vip.xiaonuo.common.exception.CommonException; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 通用数据变化事件中心 事件发布器 + * + * @author xuyuxiang + * @date 2023/3/3 10:14 + **/ +public class CommonDataChangeEventCenter { + + // --------- 注册侦听器 + + private static List listenerList = new ArrayList<>(); + + /** + * 获取已注册的所有侦听器 + * @return / + */ + public static List getListenerList() { + return listenerList; + } + + /** + * 重置侦听器集合 + * @param listenerList / + */ + public static void setListenerList(List listenerList) { + if(listenerList == null) { + throw new CommonException("重置的侦听器集合不可以为空"); + } + CommonDataChangeEventCenter.listenerList = listenerList; + } + + /** + * 注册一个侦听器 + * @param listener / + */ + public static void registerListener(CommonDataChangeListener listener) { + if(listener == null) { + throw new CommonException("注册的侦听器不可以为空"); + } + listenerList.add(listener); + } + + /** + * 注册一组侦听器 + * @param listenerList / + */ + public static void registerListenerList(List listenerList) { + if(listenerList == null) { + throw new CommonException("注册的侦听器不可以为空"); + } + for (CommonDataChangeListener listener : listenerList) { + if(listener == null) { + throw new CommonException("注册的侦听器不可以为空"); + } + } + CommonDataChangeEventCenter.listenerList.addAll(listenerList); + } + + /** + * 移除一个侦听器 + * @param listener / + */ + public static void removeListener(CommonDataChangeListener listener) { + listenerList.remove(listener); + } + + /** + * 移除指定类型的所有侦听器 + * @param cls / + */ + public static void removeListener(Class cls) { + ArrayList listenerListCopy = new ArrayList<>(listenerList); + for (CommonDataChangeListener listener : listenerListCopy) { + if(cls.isAssignableFrom(listener.getClass())) { + listenerList.remove(listener); + } + } + } + + /** + * 清空所有已注册的侦听器 + */ + public static void clearListener() { + listenerList.clear(); + } + + /** + * 判断是否已经注册了指定侦听器 + * @param listener / + * @return / + */ + public static boolean hasListener(CommonDataChangeListener listener) { + return listenerList.contains(listener); + } + + /** + * 判断是否已经注册了指定类型的侦听器 + * @param cls / + * @return / + */ + public static boolean hasListener(Class cls) { + for (CommonDataChangeListener listener : listenerList) { + if(cls.isAssignableFrom(listener.getClass())) { + return true; + } + } + return false; + } + + // --------- 事件发布-添加 --------- // + + /** + * 执行添加事件发布,数据集合 + * + * @author xuyuxiang + * @date 2023/3/3 10:22 + **/ + public static void doAddWithData(String dataType, JSONArray jsonArray) { + for (CommonDataChangeListener listener : listenerList) { + listener.doAddWithDataIdList(dataType, jsonArray.stream().map(o -> JSONUtil.parseObj(o).getStr("id")).collect(Collectors.toList())); + listener.doAddWithDataList(dataType, jsonArray); + } + } + + // --------- 事件发布-更新 --------- // + + /** + * 执行更新事件发布,数据集合 + * + * @author xuyuxiang + * @date 2023/3/3 10:22 + **/ + public static void doUpdateWithData(String dataType, JSONArray jsonArray) { + for (CommonDataChangeListener listener : listenerList) { + listener.doUpdateWithDataIdList(dataType, jsonArray.stream().map(o -> JSONUtil.parseObj(o).getStr("id")).collect(Collectors.toList())); + listener.doUpdateWithDataList(dataType, jsonArray); + } + } + + // --------- 事件发布-删除 --------- // + + /** + * 执行删除事件发布,ID集合 + * + * @author xuyuxiang + * @date 2023/3/3 10:22 + **/ + public static void doDeleteWithDataId(String dataType, List dataIdList) { + for (CommonDataChangeListener listener : listenerList) { + listener.doDeleteWithDataIdList(dataType, dataIdList); + } + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/listener/CommonDataChangeListener.java b/snowy-common/src/main/java/vip/xiaonuo/common/listener/CommonDataChangeListener.java new file mode 100644 index 00000000..12f0f7b2 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/listener/CommonDataChangeListener.java @@ -0,0 +1,76 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.listener; + +import cn.hutool.json.JSONArray; + +import java.util.List; + +/** + * 通用数据变化侦听器,你可以实现该侦听器接口,在数据更新时进行一些AOP操作 + * + * @author xuyuxiang + * @date 2023/3/3 10:14 + **/ +public interface CommonDataChangeListener { + + /** + * 执行添加,ID集合 + * + * @param dataType 数据类型,如USER、ORG,自行定义 + * @param dataIdList 被添加的数据ID集合 + * @author xuyuxiang + * @date 2023/3/3 10:24 + **/ + void doAddWithDataIdList(String dataType, List dataIdList); + + /** + * 执行添加,数据集合 + * + * @param dataType 数据类型,如USER、ORG,自行定义 + * @param jsonArray 被添加的数据集合 + * @author xuyuxiang + * @date 2023/3/3 10:24 + **/ + void doAddWithDataList(String dataType, JSONArray jsonArray); + + /** + * 执行更新,ID集合 + * + * @param dataType 数据类型,如USER、ORG,自行定义 + * @param dataIdList 被更新的数据ID集合 + * @author xuyuxiang + * @date 2023/3/3 10:24 + **/ + void doUpdateWithDataIdList(String dataType, List dataIdList); + + /** + * 执行更新,数据集合 + * + * @param dataType 数据类型,如USER、ORG,自行定义 + * @param jsonArray 被更新的数据集合 + * @author xuyuxiang + * @date 2023/3/3 10:24 + **/ + void doUpdateWithDataList(String dataType, JSONArray jsonArray); + + /** + * 执行删除,ID集合 + * + * @param dataType 数据类型,如USER、ORG,自行定义 + * @param dataIdList 被删除的数据ID集合 + * @author xuyuxiang + * @date 2023/3/3 10:24 + **/ + void doDeleteWithDataIdList(String dataType, List dataIdList); +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java index 00d43755..138597a4 100644 --- a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java @@ -137,7 +137,7 @@ public class AuthServiceImpl implements AuthService { throw new CommonException(AuthExceptionEnum.VALID_CODE_ERROR.getValue()); } // 不一致则直接验证码错误 - if(!validCode.equals(Convert.toStr(existValidCode))) { + if(!validCode.equals(Convert.toStr(existValidCode).toLowerCase())) { // 移除该验证码 commonCacheOperator.remove(AUTH_CACHE_KEY + validCodeReqNo); throw new CommonException(AuthExceptionEnum.VALID_CODE_ERROR.getValue()); diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/core/enums/BizDataTypeEnum.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/core/enums/BizDataTypeEnum.java new file mode 100644 index 00000000..a0e7041d --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/core/enums/BizDataTypeEnum.java @@ -0,0 +1,47 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.core.enums; + +import lombok.Getter; + +/** + * 业务模块数据类型枚举 + * + * @author xuyuxiang + * @date 2023/3/3 10:40 + **/ +@Getter +public enum BizDataTypeEnum { + + /** + * 机构 + */ + ORG("ORG"), + + /** + * 岗位 + */ + POSITION("POSITION"), + + /** + * 人员 + */ + USER("USER"); + + private final String value; + + BizDataTypeEnum(String value) { + this.value = value; + } + +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/service/impl/BizOrgServiceImpl.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/service/impl/BizOrgServiceImpl.java index d48c9fdc..4c84f3fb 100644 --- a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/service/impl/BizOrgServiceImpl.java +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/service/impl/BizOrgServiceImpl.java @@ -30,6 +30,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import vip.xiaonuo.auth.core.util.StpLoginUserUtil; +import vip.xiaonuo.biz.core.enums.BizDataTypeEnum; import vip.xiaonuo.biz.modular.org.entity.BizOrg; import vip.xiaonuo.biz.modular.org.enums.BizOrgCategoryEnum; import vip.xiaonuo.biz.modular.org.mapper.BizOrgMapper; @@ -41,6 +42,7 @@ import vip.xiaonuo.biz.modular.user.entity.BizUser; import vip.xiaonuo.biz.modular.user.service.BizUserService; import vip.xiaonuo.common.enums.CommonSortOrderEnum; import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.listener.CommonDataChangeEventCenter; import vip.xiaonuo.common.page.CommonPageRequest; import vip.xiaonuo.sys.api.SysRoleApi; @@ -139,6 +141,9 @@ public class BizOrgServiceImpl extends ServiceImpl impleme } bizOrg.setCode(RandomUtil.randomString(10)); this.save(bizOrg); + + // 发布增加事件 + CommonDataChangeEventCenter.doAddWithData(BizDataTypeEnum.ORG.getValue(), JSONUtil.createArray().put(bizOrg)); } @Transactional(rollbackFor = Exception.class) @@ -171,6 +176,9 @@ public class BizOrgServiceImpl extends ServiceImpl impleme throw new CommonException("不可选择上级机构:{}", this.getById(originDataList, bizOrg.getParentId()).getName()); } this.updateById(bizOrg); + + // 发布更新事件 + CommonDataChangeEventCenter.doUpdateWithData(BizDataTypeEnum.ORG.getValue(), JSONUtil.createArray().put(bizOrg)); } @Transactional(rollbackFor = Exception.class) @@ -221,6 +229,9 @@ public class BizOrgServiceImpl extends ServiceImpl impleme } // 执行删除 this.removeByIds(toDeleteOrgIdList); + + // 发布删除事件 + CommonDataChangeEventCenter.doDeleteWithDataId(BizDataTypeEnum.ORG.getValue(), toDeleteOrgIdList); } } diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/service/impl/BizPositionServiceImpl.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/service/impl/BizPositionServiceImpl.java index c25d9910..9025491c 100644 --- a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/service/impl/BizPositionServiceImpl.java +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/service/impl/BizPositionServiceImpl.java @@ -31,6 +31,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import vip.xiaonuo.auth.core.util.StpLoginUserUtil; +import vip.xiaonuo.biz.core.enums.BizDataTypeEnum; import vip.xiaonuo.biz.modular.org.entity.BizOrg; import vip.xiaonuo.biz.modular.org.service.BizOrgService; import vip.xiaonuo.biz.modular.position.entity.BizPosition; @@ -42,6 +43,7 @@ import vip.xiaonuo.biz.modular.user.entity.BizUser; import vip.xiaonuo.biz.modular.user.service.BizUserService; import vip.xiaonuo.common.enums.CommonSortOrderEnum; import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.listener.CommonDataChangeEventCenter; import vip.xiaonuo.common.page.CommonPageRequest; import javax.annotation.Resource; @@ -114,6 +116,9 @@ public class BizPositionServiceImpl extends ServiceImpl impl // 设置状态 bizUser.setUserStatus(BizUserStatusEnum.ENABLE.getValue()); this.save(bizUser); + + // 发布增加事件 + CommonDataChangeEventCenter.doAddWithData(BizDataTypeEnum.USER.getValue(), JSONUtil.createArray().put(bizUser)); } private void checkParam(BizUserAddParam bizUserAddParam) { @@ -187,6 +192,9 @@ public class BizUserServiceImpl extends ServiceImpl impl } BeanUtil.copyProperties(bizUserEditParam, bizUser); this.updateById(bizUser); + + // 发布更新事件 + CommonDataChangeEventCenter.doUpdateWithData(BizDataTypeEnum.USER.getValue(), JSONUtil.createArray().put(bizUser)); } private void checkParam(BizUserEditParam bizUserEditParam) { @@ -254,6 +262,7 @@ public class BizUserServiceImpl extends ServiceImpl impl } // 清除【将这些人员作为主管】的信息 this.update(new LambdaUpdateWrapper().in(BizUser::getDirectorId, bizUserIdList).set(BizUser::getDirectorId, null)); + // 清除【将这些人员作为兼任岗位的主管】的信息 this.list(new LambdaQueryWrapper() .isNotNull(BizUser::getPositionJson)).forEach(sysUser -> { List handledJsonObjectList = JSONUtil.toList(JSONUtil.parseArray(sysUser.getPositionJson()), @@ -266,10 +275,15 @@ public class BizUserServiceImpl extends ServiceImpl impl this.update(new LambdaUpdateWrapper().eq(BizUser::getId, sysUser.getId()) .set(BizUser::getPositionJson, JSONUtil.toJsonStr(handledJsonObjectList))); }); + + // 清除【将这些用户作为主管】的机构的主管信息 + bizOrgService.update(new LambdaUpdateWrapper().in(BizOrg::getDirectorId, bizUserIdList).set(BizOrg::getDirectorId, null)); + // 执行删除 this.removeByIds(bizUserIdList); - // TODO 此处需要将这些人员踢下线,并永久注销这些人员 + // 发布删除事件 + CommonDataChangeEventCenter.doDeleteWithDataId(BizDataTypeEnum.USER.getValue(), bizUserIdList); } } diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/core/enums/SysDataTypeEnum.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/core/enums/SysDataTypeEnum.java new file mode 100644 index 00000000..bf2742ef --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/core/enums/SysDataTypeEnum.java @@ -0,0 +1,57 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.core.enums; + +import lombok.Getter; + +/** + * 系统模块数据类型枚举 + * + * @author xuyuxiang + * @date 2023/3/3 10:40 + **/ +@Getter +public enum SysDataTypeEnum { + + /** + * 组织 + */ + ORG("ORG"), + + /** + * 职位 + */ + POSITION("POSITION"), + + /** + * 资源 + */ + RESOURCE("RESOURCE"), + + /** + * 角色 + */ + ROLE("ROLE"), + + /** + * 用户 + */ + USER("USER"); + + private final String value; + + SysDataTypeEnum(String value) { + this.value = value; + } + +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/core/listener/SysDataChangeListener.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/core/listener/SysDataChangeListener.java new file mode 100644 index 00000000..7e9a4b4d --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/core/listener/SysDataChangeListener.java @@ -0,0 +1,59 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.core.listener; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.json.JSONArray; +import org.springframework.stereotype.Component; +import vip.xiaonuo.common.listener.CommonDataChangeListener; +import vip.xiaonuo.sys.core.enums.SysDataTypeEnum; + +import java.util.List; + +/** + * 系统模块数据变化侦听器 + * + * @author xuyuxiang + * @date 2023/3/3 10:44 + **/ +@Component +public class SysDataChangeListener implements CommonDataChangeListener { + + @Override + public void doAddWithDataIdList(String dataType, List dataIdList) { + // 此处可做额外处理 + } + + @Override + public void doAddWithDataList(String dataType, JSONArray jsonArray) { + // 此处可做额外处理 + } + + @Override + public void doUpdateWithDataIdList(String dataType, List dataIdList) { + // 此处可做额外处理 + } + + @Override + public void doUpdateWithDataList(String dataType, JSONArray jsonArray) { + // 此处可做额外处理 + } + + @Override + public void doDeleteWithDataIdList(String dataType, List dataIdList) { + if(dataType.equals(SysDataTypeEnum.USER.getValue())) { + // 当用户被删除时,此处将这些用户踢下线 + dataIdList.forEach(StpUtil::kickout); + } + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/service/impl/SysOrgServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/service/impl/SysOrgServiceImpl.java index cb4116a2..9300a287 100644 --- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/service/impl/SysOrgServiceImpl.java +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/service/impl/SysOrgServiceImpl.java @@ -31,7 +31,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import vip.xiaonuo.common.enums.CommonSortOrderEnum; import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.listener.CommonDataChangeEventCenter; import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.sys.core.enums.SysDataTypeEnum; import vip.xiaonuo.sys.modular.org.entity.SysOrg; import vip.xiaonuo.sys.modular.org.enums.SysOrgCategoryEnum; import vip.xiaonuo.sys.modular.org.mapper.SysOrgMapper; @@ -100,6 +102,7 @@ public class SysOrgServiceImpl extends ServiceImpl impleme return TreeUtil.build(treeNodeList, "0"); } + @Transactional(rollbackFor = Exception.class) @Override public void add(SysOrgAddParam sysOrgAddParam) { SysOrgCategoryEnum.validate(sysOrgAddParam.getCategory()); @@ -112,8 +115,12 @@ public class SysOrgServiceImpl extends ServiceImpl impleme } sysOrg.setCode(RandomUtil.randomString(10)); this.save(sysOrg); + + // 发布增加事件 + CommonDataChangeEventCenter.doAddWithData(SysDataTypeEnum.ORG.getValue(), JSONUtil.createArray().put(sysOrg)); } + @Transactional(rollbackFor = Exception.class) @Override public void edit(SysOrgEditParam sysOrgEditParam) { SysOrgCategoryEnum.validate(sysOrgEditParam.getCategory()); @@ -131,6 +138,9 @@ public class SysOrgServiceImpl extends ServiceImpl impleme throw new CommonException("不可选择上级组织:{}", this.getById(originDataList, sysOrg.getParentId()).getName()); } this.updateById(sysOrg); + + // 发布更新事件 + CommonDataChangeEventCenter.doUpdateWithData(SysDataTypeEnum.ORG.getValue(), JSONUtil.createArray().put(sysOrg)); } @Transactional(rollbackFor = Exception.class) @@ -173,6 +183,9 @@ public class SysOrgServiceImpl extends ServiceImpl impleme } // 执行删除 this.removeByIds(toDeleteOrgIdList); + + // 发布删除事件 + CommonDataChangeEventCenter.doDeleteWithDataId(SysDataTypeEnum.ORG.getValue(), toDeleteOrgIdList); } } diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/service/impl/SysPositionServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/service/impl/SysPositionServiceImpl.java index 3401ab48..7b349b55 100644 --- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/service/impl/SysPositionServiceImpl.java +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/service/impl/SysPositionServiceImpl.java @@ -31,7 +31,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import vip.xiaonuo.common.enums.CommonSortOrderEnum; import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.listener.CommonDataChangeEventCenter; import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.sys.core.enums.SysDataTypeEnum; import vip.xiaonuo.sys.modular.org.entity.SysOrg; import vip.xiaonuo.sys.modular.org.service.SysOrgService; import vip.xiaonuo.sys.modular.position.entity.SysPosition; @@ -86,6 +88,7 @@ public class SysPositionServiceImpl extends ServiceImpl impl return TreeUtil.build(treeNodeList, "0"); } + @Transactional(rollbackFor = Exception.class) @Override public void add(SysMenuAddParam sysMenuAddParam) { checkParam(sysMenuAddParam); @@ -124,6 +127,9 @@ public class SysMenuServiceImpl extends ServiceImpl impl } sysMenu.setCategory(SysResourceCategoryEnum.MENU.getValue()); this.save(sysMenu); + + // 发布增加事件 + CommonDataChangeEventCenter.doAddWithData(SysDataTypeEnum.RESOURCE.getValue(), JSONUtil.createArray().put(sysMenu)); } @Transactional(rollbackFor = Exception.class) @@ -185,6 +191,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl } + @Transactional(rollbackFor = Exception.class) @Override public void edit(SysMenuEditParam sysMenuEditParam) { SysMenu sysMenu = this.queryEntity(sysMenuEditParam.getId()); @@ -213,6 +220,9 @@ public class SysMenuServiceImpl extends ServiceImpl impl } } this.updateById(sysMenu); + + // 发布更新事件 + CommonDataChangeEventCenter.doUpdateWithData(SysDataTypeEnum.RESOURCE.getValue(), JSONUtil.createArray().put(sysMenu)); } @Override @@ -266,6 +276,9 @@ public class SysMenuServiceImpl extends ServiceImpl impl .eq(SysRelation::getCategory, SysRelationCategoryEnum.SYS_ROLE_HAS_RESOURCE.getValue())); // 执行删除 this.removeByIds(toDeleteMenuIdList); + + // 发布删除事件 + CommonDataChangeEventCenter.doDeleteWithDataId(SysDataTypeEnum.RESOURCE.getValue(), toDeleteMenuIdList); } } } diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysModuleServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysModuleServiceImpl.java index 28bba158..3d3584dd 100644 --- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysModuleServiceImpl.java +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysModuleServiceImpl.java @@ -18,16 +18,20 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import vip.xiaonuo.common.enums.CommonSortOrderEnum; import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.listener.CommonDataChangeEventCenter; import vip.xiaonuo.common.page.CommonPageRequest; import vip.xiaonuo.sys.core.enums.SysBuildInEnum; +import vip.xiaonuo.sys.core.enums.SysDataTypeEnum; import vip.xiaonuo.sys.modular.relation.entity.SysRelation; import vip.xiaonuo.sys.modular.relation.enums.SysRelationCategoryEnum; import vip.xiaonuo.sys.modular.relation.service.SysRelationService; @@ -78,6 +82,7 @@ public class SysModuleServiceImpl extends ServiceImpl impleme return this.page(CommonPageRequest.defaultPage(), queryWrapper); } + @Transactional(rollbackFor = Exception.class) @Override public void add(SysSpaAddParam sysSpaAddParam) { checkParam(sysSpaAddParam); @@ -77,6 +82,9 @@ public class SysSpaServiceImpl extends ServiceImpl impleme sysSpa.setCode(RandomUtil.randomString(10)); sysSpa.setCategory(SysResourceCategoryEnum.SPA.getValue()); this.save(sysSpa); + + // 发布增加事件 + CommonDataChangeEventCenter.doAddWithData(SysDataTypeEnum.RESOURCE.getValue(), JSONUtil.createArray().put(sysSpa)); } @SuppressWarnings("all") @@ -99,6 +107,7 @@ public class SysSpaServiceImpl extends ServiceImpl impleme } } + @Transactional(rollbackFor = Exception.class) @Override public void edit(SysSpaEditParam sysSpaEditParam) { SysSpa sysSpa = this.queryEntity(sysSpaEditParam.getId()); @@ -111,6 +120,9 @@ public class SysSpaServiceImpl extends ServiceImpl impleme throw new CommonException("存在重复的单页面,名称为:{}", sysSpa.getTitle()); } this.updateById(sysSpa); + + // 发布更新事件 + CommonDataChangeEventCenter.doUpdateWithData(SysDataTypeEnum.RESOURCE.getValue(), JSONUtil.createArray().put(sysSpa)); } @SuppressWarnings("all") @@ -144,6 +156,9 @@ public class SysSpaServiceImpl extends ServiceImpl impleme } // 删除 this.removeByIds(sysSpaIdList); + + // 发布删除事件 + CommonDataChangeEventCenter.doDeleteWithDataId(SysDataTypeEnum.RESOURCE.getValue(), sysSpaIdList); } } diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/service/impl/SysRoleServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/service/impl/SysRoleServiceImpl.java index 26cae616..785e1ff3 100644 --- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/service/impl/SysRoleServiceImpl.java +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/service/impl/SysRoleServiceImpl.java @@ -37,9 +37,11 @@ import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import vip.xiaonuo.common.enums.CommonSortOrderEnum; import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.listener.CommonDataChangeEventCenter; import vip.xiaonuo.common.page.CommonPageRequest; import vip.xiaonuo.mobile.api.MobileMenuApi; import vip.xiaonuo.sys.core.enums.SysBuildInEnum; +import vip.xiaonuo.sys.core.enums.SysDataTypeEnum; import vip.xiaonuo.sys.modular.org.entity.SysOrg; import vip.xiaonuo.sys.modular.org.service.SysOrgService; import vip.xiaonuo.sys.modular.relation.entity.SysRelation; @@ -112,6 +114,7 @@ public class SysRoleServiceImpl extends ServiceImpl impl return this.page(CommonPageRequest.defaultPage(), queryWrapper); } + @Transactional(rollbackFor = Exception.class) @Override public void add(SysRoleAddParam sysRoleAddParam) { SysRoleCategoryEnum.validate(sysRoleAddParam.getCategory()); @@ -134,8 +137,12 @@ public class SysRoleServiceImpl extends ServiceImpl impl } sysRole.setCode(RandomUtil.randomString(10)); this.save(sysRole); + + // 发布增加事件 + CommonDataChangeEventCenter.doAddWithData(SysDataTypeEnum.ROLE.getValue(), JSONUtil.createArray().put(sysRole)); } + @Transactional(rollbackFor = Exception.class) @Override public void edit(SysRoleEditParam sysRoleEditParam) { SysRole sysRole = this.queryEntity(sysRoleEditParam.getId()); @@ -161,6 +168,9 @@ public class SysRoleServiceImpl extends ServiceImpl impl } BeanUtil.copyProperties(sysRoleEditParam, sysRole); this.updateById(sysRole); + + // 发布更新事件 + CommonDataChangeEventCenter.doUpdateWithData(SysDataTypeEnum.ROLE.getValue(), JSONUtil.createArray().put(sysRole)); } @Transactional(rollbackFor = Exception.class) @@ -184,6 +194,9 @@ public class SysRoleServiceImpl extends ServiceImpl impl .eq(SysRelation::getCategory, SysRelationCategoryEnum.SYS_ROLE_HAS_PERMISSION.getValue())); // 执行删除 this.removeByIds(sysRoleIdList); + + // 发布删除事件 + CommonDataChangeEventCenter.doDeleteWithDataId(SysDataTypeEnum.ROLE.getValue(), sysRoleIdList); } } diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java index 3f0ed6cc..d4453faf 100644 --- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java @@ -50,6 +50,7 @@ import org.springframework.web.multipart.MultipartFile; import vip.xiaonuo.common.cache.CommonCacheOperator; import vip.xiaonuo.common.enums.CommonSortOrderEnum; import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.listener.CommonDataChangeEventCenter; import vip.xiaonuo.common.page.CommonPageRequest; import vip.xiaonuo.common.util.*; import vip.xiaonuo.dev.api.DevConfigApi; @@ -59,6 +60,7 @@ import vip.xiaonuo.dev.api.DevSmsApi; import vip.xiaonuo.mobile.api.MobileButtonApi; import vip.xiaonuo.mobile.api.MobileMenuApi; import vip.xiaonuo.sys.core.enums.SysBuildInEnum; +import vip.xiaonuo.sys.core.enums.SysDataTypeEnum; import vip.xiaonuo.sys.modular.org.entity.SysOrg; import vip.xiaonuo.sys.modular.org.service.SysOrgService; import vip.xiaonuo.sys.modular.position.entity.SysPosition; @@ -227,6 +229,9 @@ public class SysUserServiceImpl extends ServiceImpl impl // 设置状态 sysUser.setUserStatus(SysUserStatusEnum.ENABLE.getValue()); this.save(sysUser); + + // 发布增加事件 + CommonDataChangeEventCenter.doAddWithData(SysDataTypeEnum.USER.getValue(), JSONUtil.createArray().put(sysUser)); } private void checkParam(SysUserAddParam sysUserAddParam) { @@ -266,6 +271,9 @@ public class SysUserServiceImpl extends ServiceImpl impl } BeanUtil.copyProperties(sysUserEditParam, sysUser); this.updateById(sysUser); + + // 发布更新事件 + CommonDataChangeEventCenter.doUpdateWithData(SysDataTypeEnum.USER.getValue(), JSONUtil.createArray().put(sysUser)); } private void checkParam(SysUserEditParam sysUserEditParam) { @@ -306,8 +314,10 @@ public class SysUserServiceImpl extends ServiceImpl impl if (containsSuperAdminAccount) { throw new CommonException("不可删除系统内置超管用户"); } + // 清除【将这些用户作为主管】的信息 this.update(new LambdaUpdateWrapper().in(SysUser::getDirectorId, sysUserIdList).set(SysUser::getDirectorId, null)); + // 清除【将这些用户作为兼任职位的主管】的信息 this.list(new LambdaQueryWrapper().isNotNull(SysUser::getPositionJson)).forEach(sysUser -> { List handledJsonObjectList = JSONUtil.toList(JSONUtil.parseArray(sysUser.getPositionJson()), @@ -320,10 +330,15 @@ public class SysUserServiceImpl extends ServiceImpl impl this.update(new LambdaUpdateWrapper().eq(SysUser::getId, sysUser.getId()) .set(SysUser::getPositionJson, JSONUtil.toJsonStr(handledJsonObjectList))); }); + + // 清除【将这些用户作为主管】的机构的主管信息 + sysOrgService.update(new LambdaUpdateWrapper().in(SysOrg::getDirectorId, sysUserIdList).set(SysOrg::getDirectorId, null)); + // 执行删除 this.removeByIds(sysUserIdList); - // TODO 此处需要将这些用户踢下线,并永久注销这些用户 + // 发布删除事件 + CommonDataChangeEventCenter.doDeleteWithDataId(SysDataTypeEnum.USER.getValue(), sysUserIdList); } } @@ -387,7 +402,7 @@ public class SysUserServiceImpl extends ServiceImpl impl throw new CommonException("验证码错误"); } // 不一致则直接验证码错误 - if (!validCode.equals(Convert.toStr(existValidCode))) { + if (!validCode.equals(Convert.toStr(existValidCode).toLowerCase())) { // 移除该验证码 commonCacheOperator.remove(USER_CACHE_KEY + validCodeReqNo); throw new CommonException("验证码错误"); diff --git a/snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java b/snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java index 29aacade..bc32e983 100644 --- a/snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java +++ b/snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java @@ -60,11 +60,14 @@ import vip.xiaonuo.common.annotation.CommonNoRepeat; import vip.xiaonuo.common.annotation.CommonWrapper; import vip.xiaonuo.common.enums.CommonDeleteFlagEnum; import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.listener.CommonDataChangeEventCenter; +import vip.xiaonuo.common.listener.CommonDataChangeListener; import vip.xiaonuo.common.pojo.CommonResult; import vip.xiaonuo.common.pojo.CommonWrapperInterface; import vip.xiaonuo.core.handler.GlobalExceptionUtil; import vip.xiaonuo.sys.core.enums.SysBuildInEnum; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @@ -585,4 +588,15 @@ public class GlobalConfigure implements WebMvcConfigurer { } } + + /** + * 注册数据变化事件中心 事件发布器 + * + * @author xuyuxiang + * @date 2023/3/3 14:27 + **/ + @Resource + public void registerListenerList(List dataChangeListenerList) { + CommonDataChangeEventCenter.registerListenerList(dataChangeListenerList); + } }