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("反馈情况")
    @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<Map<String,String>> 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<FeedbackMessageResponse> childen = new ArrayList<>();
}

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

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

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

List<FeedbackMessageResponse> treeResponseArrayList = new ArrayList<>();
	        List<FeedbackMessageResponse> 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<FeedbackMessageResponse> getTreeReponse(List<FeedbackMessageResponse> treeResponseArrayList) {
        // 创建根、非根节点集合
        List<FeedbackMessageResponse> listParentRecord = new ArrayList<>();
        List<FeedbackMessageResponse> 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<FeedbackMessageResponse> getChilden(Long parentId, List<FeedbackMessageResponse> childenList) {
        // 创建根、非根节点集合
        List<FeedbackMessageResponse> listParentRecord = new ArrayList<>();
        List<FeedbackMessageResponse> 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;
    }

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


bb = "%.0f" % a print(bb) 2. Python 字符串中,个单词反转,保留空格1 import re 2 str_a = "I love this Game" 3 str_split = re.split('(\s+)', str_a

java 发送邮件怎么抄送 javaweb发送邮件

实现网站注册实现邮件发送(带图片+文字邮件)1、新建一个maven项目,并配置tomcat启动项目并测试项目是否搭建成功2、导入相关依赖jar可以去maven官网获取maven官网<dependencies> <dependency> <groupId>javax.servlet</groupId>