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

来源:互联网 发布:python 中位数 编辑:程序博客网 时间:2024/06/01 08:20

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

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

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

/**     * 更新文件旅游资源文件夹管理     */@Overridepublic 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 {// Fieldsprivate 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);}


原创粉丝点击