springboot?vue接口測試HutoolUtil?TreeUtil處理樹形結構
基于springboot+vue的測試平臺開發(fā)
繼續(xù)更新
上次完成了接口定義功能的前端頁面,那么后端現在開始逐一實現對應的功能,首先就是提供模塊列表接口,這個模塊是支持子層級的,所以大概結構是這樣:
[
{
id: 1,
label: '默認',
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'
}
]
}
]通常來說,可以寫遞歸代碼來找出子層級的數據,然后再進行封裝返回出來,比較麻煩。
后來發(fā)現 HutoolUtil 中有個工具類 TreeUtil 可以完成我需求,非常便捷,本次就使用它來實現。
下面來完成接口功能的開發(fā)。
一、引用 HutoolUtil
Hutool是一個小而全的Java工具類庫,通過靜態(tài)方法封裝,降低相關API的學習成本,提高工作效率,使Java擁有函數式語言般的優(yōu)雅,讓Java語言也可以“甜甜的”。
Hutool中的工具方法來自每個用戶的精雕細琢,它涵蓋了Java開發(fā)底層代碼中的方方面面,它既是大型項目開發(fā)中解決小問題的利器,也是小型項目中的效率擔當;
Hutool是項目中“util”包友好的替代,它節(jié)省了開發(fā)人員對項目中公用類和公用工具方法的封裝時間,使開發(fā)專注于業(yè)務,同時可以最大限度的避免封裝不完善帶來的bug。
要使用它直接添加依賴即可:
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.12</version>
</dependency>官方文檔:https://www.hutool.cn/docs/#/
內容很詳細,不僅后面的樹結構工具,像常用的集合類、JSON、日志、緩存、文件、線程和并發(fā)等等應有盡有。
二、建表
給模塊建一張新表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:與項目進行關聯
parentId:該節(jié)點的父節(jié)點,一級目錄的父節(jié)點我會設置為 0 。
level:該節(jié)點對應層級,從 1 開始。
pos:表示該節(jié)點在父節(jié)點下的位置順序。
三、后端接口實現
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 層
實現 getNodeTreeByProjectId 方法。
public List<Tree<String>> getNodeTreeByProjectId(Long projectId) {
this.getDefaultNode(projectId);
// 根據 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");
//轉換器
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,在這里面會判斷當前項目下是否有默認模塊,沒有則添加默認模塊。
private void getDefaultNode(Long projectId) {
QueryWrapper<ApiModule> wrapperApiModule = new QueryWrapper<>();
wrapperApiModule.eq("projectId", projectId)
.eq("pos", 1.0);
// 判斷當前項目下是否有默認模塊,沒有則添加默認模塊
if (apiModuleDAO.selectCount(wrapperApiModule) == 0) {
ApiModule apiModule = new ApiModule();
apiModule.setName("默認");
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 把項目下所有的數據查詢出來:

接下來使用 TreeUtil 來完成樹結構處理。
首先,創(chuàng)建一個配置類 TreeNodeConfig 對象,在這個對象里設置屬性,對應的就是返回出來的字段名。

還可以設置最大遞歸深度,也可以不設。我測試之后就注釋掉了,先不加限制。
最后就是構建樹結構 treeNodes,完成處理后返回給 controller 層。

因為我要返回的還有其他的字段,可以使用tree.putExtra來添加要返回的其他字段,比如:
tree.putExtra("projectId", treeNode.getProjectId());第一個參數是定義的字段名稱,第二個參數就是使用這個結點的 get 方法獲取對應的屬性值。
最后返回到上層的是List<Tree<String>>類型,可以直接塞到統(tǒng)一結果里去返回。

四、測試一下
1. 測試結構數據
測試一下接口,先手動網表里插入了對應結構的數據。

請求接口,傳入 projectId 為 3。
{
"code": 20000,
"message": "成功",
"data": [
{
"id": "9",
"parentId": "0",
"pos": 1.0,
"name": "默認",
"projectId": 3,
"level": 1,
"label": "默認",
"createTime": "2021-09-29 10:50:00",
"updateTime": "2021-09-29 10:50:00",
"children": [
{
"id": "14",
"parentId": "9",
"pos": 1.0,
"name": "默認-2",
"projectId": 3,
"level": 2,
"label": "默認-2",
"createTime": "1900-01-01 08:00:00",
"updateTime": "1900-01-01 08:00:00"
},
{
"id": "10",
"parentId": "9",
"pos": 1.0,
"name": "默認-1",
"projectId": 3,
"level": 2,
"label": "默認-1",
"createTime": "2021-10-01 08:00:00",
"updateTime": "1900-01-01 08:00:00",
"children": [
{
"id": "11",
"parentId": "10",
"pos": 1.0,
"name": "默認-1-1",
"projectId": 3,
"level": 3,
"label": "默認-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": "默認-1-1-1",
"projectId": 3,
"level": 4,
"label": "默認-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": "默認-1-1-1-1",
"projectId": 3,
"level": 5,
"label": "默認-1-1-1-1",
"createTime": "1900-01-01 08:00:00",
"updateTime": "1900-01-01 08:00:00"
}
]
}
]
}
]
}
]
}
]
}結果正確。
2. 測試新增默認
傳入一個 projectId 為 4 ,localhost:8080/bloomtest/module/list/4:
{
"code": 20000,
"message": "成功",
"data": [
{
"id": "15",
"parentId": "0",
"pos": 1.0,
"name": "默認",
"projectId": 4,
"level": 1,
"label": "默認",
"createTime": "2021-10-01 12:25:54",
"updateTime": "2021-10-01 12:25:54"
}
]
}返回正確。

落庫正常。
以上就是springboot vue接口測試HutoolUtil TreeUtil處理樹形結構的詳細內容,更多關于HutoolUtil TreeUtil處理樹形結構的資料請關注腳本之家其它相關文章!
- SpringBoot如何獲取Get請求參數詳解
- springBoot 過濾器去除請求參數前后空格實例詳解
- SpringBoot通過JSON傳遞請求參數的實例詳解
- springboot如何設置請求參數長度和文件大小限制
- SpringBoot常見get/post請求參數處理、參數注解校驗及參數自定義注解校驗詳解
- SpringBoot之自定義Filter獲取請求參數與響應結果案例詳解
- springboot?vue接口測試前后端實現模塊樹列表功能
- springboot?vue接口測試前后端樹節(jié)點編輯刪除功能
- springboot?vue接口測試前端動態(tài)增刪表單功能實現
- springboot3請求參數種類及接口測試案例小結
相關文章
Java Swing實現餐廳點餐系統(tǒng)源碼(收藏版)
這篇文章主要介紹了Java Swing實現餐廳點餐系統(tǒng)源碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02

