diff --git a/samples/user/pom.xml b/samples/user/pom.xml
index e7d6492..e6c0032 100644
--- a/samples/user/pom.xml
+++ b/samples/user/pom.xml
@@ -15,6 +15,11 @@
   <dependencies>
 
     <dependency>
+      <groupId>com.supwisdom.leaveschool</groupId>
+      <artifactId>sample-common</artifactId>
+    </dependency>
+
+    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter</artifactId>
     </dependency>
@@ -29,11 +34,6 @@
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
-
-    <dependency>
-      <groupId>commons-collections</groupId>
-      <artifactId>commons-collections</artifactId>
-    </dependency>
     
 
     <dependency>
@@ -64,11 +64,6 @@
      -->
 
     <dependency>
-      <groupId>com.supwisdom.infras</groupId>
-      <artifactId>infras-data-jpa</artifactId>
-    </dependency>
-
-    <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
     </dependency>
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminUserController.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminUserController.java
index 36ab166..a635ad9 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminUserController.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminUserController.java
@@ -19,11 +19,11 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
+import com.supwisdom.leaveschool.common.model.PagerRequestModel;
+import com.supwisdom.leaveschool.common.model.PagerResponseModel;
+import com.supwisdom.leaveschool.common.util.DomainUtils;
 import com.supwisdom.leaveschool.user.domain.User;
-import com.supwisdom.leaveschool.user.model.PagerRequestModel;
-import com.supwisdom.leaveschool.user.model.PagerResponseModel;
 import com.supwisdom.leaveschool.user.repository.UserRepository;
-import com.supwisdom.leaveschool.user.util.DomainUtils;
 
 @RestController
 @RequestMapping("/api/v1/admin/users")
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/User.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/User.java
index 8af51c9..9a2c0d5 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/User.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/User.java
@@ -4,7 +4,7 @@
 import javax.persistence.Entity;
 import javax.persistence.Table;
 
-import com.supwisdom.infras.data.jpa.domain.ABaseDomain;
+import com.supwisdom.leaveschool.common.domain.ABaseDomain;
 
 @Entity
 @Table(name = "TB_U_USER")
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/model/PagerRequestModel.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/model/PagerRequestModel.java
deleted file mode 100644
index c31ab0b..0000000
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/model/PagerRequestModel.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.supwisdom.leaveschool.user.model;
-
-import java.io.Serializable;
-import java.util.Map;
-
-public class PagerRequestModel implements Serializable {
-
-  /**
-   * 
-   */
-  private static final long serialVersionUID = 6099787167570502127L;
-
-  private int pageIndex = 0;
-  private int pageSize = 20;
-
-  public int getPageIndex() {
-    return pageIndex;
-  }
-
-  public void setPageIndex(int pageIndex) {
-    this.pageIndex = pageIndex;
-  }
-
-  public int getPageSize() {
-    return pageSize;
-  }
-
-  public void setPageSize(int pageSize) {
-    this.pageSize = pageSize;
-  }
-
-  private Map<String, Object> mapBean;
-
-  public Map<String, Object> getMapBean() {
-    return mapBean;
-  }
-
-  public void setMapBean(Map<String, Object> mapBean) {
-    this.mapBean = mapBean;
-  }
-
-}
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/model/PagerResponseModel.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/model/PagerResponseModel.java
deleted file mode 100644
index 3cab2b7..0000000
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/model/PagerResponseModel.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.supwisdom.leaveschool.user.model;
-
-import java.io.Serializable;
-import java.util.Collection;
-
-public class PagerResponseModel<T> extends PagerRequestModel implements Serializable {
-
-  /**
-   * 
-   */
-  private static final long serialVersionUID = -3449591075961852442L;
-
-  private int pageCount;
-  private long recordCount;
-
-  private Collection<T> items;
-
-  public PagerResponseModel() {
-
-  }
-
-  public PagerResponseModel(PagerRequestModel pagerRequestModel) {
-    super.setPageIndex(pagerRequestModel.getPageIndex());
-    super.setPageSize(pagerRequestModel.getPageSize());
-    super.setMapBean(pagerRequestModel.getMapBean());
-  }
-
-  public static <T> PagerResponseModel<T> of(PagerRequestModel pagerRequestModel) {
-    PagerResponseModel<T> pagerResponseModell = new PagerResponseModel<T>();
-    pagerResponseModell.setPageIndex(pagerRequestModel.getPageIndex());
-    pagerResponseModell.setPageSize(pagerRequestModel.getPageSize());
-    pagerResponseModell.setMapBean(pagerRequestModel.getMapBean());
-
-    return pagerResponseModell;
-  }
-
-  public int getPageCount() {
-    return pageCount;
-  }
-
-  public void setPageCount(int pageCount) {
-    this.pageCount = pageCount;
-  }
-
-  public long getRecordCount() {
-    return recordCount;
-  }
-
-  public void setRecordCount(long recordCount) {
-    this.recordCount = recordCount;
-  }
-
-  public Collection<T> getItems() {
-    return items;
-  }
-
-  public void setItems(Collection<T> items) {
-    this.items = items;
-  }
-
-}
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 097b648..ff1fd0b 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
@@ -1,8 +1,6 @@
 package com.supwisdom.leaveschool.user.repository;
 
