java使用递归迭代实现流程图展示(仅供参考)
2016-11-04 15:29
375 查看
本人在做项目的时候不确定流程图展示的节点下是否还有子节点,所以才采用递归方式进行循环判断。
1、实体类model
2、业务逻辑层Service
//这里大家可以使用$.ajax取得数据后再这里进行迭代展示
ProcessPoint.findProcessPoint(null,function(data){
//用于拼接字符串在页面展示
var str="<ul>";
str+="<li><a href='javascript:;' class='am-badge-secondary'>"+data.childrenProcessPoint[0].name+"</a>";
str+="<ul>";
//直接取到一级节点下的子节点进行迭代
var pp=data.childrenProcessPoint[0].childrenProcessPoint;
for(var i=0;i<pp.length;i++){
var o=pp[i];
str+="<li><a href='javascript:;' class='am-badge-secondary'>"+o.name+"</a>";
//递归调用,判断该节点下是否有子节点
hansChildren(o);
str+="</li>";
}
str+="</ul>";
str+="<div class='arrow'></div>";
str+="</li></ul>";
//页面展示流程图div
$(el).find(".tree").html(str);
//递归方法 判断该节点下是否有子节点
function hansChildren(o){
if(o.childrenProcessPoint!=undefined){
if(o.childrenProcessPoint.length>0){
str+="<ul>";
for(var j=0;j<o.childrenProcessPoint.length;j++){
var pc=o.childrenProcessPoint[j];
str+="<li><a href='javascript:;' class='am-badge-secondary'>"+pc.name+"</a>";
//递归调用
hansChildren(pc);
}
str+="</li></ul>";
str+="<div class='arrow'></div>";
}
}
}
});
6、jsp页面
<div class="add-form clearfix">
<h2>项目进度流程</h2>
<div class="am-form-group am-u-sm-12 am-u-md-7" style="background-color:#CDCDCD;">
<label for="doc-ipt-1" class="am-u-sm-30 am-form-label">
查询当前进度流程,不同颜色模块使用不同的方式处理。
</label>
</div>
</div>
<div class="tree-box pr">
<div class="terr-cart pa">
<input type="hidden" id="project_id" value="<%=this.id%>">
<ul>
<li><span class="am-badge-secondary am-round"></span>已经完成</li>
<li><span class="am-badge-success am-round"></span>进行中</li>
<li><span class="am-badge-default am-round"></span>未开始</li>
<li><span class="am-badge-danger am-round"></span>需要我处理的</li>
</ul>
</div>
<div class="tree"></div>
</div>
7、数据库数据图片
8、流程图展示
1、实体类model
package com.ijs.model; import java.util.List; import javax.persistence.Entity; import javax.persistence.Table; import javax.persistence.Transient; /** * ProcessPoint entity. @author MyEclipse Persistence Tools */ @Entity @Table(name = "process_point") public class ProcessPoint extends AbstractProcessPoint implements java.io.Serializable { //用于存放子节点 private List<ProcessPoint> childrenProcessPoint; // Constructors /** default constructor */ public ProcessPoint() { } /** minimal constructor */ public ProcessPoint(String id) { super(id); } /** full constructor */ public ProcessPoint(String id, String processId, String code, String name, Integer ownerRole, Integer owner, Integer status, Integer ppOrd, Integer ppType, String ppDesc, String pid, Integer ppLogic, String ppLogicWith) { super(id, processId, code, name, ownerRole, owner, status, ppOrd, ppType, ppDesc, pid, ppLogic, ppLogicWith); } @Transient public List<ProcessPoint> getChildrenProcessPoint() { return childrenProcessPoint; } public void setChildrenProcessPoint(List<ProcessPoint> childrenProcessPoint) { this.childrenProcessPoint = childrenProcessPoint; } }
2、业务逻辑层Service
package com.ijs.service; import java.util.List; import com.ijs.model.ProcessPoint; public interface ProcessPointServ { /** * 获取所有的节点信息进行递归迭代使用 * @return */ public List<ProcessPoint> getProcessPoints(); /** * 根据当前节点信息id查询该流程节点信息下是否还有子节点信息 * @param pid * @return */ public List<ProcessPoint> findByPid(String pid); }3.业务逻辑层实现ServiceImpl
package com.ijs.service.impl; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.ijs.dao.GenericDao; import com.ijs.model.ProcessPoint; import com.ijs.service.ProcessPointServ; import com.ijs.service.ProjectServ; @Service("processPointServ") public class ProcessPointServImpl implements ProcessPointServ { @Resource private GenericDao genericDao; public List<ProcessPoint> getProcessPoints() { StringBuffer jpql = new StringBuffer(); jpql.append(" from ProcessPoint p where 1=1"); jpql.append(" and p.status = 1 "); jpql.append(" order by -p.code desc"); List<ProcessPoint> processPoints = this.genericDao.find(jpql.toString()); return processPoints.size()==0?null:processPoints; } @Override public List<ProcessPoint> findByPid(String pid) { if(pid!=null){ StringBuffer jpql = new StringBuffer(); jpql.append(" from ProcessPoint p where 1=1"); jpql.append(" and p.status = 1 and p.pid='"+pid+"'"); jpql.append(" order by p.ppOrd"); List<ProcessPoint> processPoints = this.genericDao.find(jpql.toString()); return processPoints.size()==0?null:processPoints; } return null; } }4、控制器层Controller
package com.ijs.control; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.ijs.model.ProcessPoint; import com.ijs.service.ProcessPointServ; @Controller @RequestMapping("/processpoint") public class ProcessPointControl { @Resource(name="processPointServ") private ProcessPointServ processPointServ; /** * 查看项目流程图 * @param processPoint * @return */ @RequestMapping(value="/showprocesspoint",method = RequestMethod.POST) public @ResponseBody ProcessPoint showProcessPoint(@ModelAttribute ProcessPoint processPoint){ try { //处理好的流程图节点集合对象 List<ProcessPoint> processPoints =this.getProcessPoints(this.processPointServ.getProcessPoints()); if(processPoints!=null){ //将处理好的流程图节点集合对象赋值对象的子节点集合属性(private List<ProcessPoint> childrenProcessPoint;),方便页面通过该对象取出数据进行迭代显示 processPoint.setChildrenProcessPoint(processPoints); } } catch (Exception e) { e.printStackTrace(); } return processPoint; } /** * 处理查询出所有流程图节点信息进行相应的处理 * @param processPoints * @return */ private List<ProcessPoint> getProcessPoints(List<ProcessPoint> processPoints){ //声明一个新的集合对象进行接收,存放新的节点信息,循环迭代判断该节点下是否有子节点信息,如有进行添加 List<ProcessPoint> ps=null; if(processPoints!=null){ ps=new ArrayList<ProcessPoint>(); for (ProcessPoint p: processPoints) { //找到一级节点,从一级节点开始寻找 if(p.getPid().equals("0")){ //调用递归方法,判断是否有子节点,有就进行添加 this.addIfHasChildren(p); //将迭代完、判断完的节点存入新的节点集合 ps.add(p); } } } //返回新的节点集合 return ps; } /** * 递归判断当前节点对象是否还有子节点,有就进行添加 * @param p */ private void addIfHasChildren(ProcessPoint p) { //根据当前节点信息id查询该流程节点信息下是否还有子节点信息 List<ProcessPoint> processPoints=this.processPointServ.findByPid(p.getId()); //判断集合是否有数据,processPoints.size()>2这里是方便排序并列展示的节点使用,集合必须两个对象才能进行比较然后排序 if(processPoints!=null && processPoints.size()>2){ //排序集合并列展示的数据的位置 2.1 2.2 2.3(见下数据库数据结构) sortListByCode(processPoints); } //集合不为空,将数据进行添加 p.setChildrenProcessPoint(processPoints); //判断集合是否有数据 if(p.getChildrenProcessPoint()!=null){ for(ProcessPoint pc:p.getChildrenProcessPoint()){ //根据当前节点信息id查询该流程节点信息下是否还有子节点信息 List<ProcessPoint> pc2=this.processPointServ.findByPid(pc.getId()); if(pc2!=null && pc2.size()>2){ //排序节点 sortListByCode(pc2); } //添加节点对象 pc.setChildrenProcessPoint(pc2); //调用自己 this.addIfHasChildren(pc); } } } /** * 排序流程菜单节点 * 根据节点的Code排序 * @param processes */ private void sortListByCode(List<ProcessPoint> processPoints){ Collections.sort(processPoints, new Comparator<ProcessPoint>() { @Override public int compare(ProcessPoint o1, ProcessPoint o2) { float code1=Float.parseFloat(o1.getCode()); float code2=Float.parseFloat(o2.getCode()); if(code1>code2) return 1; else if(code1==code2) return 0; else return -1; } }); } }5、javaScript进行数据的也采用了递归进行相应的处理
//这里大家可以使用$.ajax取得数据后再这里进行迭代展示
ProcessPoint.findProcessPoint(null,function(data){
//用于拼接字符串在页面展示
var str="<ul>";
str+="<li><a href='javascript:;' class='am-badge-secondary'>"+data.childrenProcessPoint[0].name+"</a>";
str+="<ul>";
//直接取到一级节点下的子节点进行迭代
var pp=data.childrenProcessPoint[0].childrenProcessPoint;
for(var i=0;i<pp.length;i++){
var o=pp[i];
str+="<li><a href='javascript:;' class='am-badge-secondary'>"+o.name+"</a>";
//递归调用,判断该节点下是否有子节点
hansChildren(o);
str+="</li>";
}
str+="</ul>";
str+="<div class='arrow'></div>";
str+="</li></ul>";
//页面展示流程图div
$(el).find(".tree").html(str);
//递归方法 判断该节点下是否有子节点
function hansChildren(o){
if(o.childrenProcessPoint!=undefined){
if(o.childrenProcessPoint.length>0){
str+="<ul>";
for(var j=0;j<o.childrenProcessPoint.length;j++){
var pc=o.childrenProcessPoint[j];
str+="<li><a href='javascript:;' class='am-badge-secondary'>"+pc.name+"</a>";
//递归调用
hansChildren(pc);
}
str+="</li></ul>";
str+="<div class='arrow'></div>";
}
}
}
});
6、jsp页面
<div class="add-form clearfix">
<h2>项目进度流程</h2>
<div class="am-form-group am-u-sm-12 am-u-md-7" style="background-color:#CDCDCD;">
<label for="doc-ipt-1" class="am-u-sm-30 am-form-label">
查询当前进度流程,不同颜色模块使用不同的方式处理。
</label>
</div>
</div>
<div class="tree-box pr">
<div class="terr-cart pa">
<input type="hidden" id="project_id" value="<%=this.id%>">
<ul>
<li><span class="am-badge-secondary am-round"></span>已经完成</li>
<li><span class="am-badge-success am-round"></span>进行中</li>
<li><span class="am-badge-default am-round"></span>未开始</li>
<li><span class="am-badge-danger am-round"></span>需要我处理的</li>
</ul>
</div>
<div class="tree"></div>
</div>
7、数据库数据图片
8、流程图展示
相关文章推荐
- 斐波纳契函数java实现的误区--谨慎使用递归
- 使用递归求数组最大值(java实现)
- Java数据结构之递归与三角函数的运用,使用3种方法实现三角
- java使用递归,非递归方式实现二叉树的三种常见遍历方式
- 使用Oracle数据库实现树形结构表的子-父级迭代(递归)查询和删除,通过级联菜单简单举例
- XML的DOM解析 Java实现 使用递归解析一个XML文档
- java实现四则运算,难点主要在理解加减乘除优先级以及使用递归
- java计算参数目录大小的递归和迭代实现
- Java使用分治递归的思想实现快速排序
- 使用递归删除树形结构的所有子节点(java和mysql实现)
- php使用递归与迭代实现快速排序示例
- leetcode316: Remove Duplicate Letters 使用递归的简单java实现
- 递归和迭代两种方式实现归并排序(Java版)
- java 用递归实现:输入一个整数,用字符串逆序输出,例如输入123,输出321 ,不使用全局变量
- 使用java递归实现文件及文件夹的复制
- Java(二分查找算法实现,分别使用递归和非递归方式)
- 使用java的File类遍历文件夹,打印树状结构(递归实现)
- JAVA使用循环和递归方法实现斐波拉切数列
- java使用递归,非递归方式实现二叉树的三种常见遍历方式
- 使用PHP引用实现无限分类思路(非递归迭代)