x-blog之留言版简单介绍

前言

留言版的设计本质就是树结构的设计留言版设计(旧),之前的设计是从模仿B树写的,发现在数据存取时有一些需要优化,所以优化了下表结构和数据存取。
Alt text

数据库设计

为了方便直接贴出截图(以下是按照自己的想法建的结构,仅作为项目说明,如不合理,请谅解)
直接设计一张数据结构表t_message_info,其中parent_node为父节点编号,如果为0,表示为顶层留言,无父节点,否层则是孩子结点
Alt text

而其大概流程就是页面加载留言

父-子结构dto建立

在旧版本基础上优化了数据结构之后,就可以直接建立dto,在里面套一个子dto集合,并且重新equals和hashcode,最后只要去dto集合数据,按照父-子集合依次放入即可,而不需要兄弟结点了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/**
* 留言id
*/
private String messageId;
/**
* 留言内容
*/
private String messageContent;
/**
* 当前结点用户名
*/
private String currentName;
/**
* 父节点用户名
*/
private String parentName;
/**
* 父节点id
*/
private String parentNode;
/**
* 添加日期
*/
private String time;
/**
* 添加日期
*/
private Date gmtCreate;
/**
* 该节点下的所有子节点集合
*/
private List<MessageDto> child;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
MessageDto that = (MessageDto) o;
return messageId.equals(that.messageId);
}
@Override
public int hashCode() {
return messageId.hashCode();
}
省略set和get方法......

取出数据

由于重写了equals和hashcode,就可以直接通过messageId得到父节点。大概流程就是取出留言数据->分类(所有父,所有子集合)->遍历子集合,依次放到父节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@Override
public PageModal queryListbyPage(Page page, Map<String, Object> map) {
// 1.分页处理
page = PageUtil.createPage(page, tMessageInfoMapper.queryTotal(map).intValue());
map.put("beginIndex", page.getBeginIndex());
map.put("everyPage", page.getEveryPage());
PageModal pg = new PageModal();
pg.setPage(page);
// 2. 查询所有有效留言记录
List<MessageDto> pageList = tMessageInfoMapper.queryList(map);
if (CollectionUtils.isEmpty(pageList)) {
pg.setList(pageList);
return pg;
}
// 3. 留言数据结构分类(父-子)
final List<MessageDto> parent = new ArrayList<>();
final List<MessageDto> child = new ArrayList<>();
pageList.stream().filter(x -> x != null).forEach(dto -> {
// 3.1 格式化日期
dto.setTime(DateUtil.formatDate(dto.getGmtCreate(), DateUtil.fullPattern));
dto.setGmtCreate(null);
if (dto.getParentNode().equals(String.valueOf(Const.ZERO))) {
parent.add(dto);
}
else {
child.add(dto);
}
});
if (CollectionUtils.isEmpty(child)) {
pg.setList(parent);
return pg;
}
// 4.子节点归类
child.stream().filter(x -> x != null).forEach(x -> {
MessageDto parDto = parent.get(parent.indexOf(new MessageDto(x.getParentNode())));
if (CollectionUtils.isEmpty(parDto.getChild())) {
parDto.setChild(new ArrayList<>());
}
parDto.getChild().add(x);
});
pg.setList(parent);
return pg;
}

不足之处

前端由于短板,主要为数据加载趁现在页面初始化中,并且是通过动态语句创建div,所以分页没弄出来,导致数据量大会出现问题

热评文章