实际开发中用到了对数据库数据进行查询获取到树型数据结构。这里在网上查询后进行了记录:
实体类如下:
主要有用信息为当前组织ID,父组织pid.
/**
* @program: cloud-service
* @description: 用户和设备组织
* @author: Mr.lxq
* @create: 2019-06-17 14:34
**/
@Data
@Accessors(chain = true)
@Entity
@Table( name ="sys_organization")
public class Organization implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 父组织id
*/
private Long pid;
/**
* 组织名称
*/
@Column(length = 100,unique = true)
private String organizationName ="";
/**
* 组织描述
*/
@Column(length = 255)
private String organizationDescription;
/**
* 排序字段
*/
private Long orderColumn;
/**
* 负责人
*/
@Column(length = 100)
private String leader;
/**
* 联系电话
*/
@Column(length = 100)
private String phone;
/**
* 邮箱
*/
@Column(length = 100)
private String email ="";
/**
* 部门状态
* 1 启用,0停用
*/
private int status = 1;
/**
* 部门所在省
*/
@Column(length = 20)
private String province;
/**
* 部门所在市
*/
@Column(length = 20)
private String city;
/**
* 部门所在区县
*/
@Column(length = 100)
private String area;
/**
* 部门详细地址
*/
@Column(length = 100)
private String detailAddress;
/**
* 创建者
*/
@Column(length = 20)
private String createPeople;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
@Column(columnDefinition = "timestamp default current_timestamp ")
private Date createTime;
/**
* 更新者
*/
@Column(length = 20)
private String updatePeople;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
@Column(columnDefinition = "timestamp default current_timestamp ")
private Date updateTime;
}
进行递归操作:
这里数据进行递归操作以后结合layUI在前端进行渲染。
@GetMapping("/TreeAll")
public String findTreeAll() {
List<Organization> all = organizationService.findAll();
List<OrganzationTree> list = new ArrayList<>();
HashMap<String, Organization> map = new HashMap<>();
for (Organization o:all){
map.put(o.getId()+"",o);
}
JSONArray jsonArray = new JSONArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("title","root");
jsonObject.put("id",0);
jsonObject.put("spread",true);
jsonObject.put("children",getNodeJson(0L,map));
jsonArray.add(jsonObject);
log.error(jsonArray.toJSONString());
return jsonArray.toJSONString();
}
/**
* 递归处理 数据库树结构数据->树形json
* @param nodeId
* @param nodes
* @return
*/
public static JSONArray getNodeJson(Long nodeId, Map<String,Organization> nodes){
//当前层级当前node对象
Organization cur = nodes.get(nodeId);
//当前层级当前点下的所有子节点(实战中不要慢慢去查,一次加载到集合然后慢慢处理)
List<Organization> childList = getChildNodes(nodeId,nodes);
JSONArray childTree = new JSONArray();
for (Organization node : childList) {
JSONObject o = new JSONObject();
o.put("title", node.getOrganizationName());
o.put("id", node.getId());
//递归调用该方法
JSONArray childs = getNodeJson(node.getId(),nodes);
if(!childs.isEmpty()) {
o.put("children",childs);
}
childTree.fluentAdd(o);
}
return childTree;
}
/**
* 获取当前节点的所有子节点
* @param nodeId
* @param nodes
* @return
*/
public static List<Organization> getChildNodes(Long nodeId, Map<String,Organization> nodes){
List<Organization> list = new ArrayList<>();
for (String key : nodes.keySet() ) {
if(nodes.get(key).getPid().equals(nodeId)){
list.add(nodes.get(key));
}
}
return list;
}
获得到的数据如下:
其中jsonArray 的key是lauUI要求的。
id : 唯一标识
title :显示名称
spread : 是否展开,默认在这里第一层展开。。。
[{
"children": [{
"children": [{
"children": [{
"id": 12,
"title": "郑东新区组织"
}, {
"id": 6,
"title": "金水组织"
}],
"id": 4,
"title": "郑州组织"
}],
"id": 3,
"title": "河南"
}, {
"children": [{
"id": 10,
"title": "朝阳组织"
}],
"id": 9,
"title": "北京"
}],
"id": 0,
"title": "root",
"spread": true
}]