■宋寧琳
本文研究了一般公文管理系統(tǒng)中普遍需要實(shí)現(xiàn)的三個(gè)核心功能,分別是權(quán)限控制機(jī)制、公文群發(fā)機(jī)制和簽收機(jī)制,通過探討能夠使大家更深入的了解公文管理軟件的精髓。
隨著信息化時(shí)代的高速發(fā)展,基于網(wǎng)絡(luò)的信息管理平臺(tái)大量涌現(xiàn),給傳統(tǒng)的工作方式帶來了革命性變化。在各政府機(jī)關(guān)、企事業(yè)單位中,以公文流轉(zhuǎn)為核心的web辦公自動(dòng)化系統(tǒng)(OA)應(yīng)用已較為廣泛。于此同時(shí),也涌現(xiàn)出很多公文管理軟件,它們的功能各有特色,但其核心功能都是相似的。本文希望通過權(quán)限控制機(jī)制的實(shí)現(xiàn)、公文群發(fā)機(jī)制和簽收機(jī)制探討能夠使大家更深入的了解公文管理軟件的精髓。
在介紹三種關(guān)鍵技術(shù)之前,首先介紹一下本系統(tǒng)的開發(fā)平臺(tái)。本系統(tǒng)的軟件平臺(tái)采用開源的LAMP組合技術(shù),并使用免費(fèi)的Ajax類庫(kù)XAjax實(shí)現(xiàn)部分異步通信功能。服務(wù)器主要軟件配置如下:
(1)服務(wù)器操作系統(tǒng)采用Linux系統(tǒng),版本為Red Hat Enterprise Linux 5.0,其內(nèi)核為2.6.18,具有支持Xen虛擬化技術(shù),集群存儲(chǔ)等。
(2)Web發(fā)布軟件采用Apache,其版本為2.2。
(3)系統(tǒng)開發(fā)語言采用PHP,其版本為5.2.6。
(4)網(wǎng)絡(luò)數(shù)據(jù)庫(kù)采用MySQL,其版本為5.0.21。
(5)異步通信采用XAjax。
(1)權(quán)限存儲(chǔ)策略
本系統(tǒng)中,用戶權(quán)限控制是實(shí)現(xiàn)整個(gè)系統(tǒng)正常操作流程的重要基礎(chǔ)和技術(shù)重點(diǎn)。下面從權(quán)限的存儲(chǔ)策略、權(quán)限驗(yàn)證策略、技術(shù)實(shí)現(xiàn)三個(gè)方面介紹本用戶權(quán)限控制機(jī)制的原理。
首先將抽象的“權(quán)限”概念具體化,將系統(tǒng)中所有需要經(jīng)過權(quán)限認(rèn)證才能進(jìn)行的操作進(jìn)行分類、細(xì)化,概括成若干個(gè)獨(dú)立的、具體的權(quán)限。給出權(quán)限的文字描述,實(shí)現(xiàn)權(quán)限和程序之間的一一對(duì)應(yīng)。并對(duì)每個(gè)權(quán)限進(jìn)行編號(hào)。本系統(tǒng)的權(quán)限設(shè)置和編號(hào)情況如圖所示。權(quán)限編號(hào)完畢后,將權(quán)限編號(hào)、權(quán)限名稱、權(quán)限描述存入一個(gè)配置文件中。配置文件主要包括高級(jí)用戶管理權(quán)限、普通用戶管理權(quán)限、個(gè)人帳號(hào)管理、自定義發(fā)文群組管理、審批發(fā)文群組、內(nèi)部發(fā)文群組管理、公共普發(fā)信息管理和手機(jī)短信管理等內(nèi)容。
在用戶基本信息表中,設(shè)置一個(gè)專用字段privlist,類型為text,可以支持極高長(zhǎng)度的文本,本字段用于存放本用戶的權(quán)限列表。在用戶權(quán)限設(shè)置頁(yè)面中,使用PHP的文本操作函數(shù)庫(kù),打開本配置文件,使用循環(huán)逐行讀取文件內(nèi)容,然后使用字符串處理函數(shù)將一行內(nèi)容分割為數(shù)組,然后將當(dāng)前權(quán)限輸出。
(2)權(quán)限驗(yàn)證策略
在這里,設(shè)計(jì)一個(gè)專門的PHP函數(shù)實(shí)現(xiàn)權(quán)限驗(yàn)證。
Boolean function checkpriv($privid);
本函數(shù)接收一個(gè)權(quán)限ID,判斷當(dāng)前登錄的用戶是否具有此權(quán)限。其方法是:
①檢查$privid是否大于0,是則進(jìn)入②,否則返回false;
②從SESSION中取出當(dāng)前登錄用戶的privlist,使用explode()函數(shù)將其處理成數(shù)組。
$arr=explode(“|”,$privlist);
③使用in_array()函數(shù)判斷$privid是否是$arr中的一個(gè)元素,如果是則返回true,否則返回false;
④函數(shù)結(jié)束。
(3)技術(shù)實(shí)現(xiàn)
①PHP讀取文本類型的配置文件。本操作使用PHP提供的文件操作函數(shù),打開文本文件流,每次讀取一行,循環(huán)處理直至文件末尾。具體實(shí)現(xiàn)代碼概要如下:
②前臺(tái)用戶權(quán)限的序列化。在用戶權(quán)限設(shè)置、修改等頁(yè)面中,需要將所有權(quán)限以下拉列表方式列出,管理員對(duì)用戶的權(quán)限進(jìn)行增刪操作,操作完畢后點(diǎn)擊提交。在點(diǎn)擊提交之后和發(fā)生提交之前,使用Javascript將所有已選權(quán)限(列在一個(gè)動(dòng)態(tài)的下拉列表中)序列化為一個(gè)以“|”分割的字符串,并將這個(gè)字符串賦值給一個(gè)事先設(shè)置好的hidden表單中,與整個(gè)表單值一起提交到服務(wù)器。這個(gè)Javascript函數(shù)的技術(shù)實(shí)現(xiàn)如下:
其他技術(shù)實(shí)現(xiàn)細(xì)節(jié)不再贅述。
(1)公文群發(fā)機(jī)制的實(shí)現(xiàn)
一般而言,在Web系統(tǒng)設(shè)計(jì)中,對(duì)于群發(fā)信息一般采取兩種方式:一種是向每個(gè)用戶發(fā)送一份信息的拷貝。一旦發(fā)出無法撤回,接收者可以對(duì)信息進(jìn)行各種操作包括刪除,這種機(jī)制類似于電子信箱。這種方式下發(fā)送者無法或者很難掌握已發(fā)出信息的狀態(tài)。第二種方式是只在服務(wù)器上存儲(chǔ)一份信息的拷貝,所有用戶共用這個(gè)拷貝。這種方式的好處是可以大大減少存儲(chǔ)空間,同時(shí)便于管理,發(fā)送者可以隨時(shí)跟蹤所發(fā)信息的狀態(tài)。
根據(jù)系統(tǒng)需求等綜合考慮,本系統(tǒng)采用后一種方式開發(fā)。在具體實(shí)現(xiàn)上,為每一個(gè)文件設(shè)置一個(gè)memberlist字段和一個(gè)responlist字段。Memberlist字段用來存儲(chǔ)所有收文用戶的ID序列,responlist存儲(chǔ)未簽收的用戶ID序列。按以下步驟進(jìn)行發(fā)文操作:
①發(fā)送公文第一步,輸入公文基本屬性(標(biāo)題、文號(hào)、內(nèi)容等)。點(diǎn)擊提交后將本基本信息插入公文數(shù)據(jù)表,在公文數(shù)據(jù)表中插入一條新記錄,產(chǎn)生本文件的唯一編號(hào)(ID),并將文件狀態(tài)初始化為1(編輯狀態(tài))。并將文件ID傳入下一步。
②發(fā)送公文第二步,添加和編輯附件。在附件設(shè)置完畢后,根據(jù)上一步傳遞過來的文件ID,將附件信息寫入附件數(shù)據(jù)表,并繼續(xù)將文件ID傳入下一步。
③發(fā)送公文第三步,選擇收文用戶。用戶選擇方式仍采用下拉列表,允許按不同群組選擇。用戶選擇完畢后,生成用戶ID的字符串(與權(quán)限管理功能原理相同),將字符串存入本文件的memberlist字段,同時(shí)將responlist字段也初始化為同樣的值。繼續(xù)將文件ID傳入下一步。
④確認(rèn)發(fā)文。提示用戶是否確認(rèn)發(fā)送文件,如果確定,則將文件的狀態(tài)更新為2(已發(fā)送),并將發(fā)文時(shí)間字段更新為當(dāng)前時(shí)間。如果否,則轉(zhuǎn)入草稿箱。
⑤提示用戶是否發(fā)送短信通知。如果是,則發(fā)送短信,否則不發(fā)送。
由于所有收文用戶的ID都被存儲(chǔ)在了文件的memberlist字段中,因此實(shí)現(xiàn)了集約式的公文群發(fā)。用戶只需通過必要的操作檢索數(shù)據(jù)庫(kù),即可知道哪些公文是發(fā)送給自己的。
(2)公文簽收機(jī)制的實(shí)現(xiàn)
對(duì)終端用戶而言,收文分為未讀文件、已讀文件和全部文件三種情況。收文按照以下思路和步驟進(jìn)行:
①?gòu)腟ESSION中取得當(dāng)前用戶的ID。
②查詢文件數(shù)據(jù)表,根據(jù)查詢文件類型不同,分為三種方式:
未讀文件:搜索memberlist中包含ID、responlist中也包含ID的記錄。對(duì)應(yīng)的SQL概念語句為:select[]from[]where LOCATE(‘|用戶ID|’,memberlist)!=-1 and LOCATE(‘|用戶ID|’,responlist)!=-1 ……
已讀文件:搜索memberlist中包含ID,responlist中不包含ID的記錄。對(duì)應(yīng)的SQL概念語句為:select[]from[]where LOCATE(‘|用戶ID|’,memberlist)!=-1 and LOCATE(‘|用戶ID|’,responlist)=-1 ……
全部文件:搜索memberlist中包含ID的記錄。對(duì)應(yīng)的SQL概念語句為:select[]from[]where LOCATE(‘|用戶ID|’,memberlist)!=-1……
③循環(huán)輸出文件列表。
④收文結(jié)束。
未讀文件的簽收方法為:使用REPLACE語句,對(duì)文件數(shù)據(jù)表中指定文件的responlist值進(jìn)行替換,將當(dāng)前用戶ID替換為空。其對(duì)應(yīng)的SQL概念語句為;
UPDATE[]set responlist=REPLACE(‘|用戶ID|’,’’,responlist)where id=文件ID
在本文中,作者研究了基于B/S模式的公文系統(tǒng)中的三項(xiàng)重要技術(shù),很好的解決了開發(fā)中的難題,其中運(yùn)用到了PHP腳本語言和SQL語言,因此該模塊具有良好的跨平臺(tái)性,特別是權(quán)限控制,為開發(fā)其他的管理信息系統(tǒng)提供了很好的參考價(jià)值。
[1]張玉琢.基于軟件體系結(jié)構(gòu)的軟件重用技術(shù)[J].云南:云南師范大學(xué)學(xué)報(bào)(自然科學(xué)版),1999(06).
[2]聶慶鵬,毛書朋.PHP+MySQL動(dòng)態(tài)網(wǎng)站開發(fā)與全程實(shí)例[M].北京:清華大學(xué)出版社,2007.
[3]劉新濤.軟件體系結(jié)構(gòu)分析與評(píng)估方法研究[D].哈爾濱:哈爾濱工程大學(xué),2006.