完成权限数据的新增、修改、删除等逻辑
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/Permission.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/Permission.java
index 30911e8..7b7979c 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/Permission.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/Permission.java
@@ -30,7 +30,7 @@
/**
* 备注
*/
- @Column(name = "MEMO")
+ @Column(name = "MEMO", nullable = true)
private String memo;
/**
@@ -48,7 +48,7 @@
/**
* URL地址
*/
- @Column(name = "URL")
+ @Column(name = "URL", nullable = true)
private String url;
/**
@@ -61,25 +61,25 @@
* 排序
*/
@Column(name = "ORDER_")
- private String order;
+ private Integer order;
/**
* 层次
*/
@Column(name = "LEVEL_")
- private String level;
+ private Integer level;
/**
* 左序
*/
@Column(name = "LFT")
- private int lft;
+ private Integer lft;
/**
* 右序
*/
@Column(name = "RGT")
- private int rgt;
+ private Integer rgt;
public String getCode() {
return code;
@@ -137,19 +137,19 @@
this.parentId = parentId;
}
- public String getOrder() {
+ public Integer getOrder() {
return order;
}
- public void setOrder(String order) {
+ public void setOrder(Integer order) {
this.order = order;
}
- public String getLevel() {
+ public Integer getLevel() {
return level;
}
- public void setLevel(String level) {
+ public void setLevel(Integer level) {
this.level = level;
}
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/PermissionRepository.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/PermissionRepository.java
index 49825f6..db67b3c 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/PermissionRepository.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/PermissionRepository.java
@@ -5,10 +5,13 @@
import java.util.Map;
import java.util.Optional;
+import javax.transaction.Transactional;
+
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
+import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@@ -18,6 +21,7 @@
import com.supwisdom.leaveschool.user.domain.Permission;
@Repository
+@Transactional
public interface PermissionRepository extends BaseJpaRepository<Permission> {
public default Page<Permission> selectPageList(int pageIndex, int pageSize, Map<String, Object> mapBean) {
@@ -43,7 +47,137 @@
return page;
}
+
+
+ @Query(value = "select max(p.rgt) from Permission p")
+ public int selectMaxRgt();
+
+ @Modifying
+ @Query(value = "update TB_U_PERMISSION "
+ + "set "
+ + " LFT = (case when LFT >= :rgt then LFT + 2 else LFT end), "
+ + " RGT = RGT + 2 "
+ + "where RGT >= :rgt", nativeQuery = true)
+ public int updateLftRgtWhenInsert(@Param("rgt") int rgt);
+ @Modifying
+ @Query(value = "update TB_U_PERMISSION "
+ + "set "
+ + " LFT = (case when LFT >= :rgt then LFT - 2 else LFT end), "
+ + " RGT = RGT - 2 "
+ + "where RGT >= :rgt", nativeQuery = true)
+ public int updateLftRgtWhenDelete(@Param("rgt") int rgt);
+
+
+ @Override
+ public default Permission insert(Permission entity) {
+
+ if (entity.getParentId() == null) {
+ entity.setParentId("0");
+ }
+
+ if (entity.getParentId() == null || entity.getParentId().isEmpty() || "0".equals(entity.getParentId())) {
+ int maxRgt = selectMaxRgt();
+ entity.setLft(maxRgt + 1);
+ entity.setRgt(maxRgt + 2);
+
+ entity.setLevel(0);
+ } else {
+ Permission parentEntity = this.selectById(entity.getParentId());
+ if (parentEntity == null) {
+ throw new RuntimeException(String.format("父级对象不存在!"));
+ } else {
+ // 将 lft或rgt 大于等于父级对象 rgt 的记录的 lft、rgt +2
+ int rgt = parentEntity.getRgt();
+ updateLftRgtWhenInsert(rgt);
+
+ entity.setLft(rgt);
+ entity.setRgt(rgt + 1);
+
+ entity.setLevel(parentEntity.getLevel() + 1);
+ }
+ }
+
+ return BaseJpaRepository.super.insert(entity);
+ }
+
+ @Override
+ public default Permission update(Permission entity) {
+
+ Permission originEntity = this.selectById(entity.getId());
+ if (originEntity == null) {
+ return null;
+ }
+
+ //if (!this.checkFieldExists("code", entity.getCode(), entity.getId())) {
+ // throw new RuntimeException(String.format("代码重复!"));
+ //}
+
+ if (originEntity.getParentId() == null) {
+ originEntity.setParentId("0");
+ }
+
+ if (entity.getParentId() == null) {
+ entity.setParentId("0");
+ }
+
+ if (!originEntity.getParentId().equals(entity.getParentId()) ) {
+
+ if (entity.getParentId() == null || entity.getParentId().isEmpty() || "0".equals(entity.getParentId())) {
+ // 将 lft或rgt 大于等于该对象 rgt 的记录的 lft、rgt -2
+ int rgt = originEntity.getRgt();
+ updateLftRgtWhenDelete(rgt);
+
+ int maxRgt = selectMaxRgt();
+ entity.setLft(maxRgt + 1);
+ entity.setRgt(maxRgt + 2);
+
+ entity.setLevel(0);
+ } else {
+ Permission parentEntity = this.selectById(entity.getParentId());
+ if (parentEntity == null) {
+ throw new RuntimeException(String.format("父级对象不存在!"));
+ }
+
+ if (parentEntity.getLft() >= originEntity.getLft() && parentEntity.getRgt() <= originEntity.getRgt()) {
+ throw new RuntimeException(String.format("不能设置自身或自身的子节点作为父级!"));
+ }
+
+ // 将 lft或rgt 大于等于该对象 rgt 的记录的 lft、rgt -2
+ int rgt = originEntity.getRgt();
+ updateLftRgtWhenDelete(rgt);
+
+ parentEntity = this.selectById(entity.getParentId());
+ // 将 lft或rgt 大于等于父级对象 rgt 的记录的 lft、rgt +2
+ int pRgt = parentEntity.getRgt();
+ updateLftRgtWhenInsert(pRgt);
+
+ entity.setLft(pRgt);
+ entity.setRgt(pRgt + 1);
+
+ entity.setLevel(parentEntity.getLevel() + 1);
+ }
+ }
+
+ return BaseJpaRepository.super.update(entity);
+ }
+
+ @Override
+ public default void delete(String id) {
+
+ Permission originEntity = this.selectById(id);
+ if (originEntity == null) {
+ return;
+ }
+
+ // FIXME: 判断是否有子节点
+
+ // 将 lft或rgt 大于等于该对象 rgt 的记录的 lft、rgt -2
+ int rgt = originEntity.getRgt();
+ updateLftRgtWhenDelete(rgt);
+
+ BaseJpaRepository.super.delete(id);
+ }
public default Permission selectApplicationPermissionByCode(String code) {
Permission probe = new Permission();