上篇文章:Ant Design Vue - Tree实现右键功能 已经讲了如何创建一个tree组件,同时添加了vue组件的右键功能,那么实际工作中,这个tree 的数据肯定是动态从后端获取,那么我们简单讲讲后端如何构造出这个tree节点数据。

准备条件

新建一个Spring boot工程,并导入mybatis-plus等相关包。

实现

部分代码实现如下

创建表

  1. CREATE TABLE `t_cases_tree` (
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  3. `TITLE` varchar(255) NOT NULL COMMENT '节点名',
  4. `PARENT_ID` int(11) NOT NULL COMMENT '父节点id -1表示根目录',
  5. `TYPE` int(10) NOT NULL COMMENT '节点类型1 文件夹 2 脑图',
  6. `PROJECT_ID` bigint(20) NOT NULL COMMENT '项目ID',
  7. `CREATE_TIME` datetime NOT NULL COMMENT '创建时间',
  8. `MODIFY_TIME` datetime DEFAULT NULL COMMENT '修改时间',
  9. PRIMARY KEY (`id`),
  10. KEY `PROJECT_ID` (`PROJECT_ID`),
  11. CONSTRAINT `projectid` FOREIGN KEY (`PROJECT_ID`) REFERENCES `t_project` (`id`)
  12. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

创建表对应的实体

  1. @Data
  2. @EqualsAndHashCode(callSuper = false)
  3. @Accessors(chain = true)
  4. @TableName("t_cases_tree")
  5. public class TCasesTree implements Serializable {
  6. private static final long serialVersionUID = 1L;
  7. @TableId(value = "id", type = IdType.AUTO)
  8. private Long id;
  9. /**
  10. * 节点名
  11. */
  12. @TableField("TITLE")
  13. private String title;
  14. /**
  15. * 父节点id
  16. */
  17. @TableField("PARENT_ID")
  18. private Long parentId;
  19. /**
  20. * 节点类型 1.文件夹 2.脑图
  21. */
  22. @TableField("TYPE")
  23. private Integer type;
  24. /**
  25. * 项目ID
  26. */
  27. @TableField("PROJECT_ID")
  28. private Long projectId;
  29. /**
  30. * 创建时间
  31. */
  32. @TableField("CREATE_TIME")
  33. private Date createTime;
  34. /**
  35. * 修改时间
  36. */
  37. @TableField("MODIFY_TIME")
  38. private Date modifyTime;
  39. /**
  40. * 不写入数据库字段
  41. */
  42. private transient List<TCasesTree> children;
  43. }

创建dao层

  1. public interface TCasesTreeMapper extends BaseMapper<TCasesTree> {
  2. }

创建service

  1. @Override
  2. public List<TCasesTree> findAllByProjectId(Long projectId) {
  3. List<TCasesTree> casesTrees = getTreeDataLoop(projectId,-1L);
  4. return casesTrees;
  5. }
  6. private List<TCasesTree> getTreeDataLoop(Long projectId,Long parentId) {
  7. // 通过项目ID获取该ID下所有节点
  8. QueryWrapper<TCasesTree> wrapper = new QueryWrapper<>();
  9. wrapper.eq("PROJECT_ID", projectId);
  10. wrapper.eq("PARENT_ID",parentId);
  11. List<TCasesTree> casesTrees = this.baseMapper.selectList(wrapper);
  12. // 循环获得的子级,将子级放入父级中
  13. for (TCasesTree casesTree : casesTrees) {
  14. // 递归方法,自己调用自己
  15. List<TCasesTree> treeDataLoop = getTreeDataLoop(projectId,casesTree.getId());
  16. // 将子级放入父级中
  17. casesTree.setChildren(treeDataLoop);
  18. }
  19. return casesTrees;
  20. }

controller实现

  1. @GetMapping
  2. public List<TCasesTree> findAllByProjectId(@NotBlank Long projectId) {
  3. return casesTreeService.findAllByProjectId(projectId);
  4. }