From 8b6271cebc7e6cf7987098841808c9a5cbb1a445 Mon Sep 17 00:00:00 2001 From: alwaysfrin Date: Tue, 1 Sep 2020 13:09:46 +0800 Subject: [PATCH] =?UTF-8?q?1=EF=BC=8C=E6=95=B0=E6=8D=AE=E6=BA=90=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E9=85=8D=E7=BD=AE=E4=BC=98=E5=8C=96=202=EF=BC=8C?= =?UTF-8?q?=E8=AF=BB=E5=86=99=E5=88=86=E7=A6=BB=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E4=BC=98=E5=8C=96=203=EF=BC=8C=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=88=87=E9=9D=A2=E4=BC=98=E5=8C=96=E8=B0=83=E6=95=B4?= =?UTF-8?q?=204=EF=BC=8C=E7=99=BB=E9=99=86=E7=BA=BF=E7=A8=8B=E4=BC=98?= =?UTF-8?q?=E5=8C=96=205=EF=BC=8C=E5=AF=B9=E8=B1=A1=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E3=80=81=E4=BF=AE=E6=94=B9=E7=9B=91=E5=90=AC=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/estsh/i3plus/pojo/base/bean/BaseBean.java | 1 + .../i3plus/pojo/base/bean/BaseBeanListener.java | 90 +++++++++++++ .../i3plus/pojo/base/bean/BaseThreadLocal.java | 142 +++++++++++++++++++++ 3 files changed, 233 insertions(+) create mode 100644 modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/bean/BaseBeanListener.java create mode 100644 modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/bean/BaseThreadLocal.java diff --git a/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/bean/BaseBean.java b/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/bean/BaseBean.java index 36858cc..a517b70 100644 --- a/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/bean/BaseBean.java +++ b/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/bean/BaseBean.java @@ -25,6 +25,7 @@ import java.util.Map; **/ @Data @MappedSuperclass +@EntityListeners(BaseBeanListener.class) //对象状态监听 //@Entity //以子类table为准 //@javax.persistence.Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) diff --git a/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/bean/BaseBeanListener.java b/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/bean/BaseBeanListener.java new file mode 100644 index 0000000..95889dc --- /dev/null +++ b/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/bean/BaseBeanListener.java @@ -0,0 +1,90 @@ +package cn.estsh.i3plus.pojo.base.bean; + +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import org.apache.commons.lang3.StringUtils; + +import javax.persistence.PrePersist; +import javax.persistence.PreUpdate; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @Description : 实体对象监听 + * @Reference : + * @Author : alwaysfrin + * @CreateDate : 2020-08-24 22:28 + * @Modify: + **/ +public class BaseBeanListener { + + //实体保存前 + @PrePersist + public void prePersist(BaseBean baseBean) { + // 创建用户 + if (StringUtils.isBlank(baseBean.getCreateUser())) { + if(StringUtils.isNotBlank(BaseThreadLocal.getThreadEmpName())) { + baseBean.setCreateUser(BaseThreadLocal.getThreadEmpName()); + baseBean.setModifyUser(BaseThreadLocal.getThreadEmpName()); + } + } + //组织代码 + if (StringUtils.isBlank(baseBean.getOrganizeCode())) { + if(StringUtils.isNotBlank(BaseThreadLocal.getThreadOrganizeCode())) { + baseBean.setOrganizeCode(BaseThreadLocal.getThreadOrganizeCode()); + } + } + // 创建时间 + if (StringUtils.isBlank(baseBean.getCreateDatetime())){ + baseBean.setCreateDatetime((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())); + baseBean.setModifyDatetime((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())); + } + //有效性 + if(baseBean.getIsValid() == null || + (baseBean.getIsValid() != CommonEnumUtil.IS_VAILD.VAILD.getValue() && baseBean.getIsValid() != CommonEnumUtil.IS_VAILD.INVAILD.getValue())){ + baseBean.setIsValid(CommonEnumUtil.IS_VAILD.VAILD.getValue()); //有效 + } + //是否删除 + if(baseBean.getIsDeleted() == null || + (baseBean.getIsDeleted() != CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() && baseBean.getIsDeleted() != CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue())){ + baseBean.setIsDeleted(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); //未删除 + } + } + + //实体对象保存之后 + /*@PostPersist + public void afterPersist(){ + }*/ + + //实体对象修改之前 + @PreUpdate + public void preUpdate(BaseBean baseBean) { + // 修改用户 + if (StringUtils.isBlank(baseBean.getModifyUser())) { + if(StringUtils.isNotBlank(BaseThreadLocal.getThreadEmpName())) { + baseBean.setModifyUser(BaseThreadLocal.getThreadEmpName()); + } + } + + // 修改时间 + if (StringUtils.isEmpty(baseBean.getModifyDatetime())){ + baseBean.setModifyDatetime((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())); + } + + //组织代码 + if (StringUtils.isBlank(baseBean.getOrganizeCode())) { + if(StringUtils.isNotBlank(BaseThreadLocal.getThreadOrganizeCode())) { + baseBean.setOrganizeCode(BaseThreadLocal.getThreadOrganizeCode()); + } + } + //有效性 + if(baseBean.getIsValid() == null || + (baseBean.getIsValid() != CommonEnumUtil.IS_VAILD.VAILD.getValue() && baseBean.getIsValid() != CommonEnumUtil.IS_VAILD.INVAILD.getValue())){ + baseBean.setIsValid(CommonEnumUtil.IS_VAILD.VAILD.getValue()); //有效 + } + //是否删除 + if(baseBean.getIsDeleted() == null || + (baseBean.getIsDeleted() != CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() && baseBean.getIsDeleted() != CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue())){ + baseBean.setIsDeleted(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); //未删除 + } + } +} diff --git a/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/bean/BaseThreadLocal.java b/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/bean/BaseThreadLocal.java new file mode 100644 index 0000000..7f7d708 --- /dev/null +++ b/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/bean/BaseThreadLocal.java @@ -0,0 +1,142 @@ +package cn.estsh.i3plus.pojo.base.bean; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; + +/** + * @Description : 本地线程,用于保存用户临时数据(按线程生命周期保存) + * 需要在线程结束的地方调用removeThreadLocal(),防止内存泄漏 + * @Reference : 生命周期:一次controller请求 + * @Author : alwaysfrin + * @CreateDate : 2020-08-24 20:49 + * @Modify: + **/ +public class BaseThreadLocal { + public static final Logger LOGGER = LoggerFactory.getLogger(BaseThreadLocal.class); + + /*private static final ThreadLocal> dataThredLocal = new ThreadLocal(){ + @Override + protected HashMap initialValue() { + //每个线程初始化map + return new HashMap(); + } + };*/ + private static final ThreadLocal> dataThredLocal = ThreadLocal.withInitial(() -> new HashMap<>()); + + public static Object getData(String key) { + if(dataThredLocal.get() != null) { + return dataThredLocal.get().get(key); + }else{ + return null; + } + } + + public static String getDataStr(String key) { + Object data = getData(key); + if(data != null){ + return data.toString(); + }else{ + return null; + } + } + + public static int getDataInt(String key) { + Object data = getData(key); + if(data != null){ + return Integer.parseInt(data.toString()); + }else{ + return 0; + } + } + + public static long getDataLong(String key) { + Object data = getData(key); + if(data != null){ + return Long.parseLong(data.toString()); + }else{ + return 0L; + } + } + + public static double getDataDouble(String key) { + Object data = getData(key); + if(data != null){ + return Double.parseDouble(data.toString()); + }else{ + return 0.0; + } + } + + public static void setData(String name, Object value) { + //不需要主数据源开始,则自动切换 + dataThredLocal.get().put(name, value); + } + + /** + * 手动再次清除线程变量 + * 需要在方法后调用,或者通过ascept拦截后进行清空 + */ + public static void removeThreadLocal(){ + if(dataThredLocal != null) { + if (dataThredLocal.get() != null) { + //清空数据 + dataThredLocal.get().clear(); + } + //移除当前线程信息 + dataThredLocal.remove(); + } + } + + public static String getInfo(){ + Thread thread = Thread.currentThread(); + return "thead-id:" + thread.getId() + ",thread:" + thread; + } + + public static void printDetail(){ + LOGGER.info("========本地线程临时数据======="); + LOGGER.info("数据数量:{}", dataThredLocal.get().size()); + for(String key : dataThredLocal.get().keySet()){ + LOGGER.info("key:{},value:{}",key,dataThredLocal.get().get(key)); + } + } + + /********* 用户信息 **********/ + public static final String INIT_INFO = "INIT_INFO"; //初始化数据 + public static final String EMP_NAME = "USER_NAME"; //用户名 + public static final String ORGANIZE_CODE = "ORGANIZE_CODE"; //组织代码 + + public static boolean isInit(){ + Object data = getData(INIT_INFO); + if(data != null){ + return Boolean.parseBoolean(data.toString()); + }else{ + return false; + } + } + + //初始化用户数据 + public static void initSessionUserThreadLocal(String empName, String organizeCode){ + setData(BaseThreadLocal.EMP_NAME, empName); + setData(BaseThreadLocal.ORGANIZE_CODE, organizeCode); + setData(BaseThreadLocal.INIT_INFO, true); + } + + //获取线程中的人员姓名 + public static String getThreadEmpName(){ + String empName = getDataStr(EMP_NAME); + if(empName == null){ + empName = "系统"; + } + return empName; + } + //获取线程中的组织代码 + public static String getThreadOrganizeCode(){ + String organizeCode = getDataStr(ORGANIZE_CODE); + if(organizeCode == null){ + organizeCode = "-1"; + } + return organizeCode; + } +}