-import java.util.Calendar;
 import java.util.Map;
-import java.util.Optional;
 
 import org.springframework.data.domain.Example;
 import org.springframework.data.domain.ExampleMatcher;
@@ -10,7 +8,7 @@
 import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Repository;
 
-import com.supwisdom.infras.data.jpa.repository.BaseJpaRepository;
+import com.supwisdom.leaveschool.common.repository.BaseJpaRepository;
 import com.supwisdom.leaveschool.user.domain.User;
 
 @Repository
@@ -37,6 +35,7 @@
     return page;
   }
   
+  /*
   public default User selectById(String id) {
     
     try {
@@ -76,6 +75,6 @@
     
     return e;
   }
-
+  */
 
 }
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/DomainUtils.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/DomainUtils.java
deleted file mode 100644
index 48e9047..0000000
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/DomainUtils.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package com.supwisdom.leaveschool.user.util;
-
-import java.lang.reflect.Field;
-import java.util.Date;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
-
-/**
- * 对 domain 的操作 如：复制、合并、转换等
- * 
- * @author loie
- *
- */
-public class DomainUtils {
-
-  /**
-   * 合并 domain 中带有{@link Column}注解的字段值， 将 oldDomain 中的值，使用 newDomain 中不为null的值
-   * 进行覆盖
-   * 
-   * @param newDomain
-   *          ，
-   * @param oldDomain
-   *          ，被覆盖的实体
-   * @return 合并后的oldDomain
-   */
-  public static <T> T merge(T newDomain, T oldDomain) {
-
-    for (Class<?> clazz = oldDomain.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {
-      for (Field field : clazz.getDeclaredFields()) {
-        Column[] annotations = field.getAnnotationsByType(Column.class);
-        if (annotations == null || annotations.length == 0) {
-          Id[] idAnnotations = field.getAnnotationsByType(Id.class);
-          if (idAnnotations == null || idAnnotations.length == 0) {
-            continue;
-          }
-        }
-
-        String fieldName = field.getName();
-        Object newFieldValue = ReflectUtils.getFieldValue(newDomain, fieldName);
-
-        if (newFieldValue != null) {
-          ReflectUtils.setFieldValue(oldDomain, fieldName, newFieldValue);
-        }
-      }
-    }
-
-    return oldDomain;
-  }
-
-  public static <S, T> T copy(S sourceDomain, T targetDomain) {
-    
-    for (Class<?> clazz = targetDomain.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {
-      for (Field field : clazz.getDeclaredFields()) {
-        Column[] annotations = field.getAnnotationsByType(Column.class);
-        if (annotations == null || annotations.length == 0) {
-          Id[] idAnnotations = field.getAnnotationsByType(Id.class);
-          if (idAnnotations == null || idAnnotations.length == 0) {
-            continue;
-          }
-        }
-
-        String fieldName = field.getName();
-        Object sFieldValue = ReflectUtils.getFieldValue(sourceDomain, fieldName);
-
-        if (sFieldValue != null) {
-          ReflectUtils.setFieldValue(targetDomain, fieldName, sFieldValue);
-        }
-      }
-    }
-
-    return targetDomain;
-  }
-
-  public static void main(String[] args) {
-
-    Test target0 = new Test();
-    target0.setId("id0");
-    target0.setCode("code");
-    target0.setName("name");
-    target0.setDate(new Date());
-    target0.setEnabled(false);
-    target0.setStatus(1);
-
-    System.out.println("target0 == " + target0.toString());
-    System.out.println();
-
-    Test source1 = new Test();
-    // source1.setId("id1");
-    source1.setCode("code1");
-    // source1.setName("name");
-    // source1.setDate(new Date());
-    source1.setEnabled(true);
-    // source1.setStatus(1);
-    System.out.println("source1 == " + source1.toString());
-
-    Test target1 = DomainUtils.merge(source1, target0);
-    System.out.println("target0 == " + target0.toString());
-    System.out.println("target1 == " + target1.toString());
-    System.out.println();
-
-    Test source2 = new Test();
-    // source2.setId("id2");
-    source2.setCode("code2");
-    source2.setName("name2");
-    // source2.setDate(new Date());
-    // source2.setEnabled(true);
-    source2.setStatus(2);
-    System.out.println("source2 == " + source2.toString());
-
-    Test target2 = DomainUtils.merge(source2, target0);
-    System.out.println("target0 == " + target0.toString());
-    System.out.println("target2 == " + target2.toString());
-    System.out.println();
-
-
-    Test test = new Test();
-    test.setId("id0");
-    test.setCode("code");
-    test.setName("name");
-    test.setDate(new Date());
-    test.setEnabled(false);
-    test.setStatus(1);
-
-    Test2 test2 = new Test2();
-    test2 = DomainUtils.copy(test, test2);
-    System.out.println("test    == " + test.toString());
-    System.out.println("test2   == " + test2.toString());
-    System.out.println();
-
-  }
-
-}
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/ReflectUtils.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/ReflectUtils.java
deleted file mode 100644
index 3bec43d..0000000
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/ReflectUtils.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package com.supwisdom.leaveschool.user.util;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-
-/**
- * 利用反射进行操作的一个工具类
- * 
- */
-public class ReflectUtils {
-
-  /**
-   * 利用反射获取指定对象里面的指定属性
-   * 
-   * @param obj
-   *          目标对象
-   * @param fieldName
-   *          目标属性
-   * @return 目标字段
-   */
-  private static Field getField(Object obj, String fieldName) {
-    Field field = null;
-    for (Class<?> clazz = obj.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {
-      try {
-        field = clazz.getDeclaredField(fieldName);
-        break;
-      } catch (NoSuchFieldException e) {
-        // 这里不用做处理，子类没有该字段可能对应的父类有，都没有就返回null。
-      }
-    }
-    return field;
-  }
-
-  /**
-   * 利用反射获取指定对象的指定属性
-   * 
-   * @param obj
-   *          目标对象
-   * @param fieldName
-   *          目标属性
-   * @return 目标属性的值
-   */
-  public static Object getFieldValue(Object obj, String fieldName) {
-    Object result = null;
-    Field field = ReflectUtils.getField(obj, fieldName);
-    if (field != null) {
-      field.setAccessible(true);
-      try {
-        result = field.get(obj);
-      } catch (IllegalArgumentException e) {
-        e.printStackTrace();
-      } catch (IllegalAccessException e) {
-        e.printStackTrace();
-      }
-    }
-    return result;
-  }
-
-  /**
-   * 利用反射设置指定对象的指定属性为指定的值
-   * 
-   * @param obj
-   *          目标对象
-   * @param fieldName
-   *          目标属性
-   * @param fieldValue
-   *          目标值
-   */
-  public static void setFieldValue(Object obj, String fieldName, Object fieldValue) {
-    Field field = ReflectUtils.getField(obj, fieldName);
-    if (field != null) {
-      try {
-        field.setAccessible(true);
-
-        if (fieldValue instanceof String) {
-          Object value = typeConversion(field.getType(), String.valueOf(fieldValue));
-          field.set(obj, value);
-        } else {
-          field.set(obj, fieldValue);
-        }
-
-      } catch (IllegalArgumentException e) {
-        e.printStackTrace();
-      } catch (IllegalAccessException e) {
-        e.printStackTrace();
-      }
-    }
-  }
-
-  /**
-   * 反射调用对象的方法
-   * 
-   * @param obj
-   *          对象
-   * @param methodName
-   *          方法名称
-   * @param paramType
-   *          参数类型 new Class[]{int.class,double.class}
-   * @param params
-   *          参数值 new Object[]{2,3.5}
-   * @return
-   * @throws Exception
-   */
-  public static Object invokeObjMethod(Object obj, String methodName, Class<?>[] paramTypes, Object[] params)
-      throws Exception {
-    // 发现类型
-    Class<?> cls = obj.getClass();
-    // 发现方法
-    Method method = cls.getDeclaredMethod(methodName, paramTypes);
-    // 访问方法时,压制Java对访问修饰符的检查
-    method.setAccessible(true);
-    Object val = method.invoke(obj, params);
-    return val;
-  }
-
-  /**
-   * 类型转换
-   * 
-   * @param clazz
-   *          ：目标类型
-   * @param source
-   *          ：待转换对象
-   * @return ：目标对象
-   */
-  public static Object typeConversion(Class<?> clazz, String source) {
-
-    if (clazz == null) {
-      throw new IllegalArgumentException("clazz should not be null");
-    }
-
-    Object targetObj = null;
-    String nameType = clazz.getName();
-
-    if ("java.lang.Integer".equals(nameType) || "int".equals(nameType)) {
-      targetObj = Integer.valueOf(source);
-    } else if ("java.lang.String".equals(nameType) || "string".equals(nameType)) {
-      targetObj = source;
-    } else if ("java.lang.Float".equals(nameType) || "float".equals(nameType)) {
-      targetObj = Float.valueOf(source);
-    } else if ("java.lang.Double".equals(nameType) || "double".equals(nameType)) {
-      targetObj = Double.valueOf(source);
-    } else if ("java.lang.Boolean".equals(nameType) || "boolean".equals(nameType)) {
-      targetObj = Boolean.valueOf(source);
-    } else if ("java.lang.Long".equals(nameType) || "long".equals(nameType)) {
-      targetObj = Long.valueOf(source);
-    } else if ("java.lang.Short".equals(nameType) || "short".equals(nameType)) {
-      targetObj = Short.valueOf(source);
-    } else if ("java.lang.Character".equals(nameType) || "char".equals(nameType)) {
-      targetObj = source.charAt(1);
-    }
-
-    return targetObj;
-  }
-
-}
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/Test.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/Test.java
deleted file mode 100644
index ea7dced..0000000
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/Test.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package com.supwisdom.leaveschool.user.util;
-
-import java.util.Date;
-
-import javax.persistence.Column;
-
-import com.supwisdom.infras.data.jpa.domain.ABaseDomain;
-
-public class Test extends ABaseDomain {
-
-  /**
-   * 
-   */
-  private static final long serialVersionUID = 3545969960574885501L;
-  @Column
-  private String code = null;
-  @Column
-  private String name = null;
-  @Column
-  private Date date = null;
-  @Column
-  private Boolean enabled = null;
-  @Column
-  private Integer status = null;
-
-  public String getCode() {
-    return code;
-  }
-
-  public void setCode(String code) {
-    this.code = code;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public Date getDate() {
-    return date;
-  }
-
-  public void setDate(Date date) {
-    this.date = date;
-  }
-
-  public Boolean getEnabled() {
-    return enabled;
-  }
-
-  public void setEnabled(Boolean enabled) {
-    this.enabled = enabled;
-  }
-
-  public Integer getStatus() {
-    return status;
-  }
-
-  public void setStatus(Integer status) {
-    this.status = status;
-  }
-
-  @Override
-  public String toString() {
-    String s = "";
-    s+="id="+this.getId();
-    s += "&code="+String.valueOf(this.code);
-    s += "&name="+String.valueOf(this.name);
-    s += "&date="+String.valueOf(this.date);
-    s += "&enabled="+String.valueOf(this.enabled);
-    s += "&status="+String.valueOf(this.status);
-    return s;
-  }
-}
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/Test2.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/Test2.java
deleted file mode 100644
index 67917d8..0000000
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/Test2.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.supwisdom.leaveschool.user.util;
-
-import java.util.Date;
-
-import javax.persistence.Column;
-
-import com.supwisdom.infras.data.jpa.domain.ABaseDomain;
-
-public class Test2 extends ABaseDomain {
-
-  /**
-   * 
-   */
-  private static final long serialVersionUID = 3545969960574885501L;
-  @Column
-  private String name = null;
-  @Column
-  private String memo = null;
-  @Column
-  private Date date = null;
-  @Column
-  private Boolean enabled = null;
-  @Column
-  private Integer status = null;
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public String getMemo() {
-    return memo;
-  }
-
-  public void setMemo(String memo) {
-    this.memo = memo;
-  }
-
-  public Date getDate() {
-    return date;
-  }
-
-  public void setDate(Date date) {
-    this.date = date;
-  }
-
-  public Boolean getEnabled() {
-    return enabled;
-  }
-
-  public void setEnabled(Boolean enabled) {
-    this.enabled = enabled;
-  }
-
-  public Integer getStatus() {
-    return status;
-  }
-
-  public void setStatus(Integer status) {
-    this.status = status;
-  }
-
-  @Override
-  public String toString() {
-    String s = "";
-    s+="id="+this.getId();
-    //s += "&code="+String.valueOf(this.code);
-    s += "&name="+String.valueOf(this.name);
-    s += "&memo="+String.valueOf(this.memo);
-    s += "&date="+String.valueOf(this.date);
-    s += "&enabled="+String.valueOf(this.enabled);
-    s += "&status="+String.valueOf(this.status);
-    return s;
-  }
-}
