本文研究了一般公文管理系统中普遍需要实现的三个核心功能,分别是权限控制机制、公文群发机制和签收机制,通过探讨能够使大家更深入的了解公文管理软件的精髓。
一、引言
随着信息化时代的高速发展,基于网络的信息管理平台大量涌现,给传统的工作方式带来了革命性变化。在各政府机关、企事业单位中,以公文流转为核心的web办公自动化系统(OA)应用已较为广泛。于此同时,也涌现出很多公文管理软件,它们的功能各有特色,但其核心功能都是相似的。本文希望通过权限控制机制的实现、公文群发机制和签收机制探讨能够使大家更深入的了解公文管理软件的精髓。二、服务器开发平台
在介绍三种关键技术之前,首先介绍一下本系统的开发平台。本系统的软件平台采用开源的LAMP组合技术,并使用免费的Ajax类库XAjax实现部分异步通信功能。服务器主要软件配置如下:(1)服务器操作系统采用Linux系统,版本为Red Hat Enterprise Linux 5.0,其内核为2.6.18,具有支持Xen虚拟化技术,集群存储等。
(2)Web发布软件采用Apache,其版本为2.2。
(3)系统开发语言采用PHP,其版本为5.2.6。
(4)网络数据库采用MySQL,其版本为5.0.21。
(5)异步通信采用XAjax。
三、系统关键技术及实现
(一)用户权限控制机制的实现
(1)权限存储策略本系统中,用户权限控制是实现整个系统正常操作流程的重要基础和技术重点。下面从权限的存储策略、权限验证策略、技术实现三个方面介绍本用户权限控制机制的原理。
首先将抽象的“权限”概念具体化,将系统中所有需要经过权限认证才能进行的操作进行分类、细化,概括成若干个独立的、具体的权限。给出权限的文字描述,实现权限和程序之间的一一对应。并对每个权限进行编号。本系统的权限设置和编号情况如图所示。权限编号完毕后,将权限编号、权限名称、权限描述存入一个配置文件中。配置文件主要包括高级用户管理权限、普通用户管理权限、个人帐号管理、自定义发文群组管理、审批发文群组、内部发文群组管理、公共普发信息管理和手机短信管理等内容。
在用户基本信息表中,设置一个专用字段privlist,类型为text,可以支持极高长度的文本,本字段用于存放本用户的权限列表。在用户权限设置页面中,使用PHP的文本操作函数库,打开本配置文件,使用循环逐行读取文件内容,然后使用字符串处理函数将一行内容分割为数组,然后将当前权限输出。
(2)权限验证策略
在这里,设计一个专门的PHP函数实现权限验证。
Boolean function checkpriv($privid);
本函数接收一个权限ID,判断当前登录的用户是否具有此权限。其方法是:
①检查$privid是否大于0,是则进入②,否则返回false;
②从SESSION中取出当前登录用户的privlist,使用explode()函数将其处理成数组。
$arr=explode(“|”,$privlist);
③使用in_array()函数判断$privid是否是$arr中的一个元素,如果是则返回true,否则返回false;
④函数结束。
(3)技术实现
①PHP读取文本类型的配置文件。本操作使用PHP提供的文件操作函数,打开文本文件流,每次读取一行,循环处理直至文件末尾。具体实现代码概要如下:


②前台用户权限的序列化。在用户权限设置、修改等页面中,需要将所有权限以下拉列表方式列出,管理员对用户的权限进行增删操作,操作完毕后点击提交。在点击提交之后和发生提交之前,使用Javascript将所有已选权限(列在一个动态的下拉列表中)序列化为一个以“|”分割的字符串,并将这个字符串赋值给一个事先设置好的hidden表单中,与整个表单值一起提交到服务器。这个Javascript函数的技术实现如下:

