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();
