Вы наверняка видели древовидное меню ниже, но задумывались ли вы когда-нибудь о том, как оно реализовано? Позвольте мне рассказать вам, как я пришел к этому дизайну. Солнечным днем я посмотрел на завершенный проект передо мной и глубоко задумался. На долгое время я разработал каждый уровень древовидного меню как отдельную таблицу. готовится написать интерфейс для всех Когда все меню были возвращены, брат рассказал мне о структуре древовидного меню и о том, как спроектировать базу данных, я снова глубоко задумался. Теперь, когда я думаю об этом, возможно, мой разум настолько запутался, что. Я даже не понял основную идею рекурсии. Это немного сложно понять.
Фактически, проще говоря, это означает добавление поля «parent_id» в каждую строку меню для записи идентификатора родительского меню. Взяв в качестве примера меню ниже, я полагаю, что вы поймете простую структуру соответствующей базы данных. понять это с первого взгляда.
Проектирование базы данных Хотя оно завершено,Но как нам реализовать запрос? Что нужно интерфейсу, так это древовидная структура меню, которую мы возвращаем.,Тогда нам, естественно, нужен объект для его инкапсуляции.,Давайте воспользуемся здесь объектно-ориентированным мышлением, чтобы рассмотреть, как инкапсулировать возвращаемый объект.
Продолжайте просматривать, чтобы узнать.
1. Инкапсулируйте возвращаемый объект результата. Меню
@Data
public class Menu {
@ApiModelProperty("Идентификатор меню")
private Integer id;
@ApiModelProperty("Название меню")
private String name;
@ApiModelProperty("Идентификатор родительского меню меню")
private Integer parentId;
@ApiModelProperty("Это меню видно?")
private Integer status;
@ApiModelProperty("Тип этого меню")
private String type;
@ApiModelProperty("Время создания меню")
private Date createTime;
@ApiModelProperty("Время последнего изменения меню")
private Date updateTime;
@ApiModelProperty("Все подменю этого меню")
private List<Menu> childMenu;
}
2. Напишите SQL для поиска меню по идентификатору.
@Mapper
@Repository
public interface MenuMapper extends BaseMapper<Menu> {
@Select("select id,name,type,parent_id,status from menu where parent_id = #{id}")
List<Menu> menuList(Integer id);
}
3. Рекурсивно запросить все меню.
@Override
public List<CategoryEntity> listWithTree() {
// Искать по всем категориям
List<CategoryEntity> cs = this.getBaseMapper().selectList(null);
// Отфильтровать все категории первого уровня
return cs.stream()
.filter(categoryEntity -> categoryEntity.getParentCid() == 0L)
.peek(categoryEntity -> categoryEntity.setChildren(this.listChildren(categoryEntity,cs)))
.sorted(Comparator.comparing(CategoryEntity::getSort))
.collect(Collectors.toList());
}
private List<CategoryEntity> listChildren(CategoryEntity category,List<CategoryEntity> cs){
// рекурсия Найти подкатегорию
return cs.stream()
.filter(entity -> entity.getParentCid().equals(category.getCatId()))
.peek(c -> c.setChildren(this.listChildren(c,cs)))
.sorted(Comparator.comparing(CategoryEntity::getSort))
.collect(Collectors.toList());
}
Запомни одно последнее предложение~~ Если ты не будешь учиться сегодня, завтра ты станешь мусором.