refactor: 优化代码结构,完善资源(API)访问控制
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminAccountController.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminAccountController.java
index 8d6e168..2b2efb3 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminAccountController.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminAccountController.java
@@ -22,24 +22,24 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.supwisdom.institute.backend.base.api.v1.vo.request.AccountCreateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.AccountDeleteBatchRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.AccountQueryRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.AccountRelateGroupsRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.AccountRelateRolesRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.AccountRelatedGroupsRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.AccountRelatedRolesRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.AccountUpdateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AccountCreateResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AccountDeleteBatchResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AccountLoadResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AccountQueryResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AccountRelateGroupsResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AccountRelateRolesResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AccountRelatedGroupsResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AccountRelatedRolesResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AccountRemoveResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AccountUpdateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.AccountCreateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.AccountDeleteBatchRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.AccountQueryRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.AccountRelateGroupsRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.AccountRelateRolesRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.AccountRelatedGroupsRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.AccountRelatedRolesRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.AccountUpdateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.AccountCreateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.AccountDeleteBatchResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.AccountLoadResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.AccountQueryResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.AccountRelateGroupsResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.AccountRelateRolesResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.AccountRelatedGroupsResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.AccountRelatedRolesResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.AccountRemoveResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.AccountUpdateResponseData;
 import com.supwisdom.institute.backend.base.domain.entity.Account;
 import com.supwisdom.institute.backend.base.domain.entity.AccountGroup;
 import com.supwisdom.institute.backend.base.domain.entity.AccountRole;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminApplicationController.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminApplicationController.java
index 36067de..02fb24b 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminApplicationController.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminApplicationController.java
@@ -20,16 +20,16 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.supwisdom.institute.backend.base.api.v1.vo.request.ApplicationCreateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.ApplicationDeleteBatchRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.ApplicationQueryRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.ApplicationUpdateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ApplicationCreateResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ApplicationDeleteBatchResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ApplicationLoadResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ApplicationQueryResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ApplicationRemoveResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ApplicationUpdateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.ApplicationCreateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.ApplicationDeleteBatchRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.ApplicationQueryRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.ApplicationUpdateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.ApplicationCreateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.ApplicationDeleteBatchResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.ApplicationLoadResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.ApplicationQueryResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.ApplicationRemoveResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.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;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminConfigController.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminConfigController.java
index cd8d261..4b38209 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminConfigController.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminConfigController.java
@@ -19,13 +19,13 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.supwisdom.institute.backend.base.api.v1.vo.request.ConfigCreateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.ConfigQueryRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.ConfigUpdateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ConfigCreateResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ConfigLoadResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ConfigQueryResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ConfigUpdateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.ConfigCreateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.ConfigQueryRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.ConfigUpdateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.ConfigCreateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.ConfigLoadResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.ConfigQueryResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.ConfigUpdateResponseData;
 import com.supwisdom.institute.backend.base.domain.entity.Config;
 import com.supwisdom.institute.backend.base.domain.exception.ConfigException;
 import com.supwisdom.institute.backend.base.domain.service.ConfigService;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminGroupController.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminGroupController.java
index a15c763..c9a28d7 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminGroupController.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminGroupController.java
@@ -21,22 +21,22 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.supwisdom.institute.backend.base.api.v1.vo.request.GroupCreateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.GroupQueryRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.GroupRelateAccountsRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.GroupRelateRolesRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.GroupRelatedAccountsRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.GroupRelatedRolesRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.GroupUpdateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.GroupCreateResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.GroupLoadResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.GroupQueryResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.GroupRelateAccountsResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.GroupRelateRolesResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.GroupRelatedAccountsResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.GroupRelatedRolesResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.GroupRemoveResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.GroupUpdateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.GroupCreateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.GroupQueryRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.GroupRelateAccountsRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.GroupRelateRolesRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.GroupRelatedAccountsRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.GroupRelatedRolesRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.GroupUpdateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.GroupCreateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.GroupLoadResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.GroupQueryResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.GroupRelateAccountsResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.GroupRelateRolesResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.GroupRelatedAccountsResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.GroupRelatedRolesResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.GroupRemoveResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.GroupUpdateResponseData;
 import com.supwisdom.institute.backend.base.domain.entity.AccountGroup;
 import com.supwisdom.institute.backend.base.domain.entity.Group;
 import com.supwisdom.institute.backend.base.domain.entity.GroupRole;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminMenuController.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminMenuController.java
index a32a057..554726c 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminMenuController.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminMenuController.java
@@ -1,7 +1,9 @@
 package com.supwisdom.institute.backend.base.api.v1.controller.admin;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
@@ -22,18 +24,19 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.supwisdom.institute.backend.base.api.v1.vo.request.PermissionCreateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.PermissionDeleteBatchRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.PermissionQueryRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.PermissionUpdateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.PermissionCreateResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.PermissionDeleteBatchResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.PermissionLoadResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.PermissionQueryResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.PermissionRemoveResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.PermissionTreeResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.PermissionUpdateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.PermissionCreateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.PermissionDeleteBatchRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.PermissionQueryRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.PermissionUpdateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionCreateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionDeleteBatchResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionLoadResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionQueryResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionRemoveResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionTreeResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionUpdateResponseData;
 import com.supwisdom.institute.backend.base.domain.entity.Permission;
+import com.supwisdom.institute.backend.base.domain.entity.PermissionResource;
 import com.supwisdom.institute.backend.base.domain.model.PermissionTreeNode;
 import com.supwisdom.institute.backend.base.domain.service.PermissionService;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
@@ -88,7 +91,16 @@
       throw new RuntimeException("exception.get.domain.type.error");
     }
     
-    PermissionLoadResponseData data = PermissionLoadResponseData.of(permission);
+    List<String> resourceIds = new ArrayList<>();
+    
+    Map<String, Object> mapBean = new HashMap<>();
+    mapBean.put("permissionId", id);
+    Page<PermissionResource> permissionResources = permissionService.selectPermissionResources(true, 0, 0, mapBean);
+    for (PermissionResource permissionResource : permissionResources) {
+      resourceIds.add(permissionResource.getResourceId());
+    }
+    
+    PermissionLoadResponseData data = PermissionLoadResponseData.of(permission, resourceIds);
 
     return new DefaultApiResponse<PermissionLoadResponseData>(data);
   }
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminOperationController.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminOperationController.java
index aa282c6..e84e2e0 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminOperationController.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminOperationController.java
@@ -2,7 +2,10 @@
 
 import io.swagger.annotations.Api;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -21,15 +24,16 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.supwisdom.institute.backend.base.api.v1.vo.request.PermissionCreateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.PermissionQueryRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.PermissionUpdateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.PermissionCreateResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.PermissionLoadResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.PermissionQueryResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.PermissionRemoveResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.PermissionUpdateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.PermissionCreateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.PermissionQueryRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.PermissionUpdateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionCreateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionLoadResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionQueryResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionRemoveResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionUpdateResponseData;
 import com.supwisdom.institute.backend.base.domain.entity.Permission;
+import com.supwisdom.institute.backend.base.domain.entity.PermissionResource;
 import com.supwisdom.institute.backend.base.domain.service.PermissionService;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
 import com.supwisdom.institute.backend.common.framework.vo.response.DefaultApiResponse;
@@ -82,8 +86,17 @@
     if (!Permission.TYPE_OPERATION.equals(permission.getType())) {
       throw new RuntimeException("exception.get.domain.type.error");
     }
+
+    List<String> resourceIds = new ArrayList<>();
     
-    PermissionLoadResponseData data = PermissionLoadResponseData.of(permission);
+    Map<String, Object> mapBean = new HashMap<>();
+    mapBean.put("permissionId", id);
+    Page<PermissionResource> permissionResources = permissionService.selectPermissionResources(true, 0, 0, mapBean);
+    for (PermissionResource permissionResource : permissionResources) {
+      resourceIds.add(permissionResource.getResourceId());
+    }
+    
+    PermissionLoadResponseData data = PermissionLoadResponseData.of(permission, resourceIds);
 
     return new DefaultApiResponse<PermissionLoadResponseData>(data);
   }
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminPermissionController.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminPermissionController.java
index 4181f3e..a415095 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminPermissionController.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminPermissionController.java
@@ -1,22 +1,30 @@
 package com.supwisdom.institute.backend.base.api.v1.controller.admin;
 
 import java.util.HashMap;
-import java.util.Map;
 
 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.GetMapping;
+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.base.api.v1.vo.response.PermissionTreeResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.PermissionRelateResourcesRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.PermissionRelatedResourcesRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionRelateResourcesResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionRelatedResourcesResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.PermissionTreeResponseData;
 import com.supwisdom.institute.backend.base.domain.entity.Permission;
+import com.supwisdom.institute.backend.base.domain.entity.PermissionResource;
 import com.supwisdom.institute.backend.base.domain.model.PermissionTreeNode;
 import com.supwisdom.institute.backend.base.domain.service.PermissionService;
 import com.supwisdom.institute.backend.common.framework.vo.response.DefaultApiResponse;
@@ -41,5 +49,60 @@
 
     return new DefaultApiResponse<PermissionTreeResponseData>(data);
   }
