SpringBoot
MyBatisPlus
Stream API

实现树形结构效果如下:

{
    "code": 200,
    "data": [
        {
            "id": 1,
            "pid": 0,
            "name": "一级",
            "sort": 0,
            "status": 20,
            "children": [
                {
                    "id": 2,
                    "name": "二级",
                    "sort": 0,
                    "status": 20,
                    "children": [],
                    "pid": 1
                },
                {
                    "id": 3,
                    "name": "二级",
                    "sort": 0,
                    "status": 20,
                    "children": [],
                    "pid": 1
                },
                {
                    "id": 4,
                    "name": "二级",
                    "sort": 0,
                    "status": 20,
                    "children": [],
                    "pid": 1
                }
            ]
        }
    ],
    "msg": "操作成功"
}

一、 数据库结构:
在这里插入图片描述
二、 entity 结构:

package com.boot.voice.entity;


import java.io.Serializable;

import com.baomidou.mybatisplus.annotation.*;
import lombok.*;

import java.util.Date;
import java.util.List;

/**
 * 分类表(GoodsCategory)实体类
 *
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString(callSuper = true)
@TableName(value = "goods_category")
public class GoodsCategoryEntity implements Serializable {

    private static final long serialVersionUID = -52811708863040780L;

    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * 父分类
     */
    private Long pId;
    /**
     * 分类名称
     */
    private String name;
    /**
     * 排序
     */
    private Integer sort;
    /**
     * 分类状态
     */
    private Integer status;

    @TableField(exist = false)
    public List<GoodsCategoryEntity> children;


}


三、serviceImpl 结构:

package com.boot.voice.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.boot.voice.mapper.GoodsCategoryMapper;
import com.boot.voice.entity.GoodsCategoryEntity;
import com.boot.voice.common.dto.GoodsCategoryDto;
import com.boot.voice.service.IGoodsCategoryService;
import com.boot.voice.common.map.GoodsCategoryConverter;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 分类表(GoodsCategory)表服务实现类
 */
@Slf4j
@Service("goodsCategoryService")
public class GoodsCategoryServiceImpl extends ServiceImpl<GoodsCategoryMapper, GoodsCategoryEntity> implements IGoodsCategoryService {

    @Override
    public List<GoodsCategoryEntity> tree() {
        LambdaQueryWrapper<GoodsCategoryEntity> queryWrapper = Wrappers.lambdaQuery();
        List<GoodsCategoryEntity> list = this.list(queryWrapper);
        List<GoodsCategoryEntity> result = list.stream()
                .filter(permission -> permission.getPId().equals(0L))
                .map(permission -> covert(permission, list))
                .collect(Collectors.toList());
        return result;
    }

    /**
     * 将权限转换为带有子级的权限对象
     * 当找不到子级权限的时候map操作不会再递归调用covert
     */
    public GoodsCategoryEntity covert(GoodsCategoryEntity permission, List<GoodsCategoryEntity> permissionList) {
        List<GoodsCategoryEntity> children = permissionList.stream()
                .filter(subPermission -> subPermission.getPId().equals(permission.getId()))
                .map(subPermission -> covert(subPermission, permissionList))
                .collect(Collectors.toList());
        permission.setChildren(children);
        return permission;
    }

}


四、Controller 控制器:

package com.boot.voice.controller;


import com.boot.voice.core.result.R;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.boot.voice.entity.GoodsCategoryEntity;
import com.boot.voice.service.IGoodsCategoryService;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;

import java.util.List;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;

/**
 * 分类表(GoodsCategory)表控制层
 */
@RestController
@RequestMapping("goodsCategory")
public class GoodsCategoryController {
    /**
     * 服务对象
     */
    @Autowired
    private IGoodsCategoryService goodsCategoryService;


    @GetMapping("/tree")
    public R list() {
        List<GoodsCategoryEntity> list = goodsCategoryService.tree();
        return R.success(list);
    }
   
}


Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