工作时遇到了一个需求,查询当前项目拥有的文件夹以及他的文件,封装成树形返回前端,还要加上数字,数字是文件的数量
工作推荐最好写上自己能够看懂的,以便以后方便维护
第一种
也是最简单的一种,直接拷贝更换实体类即可
工具方法在最下面
public List<BusiFload> se(){
List<BusiFload> list = mapper.selectBusiFloadList(16l);
final List<BusiFload> parent = new ArrayList<>();
//遍历全表分类元素
list.forEach(bu-> {
//currentCategory表⽰当前的⼀个分类
//找出根分类
// if (currentClassfication.getPid() == null && parent==null) {
if (bu.getParentId() == 0 ) {
//parent[0] = currentClassfication;
parent.add(bu) ;
}
//找出当前⼀个分类的孩⼦分类:再次遍历全表元素,与当前分类进行比较
list.forEach((child)->{
if(bu.getId().equals(child.getParentId())){
bu.getChildren().add(child);
}
});
});
parent.forEach(l -> {
if (l.getIsFload().equals(Constants.isFload)){
Long id1 = l.getId();
Integer count = 0;
//查询当前文件夹的文件数
count = extracted(String.valueOf(projectId), l, id1, count);
l.setNumber(count);
}
});
return parent;
}
实体类
package m.dsf.controller.doing;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 对象 busi_fload
* 文件夹
* @author ruoyi
* @date 2023-03-14
*/
public class BusiFload
{
private List<BusiFload> list = new ArrayList<BusiFload>();;
public List<BusiFload> getList() {
return list;
}
public void setList(List<BusiFload> list) {
this.list = list;
}
private static final long serialVersionUID = 1L;
/** 文件夹表id */
private Long id;
/** 文件名字 */
private String fileName;
/** 创建时间 */
@JsonFormat(pattern = "yyyy-MM-dd")
private Date createTiem;
/** 父文件夹id */
private Long parentId;
/** 删除状态/0未删除1删除 */
private String delFlag;
/** 项目id */
private String busiProjectInfoId;
/** 是否是文件夹/0是1不是 */
private String isFload;
/** 文件类型 */
private String fileType;
/** 上传作者 */
private String fileUser;
/** 摘要 */
private String makeASummary;
/** 排序 */
private Integer operate;
/** 文件路径*/
private String filePath;
/** 文件大小*/
private BigDecimal fileSize;
/** 摘要或者名称*/
private String keyValue;
/**路径 */
private String url;
private Long userId;
private String originalFileName;
/**
* 项目ID
*/
private String projectId;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getOriginalFileName() {
return originalFileName;
}
public void setOriginalFileName(String originalFileName) {
this.originalFileName = originalFileName;
}
public String getKeyValue() {
return keyValue;
}
public void setKeyValue(String keyValue) {
this.keyValue = keyValue;
}
public BigDecimal getFileSize() {
return fileSize;
}
public void setFileSize(BigDecimal fileSize) {
this.fileSize = fileSize;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
/** 子菜单 */
private List<BusiFload> children = new ArrayList<BusiFload>();
public List<BusiFload> getChildren() {
return children;
}
public void setChildren(List<BusiFload> children) {
this.children = children;
}
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setFileName(String fileName)
{
this.fileName = fileName;
}
public String getFileName()
{
return fileName;
}
public void setCreateTiem(Date createTiem)
{
this.createTiem = createTiem;
}
public Date getCreateTiem()
{
return createTiem;
}
public void setParentId(Long parentId)
{
this.parentId = parentId;
}
public Long getParentId()
{
return parentId;
}
public void setDelFlag(String delFlag)
{
this.delFlag = delFlag;
}
public String getDelFlag()
{
return delFlag;
}
public void setBusiProjectInfoId(String busiProjectInfoId)
{
this.busiProjectInfoId = busiProjectInfoId;
}
public String getBusiProjectInfoId()
{
return busiProjectInfoId;
}
public void setIsFload(String isFload)
{
this.isFload = isFload;
}
public String getIsFload()
{
return isFload;
}
public void setFileType(String fileType)
{
this.fileType = fileType;
}
public String getFileType()
{
return fileType;
}
public void setFileUser(String fileUser)
{
this.fileUser = fileUser;
}
public String getFileUser()
{
return fileUser;
}
public void setMakeASummary(String makeASummary)
{
this.makeASummary = makeASummary;
}
public String getMakeASummary()
{
return makeASummary;
}
public void setOperate(Integer operate)
{
this.operate = operate;
}
public Integer getOperate()
{
return operate;
}
@Override
public String toString() {
return "BusiFload{" +
", id=" + id +
", fileName='" + fileName + '\'' +
", createTiem=" + createTiem +
", parentId=" + parentId +
", delFlag='" + delFlag + '\'' +
", busiProjectInfoId='" + busiProjectInfoId + '\'' +
", isFload='" + isFload + '\'' +
", fileType='" + fileType + '\'' +
", fileUser='" + fileUser + '\'' +
", makeASummary='" + makeASummary + '\'' +
", operate=" + operate +
", filePath='" + filePath + '\'' +
", fileSize=" + fileSize +
", keyValue='" + keyValue + '\'' +
", url='" + url + '\'' +
", userId=" + userId +
", originalFileName='" + originalFileName + '\'' +
", projectId='" + projectId + '\'' +
", children=" + children +
"list=" + list +
'}';
}
public String getProjectId() {
return projectId;
}
public void setProjectId(String projectId) {
this.projectId = projectId;
}
}
数据库
CREATE TABLE `busi_fload` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '文件夹表id',
`file_name` varchar(255) NOT NULL COMMENT '文件名字',
`create_tiem` datetime NOT NULL COMMENT '创建时间',
`parent_id` int(11) DEFAULT NULL COMMENT '父文件夹id',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`del_flag` char(1) NOT NULL COMMENT '删除状态/0未删除1删除',
`busi_project_info_id` varchar(255) NOT NULL COMMENT '项目id',
`is_fload` char(1) NOT NULL COMMENT '是否是文件夹/0是1不是',
`file_type` varchar(255) DEFAULT NULL COMMENT '文件类型',
`file_user` varchar(255) DEFAULT NULL COMMENT '上传作者',
`make_a_summary` varchar(255) DEFAULT NULL COMMENT '摘要',
`operate` int(255) DEFAULT NULL COMMENT '排序',
`file_path` varchar(255) DEFAULT NULL COMMENT '文件路径',
`file_size` double DEFAULT NULL COMMENT '文件大小',
`original_file_name` varchar(255) DEFAULT NULL COMMENT '原文件名',
`user_id` int(11) DEFAULT NULL COMMENT '用户id',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=263 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
第二种
public List select(){
List<BusiFload> list = mapper.selectBusiFloadList(16l);
List<BusiFload> busiFloads = new ArrayList<>();
//将最大 的节点放入最外面一级目录
list.forEach(l->{
if (l.getParentId() == 0){
busiFloads.add(l);
}
});
//删除最大节点元素
list.removeAll(busiFloads);
// extracted(list, busiFloads);
add(list,busiFloads);
busiFloads.forEach(l -> {
if (l.getIsFload().equals(Constants.isFload)){
Long id1 = l.getId();
Integer count = 0;
//查询当前文件夹的文件数
count = extracted(String.valueOf(projectId), l, id1, count);
l.setNumber(count);
}
});
return busiFloads;
}
public static void add(List<BusiFload> list ,List<BusiFload> busiFloads){
//遍历出事文件夹
busiFloads.forEach(b->{
//如果是文件,直接跳出本次循环
if (b.getIsFload().equals(1)){
return;
}
//使用下标循环用于删除元素,使用增强for循环无法进行删除操作
for (int i = 0; i < list.size(); i++) {
//拿到这个元素
BusiFload busiFload = list.get(i);
//判断不是本身以及子文件夹父级id和父id相等
if (busiFload.getParentId().equals(b.getId()) && busiFload.getId() != b.getId()){
//判读如果集合是null则需要给他new出一个集合
if (b.getList() == null){
b.setList(new ArrayList<>());
}
b.getList().add(busiFload);
//元素添加后进行删除掉这个元素
list.remove(i);
i--;
}
}
List<BusiFload> list1 = b.getList();
//如果这个文件夹的子集合不为空,则继续递归他的子文件夹
if (!CollectionUtils.isEmpty(list1)){
add(list,list1);
}
});
}
最后的数量都要吊一下查询数量的方法
public int extracted(String busiProjectInfoId, BusiFload l, Long id1, Integer count) {
count = busiFloadMapper.selectByIdFile(id1, busiProjectInfoId);//1
List<TreeSelect> children = l.getChildren(); //1
if (children.size() != 0) { //1
for (int i = 0; i < children.size(); i++) {
Long id2 = children.get(i).getId();
int extracted = extracted(busiProjectInfoId, children.get(i), id2, count);
children.get(i).setNumber(extracted);
count += extracted;
}
}
return count;
}