数据库
名称 | 类型 | 可为空 | 默认 | 存储 | 注释 |
ID | NUMBER(20) | N | 省市区编号 | ||
FATHERID | NUMBER | N | 父编号 | ||
CITYNAME | VARCHAR2(100) | Y | 省市区名称 | ||
AREACODE | VARCHAR2(20) | Y | 长途电话区号(市一级) | ||
POSTCODE | VARCHAR2(20) | Y | 邮编(区、县一级) | ||
ABBCODE | VARCHAR2(20) | Y | 省、市、县简拼 | ||
STATUS | NUMBER | N | 0 | 当前状态(0可用,1不可用) | |
READ_FLAG | NUMBER(1) | N | 0 | WEB同步状态 |
实体
请求实体
import io.openflat.core.doc.DataType;
import io.openflat.core.doc.annotation.ApiDocField;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Setter
@Getter
public class BCityReq {
@ApiDocField(description = "省市区编号",dataType = DataType.INT)
private Integer id;
@ApiDocField(description = "父编号",dataType = DataType.INT)
private Integer fatherId;
@ApiDocField(description = "省市区名称",dataType = DataType.STRING)
private String cityName;
@ApiDocField(description = "省市区名称,和cityName值相同,用于前台显示",dataType = DataType.STRING)
private String title;
@ApiDocField(description = "当前状态(0可用,1不可用)",dataType = DataType.INT)
private Integer status;
@ApiDocField(description = "子类")
private List<BCityReq> children;
}
响应实体
import io.openflat.core.doc.DataType;
import io.openflat.core.doc.annotation.ApiDocField;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Setter
@Getter
public class BCityRes {
@ApiDocField(description = "省市区编号",dataType = DataType.INT)
private Integer id;
@ApiDocField(description = "父编号",dataType = DataType.INT)
private Integer fatherId;
@ApiDocField(description = "省市区名称",dataType = DataType.STRING)
private String cityName;
@ApiDocField(description = "省市区名称,和cityName值相同,用于前台显示",dataType = DataType.STRING)
private String title;
@ApiDocField(description = "当前状态(0可用,1不可用)",dataType = DataType.INT)
private Integer status;
@ApiDocField(description = "子类")
private List<BCityRes> children;
}
dao
<sql id="bCityColumns">
a.id AS "id", <!--主键,省市区编号-->
a.fatherid AS "fatherId", <!--父编号-->
a.cityname AS "cityName", <!--省市区名称-->
a.status AS "status" <!--当前状态,0可用1不可用-->
</sql>
<!--public List<BCityRes> findByCityName(String cityName);-->
<select id="findByCityName" resultType="io.storage.bcity.res.BCityRes">
SELECT
<include refid="bCityColumns"/>
FROM B_CITY a
</select>
service
/**
* 返回数据编辑成树结构
* parentId为0则代表为顶级目录,没有父级元素。
* 1、遍历元素,将所有不为顶级目录的元素add进他们父级的childrenList中
* 2、这样所有的元素都放到了他们的父级元素中
* 3、再删除所有不为顶级目录的元素就ok了
* @param treeNodes
* @return
*/
@Override
public List<BCityRes> bulidTree(List<BCityRes> treeNodes) {
//遍历list
for (BCityRes treeNode : treeNodes) {
//如果元素不是顶级目录
if(treeNode.getFatherId() != null && treeNode.getFatherId() != 0){
//再次遍历List
for (BCityRes node : treeNodes) {
//在整个list中查找元素的父级
if(treeNode.getFatherId().equals(node.getId())){
//将元素放入父级中
if(node.getChildren() == null){
node.setChildren(new ArrayList<BCityRes>());
}
node.getChildren().add(treeNode);
}
}
}
}
//删除所有不为顶级目录的元素
treeNodes.removeIf(treeNode ->treeNode.getFatherId() != null && treeNode.getFatherId() != 0);
System.out.println("树结构的长度为:" + treeNodes.size());
return treeNodes;
}
controller
/**
* 获取行政区域的树结构
* @return
*/
@Api(name = "bCity.treeData",wrapResult = false,version = "2.0")
@ApiDocMethod(description = "行政区域的树形结构,在页面显示省市区名称")
public ApiResult treeData(BCityReq req){
// public ApiResult treeData(@RequestParam("cityName") String cityName){
//根据cityName进行模糊查询,返回List
List<BCityRes> list = service.listObjsByCityName(req.getCityName());
//将查询到的List转换成树形结构
List<BCityRes> tree = service.bulidTree(list);
if(tree != null && tree.size() > 0){
return ResponseUtils.getData(tree,"行政区域的树形结构");
}else {
return ResponseUtils.getFail("行政区域的树形结构不存在");
}
}
结果
{
"code":"0",
"data":[
{
"children":[
{
"children":[
{
"children":null,
"cityName":"和平区",
"fatherId":33,
"id":391,
"status":0
},
{
"children":null,
"cityName":"河东区",
"fatherId":33,
"id":392,
"status":0
},
。。。。。。。。。。。。。。。。
{
"children":null,
"cityName":"丰镇市",
"fatherId":33,
"id":797,
"status":0
}
],
"cityName":"天津市",
"fatherId":2,
"id":33,
"status":0
}
],
"cityName":"天津",
"fatherId":0,
"id":2,
"status":0
},
{
"children":[
{
"children":[
{
"children":null,
"cityName":"长安区",
"fatherId":34,
"id":413,
。。。。。。。。。。。。。。。。。
或者使用list转树的工具类
public class TreeUtils {
public static <T extends TreeNode> List<T> buildTreeNodes(List<T> listTreeNode, Long parentId) {
List<T> distinctList = listTreeNode.stream().distinct().collect(Collectors.toList());
List<T> listTreeNode_ = new ArrayList<>();
for (T node : distinctList) {
if (node.getParentId().equals(parentId)) {
listTreeNode_.add(node);
}
}
recursionMenuTree(listTreeNode, listTreeNode_);
return listTreeNode_;
}
private static void recursionMenuTree(List<? extends TreeNode> listTreeNode, List<? extends TreeNode> listSubTreeNode) {
for (TreeNode subNode : listSubTreeNode) {
for (TreeNode node : listTreeNode) {
if (subNode.getId().equals(node.getParentId())) {
if (CollectionUtils.isEmpty(subNode.getChildren())) {
subNode.setChildren(new ArrayList<>());
}
if (subNode.getChildren().contains(node)) {
continue;
}
subNode.getChildren().add(node);
recursionMenuTree(listTreeNode, subNode.getChildren());
}
}
}
}
}
实体
public class TreeNode {
protected Long id;
@ApiModelProperty("父级节点")
protected Long parentId;
public List<TreeNode> children;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getParentId() {
return parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
public List<TreeNode> getChildren() {
return children;
}
public void setChildren(List<TreeNode> children) {
this.children = children;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TreeNode treeNode = (TreeNode) o;
return id != null ? id.equals(treeNode.id) : treeNode.id == null;
}
@Override
public int hashCode() {
return id != null ? id.hashCode() : 0;
}
}