其他技术实现细节不再赘述。
(二)公文群发与签收机制的实现
(1)公文群发机制的实现一般而言,在Web系统设计中,对于群发信息一般采取两种方式:一种是向每个用户发送一份信息的拷贝。一旦发出无法撤回,接收者可以对信息进行各种操作包括删除,这种机制类似于电子信箱。这种方式下发送者无法或者很难掌握已发出信息的状态。第二种方式是只在服务器上存储一份信息的拷贝,所有用户共用这个拷贝。这种方式的好处是可以大大减少存储空间,同时便于管理,发送者可以随时跟踪所发信息的状态。
根据系统需求等综合考虑,本系统采用后一种方式开发。在具体实现上,为每一个文件设置一个memberlist字段和一个responlist字段。Memberlist字段用来存储所有收文用户的ID序列,responlist存储未签收的用户ID序列。按以下步骤进行发文操作:
①发送公文第一步,输入公文基本属性(标题、文号、内容等)。点击提交后将本基本信息插入公文数据表,在公文数据表中插入一条新记录,产生本文件的唯一编号(ID),并将文件状态初始化为1(编辑状态)。并将文件ID传入下一步。
②发送公文第二步,添加和编辑附件。在附件设置完毕后,根据上一步传递过来的文件ID,将附件信息写入附件数据表,并继续将文件ID传入下一步。
③发送公文第三步,选择收文用户。用户选择方式仍采用下拉列表,允许按不同群组选择。用户选择完毕后,生成用户ID的字符串(与权限管理功能原理相同),将字符串存入本文件的memberlist字段,同时将responlist字段也初始化为同样的值。继续将文件ID传入下一步。
④确认发文。提示用户是否确认发送文件,如果确定,则将文件的状态更新为2(已发送),并将发文时间字段更新为当前时间。如果否,则转入草稿箱。
⑤提示用户是否发送短信通知。如果是,则发送短信,否则不发送。
由于所有收文用户的ID都被存储在了文件的memberlist字段中,因此实现了集约式的公文群发。用户只需通过必要的操作检索数据库,即可知道哪些公文是发送给自己的。
(2)公文签收机制的实现
对终端用户而言,收文分为未读文件、已读文件和全部文件三种情况。收文按照以下思路和步骤进行:
①从SESSION中取得当前用户的ID。
②查询文件数据表,根据查询文件类型不同,分为三种方式:
未读文件:搜索memberlist中包含ID、responlist中也包含ID的记录。对应的SQL概念语句为:select[]from[]where LOCATE(‘|用户ID|’,memberlist)!=-1 and LOCATE(‘|用户ID|’,responlist)!=-1 ……
已读文件:搜索memberlist中包含ID,responlist中不包含ID的记录。对应的SQL概念语句为:select[]from[]where LOCATE(‘|用户ID|’,memberlist)!=-1 and LOCATE(‘|用户ID|’,responlist)=-1 ……
全部文件:搜索memberlist中包含ID的记录。对应的SQL概念语句为:select[]from[]where LOCATE(‘|用户ID|’,memberlist)!=-1……
③循环输出文件列表。
④收文结束。
未读文件的签收方法为:使用REPLACE语句,对文件数据表中指定文件的responlist值进行替换,将当前用户ID替换为空。其对应的SQL概念语句为;
UPDATE[]set responlist=REPLACE(‘|用户ID|’,’’,responlist)where id=文件ID
四、结束语
在本文中,作者研究了基于B/S模式的公文系统中的三项重要技术,很好的解决了开发中的难题,其中运用到了PHP脚本语言和SQL语言,因此该模块具有良好的跨平台性,特别是权限控制,为开发其他的管理信息系统提供了很好的参考价值。[1]张玉琢.基于软件体系结构的软件重用技术[J].云南:云南师范大学学报(自然科学版),1999(06).
[2]聂庆鹏,毛书朋.PHP+MySQL动态网站开发与全程实例[M].北京:清华大学出版社,2007.
[3]刘新涛.软件体系结构分析与评估方法研究[D].哈尔滨:哈尔滨工程大学,2006.


最新评论