Java接口返回省市區(qū)樹形結(jié)構(gòu)的實(shí)現(xiàn)
前言
最近和前端聯(lián)調(diào)接口,需要進(jìn)行一個(gè)省市區(qū)聯(lián)動(dòng),最終定的方案是通過接口返回一個(gè)樹形結(jié)構(gòu)給前端,類似這樣的結(jié)構(gòu):
下面就把相關(guān)表和代碼分享給大家
設(shè)計(jì)表結(jié)構(gòu)
表結(jié)構(gòu)已經(jīng)準(zhǔn)備好了,直接執(zhí)行即可。
由于數(shù)據(jù)量較大,這里放不下,需要的伙伴們可以私聊我
CREATE TABLE `sys_region` ( `id` int(19) NOT NULL AUTO_INCREMENT COMMENT 'id', `pid` int(19) NULL DEFAULT NULL COMMENT '上級(jí)ID,一級(jí)為0', `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名稱', `tree_level` int(3) NULL DEFAULT NULL COMMENT '層級(jí)', `leaf` int(3) NULL DEFAULT NULL COMMENT '是否葉子節(jié)點(diǎn) 0:否 1:是', `sort` int(19) NULL DEFAULT NULL COMMENT '排序', `create_by` varchar(19) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '創(chuàng)建者', `create_time` datetime(0) NULL DEFAULT NULL COMMENT '創(chuàng)建時(shí)間', `update_by` varchar(19) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者', `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新時(shí)間', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 820202 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '行政區(qū)域' ROW_FORMAT = Dynamic;
Java代碼
下面分享Java相關(guān)的代碼
entity
實(shí)體就是這個(gè)表的屬性,這里最后一個(gè)屬性childList就是用來存放子列表的,可以先建一個(gè)VO,我直接寫在實(shí)體里面了。
package org.jeecg.modules.entity; import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.util.Date; import java.math.BigDecimal; import java.util.List; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat; import org.jeecgframework.poi.excel.annotation.Excel; import org.jeecg.common.aspect.annotation.Dict; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** * @Description: 行政區(qū)域?qū)嶓w * @Author:wyh * @Date: 2021-04-06 */ @Data @TableName("sys_region") @Accessors(chain = true) @EqualsAndHashCode(callSuper = false) @ApiModel(value = "sys_region對(duì)象", description = "行政區(qū)域") public class SysRegion implements Serializable { private static final long serialVersionUID = 1L; /** * id */ @TableId(type = IdType.ASSIGN_ID) @ApiModelProperty(value = "id") private Integer id; /** * 上級(jí)ID,一級(jí)為0 */ @Excel(name = "上級(jí)ID,一級(jí)為0", width = 15) @ApiModelProperty(value = "上級(jí)ID,一級(jí)為0") private Integer pid; /** * 名稱 */ @Excel(name = "名稱", width = 15) @ApiModelProperty(value = "名稱") private String name; /** * 層級(jí) */ @Excel(name = "層級(jí)", width = 15) @ApiModelProperty(value = "層級(jí)") private Integer treeLevel; /** * 是否葉子節(jié)點(diǎn) 0:否 1:是 */ @Excel(name = "是否葉子節(jié)點(diǎn) 0:否 1:是", width = 15) @ApiModelProperty(value = "是否葉子節(jié)點(diǎn) 0:否 1:是") private Integer leaf; /** * 排序 */ @Excel(name = "排序", width = 15) @ApiModelProperty(value = "排序") private Integer sort; /** * 創(chuàng)建者 */ @ApiModelProperty(value = "創(chuàng)建者") private String createBy; /** * 創(chuàng)建時(shí)間 */ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "創(chuàng)建時(shí)間") private Date createTime; /** * 更新者 */ @ApiModelProperty(value = "更新者") private String updateBy; /** * 更新時(shí)間 */ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "更新時(shí)間") private Date updateTime; /** * 子列表 */ @TableField(exist = false) //表示這個(gè)屬性不屬于表中的字段 private List<SysRegion> childList; }
service
/** * @Author wyh * @Description 查詢所有省級(jí)區(qū)域以樹形式展示關(guān)系 * @Date 10:00 2022/12/27 **/ List<SysRegion> queryAllProvinceTree();
serviceImpl
@Override public List<SysRegion> queryAllProvinceTree() { // 獲取全部區(qū)域 List<SysRegion> list = this.query().list(); // 省區(qū)域 List<SysRegion> provinceListOneLevelRegion = list.stream().filter(item -> item.getPid().intValue()==0).collect(Collectors.toList()); //遍歷一級(jí)地區(qū) provinceListOneLevelRegion.stream().forEach(oneItem -> { //獲得二級(jí) List<SysRegion> twoLevelRegion = list.stream().filter(twoItem -> twoItem.getPid().intValue() == oneItem.getId().intValue()) .collect(Collectors.toList()); //遍歷二級(jí) twoLevelRegion.stream().forEach(twoItem -> { //獲得三級(jí) List<SysRegion> threeLevelRegion = list.stream().filter(threeItem -> threeItem.getPid().intValue() == twoItem.getId().intValue()) .collect(Collectors.toList()); twoItem.setChildList(threeLevelRegion); }); oneItem.setChildList(twoLevelRegion); } ); // 最終的樹形結(jié)構(gòu)列表 return provinceListOneLevelRegion; }
controller
/** * 查詢所有省級(jí)區(qū)域以樹形式展示關(guān)系 * * @return */ @ApiOperation(value = "行政區(qū)域-查詢所有省級(jí)區(qū)域以樹形式展示關(guān)系", notes = "行政區(qū)域-查詢所有省級(jí)區(qū)域以樹形式展示關(guān)系") @GetMapping(value = "/queryAllProvinceTree") public Result<?> queryAllProvinceTree() { return Result.OK(SysRegionService.queryAllProvinceTree()); }
調(diào)用接口查看結(jié)果
以上代碼寫完之后,就可以調(diào)用接口了,返回格式如下:
到此這篇關(guān)于Java接口返回省市區(qū)樹形結(jié)構(gòu)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java 返回樹形結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java遞歸遍歷樹形結(jié)構(gòu)的實(shí)現(xiàn)代碼
- 使用遞歸刪除樹形結(jié)構(gòu)的所有子節(jié)點(diǎn)(java和mysql實(shí)現(xiàn))
- Java創(chuàng)建樹形結(jié)構(gòu)算法實(shí)例代碼
- java實(shí)現(xiàn)省市區(qū)轉(zhuǎn)換成樹形結(jié)構(gòu)
- Java實(shí)現(xiàn)樹形結(jié)構(gòu)的示例代碼
- Java數(shù)據(jù)封裝樹形結(jié)構(gòu)代碼實(shí)例
- java轉(zhuǎn)樹形結(jié)構(gòu)工具類詳解
- 使用遞歸算法結(jié)合數(shù)據(jù)庫解析成Java樹形結(jié)構(gòu)的代碼解析
- 詳解Java遞歸實(shí)現(xiàn)樹形結(jié)構(gòu)的兩種方式
相關(guān)文章
如何通過一張圖搞懂springBoot自動(dòng)注入原理
這篇文章主要給大家介紹了關(guān)于如何通過一張圖搞懂springBoot自動(dòng)注入原理的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02fastjson全局日期序列化設(shè)置導(dǎo)致JSONField失效問題解決方案
這篇文章主要介紹了fastjson通過代碼指定全局序列化返回時(shí)間格式,導(dǎo)致使用JSONField注解標(biāo)注屬性的特殊日期返回格式失效問題的解決方案2023-01-01SpringBoot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)
這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04MyBatis特殊字符轉(zhuǎn)義攔截器問題針對(duì)(_、\、%)
這篇文章主要介紹了MyBatis特殊字符轉(zhuǎn)義攔截器問題針對(duì)(_、\、%),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02java8快速實(shí)現(xiàn)List轉(zhuǎn)map 、分組、過濾等操作
這篇文章主要介紹了java8快速實(shí)現(xiàn)List轉(zhuǎn)map 、分組、過濾等操作,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09spring?boot自動(dòng)裝配之@ComponentScan注解用法詳解
@ComponentScan的作用就是根據(jù)定義的掃描路徑,把符合掃描規(guī)則的類裝配到spring容器中,下面這篇文章主要給大家介紹了關(guān)于spring?boot自動(dòng)裝配之@ComponentScan注解用法的相關(guān)資料,需要的朋友可以參考下2023-04-04