完成权限数据的新增、修改、删除等逻辑
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();