根据tree文件菜单的path,拼接文件夹路径

5 篇文章 0 订阅

新添加一个的时候拼接十分简单;如果修改的时候呢,这样的情况就比较复杂了,很多情况可能都考虑不完全。

主要问题:修改一个节点的上级节点时,各个节点的资源路径修改幅度较大,比较容易疏漏。

 比如: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);

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值