diff --git a/bff/admin/pom.xml b/bff/admin/pom.xml
index 5bc267a..ecd5261 100644
--- a/bff/admin/pom.xml
+++ b/bff/admin/pom.xml
@@ -50,6 +50,12 @@
 
 
     <dependency>
+      <groupId>org.springframework.cloud</groupId>
+      <artifactId>spring-cloud-starter-openfeign</artifactId>
+    </dependency>
+
+
+    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-webflux</artifactId>
     </dependency>
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/Application.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/Application.java
index 364ed0b..942b082 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/Application.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/Application.java
@@ -2,22 +2,27 @@
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 //import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.Bean;
 import org.springframework.web.cors.CorsConfiguration;
 import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
 import org.springframework.web.filter.CorsFilter;
 
+
+
 //import com.supwisdom.infras.online.doc.configuration.EnableInfrasOnlineDoc;
 import com.supwisdom.infras.security.configure.basic.EnableInfrasBasicApi;
 import com.supwisdom.infras.security.configure.cas.EnableInfrasCasSecurity;
 import com.supwisdom.infras.security.configure.jwt.EnableInfrasJWTApi;
 import com.supwisdom.institute.backend.common.core.transmit.annotation.EnableSimpleUserTransmit;
+import com.supwisdom.institute.backend.common.framework.exception.EnableCustomExceptionHandler;
 
 @SpringBootApplication
-//@EnableFeignClients
+@EnableFeignClients
 
 @EnableSimpleUserTransmit
