Browse Source

增加逻辑删除;优化创建人,修改人逻辑

zhouhao 6 năm trước cách đây
mục cha
commit
ea97517a77

+ 24 - 2
hsweb-commons/hsweb-commons-controller/src/main/java/org/hswebframework/web/controller/CreateController.java

@@ -20,8 +20,12 @@ package org.hswebframework.web.controller;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
+import org.hswebframework.web.authorization.Authentication;
 import org.hswebframework.web.authorization.Permission;
+import org.hswebframework.web.authorization.User;
 import org.hswebframework.web.authorization.annotation.Authorize;
+import org.hswebframework.web.commons.entity.RecordCreationEntity;
+import org.hswebframework.web.commons.entity.RecordModifierEntity;
 import org.hswebframework.web.controller.message.ResponseMessage;
 import org.hswebframework.web.logging.AccessLogger;
 import org.hswebframework.web.service.CreateEntityService;
@@ -56,8 +60,26 @@ public interface CreateController<E, PK, M> {
     @ResponseStatus(HttpStatus.CREATED)
     @ApiOperation(value = "新增")
     default ResponseMessage<PK> add(@RequestBody M data) {
-        E entity = getService().createEntity();
-        return ok(getService().insert(modelToEntity(data, entity)));
+        E entity = modelToEntity(data, getService().createEntity());
+        //自动添加创建人和创建时间
+        if (entity instanceof RecordCreationEntity) {
+            RecordCreationEntity creationEntity = (RecordCreationEntity) entity;
+            creationEntity.setCreateTimeNow();
+            creationEntity.setCreatorId(Authentication.current()
+                    .map(Authentication::getUser)
+                    .map(User::getId)
+                    .orElse(null));
+        }
+        //修改人和修改时间
+        if (entity instanceof RecordModifierEntity) {
+            RecordModifierEntity creationEntity = (RecordModifierEntity) entity;
+            creationEntity.setModifyTimeNow();
+            creationEntity.setModifierId(Authentication.current()
+                    .map(Authentication::getUser)
+                    .map(User::getId)
+                    .orElse(null));
+        }
+        return ok(getService().insert(entity));
     }
 
     @Authorize(ignore = true)

+ 34 - 4
hsweb-commons/hsweb-commons-controller/src/main/java/org/hswebframework/web/controller/UpdateController.java

@@ -21,9 +21,13 @@ package org.hswebframework.web.controller;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
+import org.hswebframework.web.authorization.Authentication;
 import org.hswebframework.web.authorization.Permission;
+import org.hswebframework.web.authorization.User;
 import org.hswebframework.web.authorization.annotation.Authorize;
 import org.hswebframework.web.authorization.annotation.Logical;
+import org.hswebframework.web.commons.entity.RecordCreationEntity;
+import org.hswebframework.web.commons.entity.RecordModifierEntity;
 import org.hswebframework.web.controller.message.ResponseMessage;
 import org.hswebframework.web.logging.AccessLogger;
 import org.hswebframework.web.service.CreateEntityService;
@@ -45,16 +49,42 @@ public interface UpdateController<E, PK, M> {
     @PutMapping(path = "/{id}")
     @ApiOperation("修改数据")
     default ResponseMessage<Integer> updateByPrimaryKey(@PathVariable PK id, @RequestBody M data) {
-        E entity = getService().createEntity();
-        return ResponseMessage.ok(getService().updateByPk(id, modelToEntity(data, entity)));
+        E entity = modelToEntity(data, getService().createEntity());
+        if (entity instanceof RecordModifierEntity) {
+            RecordModifierEntity creationEntity = (RecordModifierEntity) entity;
+            creationEntity.setModifyTimeNow();
+            creationEntity.setModifierId(Authentication.current()
+                    .map(Authentication::getUser)
+                    .map(User::getId)
+                    .orElse(null));
+        }
+        return ResponseMessage.ok(getService().updateByPk(id, entity));
     }
 
     @Authorize(action = {Permission.ACTION_UPDATE, Permission.ACTION_ADD}, logical = Logical.AND)
     @PatchMapping
     @ApiOperation("新增或者修改")
     default ResponseMessage<PK> saveOrUpdate(@RequestBody M data) {
-        E entity = getService().createEntity();
-        return ResponseMessage.ok(getService().saveOrUpdate(modelToEntity(data, entity)));
+        E entity = modelToEntity(data, getService().createEntity());
+        //自动添加创建人和创建时间
+        if (entity instanceof RecordCreationEntity) {
+            RecordCreationEntity creationEntity = (RecordCreationEntity) entity;
+            creationEntity.setCreateTimeNow();
+            creationEntity.setCreatorId(Authentication.current()
+                    .map(Authentication::getUser)
+                    .map(User::getId)
+                    .orElse(null));
+        }
+        //修改人和修改时间
+        if (entity instanceof RecordModifierEntity) {
+            RecordModifierEntity creationEntity = (RecordModifierEntity) entity;
+            creationEntity.setModifyTimeNow();
+            creationEntity.setModifierId(Authentication.current()
+                    .map(Authentication::getUser)
+                    .map(User::getId)
+                    .orElse(null));
+        }
+        return ResponseMessage.ok(getService().saveOrUpdate(entity));
     }
 
     /**

+ 25 - 0
hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/LogicalDeleteEntity.java

@@ -0,0 +1,25 @@
+package org.hswebframework.web.commons.entity;
+
+/**
+ * 逻辑删除
+ *
+ * @author zhouhao
+ * @since 3.0.6
+ */
+public interface LogicalDeleteEntity {
+
+    String deleted      = "deleted";
+    String deleteTime   = "deleteTime";
+
+    Boolean getDeleted();
+
+    void setDeleted(boolean deleted);
+
+    Long getDeleteTime();
+
+    void setDeleteTime(Long deleteTime);
+
+    String getDeleteUserId();
+
+
+}

+ 29 - 0
hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/RecordModifierEntity.java

@@ -0,0 +1,29 @@
+package org.hswebframework.web.commons.entity;
+
+/**
+ * 记录修改信息的实体类,包括修改人和修改时间。
+ *
+ * @author zhouhao
+ * @since 3.0.6
+ */
+public interface RecordModifierEntity extends Entity {
+
+    String modifierId = "modifierId";
+    String modifyTime = "modifyTime";
+
+    String getModifierId();
+
+    void setModifierId(String modifierId);
+
+    Long getModifyTime();
+
+    void setModifyTime(Long modifyTime);
+
+    default void setModifyTimeNow() {
+        setModifyTime(System.currentTimeMillis());
+    }
+
+    default String getModifierIdProperty() {
+        return modifierId;
+    }
+}

+ 19 - 4
hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/java/org/hswebframework/web/service/GenericEntityService.java

@@ -19,7 +19,9 @@
 package org.hswebframework.web.service;
 
 import org.hswebframework.web.commons.entity.GenericEntity;
+import org.hswebframework.web.commons.entity.LogicalDeleteEntity;
 import org.hswebframework.web.commons.entity.RecordCreationEntity;
+import org.hswebframework.web.commons.entity.RecordModifierEntity;
 import org.hswebframework.web.dao.CrudDao;
 import org.hswebframework.web.id.IDGenerator;
 import org.hswebframework.web.validator.DuplicateKeyException;
@@ -68,23 +70,36 @@ public abstract class GenericEntityService<E extends GenericEntity<PK>, PK>
 
     @Override
     public E deleteByPk(PK pk) {
-        Assert.notNull(pk, "parameter can not be null");
         E old = selectByPk(pk);
-        getDao().deleteByPk(pk);
+        if (old == null) {
+            return null;
+        }
+        if (old instanceof LogicalDeleteEntity) {
+            LogicalDeleteEntity deleteEntity = (LogicalDeleteEntity) old;
+            deleteEntity.setDeleted(true);
+            deleteEntity.setDeleteTime(System.currentTimeMillis());
+            createUpdate()
+                    .set(deleteEntity::getDeleted)
+                    .set(deleteEntity::getDeleteTime)
+                    .where(GenericEntity.id, pk)
+                    .exec();
+        } else {
+            getDao().deleteByPk(pk);
+        }
         return old;
     }
 
     @Override
     public int updateByPk(PK pk, E entity) {
         Assert.notNull(pk, "primary key can not be null");
+        Assert.hasText(String.valueOf(pk), "primary key can not be null");
         Assert.notNull(entity, "entity can not be null");
         entity.setId(pk);
         tryValidate(entity, UpdateGroup.class);
-
         return createUpdate(entity)
                 //如果是RecordCreationEntity则不修改creator_id和creator_time
                 .when(entity instanceof RecordCreationEntity,
-                        update -> update.and().excludes(RecordCreationEntity.creatorId, RecordCreationEntity.createTime))
+                        update -> update.and().excludes(((RecordCreationEntity) entity).getCreatorIdProperty(), RecordCreationEntity.createTime))
                 .where(GenericEntity.id, pk)
                 .exec();
     }