spring项目菜单文件树数据库设计与后端接口实现
数据库表结构设计
document_tree_table
字段名 | 类型 | 注释 | 能否为空 | 主键 |
---|---|---|---|---|
id | varchar(32) | 主键 | 否 | 主键 |
prev_id | varchar(32) | 上一级目录id | 是 | - |
directory_name | varchar(32) | 目录名称 | 是 | - |
directory_level | int(11) | 目录层级(1为最顶层依次往下) | 是 | - |
以上是针对文件目录树设计的表结构。
directory_level该字段是目录层级一级目录对应1
、二级目录对应2
…依次往下。
代码实现
VO、PO类
VO类
@ApiModel("文件树配置")
public class DocumentTreeConfigureVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ApiModelProperty(value = "主键" )
private String id;
/**
* 上一级目录id
*/
@ApiModelProperty(value = "上一级目录id" )
@Size(max = 32)
@InvalidCode(value = "5002", message = "{invalid.code.5002}", desc = "上一级目录id")
private String prevId;
/**
* 目录名称
*/
@ApiModelProperty(value = "目录名称" )
@Size(max = 32)
@InvalidCode(value = "5003", message = "{invalid.code.5003}", desc = "目录名称")
private String directoryName;
/**
* 目录层级(1为最顶层依次往下)
*/
@ApiModelProperty(value = "目录层级(1为最顶层依次往下)" )
@Digits(integer = 10, fraction = 0)
@InvalidCode(value = "5004", message = "{invalid.code.5004}", desc = "目录层级(1为最顶层依次往下)")
private Integer directoryLevel;
@ApiModelProperty(hidden = true)
private List<DocumentTreeConfigureVO> childNodes = new ArrayList<>();
public List<DocumentTreeConfigureVO> getChildNodes() {
return childNodes;
}
public void setChildNodes(List<DocumentTreeConfigureVO> childNodes) {
this.childNodes = childNodes;
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setPrevId(String prevId) {
this.prevId = prevId;
}
public String getPrevId() {
return prevId;
}
public void setDirectoryName(String directoryName) {
this.directoryName = directoryName;
}
public String getDirectoryName() {
return directoryName;
}
public void setDirectoryLevel(Integer directoryLevel) {
this.directoryLevel = directoryLevel;
}
public Integer getDirectoryLevel() {
return directoryLevel;
}
}
PO类
@TableName("document_tree_table")
public class DocumentTreeConfigurePO extends BaseEntity implements Serializable {
private static final long serialVersionUID=1L;
/**
* 主键
*/
@TableId("id")
private String id;
/**
* 上一级目录id
*/
@TableField("prev_id")
private String prevId;
/**
* 目录名称
*/
@TableField("directory_name")
private String directoryName;
/**
* 目录层级(1为最顶层依次往下)
*/
@TableField("directory_level")
private Integer directoryLevel;
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setPrevId(String prevId) {
this.prevId = prevId;
}
public String getPrevId() {
return prevId;
}
public void setDirectoryName(String directoryName) {
this.directoryName = directoryName;
}
public String getDirectoryName() {
return directoryName;
}
public void setDirectoryLevel(Integer directoryLevel) {
this.directoryLevel = directoryLevel;
}
public Integer getDirectoryLevel() {
return directoryLevel;
}
}
Service实现类
//查询结构树的接口实现方法
@Override
public List<DocumentTreeConfigureVO> queryTreeNoAuth() {
//根节点list
QueryWrapper<DocumentTreeConfigurePO> rootWrapper = new QueryWrapper<>();
rootWrapper.eq("directory_level", 1);
List<DocumentTreeConfigureVO> rootList = listVO(rootWrapper);
QueryWrapper<DocumentTreeConfigurePO> wrapper = new QueryWrapper<>();
wrapper.eq("type", 0);
List<DocumentTreeConfigureVO> list = this.listVO(wrapper);
loadDocumentTree(rootList, list, 1);
return rootList;
}
/**
* 递归生成结构树
* @param rootList 根节点列表
* @param sourceList 全部节点
* @param level 节点等级
*/
private void loadDocumentTree(List<DocumentTreeConfigureVO> rootList, List<DocumentTreeConfigureVO> sourceList, Integer level){
for (DocumentTreeConfigureVO rootVo : rootList) {
String rootVoId = rootVo.getId();
Integer nextLevel = level + 1;
List<DocumentTreeConfigureVO> childList = new ArrayList<>();
for (DocumentTreeConfigureVO vo : sourceList) {
String prevId = vo.getPrevId();
Integer directoryLevel = vo.getDirectoryLevel();
if (rootVoId.equals(prevId) && directoryLevel == nextLevel){
childList = rootVo.getChildNodes();
childList.add(vo);
}
}
loadDocumentTree(childList, sourceList, nextLevel);
}
}
第一次写试试水,凑合看吧大家,谢谢啦!