+@EnableCustomExceptionHandler
 
 //@EnableInfrasOnlineDoc
 
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/model/biz/Biz.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/model/biz/Biz.java
new file mode 100644
index 0000000..f1d904e
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/model/biz/Biz.java
@@ -0,0 +1,37 @@
+package com.supwisdom.institute.backend.admin.bff.apis.model.biz;
+
+import java.util.Date;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import com.supwisdom.institute.backend.common.framework.model.ABaseModel;
+
+public class Biz extends ABaseModel {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 8755876583168251137L;
+  
+  @Getter
+  @Setter
+  private String id;
+
+  @Getter
+  @Setter
+  private String name;
+  
+  @Getter
+  @Setter
+  private Boolean bool;
+  
+  @Getter
+  @Setter
+  private Date date;
+
+  @Getter
+  @Setter
+  private Integer num;
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/BizRemoteFallbackFactory.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/BizRemoteFallbackFactory.java
new file mode 100644
index 0000000..30d312d
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/BizRemoteFallbackFactory.java
@@ -0,0 +1,61 @@
+package com.supwisdom.institute.backend.admin.bff.apis.remote.biz;
+
+import org.springframework.stereotype.Component;
+
+import com.alibaba.fastjson.JSONObject;
+import com.supwisdom.institute.backend.admin.bff.apis.model.biz.Biz;
+import com.supwisdom.institute.backend.admin.bff.remote.FallbackError;
+
+import feign.hystrix.FallbackFactory;
+
+@Component
+public class BizRemoteFallbackFactory implements FallbackFactory<BizRemoteFeignClient> {
+
+  @Override
+  public BizRemoteFeignClient create(Throwable cause) {
+    return new BizRemoteFeignClient() {
+
+      @Override
+      public JSONObject query(boolean loadAll, int pageIndex, int pageSize) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject load(String id) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject create(Biz biz) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject update(String id, Biz biz) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject delete(String id) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+      
+    };
+  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/BizRemoteFeignClient.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/BizRemoteFeignClient.java
new file mode 100644
index 0000000..cccdd8a
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/remote/biz/BizRemoteFeignClient.java
@@ -0,0 +1,49 @@
+package com.supwisdom.institute.backend.admin.bff.apis.remote.biz;
+
+import org.springframework.cloud.openfeign.FeignClient;
+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.alibaba.fastjson.JSONObject;
+import com.supwisdom.institute.backend.admin.bff.apis.model.biz.Biz;
+
+@FeignClient(
+    name = "biz-biz-remote-feign-client",
+    url = "${sw-backend-biz-api.uri}/v1/admin/biz",
+    fallbackFactory = BizRemoteFallbackFactory.class
+)
+public interface BizRemoteFeignClient {
+  
+  @RequestMapping(method = RequestMethod.GET)
+  JSONObject query(
+      @RequestParam(name = "loadAll") boolean loadAll,
+      @RequestParam(name = "pageIndex") int pageIndex,
+      @RequestParam(name = "pageSize") int pageSize
+      
+  );
+  
+  @RequestMapping(method = RequestMethod.GET, path = "/{id}")
+  JSONObject load(
+      @PathVariable(name = "id") String id
+  );
+
+  @RequestMapping(method = RequestMethod.POST)
+  JSONObject create(
+      @RequestBody Biz biz
+  );
+
+  @RequestMapping(method = RequestMethod.PUT, path = "/{id}")
+  JSONObject update(
+      @PathVariable(name = "id") String id,
+      @RequestBody Biz biz
+  );
+  
+  @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
+  JSONObject delete(
+      @PathVariable(name = "id") String id
+  );
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/service/biz/BizService.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/service/biz/BizService.java
new file mode 100644
index 0000000..7c6b8a7
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/service/biz/BizService.java
@@ -0,0 +1,30 @@
+package com.supwisdom.institute.backend.admin.bff.apis.service.biz;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.alibaba.fastjson.JSONObject;
+import com.supwisdom.institute.backend.admin.bff.apis.remote.biz.BizRemoteFeignClient;
+import com.supwisdom.institute.backend.admin.bff.apis.vo.response.biz.data.BizQueryResponseData;
+
+public class BizService {
+  
+  @Autowired
+  private BizRemoteFeignClient bizRemote;
+  
+  public BizQueryResponseData query(boolean loadAll, int pageIndex, int pageSize) {
+    
+    JSONObject jsonObject = bizRemote.query(loadAll, pageIndex, pageSize);
+    if (jsonObject == null) {
+      return null;
+    }
+    
+    if (jsonObject.getIntValue("code") == 0) {
+      JSONObject data = jsonObject.getJSONObject("data");
+      
+      return data.toJavaObject(BizQueryResponseData.class);
+    }
+    
+    return null;
+  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/vo/response/biz/data/BizQueryResponseData.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/vo/response/biz/data/BizQueryResponseData.java
new file mode 100644
index 0000000..3699ff7
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/apis/vo/response/biz/data/BizQueryResponseData.java
@@ -0,0 +1,45 @@
+package com.supwisdom.institute.backend.admin.bff.apis.vo.response.biz.data;
+
+import java.util.List;
+import java.util.Map;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import com.supwisdom.institute.backend.admin.bff.apis.model.biz.Biz;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiQueryResponseData;
+
+public class BizQueryResponseData implements IApiQueryResponseData<Biz> {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -380945463584664943L;
+
+  @Getter
+  private boolean loadAll;
+  @Getter
+  private int pageIndex;
+  @Getter
+  private int pageSize;
+  @Getter
+  private Map<String, Object> mapBean;
+  @Getter
+  private Map<String, String> orderBy;
+  
+  @Getter
+  @Setter
+  private int pageCount;
+  @Getter
+  @Setter
+  private long recordCount;
+  
+  @Getter
+  @Setter
+  private int currentItemCount;
+  
+  @Getter
+  @Setter
+  private List<Biz> items;
+  
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/Swagger2Config.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/Swagger2Config.java
new file mode 100644
index 0000000..9559532
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/configuration/Swagger2Config.java
@@ -0,0 +1,114 @@
+package com.supwisdom.institute.backend.admin.bff.configuration;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.AuthorizationScopeBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.AuthorizationScope;
+import springfox.documentation.service.BasicAuth;
+import springfox.documentation.service.Contact;
+import springfox.documentation.service.SecurityReference;
+import springfox.documentation.service.SecurityScheme;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger.web.UiConfiguration;
+import springfox.documentation.swagger.web.UiConfigurationBuilder;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+import static com.google.common.collect.Lists.*;
+
+
+//@Configuration
+//@EnableSwagger2
+public class Swagger2Config {
+
+  @Value("${swagger2.apis.basePackage:com.supwisdom.institute}")
+  private String basePackage;
+
+  @Bean
+  public Docket createRestApi() {
+    return new Docket(DocumentationType.SWAGGER_2)
+        .securitySchemes(securitySchemes())
+        .securityContexts(securityContexts())
+        .apiInfo(apiInfo())
+        .select()
+        .apis(RequestHandlerSelectors.basePackage(basePackage))
+        .paths(PathSelectors.any())
+        .build()
+        ;
+  }
+
+  private ApiInfo apiInfo() {
+    Contact contact = new Contact("Backend Admin BFF", "https://sw-backend-api.supwisdom.com/swagger-ui.html", ""); // name, url, email
+    return new ApiInfoBuilder()
+        .title("Backend Admin BFF APIs")
+        .description("管理后台 - 后端接口")
+        .termsOfServiceUrl("http://www.supwisdom.com/")
+        .contact(contact)
+        .version("1.0")
+        .build();
+  }
+  
+  private List<SecurityScheme> securitySchemes() {
+    return newArrayList(new BasicAuth("sample"));
+  }
+  
+  private List<SecurityContext> securityContexts() {
+    AuthorizationScope[] authScopes = new AuthorizationScope[1];
+    authScopes[0] = new AuthorizationScopeBuilder()
+            .scope("read")
+            .description("read access")
+            .build();
+    SecurityReference securityReference = SecurityReference.builder()
+            .reference("sample")
+            .scopes(authScopes)
+            .build();
+    
+    return newArrayList(SecurityContext.builder().securityReferences(newArrayList(securityReference)).build());
+  }
+
+  @Bean
+  public UiConfiguration uiConfig() {
+    
+    return UiConfigurationBuilder.builder().build();
+    
+//    return new UiConfiguration(null, // url
+//        "none", // docExpansion => none | list
+//        "alpha", // apiSorter => alpha
+//        "schema", // defaultModelRendering => schema
+//        UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS,
+//        false, // enableJsonEditor => true || false
+//        true, // showRequestHeaders => true | false
+//        60000L); // requestTimeout => in milliseconds, defaults to null
+//    // (uses jquery xh timeout)
+  }
+  
+  
+//  @Bean
+//  public SecurityConfiguration oauth2() {
+//      return SecurityConfigurationBuilder.builder()
+//          .clientId("common")
+//          .clientSecret("secret")
+//          .scopeSeparator(" ")
+//          .useBasicAuthenticationWithAccessCodeGrant(true)
+//          .build();
+//  }
+//  
+//  @Bean
+//  public SecurityConfiguration basic() {
+//      return SecurityConfigurationBuilder.builder()
+//          .clientId("common")
+//          .clientSecret("secret")
+//          .scopeSeparator(" ")
+//          .useBasicAuthenticationWithAccessCodeGrant(true)
+//          .build();
+//  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/remote/FallbackError.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/remote/FallbackError.java
new file mode 100644
index 0000000..d46aa8d
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/remote/FallbackError.java
@@ -0,0 +1,21 @@
+package com.supwisdom.institute.backend.admin.bff.remote;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class FallbackError {
+  
+  private FallbackError() {
+    
+  }
+  
+  public static JSONObject defaultErrorJson(Throwable cause) {
+    JSONObject error = new JSONObject();
+    
+    error.put("code", -1);
+    error.put("message", cause.getMessage());
+    error.put("error", cause.getMessage());
+    
+    return error;
+  }
+
+}
diff --git a/bff/admin/src/main/resources/application.yml b/bff/admin/src/main/resources/application.yml
index d93888b..815040b 100644
--- a/bff/admin/src/main/resources/application.yml
+++ b/bff/admin/src/main/resources/application.yml
@@ -111,4 +111,5 @@
 ##
 # server url for feign
 #
-sw-backend-api-admin.server.url: http://localhost:8081
+sw-backend-system-api.uri: http://localhost:8081
+sw-backend-biz-api.uri: http://localhost:8081
diff --git a/biz/api/pom.xml b/biz/api/pom.xml
index bcc67f2..2c5af3b 100644
--- a/biz/api/pom.xml
+++ b/biz/api/pom.xml
@@ -37,6 +37,11 @@
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter</artifactId>
     </dependency>
+    
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
 
 
     <dependency>
diff --git a/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/v1/admin/AdminBizController.java b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/v1/admin/AdminBizController.java
new file mode 100644
index 0000000..aa324c6
--- /dev/null
+++ b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/v1/admin/AdminBizController.java
@@ -0,0 +1,175 @@
+package com.supwisdom.institute.backend.biz.api.v1.admin;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.http.HttpStatus;
+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.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.supwisdom.institute.backend.biz.api.vo.request.BizCreateRequest;
+import com.supwisdom.institute.backend.biz.api.vo.request.BizQueryRequest;
+import com.supwisdom.institute.backend.biz.api.vo.request.BizUpdateRequest;
+import com.supwisdom.institute.backend.biz.api.vo.response.BizCreateResponseData;
+import com.supwisdom.institute.backend.biz.api.vo.response.BizLoadResponseData;
+import com.supwisdom.institute.backend.biz.api.vo.response.BizQueryResponseData;
+import com.supwisdom.institute.backend.biz.api.vo.response.BizRemoveResponseData;
+import com.supwisdom.institute.backend.biz.api.vo.response.BizUpdateResponseData;
+import com.supwisdom.institute.backend.biz.domain.entity.Biz;
+import com.supwisdom.institute.backend.biz.domain.exception.BizException;
+import com.supwisdom.institute.backend.biz.domain.service.BizService;
+import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
+import com.supwisdom.institute.backend.common.framework.vo.response.DefaultApiResponse;
+
+@Api(value = "BizAdminBiz", tags = { "BizAdminBiz" }, description = "Biz示例接口")
+@RestController
+@RequestMapping("/v1/admin/biz")
+public class AdminBizController {
+  
+  @Autowired
+  private BizService bizService;
+
+  /**
+   * @param bizQueryRequest
+   * @return
+   */
+  @ApiOperation(value = "查询配置列表", notes = "查询配置列表", nickname = "systemAdminBizQuery")
+  @ApiImplicitParams({
+    @ApiImplicitParam(name = "loadAll", value = "是否加载全部", required = true, dataType = "boolean", paramType = "query", defaultValue = "false"),
+    @ApiImplicitParam(name = "pageIndex", value = "分页 - 页码", required = true, dataType = "int", paramType = "query", defaultValue = "0", example = "0"),
+    @ApiImplicitParam(name = "pageSize", value = "分页 - 每页记录数", required = true, dataType = "int", paramType = "query", defaultValue = "20", example = "20"),
+    @ApiImplicitParam(name = "mapBean[deleted]", value = "查询条件 - 删除状态 (精确)", required = false, dataType = "boolean", paramType = "query"),
+    @ApiImplicitParam(name = "mapBean[categoryCode]", value = "查询条件 - 分类代码 (精确)", required = false, dataType = "string", paramType = "query"),
+    @ApiImplicitParam(name = "mapBean[categoryName]", value = "查询条件 - 分类名称 (模糊)", required = false, dataType = "string", paramType = "query"),
+    @ApiImplicitParam(name = "mapBean[name]", value = "查询条件 - 名称 (模糊)", required = false, dataType = "string", paramType = "query"),
+    @ApiImplicitParam(name = "mapBean[description]", value = "查询条件 - 描述 (模糊)", required = false, dataType = "string", paramType = "query"),
+    @ApiImplicitParam(name = "mapBean[bizKey]", value = "查询条件 - 配置Key (精确)", required = false, dataType = "string", paramType = "query"),
+  })
+  @RequestMapping(method = RequestMethod.GET, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public DefaultApiResponse<BizQueryResponseData> query(BizQueryRequest bizQueryRequest) {
+    
+    Page<Biz> page = bizService.selectPageList(
+        bizQueryRequest.isLoadAll(),
+        bizQueryRequest.getPageIndex(),
+        bizQueryRequest.getPageSize(),
+        bizQueryRequest.getMapBean(),
+        bizQueryRequest.getOrderBy());
+
+    BizQueryResponseData resp = BizQueryResponseData.of(bizQueryRequest).build(page);
+    
+    return new DefaultApiResponse<BizQueryResponseData>(resp);
+  }
+
+  /**
+   * @param id
+   * @return
+   */
+  @ApiOperation(value = "根据ID获取配置项", notes = "根据ID获取配置项", nickname="systemAdminBizLoad")
+  @RequestMapping(method = RequestMethod.GET, path = "/{id}", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public DefaultApiResponse<BizLoadResponseData> load(
+      @PathVariable("id") String id) {
+    
+    if (id == null || id.length() == 0) {
+      throw BizException.newInstance("exception.get.id.must.not.empty");
+    }
+    
+    Biz biz = bizService.selectById(id);
+    
+    if (biz == null) {
+      throw BizException.newInstance("exception.get.domain.not.exist");
+    }
+
+    BizLoadResponseData resp = BizLoadResponseData.of(biz);
+    
+    return new DefaultApiResponse<BizLoadResponseData>(resp);
+  }
+  
+  /**
+   * @param bizCreateRequest
+   * @return
+   */
+  @ApiOperation(value = "创建配置项", notes = "创建配置项", nickname = "systemAdminBizCreate")
+  @RequestMapping(method = RequestMethod.POST, produces = MimeTypeUtils.APPLICATION_JSON_VALUE, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.CREATED)
+  @ResponseBody
+  public DefaultApiResponse<BizCreateResponseData> create(
+      @RequestBody BizCreateRequest bizCreateRequest) {
+
+    // FIXME: 验证数据有效性
+
+    Biz entity = EntityUtils.copy(bizCreateRequest, new Biz());
+
+    Biz ret = bizService.insert(entity);
+
+    BizCreateResponseData resp = BizCreateResponseData.of(ret);
+
+    return new DefaultApiResponse<BizCreateResponseData>(resp);
+  }
+
+  @ApiOperation(value = "更新", notes = "更新", nickname = "systemAdminBizUpdate")
+  @RequestMapping(method = RequestMethod.PUT, path = "/{id}", produces = MimeTypeUtils.APPLICATION_JSON_VALUE, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public DefaultApiResponse<BizUpdateResponseData> update(
+      @PathVariable("id") String id,
+      @RequestBody BizUpdateRequest bizUpdateRequest) {
+
+    if (id == null || id.length() == 0) {
+      throw BizException.newInstance("exception.update.id.must.not.empty");
+    }
+
+    Biz tmp = bizService.selectById(id);
+    if (tmp == null) {
+      throw BizException.newInstance("exception.update.domain.not.exist");
+    }
+
+    Biz entity = EntityUtils.copy(bizUpdateRequest, new Biz());
+    entity.setId(id);
+
+    entity = EntityUtils.merge(tmp, entity);
+    
+    Biz ret = bizService.update(entity);
+
+    BizUpdateResponseData resp = BizUpdateResponseData.of(ret);
+    
+    return new DefaultApiResponse<BizUpdateResponseData>(resp);
+  }
+  
+  @ApiOperation(value = "删除", notes = "删除", nickname = "systemAdminBizRemove")
+  @RequestMapping(method = RequestMethod.DELETE, path = "/{id}", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public DefaultApiResponse<BizRemoveResponseData> remove(
+      @PathVariable("id") String id) {
+    
+    if (id == null || id.length() == 0) {
+      throw BizException.newInstance("exception.remove.id.must.not.empty");
+    }
+
+    Biz tmp = bizService.selectById(id);
+    if (tmp == null) {
+      throw BizException.newInstance("exception.remove.domain.not.exist");
+    }
+    
+    bizService.deleteById(id);
+    
+    BizRemoveResponseData resp = BizRemoveResponseData.of(tmp);
+    
+    return new DefaultApiResponse<BizRemoveResponseData>(resp);
+  }
+
+}
diff --git a/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/request/BizCreateRequest.java b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/request/BizCreateRequest.java
new file mode 100644
index 0000000..e6b6f0e
--- /dev/null
+++ b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/request/BizCreateRequest.java
@@ -0,0 +1,16 @@
+package com.supwisdom.institute.backend.biz.api.vo.request;
+
+import com.supwisdom.institute.backend.biz.domain.entity.Biz;
+import com.supwisdom.institute.backend.common.framework.vo.request.IApiCreateRequest;
+
+/**
+ * @author loie
+ */
+public class BizCreateRequest extends Biz implements IApiCreateRequest {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -3512866840130579457L;
+
+}
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/request/ConfigQueryRequest.java b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/request/BizQueryRequest.java
similarity index 74%
copy from system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/request/ConfigQueryRequest.java
copy to biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/request/BizQueryRequest.java
index e83083b..7f60870 100644
--- a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/request/ConfigQueryRequest.java
+++ b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/request/BizQueryRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.system.domain.vo.request;
+package com.supwisdom.institute.backend.biz.api.vo.request;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -12,29 +12,33 @@
 /**
  * @author loie
  */
-public class ConfigQueryRequest implements IApiQueryRequest {
+public class BizQueryRequest implements IApiQueryRequest {
 
   /**
    * 
    */
-  private static final long serialVersionUID = -1033044092932525382L;
+  private static final long serialVersionUID = -4345168235529389375L;
 
   @Getter
   @Setter
   private boolean loadAll = false;
+
   @Getter
   @Setter
   private int pageIndex = 0;
+
   @Getter
   @Setter
   private int pageSize = 20;
+
   @Getter
   @Setter
   @ApiModelProperty(hidden = true)
   private Map<String, Object> mapBean;
+
   @Getter
   @Setter
   @ApiModelProperty(hidden = true)
   private Map<String, String> orderBy;
-  
+
 }
diff --git a/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/request/BizUpdateRequest.java b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/request/BizUpdateRequest.java
new file mode 100644
index 0000000..74973ce
--- /dev/null
+++ b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/request/BizUpdateRequest.java
@@ -0,0 +1,23 @@
+package com.supwisdom.institute.backend.biz.api.vo.request;
+
+import com.supwisdom.institute.backend.biz.domain.entity.Biz;
+import com.supwisdom.institute.backend.common.framework.vo.request.IApiUpdateRequest;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author loie
+ */
+public class BizUpdateRequest extends Biz implements IApiUpdateRequest {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 6002556449210326472L;
+
+  @Getter
+  @Setter
+  private String id;
+
+}
diff --git a/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizCreateResponseData.java b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizCreateResponseData.java
new file mode 100644
index 0000000..9a91fce
--- /dev/null
+++ b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizCreateResponseData.java
@@ -0,0 +1,34 @@
+package com.supwisdom.institute.backend.biz.api.vo.response;
+
+import com.supwisdom.institute.backend.biz.domain.entity.Biz;
+import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiCreateResponseData;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author loie
+ */
+public class BizCreateResponseData extends Biz implements IApiCreateResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -7081539211184618366L;
+
+  @Getter
+  @Setter
+  private String id;
+
+  private BizCreateResponseData() {
+
+  }
+
+  public static BizCreateResponseData of(Biz entity) {
+    BizCreateResponseData data = new BizCreateResponseData();
+
+    return EntityUtils.copy(entity, data);
+  }
+
+}
diff --git a/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizLoadResponseData.java b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizLoadResponseData.java
new file mode 100644
index 0000000..84c2864
--- /dev/null
+++ b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizLoadResponseData.java
@@ -0,0 +1,34 @@
+package com.supwisdom.institute.backend.biz.api.vo.response;
+
+import com.supwisdom.institute.backend.biz.domain.entity.Biz;
+import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiLoadResponseData;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author loie
+ */
+public class BizLoadResponseData extends Biz implements IApiLoadResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -921871332091924834L;
+  
+  @Getter
+  @Setter
+  private String id;
+  
+  private BizLoadResponseData() {
+    
+  }
+  
+  public static BizLoadResponseData of(Biz entity) {
+    BizLoadResponseData data = new BizLoadResponseData();
+    
+    return EntityUtils.copy(entity, data);
+  }
+
+}
diff --git a/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizQueryResponseData.java b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizQueryResponseData.java
new file mode 100644
index 0000000..3c19ad1
--- /dev/null
+++ b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizQueryResponseData.java
@@ -0,0 +1,80 @@
+package com.supwisdom.institute.backend.biz.api.vo.response;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.data.domain.Page;
+
+import com.supwisdom.institute.backend.biz.api.vo.request.BizQueryRequest;
+import com.supwisdom.institute.backend.biz.domain.entity.Biz;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiQueryResponseData;
+
+/**
+ * @author loie
+ */
+public class BizQueryResponseData implements IApiQueryResponseData<Biz> {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 5706417972093485886L;
+  
+  private BizQueryResponseData(boolean loadAll, int pageIndex, int pageSize, Map<String, Object> mapBean, Map<String, String> orderBy) {
+    this.loadAll = loadAll;
+    this.pageIndex = pageIndex;
+    this.pageSize = pageSize;
+    this.mapBean = mapBean;
+    this.orderBy = orderBy;
+  }
+
+  public static BizQueryResponseData of(BizQueryRequest queryRequest) {
+    BizQueryResponseData data = new BizQueryResponseData(
+        queryRequest.isLoadAll(), 
+        queryRequest.getPageIndex(), 
+        queryRequest.getPageSize(), 
+        queryRequest.getMapBean(), 
+        queryRequest.getOrderBy()
+    );
+    
+    return data;
+  }
+  
+  public BizQueryResponseData build(Page<Biz> page) {
+    this.currentItemCount = page.getNumberOfElements();
+    this.pageCount = page.getTotalPages();
+    this.recordCount = page.getTotalElements();
+    this.items = page.getContent();
+
+    return this;
+  }
+
+  @Getter
+  private boolean loadAll;
+  @Getter
+  private int pageIndex;
+  @Getter
+  private int pageSize;
+  @Getter
+  private Map<String, Object> mapBean;
+  @Getter
+  private Map<String, String> orderBy;
+  
+  @Getter
+  @Setter
+  private int pageCount;
+  @Getter
+  @Setter
+  private long recordCount;
+  
+  @Getter
+  @Setter
+  private int currentItemCount;
+  
+  @Getter
+  @Setter
+  private List<Biz> items;
+  
+}
diff --git a/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizRemoveResponseData.java b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizRemoveResponseData.java
new file mode 100644
index 0000000..0d3f019
--- /dev/null
+++ b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizRemoveResponseData.java
@@ -0,0 +1,34 @@
+package com.supwisdom.institute.backend.biz.api.vo.response;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import com.supwisdom.institute.backend.biz.domain.entity.Biz;
+import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiRemoveResponseData;
+
+/**
+ * @author loie
+ */
+public class BizRemoveResponseData implements IApiRemoveResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 7920962172100289008L;
+
+  @Getter
+  @Setter
+  private String id;
+
+  private BizRemoveResponseData() {
+
+  }
+
+  public static BizRemoveResponseData of(Biz entity) {
+    BizRemoveResponseData data = new BizRemoveResponseData();
+
+    return EntityUtils.copy(entity, data);
+  }
+
+}
diff --git a/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizUpdateResponseData.java b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizUpdateResponseData.java
new file mode 100644
index 0000000..19bef62
--- /dev/null
+++ b/biz/api/src/main/java/com/supwisdom/institute/backend/biz/api/vo/response/BizUpdateResponseData.java
@@ -0,0 +1,34 @@
+package com.supwisdom.institute.backend.biz.api.vo.response;
+
+import com.supwisdom.institute.backend.biz.domain.entity.Biz;
+import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiUpdateResponseData;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author loie
+ */
+public class BizUpdateResponseData extends Biz implements IApiUpdateResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 4502820318022107903L;
+  
+  @Getter
+  @Setter
+  private String id;
+
+  private BizUpdateResponseData() {
+    
+  }
+  
+  public static BizUpdateResponseData of(Biz entity) {
+    BizUpdateResponseData data = new BizUpdateResponseData();
+    
+    return EntityUtils.copy(entity, data);
+  }
+  
+}
diff --git a/biz/domain/src/main/java/com/supwisdom/institute/backend/biz/domain/entity/Biz.java b/biz/domain/src/main/java/com/supwisdom/institute/backend/biz/domain/entity/Biz.java
new file mode 100644
index 0000000..553cc05
--- /dev/null
+++ b/biz/domain/src/main/java/com/supwisdom/institute/backend/biz/domain/entity/Biz.java
@@ -0,0 +1,43 @@
+package com.supwisdom.institute.backend.biz.domain.entity;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import com.supwisdom.institute.backend.common.framework.entity.ABaseEntity;
+
+@Entity
+@Table(name = "TB_BIZ")
+public class Biz extends ABaseEntity {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 5503233707196628811L;
+  
+  @Getter
+  @Setter
+  @Column(name = "NAME")
+  private String name;
+  
+  @Getter
+  @Setter
+  @Column(name = "BOOL")
+  private Boolean bool;
+  
+  @Getter
+  @Setter
+  @Column(name = "DATE")
+  private Date date;
+
+  @Getter
+  @Setter
+  @Column(name = "NUM")
+  private Integer num;
+
+}
diff --git a/biz/domain/src/main/java/com/supwisdom/institute/backend/biz/domain/exception/BizException.java b/biz/domain/src/main/java/com/supwisdom/institute/backend/biz/domain/exception/BizException.java
new file mode 100644
index 0000000..2ae5778
--- /dev/null
+++ b/biz/domain/src/main/java/com/supwisdom/institute/backend/biz/domain/exception/BizException.java
@@ -0,0 +1,12 @@
+package com.supwisdom.institute.backend.biz.domain.exception;
+
+import com.supwisdom.institute.backend.common.framework.exception.BaseException;
+
+public class BizException extends BaseException {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 8112079911386045865L;
+
+}
diff --git a/biz/domain/src/main/java/com/supwisdom/institute/backend/biz/domain/repo/BizRepository.java b/biz/domain/src/main/java/com/supwisdom/institute/backend/biz/domain/repo/BizRepository.java
new file mode 100644
index 0000000..cfeae8f
--- /dev/null
+++ b/biz/domain/src/main/java/com/supwisdom/institute/backend/biz/domain/repo/BizRepository.java
@@ -0,0 +1,114 @@
+package com.supwisdom.institute.backend.biz.domain.repo;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Order;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.StringUtils;
+
+import com.supwisdom.institute.backend.biz.domain.entity.Biz;
+import com.supwisdom.institute.backend.common.framework.repo.BaseJpaRepository;
+import com.supwisdom.institute.backend.common.util.DateUtil;
+import com.supwisdom.institute.backend.common.util.MapBeanUtils;
+
+@Repository
+public interface BizRepository extends BaseJpaRepository<Biz> {
+  
+  default Specification<Biz> convertSpecification(Map<String, Object> mapBean) {
+
+    Specification<Biz> spec = new Specification<Biz>() {
+
+      /**
+       * 
+       */
+      private static final long serialVersionUID = -1820403213133310124L;
+
+      @Override
+      public Predicate toPredicate(Root<Biz> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+        List<Predicate> predicates = new ArrayList<>();
+        
+        if (mapBean != null) {
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "name"))) {
+            predicates.add(criteriaBuilder.like(root.get("name"), MapBeanUtils.getString(mapBean, "name")));
+          }
+
+          if (!StringUtils.isEmpty(MapBeanUtils.getBoolean(mapBean, "bool"))) {
+            predicates.add(criteriaBuilder.equal(root.get("bool"), MapBeanUtils.getBoolean(mapBean, "bool")));
+          }
+          
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "dateBegin"))) {
+            String grantTimeBegin = MapBeanUtils.getString(mapBean, "dateBegin");
+            Date d = DateUtil.parseDate(grantTimeBegin+" 00:00:00", "yyyy-MM-dd HH:mm:ss");
+            
+            if (d != null) {
+              predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("date"), d));
+            }
+          }
+
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "dateEnd"))) {
+            String grantTimeEnd = MapBeanUtils.getString(mapBean, "dateEnd");
+            Date d = DateUtil.parseDate(grantTimeEnd+" 23:59:59", "yyyy-MM-dd HH:mm:ss");
+            
+            if (d != null) {
+              predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get("date"), d));
+            }
+          }
+        }
+        
+        return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
+      }
+      
+    };
+    
+    return spec;
+  }
+  
+  @Override
+  public default Page<Biz> selectPageList(boolean loadAll, int pageIndex, int pageSize, Map<String, Object> mapBean, Map<String, String> orderBy) {
+    
+    Specification<Biz> spec = this.convertSpecification(mapBean);
+
+    if (loadAll) {
+      pageIndex = 0;
+      pageSize = Integer.MAX_VALUE;
+    }
+    
+    Sort sort = new Sort(Sort.Direction.DESC, "date");  // Sort.unsorted
+
+    if (orderBy != null) {
+      List<Order> orders = new ArrayList<>();
+      
+      orderBy.forEach((k, v) -> {
+        if ("asc".equalsIgnoreCase(v)) {
+          Order order = Order.asc(k);
+          orders.add(order);
+        } else if ("desc".equalsIgnoreCase(v)) {
+          Order order = Order.desc(k);
+          orders.add(order);
+        } else {
+          Order order = Order.by(k);
+          orders.add(order);
+        }
+      });
+      
+      sort = Sort.by(orders);
+    }
+
+    PageRequest pageRequest = PageRequest.of(pageIndex, pageSize, sort);
+    
+    return this.findAll(spec, pageRequest);
+  }
+
+}
diff --git a/biz/domain/src/main/java/com/supwisdom/institute/backend/biz/domain/service/BizService.java b/biz/domain/src/main/java/com/supwisdom/institute/backend/biz/domain/service/BizService.java
new file mode 100644
index 0000000..43f1dd7
--- /dev/null
+++ b/biz/domain/src/main/java/com/supwisdom/institute/backend/biz/domain/service/BizService.java
@@ -0,0 +1,21 @@
+package com.supwisdom.institute.backend.biz.domain.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.supwisdom.institute.backend.biz.domain.entity.Biz;
+import com.supwisdom.institute.backend.biz.domain.repo.BizRepository;
+import com.supwisdom.institute.backend.common.framework.service.ABaseService;
+
+@Service
+public class BizService extends ABaseService<Biz, BizRepository> {
+  
+  @Autowired
+  private BizRepository bizRepository;
+
+  @Override
+  public BizRepository getRepo() {
+    return bizRepository;
+  }
+
+}
diff --git a/common/core/pom.xml b/common/core/pom.xml
index d535132..0193355 100644
--- a/common/core/pom.xml
+++ b/common/core/pom.xml
@@ -36,6 +36,7 @@
     <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
