基于Django的高校合同制人员管理系统
2015-12-02陈红茜孟超英邱小彬王笑娟
陈红茜 孟超英, 邱小彬, 王笑娟, 李 辉
(1.中国农业大学网络中心,北京 100083;2.中国农业大学信息与电气工程学院,北京 100083)
0 引 言
“高校合同制人员”主要是指经双方协商后被学校或学校内部单位聘用,由学校或学校内部单位支付报酬,签订劳动合同,提供劳动服务的事业编制外工作人员[1].随着我国高校规模的不断壮大,以及社会经济的快速发展,高校各领域的工作已经无法仅仅依赖在编人员,为了学校更好地发展,将大量聘用各类专业的合同制人员.高校通过聘用劳动合同制人员可以有效解决人力资源总量不足问题,保证教学、科研和后勤等工作的顺利开展.
近年来高校中合同制人员队伍不断庞大,管理上的问题日益突出,虽然这些人员信息以纸质的形式登记在册,但由于该类人员流动性极大,通过纸质文件的方式很难做到及时有效的管理.而且目前部分高校建设的合同制人员管理系统大多采用的C/S(client/server)模式,功能单一,造成系统的维护升级不方便、系统资源冗余,影响着信息处理的效率.近年来发展起来的B/S(brower/server)模式扩充了信息处理和交换共享上的灵活性,为不同系统的集成提供了一种途径,利用它可以实现跨平台、可互操作的分布式应用,并且可以兼顾现有系统的可重用性.
同时,网络技术的发展使Web语言发展迅速,Django框架所具有的平台独立性等特性使其具有更广泛的访问范围、平衡高效的计算负荷以及良好的可扩展性等,可以实现与Web中的其他信息服务进行无缝集成,建立灵活多样的应用,并可实现移动化的访问[2].
本文设计并实现了基于Django框架的高校合同制人员管理系统,以强大的开源框架和MVC模式为支持,通过B/S模式实现了人员基础信息管理、人员变动流程管理和社保管理等功能.
1 Django框架概述
Django是一个开源的Web应用框架,由Python写成.采用MVC的软件设计模式,即模型M、视图V和控制器C[3].Python是开源、跨平台、面向对象和解释型的动态脚本语言,它有强大的标准库,还拥有Python社区贡献的功能丰富的第三方模块[4].
Django框架的主要特点[5].
(1)可插入(Plug-in)管理的Application:Django提供了一个强大的命令行工具djangoadmin可以帮用户完成大量的初始化及有关数据库方面的工作.
(2)对象相关的映射:完全在Python中定义数据模型.可以免费得到一个丰富的,动态访问数据库的API——但如果需要仍然可以写SQL语句.
(3)URL分发:URL的设计漂亮,cruft-free没有框架的特定限定.
(4)模版系统:用Django强大而可扩展的模板语言来分隔设计、内容和Python代码.
(5)Cache系统:可挂在内存缓冲或其他的框架实现超级缓冲——实现所需要的粒度.
(6)支持多种数据库:已经支持Postgresql、MySQL、SQLite3和Oracle等数据库.
2 系统设计
目前,高校劳动合同制人员规模庞大,人员复杂,岗位分散,流动性强,且无法沿用传统事业单位人员管理模式,统一管理难度极大[6].为了进一步规范和加强合同制人员基本信息和社保信息管理,开发了基于Django的高校合同制人员管理系统,借助最新的计算机网络技术和信息技术为合同制人员管理工作提供了强有力的支持.
2.1 系统业务流程
高校合同制人员类型较多,但基本采用两级管理模式,即人事处管理员和单位管理员.下面以高层次人才派遣人员为例说明流程(见图1).
图1 高层次人才派遣业务流程
各单位需要进人时,先填写进人审批表,说明进人理由、岗位、人数等,通过系统提交给人事处管理员审核,若审核不通过,各单位再按照规定提交新的进人审批表,如果通过审核,用人单位即可在线导入或录入新进合同制人员信息,由人事处管理员审核该人员信息并补充其他相关信息.该新进人员正式入校后,各单位管理员可以导出并打印合同制人员名单,人事处管理员可以按月维护合同制人员的工资和保险信息.该人员离校后,将其移动至已退人员库中,但其所有的相关信息和缴费记录都会记录在案.
2.2 系统功能结构
该系统实现的功能目标如下:
(1)严格高校各类合同制人员的管理流程,确保管理的规范化和制度化
通过建立人员审批表管理模块和人员管理模块,对整个人员管理流程实行统一化规范化的管理,同时确保每类人员都能够按照流程办事,单位管理员填写审批表、人员基本信息,人事处管理员审核审批表和人员信息,切实做到集中规范管理.
(2)实现单位管理和在线网上办公
对于单位管理员来说,可以直接通过系统完成审批表的上报,各类人员信息的填写,并能实现对填写字段的自动校验,确保输入的规范和正确.人事处管理员能够直接从网上对各项信息进行审核,真正实现了在线办公.
(3)详尽完备的人员查询和汇总功能,充分解放复杂的人力劳动
合同制人员的流动性特别大,如果人工对各类人员信息进行查询汇总工作是相当复杂的,同时要详细查找某个单位的特定人员情况也相当麻烦,通过此系统就能够方便的根据这个人的姓名,身份证号等个人信息找到相关人员,查看他的详细信息.
(4)提升系统数据库的安全性
采用可靠的安全策略,采用B/S三层架构,实现用户层、业务逻辑、数据资源层的分离,并采用先进的登录身份认证机制,大大降低系统被攻击的可能性,保证系统的安全性.
系统各功能模块如下图所示:
图2 功能结构图
2.3 系统体系结构
分层是现代软件系统的基本架构,通过分层可以达到良好的可扩展性和可维护性.在分层架构中,每一个层都是一个相对独立的逻辑层面,专注于实现系统某一个方面的功能,并且拥有一个较为清晰和严格的逻辑边界.层与层之间既相互独立又相互联系,下层为上层提供服务,上层调用下层的服务并为它的上层提供服务,一个层的变化对其他层是透明的,从而实现了系统的高内聚、低耦合.本系统采用分层思想进行设计,充分考虑了未来扩展的可能性,有利于系统的维护和升级.
系统结构的设计结合了Django开源框架、B/S模式、Ajax、RIA各种开源框架,层次结构如下图所示,分别为:表示层、业务逻辑层、数据持久层和数据资源层.
图3 系统体系结构
(1)表示层是用户界面层,WebUI采用ExtJS类库进行开发,通过Ajax与服务器端交互,实现单页面Web应用程序(所有的业务功能在一个页面实现),具有很强的交互性和用户友好性.用户通过Web浏览器来与服务器进行交互,获得自己所需的信息.
(2)业务逻辑层是系统的核心层次,完成系统的所有业务功能,主要是Web服务器,同时还包括合同制人员管理所需要的专业化的服务和构件,包括:人员管理构件、信息查询统计构件、审批表管理构件和用户权限管理构件.
(3)数据持久层是对底层数据库的抽象,是一个专注于数据持久化的逻辑层面,向业务逻辑层提供对底层数据库访问的统一的接口.
(4)数据资源层集成各种异构数据源向上层提供数据,是数据承载的实体.包括用户权限数据库、人员信息数据库、审批表信息数据库以及各类文件.
3 系统实现
由于开源软件具有自由分发、自由集成、公布源代码等优点,为了做大限度的降低风险和提高质量,系统应用了诸多开源框架,并对这些开源框架进行扩展、定制.
系统完全基于MVC模式,将业务逻辑、显示逻辑和数据逻辑完全解耦,有利于系统的维护和扩展.在WebUI方面,采用ExtJS框架,增强了系统的交互性和展现能力.选用Django作为Web框架,便于和其他框架集成,同时可以利用其提供的基础设施加速开发.数据持久层使用SQLAlchemy框架,通过ORM简化开发过程,同时内置数据库连接池,可以减少与数据库的交互,同时框架对数据库抽象,便于在多种不同数据库间迁移.由于系统涉及大量的基础数据,因此在数据库系统方面选用业界认可的MySQL.系统会有大量的动态计算以及页面渲染,所以通过Memcached分布式缓存减少此类开销.同时,对于系统涉及到的各种列表等,通过引入K-V存储redis进行解决.
3.1 ExtJS模块按需加载机制
基于效率和资源优先的原则,WebUI的所有模块都是按需加载的,所有的模块的源文件只有在调用该模块时,才会通过Ajax向服务器请求,进行加载,这样充分利用了网络带宽,又降低了客户端浏览器的资源负载.
首先,将每个组件划分成一个模块,存于一个js文件,通过json格式的配置文件(或者是配置字符串)对系统的各个模块进行配置.每个模块对应一个菜单项,当点击该菜单项时,如果该模块尚未加载,则通过Ajax请求后端,返回后进行渲染并将该组件添加到主容器中;如果该模块已经加载,那么该组件已在当前用户虚拟机中,直接实例化即可.
上图是json格式的模块配置文件,每个模块具有一个id,用以标识该模块.同时,leaf字段指定是否为子菜单,通过将其设置为false支持多级菜单.text是菜单项的名字.LinkUrl是该菜单项对应的模块的文件的请求路径,在菜单项是一个远程模块时有效.type表示该菜单项的类型,取值包括:constructor,remote,constructor表示模块对应的文件已经加载,直接初始化即可,remote表示需要远程请求该模块文件.最后,params是模块对应的初始化参数.
通过上述模块机制,可以大幅提高模块的复用性,同时也便于实现模块的按需加载.
3.2 审批表和人员审批实现
当一个对象的状态涉及到多张数据表时,那么此对象的更新和查询都会变得相对复杂一些,所以需要一张简洁的方式来实现此类对象的更新和查询.
本系统中,人员的审批状态就存在于多张表中,包括审批表数据表、人员数据表和保险数据表.为了集中处理,采用MySQL的bin log监控的方式实现数据更新.通过开源的python-mysql-replication库实现对mysql监控,然后将数据写入redis列表.
图4 json配置文件
图5 mysql bin log监控示意图
如上图所示,监控3张表的变化,模块以事件方式实现,需要注册某个表事件发生时的处理器.与触发器类似,对于数据表的insert事件将插入的数据传入,对于update事件会传入修改前和修改后的数据.在相应表的事件处理器中,根据数据变化修改redis列表.前端的查询不直接操作mysql,而是更轻量级的redis,更加高效.
通过上述方式,实现对分散在多张表状态的更新、查询,相对于直接操作MySQL,更加直观、高效.
2.3 人员信息导入
为了便于和其他系统对接,系统支持人员信息的导入,支持excel文件,并且支持数据类型校验和数据范围校验.
通过字段信息描述导入的文件,具体如下:
图6 导入代码
每个字段会有一个字典用于描述其元信息,包括:index该字段在excel表格中的列下标,type该字段的类型,range该字段的取值范围.
在遍历excel的每一行时,依次遍历所有字段信息,获取对应列的值,进行类型转换,然后判断是否在取值范围内.所有行遍历完后,将出错信息返回给前端.
4 总 结
本文提出了基于Django的高校合同制人员管理系统设计和实现,在此基础上结合目前高校合同制人员管理的需求开发了该系统.与目前现有合同制人员管理系统相比,本系统采用Django框架开发,不仅大大提升了开发效率,而且降低了客户端的负载,实现了面向Internet的分布式计算,有利于高校领导层快速获取到学校合同制人员的基本信息和保险等多方面信息.本系统以合同制人员科学管理为导向,结合了合同制人员结构复杂的特点,利用高校对多类型合同制人员进行统筹管理.
目前该系统已经在多个高校应用,结果表明本系统在提高工作效率、科学管理等方面发挥了较好的作用.
[1] 周强,周敏.高校临时聘用人员管理现状及对策[J].高教高职研究,2009(9):188-190.
[2] 徐旭明.Django web开发指南[M].北京:机械工程出版社,2009.
[3] http://zh.wikipedia.org/wiki/Django.
[4] Wesley J Chun.Core Python Programming[M].USA:Prentice Hall,2007:1-823.
[5] 王晓斌,闫果.基于Django开发的桥梁健康监测数据查询的web应用[J].电子技术与软件工程,2009,24(4):231.
[6] 陈静源.高校非事业编制职工劳动关系若干问题探究[J].浙江师范大学学报(社会科学版),2010(7):23-24.