项目包含的通用模块代码等我有时间一并剥离贡献出来(基于WebSocket的通知引擎,工作流整合模块,自定义表单,基于RBAC权限设计),最近太忙了,Web项目有一段时间没碰,有点生疏的感觉,主要在忙GQT项目,一套基于桌面开发的框架,写代码写的有点手酸的感觉。

基于Web的含工作流的项目看起来并不如想象的那么简单,主要需求:

  1. 灵活定制工作流,并跟踪流程进度;
  2. 每个Order含有历史轨迹记录,可在历史中查看;
  3. 工作流的Action灵活,认领任务不一定非要先提取表单,因为很多节点都只有几个动作,直接按钮操作即可;
  4. 待办事宜列表在不刷新页面情况下也能变动;

项目要求:

  1. 操作简单高效;
  2. 权限细节到按钮级别;
  3. 并发数少,不超过3000个在线用户;

主要可能使用到技术:

  1. 工作流引擎,我这里选用Activiti5,很灵活好用;
  2. 权限使用Spring Security,基于标签式管理权限很方便;
  3. 通知引擎使用WebSocket,基于Flash实时通信,基于socket.io;
  4. 权限粒度基于经典的RBAC;
  5. 总体框架Spring MVC+Mybatis;

实现的WebSocket的总体思路:

  1. WebSocket Server独立于Web项目,Web Server与WebSocket Server之间的局域网通信基于简单的Socket通信,这样这个组件可以完全解耦和通用;
  2. 当Web项目要Push消息到Client时,通过Web Server的Socket Client向WebSocket Server的Socker Server发送消息,然后WebSocket Server收到消息后解码,广播到所有浏览器;

我们实现的事件通知非常简单,设定全局变量并让浏览器侦听:

var G_WebSocket=false; 
var EVENT_ORDER_CHANGE_STATUS = "orderChange";
var EVENT_ORDER_CHANGE_AMOUNT = "amountChange";
var EVENT_ORDER_CHANGE_REFUND = "refundChange";
WebSocket.init = function(callbackFunc){
socket = io.connect(connUrl, connOptions);
socket.on('connect', function() {
G_WebSocket=true;
callbackFunc("connect",null);
});
socket.on('disconnect', function() {
G_WebSocket=false;
callbackFunc("disconnect",null);
});
socket.on('clientQuit', function(obj){
G_WebSocket=false;
callbackFunc("clientQuit",obj);
});
socket.on('broadcast', function(obj) {
callbackFunc("broadcast",obj);
});
};

在需要侦听WebSocket接受Web Server推送消息的地方加上一个函数即可:

	WebSocket.init(function(command,jsonObj){ 		
if(command=="broadcast"){
if(jsonObj.e == EVENT_ORDER_CHANGE_STATUS){
//TODO:write your code here
}else if(jsonObj.e == EVENT_ORDER_CHANGE_AMOUNT){
//TODO:write your code here
}else if(jsonObj.e == EVENT_ORDER_CHANGE_REFUND){
//TODO:write your code here
}
}
});

这样的结构要扩展推送服务很简单,比如按频道推送等,都可以很容易的扩展。

再看看看工作流,我们实现了activiti通用的申请提交任务流程和自定义表单功能,提取跟踪流程图功能等,这样你要设计一个新流程也变得非常简单,只需要在eclipse里划上工作流图,在后台发布,然后通过SpringMVC的RestAPI启动实例流程,申领完成任务等,如下图:


流程走到了分支的两个节点上,这样对后续新增的工作流提供了极大的遍历。

最后说说Spring
Security,基于RBAC的权限体系搭建好后(可以用在任何管理系统中),要在页面中访问一个资源,首先判断一下是否有权限,如下HTML:

<sec:authorize ifAllGranted="r_pd"> 
<a href="#">resource access here</a>
</sec:authorize>
<sec:authorize url="/XXX/XXX/XXX.html"> 	
<a href="XXX/XXX/XXX.html'">
<span>XXX功能</span>
</a>
</sec:authorize>

前台由于项目比较小,没有用到js的MVC框架,如backbone等,这里就不再记录了。

最新文章

  1. slide效果
  2. 0729am空控制器
  3. django关闭debug后,静态文件的处理
  4. 【转】SVN环境搭建教程
  5. Android SQLite数据库
  6. 数据库索引&lt;二&gt; 补充前篇 (上一篇抽风了,这个补上)
  7. php5 date()获得的时间不是当前时间
  8. URAL1017. Staircases
  9. &quot;git add -A&quot; is equivalent to &quot;git add .; git add -u&quot;.
  10. Combotree,datebox 启用 禁用
  11. CF 508D Tanya and Password(无向图+输出欧拉路)
  12. EF6 第一次,或者相隔一段时间变慢咋办? 我们来优化下
  13. Postgresql中的explain
  14. d3js scales深入理解
  15. 遍历HashMap的四种方式
  16. ABP+AdminLTE+Bootstrap Table权限管理系统第十一节--Bootstrap Table用户管理列表以及Module Zero之用户管理
  17. EasyUI - DataGrid 去右边空白滚动条列
  18. Netty核心概念
  19. Huploadify V2.1+ SpringMVC上传文件的实现
  20. Red Hat 配置ip地址

热门文章

  1. Python os.statvfs() 方法
  2. 使用 MySQLi 和 PDO 向 MySQL 插入数据
  3. PHP arsort() 函数
  4. Pytest单元测试框架-allure测试报告
  5. “随手记”开发记录day07
  6. 微信小程序多列选择器
  7. C#LeetCode刷题之#459-重复的子字符串(Repeated Substring Pattern)
  8. .NetCore(Avalonia) 项目dll混淆,Ubuntu 或者deepin操作系统 deb安装包解压,重新打包
  9. Vscode+Picgo+github+Markdown Preview Enhanced实现Markdown一键上传图床以及导出pdf文件
  10. unity探索者之复制内容到剪贴板