-  
+
+  @RequestMapping(method = RequestMethod.GET, path = "/{id}/resources", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseBody
+  public DefaultApiResponse<PermissionRelatedResourcesResponseData> permissionResources(
+      @PathVariable("id") String id, 
+      PermissionRelatedResourcesRequest request) {
+
+    if (id == null || id.length() == 0) {
+      throw new RuntimeException("exception.get.id.must.not.empty"); // FIXME: RestException
+    }
+
+    Permission permission = permissionService.selectById(id);
+
+    if (permission == null) {
+      throw new RuntimeException("exception.get.domain.not.exist"); // FIXME: RestException
+    }
+
+    if (request.getMapBean() == null) {
+      request.setMapBean(new HashMap<String, Object>());
+    }
+    request.getMapBean().put("permissionId", permission.getId());
+
+    Page<PermissionResource> page = permissionService.selectPermissionResources(
+        request.isLoadAll(),
+        request.getPageIndex(),
+        request.getPageSize(), 
+        request.getMapBean());
+
+    PermissionRelatedResourcesResponseData data = PermissionRelatedResourcesResponseData.of(request).build(page);
+
+    return new DefaultApiResponse<PermissionRelatedResourcesResponseData>(data);
+  }
+
+  @RequestMapping(method = RequestMethod.POST, path = "/{id}/resources", consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseBody
+  public DefaultApiResponse<PermissionRelateResourcesResponseData> relateResources(
+      @PathVariable("id") String id, 
+      @RequestBody PermissionRelateResourcesRequest permissionResources) {
+
+    if (id == null || id.length() == 0) {
+      throw new RuntimeException("exception.get.id.must.not.empty"); // FIXME: RestException
+    }
+
+    Permission permission = permissionService.selectById(id);
+
+    if (permission == null) {
+      throw new RuntimeException("exception.get.domain.not.exist"); // FIXME: RestException
+    }
+
+    permissionService.relatePermissionResources(permission, permissionResources.getPermissionResources());
+
+    PermissionRelateResourcesResponseData data = PermissionRelateResourcesResponseData.of("info.relate.success");
+
+    return new DefaultApiResponse<PermissionRelateResourcesResponseData>(data);
+  }
+
 }
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminResourceController.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminResourceController.java
index a1aca6b..5594269 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminResourceController.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminResourceController.java
@@ -18,14 +18,14 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.supwisdom.institute.backend.base.api.v1.vo.request.ResourceCreateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.ResourceQueryRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.ResourceUpdateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ResourceCreateResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ResourceLoadResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ResourceQueryResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ResourceRemoveResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.ResourceUpdateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.ResourceCreateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.ResourceQueryRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.ResourceUpdateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.ResourceCreateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.ResourceLoadResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.ResourceQueryResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.ResourceRemoveResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.ResourceUpdateResponseData;
 import com.supwisdom.institute.backend.base.domain.entity.Resource;
 import com.supwisdom.institute.backend.base.domain.service.ResourceService;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminRoleController.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminRoleController.java
index 847b676..b45bc25 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminRoleController.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminRoleController.java
@@ -22,28 +22,28 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.supwisdom.institute.backend.base.api.v1.vo.request.RoleCreateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.RoleDeleteBatchRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.RoleQueryRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.RoleRelateAccountsRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.RoleRelateGroupsRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.RoleRelatePermissionsRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.RoleRelatedAccountsRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.RoleRelatedGroupsRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.RoleRelatedPermissionsRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.RoleUpdateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RoleCreateResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RoleDeleteBatchResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RoleLoadResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RoleQueryResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RoleRelateAccountsResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RoleRelateGroupsResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RoleRelatePermissionsResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RoleRelatedAccountsResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RoleRelatedGroupsResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RoleRelatedPermissionsResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RoleRemoveResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RoleUpdateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.RoleCreateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.RoleDeleteBatchRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.RoleQueryRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.RoleRelateAccountsRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.RoleRelateGroupsRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.RoleRelatePermissionsRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.RoleRelatedAccountsRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.RoleRelatedGroupsRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.RoleRelatedPermissionsRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.RoleUpdateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RoleCreateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RoleDeleteBatchResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RoleLoadResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RoleQueryResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RoleRelateAccountsResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RoleRelateGroupsResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RoleRelatePermissionsResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RoleRelatedAccountsResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RoleRelatedGroupsResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RoleRelatedPermissionsResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RoleRemoveResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RoleUpdateResponseData;
 import com.supwisdom.institute.backend.base.domain.entity.AccountRole;
 import com.supwisdom.institute.backend.base.domain.entity.GroupRole;
 import com.supwisdom.institute.backend.base.domain.entity.Role;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminRouteController.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminRouteController.java
index 06758c1..a52334d 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminRouteController.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/admin/AdminRouteController.java
@@ -20,16 +20,16 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.supwisdom.institute.backend.base.api.v1.vo.request.RouteCreateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.RouteDeleteBatchRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.RouteQueryRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.request.RouteUpdateRequest;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RouteCreateResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RouteDeleteBatchResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RouteLoadResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RouteQueryResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RouteRemoveResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.RouteUpdateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.RouteCreateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.RouteDeleteBatchRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.RouteQueryRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.RouteUpdateRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RouteCreateResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RouteDeleteBatchResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RouteLoadResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RouteQueryResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RouteRemoveResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.response.RouteUpdateResponseData;
 import com.supwisdom.institute.backend.base.domain.entity.Route;
 import com.supwisdom.institute.backend.base.domain.service.RouteService;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/authn/AuthnController.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/authn/AuthnController.java
index 291a80b..483d55f 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/authn/AuthnController.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/authn/AuthnController.java
@@ -1,6 +1,8 @@
 package com.supwisdom.institute.backend.base.api.v1.controller.authn;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
@@ -16,20 +18,29 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AuthnAccountPermissionsResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AuthnAccountResourcesResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AuthnAccountResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AuthnAccountRolesResponseData;
-import com.supwisdom.institute.backend.base.api.v1.vo.response.AuthnResourceRoleListResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.authn.response.AuthnAccountPermissionsResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.authn.response.AuthnAccountResourcesResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.authn.response.AuthnAccountResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.authn.response.AuthnAccountRolesResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.authn.response.AuthnApplicationsResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.authn.response.AuthnPermissionRoleListResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.authn.response.AuthnResourceRoleListResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.authn.response.AuthnRolesResponseData;
+import com.supwisdom.institute.backend.base.api.v1.vo.authn.response.AuthnRoutesResponseData;
 import com.supwisdom.institute.backend.base.domain.entity.Account;
+import com.supwisdom.institute.backend.base.domain.entity.Application;
 import com.supwisdom.institute.backend.base.domain.entity.Permission;
 import com.supwisdom.institute.backend.base.domain.entity.Resource;
 import com.supwisdom.institute.backend.base.domain.entity.Role;
+import com.supwisdom.institute.backend.base.domain.entity.Route;
+import com.supwisdom.institute.backend.base.domain.model.PermissionRoleSet;
 import com.supwisdom.institute.backend.base.domain.model.ResourceRoleSet;
 import com.supwisdom.institute.backend.base.domain.service.AccountService;
+import com.supwisdom.institute.backend.base.domain.service.ApplicationService;
 import com.supwisdom.institute.backend.base.domain.service.PermissionService;
 import com.supwisdom.institute.backend.base.domain.service.ResourceService;
 import com.supwisdom.institute.backend.base.domain.service.RoleService;
+import com.supwisdom.institute.backend.base.domain.service.RouteService;
 import com.supwisdom.institute.backend.common.framework.vo.response.DefaultApiResponse;
 
 @Api(value = "BaseAuthn", tags = { "BaseAuthn" }, description = "认证授权接口")
@@ -45,10 +56,16 @@
   private RoleService roleService;
   
   @Autowired
-  private PermissionService permissionService; 
+  private ApplicationService applicationService;
 
   @Autowired
-  private ResourceService resourceService; 
+  private PermissionService permissionService;
+
+  @Autowired
+  private ResourceService resourceService;
+
+  @Autowired
+  private RouteService routeService;
 
   @GetMapping(path = "/{username}/account", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseStatus(value = HttpStatus.OK)
@@ -190,18 +207,111 @@
     return new DefaultApiResponse<AuthnAccountResourcesResponseData>(data);
   }
   
-  @GetMapping(path = "/resources", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+//  @GetMapping(path = "/resources", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+//  @ResponseStatus(value = HttpStatus.OK)
+//  @ResponseBody
+//  public DefaultApiResponse<AuthnResourceRoleListResponseData> applicationResources(
+//      @RequestParam(name = "applicationId", required = false) String applicationId) {
+//
+//    List<ResourceRoleSet> resourceRoleSets = resourceService.selectByApplication(applicationId);
+//    
+//    AuthnResourceRoleListResponseData data = AuthnResourceRoleListResponseData.of(resourceRoleSets);
+//
+//    return new DefaultApiResponse<AuthnResourceRoleListResponseData>(data);
+//  }
+
+
+  @GetMapping(path = "/applications", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseStatus(value = HttpStatus.OK)
   @ResponseBody
-  public DefaultApiResponse<AuthnResourceRoleListResponseData> applicationResources(
-      @RequestParam(name = "applicationId", required = false) String applicationId) {
+  public DefaultApiResponse<AuthnApplicationsResponseData> applications() {
+    
+    Map<String, Object> mapBean = new HashMap<>();
+    Map<String, String> orderBy = null;
+    
+    mapBean.put("status", "1");
 
-    List<ResourceRoleSet> resourceRoleSets = resourceService.selectByApplication(applicationId);
+    List<Application> applications = applicationService.selectList(mapBean, orderBy);
+    
+    AuthnApplicationsResponseData data = AuthnApplicationsResponseData.of(applications);
+
+    return new DefaultApiResponse<AuthnApplicationsResponseData>(data);
+  }
+  
+  @GetMapping(path = "/roles", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public DefaultApiResponse<AuthnRolesResponseData> roles() {
+    
+    Map<String, Object> mapBean = new HashMap<>();
+    Map<String, String> orderBy = null;
+    
+    mapBean.put("status", "1");
+
+    List<Role> roles = roleService.selectList(mapBean, orderBy);
+    
+    AuthnRolesResponseData data = AuthnRolesResponseData.of(roles);
+
+    return new DefaultApiResponse<AuthnRolesResponseData>(data);
+  }
+  
+  
+  @GetMapping(path = "/permissionRoleSets", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public DefaultApiResponse<AuthnPermissionRoleListResponseData> permissionRoleSets(
+      @RequestParam(name = "applicationId", required = false) String applicationId) {
+    
+    Map<String, Object> mapBean = new HashMap<>();
+    
+    mapBean.put("status", "1");
+    if (applicationId != null && !applicationId.isEmpty()) {
+      mapBean.put("applicationId", applicationId);
+    }
+    
+    List<PermissionRoleSet> permissionRoleSets = permissionService.selectPermissionRoleSet(mapBean);
+    
+    AuthnPermissionRoleListResponseData data = AuthnPermissionRoleListResponseData.of(permissionRoleSets);
+
+    return new DefaultApiResponse<AuthnPermissionRoleListResponseData>(data);
+  }
+  
+  
+  @GetMapping(path = "/resourceRoleSets", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public DefaultApiResponse<AuthnResourceRoleListResponseData> resourceRoleSets(
+      @RequestParam(name = "applicationId", required = false) String applicationId) {
+    
+    Map<String, Object> mapBean = new HashMap<>();
+    
+    mapBean.put("status", "1");
+    
+    List<ResourceRoleSet> resourceRoleSets = resourceService.selectResourceRoleSet(mapBean);
     
     AuthnResourceRoleListResponseData data = AuthnResourceRoleListResponseData.of(resourceRoleSets);
 
     return new DefaultApiResponse<AuthnResourceRoleListResponseData>(data);
   }
   
+  
+
+  @GetMapping(path = "/routes", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public DefaultApiResponse<AuthnRoutesResponseData> routes() {
+    
+    Map<String, Object> mapBean = new HashMap<>();
+    Map<String, String> orderBy = null;
+    
+    mapBean.put("status", "1");
+
+    List<Route> routes = routeService.selectList(mapBean, orderBy);
+    
+    AuthnRoutesResponseData data = AuthnRoutesResponseData.of(routes);
+
+    return new DefaultApiResponse<AuthnRoutesResponseData>(data);
+  }
+  
 
 }
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/authn/AuthnResourceController.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/authn/AuthnResourceController.java
new file mode 100644
index 0000000..f7e6e5a
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/controller/authn/AuthnResourceController.java
@@ -0,0 +1,15 @@
+package com.supwisdom.institute.backend.base.api.v1.controller.authn;
+
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api(value = "BaseAuthnResource", tags = { "BaseAuthnResource" }, description = "资源接口(认证、授权用)")
+@Slf4j
+@RestController
+@RequestMapping("/v1/authn/resource")
+public class AuthnResourceController {
+
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountCreateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountCreateRequest.java
similarity index 87%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountCreateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountCreateRequest.java
index 8edeb11..bf8cfc7 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountCreateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountCreateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import com.supwisdom.institute.backend.base.domain.entity.Account;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountDeleteBatchRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountDeleteBatchRequest.java
similarity index 83%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountDeleteBatchRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountDeleteBatchRequest.java
index 8625ab2..d936658 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountDeleteBatchRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountDeleteBatchRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountQueryRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountQueryRequest.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountQueryRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountQueryRequest.java
index 29d9d47..f31652f 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountQueryRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountQueryRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountRelateGroupsRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountRelateGroupsRequest.java
similarity index 86%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountRelateGroupsRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountRelateGroupsRequest.java
index 76452b8..acb37d9 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountRelateGroupsRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountRelateGroupsRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountRelateRolesRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountRelateRolesRequest.java
similarity index 86%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountRelateRolesRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountRelateRolesRequest.java
index b70d196..dc59b3f 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountRelateRolesRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountRelateRolesRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountRelatedGroupsRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountRelatedGroupsRequest.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountRelatedGroupsRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountRelatedGroupsRequest.java
index 0d54b9b..d63a859 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountRelatedGroupsRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountRelatedGroupsRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountRelatedRolesRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountRelatedRolesRequest.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountRelatedRolesRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountRelatedRolesRequest.java
index 2e3baf4..d484452 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountRelatedRolesRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountRelatedRolesRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountUpdateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountUpdateRequest.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountUpdateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountUpdateRequest.java
index ca62298..795c687 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/AccountUpdateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/AccountUpdateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import com.supwisdom.institute.backend.base.domain.entity.Account;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ApplicationCreateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ApplicationCreateRequest.java
similarity index 88%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ApplicationCreateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ApplicationCreateRequest.java
index ffa645b..f950918 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ApplicationCreateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ApplicationCreateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import com.supwisdom.institute.backend.base.domain.entity.Application;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ApplicationDeleteBatchRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ApplicationDeleteBatchRequest.java
similarity index 83%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ApplicationDeleteBatchRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ApplicationDeleteBatchRequest.java
index ecc680e..62e69ed 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ApplicationDeleteBatchRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ApplicationDeleteBatchRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ApplicationQueryRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ApplicationQueryRequest.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ApplicationQueryRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ApplicationQueryRequest.java
index 34bcfb3..b4b6ea1 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ApplicationQueryRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ApplicationQueryRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ApplicationUpdateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ApplicationUpdateRequest.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ApplicationUpdateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ApplicationUpdateRequest.java
index 1f7deaa..12f8a49 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ApplicationUpdateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ApplicationUpdateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import com.supwisdom.institute.backend.base.domain.entity.Application;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ConfigCreateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ConfigCreateRequest.java
similarity index 87%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ConfigCreateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ConfigCreateRequest.java
index ec8a7bf..6506f3b 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ConfigCreateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ConfigCreateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import com.supwisdom.institute.backend.base.domain.entity.Config;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ConfigQueryRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ConfigQueryRequest.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ConfigQueryRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ConfigQueryRequest.java
index b9a18fb..53f2b29 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ConfigQueryRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ConfigQueryRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ConfigUpdateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ConfigUpdateRequest.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ConfigUpdateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ConfigUpdateRequest.java
index 660eb61..6fd4fc9 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ConfigUpdateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ConfigUpdateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import com.supwisdom.institute.backend.base.domain.entity.Config;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupCreateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupCreateRequest.java
similarity index 87%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupCreateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupCreateRequest.java
index 5eb8f8d..8f60f9c 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupCreateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupCreateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import com.supwisdom.institute.backend.base.domain.entity.Group;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupQueryRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupQueryRequest.java
similarity index 90%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupQueryRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupQueryRequest.java
index f150564..ea610b3 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupQueryRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupQueryRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelateAccountsRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupRelateAccountsRequest.java
similarity index 86%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelateAccountsRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupRelateAccountsRequest.java
index daa3812..8b81132 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelateAccountsRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupRelateAccountsRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelateRolesRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupRelateRolesRequest.java
similarity index 85%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelateRolesRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupRelateRolesRequest.java
index 2a170bc..52b4486 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelateRolesRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupRelateRolesRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelatedAccountsRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupRelatedAccountsRequest.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelatedAccountsRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupRelatedAccountsRequest.java
index c4988b9..6a1b13d 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelatedAccountsRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupRelatedAccountsRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelatedRolesRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupRelatedRolesRequest.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelatedRolesRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupRelatedRolesRequest.java
index ae868b9..6000d6a 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelatedRolesRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupRelatedRolesRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupUpdateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupUpdateRequest.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupUpdateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupUpdateRequest.java
index bf84a60..63e82fd 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupUpdateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/GroupUpdateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import com.supwisdom.institute.backend.base.domain.entity.Group;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/PermissionCreateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionCreateRequest.java
similarity index 73%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/PermissionCreateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionCreateRequest.java
index 3758f00..e287f65 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/PermissionCreateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionCreateRequest.java
@@ -1,4 +1,9 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
+
+import java.util.List;
+
+import lombok.Getter;
+import lombok.Setter;
 
 import com.supwisdom.institute.backend.base.domain.entity.Permission;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
@@ -14,6 +19,10 @@
    */
   private static final long serialVersionUID = 8247861768124918116L;
 
+  @Getter
+  @Setter
+  private List<String> resourceIds;
+
   public Permission getEntity() {
     return EntityUtils.copy(this, new Permission());
   }
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/PermissionDeleteBatchRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionDeleteBatchRequest.java
similarity index 83%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/PermissionDeleteBatchRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionDeleteBatchRequest.java
index 5732dc9..9777b30 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/PermissionDeleteBatchRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionDeleteBatchRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/PermissionQueryRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionQueryRequest.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/PermissionQueryRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionQueryRequest.java
index 8639230..d32f363 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/PermissionQueryRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionQueryRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionRelateResourcesRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionRelateResourcesRequest.java
new file mode 100644
index 0000000..ae09876
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionRelateResourcesRequest.java
@@ -0,0 +1,22 @@
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
+
+import java.util.List;
+
+import com.supwisdom.institute.backend.base.domain.entity.PermissionResource;
+import com.supwisdom.institute.backend.common.framework.vo.request.IApiRequest;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class PermissionRelateResourcesRequest implements IApiRequest {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -7016517754275684031L;
+
+  @Getter
+  @Setter
+  private List<PermissionResource> permissionResources;
+
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelatedAccountsRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionRelatedResourcesRequest.java
similarity index 72%
copy from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelatedAccountsRequest.java
copy to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionRelatedResourcesRequest.java
index c4988b9..4419071 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/GroupRelatedAccountsRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionRelatedResourcesRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -12,12 +12,12 @@
 /**
  * @author loie
  */
-public class GroupRelatedAccountsRequest implements IApiQueryRequest {
+public class PermissionRelatedResourcesRequest implements IApiQueryRequest {
 
   /**
    * 
    */
-  private static final long serialVersionUID = -3102006206798574212L;
+  private static final long serialVersionUID = -7634304817036292579L;
 
   @Getter
   @Setter
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/PermissionUpdateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionUpdateRequest.java
similarity index 80%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/PermissionUpdateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionUpdateRequest.java
index 583d272..00d28c4 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/PermissionUpdateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/PermissionUpdateRequest.java
@@ -1,4 +1,6 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
+
+import java.util.List;
 
 import com.supwisdom.institute.backend.base.domain.entity.Permission;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
@@ -21,6 +23,10 @@
   @Setter
   private String id;
 
+  @Getter
+  @Setter
+  private List<String> resourceIds;
+
   public Permission getEntity() {
     return EntityUtils.copy(this, new Permission());
   }
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ResourceCreateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ResourceCreateRequest.java
similarity index 87%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ResourceCreateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ResourceCreateRequest.java
index 774661f..3c17cac 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ResourceCreateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ResourceCreateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import com.supwisdom.institute.backend.base.domain.entity.Resource;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ResourceQueryRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ResourceQueryRequest.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ResourceQueryRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ResourceQueryRequest.java
index 78080db..7171557 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ResourceQueryRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ResourceQueryRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ResourceUpdateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ResourceUpdateRequest.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ResourceUpdateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ResourceUpdateRequest.java
index ed9566f..596cbd7 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/ResourceUpdateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/ResourceUpdateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import com.supwisdom.institute.backend.base.domain.entity.Resource;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleCreateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleCreateRequest.java
similarity index 87%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleCreateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleCreateRequest.java
index 1df074d..e91cfba 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleCreateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleCreateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import com.supwisdom.institute.backend.base.domain.entity.Role;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleDeleteBatchRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleDeleteBatchRequest.java
similarity index 83%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleDeleteBatchRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleDeleteBatchRequest.java
index d68cb8c..94a23a5 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleDeleteBatchRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleDeleteBatchRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleQueryRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleQueryRequest.java
similarity index 90%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleQueryRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleQueryRequest.java
index 8cd2441..db54ea4 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleQueryRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleQueryRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelateAccountsRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelateAccountsRequest.java
similarity index 86%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelateAccountsRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelateAccountsRequest.java
index c89d8f7..1fc5848 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelateAccountsRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelateAccountsRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelateGroupsRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelateGroupsRequest.java
similarity index 85%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelateGroupsRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelateGroupsRequest.java
index f07f1cf..e400df4 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelateGroupsRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelateGroupsRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelatePermissionsRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelatePermissionsRequest.java
similarity index 86%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelatePermissionsRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelatePermissionsRequest.java
index d09f228..dc31c16 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelatePermissionsRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelatePermissionsRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelatedAccountsRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelatedAccountsRequest.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelatedAccountsRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelatedAccountsRequest.java
index 5bb2b5f..2d8b77e 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelatedAccountsRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelatedAccountsRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelatedGroupsRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelatedGroupsRequest.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelatedGroupsRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelatedGroupsRequest.java
index fe84ce0..b69aef5 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelatedGroupsRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelatedGroupsRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelatedPermissionsRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelatedPermissionsRequest.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelatedPermissionsRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelatedPermissionsRequest.java
index 9819583..7ff22a2 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleRelatedPermissionsRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleRelatedPermissionsRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleUpdateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleUpdateRequest.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleUpdateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleUpdateRequest.java
index e128db2..b1137db 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RoleUpdateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RoleUpdateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import com.supwisdom.institute.backend.base.domain.entity.Role;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RouteCreateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RouteCreateRequest.java
similarity index 87%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RouteCreateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RouteCreateRequest.java
index 3c5e415..f1af807 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RouteCreateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RouteCreateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import com.supwisdom.institute.backend.base.domain.entity.Route;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RouteDeleteBatchRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RouteDeleteBatchRequest.java
similarity index 83%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RouteDeleteBatchRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RouteDeleteBatchRequest.java
index 4cc0514..af2657c 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RouteDeleteBatchRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RouteDeleteBatchRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RouteQueryRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RouteQueryRequest.java
similarity index 90%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RouteQueryRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RouteQueryRequest.java
index 69fb8a5..b077d34 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RouteQueryRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RouteQueryRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RouteUpdateRequest.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RouteUpdateRequest.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RouteUpdateRequest.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RouteUpdateRequest.java
index 7465d7b..e96eb28 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/request/RouteUpdateRequest.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/request/RouteUpdateRequest.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.request;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.request;
 
 import com.supwisdom.institute.backend.base.domain.entity.Route;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountCreateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountCreateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountCreateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountCreateResponseData.java
index 1c8686f..d4b91d8 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountCreateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountCreateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Account;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountDeleteBatchResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountDeleteBatchResponseData.java
similarity index 90%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountDeleteBatchResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountDeleteBatchResponseData.java
index 4262a4d..6c471ee 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountDeleteBatchResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountDeleteBatchResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountLoadResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountLoadResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountLoadResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountLoadResponseData.java
index 6e4367f..a9f250d 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountLoadResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountLoadResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Account;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountQueryResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountQueryResponseData.java
similarity index 96%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountQueryResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountQueryResponseData.java
index 479d326..a36d033 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountQueryResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountQueryResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRelateGroupsResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRelateGroupsResponseData.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRelateGroupsResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRelateGroupsResponseData.java
index 1de8493..a269841 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRelateGroupsResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRelateGroupsResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRelateRolesResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRelateRolesResponseData.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRelateRolesResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRelateRolesResponseData.java
index 4d4f022..93895ff 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRelateRolesResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRelateRolesResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRelatedGroupsResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRelatedGroupsResponseData.java
similarity index 96%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRelatedGroupsResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRelatedGroupsResponseData.java
index d2f63bc..802437d 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRelatedGroupsResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRelatedGroupsResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRelatedRolesResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRelatedRolesResponseData.java
similarity index 96%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRelatedRolesResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRelatedRolesResponseData.java
index 8b77cb0..5289a30 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRelatedRolesResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRelatedRolesResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRemoveResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRemoveResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRemoveResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRemoveResponseData.java
index a81b480..40d0b87 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountRemoveResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountRemoveResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountUpdateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountUpdateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountUpdateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountUpdateResponseData.java
index 7c83b45..59cba51 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AccountUpdateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/AccountUpdateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Account;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationCreateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationCreateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationCreateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationCreateResponseData.java
index 6173035..b4a7c94 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationCreateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationCreateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Application;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationDeleteBatchResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationDeleteBatchResponseData.java
similarity index 90%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationDeleteBatchResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationDeleteBatchResponseData.java
index 58fc10b..9e22692 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationDeleteBatchResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationDeleteBatchResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationLoadResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationLoadResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationLoadResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationLoadResponseData.java
index 9a85e69..27acd2f 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationLoadResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationLoadResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Application;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationQueryResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationQueryResponseData.java
similarity index 96%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationQueryResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationQueryResponseData.java
index 4602ceb..c0fb9bd 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationQueryResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationQueryResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationRemoveResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationRemoveResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationRemoveResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationRemoveResponseData.java
index c12b752..97f1a87 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationRemoveResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationRemoveResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationUpdateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationUpdateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationUpdateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationUpdateResponseData.java
index 2512931..1a72e5c 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ApplicationUpdateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ApplicationUpdateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Application;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigCreateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigCreateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigCreateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigCreateResponseData.java
index bbbace5..663f179 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigCreateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigCreateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Config;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigLoadResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigLoadResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigLoadResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigLoadResponseData.java
index a8601b4..c8ddafa 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigLoadResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigLoadResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Config;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigQueryResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigQueryResponseData.java
similarity index 92%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigQueryResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigQueryResponseData.java
index 587ba24..6255a4b 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigQueryResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigQueryResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -8,7 +8,7 @@
 
 import org.springframework.data.domain.Page;
 
-import com.supwisdom.institute.backend.base.api.v1.vo.request.ConfigQueryRequest;
+import com.supwisdom.institute.backend.base.api.v1.vo.admin.request.ConfigQueryRequest;
 import com.supwisdom.institute.backend.base.domain.entity.Config;
 import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiQueryResponseData;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigRemoveResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigRemoveResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigRemoveResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigRemoveResponseData.java
index 0123609..e656a1f 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigRemoveResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigRemoveResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigUpdateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigUpdateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigUpdateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigUpdateResponseData.java
index 1cd0588..df4de29 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ConfigUpdateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ConfigUpdateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Config;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupCreateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupCreateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupCreateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupCreateResponseData.java
index 5fb1fa9..4c3f545 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupCreateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupCreateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Group;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupLoadResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupLoadResponseData.java
similarity index 90%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupLoadResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupLoadResponseData.java
index c3b323b..a3b83b0 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupLoadResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupLoadResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Group;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupQueryResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupQueryResponseData.java
similarity index 96%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupQueryResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupQueryResponseData.java
index c29d90c..20e6fac 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupQueryResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupQueryResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRelateAccountsResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRelateAccountsResponseData.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRelateAccountsResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRelateAccountsResponseData.java
index 3f99807..fbc6b08 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRelateAccountsResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRelateAccountsResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRelateRolesResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRelateRolesResponseData.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRelateRolesResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRelateRolesResponseData.java
index bae5100..104041c 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRelateRolesResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRelateRolesResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRelatedAccountsResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRelatedAccountsResponseData.java
similarity index 96%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRelatedAccountsResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRelatedAccountsResponseData.java
index 4e96631..1e9e819 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRelatedAccountsResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRelatedAccountsResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRelatedRolesResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRelatedRolesResponseData.java
similarity index 96%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRelatedRolesResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRelatedRolesResponseData.java
index a2b2f35..4ae2d5f 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRelatedRolesResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRelatedRolesResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRemoveResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRemoveResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRemoveResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRemoveResponseData.java
index 88eae2b..08e7440 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupRemoveResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupRemoveResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupUpdateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupUpdateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupUpdateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupUpdateResponseData.java
index f0da2d9..3ae507d 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/GroupUpdateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/GroupUpdateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Group;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionCreateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionCreateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionCreateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionCreateResponseData.java
index f0deee4..cec1042 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionCreateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionCreateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Permission;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionDeleteBatchResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionDeleteBatchResponseData.java
similarity index 90%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionDeleteBatchResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionDeleteBatchResponseData.java
index 88d4fbb..f1626bf 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionDeleteBatchResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionDeleteBatchResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionLoadResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionLoadResponseData.java
similarity index 65%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionLoadResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionLoadResponseData.java
index 7349eac..3815743 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionLoadResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionLoadResponseData.java
@@ -1,4 +1,6 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
+
+import java.util.List;
 
 import com.supwisdom.institute.backend.base.domain.entity.Permission;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
@@ -21,13 +23,22 @@
   @Setter
   private String id;
 
+  @Getter
+  @Setter
+  private List<String> resourceIds;
+
+  
   private PermissionLoadResponseData() {
 
   }
 
-  public static PermissionLoadResponseData of(Permission entity) {
+  public static PermissionLoadResponseData of(Permission entity, List<String> resourceIds) {
     PermissionLoadResponseData data = new PermissionLoadResponseData();
-    return EntityUtils.copy(entity, data);
+
+    EntityUtils.copy(entity, data);
+    data.setResourceIds(resourceIds);
+    
+    return data;
   }
 
 }
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionQueryResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionQueryResponseData.java
similarity index 96%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionQueryResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionQueryResponseData.java
index 4454c4e..436a7ee 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionQueryResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionQueryResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionRelateResourcesResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionRelateResourcesResponseData.java
new file mode 100644
index 0000000..e895aac
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionRelateResourcesResponseData.java
@@ -0,0 +1,29 @@
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
+
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiResponseData;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class PermissionRelateResourcesResponseData implements IApiResponseData {
+  
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 5576856617389758687L;
+
+  @Getter
+  @Setter
+  private String message;
+
+  public PermissionRelateResourcesResponseData(String message) {
+    this.message = message;
+  }
+
+  public static PermissionRelateResourcesResponseData of(String message) {
+    PermissionRelateResourcesResponseData data = new PermissionRelateResourcesResponseData(message);
+    
+    return data;
+  }
+
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionQueryResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionRelatedResourcesResponseData.java
similarity index 64%
copy from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionQueryResponseData.java
copy to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionRelatedResourcesResponseData.java
index 4454c4e..969d3c6 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionQueryResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionRelatedResourcesResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -8,21 +8,21 @@
 
 import org.springframework.data.domain.Page;
 
-import com.supwisdom.institute.backend.base.domain.entity.Permission;
+import com.supwisdom.institute.backend.base.domain.entity.PermissionResource;
 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 PermissionQueryResponseData implements IApiQueryResponseData<Permission> {
+public class PermissionRelatedResourcesResponseData implements IApiQueryResponseData<PermissionResource> {
 
   /**
    * 
    */
-  private static final long serialVersionUID = -8586983968415937644L;
+  private static final long serialVersionUID = -2095633445866557991L;
 
-  private PermissionQueryResponseData(boolean loadAll, int pageIndex, int pageSize, Map<String, Object> mapBean, Map<String, String> orderBy) {
+  private PermissionRelatedResourcesResponseData(boolean loadAll, int pageIndex, int pageSize, Map<String, Object> mapBean, Map<String, String> orderBy) {
     this.loadAll = loadAll;
     this.pageIndex = pageIndex;
     this.pageSize = pageSize;
@@ -30,8 +30,8 @@
     this.orderBy = orderBy;
   }
 
-  public static PermissionQueryResponseData of(IApiQueryRequest queryRequest) {
-    PermissionQueryResponseData configQueryResponse = new PermissionQueryResponseData(
+  public static PermissionRelatedResourcesResponseData of(IApiQueryRequest queryRequest) {
+    PermissionRelatedResourcesResponseData configQueryResponse = new PermissionRelatedResourcesResponseData(
         queryRequest.isLoadAll(), 
         queryRequest.getPageIndex(), 
         queryRequest.getPageSize(), 
@@ -42,7 +42,7 @@
     return configQueryResponse;
   }
   
-  public PermissionQueryResponseData build(Page<Permission> page) {
+  public PermissionRelatedResourcesResponseData build(Page<PermissionResource> page) {
     this.currentItemCount = page.getNumberOfElements();
     this.pageCount = page.getTotalPages();
     this.recordCount = page.getTotalElements();
@@ -75,6 +75,6 @@
   
   @Getter
   @Setter
-  private List<Permission> items;
+  private List<PermissionResource> items;
   
 }
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionRemoveResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionRemoveResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionRemoveResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionRemoveResponseData.java
index 1ba012c..d54d0a1 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionRemoveResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionRemoveResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionTreeResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionTreeResponseData.java
similarity index 90%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionTreeResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionTreeResponseData.java
index 20e2867..1735549 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionTreeResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionTreeResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 
 import lombok.Getter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionUpdateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionUpdateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionUpdateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionUpdateResponseData.java
index 1a9d5ec..806c2c6 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/PermissionUpdateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/PermissionUpdateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Permission;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceCreateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceCreateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceCreateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceCreateResponseData.java
index efbf365..1a07eb1 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceCreateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceCreateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Resource;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceLoadResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceLoadResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceLoadResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceLoadResponseData.java
index 29ff983..289e776 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceLoadResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceLoadResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Resource;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceQueryResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceQueryResponseData.java
similarity index 96%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceQueryResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceQueryResponseData.java
index 0a23123..b591899 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceQueryResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceQueryResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceRemoveResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceRemoveResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceRemoveResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceRemoveResponseData.java
index 88797a4..ecc9988 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceRemoveResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceRemoveResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceUpdateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceUpdateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceUpdateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceUpdateResponseData.java
index 544628a..f6c4292 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/ResourceUpdateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/ResourceUpdateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Resource;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleCreateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleCreateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleCreateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleCreateResponseData.java
index f850412..bae356d 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleCreateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleCreateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Role;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleDeleteBatchResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleDeleteBatchResponseData.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleDeleteBatchResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleDeleteBatchResponseData.java
index 579dd5d..61776d3 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleDeleteBatchResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleDeleteBatchResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleLoadResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleLoadResponseData.java
similarity index 90%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleLoadResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleLoadResponseData.java
index d3697df..bbbc439 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleLoadResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleLoadResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Role;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleQueryResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleQueryResponseData.java
similarity index 96%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleQueryResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleQueryResponseData.java
index 3f418e8..24d6a09 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleQueryResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleQueryResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelateAccountsResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelateAccountsResponseData.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelateAccountsResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelateAccountsResponseData.java
index c1c40fb..f137972 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelateAccountsResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelateAccountsResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelateGroupsResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelateGroupsResponseData.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelateGroupsResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelateGroupsResponseData.java
index 0ece115..5c752ae 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelateGroupsResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelateGroupsResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelatePermissionsResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelatePermissionsResponseData.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelatePermissionsResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelatePermissionsResponseData.java
index b9c84b3..da7c9c2 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelatePermissionsResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelatePermissionsResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelatedAccountsResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelatedAccountsResponseData.java
similarity index 96%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelatedAccountsResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelatedAccountsResponseData.java
index 74c2182..a906d6e 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelatedAccountsResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelatedAccountsResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelatedGroupsResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelatedGroupsResponseData.java
similarity index 96%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelatedGroupsResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelatedGroupsResponseData.java
index 8d1e16c..cf5dc80 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelatedGroupsResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelatedGroupsResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelatedPermissionsResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelatedPermissionsResponseData.java
similarity index 96%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelatedPermissionsResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelatedPermissionsResponseData.java
index d551ecf..05ab0c5 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRelatedPermissionsResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRelatedPermissionsResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRemoveResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRemoveResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRemoveResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRemoveResponseData.java
index 141f2bd..3f97566 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleRemoveResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleRemoveResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleUpdateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleUpdateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleUpdateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleUpdateResponseData.java
index 11faf54..3f5e93f 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RoleUpdateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RoleUpdateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Role;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteCreateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteCreateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteCreateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteCreateResponseData.java
index 63427c7..ea50cd4 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteCreateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteCreateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Route;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteDeleteBatchResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteDeleteBatchResponseData.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteDeleteBatchResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteDeleteBatchResponseData.java
index ebe8772..da236b1 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteDeleteBatchResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteDeleteBatchResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteLoadResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteLoadResponseData.java
similarity index 90%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteLoadResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteLoadResponseData.java
index f8cae4d..5fd52d1 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteLoadResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteLoadResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Route;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteQueryResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteQueryResponseData.java
similarity index 96%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteQueryResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteQueryResponseData.java
index 3d3b46c..99d3fb7 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteQueryResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteQueryResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteRemoveResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteRemoveResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteRemoveResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteRemoveResponseData.java
index 3953618..4735d20 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteRemoveResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteRemoveResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteUpdateResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteUpdateResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteUpdateResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteUpdateResponseData.java
index 206377c..89ace30 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/RouteUpdateResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/admin/response/RouteUpdateResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.admin.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Route;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnAccountPermissionsResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnAccountPermissionsResponseData.java
similarity index 90%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnAccountPermissionsResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnAccountPermissionsResponseData.java
index 5b008cc..3d3aa4c 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnAccountPermissionsResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnAccountPermissionsResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.authn.response;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnAccountResourcesResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnAccountResourcesResponseData.java
similarity index 90%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnAccountResourcesResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnAccountResourcesResponseData.java
index d9158a2..617be41 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnAccountResourcesResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnAccountResourcesResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.authn.response;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnAccountResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnAccountResponseData.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnAccountResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnAccountResponseData.java
index f06fc6e..a84f199 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnAccountResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnAccountResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.authn.response;
 
 import com.supwisdom.institute.backend.base.domain.entity.Account;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnAccountRolesResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnAccountRolesResponseData.java
similarity index 89%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnAccountRolesResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnAccountRolesResponseData.java
index a51e39b..2241c15 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnAccountRolesResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnAccountRolesResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.authn.response;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnApplicationsResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnApplicationsResponseData.java
new file mode 100644
index 0000000..79dae74
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnApplicationsResponseData.java
@@ -0,0 +1,31 @@
+package com.supwisdom.institute.backend.base.api.v1.vo.authn.response;
+
+import java.util.List;
+
+import com.supwisdom.institute.backend.base.domain.entity.Application;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiResponseData;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class AuthnApplicationsResponseData implements IApiResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 277008963651011910L;
+
+  @Getter
+  @Setter
+  public List<Application> applications;
+  
+  
+  public static AuthnApplicationsResponseData of(List<Application> applications) {
+    AuthnApplicationsResponseData data = new AuthnApplicationsResponseData();
+    
+    data.setApplications(applications);
+    
+    return data;
+  }
+
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnPermissionRoleListResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnPermissionRoleListResponseData.java
new file mode 100644
index 0000000..bca4b9d
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnPermissionRoleListResponseData.java
@@ -0,0 +1,30 @@
+package com.supwisdom.institute.backend.base.api.v1.vo.authn.response;
+
+import java.util.List;
+
+import com.supwisdom.institute.backend.base.domain.model.PermissionRoleSet;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiResponseData;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class AuthnPermissionRoleListResponseData implements IApiResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -1484993874632504947L;
+
+  @Getter
+  @Setter
+  public List<PermissionRoleSet> permissionRoleSets;
+  
+  public static AuthnPermissionRoleListResponseData of(List<PermissionRoleSet> permissionRoleSets) {
+    AuthnPermissionRoleListResponseData data = new AuthnPermissionRoleListResponseData();
+    
+    data.setPermissionRoleSets(permissionRoleSets);
+    
+    return data;
+  }
+
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnResourceRoleListResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnResourceRoleListResponseData.java
similarity index 91%
rename from base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnResourceRoleListResponseData.java
rename to base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnResourceRoleListResponseData.java
index 9d89d3a..da6df80 100644
--- a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/response/AuthnResourceRoleListResponseData.java
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnResourceRoleListResponseData.java
@@ -1,4 +1,4 @@
-package com.supwisdom.institute.backend.base.api.v1.vo.response;
+package com.supwisdom.institute.backend.base.api.v1.vo.authn.response;
 
 import java.util.List;
 
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnRolesResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnRolesResponseData.java
new file mode 100644
index 0000000..4f503ed
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnRolesResponseData.java
@@ -0,0 +1,31 @@
+package com.supwisdom.institute.backend.base.api.v1.vo.authn.response;
+
+import java.util.List;
+
+import com.supwisdom.institute.backend.base.domain.entity.Role;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiResponseData;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class AuthnRolesResponseData implements IApiResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -3695033930841370744L;
+
+  @Getter
+  @Setter
+  public List<Role> roles;
+  
+  
+  public static AuthnRolesResponseData of(List<Role> roles) {
+    AuthnRolesResponseData data = new AuthnRolesResponseData();
+    
+    data.setRoles(roles);
+    
+    return data;
+  }
+
+}
diff --git a/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnRoutesResponseData.java b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnRoutesResponseData.java
new file mode 100644
index 0000000..3c46ae4
--- /dev/null
+++ b/base/api/src/main/java/com/supwisdom/institute/backend/base/api/v1/vo/authn/response/AuthnRoutesResponseData.java
@@ -0,0 +1,31 @@
+package com.supwisdom.institute.backend.base.api.v1.vo.authn.response;
+
+import java.util.List;
+
+import com.supwisdom.institute.backend.base.domain.entity.Route;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiResponseData;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class AuthnRoutesResponseData implements IApiResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -7221340609572046915L;
+
+  @Getter
+  @Setter
+  public List<Route> routes;
+  
+  
+  public static AuthnRoutesResponseData of(List<Route> routes) {
+    AuthnRoutesResponseData data = new AuthnRoutesResponseData();
+    
+    data.setRoutes(routes);
+    
+    return data;
+  }
+
+}
diff --git a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/entity/Permission.java b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/entity/Permission.java
index ef218bf..c5b1e18 100644
--- a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/entity/Permission.java
+++ b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/entity/Permission.java
@@ -68,6 +68,12 @@
   private String type;
 
   /**
+   * 菜单图标
+   */
+  @Column(name = "ICON", nullable = true)
+  private String icon;
+
+  /**
    * URL地址
    */
   @Column(name = "URL", nullable = true)
diff --git a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/entity/PermissionResource.java b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/entity/PermissionResource.java
new file mode 100644
index 0000000..7ec0413
--- /dev/null
+++ b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/entity/PermissionResource.java
@@ -0,0 +1,46 @@
+package com.supwisdom.institute.backend.base.domain.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+import com.supwisdom.institute.backend.common.framework.entity.ABaseEntity;
+
+@Entity
+@Table(name = "TB_BASE_PERMISSION_RESOURCE")
+public class PermissionResource extends ABaseEntity {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 4224037561100974979L;
+
+  /**
+   * 权限ID
+   */
+  @Column(name = "PERMISSION_ID")
+  private String permissionId;
+
+  /**
+   * 资源ID
+   */
+  @Column(name = "RESOURCE_ID")
+  private String resourceId;
+
+  public String getPermissionId() {
+    return permissionId;
+  }
+
+  public void setPermissionId(String permissionId) {
+    this.permissionId = permissionId;
+  }
+
+  public String getResourceId() {
+    return resourceId;
+  }
+
+  public void setResourceId(String resourceId) {
+    this.resourceId = resourceId;
+  }
+
+}
diff --git a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/entity/Resource.java b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/entity/Resource.java
index 24ab992..8f8f8a4 100644
--- a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/entity/Resource.java
+++ b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/entity/Resource.java
@@ -18,6 +18,12 @@
    */
   private static final long serialVersionUID = 4288268877209267453L;
 
+  public static final String ACCESS_ANONYMOUS = "anonymous"; // 匿名访问anonymous
+  public static final String ACCESS_AUTHENTICATE = "authenticate"; // 认证访问authenticate
+  public static final String ACCESS_AUTHORIZE = "authorize"; // 授权访问authorize
+  public static final String ACCESS_PERMIT_ALL = "permitAll"; // 允许所有permitAll
+  public static final String ACCESS_DENY_ALL = "denyAll"; // 拒绝所有denyAll
+
   /**
    * 代码
    */
@@ -66,4 +72,12 @@
   @Column(name = "PATH")
   private String path;
 
+  /**
+   * 访问规则(匿名访问anonymous、认证访问authenticate、授权访问authorize、允许所有permitAll、拒绝所有denyAll)
+   */
+  @Getter
+  @Setter
+  @Column(name = "ACCESS")
+  private String access;
+
 }
diff --git a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/model/PermissionRoleSet.java b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/model/PermissionRoleSet.java
new file mode 100644
index 0000000..a95a0f7
--- /dev/null
+++ b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/model/PermissionRoleSet.java
@@ -0,0 +1,31 @@
+package com.supwisdom.institute.backend.base.domain.model;
+
+import java.util.Collection;
+
+import com.supwisdom.institute.backend.base.domain.entity.Permission;
+import com.supwisdom.institute.backend.base.domain.entity.Role;
+import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
+import com.supwisdom.institute.backend.common.framework.model.IModel;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class PermissionRoleSet extends Permission implements IModel {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -1823157193945264156L;
+
+  @Getter
+  @Setter
+  Collection<Role> roles;
+  
+  public PermissionRoleSet(Permission permission, Collection<Role> roles) {
+    
+    EntityUtils.copy(permission, this);
+    
+    this.roles = roles;
+  }
+  
+}
diff --git a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/model/ResourceRoleSet.java b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/model/ResourceRoleSet.java
index d356ab6..598b30d 100644
--- a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/model/ResourceRoleSet.java
+++ b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/model/ResourceRoleSet.java
@@ -1,12 +1,13 @@
 package com.supwisdom.institute.backend.base.domain.model;
 
-import java.util.Set;
+import java.util.Collection;
 
 import lombok.Getter;
 import lombok.Setter;
 
 import com.supwisdom.institute.backend.base.domain.entity.Resource;
 import com.supwisdom.institute.backend.base.domain.entity.Role;
+import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
 import com.supwisdom.institute.backend.common.framework.model.IModel;
 
 public class ResourceRoleSet extends Resource implements IModel {
@@ -18,6 +19,13 @@
 
   @Getter
   @Setter
-  Set<Role> roles;
+  Collection<Role> roles;
+
+  public ResourceRoleSet(Resource resource, Collection<Role> roles) {
+    
+    EntityUtils.copy(resource, this);
+    
+    this.roles = roles;
+  }
   
 }
diff --git a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/repo/PermissionResourceRepository.java b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/repo/PermissionResourceRepository.java
new file mode 100644
index 0000000..c40aef7
--- /dev/null
+++ b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/repo/PermissionResourceRepository.java
@@ -0,0 +1,194 @@
+package com.supwisdom.institute.backend.base.domain.repo;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import org.springframework.data.domain.Example;
+import org.springframework.data.domain.ExampleMatcher;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Repository;
+
+import com.supwisdom.institute.backend.base.domain.entity.Permission;
+import com.supwisdom.institute.backend.base.domain.entity.PermissionResource;
+import com.supwisdom.institute.backend.base.domain.entity.Resource;
+import com.supwisdom.institute.backend.common.framework.repo.BaseJpaRepository;
+import com.supwisdom.institute.backend.common.util.MapBeanUtils;
+
+@Repository
+public interface PermissionResourceRepository extends BaseJpaRepository<PermissionResource> {
+
+  public default Page<PermissionResource> selectPageList(int pageIndex, int pageSize, Map<String, Object> mapBean) {
+    PermissionResource probe = new PermissionResource();
+    if (mapBean != null) {
+      probe.setPermissionId(MapBeanUtils.getString(mapBean, "permissionId"));
+      probe.setResourceId(MapBeanUtils.getString(mapBean, "resourceId"));
+    }
+
+    ExampleMatcher matcher = ExampleMatcher.matching()
+        .withMatcher("permissionId", ExampleMatcher.GenericPropertyMatchers.exact())
+        .withMatcher("resourceId", ExampleMatcher.GenericPropertyMatchers.exact());
+
+    PageRequest pageRequest = PageRequest.of(pageIndex, pageSize);
+    Example<PermissionResource> example = Example.of(probe, matcher);
+
+    Page<PermissionResource> page = this.findAll(example, pageRequest);
+
+    return page;
+  }
+
+  public default Page<PermissionResource> selectPermissionResources(int pageIndex, int pageSize, Map<String, Object> mapBean) {
+
+    PermissionResource probe = new PermissionResource();
+    if (mapBean != null) {
+      probe.setPermissionId(MapBeanUtils.getString(mapBean, "permissionId"));
+      probe.setResourceId(MapBeanUtils.getString(mapBean, "resourceId"));
+    }
+
+    ExampleMatcher matcher = ExampleMatcher.matching()
+        .withMatcher("permissionId", ExampleMatcher.GenericPropertyMatchers.exact())
+        .withMatcher("resourceId", ExampleMatcher.GenericPropertyMatchers.exact());
+
+    Example<PermissionResource> example = Example.of(probe, matcher);
+
+    PageRequest pageRequest = PageRequest.of(pageIndex, pageSize);
+
+    Page<PermissionResource> page = this.findAll(example, pageRequest); // FIXME: 多表关联查询
+
+    return page;
+  }
+
+  public default void relatePermissionResources(Permission permission, List<PermissionResource> relateResources) {
+
+    List<PermissionResource> existPermissionResources = this.selectListByPermissionId(permission.getId());
+
+    Map<String, PermissionResource> existMapPermissionResources = new LinkedHashMap<String, PermissionResource>();
+    for (PermissionResource permissionResource : existPermissionResources) {
+      String k = String.format("%s", permissionResource.getResourceId());
+      existMapPermissionResources.put(k, permissionResource);
+    }
+
+    for (PermissionResource permissionResource : relateResources) {
+      String k = String.format("%s", permissionResource.getResourceId());
+
+      if (existMapPermissionResources.containsKey(k)) {
+        existMapPermissionResources.remove(k);
+      } else {
+        permissionResource.setCompanyId(permission.getCompanyId());
+        permissionResource.setPermissionId(permission.getId());
+
+        this.insert(permissionResource);
+      }
+    }
+
+    for (PermissionResource rolePermission : existMapPermissionResources.values()) {
+      this.deleteById(rolePermission.getId());
+    }
+  }
+
+  public default List<PermissionResource> selectListByPermissionId(String permissionId) {
+
+    PermissionResource probe = new PermissionResource();
+    probe.setPermissionId(permissionId);
+
+    ExampleMatcher matcher = ExampleMatcher.matching().withMatcher("permissionId",
+        ExampleMatcher.GenericPropertyMatchers.exact());
+
+    Example<PermissionResource> example = Example.of(probe, matcher);
+
+    List<PermissionResource> rolePermissions = this.findAll(example);
+
+    return rolePermissions;
+  }
+
+  
+  public default void relateResourcePermissions(Resource resource, List<PermissionResource> relatePermissions) {
+
+    // 获取权限已关联的角色
+    List<PermissionResource> existResourcePermissions = this.selectListByResourceId(resource.getId());
+
+    Map<String, PermissionResource> existMapResourcePermissions = new LinkedHashMap<String, PermissionResource>();
+    for (PermissionResource permissionResource : existResourcePermissions) {
+      String k = String.format("%s", permissionResource.getPermissionId());
+      existMapResourcePermissions.put(k, permissionResource);
+    }
+
+    // 保存未关联的角色
+    for (PermissionResource permissionResource : relatePermissions) {
+      String k = String.format("%s", permissionResource.getPermissionId());
+
+      if (existMapResourcePermissions.containsKey(k)) {
+        existMapResourcePermissions.remove(k);
+      } else {
+        permissionResource.setCompanyId(resource.getCompanyId());
+        permissionResource.setResourceId(resource.getId());
+
+        this.insert(permissionResource);
+      }
+    }
+
+    // 删除移除关联的角色
+    for (PermissionResource rolePermission : existMapResourcePermissions.values()) {
+      this.deleteById(rolePermission.getId());
+    }
+  }
+  public default List<PermissionResource> selectListByResourceId(String resourceId) {
+
+    PermissionResource probe = new PermissionResource();
+    probe.setResourceId(resourceId);
+
+    ExampleMatcher matcher = ExampleMatcher.matching().withMatcher("resourceId",
+        ExampleMatcher.GenericPropertyMatchers.exact());
+
+    Example<PermissionResource> example = Example.of(probe, matcher);
+
+    List<PermissionResource> rolePermissions = this.findAll(example);
+
+    return rolePermissions;
+  }
+
+  
+  public default PermissionResource selectOneByPermissionResource(String permissionId, String resourceId) {
+
+    PermissionResource probe = new PermissionResource();
+    probe.setPermissionId(permissionId);
+    probe.setResourceId(resourceId);
+
+    ExampleMatcher matcher = ExampleMatcher.matching()
+        .withMatcher("permissionId", ExampleMatcher.GenericPropertyMatchers.exact())
+        .withMatcher("resourceId", ExampleMatcher.GenericPropertyMatchers.exact())
+        ;
+
+    Example<PermissionResource> example = Example.of(probe, matcher);
+    
+    Optional<PermissionResource> o = this.findOne(example);
+    
+    return o.isPresent() ? o.get() : null;
+  }
+
+  public default void addPermissionResource(String permissionId, String resourceId) {
+
+    PermissionResource rolePermission = this.selectOneByPermissionResource(permissionId, resourceId);
+    
+    if (rolePermission == null) {
+      rolePermission = new PermissionResource();
+      //rolePermission.setCompanyId(companyId);
+      rolePermission.setPermissionId(permissionId);
+      rolePermission.setResourceId(resourceId);
+      
+      this.insert(rolePermission);
+    }
+  }
+
+  public default void removePermissionResource(String permissionId, String resourceId) {
+
+    PermissionResource rolePermission = this.selectOneByPermissionResource(permissionId, resourceId);
+    
+    if (rolePermission != null) {
+      this.deleteById(rolePermission.getId());
+    }
+  }
+
+}
diff --git a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/repo/RoleRepository.java b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/repo/RoleRepository.java
index 5853b26..00c3ee6 100644
--- a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/repo/RoleRepository.java
+++ b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/repo/RoleRepository.java
@@ -143,4 +143,22 @@
       + "and r.status='1' and g.status='1' and a.status='1' and a.enabled=1 ")
   public List<Role> selectAccountGroupRoleByUsername(@Param("username") String username);
 
+  
+  @Query(value = "select r from Role r "
+      + "inner join RolePermission rp on r.id=rp.roleId "
+      + "inner join Permission p on rp.permissionId=p.id "
+      + "where p.id=:permissionId "
+      + "and r.status='1' and p.status='1' ")
+  public List<Role> selectPermissionRolesByPermission(@Param("permissionId") String permissionId);
+  
+  
+  @Query(value = "select r from Role r "
+      + "inner join RolePermission rp on r.id=rp.roleId "
+      + "inner join Permission p on rp.permissionId=p.id "
+      + "inner join PermissionResource pres on p.id=pres.permissionId "
+      + "inner join Resource res on pres.resourceId=res.id "
+      + "where res.id=:resourceId "
+      + "and r.status='1' and p.status='1' and res.status='1' ")
+  public List<Role> selectResourceRolesByResource(@Param("resourceId") String resourceId);
+  
 }
diff --git a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/service/PermissionService.java b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/service/PermissionService.java
index 39fe4e2..c546400 100644
--- a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/service/PermissionService.java
+++ b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/service/PermissionService.java
@@ -10,13 +10,23 @@
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Example;
+import org.springframework.data.domain.ExampleMatcher;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Service;
 
 import com.supwisdom.institute.backend.base.domain.entity.Permission;
+import com.supwisdom.institute.backend.base.domain.entity.PermissionResource;
+import com.supwisdom.institute.backend.base.domain.entity.Role;
+import com.supwisdom.institute.backend.base.domain.model.PermissionRoleSet;
 import com.supwisdom.institute.backend.base.domain.model.PermissionTreeNode;
 import com.supwisdom.institute.backend.base.domain.repo.PermissionRepository;
+import com.supwisdom.institute.backend.base.domain.repo.PermissionResourceRepository;
+import com.supwisdom.institute.backend.base.domain.repo.RoleRepository;
 import com.supwisdom.institute.backend.common.framework.entity.EntityUtils;
 import com.supwisdom.institute.backend.common.framework.service.ABaseService;
+import com.supwisdom.institute.backend.common.util.MapBeanUtils;
 
 @Slf4j
 @Service
@@ -29,7 +39,13 @@
 
   @Autowired
   private PermissionRepository permissionRepository;
-  
+
+  @Autowired
+  private PermissionResourceRepository permissionResourceRepository;
+
+  @Autowired
+  private RoleRepository roleRepository;
+
   @Override
   public Permission insert(Permission entity) {
     Permission parentPermission = permissionRepository.selectById(entity.getParentId());
@@ -47,6 +63,78 @@
     });
   }
   
+  
+
+  public Page<PermissionResource> selectPermissionResources(boolean loadAll, int pageIndex, int pageSize, Map<String, Object> mapBean) {
+    
+    if (loadAll) {
+      pageIndex = 0;
+      pageSize = Integer.MAX_VALUE;
+    }
+
+    PermissionResource probe = new PermissionResource();
+    if (mapBean != null) {
+      probe.setPermissionId(MapBeanUtils.getString(mapBean, "permissionId"));
+      probe.setResourceId(MapBeanUtils.getString(mapBean, "resourceId"));
+    }
+
+    ExampleMatcher matcher = ExampleMatcher.matching()
+        .withMatcher("permissionId", ExampleMatcher.GenericPropertyMatchers.exact())
+        .withMatcher("resourceId", ExampleMatcher.GenericPropertyMatchers.exact());
+
+    Example<PermissionResource> example = Example.of(probe, matcher);
+
+    PageRequest pageRequest = PageRequest.of(pageIndex, pageSize);
+
+    Page<PermissionResource> page = permissionResourceRepository.findAll(example, pageRequest); // FIXME: 多表关联查询
+
+    return page;
+  }
+
+  public void relatePermissionResources(Permission permission, List<PermissionResource> permissionResources) {
+
+    List<PermissionResource> existPermissionResources = this.selectPermissionResourcesByPermissionId(permission.getId());
+
+    Map<String, PermissionResource> existMapPermissionResources = new LinkedHashMap<String, PermissionResource>();
+    for (PermissionResource permissionResource : existPermissionResources) {
+      String k = String.format("%s", permissionResource.getPermissionId());
+      existMapPermissionResources.put(k, permissionResource);
+    }
+
+    for (PermissionResource permissionResource : permissionResources) {
+      String k = String.format("%s", permissionResource.getPermissionId());
+
+      if (existMapPermissionResources.containsKey(k)) {
+        existMapPermissionResources.remove(k);
+      } else {
+        permissionResource.setCompanyId(permission.getCompanyId());
+        permissionResource.setPermissionId(permission.getId());
+
+        permissionResourceRepository.insert(permissionResource);
+      }
+    }
+
+    for (PermissionResource permissionResource : existMapPermissionResources.values()) {
+      permissionResourceRepository.deleteById(permissionResource.getId());
+    }
+  }
+
+  public List<PermissionResource> selectPermissionResourcesByPermissionId(String permissionId) {
+
+    PermissionResource probe = new PermissionResource();
+    probe.setPermissionId(permissionId);
+
+    ExampleMatcher matcher = ExampleMatcher.matching().withMatcher("permissionId",
+        ExampleMatcher.GenericPropertyMatchers.exact());
+
+    Example<PermissionResource> example = Example.of(probe, matcher);
+
+    List<PermissionResource> permissionResources = permissionResourceRepository.findAll(example);
+
+    return permissionResources;
+  }
+  
+  
   private Permission selectApplicationPermission() {
     Permission permission = permissionRepository.selectById(Permission.APPLICATION_ID);
     
@@ -210,4 +298,22 @@
     return convertPermissionTree(permissions, rootTreeNodeId);
   }
 
+  public List<PermissionRoleSet> selectPermissionRoleSet(Map<String, Object> mapBean) {
+    
+    List<PermissionRoleSet> prsList = new ArrayList<>();
+    
+    List<Permission> resourceList = permissionRepository.selectList(mapBean, null);
+    
+    for (Permission permission : resourceList) {
+      
+      List<Role> roleList = roleRepository.selectPermissionRolesByPermission(permission.getId());
+      
+      PermissionRoleSet prs = new PermissionRoleSet(permission, roleList);
+      
+      prsList.add(prs);
+    }
+    
+    return prsList;
+  }
+  
 }
diff --git a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/service/ResourceService.java b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/service/ResourceService.java
index 47424ad..eea0422 100644
--- a/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/service/ResourceService.java
+++ b/base/domain/src/main/java/com/supwisdom/institute/backend/base/domain/service/ResourceService.java
@@ -1,13 +1,17 @@
 package com.supwisdom.institute.backend.base.domain.service;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.supwisdom.institute.backend.base.domain.entity.Resource;
+import com.supwisdom.institute.backend.base.domain.entity.Role;
 import com.supwisdom.institute.backend.base.domain.model.ResourceRoleSet;
 import com.supwisdom.institute.backend.base.domain.repo.ResourceRepository;
+import com.supwisdom.institute.backend.base.domain.repo.RoleRepository;
 import com.supwisdom.institute.backend.common.framework.service.ABaseService;
 
 @Service
@@ -21,6 +25,9 @@
   @Autowired
   private ResourceRepository resourceRepository;
 
+  @Autowired
+  private RoleRepository roleRepository;
+
   
   public void deleteBatch(List<String> ids) {
     
@@ -30,9 +37,22 @@
   }
 
 
-  public List<ResourceRoleSet> selectByApplication(String applicationId) {
-    // TODO Auto-generated method stub
-    return null;
+  public List<ResourceRoleSet> selectResourceRoleSet(Map<String, Object> mapBean) {
+    
+    List<ResourceRoleSet> rrsList = new ArrayList<>();
+    
+    List<Resource> resourceList = resourceRepository.selectList(mapBean, null);
+    
+    for (Resource resource : resourceList) {
+      
+      List<Role> roleList = roleRepository.selectResourceRolesByResource(resource.getId());
+      
+      ResourceRoleSet rrs = new ResourceRoleSet(resource, roleList);
+      
+      rrsList.add(rrs);
+    }
+    
+    return rrsList;
   }
   
 }
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 ce2acf8..64ea622 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
@@ -3,6 +3,7 @@
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 import com.supwisdom.infras.online.doc.configuration.EnableInfrasOnlineDoc;
 import com.supwisdom.institute.backend.common.core.transmit.annotation.EnableSimpleUserTransmit;
@@ -11,6 +12,8 @@
 @SpringBootApplication
 @EnableFeignClients
 
+@EnableScheduling
+
 @EnableSimpleUserTransmit
 
 @EnableCustomExceptionHandler
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/autorefesh/base/InMemeryPermissionRoleSetAutoRefresh.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/autorefesh/base/InMemeryPermissionRoleSetAutoRefresh.java
new file mode 100644
index 0000000..d149eee
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/autorefesh/base/InMemeryPermissionRoleSetAutoRefresh.java
@@ -0,0 +1,26 @@
+package com.supwisdom.institute.backend.admin.bff.api.v1.autorefesh.base;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import com.supwisdom.institute.backend.admin.bff.api.v1.service.base.AuthnService;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Component
+public class InMemeryPermissionRoleSetAutoRefresh {
+
+  @Autowired
+  private AuthnService authnService;
+  
+  @Scheduled(initialDelayString = "${inMemeryPermissionRoleSetAutoRefresh.schedule.startDelay:500}",
+      fixedDelayString = "${inMemeryPermissionRoleSetAutoRefresh.schedule.repeatInterval:20000}")
+  public void refresh() {
+    log.info("InMemeryPermissionRoleSetAutoRefresh, refresh permissionRoleSets");
+    
+    authnService.loadPermissionRoleSets();
+  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/controller/me/MeController.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/controller/me/MeController.java
index f1a8d62..c88e7c5 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/controller/me/MeController.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/controller/me/MeController.java
@@ -15,7 +15,7 @@
 import com.supwisdom.institute.backend.admin.bff.api.v1.model.base.Permission;
 import com.supwisdom.institute.backend.admin.bff.api.v1.model.me.CurrentUser;
 import com.supwisdom.institute.backend.admin.bff.api.v1.model.me.GrantedMenu;
-import com.supwisdom.institute.backend.admin.bff.api.v1.service.base.AuthnAccountService;
+import com.supwisdom.institute.backend.admin.bff.api.v1.service.base.AuthnService;
 import com.supwisdom.institute.backend.admin.bff.api.v1.vo.me.response.data.CurrentUserResponseData;
 import com.supwisdom.institute.backend.admin.bff.api.v1.vo.me.response.data.GrantedMenusResponseData;
 import com.supwisdom.institute.backend.admin.bff.utils.CurrentUserUtil;
@@ -30,7 +30,7 @@
 public class MeController {
   
   @Autowired
-  private AuthnAccountService authnAccountService;
+  private AuthnService authnService;
   
   @ApiOperation(
       tags = { "me" },
@@ -54,14 +54,14 @@
   
   @ApiOperation(
       tags = { "me" },
-      value = "获取登录用户的访问菜单", notes = "获取登录用户的访问菜单", nickname = "menus"
+      value = "获取登录用户的访问菜单", notes = "获取登录用户的访问菜单", nickname = "accountMenus"
   )
   @RequestMapping(method = RequestMethod.GET, path = "/menus", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
-  public DefaultApiResponse<GrantedMenusResponseData> menus() {
+  public DefaultApiResponse<GrantedMenusResponseData> accountMenus() {
     
     String username = CurrentUserUtil.currentUsername();
     
-    List<Permission> menus =  authnAccountService.menus(username, "1");
+    List<Permission> menus =  authnService.menus(username, "1");  // XXX: applicationId
     
     List<GrantedMenu> grantedMenus = new ArrayList<>();
     
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/controller/open/OpenController.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/controller/open/OpenController.java
new file mode 100644
index 0000000..4944fbd
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/controller/open/OpenController.java
@@ -0,0 +1,55 @@
+package com.supwisdom.institute.backend.admin.bff.api.v1.controller.open;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.MimeTypeUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.supwisdom.institute.backend.admin.bff.api.v1.model.base.PermissionRoleSet;
+import com.supwisdom.institute.backend.admin.bff.api.v1.model.open.Menu;
+import com.supwisdom.institute.backend.admin.bff.api.v1.service.base.AuthnService;
+import com.supwisdom.institute.backend.admin.bff.api.v1.vo.open.response.data.MenusResponseData;
+import com.supwisdom.institute.backend.common.framework.vo.response.DefaultApiResponse;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+@Api(value = "BFFOpen", tags = { "open" }, description = "公开接口")
+@RestController
+@RequestMapping(value = "/api/v1/open")
+public class OpenController {
+  
+  @Autowired
+  private AuthnService authnService;
+  
+  @ApiOperation(
+      tags = { "open" },
+      value = "获取菜单", notes = "获取菜单", nickname = "openMenus"
+  )
+  @RequestMapping(method = RequestMethod.GET, path = "/menus", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  public DefaultApiResponse<MenusResponseData> menus(
+      @RequestParam(name = "applicationId", required = false) String applicationId) {
+    
+    List<Menu> menus = new ArrayList<>();
+
+    List<PermissionRoleSet> permissionRoleSets = authnService.getPermissionRoleSets(applicationId);
+    if (permissionRoleSets != null) {
+      for (PermissionRoleSet permissionRoleSet : permissionRoleSets) {
+        Menu menu = new Menu();
+        BeanUtils.copyProperties(permissionRoleSet, menu);
+        menus.add(menu);
+      }
+    }
+    
+    MenusResponseData data = MenusResponseData.of(menus);
+    return new DefaultApiResponse<MenusResponseData>(data);
+  }
+  
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/controller/open/OpenSyncController.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/controller/open/OpenSyncController.java
new file mode 100644
index 0000000..86941f3
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/controller/open/OpenSyncController.java
@@ -0,0 +1,55 @@
+package com.supwisdom.institute.backend.admin.bff.api.v1.controller.open;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.MimeTypeUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.supwisdom.institute.backend.admin.bff.api.v1.model.base.Role;
+import com.supwisdom.institute.backend.admin.bff.api.v1.model.open.SyncRoleModel;
+import com.supwisdom.institute.backend.admin.bff.api.v1.service.base.AuthnService;
+import com.supwisdom.institute.backend.admin.bff.api.v1.vo.open.response.data.OpenSyncRolesResponseData;
+import com.supwisdom.institute.backend.common.framework.vo.response.DefaultApiResponse;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+@Api(value = "BFFOpen", tags = { "open" }, description = "公开接口")
+@RestController
+@RequestMapping(value = "/api/v1/open/sync")
+public class OpenSyncController {
+
+  @Autowired
+  private AuthnService authnService;
+
+  @ApiOperation(
+      tags = { "open" },
+      value = "获取角色", notes = "获取角色", nickname = "openRoles"
+  )
+  @RequestMapping(method = RequestMethod.GET, path = "/roles", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  public DefaultApiResponse<OpenSyncRolesResponseData> roles(
+      @RequestParam(name = "applicationId", required = true) String applicationId) {
+    
+    List<SyncRoleModel> syncRoleModels = new ArrayList<>();
+
+    List<Role> systemRoles = authnService.roles();
+    for (Role systemRole : systemRoles) {
+      SyncRoleModel syncRoleModel = new SyncRoleModel(
+          systemRole.getId(), 
+          systemRole.getCode(),
+          systemRole.getName(),
+          systemRole.getMemo());
+      syncRoleModels.add(syncRoleModel);
+    }
+    
+    OpenSyncRolesResponseData data = OpenSyncRolesResponseData.of(applicationId, syncRoleModels);
+    return new DefaultApiResponse<OpenSyncRolesResponseData>(data);
+  }
+  
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/base/Application.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/base/Application.java
new file mode 100644
index 0000000..b0f6c48
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/base/Application.java
@@ -0,0 +1,39 @@
+package com.supwisdom.institute.backend.admin.bff.api.v1.model.base;
+
+import com.supwisdom.institute.backend.common.framework.model.ABaseModel;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class Application extends ABaseModel {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 7687658763529677076L;
+
+  private String id;
+  
+  /**
+   * 代码
+   */
+  private String code;
+
+  /**
+   * 名称
+   */
+  private String name;
+
+  /**
+   * 备注
+   */
+  private String memo;
+
+  /**
+   * 状态(1 启用,0 停用)
+   */
+  private String status;
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/base/Permission.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/base/Permission.java
index 3425927..5877bf9 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/base/Permission.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/base/Permission.java
@@ -37,6 +37,11 @@
   private String status;
 
   /**
+   * 菜单图标
+   */
+  private String icon;
+
+  /**
    * 类型(1 应用,2 菜单,3 操作)
    */
   private String type;
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/base/PermissionRoleSet.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/base/PermissionRoleSet.java
new file mode 100644
index 0000000..6080107
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/base/PermissionRoleSet.java
@@ -0,0 +1,114 @@
+package com.supwisdom.institute.backend.admin.bff.api.v1.model.base;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import com.supwisdom.institute.backend.common.framework.model.ABaseModel;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class PermissionRoleSet extends ABaseModel {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -1482739465611090145L;
+  
+  @Getter
+  @Setter
+  private String id;
+
+  /**
+   * 代码
+   */
+  @Getter
+  @Setter
+  private String code;
+
+  /**
+   * 名称
+   */
+  @Getter
+  @Setter
+  private String name;
+
+  /**
+   * 备注
+   */
+  @Getter
+  @Setter
+  private String memo;
+
+  /**
+   * 状态(1 启用,0 停用)
+   */
+  @Getter
+  @Setter
+  private String status;
+
+  /**
+   * 类型(1 应用,2 菜单,3 操作)
+   */
+  @Getter
+  @Setter
+  private String type;
+
+  /**
+   * 菜单图标
+   */
+  @Getter
+  @Setter
+  private String icon;
+
+  /**
+   * URL地址
+   */
+  @Getter
+  @Setter
+  private String url;
+
+  /**
+   * 系统ID
+   */
+  @Getter
+  @Setter
+  private String applicationId;
+
+  /**
+   * 父级ID
+   */
+  @Getter
+  @Setter
+  private String parentId;
+
+  /**
+   * 排序
+   */
+  @Getter
+  @Setter
+  private Integer order;
+
+  @Getter
+  @Setter
+  private Collection<Role> roles;
+  
+  private Collection<String> permissionRoles = null;
+  public boolean matches(Collection<String> userRoles) {
+    if (permissionRoles == null) {
+      permissionRoles = new ArrayList<String>();
+      Iterator<Role> it = roles.iterator();
+      while (it.hasNext()) {
+        Role r = it.next();
+        permissionRoles.add(r.getCode());
+      }
+    }
+    
+    userRoles.retainAll(permissionRoles);
+    
+    return !userRoles.isEmpty();
+  }
+  
+  
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/base/ResourceRoleSet.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/base/ResourceRoleSet.java
new file mode 100644
index 0000000..665154d
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/base/ResourceRoleSet.java
@@ -0,0 +1,80 @@
+package com.supwisdom.institute.backend.admin.bff.api.v1.model.base;
+
+import java.util.Collection;
+
+import com.supwisdom.institute.backend.common.framework.model.ABaseModel;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class ResourceRoleSet extends ABaseModel {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -683204173918706673L;
+
+  public static final String ACCESS_ANONYMOUS = "anonymous"; // 匿名访问anonymous
+  public static final String ACCESS_AUTHENTICATE = "authenticate"; // 认证访问authenticate
+  public static final String ACCESS_AUTHORIZE = "authorize"; // 授权访问authorize
+  public static final String ACCESS_PERMIT_ALL = "permitAll"; // 允许所有permitAll
+  public static final String ACCESS_DENY_ALL = "denyAll"; // 拒绝所有denyAll
+
+  @Getter
+  @Setter
+  private String id;
+
+  /**
+   * 代码
+   */
+  @Getter
+  @Setter
+  private String code;
+
+  /**
+   * 名称
+   */
+  @Getter
+  @Setter
+  private String name;
+
+  /**
+   * 备注
+   */
+  @Getter
+  @Setter
+  private String memo;
+
+  /**
+   * 状态(1 启用,0 停用)
+   */
+  @Getter
+  @Setter
+  private String status;
+
+  /**
+   * 请求方式(GET、POST、PUT、DELETE 等)
+   */
+  @Getter
+  @Setter
+  private String method;
+
+  /**
+   * 请求路径
+   */
+  @Getter
+  @Setter
+  private String path;
+
+  /**
+   * 访问规则(匿名访问anonymous、认证访问authenticate、授权访问authorize、允许所有permitAll、拒绝所有denyAll)
+   */
+  @Getter
+  @Setter
+  private String access;
+
+  @Getter
+  @Setter
+  Collection<Role> roles;
+  
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/me/GrantedMenu.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/me/GrantedMenu.java
index 4376793..5d8cd70 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/me/GrantedMenu.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/me/GrantedMenu.java
@@ -37,6 +37,11 @@
   private String status;
 
   /**
+   * 菜单图标
+   */
+  private String icon;
+
+  /**
    * URL地址
    */
   private String url;
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/open/Menu.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/open/Menu.java
new file mode 100644
index 0000000..b3bdc99
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/open/Menu.java
@@ -0,0 +1,64 @@
+package com.supwisdom.institute.backend.admin.bff.api.v1.model.open;
+
+import com.supwisdom.institute.backend.common.framework.model.ABaseModel;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class Menu extends ABaseModel {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 4206010261706882919L;
+  
+  private String id;
+
+  /**
+   * 代码
+   */
+  private String code;
+
+  /**
+   * 名称
+   */
+  private String name;
+
+  /**
+   * 备注
+   */
+  private String memo;
+
+  /**
+   * 状态(1 启用,0 停用)
+   */
+  private String status;
+
+  /**
+   * 菜单图标
+   */
+  private String icon;
+
+  /**
+   * URL地址
+   */
+  private String url;
+
+  /**
+   * 系统ID
+   */
+  private String applicationId;
+
+  /**
+   * 父级ID
+   */
+  private String parentId;
+
+  /**
+   * 排序
+   */
+  private Integer order;
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/open/SyncRoleModel.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/open/SyncRoleModel.java
new file mode 100644
index 0000000..72986bc
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/model/open/SyncRoleModel.java
@@ -0,0 +1,39 @@
+package com.supwisdom.institute.backend.admin.bff.api.v1.model.open;
+
+import java.io.Serializable;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+public class SyncRoleModel implements Serializable {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -1916611618482825238L;
+  
+  /**
+   * ID
+   */
+  private String id;
+
+  /**
+   * 代码
+   */
+  private String code;
+
+  /**
+   * 名称
+   */
+  private String name;
+
+  /**
+   * 描述
+   */
+  private String memo;
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/remote/base/v1/authn/AuthnAccountRemoteFallbackFactory.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/remote/base/v1/authn/AuthnRemoteFallbackFactory.java
similarity index 62%
rename from bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/remote/base/v1/authn/AuthnAccountRemoteFallbackFactory.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/remote/base/v1/authn/AuthnRemoteFallbackFactory.java
index d9eb21e..e965dab 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/remote/base/v1/authn/AuthnAccountRemoteFallbackFactory.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/remote/base/v1/authn/AuthnRemoteFallbackFactory.java
@@ -8,11 +8,11 @@
 import feign.hystrix.FallbackFactory;
 
 @Component
-public class AuthnAccountRemoteFallbackFactory implements FallbackFactory<AuthnAccountRemoteFeignClient> {
+public class AuthnRemoteFallbackFactory implements FallbackFactory<AuthnRemoteFeignClient> {
 
   @Override
-  public AuthnAccountRemoteFeignClient create(Throwable cause) {
-    return new AuthnAccountRemoteFeignClient() {
+  public AuthnRemoteFeignClient create(Throwable cause) {
+    return new AuthnRemoteFeignClient() {
 
       @Override
       public JSONObject account(String username) {
@@ -62,6 +62,39 @@
         return FallbackError.defaultErrorJson(cause);
       }
       
+
+      @Override
+      public JSONObject applications() {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject roles() {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject permissionRoleSets(String applicationId) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+
+      @Override
+      public JSONObject resourceRoleSets(String applicationId) {
+        if (cause != null) {
+          cause.printStackTrace();
+        }
+        return FallbackError.defaultErrorJson(cause);
+      }
+      
     };
   }
 
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/remote/base/v1/authn/AuthnAccountRemoteFeignClient.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/remote/base/v1/authn/AuthnRemoteFeignClient.java
similarity index 74%
rename from bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/remote/base/v1/authn/AuthnAccountRemoteFeignClient.java
rename to bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/remote/base/v1/authn/AuthnRemoteFeignClient.java
index 3ee71b8..0486ffd 100644
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/remote/base/v1/authn/AuthnAccountRemoteFeignClient.java
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/remote/base/v1/authn/AuthnRemoteFeignClient.java
@@ -13,9 +13,9 @@
     configuration = {BaseFeignClientConfiguration.class},
     name = "base-admin-account-remote-feign-client",
     url = "${sw-backend-base-api.uri}/v1/authn",
-    fallbackFactory = AuthnAccountRemoteFallbackFactory.class
+    fallbackFactory = AuthnRemoteFallbackFactory.class
 )
-public interface AuthnAccountRemoteFeignClient {
+public interface AuthnRemoteFeignClient {
   
   @RequestMapping(method = RequestMethod.GET, path = "/{username}/account")
   JSONObject account(
@@ -46,4 +46,19 @@
       @PathVariable(name = "username") String username,
       @RequestParam(name = "applicationId", required = false) String applicationId);
 
+
+  @RequestMapping(method = RequestMethod.GET, path = "/applications")
+  JSONObject applications();
+  
+  @RequestMapping(method = RequestMethod.GET, path = "/roles")
+  JSONObject roles();
+
+  @RequestMapping(method = RequestMethod.GET, path = "/permissionRoleSets")
+  JSONObject permissionRoleSets(
+      @RequestParam(name = "applicationId", required = false) String applicationId);
+
+  @RequestMapping(method = RequestMethod.GET, path = "/resourceRoleSets")
+  JSONObject resourceRoleSets(
+      @RequestParam(name = "applicationId", required = false) String applicationId);
+
 }
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/service/base/AuthnAccountService.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/service/base/AuthnAccountService.java
deleted file mode 100644
index e3b768e..0000000
--- a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/service/base/AuthnAccountService.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.supwisdom.institute.backend.admin.bff.api.v1.service.base;
-
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import com.alibaba.fastjson.JSONObject;
-import com.supwisdom.institute.backend.admin.bff.api.v1.model.base.Account;
-import com.supwisdom.institute.backend.admin.bff.api.v1.model.base.Permission;
-import com.supwisdom.institute.backend.admin.bff.api.v1.model.base.Role;
-import com.supwisdom.institute.backend.admin.bff.api.v1.remote.base.v1.authn.AuthnAccountRemoteFeignClient;
-
-@Service
-public class AuthnAccountService {
-  
-  @Autowired
-  private AuthnAccountRemoteFeignClient authnAccountRemote;
-  
-  public Account account(String username) {
-    
-    JSONObject jsonObject = authnAccountRemote.account(username);
-    if (jsonObject == null) {
-      return null;
-    }
-    
-    if (jsonObject.getIntValue("code") == 0) {
-      JSONObject data = jsonObject.getJSONObject("data");
-      
-      return data.toJavaObject(Account.class);
-    }
-    
-    return null;
-  }
-
-  public List<Role> roles(String username) {
-    
-    JSONObject jsonObject = authnAccountRemote.roles(username);
-    if (jsonObject == null) {
-      return null;
-    }
-    
-    if (jsonObject.getIntValue("code") == 0) {
-      JSONObject data = jsonObject.getJSONObject("data");
-      
-      return data.getJSONArray("roles").toJavaList(Role.class);
-    }
-    
-    return null;
-  }
-
-  public List<Permission> menus(String username, String applicationId) {
-    
-    JSONObject jsonObject = authnAccountRemote.menus(username, applicationId);
-    if (jsonObject == null) {
-      return null;
-    }
-    
-    if (jsonObject.getIntValue("code") == 0) {
-      JSONObject data = jsonObject.getJSONObject("data");
-      
-      return data.getJSONArray("permissions").toJavaList(Permission.class);
-    }
-    
-    return null;
-  }
-
-}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/service/base/AuthnService.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/service/base/AuthnService.java
new file mode 100644
index 0000000..8f6d9df
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/service/base/AuthnService.java
@@ -0,0 +1,202 @@
+package com.supwisdom.institute.backend.admin.bff.api.v1.service.base;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.supwisdom.institute.backend.admin.bff.api.v1.model.base.Account;
+import com.supwisdom.institute.backend.admin.bff.api.v1.model.base.Application;
+import com.supwisdom.institute.backend.admin.bff.api.v1.model.base.Permission;
+import com.supwisdom.institute.backend.admin.bff.api.v1.model.base.PermissionRoleSet;
+import com.supwisdom.institute.backend.admin.bff.api.v1.model.base.ResourceRoleSet;
+import com.supwisdom.institute.backend.admin.bff.api.v1.model.base.Role;
+import com.supwisdom.institute.backend.admin.bff.api.v1.remote.base.v1.authn.AuthnRemoteFeignClient;
+
+@Slf4j
+@Service
+public class AuthnService {
+  
+  @Autowired
+  private AuthnRemoteFeignClient authnRemote;
+  
+  public Account account(String username) {
+    
+    JSONObject jsonObject = authnRemote.account(username);
+    if (jsonObject == null) {
+      return null;
+    }
+    
+    if (jsonObject.getIntValue("code") == 0) {
+      JSONObject data = jsonObject.getJSONObject("data");
+      
+      return data.toJavaObject(Account.class);
+    }
+    
+    return null;
+  }
+
+  public List<Role> roles(String username) {
+    
+    JSONObject jsonObject = authnRemote.roles(username);
+    if (jsonObject == null) {
+      return null;
+    }
+    
+    if (jsonObject.getIntValue("code") == 0) {
+      JSONObject data = jsonObject.getJSONObject("data");
+      
+      return data.getJSONArray("roles").toJavaList(Role.class);
+    }
+    
+    return null;
+  }
+
+  public List<Permission> menus(String username, String applicationId) {
+    
+    JSONObject jsonObject = authnRemote.menus(username, applicationId);
+    if (jsonObject == null) {
+      return null;
+    }
+    
+    if (jsonObject.getIntValue("code") == 0) {
+      JSONObject data = jsonObject.getJSONObject("data");
+      
+      return data.getJSONArray("permissions").toJavaList(Permission.class);
+    }
+    
+    return null;
+  }
+
+  
+  public List<Application> applications() {
+    
+    try {
+      JSONObject jsonObject = authnRemote.applications();
+      if (jsonObject == null) {
+        return null;
+      }
+      log.debug("{}", jsonObject.toJSONString());
+      
+      if (jsonObject.containsKey("code") && jsonObject.getIntValue("code") == 0) {
+        JSONObject data = jsonObject.getJSONObject("data");
+        
+        return data.getJSONArray("applications").toJavaList(Application.class);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    
+    return null;
+  }
+  
+  public List<Role> roles() {
+    
+    try {
+      JSONObject jsonObject = authnRemote.roles();
+      if (jsonObject == null) {
+        return null;
+      }
+      log.debug("{}", jsonObject.toJSONString());
+      
+      if (jsonObject.containsKey("code") && jsonObject.getIntValue("code") == 0) {
+        JSONObject data = jsonObject.getJSONObject("data");
+        
+        return data.getJSONArray("roles").toJavaList(Role.class);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    
+    return null;
+  }
+
+  
+  
+  
+
+  public static volatile Map<String, List<PermissionRoleSet>> mapPermissionRoleSets = 
+      new HashMap<String, List<PermissionRoleSet>>();
+  
+  public void putPermissionRoleSets(String applicationId, List<PermissionRoleSet> permissionRoleSets) {
+    AuthnService.mapPermissionRoleSets.put(applicationId, permissionRoleSets);
+  }
+  
+  public List<PermissionRoleSet> getPermissionRoleSets(String applicationId) {
+    if (StringUtils.isNotEmpty(applicationId)) {
+      return AuthnService.mapPermissionRoleSets.get(applicationId);
+    }
+    
+    List<PermissionRoleSet> allPermissionRoleSets = new ArrayList<>();
+    for (List<PermissionRoleSet> permissionRoleSets : AuthnService.mapPermissionRoleSets.values()) {
+      allPermissionRoleSets.addAll(permissionRoleSets);
+    }
+    
+    return allPermissionRoleSets;
+  }
+
+  public void loadPermissionRoleSets() {
+    
+    List<Application> applications = applications();
+    if (applications != null) {
+      for (Application application : applications) {
+        String applicationId = application.getId();
+        List<PermissionRoleSet> permissionRoleSets = this.permissionRoleSets(applicationId);
+        if (permissionRoleSets != null) {
+          this.putPermissionRoleSets(applicationId, permissionRoleSets);
+        }
+      }
+    }
+  }
+  
+  
+  public List<PermissionRoleSet> permissionRoleSets(String applicationId) {
+    
+    try {
+      JSONObject jsonObject = authnRemote.permissionRoleSets(applicationId);
+      if (jsonObject == null) {
+        return null;
+      }
+      log.debug("{}", jsonObject.toJSONString());
+      
+      if (jsonObject.containsKey("code") && jsonObject.getIntValue("code") == 0) {
+        JSONObject data = jsonObject.getJSONObject("data");
+        
+        return data.getJSONArray("permissionRoleSets").toJavaList(PermissionRoleSet.class);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    
+    return null;
+  }
+
+  public List<ResourceRoleSet> resourceRoleSets() {
+    
+    try {
+      JSONObject jsonObject = authnRemote.resourceRoleSets(null);
+      if (jsonObject == null) {
+        return null;
+      }
+      log.debug("{}", jsonObject.toJSONString());
+      
+      if (jsonObject.containsKey("code") && jsonObject.getIntValue("code") == 0) {
+        JSONObject data = jsonObject.getJSONObject("data");
+        
+        return data.getJSONArray("resourceRoleSets").toJavaList(ResourceRoleSet.class);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    
+    return null;
+  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/vo/open/response/data/MenusResponseData.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/vo/open/response/data/MenusResponseData.java
new file mode 100644
index 0000000..6beabd2
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/vo/open/response/data/MenusResponseData.java
@@ -0,0 +1,30 @@
+package com.supwisdom.institute.backend.admin.bff.api.v1.vo.open.response.data;
+
+import java.util.List;
+
+import com.supwisdom.institute.backend.admin.bff.api.v1.model.open.Menu;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiResponseData;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class MenusResponseData implements IApiResponseData {
+  
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -3516729316884770800L;
+
+  @Getter
+  @Setter
+  private List<Menu> menus;
+
+  public static MenusResponseData of(List<Menu> menus) {
+    MenusResponseData data = new MenusResponseData();
+    
+    data.setMenus(menus);
+    
+    return data;
+  }
+
+}
diff --git a/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/vo/open/response/data/OpenSyncRolesResponseData.java b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/vo/open/response/data/OpenSyncRolesResponseData.java
new file mode 100644
index 0000000..5b8b3d3
--- /dev/null
+++ b/bff/admin/src/main/java/com/supwisdom/institute/backend/admin/bff/api/v1/vo/open/response/data/OpenSyncRolesResponseData.java
@@ -0,0 +1,34 @@
+package com.supwisdom.institute.backend.admin.bff.api.v1.vo.open.response.data;
+
+import java.util.List;
+
+import com.supwisdom.institute.backend.admin.bff.api.v1.model.open.SyncRoleModel;
+import com.supwisdom.institute.backend.common.framework.vo.response.data.IApiResponseData;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class OpenSyncRolesResponseData implements IApiResponseData {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 2739730369123803327L;
+  
+  @Getter
+  @Setter
+  private String applicationId;
+
+  @Getter
+  @Setter
+  private List<SyncRoleModel> roles;
+
+  public static OpenSyncRolesResponseData of(String applicationId, List<SyncRoleModel> roles) {
+    OpenSyncRolesResponseData data = new OpenSyncRolesResponseData();
+    
+    data.setRoles(roles);
+    
+    return data;
+  }
+
+}
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 e5308df..a939a95 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
@@ -1,6 +1,7 @@
 package com.supwisdom.institute.backend.common.framework.repo;
 
 import java.util.Calendar;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
@@ -36,6 +37,19 @@
     return null;
   }
 
+  public default List<E> selectList(Map<String, Object> mapBean, Map<String, String> orderBy) {
+    
+    Specification<E> spec = convertToSpec(mapBean);
+    
+    Sort sort = convertToSort(orderBy);
+    
+    if (sort != null) {
+      return this.findAll(spec, sort);
+    }
+    
+    return this.findAll(spec);
+  }
+
   public default Page<E> selectPageList(boolean loadAll, int pageIndex, int pageSize, Map<String, Object> mapBean, Map<String, String> orderBy) {
     
     Specification<E> spec = convertToSpec(mapBean);
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/service/ABaseService.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/service/ABaseService.java
index dccfc17..a36af40 100644
--- a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/service/ABaseService.java
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/service/ABaseService.java
@@ -1,5 +1,6 @@
 package com.supwisdom.institute.backend.common.framework.service;
 
+import java.util.List;
 import java.util.Map;
 
 import org.springframework.data.domain.Page;
@@ -10,6 +11,11 @@
 public abstract class ABaseService<E extends ABaseEntity, REPO extends BaseJpaRepository<E>> {
   
   public abstract REPO getRepo();
+
+
+  public List<E> selectList(Map<String, Object> mapBean, Map<String, String> orderBy) {
+    return getRepo().selectList(mapBean, orderBy);
+  }
   
   public Page<E> selectPageList(boolean loadAll, int pageIndex, int pageSize, Map<String, Object> mapBean, Map<String, String> orderBy) {
     
diff --git a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/model/Permission.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/model/Permission.java
index 0d5c72d..53f3199 100644
--- a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/model/Permission.java
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/model/Permission.java
@@ -42,6 +42,11 @@
   private String type;
 
   /**
+   * 菜单图标
+   */
+  private String icon;
+
+  /**
    * URL地址
    */
   private String url;
diff --git a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/model/PermissionRoleSet.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/model/PermissionRoleSet.java
new file mode 100644
index 0000000..675e657
--- /dev/null
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/model/PermissionRoleSet.java
@@ -0,0 +1,5 @@
+package com.supwisdom.institute.backend.gateway.authn.model;
+
+public class PermissionRoleSet {
+
+}
diff --git a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/model/ResourceRoleSet.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/model/ResourceRoleSet.java
new file mode 100644
index 0000000..2d7940c
--- /dev/null
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/model/ResourceRoleSet.java
@@ -0,0 +1,80 @@
+package com.supwisdom.institute.backend.gateway.authn.model;
+
+import java.util.Collection;
+
+import com.supwisdom.institute.backend.common.framework.model.ABaseModel;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class ResourceRoleSet extends ABaseModel {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -683204173918706673L;
+
+  public static final String ACCESS_ANONYMOUS = "anonymous"; // 匿名访问anonymous
+  public static final String ACCESS_AUTHENTICATE = "authenticate"; // 认证访问authenticate
+  public static final String ACCESS_AUTHORIZE = "authorize"; // 授权访问authorize
+  public static final String ACCESS_PERMIT_ALL = "permitAll"; // 允许所有permitAll
+  public static final String ACCESS_DENY_ALL = "denyAll"; // 拒绝所有denyAll
+
+  @Getter
+  @Setter
+  private String id;
+
+  /**
+   * 代码
+   */
+  @Getter
+  @Setter
+  private String code;
+
+  /**
+   * 名称
+   */
+  @Getter
+  @Setter
+  private String name;
+
+  /**
+   * 备注
+   */
+  @Getter
+  @Setter
+  private String memo;
+
+  /**
+   * 状态(1 启用,0 停用)
+   */
+  @Getter
+  @Setter
+  private String status;
+
+  /**
+   * 请求方式(GET、POST、PUT、DELETE 等)
+   */
+  @Getter
+  @Setter
+  private String method;
+
+  /**
+   * 请求路径
+   */
+  @Getter
+  @Setter
+  private String path;
+
+  /**
+   * 访问规则(匿名访问anonymous、认证访问authenticate、授权访问authorize、允许所有permitAll、拒绝所有denyAll)
+   */
+  @Getter
+  @Setter
+  private String access;
+
+  @Getter
+  @Setter
+  Collection<Role> roles;
+  
+}
diff --git a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/model/Route.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/model/Route.java
new file mode 100644
index 0000000..9ca66c6
--- /dev/null
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/model/Route.java
@@ -0,0 +1,68 @@
+package com.supwisdom.institute.backend.gateway.authn.model;
+
+import com.supwisdom.institute.backend.common.framework.model.ABaseModel;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class Route extends ABaseModel {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 1254295553813507087L;
+
+  @Getter
+  @Setter
+  private String id;
+
+  /**
+   * 代码
+   */
+  @Getter
+  @Setter
+  private String code;
+
+  /**
+   * 名称
+   */
+  @Getter
+  @Setter
+  private String name;
+
+  /**
+   * 备注
+   */
+  @Getter
+  @Setter
+  private String memo;
+
+  /**
+   * 状态(1 启用,0 停用)
+   */
+  @Getter
+  @Setter
+  private String status;
+
+  /**
+   * 路径前缀
+   */
+  @Getter
+  @Setter
+  private String pathPrefix;
+
+  /**
+   * 路由地址
+   */
+  @Getter
+  @Setter
+  private String url;
+
+  /**
+   * 是否排除前缀
+   */
+  @Getter
+  @Setter
+  private Boolean stripPrefix;
+
+}
diff --git a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/remote/configuration/AuthnAccountRestTemplateConfig.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/remote/configuration/AuthnRestTemplateConfig.java
similarity index 71%
rename from gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/remote/configuration/AuthnAccountRestTemplateConfig.java
rename to gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/remote/configuration/AuthnRestTemplateConfig.java
index 5e98c4a..789f930 100644
--- a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/remote/configuration/AuthnAccountRestTemplateConfig.java
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/remote/configuration/AuthnRestTemplateConfig.java
@@ -17,7 +17,7 @@
 import org.springframework.web.client.RestTemplate;
 
 @Configuration
-public class AuthnAccountRestTemplateConfig {
+public class AuthnRestTemplateConfig {
 
   @Bean
   public ClientHttpRequestFactory simpleClientHttpRequestFactory(
@@ -35,6 +35,21 @@
       return factory;
     }
     
+    SSLContextBuilder sslContextBuilder = SSLContexts.custom();
+    
+    if (trustStore == null || trustStore.isEmpty()) {
+    } else {
+      try {
+        sslContextBuilder
+          .loadTrustMaterial(
+              ResourceUtils.getFile(trustStore),
+              trustStorePassword.toCharArray()
+          );
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+    }
+    
     if (keyStore == null || keyStore.isEmpty()) {
       SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
       factory.setReadTimeout(5000);// 单位为ms
@@ -42,42 +57,35 @@
       return factory;
     } else {
       try {
-        SSLContextBuilder sslContextBuilder = SSLContexts.custom();
-        if (trustStore == null || trustStore.isEmpty()) {
-        } else {
-          sslContextBuilder
-//            .loadTrustMaterial(TrustAllStrategy.INSTANCE)
-            .loadTrustMaterial(
-                ResourceUtils.getFile(trustStore),
-                trustStorePassword.toCharArray()
-            );
-        }
-        
         sslContextBuilder
           .loadKeyMaterial(
               ResourceUtils.getFile(keyStore),
               keyStorePassword.toCharArray(),
               keyPassword.toCharArray());
-        
-        SSLContext sslContext = sslContextBuilder.build();
-    
-        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
-            sslContext,
-            SSLConnectionSocketFactory.getDefaultHostnameVerifier());
-        
-        CloseableHttpClient httpClient = HttpClients.custom()
-            .setSSLSocketFactory(sslsf)
-            .build();
-        
-        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
-        factory.setReadTimeout(5000);// 单位为ms
-        factory.setConnectTimeout(5000);// 单位为ms
-        return factory;
       } catch (Exception e) {
         e.printStackTrace();
       }
     }
     
+    try {
+      SSLContext sslContext = sslContextBuilder.build();
+  
+      SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
+          sslContext,
+          SSLConnectionSocketFactory.getDefaultHostnameVerifier());
+      
+      CloseableHttpClient httpClient = HttpClients.custom()
+          .setSSLSocketFactory(sslsf)
+          .build();
+      
+      HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
+      factory.setReadTimeout(5000);// 单位为ms
+      factory.setConnectTimeout(5000);// 单位为ms
+      return factory;
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    
     SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
     factory.setReadTimeout(5000);// 单位为ms
     factory.setConnectTimeout(5000);// 单位为ms
diff --git a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/remote/web/client/AuthnAccountRemoteRestTemplate.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/remote/web/client/AuthnRemoteRestTemplate.java
similarity index 64%
rename from gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/remote/web/client/AuthnAccountRemoteRestTemplate.java
rename to gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/remote/web/client/AuthnRemoteRestTemplate.java
index 6259608..17a3430 100644
--- a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/remote/web/client/AuthnAccountRemoteRestTemplate.java
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/remote/web/client/AuthnRemoteRestTemplate.java
@@ -12,10 +12,10 @@
 
 @Slf4j
 @Component
-public class AuthnAccountRemoteRestTemplate {
+public class AuthnRemoteRestTemplate {
   
   @Autowired
-  private RestTemplate authnAccountRestTemplate;
+  private RestTemplate authnRestTemplate;
   
   @Value(value = "${sw-backend-base-api.uri}/v1/authn")
   private String url;
@@ -37,7 +37,7 @@
       final String url = this.url + StringUtils.replaceEach(path, new String[] {"{username}"}, new String[] {username});
       log.debug(url);
       
-      return authnAccountRestTemplate.getForObject(url, JSONObject.class);
+      return authnRestTemplate.getForObject(url, JSONObject.class);
     } catch (Exception e) {
       e.printStackTrace();
       
@@ -45,14 +45,14 @@
     }
   }
 
-  public JSONObject roles(String username) {
+  public JSONObject accountRoles(String username) {
 
     try {
       final String path = "/{username}/roles";
       final String url = this.url + StringUtils.replaceEach(path, new String[] {"{username}"}, new String[] {username});
       log.debug(url);
       
-      return authnAccountRestTemplate.getForObject(url, JSONObject.class);
+      return authnRestTemplate.getForObject(url, JSONObject.class);
     } catch (Exception e) {
       e.printStackTrace();
       
@@ -60,14 +60,14 @@
     }
   }
 
-  public JSONObject applications(String username, String applicationId) {
+  public JSONObject accountApplications(String username, String applicationId) {
 
     try {
       final String path = "/{username}/applications";
       final String url = this.url + StringUtils.replaceEach(path, new String[] {"{username}"}, new String[] {username});
       log.debug(url);
       
-      return authnAccountRestTemplate.getForObject(url, JSONObject.class);
+      return authnRestTemplate.getForObject(url, JSONObject.class);
     } catch (Exception e) {
       e.printStackTrace();
       
@@ -75,14 +75,14 @@
     }
   }
 
-  public JSONObject menus(String username, String applicationId) {
+  public JSONObject accountMenus(String username, String applicationId) {
 
     try {
       final String path = "/{username}/menus";
       final String url = this.url + StringUtils.replaceEach(path, new String[] {"{username}"}, new String[] {username});
       log.debug(url);
       
-      return authnAccountRestTemplate.getForObject(url, JSONObject.class);
+      return authnRestTemplate.getForObject(url, JSONObject.class);
     } catch (Exception e) {
       e.printStackTrace();
       
@@ -90,14 +90,14 @@
     }
   }
 
-  public JSONObject operations(String username, String applicationId) {
+  public JSONObject accountOperations(String username, String applicationId) {
 
     try {
       final String path = "/{username}/operations";
       final String url = this.url + StringUtils.replaceEach(path, new String[] {"{username}"}, new String[] {username});
       log.debug(url);
       
-      return authnAccountRestTemplate.getForObject(url, JSONObject.class);
+      return authnRestTemplate.getForObject(url, JSONObject.class);
     } catch (Exception e) {
       e.printStackTrace();
       
@@ -105,14 +105,45 @@
     }
   }
 
-  public JSONObject resources(String username, String applicationId) {
+  public JSONObject accountResources(String username, String applicationId) {
 
     try {
       final String path = "/{username}/resources";
       final String url = this.url + StringUtils.replaceEach(path, new String[] {"{username}"}, new String[] {username});
       log.debug(url);
       
-      return authnAccountRestTemplate.getForObject(url, JSONObject.class);
+      return authnRestTemplate.getForObject(url, JSONObject.class);
+    } catch (Exception e) {
+      e.printStackTrace();
+      
+      return defaultErrorJson(e);
+    }
+  }
+
+  public JSONObject resourceRoleSets() {
+
+    try {
+      final String path = "/resourceRoleSets";
+      final String url = this.url + path;
+      log.debug(url);
+      
+      return authnRestTemplate.getForObject(url, JSONObject.class);
+    } catch (Exception e) {
+      e.printStackTrace();
+      
+      return defaultErrorJson(e);
+    }
+  }
+
+
+  public JSONObject routes() {
+
+    try {
+      final String path = "/routes";
+      final String url = this.url + path;
+      log.debug(url);
+      
+      return authnRestTemplate.getForObject(url, JSONObject.class);
     } catch (Exception e) {
       e.printStackTrace();
       
diff --git a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/service/AuthnAccountService.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/service/AuthnAccountService.java
deleted file mode 100644
index beeb74a..0000000
--- a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/service/AuthnAccountService.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.supwisdom.institute.backend.gateway.authn.service;
-
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import com.alibaba.fastjson.JSONObject;
-import com.supwisdom.institute.backend.gateway.authn.model.Account;
-import com.supwisdom.institute.backend.gateway.authn.model.Permission;
-import com.supwisdom.institute.backend.gateway.authn.model.Role;
-import com.supwisdom.institute.backend.gateway.authn.remote.web.client.AuthnAccountRemoteRestTemplate;
-
-@Service
-public class AuthnAccountService {
-  
-//  @Autowired
-//  private AuthnAccountRemoteFeignClient authnAccountRemote;
-  
-  @Autowired
-  private AuthnAccountRemoteRestTemplate authnAccountRemote;
-  
-  public Account account(String username) {
-    
-    JSONObject jsonObject = authnAccountRemote.account(username);
-    if (jsonObject == null) {
-      return null;
-    }
-    
-    if (jsonObject.getIntValue("code") == 0) {
-      JSONObject data = jsonObject.getJSONObject("data");
-      
-      return data.toJavaObject(Account.class);
-    }
-    
-    return null;
-  }
-
-  public List<Role> roles(String username) {
-    
-    JSONObject jsonObject = authnAccountRemote.roles(username);
-    if (jsonObject == null) {
-      return null;
-    }
-    
-    if (jsonObject.getIntValue("code") == 0) {
-      JSONObject data = jsonObject.getJSONObject("data");
-      
-      return data.getJSONArray("roles").toJavaList(Role.class);
-    }
-    
-    return null;
-  }
-
-  public List<Permission> menus(String username, String applicationId) {
-    
-    JSONObject jsonObject = authnAccountRemote.menus(username, applicationId);
-    if (jsonObject == null) {
-      return null;
-    }
-    
-    if (jsonObject.getIntValue("code") == 0) {
-      JSONObject data = jsonObject.getJSONObject("data");
-      
-      return data.getJSONArray("permissions").toJavaList(Permission.class);
-    }
-    
-    return null;
-  }
-
-}
diff --git a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/service/AuthnService.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/service/AuthnService.java
new file mode 100644
index 0000000..13434ec
--- /dev/null
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/authn/service/AuthnService.java
@@ -0,0 +1,92 @@
+package com.supwisdom.institute.backend.gateway.authn.service;
+
+import java.util.List;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.supwisdom.institute.backend.gateway.authn.model.Account;
+import com.supwisdom.institute.backend.gateway.authn.model.ResourceRoleSet;
+import com.supwisdom.institute.backend.gateway.authn.model.Role;
+import com.supwisdom.institute.backend.gateway.authn.model.Route;
+import com.supwisdom.institute.backend.gateway.authn.remote.web.client.AuthnRemoteRestTemplate;
+
+@Slf4j
+@Service
+public class AuthnService {
+  
+  @Autowired
+  private AuthnRemoteRestTemplate authnRemote;
+  
+  public Account account(String username) {
+    
+    JSONObject jsonObject = authnRemote.account(username);
+    if (jsonObject == null) {
+      return null;
+    }
+    log.debug("{}", jsonObject.toJSONString());
+    
+    if (jsonObject.getIntValue("code") == 0) {
+      JSONObject data = jsonObject.getJSONObject("data");
+      
+      return data.toJavaObject(Account.class);
+    }
+    
+    return null;
+  }
+
+  public List<Role> accountRoles(String username) {
+    
+    JSONObject jsonObject = authnRemote.accountRoles(username);
+    if (jsonObject == null) {
+      return null;
+    }
+    log.debug("{}", jsonObject.toJSONString());
+    
+    if (jsonObject.getIntValue("code") == 0) {
+      JSONObject data = jsonObject.getJSONObject("data");
+      
+      return data.getJSONArray("roles").toJavaList(Role.class);
+    }
+    
+    return null;
+  }
+
+  public List<ResourceRoleSet> resourceRoleSets() {
+    
+    JSONObject jsonObject = authnRemote.resourceRoleSets();
+    if (jsonObject == null) {
+      return null;
+    }
+    log.debug("{}", jsonObject.toJSONString());
+    
+    if (jsonObject.getIntValue("code") == 0) {
+      JSONObject data = jsonObject.getJSONObject("data");
+      
+      return data.getJSONArray("resourceRoleSets").toJavaList(ResourceRoleSet.class);
+    }
+    
+    return null;
+  }
+
+  public List<Route> routes() {
+    
+    JSONObject jsonObject = authnRemote.routes();
+    if (jsonObject == null) {
+      return null;
+    }
+    log.debug("{}", jsonObject.toJSONString());
+    
+    if (jsonObject.getIntValue("code") == 0) {
+      JSONObject data = jsonObject.getJSONObject("data");
+      
+      return data.getJSONArray("routes").toJavaList(Route.class);
+    }
+    
+    return null;
+  }
+
+}
diff --git a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/filter/AccessControlGlobalFilter.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/filter/AccessControlGlobalFilter.java
index 266dfa7..6ef6b7e 100644
--- a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/filter/AccessControlGlobalFilter.java
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/filter/AccessControlGlobalFilter.java
@@ -4,6 +4,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -11,6 +12,7 @@
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.gateway.filter.GatewayFilterChain;
 import org.springframework.cloud.gateway.filter.GlobalFilter;
 import org.springframework.core.Ordered;
@@ -30,14 +32,15 @@
 import org.springframework.web.server.ServerWebExchange;
 
 import com.supwisdom.infras.security.core.userdetails.InfrasUser;
+import com.supwisdom.institute.backend.gateway.authn.model.ResourceRoleSet;
+import com.supwisdom.institute.backend.gateway.authn.model.Role;
+import com.supwisdom.institute.backend.gateway.authn.service.AuthnService;
 
 import reactor.core.publisher.Mono;
 
-//import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR;
-
 @Slf4j
 public class AccessControlGlobalFilter implements GlobalFilter, Ordered {
-
+  
   @Override
   public int getOrder() {
     return Ordered.HIGHEST_PRECEDENCE;
@@ -48,17 +51,17 @@
     log.debug("AccessControlGlobalFilter.filter");
     
     // 获取 请求路径 对应的 资源
-    Collection<ConfigAttribute> attributes = this.getAttributes(exchange);
-    log.debug("request's attributes is {}", attributes);
+    Collection<ConfigAttribute> configAttributes = this.getAttributes(exchange);
+    log.debug("request's attributes is {}", configAttributes);
     
     // 判断 该资源 是否需要登录才能访问
-    if (attributes == null) {
+    if (configAttributes == null || configAttributes.size() <= 0) {
       return chain.filter(exchange);  // FIXME: 
     }
     
     // 获取 当前登录用户(包括角色信息)
     
-    // 判断 登录用户 是否可以访问 该资源
+    // FIXME: 判断 登录用户 是否可以访问 该资源
     
     return ReactiveSecurityContextHolder.getContext()
         .filter(c -> {
@@ -72,7 +75,32 @@
           
           boolean hasPermission = false;
           
-          for (ConfigAttribute ca : attributes) {
+          ConfigAttribute ca;
+          String needRole;
+          for (Iterator<ConfigAttribute> iter = configAttributes.iterator(); iter.hasNext();) {
+            ca = iter.next();
+            needRole = ca.getAttribute();
+            
+            if (needRole == null || needRole.isEmpty()) {
+              continue;
+            }
+            
+            if (needRole.startsWith("ACCESS_")) {
+              String access = needRole.substring("ACCESS_".length()); log.debug("Access is {}", access);
+              if ("anonymous".equals(access)) {
+                hasPermission = false;
+              } else if ("authenticate".equals(access)) {
+                hasPermission = true;
+              } else if ("permitAll".equals(access)) {
+                hasPermission = true;
+              } else if ("denyAll".equals(access)) {
+                hasPermission = false;
+              } else {
+                hasPermission = false;
+              }
+              break;
+            }
+            
             hasPermission = infrasUser.getRoles().contains(ca.getAttribute());
             if (hasPermission) {
               log.debug("match attribute is {}", ca.getAttribute());
@@ -81,35 +109,83 @@
           }
           
           if (!hasPermission) {
-            throw new RuntimeException("no permission");
+            throw new RuntimeException("no right");
           }
           
           return exchange;
         })
         .flatMap(ex -> chain.filter(ex));
   }
-  
+
+  @Autowired
+  private AuthnService authnService;
+
   private Map<RequestMatcher, Collection<ConfigAttribute>> requestMap = new ConcurrentHashMap<RequestMatcher, Collection<ConfigAttribute>>();
 
-  @Scheduled(initialDelayString = "${sw-backend-gateway.resource.refresh-delay:10000}", fixedDelayString = "${sw-backend-gateway.resource.refresh-delay:10000}")
+  @Scheduled(
+      initialDelayString = "${sw-backend-gateway.resource.refresh-delay:200}", 
+      fixedDelayString = "${sw-backend-gateway.resource.refresh-delay:10000}")
   protected void refreshRequestMap() {
     
     log.debug("AccessControlGlobalFilter.refreshRequestMap");
     
+    requestMap.clear();
     loadRequestMap();
   }
 
   // 定时刷新 资源 与 可访问角色 的 Map
   private void loadRequestMap() {
-    requestMap.clear();
+
+    if (requestMap.isEmpty()) {
+//    AntPathRequestMatcher requestMatcher0 = new AntPathRequestMatcher("/api/**");
+//    Collection<ConfigAttribute> attributes0 = new ArrayList<ConfigAttribute>();
+//    attributes0.add(new SecurityConfig("user"));
+//    requestMap.put(requestMatcher0, attributes0);
+    
+      // 从 后端接口 加载
+      List<ResourceRoleSet> resourceRoleSets = authnService.resourceRoleSets();
+      if (resourceRoleSets != null) {
+        for (ResourceRoleSet resourceRoleSet : resourceRoleSets) {
+          String method = resourceRoleSet.getMethod();
+          String path = resourceRoleSet.getPath();
+          String access = resourceRoleSet.getAccess();
+          
+          final RequestMatcher requestMatcher = new AntPathRequestMatcher(path, method);
+          
+          Collection<ConfigAttribute> attributes = new ArrayList<ConfigAttribute>();
+          
+          if (access != null) {
+            if (access.equals(ResourceRoleSet.ACCESS_ANONYMOUS)) {
+              attributes.add(new SecurityConfig("ACCESS_"+ResourceRoleSet.ACCESS_ANONYMOUS));
+            } else if (access.equals(ResourceRoleSet.ACCESS_AUTHENTICATE)) {
+              attributes.add(new SecurityConfig("ACCESS_"+ResourceRoleSet.ACCESS_AUTHENTICATE));
+            } else if (access.equals(ResourceRoleSet.ACCESS_AUTHORIZE)) {
+              for (Role r : resourceRoleSet.getRoles()) {
+                ConfigAttribute ca = new SecurityConfig(r.getCode());
+                attributes.add(ca);
+              }
+            } else if (access.equals(ResourceRoleSet.ACCESS_PERMIT_ALL)) {
+              attributes.add(new SecurityConfig("ACCESS_"+ResourceRoleSet.ACCESS_PERMIT_ALL));
+            } else if (access.equals(ResourceRoleSet.ACCESS_DENY_ALL)) {
+              attributes.add(new SecurityConfig("ACCESS_"+ResourceRoleSet.ACCESS_DENY_ALL));
+            } else {
+              for (Role r : resourceRoleSet.getRoles()) {
+                ConfigAttribute ca = new SecurityConfig(r.getCode());
+                attributes.add(ca);
+              }
+            }
+          } else {
+            for (Role r : resourceRoleSet.getRoles()) {
+              ConfigAttribute ca = new SecurityConfig(r.getCode());
+              attributes.add(ca);
+            }
+          }
+          
+          requestMap.put(requestMatcher, attributes);
+        }
+      }
       
-    AntPathRequestMatcher requestMatcher0 = new AntPathRequestMatcher("/api/**");
-    Collection<ConfigAttribute> attributes0 = new ArrayList<ConfigAttribute>();
-    attributes0.add(new SecurityConfig("user"));
-    requestMap.put(requestMatcher0, attributes0);
-    
-    // FIXME: 从 后端接口 加载
-    
+    }
 
   }
   
diff --git a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/security/core/userdetails/MyUserDetailsService.java b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/security/core/userdetails/MyUserDetailsService.java
index ef7d0e2..8a30025 100644
--- a/gateway/src/main/java/com/supwisdom/institute/backend/gateway/security/core/userdetails/MyUserDetailsService.java
+++ b/gateway/src/main/java/com/supwisdom/institute/backend/gateway/security/core/userdetails/MyUserDetailsService.java
@@ -16,7 +16,7 @@
 
 import com.supwisdom.institute.backend.gateway.authn.model.Account;
 import com.supwisdom.institute.backend.gateway.authn.model.Role;
-import com.supwisdom.institute.backend.gateway.authn.service.AuthnAccountService;
+import com.supwisdom.institute.backend.gateway.authn.service.AuthnService;
 
 import reactor.core.publisher.Mono;
 import lombok.extern.slf4j.Slf4j;
@@ -28,7 +28,7 @@
   PasswordEncoder passwordEncoder;
 
   @Autowired
-  AuthnAccountService authnAccountService;
+  AuthnService authnAccountService;
   
   @Override
   public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // TODO: 
@@ -56,7 +56,7 @@
       throw new UsernameNotFoundException(String.format("%s not found", username));
     }
     
-    List<Role> roles = authnAccountService.roles(username);
+    List<Role> roles = authnAccountService.accountRoles(username);
     
     List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
     for (Role role : roles) {
diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml
index c72cbc7..1f3be47 100644
--- a/gateway/src/main/resources/application.yml
+++ b/gateway/src/main/resources/application.yml
@@ -44,7 +44,7 @@
         filters:
         - RewritePath=/api/system/(?<suffix>.*), /$\{suffix}
       - id: biz-api
-        uri: http://localhost:8082
+        uri: http://localhost:8083
         predicates:
         - Path=/api/biz/**
         filters:
@@ -72,14 +72,13 @@
 
 infras.security.jwt.public-key-pem: |-
   -----BEGIN PUBLIC KEY-----
-  MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBQw6TmvJ+nOuRaLoHsZJGIBzRg/wbskNv6UevL3/nQioYooptPfdIHVzPiKRVT5+DW5+nqzav3DOxY+HYKjO9nFjYdj0sgvRae6iVpa5Ji1wbDKOvwIDNukgnKbqvFXX2Isfl0RxeN3uEKdjeFGGFdr38I3ADCNKFNxtbmfqvjQIDAQAB
+  MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgzXhvHLKypr+G+gJgOJNt8Lu8ygFFCU0eO4qJ4j2vDzpGwTOWKmD/u7dwIWKyHR43hUSN+FN4SSy1AmHjEKxz0btm7Cki+0YFw0BE4/mB/0wPD251wOS3w0CLsRTfoov9OaGaXApjVSMM74aIX8D46CbwHioLHdAj0/jlVU6gZQIDAQAB
   -----END PUBLIC KEY-----
 infras.security.jwt.private-key-pem-pkcs8: |-
   -----BEGIN PRIVATE KEY-----
-  MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMFDDpOa8n6c65FougexkkYgHNGD/BuyQ2/pR68vf+dCKhiiim0990gdXM+IpFVPn4Nbn6erNq/cM7Fj4dgqM72cWNh2PSyC9Fp7qJWlrkmLXBsMo6/AgM26SCcpuq8VdfYix+XRHF43e4Qp2N4UYYV2vfwjcAMI0oU3G1uZ+q+NAgMBAAECgYA7jA7UuhxXmMAYmJ0hO7xnMQPQJouqeP3AYK9+sfMF7WQNHR/r0vj7Vli/dUm1I4hxr+x8fAuomf+ve6gds7sm+v2JHLzEIyPPiogoC7IcBmjJ3yVzW/26cXeOmTiPC/fW2g4BpYxSM8HLDaSkrtqzy8e9ijlzMpHBvvwLikufnQJBAOXaqIPuZ7Vm/JwQHAmX2HV+Qk6GMi/H7mL8X0AaW68w+Iccdbz1hzmMBfdn5NMmx2AOwoBAVivgjt0a1OfksHMCQQDXPtXxwFy4dQ4TbPu8L38P8s/bPo9ib1YkEMp57yBw+IvxB7jnpA9rUYTfZM/HpVP7r9rfVEUylVXXzhz1qx//AkEApWJOTBdW8bQ3YEdLFS/3pJqDNSLjq3OMuBZkpqgQfh6bRAQbRynW8XYpuNk9URye6iPUmRkxp4J86ORseqoWtwJAJb5a/b1hhObhxP5DVkht23oUgLmDoxsq28AmASOxaJ3szCMyhUv7eDIfPp0K4lNXWrcHhkncqHYPS3xVD68mOQJAV4SRDdWpgAbQOUODotohE48RxrabHo0l228CJ/pnm0q7gplPs4iSNJ2eijFuOMXfKkq3z/vxiNSA59FcdoCOHQ==
+  MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKDNeG8csrKmv4b6AmA4k23wu7zKAUUJTR47ioniPa8POkbBM5YqYP+7t3AhYrIdHjeFRI34U3hJLLUCYeMQrHPRu2bsKSL7RgXDQETj+YH/TA8PbnXA5LfDQIuxFN+ii/05oZpcCmNVIwzvhohfwPjoJvAeKgsd0CPT+OVVTqBlAgMBAAECgYAtNxlyROOKkJCyZ4JbhA0QkOx5PWP2AZOJuLxP4SnvG50LYDAdPXVg82u1P+38n2truTF5qiXuYMUNcMoNixayWEZ074kVTI+FluLO405wwMYHvGPKOJVFIUTsKz+xkg4r48R963D5DZ6ZjoPIjLWvxL1zdrsgi9AOz/skAl0yAQJBANO0yadz1fYinSmYa2O27lgE1DpTvYBXGkY2qG7D/QJv2FwP6pdBy9ejym45UXce4wR1Yrlvh9wsErI4p790XOECQQDCcjti2nbIuZP3Dy5Ej97Y6sIbIEu5MpJW8kBjUzUssxgdE9urA/yWVzT8lmj34he+uWJv6s+e/HBDV5tc0tAFAkBK+q2s4+a0jN/SuovWPhS+Eb/EhKIKEU9Z7MPMrxctxMUBHhX8yi3SyszIKv7CTKskihqUCH86qFVaz5wBv8mhAkBgnQea13ebxnGZmSZhFKciWoq1lbdqPpFtuBJ8B5TtL9N0ZzCHaYSwYoZGVqmzONiZgF1DxIUCtuVE4JumZGzNAkB5B1sUdZfLo4q3jOiX5UQ/a4u17ptemvFPR4OynHkuVkgyAfTIo9SAB8/KIntHMlrgcP03G41ciJrYeP5zv8xm
   -----END PRIVATE KEY-----
 
-
 ##
 # infras.security cas
 #
diff --git a/sql/base.sql b/sql/base.sql
index d27bd71..750d82d 100644
--- a/sql/base.sql
+++ b/sql/base.sql
@@ -229,6 +229,7 @@
   `STATUS` VARCHAR(10) NOT NULL COMMENT '状态(1 启用,0 停用)',
 
   `TYPE_` VARCHAR(10) NOT NULL COMMENT '类型(1 应用,2 菜单,3 操作)',
+  `ICON` VARCHAR(500) COMMENT '菜单图标',
   `URL` VARCHAR(500) COMMENT 'URL地址',
 
   `APPLICATION_ID` VARCHAR(100) COMMENT '系统ID', 
@@ -283,6 +284,7 @@
 
   `METHOD` VARCHAR(100) COMMENT '请求方式(GET、POST、PUT、DELETE 等)',
   `PATH` VARCHAR(500) COMMENT '请求地址',
+  `ACCESS` VARCHAR(100) COMMENT '访问规则(匿名访问anonymous、认证访问authenticate、授权访问authorize、允许所有permitAll、拒绝所有denyAll)',
 
   PRIMARY KEY (`ID`),
   UNIQUE KEY `UQ_CODE` (`COMPANY_ID`,`CODE`)
@@ -306,7 +308,7 @@
 
   PRIMARY KEY (`ID`)
 )
-COMMENT = '角色 - 权限关联表';
+COMMENT = '权限 - 资源关联表';
 
 
 
@@ -396,117 +398,241 @@
 
 
 
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10101', 0, 'BaseAdminAccount.query', '查询帐号', '1', 'GET', '/api/base/v1/admin/accounts');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10102', 0, 'BaseAdminAccount.load', '获取帐号', '1', 'GET', '/api/base/v1/admin/accounts/{id}');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10103', 0, 'BaseAdminAccount.create', '创建帐号', '1', 'POST', '/api/base/v1/admin/accounts');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10104', 0, 'BaseAdminAccount.update', '修改帐号', '1', 'PUT', '/api/base/v1/admin/accounts/{id}');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10105', 0, 'BaseAdminAccount.delete', '删除帐号', '1', 'DELETE', '/api/base/v1/admin/accounts/{id}');
-
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10106', 0, 'BaseAdminAccount.accountGroups', '获取帐号的用户组', '1', 'GET', '/api/base/v1/admin/accounts/{id}/groups');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10107', 0, 'BaseAdminAccount.relateGroups', '关联帐号的用户组', '1', 'POST', '/api/base/v1/admin/accounts/{id}/groups');
-
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10108', 0, 'BaseAdminAccount.accountRoles', '获取帐号的角色', '1', 'GET', '/api/base/v1/admin/accounts/{id}/roles');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10109', 0, 'BaseAdminAccount.relateRoles', '关联帐号的角色', '1', 'POST', '/api/base/v1/admin/accounts/{id}/roles');
 
 
-
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10201', 0, 'BaseAdminGroup.query', '查询用户组', '1', 'GET', '/api/base/v1/admin/groups');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10202', 0, 'BaseAdminGroup.load', '获取用户组', '1', 'GET', '/api/base/v1/admin/groups/{id}');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10203', 0, 'BaseAdminGroup.create', '创建用户组', '1', 'POST', '/api/base/v1/admin/groups');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10204', 0, 'BaseAdminGroup.update', '修改用户组', '1', 'PUT', '/api/base/v1/admin/groups/{id}');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10205', 0, 'BaseAdminGroup.delete', '删除用户组', '1', 'DELETE', '/api/base/v1/admin/groups/{id}');
-
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10206', 0, 'BaseAdminGroup.groupAccounts', '获取用户组的帐号', '1', 'GET', '/api/base/v1/admin/groups/{id}/accounts');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10207', 0, 'BaseAdminGroup.relateAccounts', '关联用户组的帐号', '1', 'POST', '/api/base/v1/admin/groups/{id}/accounts');
-
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10208', 0, 'BaseAdminGroup.groupRoles', '获取用户组的角色', '1', 'GET', '/api/base/v1/admin/groups/{id}/roles');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10209', 0, 'BaseAdminGroup.relateRoles', '关联用户组的角色', '1', 'POST', '/api/base/v1/admin/groups/{id}/roles');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('1', 0, 'User.user', '获取登录信息', '1', 'GET', '/api/user', 'authenticate');
 
 
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10101', 0, 'BaseAdminAccount.query', '查询帐号', '1', 'GET', '/api/base/v1/admin/accounts', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10102', 0, 'BaseAdminAccount.load', '获取帐号', '1', 'GET', '/api/base/v1/admin/accounts/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10103', 0, 'BaseAdminAccount.create', '创建帐号', '1', 'POST', '/api/base/v1/admin/accounts', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10104', 0, 'BaseAdminAccount.update', '修改帐号', '1', 'PUT', '/api/base/v1/admin/accounts/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10105', 0, 'BaseAdminAccount.delete', '删除帐号', '1', 'DELETE', '/api/base/v1/admin/accounts/{id}', 'authorize');
 
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10301', 0, 'BaseAdminRole.query', '查询角色', '1', 'GET', '/api/base/v1/admin/roles');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10302', 0, 'BaseAdminRole.load', '获取角色', '1', 'GET', '/api/base/v1/admin/roles/{id}');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10303', 0, 'BaseAdminRole.create', '创建角色', '1', 'POST', '/api/base/v1/admin/roles');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10304', 0, 'BaseAdminRole.update', '修改角色', '1', 'PUT', '/api/base/v1/admin/roles/{id}');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10305', 0, 'BaseAdminRole.delete', '删除角色', '1', 'DELETE', '/api/base/v1/admin/roles/{id}');
-
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10306', 0, 'BaseAdminRole.roleAccounts', '获取角色的帐号', '1', 'GET', '/api/base/v1/admin/roles/{id}/accounts');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10307', 0, 'BaseAdminRole.relateAccounts', '关联角色的帐号', '1', 'POST', '/api/base/v1/admin/roles/{id}/accounts');
-
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10308', 0, 'BaseAdminRole.roleGroups', '获取角色的用户组', '1', 'GET', '/api/base/v1/admin/roles/{id}/groups');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10309', 0, 'BaseAdminRole.relateGroups', '关联角色的用户组', '1', 'POST', '/api/base/v1/admin/roles/{id}/groups');
-
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10310', 0, 'BaseAdminRole.rolePermissions', '获取角色的权限', '1', 'GET', '/api/base/v1/admin/roles/{id}/permissions');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10311', 0, 'BaseAdminRole.relatePermissions', '关联角色的权限', '1', 'POST', '/api/base/v1/admin/roles/{id}/permissions');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10106', 0, 'BaseAdminAccount.accountRoles', '获取帐号的角色', '1', 'GET', '/api/base/v1/admin/accounts/{id}/roles', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10107', 0, 'BaseAdminAccount.relateRoles', '关联帐号的角色', '1', 'POST', '/api/base/v1/admin/accounts/{id}/roles', 'authorize');
 
 
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10201', 0, 'BaseAdminRole.query', '查询角色', '1', 'GET', '/api/base/v1/admin/roles', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10202', 0, 'BaseAdminRole.load', '获取角色', '1', 'GET', '/api/base/v1/admin/roles/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10203', 0, 'BaseAdminRole.create', '创建角色', '1', 'POST', '/api/base/v1/admin/roles', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10204', 0, 'BaseAdminRole.update', '修改角色', '1', 'PUT', '/api/base/v1/admin/roles/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10205', 0, 'BaseAdminRole.delete', '删除角色', '1', 'DELETE', '/api/base/v1/admin/roles/{id}', 'authorize');
 
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10401', 0, 'BaseAdminMenu.query', '查询菜单', '1', 'GET', '/api/base/v1/admin/menus');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10402', 0, 'BaseAdminMenu.load', '获取菜单', '1', 'GET', '/api/base/v1/admin/menus/{id}');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10403', 0, 'BaseAdminMenu.create', '创建菜单', '1', 'POST', '/api/base/v1/admin/menus');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10404', 0, 'BaseAdminMenu.update', '修改菜单', '1', 'PUT', '/api/base/v1/admin/menus/{id}');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10405', 0, 'BaseAdminMenu.delete', '删除菜单', '1', 'DELETE', '/api/base/v1/admin/menus/{id}');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10206', 0, 'BaseAdminRole.roleAccounts', '获取角色的帐号', '1', 'GET', '/api/base/v1/admin/roles/{id}/accounts', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10207', 0, 'BaseAdminRole.relateAccounts', '关联角色的帐号', '1', 'POST', '/api/base/v1/admin/roles/{id}/accounts', 'authorize');
 
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10406', 0, 'BaseAdminMenu.tree', '树形菜单', '1', 'GET', '/api/base/v1/admin/menus/tree');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10208', 0, 'BaseAdminRole.rolePermissions', '获取角色的权限', '1', 'GET', '/api/base/v1/admin/roles/{id}/permissions', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10209', 0, 'BaseAdminRole.relatePermissions', '关联角色的权限', '1', 'POST', '/api/base/v1/admin/roles/{id}/permissions', 'authorize');
 
 
-
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10501', 0, 'BaseAdminOperation.query', '查询操作', '1', 'GET', '/api/base/v1/admin/operations');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10502', 0, 'BaseAdminOperation.load', '获取操作', '1', 'GET', '/api/base/v1/admin/operations/{id}');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10503', 0, 'BaseAdminOperation.create', '创建操作', '1', 'POST', '/api/base/v1/admin/operations');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10504', 0, 'BaseAdminOperation.update', '修改操作', '1', 'PUT', '/api/base/v1/admin/operations/{id}');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10505', 0, 'BaseAdminOperation.delete', '删除操作', '1', 'DELETE', '/api/base/v1/admin/operations/{id}');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10301', 0, 'BaseAdminApplication.query', '查询应用', '1', 'GET', '/api/base/v1/admin/applications', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10302', 0, 'BaseAdminApplication.load', '获取应用', '1', 'GET', '/api/base/v1/admin/applications/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10303', 0, 'BaseAdminApplication.create', '创建应用', '1', 'POST', '/api/base/v1/admin/applications', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10304', 0, 'BaseAdminApplication.update', '修改应用', '1', 'PUT', '/api/base/v1/admin/applications/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10305', 0, 'BaseAdminApplication.delete', '删除应用', '1', 'DELETE', '/api/base/v1/admin/applications/{id}', 'authorize');
 
 
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10401', 0, 'BaseAdminMenu.query', '查询菜单', '1', 'GET', '/api/base/v1/admin/menus', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10402', 0, 'BaseAdminMenu.load', '获取菜单', '1', 'GET', '/api/base/v1/admin/menus/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10403', 0, 'BaseAdminMenu.create', '创建菜单', '1', 'POST', '/api/base/v1/admin/menus', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10404', 0, 'BaseAdminMenu.update', '修改菜单', '1', 'PUT', '/api/base/v1/admin/menus/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10405', 0, 'BaseAdminMenu.delete', '删除菜单', '1', 'DELETE', '/api/base/v1/admin/menus/{id}', 'authorize');
 
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10601', 0, 'BaseAdminResource.query', '查询资源', '1', 'GET', '/api/base/v1/admin/resources');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10602', 0, 'BaseAdminResource.load', '获取资源', '1', 'GET', '/api/base/v1/admin/resources/{id}');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10603', 0, 'BaseAdminResource.create', '创建资源', '1', 'POST', '/api/base/v1/admin/resources');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10604', 0, 'BaseAdminResource.update', '修改资源', '1', 'PUT', '/api/base/v1/admin/resources/{id}');
-insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH)
-values ('10605', 0, 'BaseAdminResource.delete', '删除资源', '1', 'DELETE', '/api/system/v1/admin/resources/{id}');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10406', 0, 'BaseAdminMenu.tree', '树形菜单', '1', 'GET', '/api/base/v1/admin/menus/tree', 'authorize');
 
+
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10501', 0, 'BaseAdminOperation.query', '查询操作', '1', 'GET', '/api/base/v1/admin/operations', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10502', 0, 'BaseAdminOperation.load', '获取操作', '1', 'GET', '/api/base/v1/admin/operations/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10503', 0, 'BaseAdminOperation.create', '创建操作', '1', 'POST', '/api/base/v1/admin/operations', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10504', 0, 'BaseAdminOperation.update', '修改操作', '1', 'PUT', '/api/base/v1/admin/operations/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10505', 0, 'BaseAdminOperation.delete', '删除操作', '1', 'DELETE', '/api/base/v1/admin/operations/{id}', 'authorize');
+
+
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10601', 0, 'BaseAdminResource.query', '查询资源', '1', 'GET', '/api/base/v1/admin/resources', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10602', 0, 'BaseAdminResource.load', '获取资源', '1', 'GET', '/api/base/v1/admin/resources/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10603', 0, 'BaseAdminResource.create', '创建资源', '1', 'POST', '/api/base/v1/admin/resources', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10604', 0, 'BaseAdminResource.update', '修改资源', '1', 'PUT', '/api/base/v1/admin/resources/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10605', 0, 'BaseAdminResource.delete', '删除资源', '1', 'DELETE', '/api/system/v1/admin/resources/{id}', 'authorize');
+
+
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10701', 0, 'BaseAdminRoute.query', '查询路由', '1', 'GET', '/api/base/v1/admin/routes', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10702', 0, 'BaseAdminRoute.load', '获取路由', '1', 'GET', '/api/base/v1/admin/routes/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10703', 0, 'BaseAdminRoute.create', '创建路由', '1', 'POST', '/api/base/v1/admin/routes', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10704', 0, 'BaseAdminRoute.update', '修改路由', '1', 'PUT', '/api/base/v1/admin/routes/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10705', 0, 'BaseAdminRoute.delete', '删除路由', '1', 'DELETE', '/api/system/v1/admin/routes/{id}', 'authorize');
+
+
+/*
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10111', 0, 'BaseAdminAccount.accountGroups', '获取帐号的用户组', '1', 'GET', '/api/base/v1/admin/accounts/{id}/groups', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10112', 0, 'BaseAdminAccount.relateGroups', '关联帐号的用户组', '1', 'POST', '/api/base/v1/admin/accounts/{id}/groups', 'authorize');
+
+
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10211', 0, 'BaseAdminRole.roleGroups', '获取角色的用户组', '1', 'GET', '/api/base/v1/admin/roles/{id}/groups', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10212', 0, 'BaseAdminRole.relateGroups', '关联角色的用户组', '1', 'POST', '/api/base/v1/admin/roles/{id}/groups', 'authorize');
+
+
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10201', 0, 'BaseAdminGroup.query', '查询用户组', '1', 'GET', '/api/base/v1/admin/groups', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10202', 0, 'BaseAdminGroup.load', '获取用户组', '1', 'GET', '/api/base/v1/admin/groups/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10203', 0, 'BaseAdminGroup.create', '创建用户组', '1', 'POST', '/api/base/v1/admin/groups', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10204', 0, 'BaseAdminGroup.update', '修改用户组', '1', 'PUT', '/api/base/v1/admin/groups/{id}', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10205', 0, 'BaseAdminGroup.delete', '删除用户组', '1', 'DELETE', '/api/base/v1/admin/groups/{id}', 'authorize');
+
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10206', 0, 'BaseAdminGroup.groupAccounts', '获取用户组的帐号', '1', 'GET', '/api/base/v1/admin/groups/{id}/accounts', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10207', 0, 'BaseAdminGroup.relateAccounts', '关联用户组的帐号', '1', 'POST', '/api/base/v1/admin/groups/{id}/accounts', 'authorize');
+
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10208', 0, 'BaseAdminGroup.groupRoles', '获取用户组的角色', '1', 'GET', '/api/base/v1/admin/groups/{id}/roles', 'authorize');
+insert into TB_BASE_RESOURCE (ID, DELETED, CODE, NAME, STATUS, METHOD, PATH, ACCESS)
+values ('10209', 0, 'BaseAdminGroup.relateRoles', '关联用户组的角色', '1', 'POST', '/api/base/v1/admin/groups/{id}/roles', 'authorize');
+*/
+
+commit;
+
+
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10100_10101', 0, '10100', '10101');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10100_10102', 0, '10100', '10102');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10100_10103', 0, '10100', '10103');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10100_10104', 0, '10100', '10104');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10100_10105', 0, '10100', '10105');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10100_10106', 0, '10100', '10106');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10100_10107', 0, '10100', '10107');
+
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10200_10201', 0, '10200', '10201');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10200_10202', 0, '10200', '10202');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10200_10203', 0, '10200', '10203');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10200_10204', 0, '10200', '10204');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10200_10205', 0, '10200', '10205');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10200_10206', 0, '10200', '10206');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10200_10207', 0, '10200', '10207');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10200_10208', 0, '10200', '10208');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10200_10209', 0, '10200', '10209');
+
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10300_10301', 0, '10300', '10301');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10300_10302', 0, '10300', '10302');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10300_10303', 0, '10300', '10303');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10300_10304', 0, '10300', '10304');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10300_10305', 0, '10300', '10305');
+
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10400_10401', 0, '10400', '10401');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10400_10402', 0, '10400', '10402');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10400_10403', 0, '10400', '10403');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10400_10404', 0, '10400', '10404');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10400_10405', 0, '10400', '10405');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10400_10406', 0, '10400', '10406');
+
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10500_10501', 0, '10500', '10501');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10500_10502', 0, '10500', '10502');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10500_10503', 0, '10500', '10503');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10500_10504', 0, '10500', '10504');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10500_10505', 0, '10500', '10505');
+
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10600_10601', 0, '10600', '10601');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10600_10602', 0, '10600', '10602');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10600_10603', 0, '10600', '10603');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10600_10604', 0, '10600', '10604');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10600_10605', 0, '10600', '10605');
+
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10700_10701', 0, '10700', '10701');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10700_10702', 0, '10700', '10702');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10700_10703', 0, '10700', '10703');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10700_10704', 0, '10700', '10704');
+insert into TB_BASE_PERMISSION_RESOURCE (ID, DELETED, PERMISSION_ID, RESOURCE_ID)
+values ('10700_10705', 0, '10700', '10705');
+
+commit;