时至今日,来兰亭工作的第三个小任务算是暂时告一段落了。这个小任务是耗费时间最长的,因此在这里总结整理一下。
首先这个功能的出发点是方法领导进行手下员工的审批,包括加班申请,休假申请,和漏打卡申请。由于HR系统的不给力,导致领导登录HR系统进行审判的时候耗费了太多的时间。所以考虑以邮件的形式,对每个申请进行系统外的审批。
起初考虑做这个功能的方案有两个:
- 直接调用原系统DLL里的审批方法。
- 手写sql,执行审批的sql语句或存储过程。
通过查看代码发现,审批的流程极其复杂,因为引入了一个工作流系统,所有的流程都是工作流设计器来完成的。而工作流设计器是一个以界面拖拽控件的形式来完成定制的业务逻辑。逻辑的关键代码在工作流设计器里没有找到(怀疑是原开发公司把核心代码编译完成后交付的)。所以,代码的内部逻辑不是很好找。
于是尝试用第一种方式:用我自己的dll去调用他的dll中的方法。首先需要引用他所有相关的dll,否则编译不会通过。(他所以的dll有200多个,由于不知道哪些是和此功能相关的,所以得全部引用上……),尝试调用方法的时候总是报错。怀疑是他里面的方法在调用前进行过一些初始化的工作,比如初始化spring等等的东西,这个就不太好办了。因此,该方案被搁置。
接下来准备尝试手写sql来完成审批,这也是领导希望的一种方式,因为它无论从效率上还是从对系统数据库的理解上都是更好的。但是监控的结果让我彻底放弃了这种想法。
尝试着对审批同意的事件进行了监控。发现记录了700多条sql…… 面对这个数字我只能感叹,也难怪之前的系统效率不高呢。于是尝试着整理数据库的结构,用到了一些工具来生成数据库文档。但是还是不知从何分析。于是此方案再次搁置。
于是又想到调原有的方法来模拟,但是初始化这块总是摸不透。灵感一现,那就模拟一下初始化的工作呗,怎么模拟呢?由于对原系统的工作流程不熟悉,那就完全照搬——复制了一个一模一样的站点,然后修改我需要的部分。这样,复制后的站点可以正常的启动,调接口。
于是我在新站点下建立了一个调用接口的测试页面,调用的过程发现原网站有身份验证(forms身份验证),在没有通过验证前,无法访问网站内的aspx页面
<authentication mode="Forms"/> <forms loginUrl="~/logon.aspx" name="ESSAuthForm" timeout="10" protection="All" path="/"> <credentials passwordFormat="MD5"> <user name="username" password="password"/> </credentials> </forms> </authentication>
此段配置是说网站采用forms身份验证,验证的原理就是登录成功后,框架会写入一个身份令牌的cookie到客户端浏览器,在访问其他页面的时候,需要进行验证。没有授权的用户访问页面时,就会被重定向到logon.aspx这个页面去。
于是就想,为我的某些特权页面允许匿名访问不就行啦。
一、设置所有页面都需要验证
<system web>
<authentication mode="Forms">
<forms loginUrl = "Lonin.aspx" name = ".ASPXFORMSAUTH"/>
</authentication>
</system web>
二、再特别设置对某个目录下的页面不需要验证(NoAuto为不需要验证的页面所在的目录)
<location path="NoAuto">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
尝试的时候发现不起任何作用。这下就麻烦了。经过研究,怀疑系统在其他地方还有对身份授权的验证,于是搜索了一下dll,发现在有个验证的命名空间下有两个方法,进行了身份的验证,验证不通过的话,就跳转到登录页。
于是……果断注释掉那两个方法,问题解决!
这个自定义的验证是在这里进行的配置:
<httpModules> <add name="AuthenticateModule" type="CDC.PowerESS.Web.Support.AuthenticateModule,ESS.Web"/> </httpModules>
相当于在处理管道的时候就进行了验证,杯具啊。
突破了这个,剩下的任务就好办了。
写个批量审批页面,ajax调用接口。
再写个后台程序,就齐了。