java实现留言回复功能(可以无限回复递归)

java实现留言回复功能(可以无限回复递归)

今天遇到一个项目上的需求,需要在留言反馈里加一个回复的功能,刚开始想的有些复杂,但是最后捋了一下思路用了将近两个小时终于写出来了。其实就只需要把所有数据查询出来一次,然后做一次递归操作。

首先看实体类
反馈留言:FeedbackMessage(BaseDomain只是一个基础的实体类而已)

@Entity
@Getter
@Setter
@Accessors(chain = true)
@Table(name = "jl_supervision_proc_feedback")
public class FeedbackMessage extends BaseDomain {
    private static final long serialVersionUID = -8595377684297725344L;

    @ApiModelProperty("反馈情况")
    @Lob
    @Column(columnDefinition = "TEXT")
    private String info;

    /**
     * 文件id
     */
    @Column(name = "fileIds")
    @ApiModelProperty("对应文件id,用&&&分割")
    private String fileIds;

    @ApiModelProperty("父类回复id 一级可以不传")
    private Long parentId;
}

响应类:FeedbackMessageResponse

@ApiModel
@Data
@Accessors(chain = true)
public class FeedbackMessageResponse {
    @ApiModelProperty("反馈留言id")
    private Long id;

    @ApiModelProperty("反馈留言内容")
    private String info;

    @ApiModelProperty("文件名:文件地址")
    private List> listMap = new ArrayList<>();

    @ApiModelProperty("修改时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date updateTime;

    @ApiModelProperty(value = "操作人、当前用户id")
    private Long operatorId;

    @ApiModelProperty(value = "操作人名称")
    private String operatorName;

    @ApiModelProperty(value = "父类回复id")
    private Long parentId;

    @ApiModelProperty("子节点")
    List childen = new ArrayList<>();
}

与之前类的区别可能只是加了一行代码

	@ApiModelProperty("子节点")
    List childen = new ArrayList<>();

只贴关键代码了,其他的业务逻辑可以按自己的业务添加

			List treeResponseArrayList = new ArrayList<>();
	        List responses;
			// 这里是jpa的分页条件查询
			page = feedbackMessageRepository.findAll(specification, pageRequest)
                                            .map(this::getBean);
            // 遍历获得所有数据
            page.getContent().forEach(o -> {
                FeedbackMessageResponse treeResponse = new FeedbackMessageResponse();
                ObjectUtil.copyNotNullBean(o,treeResponse);
                treeResponseArrayList.add(treeResponse);
            });
            responses = this.getTreeReponse(treeResponseArrayList);

封装树形结构:getTreeReponse

	/**
     * 封装树状图结构
     * @param treeResponseArrayList 所有记录
     * @return 封装后结果
     */
    private List getTreeReponse(List treeResponseArrayList) {
        // 创建根、非根节点集合
        List listParentRecord = new ArrayList<>();
        List listNotParentRecord = new ArrayList<>();
        // 查询并添加根、非根节点
        treeResponseArrayList.forEach(o -> {
            if (o.getParentId() == null){
                // 根节点
                listParentRecord.add(o);
            }else {
                // 非根节点
                listNotParentRecord.add(o);
            }
        });

        // 递归查询所有子节点
        if (CollectionUtil.isNotEmpty(listParentRecord)){
            listParentRecord.forEach(parent -> {
                parent.setChilden(this.getChilden(parent.getId(),listNotParentRecord));
            });
        }
        return listParentRecord;
    }

递归查询所有子节点:getChilden

	/**
     * 递归查询所有子节点
     * @param parentId 根节点id
     * @param childenList 非根节点集合
     * @return 所有子节点
     */
    private List getChilden(Long parentId, List childenList) {
        // 创建根、非根节点集合
        List listParentRecord = new ArrayList<>();
        List listNotParentRecord = new ArrayList<>();
        // 遍历childenList找出所有根、非根节点
        childenList.forEach(record -> {
            if (ObjectUtil.equal(parentId,record.getParentId())){
                listParentRecord.add(record);
            }else {
                listNotParentRecord.add(record);
            }
        });

        // 继续查询子节点
        if (CollectionUtil.isNotEmpty(listParentRecord)){
            listParentRecord
                    .forEach(record -> record.setChilden(this.getChilden(record.getId(),listNotParentRecord)));
        }

        return listParentRecord;
    }

注释应该写的很详细了,大家仔细看一下应该都可以看懂的。
这是在实际项目中使用的哦,所以代码肯定是对的哈。
如果有不懂的也欢迎提问哦。

你可能感兴趣的:(java后端开发,留言板回复,递归)