如何生成多层级目录树
1.实体类
@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Where(clause = "is_delete=0")
@Table(name = "site")
@Alias("Site")
@ApiModel("树形分类目录表")
@EqualsAndHashCode(callSuper = true)
public class Site extends AbstractBaseEntity {
// 父级目录Id:没有为0
private Long pId;
// 父级目录名称:没有为“顶级”
private String pName;
// 当前目录名称
private String currentName;
}
2.DTO输出类Vo,是封装好输出给前端的实体格式
@Data
@ApiModel("SiteVo")
public class SiteVo implements Serializable {
private Long id;
private Long pId;
private String pName;
private String currentName;
// 子集:存储当前目录下的所有子集目录
private List<SiteVo> sonSiteList;
public static SiteVo getVoByEntity(Site entity) {
SiteVo vo = new SiteVo();
BeanUtils.copyProperties(entity, vo);
return vo;
}
}
3.使用Jpa组件,逻辑层就一个接口:返回所有目录信息
@Repository
public interface SiteRepository extends JpaRepository<Site, Long> {
}
public interface ISiteService {
// 一次性返回所有-多层级目录树
List<SiteVo> queryAll();
}
4.下面的逻辑层代码是最重要的:
@Transactional
@Service("ISiteService")
public class SiteServiceImpl implements ISiteService {
@Autowired
private SiteRepository repository;
@Override
public List<SiteVo> queryAll() {
List<SiteVo> data = new ArrayList<>(); // 存放输出的数据
// 1.获取全部数据
List<Site> siteList = repository.findAll();
if (StringUtils.isNotEmpty(siteList)) {
// 将数据转化为Vo类
List<SiteVo> siteVoList = siteList.stream().map(SiteVo::getVoByEntity).collect(Collectors.