宅急送项目的第十天笔记!(拦截器和JBPM 工作流 在项目中应用 )

已经完成权限管理功能 
1、 模块添加 、列表查询
2、 功能点添加 、查询
3、 角色添加 、为角色授予权限
4、 为用户授予角色 

---------------- 全面测试。将返回json异常修复 
将bos功能权限信息.sql 导入到数据库 
功能路径,参考menu.json 、 Action中业务方法 

****  <constant name="struts.devMode" value="true" /> 发生异常时,返回特定页面 状态码200 ---- 上线后 设置false

====================================================================================
一、使用拦截器,对所有action进行权限控制 
细粒度 权限控制,添加后,需要全体功能重新测试 

Filter: 拦截所有url
Interceptor 拦截所有 action访问
Spring AOP 拦截所有Service 

********** 拦截针对 Action访问路径(名称)
1) 用户未登陆情况下 : 开放登陆功能  login.jsp 、user_login.action(登陆)
2) 如果用户已经登陆,没有任何授权,开发 修改密码 : page_common_index.action(主页)、user_editpassword.action(修改密码)
3)  所用功能 其它.action 无权限不能访问 
4)  超级管理员 admin 密码 admin  ----- 开发所用功能 

先判断 对方访问是不是登陆  ---- 如果是 放行
再判断 用户是否登陆 ------ 如果没有登陆 (去登陆)
然后判断 用户是不是管理员admin ----- 如果是放行 
再判断 用户访问功能是不是 修改密码或者主页 ----- 如果是 放行 
最后判断 访问功能,是否与当前登陆用户权限一致 ---- 如果不一致( 权限不足) , 如果一致放行

   <interceptors>
<!-- 注册拦截器 -->
<interceptor name="privilegeInterceptor" class="cn.itcast.bos.web.interceptor.PrivilegeInterceptor"></interceptor>

<!-- 自定义拦截器栈 -->
<interceptor-stack name="privilegeStack">
<!-- 引入默认栈 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 引入权限拦截 -->
<interceptor-ref name="privilegeInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 所有Action 都使用自定义栈 -->
<default-interceptor-ref name="privilegeStack"/>
*** 如果Action自己引入拦截器,默认栈将失效 

如果在用户登陆后,将用户可以访问路径信息,放入Session 
做法一: 在业务层添加一个方法 ,返回 List<String> findFunctionsByUser(User user); 查询用户可以访问功能路径 
做法二: 在Domain User中  List<String> functions , 在登陆查询时,就将List封装进去 ,一起保存到Session 
// 如果查询到了,将相关功能路径 封装到user中 functionPaths 
Role role = user.getRole();
if(role != null){
// 用户已经有角色
for(Function function: role.getFunctions()){
user.getFunctionPaths().add(function.getPage());// 将功能路径 保存user的列表中
}
}

插入管理员 
insert into users(username,password) values('admin',md5('admin'));

====================================================================================
二、JBPM 工作流 在项目中应用 
JBPM 学习 = 业务流程图 +  API 

因为业务不同 流程一定不同 (jbpm 业务流程图,和uml 活动图非常类似)

* 业务流程图中有很多活动节点 start end state task decision fork/join  (最重要 任务节点)


API : ProcessEngine 、RepositoryService 、ExecutionService 、TaskService  

嵌入到项目中  : JBPM工作流 流程 和 业务流程 结合到一起
* 操作业务流程时。操作业务表, 同时JBPM 工作流表 

***** 不管流程如何复杂,工作流都可以很好的管理 (随时查看整个流程,查看当前操作 进行流程哪个环节上)

常见做法: 手动方式(图形设计器) ---- xml流程定义文件 ------ 发布到工作流框架中 --- 通过业务模块启动这个流程 

***** 定制工作流程 
管理系统,在系统中管理员可以添加开始节点、任务节点、结束节点 通过form进行输入 ---- 生成工作流 xml 

三、设计中转jbpm流程。部署到项目中 
通过jbpm设计器 完成流程图 四个task任务节点, 一个decision判断节点 

为每个任务节点指定任务的负责人 (三种个人任务指定、三种组任务指定)
1、任务由一组人来完成,而不是个人任务 (使用组任务的设置)
2、如果确定负责人 candidate-users 属性固定 ------- 实际开发中 负责人不确定 (动态指定负责人) Handler
*** 自定义一个Handler 指定组负责人 
*** 自定义一个Handler : RoleAssignmentHandler  , 同一个handler 为不同四个任务指定责任人 

3、Decision判断也要指定handler : ArriveDecisionHandler
   * 根据变量isArrive 判断是去 中转 还是 去入库 
   
在测试环境通过 

四、部署中转jbpm流程 (管理流程) ----------- admin 
流程列表查询 : 查看已经上传所有流程 
上传流程zip压缩文件 : 上传后,将流程deploy 
查看流程图 
删除流程定义 (在测试时可以用。当流程正式启用后 )

processdefinition_list.jsp 列表
processdefinition_deploy.jsp  上传发布
admin.json 添加菜单 指向流程列表 


查询整个流程定义信息 RepositoryService 提供createProcessDefinitionQuery()  
*** java.util.List<ProcessDefinition> list()   结果 List<ProcessDefinition> 

将admin.json菜单 直接执行查询Action ,直接查询显示业务流程列表 

查看流程图
String deploymentId = "90001"; // 发布id 
String resourceName = "test.png"; // 与业务流程名相同png 
InputStream in = processEngine.getRepositoryService()
.getResourceAsStream(deploymentId, resourceName);

宅急送项目的第十天笔记!(拦截器和JBPM 工作流 在项目中应用 )_第1张图片

宅急送项目的第十天笔记!(拦截器和JBPM 工作流 在项目中应用 )_第2张图片

你可能感兴趣的:(宅急送项目)