+      <optional>true</optional>
     </dependency>
 
     <dependency>
diff --git a/common/core/src/main/java/com/supwisdom/institute/backend/common/core/transmit/user/UserContext.java b/common/core/src/main/java/com/supwisdom/institute/backend/common/core/transmit/user/UserContext.java
index 00f2e43..13f4d25 100644
--- a/common/core/src/main/java/com/supwisdom/institute/backend/common/core/transmit/user/UserContext.java
+++ b/common/core/src/main/java/com/supwisdom/institute/backend/common/core/transmit/user/UserContext.java
@@ -17,5 +17,17 @@
   public static void setUser(User value) {
     user.set(value);
   }
+  
+  
+  
+  public static String getUsername() {
+    User u = user.get();
+    
+    if (u != null) {
+      return u.getUsername();
+    }
+    
+    return null;
+  }
 
 }
diff --git a/common/framework/pom.xml b/common/framework/pom.xml
index 328b83c..18d0ac5 100644
--- a/common/framework/pom.xml
+++ b/common/framework/pom.xml
@@ -44,6 +44,11 @@
 
     <dependency>
       <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-jpa</artifactId>
       <optional>true</optional>
     </dependency>
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/BaseException.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/BaseException.java
index ee21f7a..5f10b42 100644
--- a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/BaseException.java
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/BaseException.java
@@ -6,11 +6,8 @@
    * 
    */
   private static final long serialVersionUID = 2278568118369300446L;
