■宋寧琳
本文研究了一般公文管理系統中普遍需要實現的三個核心功能,分別是權限控制機制、公文群發機制和簽收機制,通過探討能夠使大家更深入的了解公文管理軟件的精髓。
隨著信息化時代的高速發展,基于網絡的信息管理平臺大量涌現,給傳統的工作方式帶來了革命性變化。在各政府機關、企事業單位中,以公文流轉為核心的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.