用ror开发b/s已有3年了,早在2006年初接触ror(Ruby on Rails)的时候,当时国内没有一点中文资料,但一句“比java高10倍的开发效率”;让我去四处寻找ror的英文资料,一个月以后我就已经开始尝试用ror写点小东西,然后彻底抛弃java,转向ror。到现在,我已经拥有了3年的ror开发经验,这三年来,ror让我的技术水平上了一个大台阶,在开发的过程中也让我遭遇到了很多怀疑的目光,与经理顶撞,甚至因此失业。但是我相信真理,相信技术能改变社会,所以我一直坚持ror道路。
做ror开发最麻烦的就是没有人可以交流,从网上查询的资料也甚少,而且国内ror技术大多用在网络社区上,而我是做企业开发的。基本上无人可以交流。既然如此,干脆就把我这几年的企业开发经验说出来,与大家共分享。
何谓企业开发?
对于这个问题,似乎并没有明确的规定,不同的人似乎也有不同的理解。从技术层面来说,我觉得企业应用与一般的网络应用相比就是多了工作流与报表这两个大的模块。从技术特点的比较上来说,一般的网络社区应用讲究界面人性化,功能点多而杂。而企业应用则不然,企业应用对界面不太讲究,有一个固定的风格即可,功能点少而深。重视数据,重视流程。所以我重点讲讲我在ror上运用工作流与报表的经验。
举一个简单的例子,用户想做一个采购申请单的功能。他会给你一张纸质的采购申请单表格(也可能是excel格式的),告诉你采购申请单的审批流程,然后要你用软件实现这个业务。这是一个典型的企业应用实例,拿到这个需求后来我们怎么实现呢?
对于这个需求,在真正的企业开发中我们需要用流程设计器设计采购流程,用表单设计器设计每个流程点上的表单界面(注意在不同的流程点上对于单元格的可写权限不同),设定好每个流程点上的权限,这样拥有权限的人才可以进入这个点,发起采购申请或者进行采购申请的审批。然后我们还得有一个查询统计界面,能够查询以往的采购申请单数据。同时我们***拥有网页精确打印功能,这样可以将申请单打印出来盖章存档。当然表单导出excel和pdf是不可缺少的。别忘了,我们的系统是不能做死的,因为采购申请单是可变的,也许明年表单格式发生变化,也许审批流程会变化。还有,查询模板也是可增减可变的,天知道领导哪天想查什么报表。
考虑到上面这些,是不是有点抓狂了?呵呵,企业开发确实比较麻烦,想知道我怎么实现那就继续往下看吧。
对于上面这个需求,采用我写的框架,实现这个需求快则10分钟,慢则30分钟就可以实现。我不会单独为这个功能编写代码。所有可变的业务逻辑我都用设计器来实现。我的框架很好的实现了业务逻辑(变)与技术功能(不变)的分离。
我的实现方式:
1:用我开发的工作流设计器(vc开发,保存为xml格式,遗憾的是改格式不符合国际标准),设计一个采购申请流程,依据用户的要求在每个流程点上指定权限。保存为xml文件后发布到系统上。
2:用我开发的表单设计器(vc开发,类似excel,保存为xml),设计流程点上的表单,依据用户的需求在每个流程点上表单的只读属性可能有所不同,所以可能会设计若干个表单。保存为xml文件后发布到系统上,与先前发布的流程的流程点对应上。发布表单的时候系统自动解析xml格式,动态建立数据库表格,添加字段。
3:用我开发的报表设计器(与2是同一个东西),设计基本的查询模板,写好sql语句,保存为xml文件后发布到系统上。
做完上面3步后,这个需求就算是实现了,用户新建一个采购申请单后看到的表单是纯html的类似excel的格式,这个web form可以在线编辑(这个地方难度比较大,都是手写的javascript),点击保存后后台自动处理,将其保存到新建立的表中。下一步怎么处理,与其他的工作流引擎是一致的。用户打开一个已经写好的采购申请单,可以导出为excel或pdf,进行二次加工。也可直接网页打印,是精确显示的,可直接签字后盖章存档。在查询界面,用户点击一个查询,输入相关条件后可显示查询结果,以纯html方式展示,也可导出excel或pdf(稍微遗憾的是查询结果界面没有图表功能)。
ok,用户的需求我们很好的完成了,用户应该很满意了
下面介绍一下我的框架,也为大家提供一条ror上企业开发框架的思路。
拥有企业开发框架需要的权限,日志,工作流,报表,这是需要具备的基本要素。当然还有很多琐碎的小功能。其中最重要的2块就是工作流与报表。
工作流
rubyforge上有一些工作流组件,但逐个分析后发现没有一个可用的。所以只能靠自己了,我用vc开发了一个报表设计器,保存为xml文件后由ruby来解析流程。用自己写的表单设计器设计表单,保存为xml,ruby解析后翻译为html的一个table,方便精确显示到网页上,还要写一个复杂的javascript脚本,让这个table可以在线编辑,输入数值,字符串,或者显示下拉列表选择值。
报表
我的前公司是做报表工具的,有c++版的报表查询统计库,为了能在ror上也使用报表组件,我做了一个移植工作,将c++代码转成ruby代码,这是一个比较大大的工程。报表模板的文件格式(xml格式)遵守之前的格式,这样,同样的查询模板既能在c++程序上使用,也能在ror上使用。
我的ror开发框架从建立到完善,陆陆续续经过了1年多的时间,完成了几个真实项目,有政府的,事业单位的,公安部门的,甚至还有一个软件开发商直接花10万买走,后来跟经理闹不快,影响了更多成功案例的涌现。可以说我的ror技术是在他人怀疑的目光中成长的,但是却得到了用户的认可。所以我会一直坚持ror道路。
我用ror所遇到的一些问题:
#t#部署。java程序部署方式比较稳定,一般很少出现java服务堵死,需要重启的情况。但ror部署后没那么稳定。最近几个月,我用ror为公司写的一个oa部署后发现外部并发访问多的时候mongrel容易出现僵死的情况,几经折腾后无奈我只好切换到了82端口,总算稳定了。以前我的系统一般部署在企业内部机房中,有硬件防火墙帮我拦住了非法访问。但是换了其他的环境mongrel总是会提示有非法访问,非法访问多了以后mongrel就死翘翘了。这相比于iis简直差的太远了。ror的部署我还需要继续探索稳定的方式。
ruby代码加密。企业应用一般都是把系统卖给客户了。企业知识产权保护是个大问题。我想我肯定不是***个遇到此类麻烦的人。我做了一个工具,专门加密ruby代码。找到ruby的源代码,稍微做了一下修改,遇到加密的代码先解密再执行,解密后的文件不保存在磁盘上。***的解决了ruby代码加密的问题。这和php的zend加密方式似乎差不多。