完善代码
diff --git a/samples/client/src/main/java/com/supwisdom/leaveschool/client/controller/web/admin/WebAdminUserController.java b/samples/client/src/main/java/com/supwisdom/leaveschool/client/controller/web/admin/WebAdminUserController.java
index d1d68a0..88246c9 100644
--- a/samples/client/src/main/java/com/supwisdom/leaveschool/client/controller/web/admin/WebAdminUserController.java
+++ b/samples/client/src/main/java/com/supwisdom/leaveschool/client/controller/web/admin/WebAdminUserController.java
@@ -2,6 +2,7 @@
 
 
 import java.util.HashMap;
+import java.util.Map;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -29,12 +30,12 @@
     
     logger.debug(AuthenticationUtil.currentUsername());
     
-    PagerRequestModel pagerRequestModel = new PagerRequestModel();  // 分页请求,默认 pageIndex=0, pageSize=20
-    // 查询条件
-    pagerRequestModel.setMapBean(new HashMap<String, Object>());
-    pagerRequestModel.getMapBean().put("status", "1");
+    int pageIndex = 0;
+    int pageSize = 20;
+    Map<String, Object> mapBean = new HashMap<String, Object>();
+    mapBean.put("mapBean[status]", "1");
     
-    PagerResponseModel<User> users = sampleUser1AdminUserRemoteService.list(pagerRequestModel);
+    PagerResponseModel<User> users = sampleUser1AdminUserRemoteService.list(pageIndex, pageSize, mapBean);
     
     logger.debug("list is {}, {}", users==null?"":users.getClass().getName(), users);
     
diff --git a/samples/client/src/main/java/com/supwisdom/leaveschool/client/controller/web/api/HelloController.java b/samples/client/src/main/java/com/supwisdom/leaveschool/client/controller/web/api/HelloController.java
index 5719a86..35d19bc 100644
--- a/samples/client/src/main/java/com/supwisdom/leaveschool/client/controller/web/api/HelloController.java
+++ b/samples/client/src/main/java/com/supwisdom/leaveschool/client/controller/web/api/HelloController.java
@@ -3,10 +3,14 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.springframework.http.HttpStatus;
 import org.springframework.util.MimeTypeUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController
@@ -19,4 +23,13 @@
     result.put("message", "Good " + name);
     return result;
   }
+  
+  @PostMapping(consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public String post() {
+    
+    
+    return "abc";
+  }
 }
diff --git a/samples/client/src/main/java/com/supwisdom/leaveschool/client/service/SampleUser1AdminUserRemoteService.java b/samples/client/src/main/java/com/supwisdom/leaveschool/client/service/SampleUser1AdminUserRemoteService.java
index 6d361df..1cf0886 100644
--- a/samples/client/src/main/java/com/supwisdom/leaveschool/client/service/SampleUser1AdminUserRemoteService.java
+++ b/samples/client/src/main/java/com/supwisdom/leaveschool/client/service/SampleUser1AdminUserRemoteService.java
@@ -1,14 +1,16 @@
 package com.supwisdom.leaveschool.client.service;
 
+import java.util.Map;
+
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.util.MimeTypeUtils;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import com.supwisdom.leaveschool.client.service.fallback.SampleUser1AdminUserRemoteHystrix;
-import com.supwisdom.leaveschool.proxy.common.model.PagerRequestModel;
 import com.supwisdom.leaveschool.proxy.common.model.PagerResponseModel;
 import com.supwisdom.leaveschool.proxy.common.model.SuccessResponseModel;
 import com.supwisdom.leaveschool.proxy.user.domain.User;
