Explorar el Código

软件权限一览表(页面资源权限)

ZhuJiaHao hace 6 meses
padre
commit
648b52ccc1

+ 18 - 0
ibps-base-root/modules/base-cloud/src/main/java/com/lc/ibps/cloud/entity/PermissionPageList.java

@@ -0,0 +1,18 @@
+package com.lc.ibps.cloud.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+public class PermissionPageList<T> extends APIPageList<T>{
+
+    private T data;
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+}

+ 80 - 0
ibps-model-root/modules/org-model/src/main/java/com/lc/ibps/org/party/persistence/entity/PagePermissionDTO.java

@@ -0,0 +1,80 @@
+package com.lc.ibps.org.party.persistence.entity;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 用于封装  每个页面对应的角色权限的  实体类
+ */
+public class PagePermissionDTO {
+
+    private String pageId;
+    private String pageName;
+
+
+    // 动态字段 - 每个角色对应一个布尔值
+    private Map<String, Boolean> rolePermissions = new LinkedHashMap<>();
+    /*
+    eg:
+        {
+          "角色a": false,
+          "角色b": true,
+          "角色c": true,
+          "角色d": true,
+          "角色e": false
+        }
+     */
+
+
+    public void setRolePermission(String roleName, Boolean hasPermission) {
+        this.rolePermissions.put(roleName, hasPermission);
+    }
+
+    public Boolean getRolePermission(String roleName) {
+        return this.rolePermissions.get(roleName);
+    }
+
+    public String getPageId() {
+        return pageId;
+    }
+
+    public void setPageId(String pageId) {
+        this.pageId = pageId;
+    }
+
+    public String getPageName() {
+        return pageName;
+    }
+
+    public void setPageName(String pageName) {
+        this.pageName = pageName;
+    }
+
+    public PagePermissionDTO() {
+    }
+
+    // 获取整个角色权限Map
+    public Map<String, Boolean> getRolePermissions() {
+        return rolePermissions;
+    }
+
+    // 设置整个角色权限Map
+    public void setRolePermissions(Map<String, Boolean> rolePermissions) {
+        this.rolePermissions = rolePermissions;
+    }
+
+    /**
+     * 新增:获取当前页面有权限的角色列表
+     * @return 当前页面有权限的角色名称列表 eg:["角色b", "角色c", "角色d"]
+     */
+    public List<String> getRolesWithPermission() {
+        if (rolePermissions == null || rolePermissions.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        return rolePermissions.entrySet().stream()
+                .filter(entry -> Boolean.TRUE.equals(entry.getValue()))
+                .map(Map.Entry::getKey)
+                .collect(Collectors.toList());
+    }
+}

+ 83 - 0
ibps-model-root/modules/org-model/src/main/java/com/lc/ibps/org/party/persistence/entity/PagePermissionMenuVO.java

@@ -0,0 +1,83 @@
+package com.lc.ibps.org.party.persistence.entity;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class PagePermissionMenuVO {
+
+    int sn;
+    List<PagePermissionMenuVO> childNode;
+    List<String> roles = new ArrayList<>();
+    String parentCode;
+    String menuCode;
+
+    String id;
+    String parentId;
+    Map<String,List<String>> buttons = new HashMap<>();
+
+    public PagePermissionMenuVO(int sn, String menuCode, String id, String parentId, String checked) {
+        this.sn = sn;
+        this.menuCode = menuCode;
+        this.id = id;
+        this.parentId = parentId;
+        this.roles.add(checked.equalsIgnoreCase("true")?"√":"");
+    }
+
+    public List<String> getRoles() {
+        return roles;
+    }
+
+    public void setRoles(List<String> roles) {
+        this.roles = roles;
+    }
+
+    public int getSn() {
+        return sn;
+    }
+
+    public void setSn(int sn) {
+        this.sn = sn;
+    }
+
+    public List<PagePermissionMenuVO> getChildNode() {
+        return childNode;
+    }
+
+    public void setChildNode(List<PagePermissionMenuVO> childNode) {
+        this.childNode = childNode;
+    }
+
+    public String getParentCode() {
+        return parentCode;
+    }
+
+    public void setParentCode(String parentCode) {
+        this.parentCode = parentCode;
+    }
+
+    public String getMenuCode() {
+        return menuCode;
+    }
+
+    public void setMenuCode(String menuCode) {
+        this.menuCode = menuCode;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parentId) {
+        this.parentId = parentId;
+    }
+}

+ 54 - 0
ibps-model-root/modules/org-model/src/main/java/com/lc/ibps/org/party/persistence/entity/PermissionSaveDTO.java

@@ -0,0 +1,54 @@
+package com.lc.ibps.org.party.persistence.entity;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 保存接口  用于接收前端传来的  实体类
+ */
+public class PermissionSaveDTO {
+
+    /*
+    请求体示例:
+    {
+      "permissions": [
+        {
+          "pageId": 1008687593425993728,
+          "pageName": "页面1",
+          "rolePermissions":{
+              "角色a": false,
+              "角色b": true,
+              "角色c": true,
+              "角色d": true,
+              "角色e": false
+        }
+        },
+       {
+          "pageId": 1008687593425993728,
+          "pageName": "页面2",
+          "rolePermissions":{
+              "角色a": false,
+              "角色b": true,
+              "角色c": true,
+              "角色d": true,
+              "角色e": false
+        }
+        },
+        ......多个对象省略
+      ]
+    }
+     */
+
+    private List<PagePermissionDTO> permissions;
+
+    public List<PagePermissionDTO> getPermissions() {
+        return permissions;
+    }
+
+    public void setPermissions(List<PagePermissionDTO> permissions) {
+        this.permissions = permissions;
+    }
+
+}

+ 37 - 0
ibps-model-root/modules/org-model/src/main/java/com/lc/ibps/org/party/persistence/entity/PermissionViewDTO.java

@@ -0,0 +1,37 @@
+package com.lc.ibps.org.party.persistence.entity;
+
+
+import java.util.List;
+
+/**
+ * 查询接口  用于返回前端展示的  实体类
+ */
+public class PermissionViewDTO {
+
+    private List<String> roles;
+    private List<PagePermissionDTO> permissions;
+
+    public List<String> getRoles() {
+        return roles;
+    }
+
+    public void setRoles(List<String> roles) {
+        this.roles = roles;
+    }
+
+    public List<PagePermissionDTO> getPermissions() {
+        return permissions;
+    }
+
+    public void setPermissions(List<PagePermissionDTO> permissions) {
+        this.permissions = permissions;
+    }
+
+    public PermissionViewDTO(List<String> roles, List<PagePermissionDTO> permissions) {
+        this.roles = roles;
+        this.permissions = permissions;
+    }
+
+    public PermissionViewDTO() {
+    }
+}

+ 110 - 0
ibps-model-root/modules/org-model/src/main/resources/com/lc/ibps/org/party/persistence/mapping/PartyRoleProvider.map.xml

@@ -9,4 +9,114 @@
     <update id="updateUserRoleJobByUserId" parameterType="string">
         update IBPS_PARTY_EMPLOYEE set JOB_ = #{job} where ID_ = #{userId}
     </update>
+
+
+
+    <resultMap id="PartyRole" type="com.lc.ibps.org.party.persistence.entity.PartyRolePo">
+        <id property="id" column="ID_" jdbcType="VARCHAR"/>
+        <result property="name" column="NAME_" jdbcType="VARCHAR"/>
+        <result property="roleNote" column="ROLE_NOTE_" jdbcType="BLOB"/>
+        <result property="roleAlias" column="ROLE_ALIAS_" jdbcType="VARCHAR"/>
+        <result property="roleType" column="ROLE_TYPE_" jdbcType="VARCHAR"/>
+        <result property="subSystemName" column="SYSTEM_NAME_" jdbcType="VARCHAR"/>
+        <result property="subSystemId" column="SYSTEM_ID_" jdbcType="VARCHAR"/>
+        <result property="subSystemAlias" column="ALIAS_" jdbcType="VARCHAR"/>
+        <result property="tenantId" column="TENANT_ID_" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <select id="getRoleByName" resultMap="PartyRole" parameterType="string">
+        SELECT
+        t1.ID_,
+        t1.NAME_,
+        t1.ROLE_NOTE_,
+        t1.ROLE_ALIAS_,
+        t1.TENANT_ID_,
+        t1.ROLE_TYPE_,
+        t2.SYSTEM_ID_
+        FROM IBPS_PARTY_ROLE as t1
+        LEFT JOIN (
+            select
+            SYSTEM_ID_,
+            ROLE_ID_,
+            NAME_ as SYSTEM_NAME_
+            from IBPS_AUTH_ROLE_SYSTEM
+            left join  IBPS_AUTH_SUBSYS a on a.ID_ = SYSTEM_ID_
+        )as t2 on t2.ROLE_ID_ = t1.ID_
+        <if test="name != null and name != ''">
+            WHERE t1.NAME_ LIKE CONCAT('%',#{name},'%')
+        </if>
+    </select>
+
+
+    <resultMap id="Resources" type="com.lc.ibps.org.auth.persistence.entity.ResourcesPo">
+        <id property="id" column="ID_" jdbcType="VARCHAR"/>
+        <result property="name" column="NAME_" jdbcType="VARCHAR"/>
+        <result property="alias" column="ALIAS_" jdbcType="VARCHAR"/>
+        <result property="desc" column="DESC_" jdbcType="VARCHAR"/>
+        <result property="sn" column="SN_" jdbcType="NUMERIC"/>
+        <result property="icon" column="ICON_" jdbcType="VARCHAR"/>
+        <result property="resourceType" column="RESOURCE_TYPE_" jdbcType="VARCHAR"/>
+        <result property="parentId" column="PARENT_ID_" jdbcType="VARCHAR"/>
+        <result property="defaultUrl" column="DEFAULT_URL_" jdbcType="VARCHAR"/>
+        <result property="isFolder" column="IS_FOLDER_" jdbcType="CHAR"/>
+        <result property="displayInMenu" column="DISPLAY_IN_MENU_" jdbcType="CHAR"/>
+        <result property="isOpen" column="IS_OPEN_" jdbcType="CHAR"/>
+        <result property="systemId" column="SYSTEM_ID_" jdbcType="VARCHAR"/>
+        <result property="path" column="PATH_" jdbcType="VARCHAR"/>
+        <result property="tenantId" column="TENANT_ID_" jdbcType="VARCHAR"/>
+        <result property="tenantType" column="TENANT_TYPE_" jdbcType="VARCHAR"/>
+        <result property="createBy" column="CREATE_BY_" jdbcType="VARCHAR"/>
+        <result property="createTime" column="CREATE_TIME_" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <select id="getResourcesByName" resultMap="Resources" parameterType="string">
+        SELECT
+        DISTINCT r.*
+        FROM IBPS_AUTH_RES AS r
+        <choose>
+            <when test="name != null and name != ''">
+                WHERE (
+                    EXISTS (
+                        SELECT 1
+                        FROM ibps_auth_res m
+                        WHERE m.NAME_ LIKE CONCAT('%',#{name},'%')
+                        AND (
+                            -- 下级关系:当前资源的PATH包含匹配资源的ID
+                            r.PATH_ LIKE CONCAT('%', m.ID_, '%')
+                            OR
+                            -- 上级关系:匹配资源的PATH包含当前资源的ID
+                            m.PATH_ LIKE CONCAT('%', r.ID_, '%')
+                        )
+                    )
+                )
+            </when>
+            <otherwise>
+                where 1=1
+            </otherwise>
+        </choose>
+        AND DISPLAY_IN_MENU_ = 'Y'
+        ORDER BY SN_
+    </select>
+
+    <select id="getRoleIdsByResourcesId" parameterType="string" resultType="string">
+        SELECT ROLE_ID_ FROM IBPS_AUTH_ROLE_RES
+        WHERE RES_ID_ = #{id}
+    </select>
+
+
+    <delete id="deleteRoleResourcesByResourcesId" parameterType="string">
+        DELETE FROM IBPS_AUTH_ROLE_RES
+        WHERE RES_ID_ = #{pageId}
+    </delete>
+
+    <insert id="insertRoleResources" parameterType="string">
+        insert into IBPS_AUTH_ROLE_RES (ID_, ROLE_ID_, RES_ID_,SYSTEM_ID_)
+        values
+        (
+            (select max(CONVERT(ID_, SIGNED))+1 from IBPS_AUTH_ROLE_RES as t1),
+            (select ID_ from IBPS_PARTY_ROLE where NAME_ = #{roleName}),
+            #{resId},
+            (select SYSTEM_ID_ from IBPS_AUTH_ROLE_SYSTEM where ROLE_ID_ = (select ID_ from IBPS_PARTY_ROLE where NAME_ = #{roleName}))
+        )
+    </insert>
 </mapper>

+ 19 - 3
ibps-provider-base-root/modules/provider-platform-api/src/main/java/com/lc/ibps/org/api/IPartyRoleService.java

@@ -12,6 +12,8 @@ package com.lc.ibps.org.api;
 import java.util.List;
 import java.util.Map;
 
+import com.lc.ibps.cloud.entity.PermissionPageList;
+import com.lc.ibps.org.party.persistence.entity.*;
 import org.hibernate.validator.constraints.NotBlank;
 import org.hibernate.validator.constraints.NotEmpty;
 import org.springframework.validation.annotation.Validated;
@@ -24,9 +26,6 @@ import org.springframework.web.bind.annotation.RestController;
 import com.lc.ibps.cloud.entity.APIPageList;
 import com.lc.ibps.cloud.entity.APIRequest;
 import com.lc.ibps.cloud.entity.APIResult;
-import com.lc.ibps.org.party.persistence.entity.DefaultPartyRolePo;
-import com.lc.ibps.org.party.persistence.entity.PartyRolePo;
-import com.lc.ibps.org.party.persistence.entity.PartyRoleTreePo;
 import com.lc.ibps.org.vo.IdKeyVo;
 
 
@@ -293,5 +292,22 @@ public interface IPartyRoleService {
 	@RequestMapping(value = "/transfer", method = { RequestMethod.POST })
 	public APIResult<Map<String, Map<String, String>>> transfer(
 			@RequestBody(required = true) IdKeyVo idKeyVo);
+
+
+	/**
+	 * 页面资源权限一览表 查询
+	 * @param
+	 * @return
+	 */
+	@RequestMapping(value = "/getPagePermission", method = RequestMethod.POST )
+	public APIResult<PermissionPageList<PermissionViewDTO>> getPagePermission(@RequestBody(required = true) APIRequest request);
+
+	/**
+	 * 页面资源权限一览表  保存
+	 * @param
+	 * @return
+	 */
+	@RequestMapping(value = "/savePagePermission", method = RequestMethod.POST )
+	public APIResult<Void> savePagePermission(@RequestBody(required = true) PermissionSaveDTO permissionSaveDTO);
 	
 }

+ 61 - 11
ibps-provider-root/modules/provider-platform-default/src/main/java/com/lc/ibps/org/provider/PartyRoleProvider.java

@@ -11,6 +11,8 @@ import java.util.Set;
 
 import javax.annotation.Resource;
 
+import com.lc.ibps.cloud.entity.*;
+import com.lc.ibps.org.party.persistence.entity.*;
 import com.lc.ibps.platform.service.PartyRoleProviderService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -32,10 +34,6 @@ import com.lc.ibps.base.core.util.string.StringUtil;
 import com.lc.ibps.base.framework.request.signature.annotation.Signature;
 import com.lc.ibps.base.framework.utils.PageUtil;
 import com.lc.ibps.base.web.context.ContextUtil;
-import com.lc.ibps.cloud.entity.APIPageList;
-import com.lc.ibps.cloud.entity.APIRequest;
-import com.lc.ibps.cloud.entity.APIRequestParameter;
-import com.lc.ibps.cloud.entity.APIResult;
 import com.lc.ibps.cloud.provider.GenericProvider;
 import com.lc.ibps.cloud.utils.RequestUtil;
 import com.lc.ibps.org.api.IPartyRoleMgrService;
@@ -46,12 +44,6 @@ import com.lc.ibps.org.auth.repository.RoleSystemRepository;
 import com.lc.ibps.org.auth.repository.SubSystemRepository;
 import com.lc.ibps.org.party.builder.PartyRoleBaseBuilder;
 import com.lc.ibps.org.party.domain.PartyRole;
-import com.lc.ibps.org.party.persistence.entity.DefaultPartyRolePo;
-import com.lc.ibps.org.party.persistence.entity.PartyOrgAuthPo;
-import com.lc.ibps.org.party.persistence.entity.PartyOrgPo;
-import com.lc.ibps.org.party.persistence.entity.PartyPositionPo;
-import com.lc.ibps.org.party.persistence.entity.PartyRolePo;
-import com.lc.ibps.org.party.persistence.entity.PartyRoleTreePo;
 import com.lc.ibps.org.party.repository.DefaultPartyRoleRepository;
 import com.lc.ibps.org.party.repository.PartyEntityRepository;
 import com.lc.ibps.org.party.repository.PartyRoleRepository;
@@ -779,7 +771,65 @@ public class PartyRoleProvider extends GenericProvider implements IPartyRoleServ
 		}
 		return result;
 	}
-	
+
+
+	@Override
+	public APIResult<PermissionPageList<PermissionViewDTO>> getPagePermission(@RequestBody(required = true) APIRequest request) {
+		/*
+		返回前端渲染用的json格式:
+		{
+		  "roles": [
+			"角色a",
+			"角色b",
+			"角色c",
+			"角色d",
+			"角色e",
+		  ],
+		  "permissions": [
+			{
+			  "pageId": 1,
+			  "pageName": "页面1",
+			  "角色a": false,
+			  "角色b": true,
+			  "角色c": true,
+			  "角色d": true,
+			  "角色e": false
+			},
+			{
+			  "pageId": 2,
+			  "pageName": "页面2",
+			  "角色a": false,
+			  "角色b": true,
+			  "角色c": true,
+			  "角色d": true,
+			  "角色e": false
+			},
+			......多个对象省略
+		  ]
+		}
+		 */
+
+		APIResult<PermissionPageList<PermissionViewDTO>> result = partyRoleProviderService.getPagePermission(request);
+
+		return result;
+	}
+
+
+	@Override
+	public APIResult<Void> savePagePermission(@RequestBody(required = true) PermissionSaveDTO permissionSaveDTO) {
+
+		APIResult<Void> result = new APIResult<Void>();
+		try {
+			partyRoleProviderService.savePagePermission(permissionSaveDTO);
+		}catch (Exception e){
+			setExceptionResult(result, StateEnum.ERROR_ROLE.getCode(), I18nUtil.getMessage(StateEnum.ERROR_ROLE.getCode()+""), e);
+		}
+		result.setMessage("保存成功");
+		return result;
+	}
+
+
+
 	@ApiOperation(value = "查询角色树", notes = "查询角色树")
 	@Override
 	public APIResult<List<PartyRoleTreePo>> findTreeData(

+ 26 - 0
ibps-provider-root/modules/provider-platform-default/src/main/java/com/lc/ibps/platform/dao/PartyRoleProviderDao.java

@@ -1,5 +1,7 @@
 package com.lc.ibps.platform.dao;
 
+import com.lc.ibps.org.auth.persistence.entity.ResourcesPo;
+import com.lc.ibps.org.party.persistence.entity.PartyRolePo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -11,4 +13,28 @@ public interface PartyRoleProviderDao {
 
     void updateUserRoleJobByUserId(@Param("userId")String userId,@Param("job")String job);
 
+    List<PartyRolePo> getRoleByName(@Param("name")String name);
+
+    /**
+     * 该方法会查询出资源页面的所有上下级的资源
+     */
+    List<ResourcesPo> getResourcesByName(@Param("name")String name);
+
+    /**
+     * 根据资源ID获取关联的有相关权限的角色ID
+     * @param id
+     * @return
+     */
+    List<String> getRoleIdsByResourcesId(@Param("id")String id);
+
+    /**
+     * 根据资源ID删除角色资源关联关系
+     */
+    void deleteRoleResourcesByResourcesId(@Param("pageId")String pageId);
+
+
+    /**
+     * 插入角色资源关联关系
+     */
+    int insertRoleResources(@Param("roleName")String roleName, @Param("resId")String resId);
 }

+ 181 - 2
ibps-provider-root/modules/provider-platform-default/src/main/java/com/lc/ibps/platform/service/PartyRoleProviderService.java

@@ -4,13 +4,20 @@ package com.lc.ibps.platform.service;
 
 import com.lc.ibps.base.core.util.AppUtil;
 import com.lc.ibps.base.framework.table.ICommonDao;
+import com.lc.ibps.cloud.entity.*;
+import com.lc.ibps.cloud.entity.APIPageList;
+import com.lc.ibps.org.auth.persistence.entity.ResourcesPo;
+import com.lc.ibps.org.party.persistence.entity.*;
 import com.lc.ibps.platform.dao.PartyRoleProviderDao;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
-import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -96,4 +103,176 @@ public class PartyRoleProviderService {
             partyRoleProviderDao.updateUserRoleJobByUserId(userId,jobs);
         }
     }
+
+
+    public APIResult<PermissionPageList<PermissionViewDTO>> getPagePermission(APIRequest request){
+
+        APIResult apiResult = new APIResult();
+        PermissionPageList apiPageList = new PermissionPageList();
+        List<PagePermissionMenuVO> allMenuList = new ArrayList<>();
+        List<String> roles = new ArrayList<>();
+        List<PagePermissionDTO> permissions = new ArrayList<>();
+
+        String roleName = (String) getCustomParamFormRequest(request, "roleName");
+        String pageName = (String) getCustomParamFormRequest(request, "pageName");
+
+
+        //查询角色
+        List<PartyRolePo> roleList = partyRoleProviderDao.getRoleByName(roleName);
+        //角色排序
+        roleList = roleList.stream().sorted(Comparator.comparing(PartyRolePo::getRoleNote)).collect(Collectors.toList());
+        //提取roleList中的name属性到排序后的List<String>
+        roles = roleList.stream().map(PartyRolePo::getName).collect(Collectors.toList());
+        //查询页面资源
+        List<ResourcesPo> resourcesList = partyRoleProviderDao.getResourcesByName(pageName);
+
+        //如果没有查询到角色或资源,则直接返回
+        if(CollectionUtils.isEmpty(roleList) || CollectionUtils.isEmpty(resourcesList)){
+            apiResult.setState(200);
+            apiResult.setMessage("没有符合条件的数据");
+            apiResult.setData(null);
+            return apiResult;
+
+        }
+
+        //对资源名称做层级处理
+        for(ResourcesPo resourcesPo:resourcesList){
+            allMenuList.add(new PagePermissionMenuVO(resourcesPo.getSn(), resourcesPo.getName(), resourcesPo.getId(), resourcesPo.getParentId(),resourcesPo.getChecked()));
+        }
+        List<PagePermissionMenuVO> result = getChildNode("0", allMenuList);
+        allMenuList = getFlatMenuList("",result);
+
+        //对页面资源进行分页处理
+        if(null != request.getRequestPage() && request.getRequestPage().getPageNo()>0 && request.getRequestPage().getLimit()>0){
+            APIRequestPage requestPage = request.getRequestPage();
+            apiPageList = paginateList(requestPage.getPageNo(), requestPage.getLimit(), allMenuList);
+        }else {
+            apiPageList = paginateList(1, 50, allMenuList);
+        }
+
+        //查询每个页面资源对应的角色权限
+        List<PagePermissionMenuVO> pageResourcesList = apiPageList.getDataResult();
+        for(PagePermissionMenuVO menuVO:pageResourcesList){
+            List<String> roleIdList = partyRoleProviderDao.getRoleIdsByResourcesId(menuVO.getId());
+            //封装每行的数据(每个页面的所有的角色权限标识)
+            PagePermissionDTO pagePermissionDTO = new PagePermissionDTO();
+            pagePermissionDTO.setPageId(menuVO.getId());
+            pagePermissionDTO.setPageName(menuVO.getParentCode() + "/" + menuVO.getMenuCode());
+            for(PartyRolePo rolePo:roleList){
+                pagePermissionDTO.setRolePermission(rolePo.getName(),roleIdList.contains(rolePo.getId())?true:false);
+            }
+            permissions.add(pagePermissionDTO);
+        }
+
+
+        //封装整体的返回数据
+        PermissionViewDTO permissionViewDTO = new PermissionViewDTO();
+        permissionViewDTO.setRoles(roles);
+        permissionViewDTO.setPermissions(permissions);
+
+        apiPageList.setData(permissionViewDTO);
+        apiPageList.setDataResult(null);
+        apiResult.setData(apiPageList);
+        apiResult.setMessage("查询成功");
+
+        return apiResult;
+    }
+
+    /**
+     * 对List进行分页切分
+     * @param pageno 起始页号(从1开始)
+     * @param pagesize 页数
+     * @param list 待分页的List
+     * @return APIPageList包含分页数据和分页信息
+     */
+    public <T> PermissionPageList<T> paginateList(int pageno, int pagesize, List<T> list) {
+        PermissionPageList<T> result = new PermissionPageList<>();
+        
+        if (list == null || list.isEmpty() || pagesize <= 0 || pageno <= 0) {
+            result.setDataResult(list);
+            result.setPageResult(new APIPageResult(pageno, pagesize, list == null ? 0 : list.size()));
+            return result;
+        }
+        
+        int totalCount = list.size();
+        int startIndex = (pageno - 1) * pagesize;
+        int endIndex = Math.min(startIndex + pagesize, totalCount);
+        
+        List<T> pageData = startIndex >= totalCount ? list.subList(0, 0) : list.subList(startIndex, endIndex);
+        
+        result.setDataResult(pageData);
+        result.setPageResult(new APIPageResult(pageno, pagesize, totalCount));
+        
+        return result;
+    }
+
+    /**
+     * 从APIRequest的customs中提取参数
+     * @param request APIRequest对象
+     * @param paramName 参数名称
+     * @return 参数值,如果不存在则返回null
+     */
+    private Object getCustomParamFormRequest(APIRequest request, String paramName) {
+        if (request == null || request.getCustoms() == null || paramName == null) {
+            return null;
+        }
+        return request.getCustoms().get(paramName);
+    }
+
+
+    public List<PagePermissionMenuVO> getChildNode(String rootMenu, List<PagePermissionMenuVO> allMenuList) {
+
+        List<PagePermissionMenuVO> childMenu = new ArrayList<>();
+        for (PagePermissionMenuVO menu : allMenuList) {
+            if (menu.getParentId().compareTo(rootMenu) == 0) {
+                // 递归查询此节点下的所有子节点
+                List<PagePermissionMenuVO> childNode = getChildNode(menu.getId(), allMenuList);
+                menu.setChildNode(childNode);
+                childMenu.add(menu);
+            }
+        }
+        // 子节点进行排序
+        List<PagePermissionMenuVO> childSortMenu = Optional.ofNullable(childMenu)
+                .map(List::stream)
+                .orElseGet(Stream::empty)
+                .sorted(Comparator.comparing(PagePermissionMenuVO::getSn))
+                .collect(Collectors.toList());
+
+        return childSortMenu;
+    }
+
+
+    public List<PagePermissionMenuVO> getFlatMenuList(String parentCode,List<PagePermissionMenuVO> allMenuList){
+        List<PagePermissionMenuVO> menu = new ArrayList<>();
+        for (PagePermissionMenuVO m : allMenuList) {
+            m.setParentCode(parentCode);
+            menu.add(m);
+            menu.addAll(getFlatMenuList(parentCode+"/"+m.getMenuCode(),m.getChildNode()));
+        }
+        return menu;
+    }
+
+
+    
+    @Transactional(rollbackFor = Exception.class)
+    public void savePagePermission(PermissionSaveDTO permissionSaveDTO){
+        if( null == permissionSaveDTO || CollectionUtils.isEmpty(permissionSaveDTO.getPermissions())){
+            return;
+        }
+
+        //遍历每个页面的权限设置
+        for(PagePermissionDTO pagePermissionDTO:permissionSaveDTO.getPermissions()){
+            String pageId = pagePermissionDTO.getPageId();
+            //删除该页面对应的所有角色权限
+            partyRoleProviderDao.deleteRoleResourcesByResourcesId(pageId);
+            //获取该页面有权限的角色列表
+            List<String> roleNameList = pagePermissionDTO.getRolesWithPermission();
+            for(String roleName:roleNameList){
+                //插入资源和角色的对应关系
+                partyRoleProviderDao.insertRoleResources(roleName, pageId);
+            }
+        }
+
+    }
+
 }