最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot?vue接口測試HutoolUtil?TreeUtil處理樹形結(jié)構(gòu)

 更新時間:2022年05月27日 08:56:33   作者:把蘋果咬哭的測試筆記  
這篇文章主要介紹了springboot?vue接口測試HutoolUtil?TreeUtil處理樹形結(jié)構(gòu),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

基于springboot+vue的測試平臺開發(fā)

繼續(xù)更新

上次完成了接口定義功能的前端頁面,那么后端現(xiàn)在開始逐一實現(xiàn)對應(yīng)的功能,首先就是提供模塊列表接口,這個模塊是支持子層級的,所以大概結(jié)構(gòu)是這樣:

[
  {
    id: 1,
    label: '默認(rèn)',
    children: [
      {
        id: 4,
        label: '二級子模塊1',
        children: [
          {
            id: 9,
            label: '三級子模塊1'
          }, 
          {
            id: 10,
            label: '三級子模塊2'
          }
        ]
      }
    ]
  }, 
  {
    id: 2,
    label: '一級子模塊2',
    children: [
      {
        id: 5,
        label: '二級子模塊 1'
      }, 
      {
        id: 6,
        label: '二級子模塊 2'
      }
    ]
  }
]

通常來說,可以寫遞歸代碼來找出子層級的數(shù)據(jù),然后再進(jìn)行封裝返回出來,比較麻煩。

后來發(fā)現(xiàn) HutoolUtil 中有個工具類 TreeUtil 可以完成我需求,非常便捷,本次就使用它來實現(xiàn)。

下面來完成接口功能的開發(fā)。

一、引用 HutoolUtil

Hutool是一個小而全的Java工具類庫,通過靜態(tài)方法封裝,降低相關(guān)API的學(xué)習(xí)成本,提高工作效率,使Java擁有函數(shù)式語言般的優(yōu)雅,讓Java語言也可以“甜甜的”。

Hutool中的工具方法來自每個用戶的精雕細(xì)琢,它涵蓋了Java開發(fā)底層代碼中的方方面面,它既是大型項目開發(fā)中解決小問題的利器,也是小型項目中的效率擔(dān)當(dāng);

Hutool是項目中“util”包友好的替代,它節(jié)省了開發(fā)人員對項目中公用類和公用工具方法的封裝時間,使開發(fā)專注于業(yè)務(wù),同時可以最大限度的避免封裝不完善帶來的bug。

要使用它直接添加依賴即可:

<!--hutool-->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.7.12</version>
    </dependency>

官方文檔:https://www.hutool.cn/docs/#/

內(nèi)容很詳細(xì),不僅后面的樹結(jié)構(gòu)工具,像常用的集合類、JSON、日志、緩存、文件、線程和并發(fā)等等應(yīng)有盡有。

二、建表

給模塊建一張新表api_module:

