欧阳宏基,宋笑雪,李 红,2
(1.咸阳师范学院 计算机学院,陕西 咸阳 712000;2.西安电子科技大学 智能感知与图像理解教育部重点实验室,陕西 西安 710071)
随着国内高等院校发展程度的提高和管理复杂度的增加,目标考核信息化程度也要随之提高。目标考核工作所需要的数据来自多个职能部门、多个教学院系,具有信息分散、逐步产生等特点。传统手工处理方式存在考核数据处理任务繁重、更新不及时、共享程度低等缺点,从而导致考核结果不透明、缺乏公正性,无法反映某个部门的真实工作情况[1]。目标考核过程要经历任务下达、任务分解、数据输入、数据审核、数据汇总、考评结果分析等多个环节,目标任务数据、任务完成的支撑数据、汇总数据以及考核结果数据是整个目标考核管理的核心数据,数据的管理工作能否到位直接影响整个考核过程的正确性和公平性。文中采用基于B/S的分层开发模式,整合Easy UI、Struts2、Spring和Hibernate轻量级开源框架,构建了高等院校目标考核管理信息化框架,实现了目标考核工作的数字化管理,提高了考核工作的透明度、公平性和公正性,为学校领导层作决策提供了数据支撑。
通过对部分高校进行调研,得出目标考核工作的基本流程,如图1所示。
图1 目标考核工作流程
首先在年初由发展规划处牵头,组织教务处、科技处、学科办、学生处、招生就业处、人事处、党委宣传部、党委组织部等学校职能部门给各二级学院制定目标责任书(征求意见稿),目标责任包括教育教学、科学研究、师资队伍、学生工作、党建工作等5大部分。在与各二级学院充分沟通、协调的基础上,确定目标责任书的正式版并向全校公布,各二级学院将目标责任按照本院职工岗位类型分解到人。到年底,学校启动考核工作,各二级学院要求每位职工上报任务完成情况并提交相关支撑材料,二级学校按照目标类别汇总资料并提交相关职能部门审核,审核通过后会计算每个责任类别的得分。各职能部门将审核后的得分数据汇总上报发展规划处,发展规划处将每个学院各目标类的得分按照相关规则进行换算,得到二级学院本年度最终目标考核得分。学校召开目标考核办公会,对各二级学院实施相应的奖惩措施,并对本年度的目标责任完成情况进行具体分析,并为来年制定目标任务提供重要的参考。
根据上一节的业务流程,制定高等院校目标考核信息化功能,如图2所示。
图2 目标考核信息化功能模块
(1)基础数据维护:包括教育教学、科学研究、师资队伍、党建、学生工作等5个方面的基础数据。教师按照二级学院分配的任务,从教学任务、项目申请、论文、专利、著作、获奖等方面按照三级指标要求,维护本年度的完成信息。教学秘书从学科建设、实验室建设、实习基地、质量工程等方面维护集体指标方面的信息,监控本学院教师任务完成情况,并向职能部门上报汇总信息。学生办公室从党建、学生工作两个方面维护本年度的信息,并向职能部门上报。职能部门对二级学院上报的信息进行审核,按照三级指标的得分点计算生成目标得分,上报发展规划处。发展规划处汇总生成各二级学院最终考核成绩。
(2)教师信息管理:教师个人对自己基本信息的维护,包括职称变动、部门调动、岗位聘任结果、获得荣誉、密码修改等操作,都通过该模块实现。
(3)报表管理:各二级学院按照一级指标生成本学院年度任务完成情况报表;各职能部门按照各自分管的指标生成全校年度任务完成情况报表;发展规划处生成各二级学院年度考核结果报表。
(4)指标管理:根据目标责任划分指标,分为教育教学、科学研究、师资队伍、学生工作、党建工作5个一级指标,各一级指标下包括若干二级指标,各二级指标下又划分若干三级指标。该模块实现对指标的增、删、改、查。
(5)信息查询:二级学院领导查看本学院目标任务完成情况。职能部门按照分管的一级指标查看二级学院的完成情况。领导层以学院、工号、学位、职称、聘任岗位、指标等条件查看任务完成情况。
(6)系统维护:实现数据库的备份与还原、系统公告的发布、权限角色信息的管理、相关参数的配置等。
目标考核信息化框架总体基于Java EE平台,满足MVC设计模式[2-3],服务器采用开源Tomcat7.0,综合应用Easy UI、Struts2、Spring和Hibernate等开源框架进行搭建,是一个5层的分层结构,如图3所示。
图3 目标考核信息化框架结构
(1)表示层:负责构建交互界面,接收并转发用户请求到控制器,向用户显示响应请求的结果。该层主要由JSP、CSS样式、Div、Easy UI和Struts2的标签构成。Easy UI是轻量级的JavaScript框架,提供了丰富的插件、强大的选择器和良好的浏览器兼容性,能够简化DOM和Ajax操作[4]。Struts2标签通过与值栈数据交互,简化页面Java代码量,提高了开发效率[5-6]。
(2)控制层:该层提供控制逻辑,通过Struts2配置文件将请求/响应页面与Action组件关联起来。Action组件负责调用下层的业务逻辑组件执行用户请求,解耦合了视图部分与模型部分。
(3)业务逻辑层:该层功能由Spring框架实现,包括Service接口和Service实现两部分。Service接口向控制层提供调用业务逻辑处理的入口,JavaBean组件负责Service实现并调用下层的接口完成持久化操作。业务层组件之间的关联关系通过XML文件配置。
(4)数据持久化层:由DAO模式与Hibernate框架实现,DAO接口定义POJO对象的持久化逻辑并作为业务层访问的入口[7],DAO实现封装Hibernate通过映射文件完成对象与数据库之间的交互。
(5)数据库层:该层负责存储目标考核业务所需要长久保存的数据以及之间的关联关系,通过触发器完成相关的汇总、统计计算。综合考虑易操作性、稳定、安全、集群搭建、开源等特性,最终选择MySQL数据库。
(1)以Spring IOC机制为核心的框架整合。
通过3.1节对框架平台结构的解析可知,Struts2、Spring、Hibernate均是MVC模式某个部分的实现,必须将它们整合起来形成统一整体。整合的思路是以Spring为桥梁,向下将Hibernate的SessionFactory纳入IOC容器管理;向上将Struts2的Action纳入IOC容器管理[8]。具体实施时采用XML文件+注解的方式进行框架整合和系统开发,其中基础配置部分采用XML文件,包括Struts2、Spring、Hibernate的核心配置文件以及持久化类的映射文件,这部分的内容一次配完后,以后很少变动。开发部分中的各层组件及其依赖关系采用注解,利用@Controller定义Action组件,在其内部通过@Resource定义Action所依赖的业务逻辑层组件。利用@Service定义业务逻辑组件,在其内部通过@Resource定义所依赖的持久层组件。利用@Repository定义DAO组件。组件的设计变动较大,采用注解方式能够提高开发效率并具有较好的灵活性。
(2)ORM技术。
ORM是定义面向对象技术与关系型数据之间如何映射的一套规范,能够简化开发人员使用SQL和JDBC处理关系数据库的操作。Hibernate是实现ORM规范的一个具体产品,通过提供Configuration、SessionFactory、Session、Transaction和Query(或Criteria)5个核心接口对持久化对象进行存储和事务控制[9],交互过程如图4所示。
图4 Hibernate核心接口交互过程
首先,Configuration接口读取配置文件启动Hibernate并创建SessionFactory;然后,由SessionFactory实例负责初始化Hibernate,建立与数据库的连接[10]。SessionFactory是重量级组件,在初始化时只创建一次常驻内存,用来创建Session对象。最后,Session对象创建Query(或Criteria)对象,在事务处理对象Transaction的协助下,通过映射文件实现持久化对象与数据库的交互。
(3)AOP技术。
AOP是一种关注点分离技术[11],强调将掺杂在核心业务逻辑中的辅助逻辑(例如事务处理、日志记录、访问控制等)进行分离,形成单独的公共模块。通过反射与动态代理机制将公共模块与核心业务模块相融合[12],从而形成完整的系统。Struts2和Spring提供了对AOP技术的支持,目标考核信息化框架采用Struts2的AOP实现权限验证和日志记录,采用Spring的AOP实现对Hibernate事务的控制。
以访问控制的设计为例,说明AOP的应用。由于目标考核涉及众多不同角色的用户,所以采用RBAC模型[13]进行用户、角色的管理。分别定义用户类、角色类和权限类,用户中包含角色,角色中包含权限。权限类中包含一个URL属性,代表某个可用资源的路径。用户访问系统的某个资源时,在所拥有的权限集合中去检索这个资源的URL,如果找到表明用户可以访问这个资源,否则用户不具备操作这个资源的权限并跳转到访问出错提示页面。
由于Struts2是通过拦截器提供AOP支持的,所以将上述访问控制逻辑提取出来定义到拦截器中,相关核心代码如下:
public classAuthorityInterceptor extends AbstractInterceptor
{//AOP的切面逻辑
public String intercept(ActionInvocation invocation) throws Exception
{//从session中获取登录用户信息
User user=(User)ActionContext.getContext().getSession().get("user");
//获取所访问的Action对应的URL
String url=buildURL(invocation);
if(user==null)
{
if("user/userAction_login".startsWith(url))
//如果是去登录,就放行
return invocation.invoke();
else
{HttpServletResponse response=(HttpServletResponse)ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);
response.sendRedirect("login.jsp");
//如果不是登录,就转到登录页面
return "loginUI"; }
}
//如果已登录,就判断权限
else
{if(user.hasAuthorityByUrl(url))
//如果有权限,就放行
return invocation.invoke();
else
//如果没有权限,就转到提示页面
return "noAuthorityError";
} } }
通过上述源码得出,AOP技术进一步解耦合了业务逻辑与辅助逻辑,对辅助逻辑进行模块化设计,减少了代码的编写量,提高了复用率。
采用分层开发模式完成框架的实现,该方法最大限度地降低了各层之间的耦合性,实现了表示层、控制层、业务逻辑层、数据持久层、数据库各层之间的同步实施,提高了开发效率,降低了开发难度。框架具体实现流程如下:
(1)按照领域建模的思想,创建实体类及其之间的关联关系,并在Hibernate的映射文件中进行描述。Hibernate会将实体类映射成相关的数据表,关联关系映射成表之间的外键。该系统设计的实体类一共有52个,分别表示用户、职能部门账户、角色、权限、教材、专著、科研项目、科研论文、科研奖励、部门、岗位、课程、班级、综合指标、业绩指标、指标下达、指标完成和指标得分等。以指标管理模块的综合指标为例,实体类及其联系如图5所示。IndexLevelOne表示一级指标,IndexLevelTwo表示二级指标,IndexLevelThree表示三级指标。一级指标与二级指标之间是一对多关系,二级指标与三级指标是一对多关系。AssignTask表示目标任务,由各职能部门给各二级学院下达目标任务时使用。TaskDetail表示目标任务完成的具体信息,由各二级学院教学秘书和教师角色按照三级指标提交任务完成信息时使用。TaskSubtotal表示审核通过的任务信息,审核通过后计算对应三级指标的实际得分和超额得分,供按二级指标和一级指标统计某个学院得分时使用。
(2)在数据持久层定义实体类对应的DAO接口和DAO实现类,在DAO实现类中封装Hibernate API完成数据库的交互。由于每个实体类都具有保存、删除、修改、按id查找、查找全部等共性持久化逻辑,为了将这些共性操作合并,同时减少持久化代码的冗余度,设计了图6所示的持久层逻辑结构。其中BaseDao是采用泛型技术设计的所有DAO的父接口,其中封装了所有实体类共有的持久化方法。泛型类BaseDaoImp是BaseDao的实现类,通过关联的SessionFactory对象来获取Hibernate的Session对象实现相关的持久化逻辑;在框架集成阶段已经将SessionFactory对象配置好了,所以通过@Resource注解表明从IOC容器获取SessionFactory。具体DAO接口从BaseDao继承,具体DAO接口的实现类继承BaseDaoImp并添加@Repository注解。
图5 综合指标实体类关系
图6 持久层逻辑结构
(3)在业务逻辑层定义Service接口和对应的Service实现类,Service实现类中通过注解声明所依赖的DAO接口。通过Spring的依赖注入在运行时创建DAO实现类对象,供Service调用。
(4)在控制层定义Action组件并在Struts2的XML文件中配置。在Action中通过@Resource注解声明所依赖的业务逻辑层对象,利用json-lib API封装JSON格式的数据,通过Easy UI的Ajax异步处理JSON数据,达到Web页面无刷新地实现数据管理及访问[14-16]。
(5)在表示层创建JSP页面,通过taglib指令引入Struts2标签库,通过Script标签引入Easy UI对应的JS文件。利用CSS+Div进行页面布局,通过Easy UI标签提供数据输入和显示。创建JS文件完成对应Easy UI控件的编程,并以Ajax方式发送请求给Action。
该框架投入使用以来顺利完成了咸阳师范学院2016年的目标考核工作。实现了考核任务下达、任务完成数据上传、任务审核、考核结果计算等工作的网络化管理,在相关职能部门和各二级学院之间达到了任务透明、数据共享的目的。同时为学校其他工作提供了方便获取数据的途径,例如科技处就可以从该框架导出年度学校科研数据上报教育部;在教师职称评审工作中,教务处可以通过该框架快速审核教师教学工作量等等。由于采用Java EE轻量级框架并以分层模型为基础,所以当需求变更时,只需少量代码修改即可进行功能扩展。例如,2017年的目标考核工作将学生、党建模块的任务下达和审核都交给了相关职能部门完成,所以框架只需在权限模块进行适当调整,即可满足用户需求。各高校的目标考核工作大致相同,主要区别在于考核具体指标不同,框架提供了指标管理模块,所以只需调整考核内容,即可轻松地移植到其他学校的考核工作中。
在分析高等院校目标考核管理业务流程的基础上,结合MVC设计模式与分层架构,提出了一种目标考核信息化框架设计方案。该方案提高了考核过程中目标任务数据管理的精度,达到了职能部门与各二级学院之间数据及时更新与共享的目的,满足了目标考核过程中的业务需求。该框架实施运行以来,得到了高校用户较好的满意度。下一步的研究方向是在该框架基础上考虑与高校的其他管理信息系统进行整合,在不同系统之间消除数据冗余;在考核对象方面,加入二级学院内部按教师岗位类别进行任务考核。