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