CREATE TABLE `api_module` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
  `projectId` bigint NOT NULL COMMENT '該節(jié)點所屬項目id',
  `name` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '節(jié)點名稱',
  `parentId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '父節(jié)點id',
  `level` int DEFAULT '1' COMMENT '節(jié)點層級',
  `createTime` datetime NOT NULL DEFAULT '1900-01-01 00:00:00' COMMENT '創(chuàng)建時間',
  `updateTime` datetime NOT NULL DEFAULT '1900-01-01 00:00:00' COMMENT '更新時間',
  `pos` double DEFAULT NULL COMMENT '節(jié)點順序位置',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模塊表';

重要字段:

projectId:與項目進(jìn)行關(guān)聯(lián)

parentId:該節(jié)點的父節(jié)點,一級目錄的父節(jié)點我會設(shè)置為 0 。

level:該節(jié)點對應(yīng)層級,從 1 開始。

pos:表示該節(jié)點在父節(jié)點下的位置順序。

三、后端接口實現(xiàn)

1. Controller 層

新建 ApiModuleController 類,添加一個處理器方法 getNodeByProjectId,通過項目 ID 查詢出下面的所有模塊。

package com.pingguo.bloomtest.controller;
import com.pingguo.bloomtest.common.Result;
import com.pingguo.bloomtest.service.ApiModuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("module")
public class ApiModuleController {
    @Autowired
    ApiModuleService apiModuleService;
    @GetMapping("/list/{projectId}")
    public Result getNodeByProjectId(@PathVariable Long projectId) {
        return Result.success(apiModuleService.getNodeTreeByProjectId(projectId));
    }
}

2. DAO層

dao 層自然也要有。

package com.pingguo.bloomtest.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.pingguo.bloomtest.pojo.ApiModule;
import org.springframework.stereotype.Repository;
@Repository
public interface ApiModuleDAO extends BaseMapper<ApiModule> {
}

3. Service 層

實現(xiàn) getNodeTreeByProjectId 方法。

public List<Tree<String>> getNodeTreeByProjectId(Long projectId) {
        this.getDefaultNode(projectId);
        // 根據(jù) projectId 查詢所有節(jié)點
        QueryWrapper<ApiModule> wrapperApiModule = new QueryWrapper<>();
        List<ApiModule> apiModules = apiModuleDAO.selectList(wrapperApiModule.eq("projectId", projectId));
        // 配置
        TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
        // 自定義屬性名 ,即返回列表里對象的字段名
        treeNodeConfig.setIdKey("id");
        treeNodeConfig.setWeightKey("pos");
        treeNodeConfig.setParentIdKey("parentId");
        treeNodeConfig.setChildrenKey("children");
        // 最大遞歸深度
//        treeNodeConfig.setDeep(5);
        treeNodeConfig.setNameKey("name");
        //轉(zhuǎn)換器
        List<Tree<String>> treeNodes = TreeUtil.build(apiModules, "0", treeNodeConfig,
                (treeNode, tree) -> {
                    tree.setId(treeNode.getId().toString());
                    tree.setParentId(treeNode.getParentId().toString());
                    tree.setWeight(treeNode.getPos());
                    tree.setName(treeNode.getName());
                    // 擴展屬性 ...
                    tree.putExtra("projectId", treeNode.getProjectId());
                    tree.putExtra("level", treeNode.getLevel());
                    tree.putExtra("label", treeNode.getName());
                    tree.putExtra("createTime", treeNode.getCreateTime());
                    tree.putExtra("updateTime", treeNode.getUpdateTime());
                });
        return treeNodes;
    }

這里開頭有個方法 getDefaultNode,在這里面會判斷當(dāng)前項目下是否有默認(rèn)模塊,沒有則添加默認(rèn)模塊。

private void getDefaultNode(Long projectId) {
        QueryWrapper<ApiModule> wrapperApiModule = new QueryWrapper<>();
        wrapperApiModule.eq("projectId", projectId)
                        .eq("pos", 1.0);
        // 判斷當(dāng)前項目下是否有默認(rèn)模塊,沒有則添加默認(rèn)模塊
        if (apiModuleDAO.selectCount(wrapperApiModule) == 0) {
            ApiModule apiModule = new ApiModule();
            apiModule.setName("默認(rèn)");
            apiModule.setPos(1.0);
            apiModule.setLevel(1);
            apiModule.setParentId(0L);
            apiModule.setCreateTime(new Date());
            apiModule.setUpdateTime(new Date());
            apiModule.setProjectId(projectId);
            apiModuleDAO.insert(apiModule);
        }
    }

然后通過 項目id 把項目下所有的數(shù)據(jù)查詢出來:

接下來使用 TreeUtil 來完成樹結(jié)構(gòu)處理。

首先,創(chuàng)建一個配置類 TreeNodeConfig 對象,在這個對象里設(shè)置屬性,對應(yīng)的就是返回出來的字段名。

還可以設(shè)置最大遞歸深度,也可以不設(shè)。我測試之后就注釋掉了,先不加限制。

最后就是構(gòu)建樹結(jié)構(gòu) treeNodes,完成處理后返回給 controller 層。

因為我要返回的還有其他的字段,可以使用tree.putExtra來添加要返回的其他字段,比如:

tree.putExtra("projectId", treeNode.getProjectId());

第一個參數(shù)是定義的字段名稱,第二個參數(shù)就是使用這個結(jié)點的 get 方法獲取對應(yīng)的屬性值。

最后返回到上層的是List<Tree<String>>類型,可以直接塞到統(tǒng)一結(jié)果里去返回。

四、測試一下

1. 測試結(jié)構(gòu)數(shù)據(jù)

測試一下接口,先手動網(wǎng)表里插入了對應(yīng)結(jié)構(gòu)的數(shù)據(jù)。

請求接口,傳入 projectId 為 3。

{
    "code": 20000,
    "message": "成功",
    "data": [
        {
            "id": "9",
            "parentId": "0",
            "pos": 1.0,
            "name": "默認(rèn)",
            "projectId": 3,
            "level": 1,
            "label": "默認(rèn)",
            "createTime": "2021-09-29 10:50:00",
            "updateTime": "2021-09-29 10:50:00",
            "children": [
                {
                    "id": "14",
                    "parentId": "9",
                    "pos": 1.0,
                    "name": "默認(rèn)-2",
                    "projectId": 3,
                    "level": 2,
                    "label": "默認(rèn)-2",
                    "createTime": "1900-01-01 08:00:00",
                    "updateTime": "1900-01-01 08:00:00"
                },
                {
                    "id": "10",
                    "parentId": "9",
                    "pos": 1.0,
                    "name": "默認(rèn)-1",
                    "projectId": 3,
                    "level": 2,
                    "label": "默認(rèn)-1",
                    "createTime": "2021-10-01 08:00:00",
                    "updateTime": "1900-01-01 08:00:00",
                    "children": [
                        {
                            "id": "11",
                            "parentId": "10",
                            "pos": 1.0,
                            "name": "默認(rèn)-1-1",
                            "projectId": 3,
                            "level": 3,
                            "label": "默認(rèn)-1-1",
                            "createTime": "1900-01-01 08:00:00",
                            "updateTime": "1900-01-01 08:00:00",
                            "children": [
                                {
                                    "id": "12",
                                    "parentId": "11",
                                    "pos": 1.0,
                                    "name": "默認(rèn)-1-1-1",
                                    "projectId": 3,
                                    "level": 4,
                                    "label": "默認(rèn)-1-1-1",
                                    "createTime": "1900-01-01 08:00:00",
                                    "updateTime": "1900-01-01 08:00:00",
                                    "children": [
                                        {
                                            "id": "13",
                                            "parentId": "12",
                                            "pos": 1.0,
                                            "name": "默認(rèn)-1-1-1-1",
                                            "projectId": 3,
                                            "level": 5,
                                            "label": "默認(rèn)-1-1-1-1",
                                            "createTime": "1900-01-01 08:00:00",
                                            "updateTime": "1900-01-01 08:00:00"
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

結(jié)果正確。

2. 測試新增默認(rèn)

傳入一個 projectId 為 4 ,localhost:8080/bloomtest/module/list/4:

{
    "code": 20000,
    "message": "成功",
    "data": [
        {
            "id": "15",
            "parentId": "0",
            "pos": 1.0,
            "name": "默認(rèn)",
            "projectId": 4,
            "level": 1,
            "label": "默認(rèn)",
            "createTime": "2021-10-01 12:25:54",
            "updateTime": "2021-10-01 12:25:54"
        }
    ]
}

返回正確。

落庫正常。

以上就是springboot vue接口測試HutoolUtil TreeUtil處理樹形結(jié)構(gòu)的詳細(xì)內(nèi)容,更多關(guān)于HutoolUtil TreeUtil處理樹形結(jié)構(gòu)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java Swing編寫一個簡單的計算器軟件

    Java Swing編寫一個簡單的計算器軟件

    大家好,本篇文章主要講的是Java Swing編寫一個簡單的計算器軟件,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • java求余的技巧匯總

    java求余的技巧匯總

    這篇文章主要給大家介紹了關(guān)于java求余技巧的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Maven pom的distributionManagement配置方式

    Maven pom的distributionManagement配置方式

    文章主要介紹了Maven的distributionManagement配置方式,以及它的作用、配置方法和重要性,distributionManagement用于指定構(gòu)件的發(fā)布位置,包括下載URL、狀態(tài)等,文章還詳細(xì)解釋了如何配置repository和snapshotRepository,以及它們的用途和區(qū)別
    2025-01-01
  • SpringBoot開發(fā)項目,引入JPA找不到findOne方法的解決

    SpringBoot開發(fā)項目,引入JPA找不到findOne方法的解決

    這篇文章主要介紹了SpringBoot開發(fā)項目,引入JPA找不到findOne方法的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java 高并發(fā)中volatile的實現(xiàn)原理

    java 高并發(fā)中volatile的實現(xiàn)原理

    這篇文章主要介紹了java 高并發(fā)中volatile的實現(xiàn)原理的相關(guān)資料,在多線程并發(fā)編程中synchronized和Volatile都扮演著重要的角色,Volatile是輕量級的synchronized,它在多處理器開發(fā)中保證了共享變量的“可見性”,需要的朋友可以參考下
    2017-03-03
  • MyBatis綁定錯誤提示BindingException:Invalid bound statement (not found)的解決方法

    MyBatis綁定錯誤提示BindingException:Invalid bound statement (not f

    這篇文章主要介紹了MyBatis綁定錯誤提示BindingException:Invalid bound statement (not found)的解決辦法,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧
    2017-01-01
  • Java中多種循環(huán)Map的常見方式詳解

    Java中多種循環(huán)Map的常見方式詳解

    Java中的Map是一種鍵值對存儲的數(shù)據(jù)結(jié)構(gòu),其中每個鍵都唯一,與一個值相關(guān)聯(lián),下面這篇文章主要給大家介紹了關(guān)于Java中多種循環(huán)Map的常見方式,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2024-01-01
  • Java枚舉與注解的創(chuàng)建步驟

    Java枚舉與注解的創(chuàng)建步驟

    這篇文章通過抽象的概念和具體實現(xiàn)步驟,充分說明了java枚舉與注解的概念和使用方法,通過該篇文章你可以學(xué)會如何自定義枚舉類和了解部分Java內(nèi)置注解,希望對你有所幫助
    2021-06-06
  • java使用jdbc操作數(shù)據(jù)庫示例分享

    java使用jdbc操作數(shù)據(jù)庫示例分享

    這篇文章主要介紹了java使用jdbc操作數(shù)據(jù)庫示例,需要的朋友可以參考下
    2014-03-03
  • 詳解Java如何實現(xiàn)基于Redis的分布式鎖

    詳解Java如何實現(xiàn)基于Redis的分布式鎖

    在不同進(jìn)程需要互斥地訪問共享資源時,分布式鎖是一種非常有用的技術(shù)手段。這篇文章運用圖文和實例代碼介紹了Java如何實現(xiàn)基于Redis的分布式鎖,文章介紹的很詳細(xì),對Java和Redis剛興趣的朋友們可以參考借鑒,下面來一起看看。
    2016-08-08

最新評論

哈密市| 赞皇县| 安丘市| 阿拉善盟| 读书| 新安县| 湄潭县| 三河市| 平和县| 龙口市| 隆安县| 宜良县| 霍城县| 于田县| 岫岩| 庆阳市| 鄂尔多斯市| 措美县| 确山县| 金沙县| 富民县| 奉节县| 龙门县| 襄城县| 繁昌县| 稻城县| 天峨县| 灵宝市| 海伦市| 镇巴县| 凉山| 瑞金市| 河间市| 林芝县| 福建省| 玉屏| 信宜市| 嘉定区| 阿拉尔市| 北川| 石门县|