@@ -21,7 +23,7 @@
 public interface SampleUser1AdminUserRemoteService {
   
   @RequestMapping(method = RequestMethod.GET, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
-  public PagerResponseModel<User> list(PagerRequestModel pagerRequestModel);
+  public PagerResponseModel<User> list(@RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize, @RequestParam("mapBean") Map<String, Object> mapBean);
 
   @RequestMapping(path = "/{id}", method = RequestMethod.GET, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   public User get(@PathVariable("id") String id);
diff --git a/samples/client/src/main/java/com/supwisdom/leaveschool/client/service/fallback/SampleUser1AdminUserRemoteHystrix.java b/samples/client/src/main/java/com/supwisdom/leaveschool/client/service/fallback/SampleUser1AdminUserRemoteHystrix.java
index e60a53b..3cc046d 100644
--- a/samples/client/src/main/java/com/supwisdom/leaveschool/client/service/fallback/SampleUser1AdminUserRemoteHystrix.java
+++ b/samples/client/src/main/java/com/supwisdom/leaveschool/client/service/fallback/SampleUser1AdminUserRemoteHystrix.java
@@ -1,11 +1,12 @@
 package com.supwisdom.leaveschool.client.service.fallback;
 
+import java.util.Map;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
 import com.supwisdom.leaveschool.client.service.SampleUser1AdminUserRemoteService;
-import com.supwisdom.leaveschool.proxy.common.model.PagerRequestModel;
 import com.supwisdom.leaveschool.proxy.common.model.PagerResponseModel;
 import com.supwisdom.leaveschool.proxy.common.model.SuccessResponseModel;
 import com.supwisdom.leaveschool.proxy.user.domain.User;
@@ -16,7 +17,7 @@
   private static final Logger logger = LoggerFactory.getLogger(SampleUser1AdminUserRemoteHystrix.class);
 
   @Override
-  public PagerResponseModel<User> list(PagerRequestModel pagerRequestModel) {
+  public PagerResponseModel<User> list(int pageIndex, int pageSize, Map<String, Object> mapBean) {
     return null;
   }
 
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 db67b3c..9d7e50d 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
@@ -52,21 +52,24 @@
   @Query(value = "select max(p.rgt) from Permission p")
   public int selectMaxRgt();
   
+  @Query(value = "select p from Permission p where p.lft>:lft and p.rgt<:rgt order by p.lft")
+  public List<Permission> selectBetweenLftRgt(@Param("lft") int lft, @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 "
+      + "  LFT = (case when LFT >= :rgt then LFT + :offset else LFT end), "
+      + "  RGT = RGT + :offset "
       + "where RGT >= :rgt", nativeQuery = true)
-  public int updateLftRgtWhenInsert(@Param("rgt") int rgt);
+  public int updateLftRgtWhenInsert(@Param("rgt") int rgt, @Param("offset") int offset);
 
   @Modifying
   @Query(value = "update TB_U_PERMISSION "
       + "set "
-      + "  LFT = (case when LFT >= :rgt then LFT - 2 else LFT end), "
-      + "  RGT = RGT - 2 "
+      + "  LFT = (case when LFT >= :rgt then LFT - :offset else LFT end), "
+      + "  RGT = RGT - :offset "
       + "where RGT >= :rgt", nativeQuery = true)
-  public int updateLftRgtWhenDelete(@Param("rgt") int rgt);
+  public int updateLftRgtWhenDelete(@Param("rgt") int rgt, @Param("offset") int offset);
   
   
   @Override
@@ -78,18 +81,19 @@
 
     if (entity.getParentId() == null || entity.getParentId().isEmpty() || "0".equals(entity.getParentId())) {
       int maxRgt = selectMaxRgt();
-      entity.setLft(maxRgt + 1);
-      entity.setRgt(maxRgt + 2);
+      entity.setLft((maxRgt+1));
+      entity.setRgt((maxRgt+1) + 1);
       
-      entity.setLevel(0);
+      entity.setLevel(1);
     } else {
       Permission parentEntity = this.selectById(entity.getParentId());
       if (parentEntity == null) {
         throw new RuntimeException(String.format("父级对象不存在!"));
       } else {
-        // 将 lft或rgt 大于等于父级对象 rgt 的记录的 lft、rgt +2
+        // 将 lft或rgt 大于等于父级对象 rgt 的记录的 lft、rgt +offset
         int rgt = parentEntity.getRgt();
-        updateLftRgtWhenInsert(rgt);
+        int offset = 2;
+        updateLftRgtWhenInsert(rgt, offset);
         
         entity.setLft(rgt);
         entity.setRgt(rgt + 1);
@@ -122,41 +126,68 @@
     }
     
     if (!originEntity.getParentId().equals(entity.getParentId()) ) {
+
+      int lft = originEntity.getLft();
+      int rgt = originEntity.getRgt();
+      int level = originEntity.getLevel();
+      int offset = rgt - lft +1;
       
+      List<Permission> childEntities = this.selectBetweenLftRgt(lft, rgt);
+
       if (entity.getParentId() == null || entity.getParentId().isEmpty() || "0".equals(entity.getParentId())) {
-        // 将 lft或rgt 大于等于该对象 rgt 的记录的 lft、rgt -2
-        int rgt = originEntity.getRgt();
-        updateLftRgtWhenDelete(rgt);
+        // 将 lft或rgt 大于等于该对象 rgt 的记录的 lft、rgt -offset
+        updateLftRgtWhenDelete(rgt, offset);
   
         int maxRgt = selectMaxRgt();
-        entity.setLft(maxRgt + 1);
-        entity.setRgt(maxRgt + 2);
+        entity.setLft((maxRgt+1));
+        entity.setRgt((maxRgt+1) + 1 +offset-2);
         
-        entity.setLevel(0);
+        entity.setLevel(1);
       } else {
+        // 将 lft或rgt 大于等于该对象 rgt 的记录的 lft、rgt -offset
+        updateLftRgtWhenDelete(rgt, offset);
+
         Permission parentEntity = this.selectById(entity.getParentId());
         if (parentEntity == null) {
           throw new RuntimeException(String.format("父级对象不存在!"));
         }
-        
+        //System.out.println(String.format("pLft %s, pRgt %s", parentEntity.getLft(), parentEntity.getRgt()));
         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
+        //parentEntity = this.selectById(entity.getParentId()); System.out.println(String.format("pLft %s, pRgt %s", parentEntity.getLft(), parentEntity.getRgt()));
+        // 将 lft或rgt 大于等于父级对象 rgt 的记录的 lft、rgt +offset
+        //int pLft = parentEntity.getLft();
         int pRgt = parentEntity.getRgt();
-        updateLftRgtWhenInsert(pRgt);
+        updateLftRgtWhenInsert(pRgt, offset);
         
         entity.setLft(pRgt);
-        entity.setRgt(pRgt + 1);
-
+        entity.setRgt(pRgt + 1 + offset-2);
+        
         entity.setLevel(parentEntity.getLevel() + 1);
       }
+      
+      int newLft = entity.getLft();
+      int newRgt = entity.getRgt();
+      int newLevel = entity.getLevel();
+      //System.out.println(String.format("newLft %s, newRgt %s, newLevel %s", newLft, newRgt, newLevel));
+      //System.out.println(String.format("lft %s, rgt %s, level %s", lft, rgt, level));
+      for (Permission childEntity : childEntities) {
+        //Permission pEntity = this.selectById(childEntity.getParentId());
+        
+        int cLft = childEntity.getLft();
+        int cRgt = childEntity.getRgt();
+        int cLevel = childEntity.getLevel();
+        
+        childEntity.setLft(cLft + (newLft - lft));
+        childEntity.setRgt(cRgt + (newRgt - rgt));
+        
+        childEntity.setLevel(cLevel + (newLevel - level));
+        
+        BaseJpaRepository.super.update(childEntity);
+      }
+
     }
     
     return BaseJpaRepository.super.update(entity);
@@ -169,12 +200,23 @@
     if (originEntity == null) {
       return;
     }
-    
-    // FIXME: 判断是否有子节点
-    
-    // 将 lft或rgt 大于等于该对象 rgt 的记录的 lft、rgt -2
+
+    int lft = originEntity.getLft();
     int rgt = originEntity.getRgt();
-    updateLftRgtWhenDelete(rgt);
+    int offset = rgt - lft +1;
+
+    // FIXME: 判断是否有子节点
+    //if (lft + 1 != rgt) {
+    //  return;
+    //}
+
+    List<Permission> childEntities = this.selectBetweenLftRgt(lft, rgt);
+    for (Permission childEntity : childEntities) {
+      BaseJpaRepository.super.delete(childEntity.getId());
+    }
+    
+    // 将 lft或rgt 大于等于该对象 rgt 的记录的 lft、rgt -offset
+    updateLftRgtWhenDelete(rgt, offset);
     
     BaseJpaRepository.super.delete(id);
   }
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/UserRepository.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/UserRepository.java
index dbeb279..625cf29 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/UserRepository.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/UserRepository.java
@@ -16,6 +16,21 @@
 @Repository
 public interface UserRepository extends BaseJpaRepository<User> {
   
+  public default Page<User> selectPageList(int pageIndex, int pageSize, User probe) {
+    
+    ExampleMatcher matcher = ExampleMatcher.matching()
+        .withMatcher("username", ExampleMatcher.GenericPropertyMatchers.contains())
+        .withMatcher("name", ExampleMatcher.GenericPropertyMatchers.contains())
+        .withMatcher("status", ExampleMatcher.GenericPropertyMatchers.exact());
+    
+    PageRequest pageRequest = PageRequest.of(pageIndex, pageSize);
+    Example<User> example = Example.of(probe, matcher);
+    
+    Page<User> page = this.findAll(example, pageRequest);
+    
+    return page;
+  }
+  
   public default Page<User> selectPageList(int pageIndex, int pageSize, Map<String, Object> mapBean) {
     User probe = new User();
     if (mapBean != null) {