feat: 增加应用管理功能的api
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/admin/AdminApplicationController.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/admin/AdminApplicationController.java
new file mode 100644
index 0000000..41a23bb
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/admin/AdminApplicationController.java
@@ -0,0 +1,165 @@
+package com.supwisdom.institute.backend.base.api.v1.admin;
+
+import java.util.List;
+
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+
+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.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.supwisdom.institute.backend.base.api.vo.request.ApplicationCreateRequest;
+import com.supwisdom.institute.backend.base.api.vo.request.ApplicationDeleteBatchRequest;
+import com.supwisdom.institute.backend.base.api.vo.request.ApplicationQueryRequest;
+import com.supwisdom.institute.backend.base.api.vo.request.ApplicationUpdateRequest;
+import com.supwisdom.institute.backend.base.api.vo.response.ApplicationCreateResponseData;
+import com.supwisdom.institute.backend.base.api.vo.response.ApplicationDeleteBatchResponseData;
+import com.supwisdom.institute.backend.base.api.vo.response.ApplicationLoadResponseData;
+import com.supwisdom.institute.backend.base.api.vo.response.ApplicationQueryResponseData;
+import com.supwisdom.institute.backend.base.api.vo.response.ApplicationRemoveResponseData;
+import com.supwisdom.institute.backend.base.api.vo.response.ApplicationUpdateResponseData;
+import com.supwisdom.institute.backend.base.domain.entity.Application;
+import com.supwisdom.institute.backend.base.domain.service.ApplicationService;
+import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
+import com.supwisdom.institute.backend.common.framework.vo.response.DefaultApiResponse;
+
+@Api(value = "BaseAdminApplication", tags = { "BaseAdminApplication" }, description = "路由信息的操作接口")
+@Slf4j
+@RestController
+@RequestMapping("/v1/admin/applications")
+public class AdminApplicationController {
+
+  @Autowired
+  private ApplicationService applicationService;
+  
+
+  @GetMapping(produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public DefaultApiResponse<ApplicationQueryResponseData> query(ApplicationQueryRequest queryRequest) {
+
+    Page<Application> page = applicationService.selectPageList(
+        queryRequest.isLoadAll(), 
+        queryRequest.getPageIndex(), 
+        queryRequest.getPageSize(),
+        queryRequest.getMapBean(),
+        queryRequest.getOrderBy());
+
+    ApplicationQueryResponseData data = ApplicationQueryResponseData.of(queryRequest).build(page);
+
+    return new DefaultApiResponse<ApplicationQueryResponseData>(data);
+  }
+  
+  @GetMapping(path = "/{id}", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public DefaultApiResponse<ApplicationLoadResponseData> load(@PathVariable("id") String id) {
+
+    if (id == null || id.length() == 0) {
+      throw new RuntimeException("exception.get.id.must.not.empty"); // FIXME: RestException
+    }
+
+    Application application = applicationService.selectById(id);
+
+    if (application == null) {
+      throw new RuntimeException("exception.get.domain.not.exist"); // FIXME: RestException
+    }
+    
+    ApplicationLoadResponseData data = ApplicationLoadResponseData.of(application);
+
+    return new DefaultApiResponse<ApplicationLoadResponseData>(data);
+  }
+
+  @PostMapping(consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public DefaultApiResponse<ApplicationCreateResponseData> create(
+      @RequestBody ApplicationCreateRequest createRequest) {
+    
+    // FIXME: 验证数据有效性
+    
+    Application application = createRequest.getEntity();
+    
+    Application ret = applicationService.insert(application);
+    
+    ApplicationCreateResponseData data = ApplicationCreateResponseData.build(ret);
+
+    return new DefaultApiResponse<ApplicationCreateResponseData>(data);
+  }
+  
+  @PutMapping(path = "/{id}", consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public DefaultApiResponse<ApplicationUpdateResponseData> update(
+      @PathVariable("id") String id, 
+      @RequestBody ApplicationUpdateRequest updateRequest) {
+
+    if (id == null || id.length() == 0) {
+      throw new RuntimeException("exception.update.id.must.not.empty");
+    }
+
+    Application tmp = applicationService.selectById(id);
+    if (tmp == null) {
+      throw new RuntimeException("exception.update.domain.not.exist");
+    }
+
+    Application application = updateRequest.getEntity();
+    application.setId(id);
+
+    application = EntityUtils.merge(tmp, application);
+
+    Application ret = applicationService.update(application);
+
+    ApplicationUpdateResponseData data = ApplicationUpdateResponseData.build(ret);
+    
+    return new DefaultApiResponse<ApplicationUpdateResponseData>(data);
+  }
+
+  @DeleteMapping(path = "/{id}", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public DefaultApiResponse<ApplicationRemoveResponseData> delete(
+      @PathVariable("id") String id) {
+
+    if (id == null || id.length() == 0) {
+      throw new RuntimeException("exception.delete.id.must.not.empty"); // FIXME: RestException
+    }
+
+    Application tmp = applicationService.selectById(id);
+    if (tmp == null) {
+      throw new RuntimeException("exception.delete.domain.not.exist"); // FIXME: RestException
+    }
+
+    applicationService.deleteById(id);
+
+    ApplicationRemoveResponseData data = ApplicationRemoveResponseData.build(tmp);
+    return new DefaultApiResponse<ApplicationRemoveResponseData>(data);
+  }
+
+  @DeleteMapping(path = "/batch", consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public DefaultApiResponse<ApplicationDeleteBatchResponseData> deleteBatch(
+      @RequestBody ApplicationDeleteBatchRequest deleteBatchRequest) {
+    
+    List<String> ids = deleteBatchRequest.getIds();
+    
+    applicationService.deleteBatch(ids);
+    
+    ApplicationDeleteBatchResponseData data = ApplicationDeleteBatchResponseData.build(ids);
+    return new DefaultApiResponse<ApplicationDeleteBatchResponseData>(data);
+  }
+
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/request/ApplicationCreateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/request/ApplicationCreateRequest.java
new file mode 100644
index 0000000..26ad39a
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/request/ApplicationCreateRequest.java
@@ -0,0 +1,21 @@
+package com.supwisdom.institute.backend.base.api.vo.request;
+
+import com.supwisdom.institute.backend.base.domain.entity.Application;
+import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
+import com.supwisdom.institute.backend.common.framework.vo.request.IApiCreateRequest;
+
+/**
+ * @author loie
+ */
+public class ApplicationCreateRequest extends Application implements IApiCreateRequest {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 7619506409619195684L;
+
+  public Application getEntity() {
+    return EntityUtils.copy(this, new Application());
+  }
+  
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/request/ApplicationDeleteBatchRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/request/ApplicationDeleteBatchRequest.java
new file mode 100644
index 0000000..b309abd
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/request/ApplicationDeleteBatchRequest.java
@@ -0,0 +1,21 @@
+package com.supwisdom.institute.backend.base.api.vo.request;
+
+import java.util.List;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import com.supwisdom.institute.backend.common.framework.vo.request.IApiRequest;
+
+public class ApplicationDeleteBatchRequest implements IApiRequest {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -8296636817441994821L;
+
+  @Getter
+  @Setter
+  private List<String> ids;
+
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/request/ApplicationQueryRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/request/ApplicationQueryRequest.java
new file mode 100644
index 0000000..0f3ed04
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/request/ApplicationQueryRequest.java
@@ -0,0 +1,40 @@
+package com.supwisdom.institute.backend.base.api.vo.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Map;
+
+import com.supwisdom.institute.backend.common.framework.vo.request.IApiQueryRequest;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author loie
+ */
+public class ApplicationQueryRequest implements IApiQueryRequest {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -4728297863070197861L;
+
+  @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/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/request/ApplicationUpdateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/request/ApplicationUpdateRequest.java
new file mode 100644
index 0000000..02b0c9d
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/request/ApplicationUpdateRequest.java
@@ -0,0 +1,28 @@
+package com.supwisdom.institute.backend.base.api.vo.request;
+
+import com.supwisdom.institute.backend.base.domain.entity.Application;
+import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
+import com.supwisdom.institute.backend.common.framework.vo.request.IApiUpdateRequest;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author loie
+ */
+public class ApplicationUpdateRequest extends Application implements IApiUpdateRequest {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -2370390240675594737L;
+
+  @Getter
+  @Setter
+  private String id;
+
+  public Application getEntity() {
+    return EntityUtils.copy(this, new Application());
+  }
+
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationCreateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationCreateResponseData.java
new file mode 100644
index 0000000..08effc9
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationCreateResponseData.java
@@ -0,0 +1,33 @@
+package com.supwisdom.institute.backend.base.api.vo.response;
+
+import com.supwisdom.institute.backend.base.domain.entity.Application;
+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 ApplicationCreateResponseData extends Application implements IApiCreateResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -5986639173730939508L;
+
+  @Getter
+  @Setter
+  private String id;
+
+  private ApplicationCreateResponseData() {
+
+  }
+
+  public static ApplicationCreateResponseData build(Application entity) {
+    ApplicationCreateResponseData data = new ApplicationCreateResponseData();
+
+    return EntityUtils.copy(entity, data);
+  }
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationDeleteBatchResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationDeleteBatchResponseData.java
new file mode 100644
index 0000000..6157b32
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationDeleteBatchResponseData.java
@@ -0,0 +1,35 @@
+package com.supwisdom.institute.backend.base.api.vo.response;
+
+import java.util.List;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiResponseData;
+
+/**
+ * @author loie
+ */
+public class ApplicationDeleteBatchResponseData implements IApiResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -1441419457044931039L;
+
+  @Getter
+  @Setter
+  private List<String> ids;
+
+  private ApplicationDeleteBatchResponseData() {
+    
+  }
+  
+  public static ApplicationDeleteBatchResponseData build(List<String> ids) {
+    ApplicationDeleteBatchResponseData data = new ApplicationDeleteBatchResponseData();
+    data.setIds(ids);
+    
+    return data;
+  }
+  
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationLoadResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationLoadResponseData.java
new file mode 100644
index 0000000..a56ced3
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationLoadResponseData.java
@@ -0,0 +1,33 @@
+package com.supwisdom.institute.backend.base.api.vo.response;
+
+import com.supwisdom.institute.backend.base.domain.entity.Application;
+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 ApplicationLoadResponseData extends Application implements IApiLoadResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -4866881763278414027L;
+
+  @Getter
+  @Setter
+  private String id;
+
+  private ApplicationLoadResponseData() {
+
+  }
+
+  public static ApplicationLoadResponseData of(Application entity) {
+    ApplicationLoadResponseData data = new ApplicationLoadResponseData();
+    return EntityUtils.copy(entity, data);
+  }
+
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationQueryResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationQueryResponseData.java
new file mode 100644
index 0000000..040dcf3
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationQueryResponseData.java
@@ -0,0 +1,80 @@
+package com.supwisdom.institute.backend.base.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.base.domain.entity.Application;
+import com.supwisdom.institute.backend.common.framework.vo.request.IApiQueryRequest;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiQueryResponseData;
+
+/**
+ * @author loie
+ */
+public class ApplicationQueryResponseData implements IApiQueryResponseData<Application> {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 1355060716641084862L;
+
+  private ApplicationQueryResponseData(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 ApplicationQueryResponseData of(IApiQueryRequest queryRequest) {
+    ApplicationQueryResponseData configQueryResponse = new ApplicationQueryResponseData(
+        queryRequest.isLoadAll(), 
+        queryRequest.getPageIndex(), 
+        queryRequest.getPageSize(), 
+        queryRequest.getMapBean(), 
+        queryRequest.getOrderBy()
+    );
+    
+    return configQueryResponse;
+  }
+  
+  public ApplicationQueryResponseData build(Page<Application> 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<Application> items;
+  
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationRemoveResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationRemoveResponseData.java
new file mode 100644
index 0000000..277c2b8
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationRemoveResponseData.java
@@ -0,0 +1,34 @@
+package com.supwisdom.institute.backend.base.api.vo.response;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import com.supwisdom.institute.backend.base.domain.entity.Application;
+import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiRemoveResponseData;
+
+/**
+ * @author loie
+ */
+public class ApplicationRemoveResponseData implements IApiRemoveResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -8179059520857121842L;
+
+  @Getter
+  @Setter
+  private String id;
+
+  private ApplicationRemoveResponseData() {
+    
+  }
+  
+  public static ApplicationRemoveResponseData build(Application entity) {
+    ApplicationRemoveResponseData data = new ApplicationRemoveResponseData();
+    
+    return EntityUtils.copy(entity, data);
+  }
+  
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationUpdateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationUpdateResponseData.java
new file mode 100644
index 0000000..2d2ee40
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/vo/response/ApplicationUpdateResponseData.java
@@ -0,0 +1,34 @@
+package com.supwisdom.institute.backend.base.api.vo.response;
+
+import com.supwisdom.institute.backend.base.domain.entity.Application;
+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 ApplicationUpdateResponseData extends Application implements IApiUpdateResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -2690439553701722798L;
+
+  @Getter
+  @Setter
+  private String id;
+
+  private ApplicationUpdateResponseData() {
+
+  }
+
+  public static ApplicationUpdateResponseData build(Application entity) {
+    ApplicationUpdateResponseData data = new ApplicationUpdateResponseData();
+
+    return EntityUtils.copy(entity, data);
+  }
+
+}