-
-  /**
-   * 异常信息
-   */
-  protected String msg;
+  
+  public static final int DEFAULT_CODE = -1;
 
   /**
    * 具体异常码
@@ -20,7 +17,6 @@
   public BaseException(int code, String msgFormat, Object... args) {
       super(String.format(msgFormat, args));
       this.code = code;
-      this.msg = String.format(msgFormat, args);
   }
 
   public BaseException() {
@@ -39,10 +35,6 @@
       super(message);
   }
 
-  public String getMsg() {
-      return msg;
-  }
-
   public int getCode() {
       return code;
   }
@@ -55,11 +47,11 @@
    * @return
    */
   @Deprecated
-  public BaseException newInstance(String msgFormat, Object... args) {
-      return new BaseException(this.code, msgFormat, args);
+  public static BaseException newInstance(String msgFormat, Object... args) {
+      return new BaseException(DEFAULT_CODE, msgFormat, args);
   }
   
-  public BaseException newInstance(int code, String msgFormat, Object... args) {
+  public static BaseException newInstance(int code, String msgFormat, Object... args) {
     return new BaseException(code, msgFormat, args);
   }
 
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/EnableCustomExceptionHandler.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/EnableCustomExceptionHandler.java
new file mode 100644
index 0000000..28553c6
--- /dev/null
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/EnableCustomExceptionHandler.java
@@ -0,0 +1,17 @@
+package com.supwisdom.institute.backend.common.framework.exception;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.springframework.context.annotation.Import;
+
+@Documented
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Import({ExceptionConfiguration.class})
+public @interface EnableCustomExceptionHandler {
+
+}
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/ErrorResponse.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/ErrorResponse.java
new file mode 100644
index 0000000..e0e4235
--- /dev/null
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/ErrorResponse.java
@@ -0,0 +1,38 @@
+package com.supwisdom.institute.backend.common.framework.exception;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiResponseData;
+
+public class ErrorResponse implements IApiResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 5810078993746894780L;
+
+  /**
+   * 异常信息
+   */
+  @Getter
+  @Setter
+  private String message;
+
+  /**
+   * 具体异常码
+   */
+  @Getter
+  @Setter
+  private int code = -1;
+
+  private ErrorResponse(int code, String msgFormat, Object... args) {
+    this.code = code;
+    this.message = String.format(msgFormat, args);
+  }
+
+  public static ErrorResponse of(int code, String msgFormat, Object... args) {
+    return new ErrorResponse(code, msgFormat, args);
+  }
+
+}
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/ExceptionConfiguration.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/ExceptionConfiguration.java
new file mode 100644
index 0000000..845e935
--- /dev/null
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/ExceptionConfiguration.java
@@ -0,0 +1,14 @@
+package com.supwisdom.institute.backend.common.framework.exception;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class ExceptionConfiguration {
+  
+  @Bean
+  public GlobalExceptionHandler globalExceptionHandler() {
+    return new GlobalExceptionHandler();
+  }
+
+}
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/GlobalExceptionHandler.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..d32199c
--- /dev/null
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/exception/GlobalExceptionHandler.java
@@ -0,0 +1,30 @@
+package com.supwisdom.institute.backend.common.framework.exception;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+  
+  @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
+  @ExceptionHandler({Exception.class})
+  public ErrorResponse DefaultExceptionHandler(Exception e) {
+    
+    ErrorResponse error = ErrorResponse.of(BaseException.DEFAULT_CODE, e.getMessage());
+    
+    return error;
+  }
+  
+  
+  @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
+  @ExceptionHandler({BaseException.class})
+  public ErrorResponse BaseExceptionHandler(BaseException e) {
+    
+    ErrorResponse error = ErrorResponse.of(e.getCode(), e.getMessage());
+    
+    return error;
+  }
+  
+}
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/modal/ABaseModal.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/modal/ABaseModal.java
deleted file mode 100644
index 3b8d6d3..0000000
--- a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/modal/ABaseModal.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.supwisdom.institute.backend.common.framework.modal;
-
-public abstract class ABaseModal implements IModal {
-
-  /**
-   * 
-   */
-  private static final long serialVersionUID = 8717041105592152819L;
-
-}
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/modal/IModal.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/modal/IModal.java
deleted file mode 100644
index cb6f72b..0000000
--- a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/modal/IModal.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.supwisdom.institute.backend.common.framework.modal;
-
-import java.io.Serializable;
-
-public interface IModal extends Serializable {
-
-}
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/model/ABaseModel.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/model/ABaseModel.java
new file mode 100644
index 0000000..efa3e25
--- /dev/null
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/model/ABaseModel.java
@@ -0,0 +1,10 @@
+package com.supwisdom.institute.backend.common.framework.model;
+
+public abstract class ABaseModel implements IModel {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 8717041105592152819L;
+
+}
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/model/IModel.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/model/IModel.java
new file mode 100644
index 0000000..a6258d3
--- /dev/null
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/model/IModel.java
@@ -0,0 +1,7 @@
+package com.supwisdom.institute.backend.common.framework.model;
+
+import java.io.Serializable;
+
+public interface IModel extends Serializable {
+
+}
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/ABaseJpaRepositoryImpl.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/ABaseJpaRepository.java
similarity index 67%
rename from common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/ABaseJpaRepositoryImpl.java
rename to common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/ABaseJpaRepository.java
index 32e0e33..d787e59 100644
--- a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/ABaseJpaRepositoryImpl.java
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/ABaseJpaRepository.java
@@ -13,21 +13,22 @@
 import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
 import org.springframework.data.repository.NoRepositoryBean;
 
+import com.supwisdom.institute.backend.common.core.transmit.user.UserContext;
 import com.supwisdom.institute.backend.common.framework.entity.ABaseEntity;
 
 @Transactional
 @NoRepositoryBean
