新添加一个的时候拼接十分简单;如果修改的时候呢,这样的情况就比较复杂了,很多情况可能都考虑不完全。
主要问题:修改一个节点的上级节点时,各个节点的资源路径修改幅度较大,比较容易疏漏。
比如:1、你将某一个节点的上级节点修改到一个节点下面,那么修改那个节点的子节点路径全部需要更改;
2、如果将某个节点的上级节点修改到该节点的子节点下呢,那就更麻烦了。。需要更新的节点就更多了。
效果图:
/**
* 拼接保存每个文件夹的路径(filepath字段)【从下至上拼接】
* @param parents
* @param filePath
* @return
*/
public String getPathName(TIndex parents,String filePath){
if(parents!=null){
filePath = parents.getName()+"/"+filePath;
return getPathName(parents.getTIndex(), filePath);
}
return filePath;
}
/**
* 更新文件旅游资源文件夹管理
*/
@Override
public void updateFilePath(Index index) {
TIndex in = indexDao.get(TIndex.class, index.getId());
BeanUtils.copyProperties(index, in);
String pid = index.getPid();
String filePath = in.getName()+"/";
TIndex parents = null;
Boolean flag = false;
if(pid!=null&&!pid.equals("")&&!pid.endsWith(index.getId())){
parents = indexDao.get(TIndex.class, pid); //获取到父对象 TIndex
flag = isChildren(in, parents); // 说明要将当前资源修改到当前资源的子/孙子资源下
in.setTIndex(parents);
filePath = this.getPathName(parents,filePath);
//if(parents!=null){
in.setTIndex(parents);
//}
if(flag){ //判断是否将上级菜单选择在了自己原菜单的子菜单下面
RecursionUpdateParentFilePath(parents);
}
}else{
in.setTIndex(null); // 前台没有选中上级资源,所以就置空
}
in.setFilePath(filePath);
Set<TIndex> set = null;
if(!flag){ //没有选择在当前资源修改到当前资源的子/孙子资源下
set = in.getTIndexes();
if(set!=null&&set.size()>0){//判断是否有子菜单
this.HasChildren(in);
}
}else{//更改上级菜单的子菜单
if(parents.getTIndex()!=null){ //同级目录的资源也同时更改
parents = parents.getTIndex();
}
set = parents.getTIndexes();
if(set!=null&&set.size()>0){ //判断是否有子菜单
this.HasChildren(parents);
}
}
}
/**
* 递归更改上级菜单的filepath
* @param parents(选中的上级菜单)
* @return
*/
public String RecursionUpdateParentFilePath(TIndex parents){
String filePath = "";
String path = this.getPathName(parents,filePath);
parents.setFilePath(path);
if(parents.getTIndex()!=null){ //代表还有上级菜单
return RecursionUpdateParentFilePath(parents.getTIndex());
}
return null;
}
/**
* 分层递归更改子菜单路径
* @param in
* @return
*/
public String HasChildren(TIndex in){
Set<TIndex> children = in.getTIndexes();
this.getPathNameDown(children,in);
if(children!=null&&children.size()>0){
for(TIndex t :children){
HasChildren(t);
}
}
return null;
}
/**
* 通过递归更改子菜单每个文件夹的路径(filepath字段)【从上至下拼接】
* @param children(更改对象子菜单)
* @param in(更改对象)
* @return
*/
public String getPathNameDown(Set<TIndex> children,TIndex in){
String filePath = in.getFilePath();
if(children!=null&&children.size()>0){
for(TIndex t :children){
filePath = in.getFilePath()+t.getName()+"/";
t.setFilePath(filePath);
}
}
return filePath;
}
/**
* 递归判断是否此次修改, 将自己的上级菜单修改到了自己的子菜单中了;
* 如果是,那么将该上级菜单的 最顶级的上级菜单置空;
* @param t
* 当前节点
* @param pt
* 要修改到的节点
*/
public Boolean isChildren(TIndex t,TIndex pt){
if(pt!=null&&pt.getTIndex()!=null){ //代表至少是该菜单下的子二级菜单
if(pt.getTIndex().getId().equalsIgnoreCase(t.getId())){
pt.setTIndex(null);
return true;
}else{
return isChildren(t,pt.getTIndex());
}
}
return false;
}
给你们看下我的TIndex的结构吧:
@Entity
@Table(name = "t_index", catalog = "qx")
public class TIndex implements java.io.Serializable {
// Fields
private String id;
private TIndex TIndex;
private String name;
private String filePath;
private String comment;
private BigDecimal seq;
private String iconCls;
private Set<TIndex> TIndexes = new HashSet<TIndex>(0);
}