作者:陳明山 / 前臺灣大學計算機及資訊網路中心程式設計組程式設計師
本文介紹15種應用系統常見的模組,上期簡單介紹其中7種,接續上一期的介紹,我們要繼續介紹其餘的模組:產生pdf檔、傳送郵件、資料加密、使用者權限設定、系統文件、多國語、排程工作、工作流程。
8. 產生pdf檔:
在許多時候,你會需要產生pdf檔案,可能是因為使用者無法修改它的內容,所以感覺上安全性高一點。或許你可以請用戶把資料列印到單機上面的pdf printer,但對於一個好的應用系統而言,這不是很好的解決方式。Flex雖然是Adobe的產品,但它無法直接將資料輸出成pdf檔案,我們只能在後端程式產生pdf檔案,再回傳到前端。
市面上有許多免費或是付費的轉換程式,可以把你的Word、Excel、Html檔案轉換成pdf檔,聽起來好像很理想,但是轉換的成功率和中文碼可能會是一個問題。一般而言,愈複雜的檔案,轉換的成功率愈低。在這裡我們用的是另外一種方式:iText,感謝Bruno Lowagie發展並且開放這個公用程式,使用它的原因是因為它是免費的,而且多數人使用,並且提供完整的功能。
iText是一個底層的公用程式,允許你撰寫程式碼呼叫它來產生更種pdf元素,像是:文字、圖片、線、表格、標題、框線,以及設定這些元素的各種屬性。針對不同的開發工具,你需要選擇不同的iText版本來使用,對於c#,你必須使用iTextSharp:http://itextsharp.sourceforge.net/
在實作上,你可以撰寫一個產生pdf檔案的engine,輸入的內容是一個包含pdf各種元素及屬性的文字檔,其中的屬性包含元素種類、座標、大小、字型,輸出則是一個pdf檔案。更進一步的做法是實作一個pdf編輯器,利用圖形化介面來設定pdf檔案所包含的各種元素及其屬性,並存成文字檔,做為pdf engine的來源檔案。
9. 傳送郵件:
郵件具有主動通知使用者的功能,在時效上有很好的即時性,十分方便,我們可以在下列情形下使用:
(1).系統發生異常時,通知管理者。異常的原因可能是:使用者不正常操作、系統執行結果異常、異常登入、狀況監控。
(2).將執行結果通知業務承辦人
(3).在工作流程中,通知下一個關卡的負責人
實作的步驟如下:
(1).使用IIS上面的SMTP Server來傳郵件
(2).設定IIS的SMTP Server轉接限制,如下圖:
(3).在web.config加上以下敍述:
(4).撰寫後端程式碼呼叫System.Net.Mail類別來傳送郵件。
10. 資料加密:
資料加密在Internet上十分重要,稍具電腦能力的人利用一個簡單的Browser Proxy軟體,就可以攔截應用系統所傳遞的參數,並加以修改,造成破壞。前端的資料要傳送前先經過加密,再送到後端解密,以確保在任何一過程被攔截到的都是加密過的資料,一經修改則無法正常解密。目前在這個領域具備良好安全性以及普遍使用的加密方式是AES 256(Advanced Encryption Standard 256 bits)。
在實作上,你需要一組可以被 Flex ActionScript 呼叫的加解密公用程式,在這裡我們使用的是 Mika Palmu 所開發的公用程式:
http://ryoushin.com/cmerighi/en-us/42,2007-03-02/AES-Rijndael_with_ActionScript_and_ASP_Net.aspx
或是Google:Mika Palmu AES,你可以找到相關的資料。在後端則是使用System.Security.Cryptography 類別來加解密。
11. 使用者權限設定:
除非是很簡單的系統,不然一個多人使用的系統都會需要這個功能來設定使用者對所有程式的執行權限,這裡的權限包括:使用者是否可以執行某個程式的功能,以及使用者是否可以對某一筆資料執行這些功能。在考慮系統實際運作的情形後,我們設計的方式是先設定每個使用者所擁有的角色清單,再設定每個角色對所有程式的執行權限。
下圖是角色對於程式的設定畫面:
在圖中我們設定某個角色對於所有程式的執行權限,這些權限包括:新增、查詢、修改、刪除、列印、檢視、匯出等功能,其中新增和匯出為CheckBox欄位,其餘為ComboBox欄位,它的下拉式清單包含:個人、所屬部門、管轄部門、全部,表示使用者可以存取4個等級的資料範圍。
12. 系統文件:
這裡的系統文件包括:系統使用手冊、資料庫文件和API文件。系統使用手冊雖然不是必要的,但是可以幫系統加分,增加系統的完整性。手冊內容是否編寫良好會影響到用戶使用的意願以及系統的整體形象。在開發系統的過程中,可能因為人力不足或是時程的因素,時常忽略系統使用手冊這一部分,其實有簡單又完整的作法,歸納如下:
(1).為每個程式編寫使用手冊,並且儲存成獨立的html檔案,方便在系統的任何地方開啟。
(2).使用手冊的內容包含程式的用途和操作畫面,畫面上的欄位視需要做說明。
(3).系統的商業規則大多是歸納到程式或是欄位,在開發的過程中將這些規則寫入手冊。
再來是資料庫文件,它用來記錄資料表欄位的用途以及重要的說明,在開發系統時,程式設計師手上需要一份,但是資料那裡來? 或許你可以用Word或是Excel來編寫,但是時間久了,資料的正確性會隨著資料庫的異動而愈來愈低。這裡建議的方式是寫一個程式,並且納入以下的功能:
(1).讀取資料庫系統裡面的欄位結構到另一資料庫,然後開放使用者編輯欄位的說明
(2).將欄位結構同步到資料庫
(3).列印資料庫文件
最後是API文件,由於我們時常會需要用到別人開發的程式,一般是元件或是公用程式,如果有了這些程式的API文件則可以幫助我們更快了解它們的使用方法。這一類的文件並不需要我們額外花時間編寫,在撰寫程式的過程中我們經常會寫註解,只要遵循幾個簡單的規則,就可以用一些免費的工具把這些註解轉換成方便閱讀的API文件。
這裡介紹2種用來產生Flex ActionScript文件的工具:ASDoc、ZenDoc
ASDoc是Adobe的產品,在你安裝Flex Builder時會一起安裝進去,它是command line模式的工具,你可以撰寫bat檔來設定各種參數,執行時,它會做嚴謹的語法檢查,如果沒有通過則不會順利產生文件。這也是為什麼要介紹第2種工具的原因,如果你無法用ASDoc產生文件,又找不出原因,那麼可以嘗試ZenDoc,它是一個免費軟體,使用前必須先安裝php,通常都可以順利產生文件,只是文件裡面的屬性和函數不會按照字母排序,在尋找時會比較不方便。
同樣的,後端的c#程式我們可以使用SandCastle這個免費軟體來產生文件。
13. 多國語:
Flex提供一個多國語的機制,讓你可以在程式中的任何地方變換顯示的語系,以建置中英文語系為例,它的步驟如下:
(1).在Flex Command Prompt下執行CopyLocale en_US zh_TW
(2).設定Project編譯選項為 -locale=zh_TW,en_US -source-path=../locale/{locale}
(3).建立每個語系的Resource檔案,並且設定它們的encoding屬性為utf-8
(4).Binding Resource File,在Flex mxml裡面加入以下敍述:
(5).設定多國語物件的顯示文字為ResourceManager.getInstance().getString(ps_file, ps_key);
(6).使用下列語法來選用語系:resourceManager.localeChain = [your language];
在實作第(5)個步驟時,你會發現Design Mode底下的Flex檔案,在外觀上已經被改變,欄位的位置受到擠壓,不方便再做版面的安排,這並不會影響執行時操作畫面的外觀,但如果你還是很在意的話,那麼你可以撰寫程式直接改變這些物件的顯示文字,而不使用Binding的方式。
14. 排程工作:
排程工作或是稱做Scheduler、Cron,是一種在固定時間自動執行的程式,在應用上,大多用來執行下列功能:
(1).佔用太多主機資源的程式
(2).固定時間執行的程式,例如清理磁碟空間
(3).使用者的週期性報表
在實作上,你可以在Windows作業系統下新增一個排程工作,步驟如下:
(1).控制台→排定的工作→新增排定的工作
(2).選擇Internet Explorer為執行的程式
(3).設定執行的時間週期
(4).修改所要執行的程式,把網址加在 …\iexplorer.exe後面,做為傳入的參數,讓排程程式開啟IE後直接執行這個網頁程式,這個程式是你所撰寫的後端程式,格式可以是.aspx或是.ashx
(5).設定屬性讓排程工作在10分鐘後自動關閉視窗,如下圖:
15. 工作流程:
比爾蓋茲在數位神經系統(Digital Nervous System) 這本書中提到:「數位神經系統包括數位流程,讓企業藉此了解環境並做出回應…」,數位流程即是工作流程,它是打造數位神經系統最關鍵的元素,能讓一個應用系統具備像人類的神經一樣的功能,對周圍的變化做出回應,讓企業可以在最短的時間內提出應變的措施。它可以串聯2個不同的工作,藉由這樣的延伸,打造出一個神經網路,但實際上不會有太複雜的網路,我們常見的請假系統、公文系統即是數位神經系統的實現。
在實作上,工作流程包含以下幾個部分:
(1).流程編輯器,用來設定流程在程式之間行走的路徑和條件
(2).流程相關資料表,用來儲存第(1)項的設定
(3).流程公用程式,資料異動時,讀取第(2)項資料,並且傳送工作到下一個關卡
工作流程只是應用系統的一部分,不是全部,具備流程功能的程式可能只佔全部程式的2至3成,所以在這裡建議的方式是把流程的功能加到所需要的程式裡面,這樣程式可以用原來的方式撰寫,不必為了流程而改變。
以上所介紹的模組,應該已經包括一般應用系統所需要模組的八成,應用系統的開發看似簡單,事實上暗藏玄機,成功的關鍵其實只有一個字:Framework。