天天看點

JAVA: 背景将資料封裝成樹狀結構傳回給前台

@Resource
    private MenuMapper menuMapper;

    @Override
    public List<AdminPrivilegeVO> getPrivilegeAll(Integer status) {
        // 擷取所有根節點
        List<AdminPrivilegeVO> list = menuMapper.selectRootNode(status);
        List<AdminPrivilegeVO> result = new ArrayList<>();
        for (AdminPrivilegeVO adminPrivilegeVO:list) {
                if (adminPrivilegeVO.getId() != 0){
                    AdminPrivilegeVO privilegeVO = getTree(adminPrivilegeVO);
                    if (privilegeVO != null){
                        result.add(privilegeVO);
                    }
                }
        }
        return result;
    }

    /**
     * 擷取所有子節點的資料
     * @param adminPrivilegeVO
     * @return
     */
    public AdminPrivilegeVO getTree(AdminPrivilegeVO adminPrivilegeVO){
        List<AdminPrivilegeVO> list = menuMapper.selectByParentId(adminPrivilegeVO.getId());
        if (!list.isEmpty()){
            adminPrivilegeVO.setChildren(list);
            for (AdminPrivilegeVO privilegeVO:list) {
                if (privilegeVO.getId() != 0){
                    getTree(privilegeVO);
                }
            }
        }
        return adminPrivilegeVO;
    }
           

Mapper:

<select id="selectRootNode" resultType="org.jingning.emergency.model.response.admin.AdminPrivilegeVO">
         select * from t_menu where   parent_id = 0 
    </select>
    <select id="selectByParentId" resultType="org.jingning.emergency.model.response.admin.AdminPrivilegeVO">
         select * from t_menu where parent_id = #{id} 
    </select>
           

ps: 正式項目别使用select * 這種方式

VO:

@Getter
@Setter
@ApiModel
public class AdminPrivilegeVO {

    @ApiModelProperty(value = "記錄ID")
    private Integer id;

    @ApiModelProperty("權限名稱")
    private String name;

    @ApiModelProperty("權限路徑")
    private String url;

    @ApiModelProperty("上級id")
    private Long parentId;

    @ApiModelProperty("權限集合")
    List<AdminPrivilegeVO> children;
}