d
表结构:
dept_id | parent_id | ancestors | dept_name | order_num(排序) | status(状态) | …… |
---|---|---|---|---|---|---|
11 | 0 | 0 | 根 | 0 | 0 | |
22 | 11 | 0,11 | 测试1 | 1 | 0 | |
33 | 11 | 0,11 | 测试2 | 2 | 0 | |
44 | 22 | 1,11,22 | 测试1-1 | 1 | 0 |
后端写法:
/**
* 构建前端所需要下拉树结构
*
* @param depts 部门列表
* @return 下拉树结构列表
*/
public List<TreeSelect> buildDeptTreeSelect(List<Dept> depts){
List<Dept> deptTrees = buildDeptTree(depts);
return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
}
/**
* 构建前端所需要树结构
*
* @param depts 部门列表
* @return 树结构列表
*/
@Override
public List<Dept> buildDeptTree(List<Dept> depts){
List<Dept> returnList = new ArrayList<Dept>();
List<String> tempList = new ArrayList<String>();
for (Dept dept : depts){
tempList.add(dept.getDeptId());
}
for (Iterator<Dept> iterator = depts.iterator(); iterator.hasNext();){
Dept dept = (Dept) iterator.next();
// 如果是顶级节点, 遍历该父节点的所有子节点
if (!tempList.contains(dept.getParentId())){
recursionFn(depts, dept);
returnList.add(dept);
}
}
if (returnList.isEmpty()){
returnList = depts;
}
return returnList;
}
/**
* 递归列表
*/
private void recursionFn(List<Dept> list, Dept t){
// 得到子节点列表
List<Dept> childList = getChildList(list, t);
t.setChildren(childList);
for (Dept tChild : childList){
if (hasChild(list, tChild)){
recursionFn(list, tChild);
}
}
}
/**
* 得到子节点列表
*/
private List<Dept> getChildList(List<Dept> list, Dept t){
List<Dept> tlist = new ArrayList<Dept>();
Iterator<Dept> it = list.iterator();
while (it.hasNext()){
Dept n = (Dept) it.next();
if (StringUtils.isNotNull(n.getParentId())
&& n.getParentId().longValue() == t.getDeptId().longValue()){
tlist.add(n);
}
}
return tlist;
}
/**
* 判断是否有子节点
*/
private boolean hasChild(List<Dept> list, Dept t){
return getChildList(list, t).size() > 0 ? true : false;
}
(前端写法:待验证)
/**
* 构造树型结构数据
* @param {*} data 数据源
* @param {*} id id字段 默认 'id'
* @param {*} parentId 父节点字段 默认 'parentId'
* @param {*} children 孩子节点字段 默认 'children'
* @param {*} rootId 根Id 默认 0
*/
export function handleTree(data, id, parentId, children, rootId) {
id = id || 'id'
parentId = parentId || 'parentId'
children = children || 'children'
rootId = rootId || 0
//对源数据深度克隆
const cloneData = JSON.parse(JSON.stringify(data))
//循环所有项
const treeData = cloneData.filter(father => {
let branchArr = cloneData.filter(child => {
//返回每一项的子级数组
return father[id] === child[parentId]
});
branchArr.length > 0 ? father.children = branchArr : '';
//返回第一层
return parseInt(father[parentId]) === rootId;
});
return treeData != '' ? treeData : data;
}
用法:
let id = "deptId" ;
let rootFrameworkId = 0;
return new Promise((resolve, reject) => {
return resolve(Utils.handleTree(frameworkList,id,null,null,rootFrameworkId))
});
【部门实体类:
package com.xxx.pojo.domain;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.ArrayList;
import java.util.List;
/**
* 部门表 sys_dept
*
* @author xx
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class Dept extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 部门ID */
@ApiModelProperty(value = "部门ID")
private Long deptId;
/** 父部门ID */
@ApiModelProperty(value = "父部门ID")
private Long parentId;
/** 祖级列表 */
@ApiModelProperty(value = "祖级列表")
private String ancestors;
/** 部门名称 */
@ApiModelProperty(value = "部门名称")
private String deptName;
/** 显示顺序 */
@ApiModelProperty(value = "显示顺序")
private String orderNum;
/** 负责人 */
@ApiModelProperty(value = "负责人")
private String leader;
/** 联系电话 */
@ApiModelProperty(value = "联系电话")
private String phone;
/** 邮箱 */
@ApiModelProperty(value = "邮箱")
private String email;
/** 部门状态:0正常,1停用,3删除 */
@ApiModelProperty(value = "部门状态:0正常,1停用,3删除")
private String status;
/** 父部门名称 */
@ApiModelProperty(value = "父部门名称")
private String parentName;
/** 子部门 */
@ApiModelProperty(value = "子部门")
private List<Dept> children = new ArrayList<Dept>();
public Long getDeptId()
{
return deptId;
}
public void setDeptId(Long deptId)
{
this.deptId = deptId;
}
public Long getParentId()
{
return parentId;
}
public void setParentId(Long parentId)
{
this.parentId = parentId;
}
public String getAncestors()
{
return ancestors;
}
public void setAncestors(String ancestors)
{
this.ancestors = ancestors;
}
@NotBlank(message = "部门名称不能为空")
@Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
public String getDeptName()
{
return deptName;
}
public void setDeptName(String deptName)
{
this.deptName = deptName;
}
@NotBlank(message = "显示顺序不能为空")
public String getOrderNum()
{
return orderNum;
}
public void setOrderNum(String orderNum)
{
this.orderNum = orderNum;
}
public String getLeader()
{
return leader;
}
public void setLeader(String leader)
{
this.leader = leader;
}
@Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符")
public String getPhone()
{
return phone;
}
public void setPhone(String phone)
{
this.phone = phone;
}
@Email(message = "邮箱格式不正确")
@Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this.email = email;
}
public String getStatus()
{
return status;
}
public void setStatus(String status)
{
this.status = status;
}
public String getParentName()
{
return parentName;
}
public void setParentName(String parentName)
{
this.parentName = parentName;
}
public List<Dept> getChildren()
{
return children;
}
public void setChildren(List<Dept> children)
{
this.children = children;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("deptId", getDeptId())
.append("parentId", getParentId())
.append("ancestors", getAncestors())
.append("deptName", getDeptName())
.append("orderNum", getOrderNum())
.append("leader", getLeader())
.append("phone", getPhone())
.append("email", getEmail())
.append("status", getStatus())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.toString();
}
}
【基类:
package com.xxx.pojo.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* Entity基类
*
* @author xx
*/
public class BaseEntity implements Serializable
{
private static final long serialVersionUID = 1L;
/** 搜索值 */
private String searchValue;
/** 创建者 */
@ApiModelProperty(value = "创建者")
private String createBy;
/** 创建时间 */
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date createTime;
/** 更新者 */
@ApiModelProperty(value = "更新者")
private String updateBy;
/** 更新时间 */
@ApiModelProperty(value = "更新时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date updateTime;
/** 备注 */
@ApiModelProperty(value = "备注")
private String remark;
/** 请求参数 */
private Map<String, Object> params;
public String getSearchValue()
{
return searchValue;
}
public void setSearchValue(String searchValue)
{
this.searchValue = searchValue;
}
public String getCreateBy()
{
return createBy;
}
public void setCreateBy(String createBy)
{
this.createBy = createBy;
}
public Date getCreateTime()
{
return createTime;
}
public void setCreateTime(Date createTime)
{
this.createTime = createTime;
}
public String getUpdateBy()
{
return updateBy;
}
public void setUpdateBy(String updateBy)
{
this.updateBy = updateBy;
}
public Date getUpdateTime()
{
return updateTime;
}
public void setUpdateTime(Date updateTime)
{
this.updateTime = updateTime;
}
public String getRemark()
{
return remark;
}
public void setRemark(String remark)
{
this.remark = remark;
}
public Map<String, Object> getParams()
{
if (params == null)
{
params = new HashMap<>();
}
return params;
}
public void setParams(Map<String, Object> params)
{
this.params = params;
}
}
【树结构实体类:
package com.xxx.pojo.domain.domainVo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.xxx.pojo.domain.Dept;
import com.xxx.pojo.domain.Menu;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
/**
* Treeselect树结构实体类
*
* @author xx
*/
public class TreeSelect implements Serializable
{
private static final long serialVersionUID = 1L;
/** 节点ID */
private Long id;
/** 节点名称 */
private String label;
/** 子节点 */
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<TreeSelect> children;
public TreeSelect()
{
}
public TreeSelect(Dept dept)
{
this.id = dept.getDeptId();
this.label = dept.getDeptName();
this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
}
public TreeSelect(Menu menu)
{
this.id = menu.getMenuId();
this.label = menu.getMenuName();
this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
}
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getLabel()
{
return label;
}
public void setLabel(String label)
{
this.label = label;
}
public List<TreeSelect> getChildren()
{
return children;
}
public void setChildren(List<TreeSelect> children)
{
this.children = children;
}
}