-public class ABaseJpaRepositoryImpl<E extends ABaseEntity> extends SimpleJpaRepository<E, String> implements BaseJpaRepository<E> {
+public class ABaseJpaRepository<E extends ABaseEntity> extends SimpleJpaRepository<E, String> implements BaseJpaRepository<E> {
 
   @SuppressWarnings("unused")
   private final EntityManager em;
 
-  public ABaseJpaRepositoryImpl(Class<E> domainClass, EntityManager em) {
+  public ABaseJpaRepository(Class<E> domainClass, EntityManager em) {
     super(domainClass, em);
     this.em = em;
   }
 
-  public ABaseJpaRepositoryImpl(JpaEntityInformation<E, String> information, EntityManager em) {
+  public ABaseJpaRepository(JpaEntityInformation<E, String> information, EntityManager em) {
     super(information, em);
     this.em = em;
   }
@@ -67,7 +68,9 @@
     if (entity.getDeleted() == null) {
       entity.setDeleted(false);
     }
-    //entity.setAddAccount(AuthUtil.getRemoteUser()); // FIXME: setAddAccount
+    if (entity.getAddAccount() == null) {
+      entity.setAddAccount(UserContext.getUsername());
+    }
     if (entity.getAddTime() == null) {
       entity.setAddTime(Calendar.getInstance().getTime());
     }
@@ -79,7 +82,9 @@
 
   public E update(E entity) {
 
-    //entity.setEditAccount(AuthUtil.getRemoteUser()); // FIXME: setEditAccount
+    if (entity.getEditAccount() == null) {
+      entity.setEditAccount(UserContext.getUsername());
+    }
     if (entity.getEditTime() == null) {
       entity.setEditTime(Calendar.getInstance().getTime());
     }
@@ -88,5 +93,22 @@
 
     return e;
   }
+  
+  public E remove(E entity) {
+    
+    if (entity.getDeleted() == null) {
+      entity.setDeleted(true);
+    }
+    if (entity.getDeleteAccount() == null) {
+      entity.setDeleteAccount(UserContext.getUsername());
+    }
+    if (entity.getDeleteTime() == null) {
+      entity.setDeleteTime(Calendar.getInstance().getTime());
+    }
+    
+    E e = this.save(entity);
+    
+    return e;
+  }
 
 }
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/BaseJpaRepository.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/BaseJpaRepository.java
index 3451705..ef0a932 100644
--- a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/BaseJpaRepository.java
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/BaseJpaRepository.java
@@ -10,6 +10,7 @@
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.repository.NoRepositoryBean;
 
+import com.supwisdom.institute.backend.common.core.transmit.user.UserContext;
 import com.supwisdom.institute.backend.common.framework.entity.ABaseEntity;
 import com.supwisdom.institute.backend.common.util.UUIDUtils;
 
@@ -71,7 +72,7 @@
       entity.setDeleted(false);
     }
     if (entity.getAddAccount() == null) {
-      //entity.setAddAccount(AuthUtil.getRemoteUser()); // FIXME: setAddAccount
+      entity.setAddAccount(UserContext.getUsername());
     }
     if (entity.getAddTime() == null) {
       entity.setAddTime(Calendar.getInstance().getTime());
@@ -85,7 +86,7 @@
   public default E update(E entity) {
 
     if (entity.getEditAccount() == null) {
-      //entity.setEditAccount(AuthUtil.getRemoteUser()); // FIXME: setEditAccount
+      entity.setEditAccount(UserContext.getUsername());
     }
     if (entity.getEditTime() == null) {
       entity.setEditTime(Calendar.getInstance().getTime());
@@ -96,14 +97,13 @@
     return e;
   }
   
-  
   public default E remove(E entity) {
     
     if (entity.getDeleted() == null) {
       entity.setDeleted(true);
     }
     if (entity.getDeleteAccount() == null) {
-      //entity.setDeleteAccount(AuthUtil.getRemoteUser()); // FIXME: setDeleteAccount
+      entity.setDeleteAccount(UserContext.getUsername());
     }
     if (entity.getDeleteTime() == null) {
       entity.setDeleteTime(Calendar.getInstance().getTime());
@@ -114,7 +114,6 @@
     return e;
   }
   
-  
   public default void delete(String id) {
     
     this.deleteById(id);
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/resultTransformer/IgnoreCaseResultTransformer.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/resultTransformer/IgnoreCaseResultTransformer.java
index ee622bc..0736f3e 100644
--- a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/resultTransformer/IgnoreCaseResultTransformer.java
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/resultTransformer/IgnoreCaseResultTransformer.java
@@ -10,63 +10,66 @@
 import java.util.List;
 
 /**
- * 
  * 修正hibernate返回自定义pojo类型时找不到属性的BUG
  * 主要发生在使用oracle或高版本的mysql时，查询返回的字段默认是大写的(除非SQL中指定了别名)，这导致返回自定义pojo类型时会报找不到属性的错误，该类用于修正此BUG。
- * 使用该类时SQL返回的字段名大小写或者带"_"都会被忽略，如数据库字段为 USER_NAME，自定义pojo的属性名为username就可以使用
- * 
- * @author feng*/
+ * 使用该类时SQL返回的字段名大小写或者带"_"都会被忽略，如数据库字段为 USER_NAME，自定义pojo的属性名为username就可以使用  
+ * 
+ * @author feng
+ */
 public class IgnoreCaseResultTransformer implements ResultTransformer {
-        private static final long serialVersionUID = -3779317531110592988L;
-        private final Class<?> resultClass;
-        private Field[] fields;
-        private List<Class> types = Lists.newArrayList();
-        public IgnoreCaseResultTransformer(final Class<?> resultClass) {
-            this.resultClass = resultClass;
-            List<Field> list = Lists.newArrayList();
-            for (Class<?> superClass = resultClass; superClass != Object.class; superClass = superClass.getSuperclass()) {
-                Field[] fs = superClass.getDeclaredFields();
-                List<Field> newFs = Lists.newArrayList();
-                for(int i=0;i<fs.length;i++){
-                    if(fs[i].getName().equals("serialVersionUID")){
-                        continue;
-                    }
-                    types.add(fs[i].getType());
-                    ReflectUtils.makeAccessible(fs[i]);
-                    newFs.add(fs[i]);
-                }
-                list.addAll(newFs);
-            }
-            this.fields = list.toArray(new Field[list.size()]);
+  private static final long serialVersionUID = -3779317531110592988L;
+  private final Class<?> resultClass;
+  private Field[] fields;
+  private List<Class<?>> types = Lists.newArrayList();
+
+  public IgnoreCaseResultTransformer(final Class<?> resultClass) {
+    this.resultClass = resultClass;
+    List<Field> list = Lists.newArrayList();
+    for (Class<?> superClass = resultClass; superClass != Object.class; superClass = superClass.getSuperclass()) {
+      Field[] fs = superClass.getDeclaredFields();
+      List<Field> newFs = Lists.newArrayList();
+      for (int i = 0; i < fs.length; i++) {
+        if (fs[i].getName().equals("serialVersionUID")) {
+          continue;
         }
-         /**
-      * aliases为每条记录的数据库字段名,ORACLE字段名默认为大写
-      * tupe为与aliases对应的字段的值
-      */
-         @Override
-         public Object transformTuple(final Object[] tuple, final String[] aliases) {
-           Object result;
-             try {
-                result = this.resultClass.newInstance();
-                    for (int i = 0; i < aliases.length; i++) {
-                        for (int j=0;j<this.fields.length;j++) {
-                          String fieldName = this.fields[j].getName();
-                           //数据库字段带下划线的时候也能保证使用，如数据库字段为 USER_NAME，自定义pojo的属性名为username就可以使用
-                           if (fieldName.equalsIgnoreCase(aliases[i].replaceAll("_", ""))) {
-                               ReflectUtils.invokeSetter(result,fieldName,tuple[i],this.types.get(j));
-//                               beanUtilsBean.setProperty(result, fieldName, tuple[i]);
-                               break;
-                                   }
-                          }
-                  }
-           } catch (Exception e) {
-               throw new HibernateException("Could not instantiate resultclass: " + this.resultClass.getName(), e);
-           }
-          return result;
+        types.add(fs[i].getType());
+        ReflectUtils.makeAccessible(fs[i]);
+        newFs.add(fs[i]);
       }
-      @Override
-      @SuppressWarnings("rawtypes")
-      public List transformList(final List collection) {
-           return collection;
+      list.addAll(newFs);
+    }
+    this.fields = list.toArray(new Field[list.size()]);
+  }
+
+  /**
+   * aliases为每条记录的数据库字段名,ORACLE字段名默认为大写
+   * tupe为与aliases对应的字段的值      
+   */
+  @Override
+  public Object transformTuple(final Object[] tuple, final String[] aliases) {
+    Object result;
+    try {
+      result = this.resultClass.newInstance();
+      for (int i = 0; i < aliases.length; i++) {
+        for (int j = 0; j < this.fields.length; j++) {
+          String fieldName = this.fields[j].getName();
+          // 数据库字段带下划线的时候也能保证使用，如数据库字段为 USER_NAME，自定义pojo的属性名为username就可以使用
+          if (fieldName.equalsIgnoreCase(aliases[i].replaceAll("_", ""))) {
+            ReflectUtils.invokeSetter(result, fieldName, tuple[i], this.types.get(j));
+            // beanUtilsBean.setProperty(result, fieldName, tuple[i]);
+            break;
+          }
+        }
       }
-}
\ No newline at end of file
+    } catch (Exception e) {
+      throw new HibernateException("Could not instantiate resultclass: " + this.resultClass.getName(), e);
+    }
+    return result;
+  }
+
+  @Override
+  @SuppressWarnings("rawtypes")
+  public List transformList(final List collection) {
+    return collection;
+  }
+}
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/AbstractApiResponse.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/AbstractApiResponse.java
index 8e979e3..20de33c 100644
--- a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/AbstractApiResponse.java
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/AbstractApiResponse.java
@@ -1,6 +1,5 @@
 package com.supwisdom.institute.backend.common.framework.vo.response;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiResponseData;
 
 public abstract class AbstractApiResponse<T extends IApiResponseData> implements IApiResponse<T> {
@@ -10,17 +9,6 @@
    */
   private static final long serialVersionUID = 846108786006850165L;
   
-  @JsonIgnore
-  @Deprecated
-  protected boolean acknowleged = true;
-
-  @Override
-  @JsonIgnore
-  @Deprecated
-  public boolean isAcknowleged() {
-    return acknowleged;
-  }
-  
   protected int code = 0;
   protected String message = null;
   
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/DefaultApiResponse.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/DefaultApiResponse.java
index 72ac7e2..5ea45c5 100644
--- a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/DefaultApiResponse.java
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/DefaultApiResponse.java
@@ -16,37 +16,14 @@
     return data;
   }
 
-//  public void setData(T data) {
-//    this.data = data;
-//  }
-//
-//  public DefaultApiResponse() {
-//
-//  }
-
   public DefaultApiResponse(T data) {
     this(0, null, data);
   }
 
-  @Deprecated
-  public DefaultApiResponse(boolean acknowleged, T data) {
-    super.acknowleged = acknowleged;
-    if (super.acknowleged == false) {
-      super.code = -1;
-      super.message = "未知错误";
-    }
-    
-    this.data = data;
-  }
-  
   public DefaultApiResponse(int code, String message, T data) {
     super.code = code;
     super.message = message;
     
-    if (code != 0) {
-      super.acknowleged = false;
-    }
-    
     this.data = data;
   }
 
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/IApiResponse.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/IApiResponse.java
index 487183a..f8f2573 100644
--- a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/IApiResponse.java
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/IApiResponse.java
@@ -2,15 +2,10 @@
 
 import java.io.Serializable;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiResponseData;
 
 public interface IApiResponse<T extends IApiResponseData> extends Serializable {
   
-  @JsonIgnore
-  @Deprecated
-  boolean isAcknowleged();
-  
   int getCode();
   
   String getMessage();
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/data/IApiQueryResponseData.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/data/IApiQueryResponseData.java
index 4e78c10..5789a96 100644
--- a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/data/IApiQueryResponseData.java
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/vo/response/data/IApiQueryResponseData.java
@@ -1,11 +1,10 @@
 package com.supwisdom.institute.backend.common.framework.vo.response.data;
 
+import java.io.Serializable;
 import java.util.List;
 import java.util.Map;
 
-import com.supwisdom.institute.backend.common.framework.entity.ABaseEntity;
-
-public interface IApiQueryResponseData<E extends ABaseEntity> extends IApiResponseData {
+public interface IApiQueryResponseData<E extends Serializable> extends IApiResponseData {
   
   /**
    * 当前页码
diff --git a/common/utils/src/main/java/com/supwisdom/institute/backend/common/util/MapBeanUtils.java b/common/utils/src/main/java/com/supwisdom/institute/backend/common/util/MapBeanUtils.java
index 0a5f50f..136f9de 100644
--- a/common/utils/src/main/java/com/supwisdom/institute/backend/common/util/MapBeanUtils.java
+++ b/common/utils/src/main/java/com/supwisdom/institute/backend/common/util/MapBeanUtils.java
@@ -1,13 +1,5 @@
 package com.supwisdom.institute.backend.common.util;
 
-import com.google.common.collect.Lists;
-
-import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
 import java.util.Map;
 
 public class MapBeanUtils {
@@ -155,72 +147,72 @@
     return defaultValue;
   }
 
-  /**
-   * 获取 mapBean 中 key 的 value，若不存在，则返回 -1L
-   *
-   * @param mapBean
-   * @param key
-   * @return
-   */
-  public static List getList(Map<String, Object> mapBean, String key) {
-
-    return getList(mapBean, key, Lists.newArrayList());
-  }
-
-  /**
-   * 获取 mapBean 中 key 的 value，若不存在，则返回 defaultValue
-   *
-   * @param mapBean
-   * @param key
-   * @param defaultValue
-   * @return
-   */
-  public static List getList(Map<String, Object> mapBean, String key, List defaultValue) {
-
-    if (containsValue(mapBean, key)) {
-      List l = (List)mapBean.get(key);
-      return l == null ? defaultValue : l;
-    }
-
-    return defaultValue;
-  }
-
-  /**
-   * 将一个 Map 对象转化为一个 JavaBean
-   * @param obj 要转化的对象
-   * @param map 包含属性值的 map
-   * @return 转化出来的 JavaBean 对象
-   * @throws IntrospectionException
-   *             如果分析类属性失败
-   * @throws IllegalAccessException
-   *             如果实例化 JavaBean 失败
-   * @throws InstantiationException
-   *             如果实例化 JavaBean 失败
-   * @throws InvocationTargetException
-   *             如果调用属性的 setter 方法失败
-   */
-  public static Object convert2Bean(Object obj, Map map)
-          throws IntrospectionException, IllegalAccessException,
-          InstantiationException, InvocationTargetException {
-    BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); // 获取类属性
-
-    // 给 JavaBean 对象的属性赋值
-    PropertyDescriptor[] propertyDescriptors =  beanInfo.getPropertyDescriptors();
-    for (int i = 0; i< propertyDescriptors.length; i++) {
-      PropertyDescriptor descriptor = propertyDescriptors[i];
-      String propertyName = descriptor.getName();
-
-      if (map.containsKey(propertyName)) {
-        // 下面一句可以 try 起来，这样当一个属性赋值失败的时候就不会影响其他属性赋值。
-        Object value = map.get(propertyName);
-
-        Object[] args = new Object[1];
-        args[0] = value;
-
-        descriptor.getWriteMethod().invoke(obj, args);
-      }
-    }
-    return obj;
-  }
+//  /**
+//   * 获取 mapBean 中 key 的 value，若不存在，则返回 -1L
+//   *
+//   * @param mapBean
+//   * @param key
+//   * @return
+//   */
+//  public static List getList(Map<String, Object> mapBean, String key) {
+//
+//    return getList(mapBean, key, Lists.newArrayList());
+//  }
+//
+//  /**
+//   * 获取 mapBean 中 key 的 value，若不存在，则返回 defaultValue
+//   *
+//   * @param mapBean
+//   * @param key
+//   * @param defaultValue
+//   * @return
+//   */
+//  public static List getList(Map<String, Object> mapBean, String key, List defaultValue) {
+//
+//    if (containsValue(mapBean, key)) {
+//      List l = (List)mapBean.get(key);
+//      return l == null ? defaultValue : l;
+//    }
+//
+//    return defaultValue;
+//  }
+//
+//  /**
+//   * 将一个 Map 对象转化为一个 JavaBean
+//   * @param obj 要转化的对象
+//   * @param map 包含属性值的 map
+//   * @return 转化出来的 JavaBean 对象
+//   * @throws IntrospectionException
+//   *             如果分析类属性失败
+//   * @throws IllegalAccessException
+//   *             如果实例化 JavaBean 失败
+//   * @throws InstantiationException
+//   *             如果实例化 JavaBean 失败
+//   * @throws InvocationTargetException
+//   *             如果调用属性的 setter 方法失败
+//   */
+//  public static Object convert2Bean(Object obj, Map map)
+//          throws IntrospectionException, IllegalAccessException,
+//          InstantiationException, InvocationTargetException {
+//    BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); // 获取类属性
+//
+//    // 给 JavaBean 对象的属性赋值
+//    PropertyDescriptor[] propertyDescriptors =  beanInfo.getPropertyDescriptors();
+//    for (int i = 0; i< propertyDescriptors.length; i++) {
+//      PropertyDescriptor descriptor = propertyDescriptors[i];
+//      String propertyName = descriptor.getName();
+//
+//      if (map.containsKey(propertyName)) {
+//        // 下面一句可以 try 起来，这样当一个属性赋值失败的时候就不会影响其他属性赋值。
+//        Object value = map.get(propertyName);
+//
+//        Object[] args = new Object[1];
+//        args[0] = value;
+//
+//        descriptor.getWriteMethod().invoke(obj, args);
+//      }
+//    }
+//    return obj;
+//  }
 
 }
diff --git a/doc/USAGE.md b/doc/USAGE.md
new file mode 100644
index 0000000..40d7b96
--- /dev/null
+++ b/doc/USAGE.md
@@ -0,0 +1,688 @@
+# 应用开发框架 - 项目开发说明
+
+
+[TOC]
+
+
+## 项目介绍
+
+
+### 公共类库
+
+common，提供公用的工具类、框架代码
+
+
+
+### 业务类库
+
+以 业务领域 为单位，实现 业务领域、业务接口，如：
+
+* system，系统功能
+
+* biz，业务示例
+
+每个 业务领域项目下，又分为 领域层 domain、接口层 api
+
+业务类库中，尽量以通用服务的方式实现业务
+
+
+
+### 微服务项目 sa
+
+将 业务类库 包装为 微服务，对外提供 RESTful API，以及相关的接口文档的访问、测试
+
+
+
+### 后端项目 bff
+
+提供 面向UI 的后端接口
+
+对服务接口的转发（建议，避免使用）
+
+对服务接口的聚合、裁剪、适配
+
+提供用户认证，保护接口的访问权限
+
+
+
+## 项目开发
+
+
+### 业务类库
+
+面对业务需求，设计时，进行领域划分，保证划分的粒度适中
+
+* 在 领域层 domain，创建 实体 entity、数据传输对象 dto、持久化 repo、业务逻辑 service
+
+* 在 接口层 api，创建 值对象 vo、接口 api
+
+#### 实体 entity
+
+```java
+package com.supwisdom.institute.backend.biz.domain.entity;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import com.supwisdom.institute.backend.common.framework.entity.ABaseEntity;
+
+@Entity
+@Table(name = "TB_BIZ")
+public class Biz extends ABaseEntity {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 5503233707196628811L;
+  
+  @Getter
+  @Setter
+  @Column(name = "NAME")
+  private String name;
+  
+  @Getter
+  @Setter
+  @Column(name = "BOOL")
+  private Boolean bool;
+  
+  @Getter
+  @Setter
+  @Column(name = "DATE")
+  private Date date;
+
+  @Getter
+  @Setter
+  @Column(name = "NUM")
+  private Integer num;
+
+}
+
+```
+
+继承 `ABaseEntity`
+
+注解 `@Entity`，指定该 class 为一个实体
+
+注解 `@Table`，指定该实体对应的数据库表的表名
+
+注解 `@Column`，指定该属性对应的数据库表的字段名
+
+表名、字段名 都采用大写，多个单词用 `下划线(_)` 隔开
+
+
+
+#### 数据传输对象 dto
+
+```java
+
+```
+
+
+#### 持久化 repo
+
+```java
+package com.supwisdom.institute.backend.biz.domain.repo;
+
+import java.util.Map;
+
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Repository;
+
+import com.supwisdom.institute.backend.biz.domain.entity.Biz;
+import com.supwisdom.institute.backend.common.framework.repo.BaseJpaRepository;
+
+@Repository
+public interface BizRepository extends BaseJpaRepository<Biz> {
+  
+  @Override
+  public default Page<Biz> selectPageList(boolean loadAll, int pageIndex, int pageSize, Map<String, Object> mapBean, Map<String, String> orderBy) {
+    
+    
+    return null;
+  }
+
+}
+
+```
+
+继承 `BaseJpaRepository<E>`，基类中，已经实现了基本的 CURD 逻辑，方法如下：
+
+* 分页查询
+```java
+  public default Page<E> selectPageList(boolean loadAll, int pageIndex, int pageSize, Map<String, Object> mapBean, Map<String, String> orderBy)
+```
+
+* 根据ID获取
+```java
+  public default E selectById(String id)
+```
+
+* 新增
+```java
+  public default E insert(E entity)
+```
+
+* 更新
+```java
+  public default E update(E entity)
+```
+
+* 删除
+```java
+  public default void delete(String id)
+```
+
+
+注解 `@Repository`，指定该 class 为一个数据持久化类
+
+其中 `BaseJpaRepository` 的 `selectPageList` 方法，默认返回所有数据，不会处理查询条件、排序，故一般都需要由业务自行重写
+
+```java
+  default Specification<Biz> convertSpecification(Map<String, Object> mapBean) {
+
+    Specification<Biz> spec = new Specification<Biz>() {
+
+      /**
+       * 
+       */
+      private static final long serialVersionUID = -1820403213133310124L;
+
+      @Override
+      public Predicate toPredicate(Root<Biz> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+        List<Predicate> predicates = new ArrayList<>();
+        
+        if (mapBean != null) {
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "name"))) {
+            predicates.add(criteriaBuilder.like(root.get("name"), MapBeanUtils.getString(mapBean, "name")));
+          }
+
+          if (!StringUtils.isEmpty(MapBeanUtils.getBoolean(mapBean, "bool"))) {
+            predicates.add(criteriaBuilder.equal(root.get("bool"), MapBeanUtils.getBoolean(mapBean, "bool")));
+          }
+          
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "dateBegin"))) {
+            String grantTimeBegin = MapBeanUtils.getString(mapBean, "dateBegin");
+            Date d = DateUtil.parseDate(grantTimeBegin+" 00:00:00", "yyyy-MM-dd HH:mm:ss");
+            
+            if (d != null) {
+              predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("date"), d));
+            }
+          }
+
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "dateEnd"))) {
+            String grantTimeEnd = MapBeanUtils.getString(mapBean, "dateEnd");
+            Date d = DateUtil.parseDate(grantTimeEnd+" 23:59:59", "yyyy-MM-dd HH:mm:ss");
+            
+            if (d != null) {
+              predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get("date"), d));
+            }
+          }
+        }
+        
+        return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
+      }
+      
+    };
+    
+    return spec;
+  }
+  
+  @Override
+  public default Page<Biz> selectPageList(boolean loadAll, int pageIndex, int pageSize, Map<String, Object> mapBean, Map<String, String> orderBy) {
+    
+    Specification<Biz> spec = this.convertSpecification(mapBean);
+
+    if (loadAll) {
+      pageIndex = 0;
+      pageSize = Integer.MAX_VALUE;
+    }
+    
+    Sort sort = new Sort(Sort.Direction.DESC, "date");  // Sort.unsorted
+
+    if (orderBy != null) {
+      List<Order> orders = new ArrayList<>();
+      
+      orderBy.forEach((k, v) -> {
+        if ("asc".equalsIgnoreCase(v)) {
+          Order order = Order.asc(k);
+          orders.add(order);
+        } else if ("desc".equalsIgnoreCase(v)) {
+          Order order = Order.desc(k);
+          orders.add(order);
+        } else {
+          Order order = Order.by(k);
+          orders.add(order);
+        }
+      });
+      
+      sort = Sort.by(orders);
+    }
+
+    PageRequest pageRequest = PageRequest.of(pageIndex, pageSize, sort);
+    
+    return this.findAll(spec, pageRequest);
+  }
+
+```
+
+
+
+#### 业务逻辑 service
+
+```java
+package com.supwisdom.institute.backend.biz.domain.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.supwisdom.institute.backend.biz.domain.entity.Biz;
+import com.supwisdom.institute.backend.biz.domain.repo.BizRepository;
+import com.supwisdom.institute.backend.common.framework.service.ABaseService;
+
+@Service
+public class BizService extends ABaseService<Biz, BizRepository> {
+  
+  @Autowired
+  private BizRepository bizRepository;
+
+  @Override
+  public BizRepository getRepo() {
+    return bizRepository;
+  }
+
+}
+
+```
+
+继承 `ABaseService<E, REPO>`
+
+注解 `@Service`，指定该 class 为一个业务逻辑类
+
+注入 业务对应的 Repository，并实现 `public REPO getRepo()`
+
+
+#### 值对象 vo
+
+这里的vo，目前主要用于接口的请求、响应对象的封装
+
+
+
+#### 接口 api
+
+```java
+package com.supwisdom.institute.backend.biz.api.v1.admin;
+
+import io.swagger.annotations.Api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api(value = "BizAdminBiz", tags = { "BizAdminBiz" }, description = "Biz示例接口")
+@RestController
+@RequestMapping("/v1/admin/biz")
+public class AdminBizController {
+
+}
+
+```
+
+
+
+### 微服务项目
+
+* 关于 Application
+
+```java
+package com.supwisdom.institute.backend.admin.sa;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+import com.supwisdom.infras.online.doc.configuration.EnableInfrasOnlineDoc;
+import com.supwisdom.institute.backend.common.core.transmit.annotation.EnableSimpleUserTransmit;
+import com.supwisdom.institute.backend.common.framework.exception.EnableCustomExceptionHandler;
+
+@SpringBootApplication
+
+@EnableSimpleUserTransmit
+@EnableCustomExceptionHandler
+
+@EnableInfrasOnlineDoc
+
+@EntityScan(basePackages = {"com.supwisdom.**.domain.entity"})  // 扫描子项目下的实体
+@EnableJpaRepositories(basePackages = {"com.supwisdom.**.domain.repo"})  // 扫描子项目下的持久类
+@ComponentScan(basePackages = {"com.supwisdom"})
+public class Application {
+
+  public static void main(String[] args) {
+    SpringApplication.run(Application.class, args);
+  }
+  
+  @Bean
+  public CorsFilter corsFilter() {
+    final CorsConfiguration config = new CorsConfiguration();
+    // config.setAllowCredentials(true);
+    config.addAllowedOrigin("*");
+    config.addAllowedHeader("*");
+    config.addAllowedMethod("*");
+
+    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+    source.registerCorsConfiguration("/v2/api-docs", config);
+
+    return new CorsFilter(source);
+  }
+
+}
+
+```
+
+注解 `@SpringBootApplication`，
+
+注解 `@EnableSimpleUserTransmit`，从请求中接收 User 信息，通过 Feign 调用外部服务时，传递 User 信息
+
+注解 `@EnableCustomExceptionHandler`，将异常转换为符合开发规范的 json 数据
+
+注解 `@EntityScan`，扫描实体
+
+注解 `@EnableJpaRepositories`，扫描持久类
+
+注解 `@ComponentScan`，扫描组件，如 @Service、@Controller、@RestController 等
+
+Filter `corsFilter`，允许跨域请求，此处允许对路径 `/v2/api-docs` 的跨域请求
+
+
+* 在 pom 中，添加依赖配置
+
+```xml
+    <dependency>
+      <groupId>com.supwisdom.institute</groupId>
+      <artifactId>sw-backend-biz-api</artifactId>
+    </dependency>
+
+```
+
+* （可选）在 application.yml 中，添加业务相关的配置项
+
+
+
+### 后端项目
+
+* 关于 Application
+
+```java
+package com.supwisdom.institute.backend.admin.bff;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+import com.supwisdom.infras.security.configure.basic.EnableInfrasBasicApi;
+import com.supwisdom.infras.security.configure.cas.EnableInfrasCasSecurity;
+import com.supwisdom.infras.security.configure.jwt.EnableInfrasJWTApi;
+import com.supwisdom.institute.backend.common.core.transmit.annotation.EnableSimpleUserTransmit;
+import com.supwisdom.institute.backend.common.framework.exception.EnableCustomExceptionHandler;
+
+@SpringBootApplication
+@EnableFeignClients
+
+@EnableSimpleUserTransmit
+@EnableCustomExceptionHandler
+
+@EnableInfrasCasSecurity
+
+@EnableInfrasBasicApi
+@EnableInfrasJWTApi
+public class Application {
+
+  public static void main(String[] args) {
+    SpringApplication.run(Application.class, args);
+  }
+  
+  @Bean
+  public CorsFilter corsFilter() {
+    final CorsConfiguration config = new CorsConfiguration();
+    //config.setAllowCredentials(true);
+    config.addAllowedOrigin("*");
+    config.addAllowedHeader("*");
+    config.addAllowedMethod("*");
+
+    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+    source.registerCorsConfiguration("/v2/api-docs", config);
+    source.registerCorsConfiguration("/api/**", config);  // 对 /api/** 下的请求，支持 cors 跨域请求，如不需要可以注释
+
+    return new CorsFilter(source);
+  }
+
+}
+
+```
+
+注解 `@SpringBootApplication`，
+
+注解 `@EnableFeignClients`，支持 FeignClient
+
+注解 `@EnableSimpleUserTransmit`，从请求中接收 User 信息，通过 Feign 调用外部服务时，传递 User 信息
+
+注解 `@EnableCustomExceptionHandler`，将异常转换为符合开发规范的 json 数据
+
+注解 `@EnableInfrasCasSecurity`，支持 cas，在 application.yml 可配置是否启用
+
+注解 `@EnableInfrasBasicApi`，支持 basic 认证（一般在开发环境启用），在 application.yml 可配置是否启用
+
+注解 `@EnableInfrasJWTApi`，支持 jwt 认证（一般在生产环境启用），在 application.yml 可配置是否启用
+
+
+
+* 关于接口请求
+
+后端项目中，使用服务接口的方式有 2 种，一是 请求转发，二是 远程调用
+
+
+#### 请求转发
+
+请求转发的方式，基于 spring-cloud-gateway 实现
+
+* 在 pom.xml 中，添加依赖配置
+
+```xml
+    <dependency>
+      <groupId>org.springframework.cloud</groupId>
+      <artifactId>spring-cloud-starter-gateway</artifactId>
+    </dependency>
+
+```
+
+* 在 application.yml 中，添加 spring.cloud.gateway.routes 配置
+
+```yaml
+spring:
+  cloud:
+    gateway:
+      routes:
+      - id: system-api
+        uri: http://localhost:8081
+        predicates:
+        - Path=/api/system/**
+        filters:
+        - RewritePath=/api/system/(?<suffix>.*), /$\{suffix}
+      - id: biz-api
+        uri: http://localhost:8081
+        predicates:
+        - Path=/api/biz/**
+        filters:
+        - RewritePath=/api/biz/(?<suffix>.*), /$\{suffix}
+
+```
+
+**疑问？为何不用服务注册与发现**
+
+考虑到，后期部署采用 k8s，而 k8s 会提供服务注册与发现的能力，所以此处不再考虑
+
+若存在脱离 k8s 部署的情况，可以考虑采用 nginx 实现服务端负载均衡即可，或其他方案
+
+
+#### 远程调用
+
+远程调用的方式，基于 spring-cloud-openfeign 实现
+
+* 在 pom.xml 中，添加依赖配置
+
+```xml
+    <dependency>
+      <groupId>org.springframework.cloud</groupId>
+      <artifactId>spring-cloud-starter-openfeign</artifactId>
+    </dependency>
+
+```
+
+* 在 Application 中，添加注解 `@EnableFeignClients`，`@EnableSimpleUserTransmit`
+
+注解 `@EnableFeignClients`，表示启用 FeignClients 的配置
+
+注解 `@EnableSimpleUserTransmit`，表示将 后端的登录用户信息，在请求 服务接口 的过程中，进行传递（加入到请求头 Header 中）
+
+* 在 application.yml 中，添加 服务接口地址 配置
+
+如：
+```yml
+sw-backend-biz-api.uri: http://localhost:8081
+```
+
+* 在 remote 包 下，创建 FeignClient 类、FallbackFactory 类
+
+```java
+package com.supwisdom.institute.backend.admin.bff.apis.remote.biz;
+
+import org.springframework.cloud.openfeign.FeignClient;
+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.alibaba.fastjson.JSONObject;
+import com.supwisdom.institute.backend.admin.bff.apis.model.biz.Biz;
+
+@FeignClient(
+    name = "biz-biz-remote-feign-client",
+    url = "${sw-backend-biz-api.uri}/v1/admin/biz",
+    fallbackFactory = BizRemoteFallbackFactory.class
+)
+public interface BizRemoteFeignClient {
+  
+  @RequestMapping(method = RequestMethod.GET)
+  JSONObject query(
+      @RequestParam(name = "loadAll") boolean loadAll,
+      @RequestParam(name = "pageIndex") int pageIndex,
+      @RequestParam(name = "pageSize") int pageSize
+      
+  );
+  
+  @RequestMapping(method = RequestMethod.GET, path = "/{id}")
+  JSONObject load(
+      @PathVariable(name = "id") String id
+  );
+
+  @RequestMapping(method = RequestMethod.POST)
+  JSONObject create(
+      @RequestBody Biz biz
+  );
+
+  @RequestMapping(method = RequestMethod.PUT, path = "/{id}")
+  JSONObject update(
+      @PathVariable(name = "id") String id,
+      @RequestBody Biz biz
+  );
+  
+  @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
+  JSONObject delete(
+      @PathVariable(name = "id") String id
+  );
+
+}
+
+```
+
+注解 `@FeignClient`，`url` 指定后端服务的地址，`fallbackFactory` 指定熔断回调处理的工厂类
+
+```java
+package com.supwisdom.institute.backend.admin.bff.apis.remote.biz;
+
+import org.springframework.stereotype.Component;
+
+import com.alibaba.fastjson.JSONObject;
+import com.supwisdom.institute.backend.admin.bff.apis.model.biz.Biz;
+import com.supwisdom.institute.backend.admin.bff.remote.FallbackError;
+
+import feign.hystrix.FallbackFactory;
+
+@Component
+public class BizRemoteFallbackFactory implements FallbackFactory<BizRemoteFeignClient> {
+
+  @Override
+  public BizRemoteFeignClient create(Throwable cause) {
+    return new BizRemoteFeignClient() {
+
+      @Override
+      public JSONObject query(boolean loadAll, int pageIndex, int pageSize) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject load(String id) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject create(Biz biz) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject update(String id, Biz biz) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject delete(String id) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+      
+    };
+  }
+
+}
+
+```
\ No newline at end of file
diff --git a/sa/admin/pom.xml b/sa/admin/pom.xml
index 09c386c..a03165a 100644
--- a/sa/admin/pom.xml
+++ b/sa/admin/pom.xml
@@ -35,6 +35,13 @@
       <artifactId>spring-boot-starter-actuator</artifactId>
     </dependency>
 
+
+    <dependency>
+      <groupId>org.springframework.cloud</groupId>
+      <artifactId>spring-cloud-starter-openfeign</artifactId>
+    </dependency>
+
+
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
@@ -46,10 +53,10 @@
     </dependency>
 
 
-    <dependency>
+    <!-- <dependency>
       <groupId>com.supwisdom.infras</groupId>
       <artifactId>infras-mvc</artifactId>
-    </dependency>
+    </dependency> -->
 
     <dependency>
       <groupId>com.supwisdom.infras</groupId>
diff --git a/sa/admin/src/main/java/com/supwisdom/institute/backend/admin/sa/Application.java b/sa/admin/src/main/java/com/supwisdom/institute/backend/admin/sa/Application.java
index 252e9bf..8bf05fd 100644
--- a/sa/admin/src/main/java/com/supwisdom/institute/backend/admin/sa/Application.java
+++ b/sa/admin/src/main/java/com/supwisdom/institute/backend/admin/sa/Application.java
@@ -12,10 +12,12 @@
 
 import com.supwisdom.infras.online.doc.configuration.EnableInfrasOnlineDoc;
 import com.supwisdom.institute.backend.common.core.transmit.annotation.EnableSimpleUserTransmit;
+import com.supwisdom.institute.backend.common.framework.exception.EnableCustomExceptionHandler;
 
 @SpringBootApplication
 
 @EnableSimpleUserTransmit
+@EnableCustomExceptionHandler
 
 @EnableInfrasOnlineDoc
 
diff --git a/system/api/pom.xml b/system/api/pom.xml
index 76a9dcd..07e9732 100644
--- a/system/api/pom.xml
+++ b/system/api/pom.xml
@@ -38,6 +38,11 @@
       <artifactId>spring-boot-starter</artifactId>
     </dependency>
 
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+
 
     <dependency>
       <groupId>com.supwisdom.institute</groupId>
diff --git a/system/api/src/main/java/com/supwisdom/institute/backend/system/api/v1/admin/AdminConfigController.java b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/v1/admin/AdminConfigController.java
index 9eac867..b67493a 100644
--- a/system/api/src/main/java/com/supwisdom/institute/backend/system/api/v1/admin/AdminConfigController.java
+++ b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/v1/admin/AdminConfigController.java
@@ -21,16 +21,16 @@
 
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
 import com.supwisdom.institute.backend.common.framework.vo.response.DefaultApiResponse;
+import com.supwisdom.institute.backend.system.api.vo.request.ConfigCreateRequest;
+import com.supwisdom.institute.backend.system.api.vo.request.ConfigQueryRequest;
+import com.supwisdom.institute.backend.system.api.vo.request.ConfigUpdateRequest;
+import com.supwisdom.institute.backend.system.api.vo.response.ConfigCreateResponseData;
+import com.supwisdom.institute.backend.system.api.vo.response.ConfigLoadResponseData;
+import com.supwisdom.institute.backend.system.api.vo.response.ConfigQueryResponseData;
+import com.supwisdom.institute.backend.system.api.vo.response.ConfigUpdateResponseData;
 import com.supwisdom.institute.backend.system.domain.entity.Config;
 import com.supwisdom.institute.backend.system.domain.exception.ConfigException;
 import com.supwisdom.institute.backend.system.domain.service.ConfigService;
-import com.supwisdom.institute.backend.system.domain.vo.request.ConfigCreateRequest;
-import com.supwisdom.institute.backend.system.domain.vo.request.ConfigQueryRequest;
-import com.supwisdom.institute.backend.system.domain.vo.request.ConfigUpdateRequest;
-import com.supwisdom.institute.backend.system.domain.vo.response.ConfigCreateResponseData;
-import com.supwisdom.institute.backend.system.domain.vo.response.ConfigLoadResponseData;
-import com.supwisdom.institute.backend.system.domain.vo.response.ConfigQueryResponseData;
-import com.supwisdom.institute.backend.system.domain.vo.response.ConfigUpdateResponseData;
 
 @Api(value = "SystemAdminConfig", tags = { "SystemAdminConfig" }, description = "配置项的操作接口")
 @Slf4j
diff --git a/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/.gitkeep b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/.gitkeep
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/request/ConfigCreateRequest.java b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/request/ConfigCreateRequest.java
similarity index 88%
rename from system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/request/ConfigCreateRequest.java
rename to system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/request/ConfigCreateRequest.java
index 8c741fe..94d8578 100644
--- a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/request/ConfigCreateRequest.java
+++ b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/request/ConfigCreateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.system.domain.vo.request;
+package com.supwisdom.institute.backend.system.api.vo.request;
 
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
 import com.supwisdom.institute.backend.common.framework.vo.request.IApiCreateRequest;
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/request/ConfigQueryRequest.java b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/request/ConfigQueryRequest.java
similarity index 91%
rename from system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/request/ConfigQueryRequest.java
rename to system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/request/ConfigQueryRequest.java
index e83083b..d167604 100644
--- a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/request/ConfigQueryRequest.java
+++ b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/request/ConfigQueryRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.system.domain.vo.request;
+package com.supwisdom.institute.backend.system.api.vo.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/request/ConfigUpdateRequest.java b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/request/ConfigUpdateRequest.java
similarity index 89%
rename from system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/request/ConfigUpdateRequest.java
rename to system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/request/ConfigUpdateRequest.java
index 6f7e1a5..8ebf5f2 100644
--- a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/request/ConfigUpdateRequest.java
+++ b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/request/ConfigUpdateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.system.domain.vo.request;
+package com.supwisdom.institute.backend.system.api.vo.request;
 
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
 import com.supwisdom.institute.backend.common.framework.vo.request.IApiUpdateRequest;
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigCreateResponseData.java b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigCreateResponseData.java
similarity index 91%
rename from system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigCreateResponseData.java
rename to system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigCreateResponseData.java
index a14a607..3d130d8 100644
--- a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigCreateResponseData.java
+++ b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigCreateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.system.domain.vo.response;
+package com.supwisdom.institute.backend.system.api.vo.response;
 
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
 import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiCreateResponseData;
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigLoadResponseData.java b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigLoadResponseData.java
similarity index 91%
rename from system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigLoadResponseData.java
rename to system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigLoadResponseData.java
index a32312d..c93fa8c 100644
--- a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigLoadResponseData.java
+++ b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigLoadResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.system.domain.vo.response;
+package com.supwisdom.institute.backend.system.api.vo.response;
 
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
 import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiLoadResponseData;
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigQueryResponseData.java b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigQueryResponseData.java
similarity index 92%
rename from system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigQueryResponseData.java
rename to system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigQueryResponseData.java
index 906d681..aea651a 100644
--- a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigQueryResponseData.java
+++ b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigQueryResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.system.domain.vo.response;
+package com.supwisdom.institute.backend.system.api.vo.response;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -9,8 +9,8 @@
 import org.springframework.data.domain.Page;
 
 import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiQueryResponseData;
+import com.supwisdom.institute.backend.system.api.vo.request.ConfigQueryRequest;
 import com.supwisdom.institute.backend.system.domain.entity.Config;
-import com.supwisdom.institute.backend.system.domain.vo.request.ConfigQueryRequest;
 
 /**
  * @author loie
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigRemoveResponseData.java b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigRemoveResponseData.java
similarity index 92%
rename from system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigRemoveResponseData.java
rename to system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigRemoveResponseData.java
index 556307b..d593ed4 100644
--- a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigRemoveResponseData.java
+++ b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigRemoveResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.system.domain.vo.response;
+package com.supwisdom.institute.backend.system.api.vo.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigUpdateResponseData.java b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigUpdateResponseData.java
similarity index 91%
rename from system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigUpdateResponseData.java
rename to system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigUpdateResponseData.java
index 51ca051..95a1d24 100644
--- a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/vo/response/ConfigUpdateResponseData.java
+++ b/system/api/src/main/java/com/supwisdom/institute/backend/system/api/vo/response/ConfigUpdateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.system.domain.vo.response;
+package com.supwisdom.institute.backend.system.api.vo.response;
 
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
 import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiUpdateResponseData;
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/entity/.gitkeep b/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/entity/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/entity/.gitkeep
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/exception/.gitkeep b/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/exception/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/exception/.gitkeep
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/model/.gitkeep b/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/model/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/model/.gitkeep
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/repo/.gitkeep b/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/repo/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/repo/.gitkeep
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/service/.gitkeep b/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/service/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/service/.gitkeep
