springboot动态生成树形结构

导读:本篇文章讲解 springboot动态生成树形结构,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1.成品展示

框架采用springboot,所有数据都是通过查询数据库获取,数据库增删改后树形结构也会随之改变,采用递归实现。

项目源码地址阿里云盘:阿里云盘分享

提取码:hr49

springboot动态生成树形结构

1.项目整体结构

springboot动态生成树形结构

2.数据库结构跟测试数据

springboot动态生成树形结构

springboot动态生成树形结构

3.pom.xml导入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.4</version>
        </dependency>
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>spring-boot-starter-swagger</artifactId>
            <version>1.5.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>
    </dependencies>

4.application.yml配置文件

server:
  port: 8080

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    #此处改成自己的数据库连接地址跟账号密码
    url: jdbc:mysql:
    username: root
    password: "root"
mybatis:
  configuration:
    map-underscore-to-camel-case: false
    #此处路径修改为自己包下的路径
  mapper-locations: classpath*:com.wuqiang.mapper/*.xml

 5. pojo层

package com.wuqiang.pojo;

import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.util.List;

@Data
@Accessors(chain = true)
@EqualsAndHashCode
@ApiModel(value = "树表")
public class TreeStructure {

    private Integer id;

    private String code;

    private String name;

    private Integer level;

    private String parentCode;

    private List<TreeStructure> childList;
}

6.TreeStructureMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.wuqiang.mapper.TreeStructureMapper">

    <!-- 查询数据库全部数据 -->
    <select id="selectAll" parameterType="com.wuqiang.pojo.TreeStructure" resultType="com.wuqiang.pojo.TreeStructure">
        select * from area
    </select>

    <!-- 查找共有多少层级 -->
    <select id="selectLevel" resultType="Integer">
        select count(distinct level) from area
    </select>
</mapper>

 7.TreeStructureMapper

@Mapper
public interface TreeStructureMapper {

    public List<TreeStructure> selectAll();

    public Integer selectLevel();
}

8.TreeStructureService

public interface TreeStructureService {
    public List<TreeStructure> selectAll();

    public Integer selectLevel();
}

9.TreeStructureServiceImpl

@Service
public class TreeStructureServiceImpl implements TreeStructureService {

    @Autowired
    public TreeStructureMapper treeStructureMapper;

    @Override
    public List<TreeStructure> selectAll() {
        List<TreeStructure> treeStructureList = treeStructureMapper.selectAll();
        return treeStructureList;
    }

    @Override
    public Integer selectLevel() {
        Integer cengJi = treeStructureMapper.selectLevel();
        return cengJi;
    }

}

10.TreeStructureController

package com.wuqiang.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.wuqiang.pojo.TreeStructure;
import com.wuqiang.service.TreeStructureService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;

@RestController
@Api(value = "树形结构")
public class TreeStructureController {

    @Autowired
    public TreeStructureService service;

    @RequestMapping("/tree")
    public void selectAll(){
        TreeStructure treeStructure = new TreeStructure();
        List<TreeStructure> treeStructureList = service.selectAll();
        System.out.println(treeStructureList);

        //筛选出根类
        for (int i = 0; i < treeStructureList.size(); i++) {
            System.out.println("根类====>" + treeStructureList.get(i).toString());
            if (treeStructureList.get(i).getLevel() == 0) {
                treeStructure = treeStructureList.get(i);
                break;
            }
        }
        //递归
        TreeStructure treeStructure1 = getTreeStructure(treeStructure, 0);
        //转json
        String jsonTreeStructure = JSON.toJSONString(treeStructure1);
        System.out.println(jsonTreeStructure);
        //获取该树表的层级=level的不同值的个数
        int cengJi = service.selectLevel();
        //界面
        jFrame(treeStructure1,cengJi);
    }

    public TreeStructure getTreeStructure(TreeStructure area, Integer parentId) {
        //获取到所有的数据
        List<TreeStructure> areaList = service.selectAll();
        List<TreeStructure> childList = new ArrayList<>();

        //进行子结构设置
        for (int i = 0; i < areaList.size(); i++) {
            if (areaList.get(i).getParentCode().equals(area.getCode())) {
                childList.add(areaList.get(i));
            }
        }
        area.setChildList(childList);
        //中国-省-市-县-镇-村  一共6层 也就是说中国这个父节点的子节点的层级有五层
        int cengJi = service.selectLevel();
        parentId = parentId + 1;
        if (parentId < cengJi) {
            for (int i = 0; i < area.getChildList().size(); i++) {
                getTreeStructure(area.getChildList().get(i), parentId);
            }
        }
        return area;
    }

    public void jFrame(TreeStructure treeStructure, Integer cengJi) {
        JFrame jFrame = new JFrame("树形结构");
        jFrame.setBounds(500, 400, 500, 400);
        JPanel panel = new JPanel(new BorderLayout());
        System.out.println(treeStructure);
        // 创建根节点
        DefaultMutableTreeNode root = new DefaultMutableTreeNode(treeStructure.getName());
        //转为json对象
        JSONObject jsonObject = (JSONObject) JSON.toJSON(treeStructure);
        System.out.println(jsonObject);

        //第一层节点数
        int firstPoint = jsonObject.getJSONArray("childList").size();
        //获取第一层的集合
        List<TreeStructure> first = new ArrayList<TreeStructure>();
        for (int i = 0; i < firstPoint; i++) {
            JSONObject jsonObject1 = jsonObject.getJSONArray("childList").getJSONObject(i);
            TreeStructure treeStructure1 = JSON.toJavaObject(jsonObject1, TreeStructure.class);
            DefaultMutableTreeNode firstTree = new DefaultMutableTreeNode(treeStructure1.getName());
            //创建第一级子节点
            root.add(firstTree);
            tree(treeStructure1,jsonObject1,firstTree);

            System.out.println(first);
        }
        // 使用根节点创建树组件
        JTree tree = new JTree(root);
        // 设置树显示根节点句柄
        tree.setShowsRootHandles(true);
        // 设置树节点可编辑
        tree.setEditable(true);
        // 创建滚动面板,包裹树
        JScrollPane scrollPane = new JScrollPane(tree);
        // 添加滚动面板内容面板
        panel.add(scrollPane, BorderLayout.CENTER);
        jFrame.setContentPane(panel);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jFrame.setVisible(true);
    }

    public void tree(TreeStructure treeStructure1, JSONObject jsonObject1,DefaultMutableTreeNode firstTree){
        if (treeStructure1.getChildList().size() != 0) {
            //第二层节点数
            int secondPoint = treeStructure1.getChildList().size();
            for (int j = 0; j < secondPoint; j++) {
                JSONObject jsonObject = jsonObject1.getJSONArray("childList").getJSONObject(j);
                TreeStructure treeStructure = JSON.toJavaObject(jsonObject, TreeStructure.class);
                DefaultMutableTreeNode tree = new DefaultMutableTreeNode(treeStructure.getName());
                firstTree.add(tree);
                if (treeStructure.getChildList().size() != 0){
                    tree(treeStructure, jsonObject, tree);
                }
            }
        }

    }
}

到此所有代码都写完了,浏览器输入:http://localhost:8080/tree 就会弹出窗口,当然我这里是偷懒直接把图形界面写在接口里头了。controller层的代码注释不是特别多,代码可能有不妥之处还请大佬勿喷,可以自己打断点一步步看。最后运行结果是这样的

springboot动态生成树形结构

试着修改数据库的数据,添加一些节点,运行结果:

springboot动态生成树形结构

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/92933.html

(1)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!