李營(yíng)那 吳松洋 張 濤 李 勛
(公安部第三研究所 上海 201204)
基于動(dòng)態(tài)標(biāo)簽技術(shù)的信息發(fā)布系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
李營(yíng)那 吳松洋 張 濤*李 勛
(公安部第三研究所 上海 201204)
當(dāng)今信息化時(shí)代,信息發(fā)布系統(tǒng)被廣泛應(yīng)用于社會(huì)各領(lǐng)域、各企事業(yè)單位?,F(xiàn)有的信息發(fā)布系統(tǒng)只能發(fā)布系統(tǒng)已定義類型的信息,如企業(yè)動(dòng)態(tài)、考勤制度等,當(dāng)需要增加新的信息類型時(shí),需要對(duì)系統(tǒng)進(jìn)行重新編碼設(shè)計(jì),現(xiàn)有信息系統(tǒng)的可擴(kuò)展性很差。為此,提出一種基于動(dòng)態(tài)標(biāo)簽技術(shù)的信息發(fā)布系統(tǒng),詳述其設(shè)計(jì)與實(shí)現(xiàn)方法,通過基于MongoDB存儲(chǔ)的動(dòng)態(tài)標(biāo)簽技術(shù)實(shí)現(xiàn)信息類型用戶自定義,用戶可以簡(jiǎn)單、易操作的方式增加新的信息類型,發(fā)布新的信息。實(shí)踐表明,所提出的信息發(fā)布信息具有高度的用戶透明性、業(yè)務(wù)擴(kuò)展性,減低了企事業(yè)單位研發(fā)信息發(fā)布系統(tǒng)的費(fèi)用、時(shí)間和人員。
動(dòng)態(tài)標(biāo)簽技術(shù) MongoDB HTML5 服務(wù)器推送
信息化時(shí)代各領(lǐng)域由通過傳統(tǒng)媒介(報(bào)紙、公文)發(fā)布信息向通過互聯(lián)網(wǎng)發(fā)布信息轉(zhuǎn)變,信息發(fā)布的及時(shí)性已成為衡量一個(gè)企業(yè)競(jìng)爭(zhēng)力的重要指標(biāo)。為了提高自身的實(shí)力,越來越多的企業(yè)開始創(chuàng)建自己的信息發(fā)布系統(tǒng),使企業(yè)信息能夠方便、及時(shí)、高效地發(fā)布,便于企業(yè)員工可以實(shí)時(shí)地瀏覽、下載最新的信息,及時(shí)了解企業(yè)的新動(dòng)態(tài)、新政策,協(xié)助企業(yè)更好地作出決策。
信息發(fā)布系統(tǒng)主要用于在各個(gè)播放端展示預(yù)先制作的包含圖片、視頻、動(dòng)畫等多媒體元素的HTML內(nèi)容[4]。目前信息發(fā)布系統(tǒng)存在以下問題:
(1) 當(dāng)前企業(yè)信息發(fā)布系統(tǒng)只能發(fā)布系統(tǒng)已定義類型的信息如最新資訊、考勤管理、通知公告等,不同類型的信息具有不同的屬性,需分開存儲(chǔ)。隨著企業(yè)業(yè)務(wù)的發(fā)展可能需要增加新的信息類型,此時(shí)需要再次進(jìn)行需求調(diào)研、組織開發(fā),耗費(fèi)大量的時(shí)間、人員,影響企業(yè)的發(fā)展。
(2) 目前信息發(fā)布系統(tǒng)中主流的HTML生成技術(shù)是模板引擎[1,5],賴吉平等[2]提出使用標(biāo)簽解析技術(shù)實(shí)現(xiàn)用戶自定義模板的方法,使用標(biāo)簽解析技術(shù)提取模板內(nèi)與數(shù)據(jù)源交互的字段,將這些字段與模板進(jìn)行整合以實(shí)現(xiàn)標(biāo)簽內(nèi)容的提取、替換。經(jīng)過這些處理生成的HTML頁面即為展示給用戶的信息,但該方法要求用戶有一定的編程基礎(chǔ);朱明[4]使用標(biāo)簽引擎制作HTML頁面,每種媒體元素代表一類標(biāo)簽。
(3) 信息實(shí)時(shí)性不夠,企業(yè)員工主動(dòng)訪問信息發(fā)布系統(tǒng),才可以瀏覽最新的信息,員工不會(huì)時(shí)刻關(guān)注是否有新信息發(fā)布,導(dǎo)致信息滯后,影響工作進(jìn)程。
本文設(shè)計(jì)了一種基于動(dòng)態(tài)標(biāo)簽的信息發(fā)布系統(tǒng),通過充分利用非關(guān)系型數(shù)據(jù)庫MongoDB的數(shù)據(jù)模式自由特性,HTML5服務(wù)器推送事件特性,以及Ajax的交互式數(shù)據(jù)訪問特性,系統(tǒng)解決了上述難題。總體而言,該系統(tǒng)具備如下特點(diǎn)和優(yōu)勢(shì):
(1) 數(shù)據(jù)標(biāo)簽化:系統(tǒng)提供一套與底層存儲(chǔ)相對(duì)應(yīng)的數(shù)據(jù)標(biāo)簽,用戶可使用所見即所得的方式定義數(shù)據(jù)標(biāo)簽,不需要任何編程即可從服務(wù)器數(shù)據(jù)庫把信息讀取出來,并把新信息存儲(chǔ)到服務(wù)器數(shù)據(jù)庫;
(2) 信息類型自由定義:用戶可根據(jù)業(yè)務(wù)需求自由定義需要發(fā)布信息的類型(政策法規(guī)、最新動(dòng)態(tài)、通知公告等)與信息需要展示的內(nèi)容;
(3) 模板可自由定義:用戶可為不同的信息類型定義相應(yīng)的可視化模板;
(4) 基于模板與標(biāo)簽的權(quán)限控制機(jī)制:系統(tǒng)從模板和標(biāo)簽級(jí)別對(duì)數(shù)據(jù)的權(quán)限進(jìn)行控制,從而保證不同用戶組之間信息的訪問安全;
(5) 信息實(shí)時(shí)推送機(jī)制:通過推送機(jī)制使用戶可以實(shí)時(shí)地訪問系統(tǒng)服務(wù)器所發(fā)布的信息,從而避免了傳統(tǒng)方式中客戶端頻繁刷新請(qǐng)求。
1.1 MongoDB
MongoDB是基于分布式文件存儲(chǔ)的NoSQL數(shù)據(jù)庫系統(tǒng),具有可擴(kuò)展、高性能、開源的、模式自由和面向文檔等特性,旨在為Web應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)的解決方案。MongoDB具有以下特性:
文檔型:文檔是MongoDB中基本單位,數(shù)據(jù)以BSON(鍵-值對(duì))形式存儲(chǔ)在文檔中,鍵是字符串,值為任意數(shù)據(jù)類型如字符串、整形、用戶定義的對(duì)象等[9];
面向集合:文檔數(shù)據(jù)被分組存儲(chǔ)在不同的集合中,每個(gè)集合在數(shù)據(jù)庫中有唯一的標(biāo)識(shí)名[9],并且可以包含無限數(shù)量的文檔,集合類似于關(guān)系型數(shù)據(jù)庫中的表,區(qū)別是集合不需要定義模式;
模式自由:數(shù)據(jù)庫不需要知道存儲(chǔ)在MongoDB集合中的文檔的任何結(jié)構(gòu)信息,同一集合可以包含不同結(jié)構(gòu)的文檔,如下兩個(gè)記錄可以存儲(chǔ)在同一個(gè)集合中:{“name”:”上?!眪,{“sex”:”男”,”address”:”shanghai”}。
作為一個(gè)適用于敏捷開發(fā)的數(shù)據(jù)庫MongoDB還提供以下功能:支持豐富的查詢表達(dá)式,查詢指令使用JSON形式;完整的索引支持,包括文檔內(nèi)嵌對(duì)象及數(shù)組;支持服務(wù)器之間的數(shù)據(jù)復(fù)制,提供冗余及自動(dòng)故障轉(zhuǎn)移,使應(yīng)用程序具有企業(yè)級(jí)的可靠性和操作靈活性;自動(dòng)分片功能支持水平的數(shù)據(jù)庫集群,可動(dòng)態(tài)添加機(jī)器,支持大型、復(fù)雜的多數(shù)據(jù)中心架構(gòu)。
對(duì)于本文所研發(fā)的信息系統(tǒng)而言,最重要的是使用了MongoDB的數(shù)據(jù)模式的靈活更新機(jī)制;同時(shí),其可擴(kuò)展性也是非常重要的特性,尤其是在大型企業(yè)中,信息的數(shù)量通常處于非常高的數(shù)量級(jí),因而可利用MongoDB的可擴(kuò)充特性來保證大數(shù)據(jù)量下系統(tǒng)的運(yùn)行效率。
1.2 HTML5
HTML 5是HTML下一代主要的修訂版本,是用以描述網(wǎng)頁文檔的超文本標(biāo)記語言,它的制定主要是為了替代原有的HTML 4.01和XHTML 1.0標(biāo)準(zhǔn)。從廣義上HTML 5是一系列用于開發(fā)網(wǎng)絡(luò)應(yīng)用的最新技術(shù)的集合,包括HTML、CSS和JavaScript以及一系列全新API[3]。HTML5技術(shù)希望能夠減少瀏覽器對(duì)于需要插件的豐富性網(wǎng)絡(luò)應(yīng)用服務(wù)如Adobe Flash、Microsoft Silverlight的需求,提供更多能有效增強(qiáng)網(wǎng)絡(luò)應(yīng)用的標(biāo)準(zhǔn)集。
相對(duì)于HTML之前的版本,HTML 5添加了許多新的語法特征,主要包括
HTML 5的另一個(gè)重要特性是它提供了服務(wù)器推送技術(shù),可以從服務(wù)端實(shí)時(shí)推送數(shù)據(jù)到瀏覽器,這是本文使用HTML 5的最重要特性。
1.3 服務(wù)器推送技術(shù)
在一般的 Web 應(yīng)用中,瀏覽器和服務(wù)器之間的通信是請(qǐng)求/響應(yīng)的交互模式:瀏覽器發(fā)出請(qǐng)求,服務(wù)器根據(jù)收到的請(qǐng)求來生成相應(yīng)的響應(yīng),瀏覽器對(duì)收到的響應(yīng)進(jìn)行處理,動(dòng)態(tài)更新展現(xiàn)給用戶的頁面[8]。這種通信方式通常需要用戶在頁面上進(jìn)行操作,比如點(diǎn)擊鼠標(biāo)、移動(dòng)鼠標(biāo)來觸發(fā)相應(yīng)的事件,不足在于:服務(wù)器端產(chǎn)生的數(shù)據(jù)更新不能及時(shí)地通知瀏覽器,而是需要等到下次請(qǐng)求發(fā)出時(shí)才能被瀏覽器獲取,對(duì)于某些對(duì)數(shù)據(jù)實(shí)時(shí)性要求較高的應(yīng)用來講,這種延遲是不能接受的。
為解決數(shù)據(jù)延遲問題,需要服務(wù)器端發(fā)生數(shù)據(jù)更新的第一時(shí)間主動(dòng)推送最新數(shù)據(jù)給瀏覽器。常見的解決主要可以分成兩類,其區(qū)別在于是否基于 HTTP 協(xié)議實(shí)現(xiàn)。不使用 HTTP 協(xié)議的做法是使用 HTML 5 新增的 WebSocket 規(guī)范;使用 HTTP 協(xié)議的做法則包括簡(jiǎn)易輪詢、COMET 技術(shù)和本文中要使用的 HTML 5 服務(wù)器推送事件[8]。
服務(wù)器推送事件是 HTML 5 規(guī)范中的一個(gè)組成部分,可以從服務(wù)端實(shí)時(shí)推送數(shù)據(jù)到瀏覽器端。相對(duì)于與類似的 COMET 和 WebSocket 技術(shù)來說,服務(wù)器推送事件的使用更簡(jiǎn)單,對(duì)服務(wù)器端的改動(dòng)也比較小。對(duì)于本文將要描述的信息發(fā)布系統(tǒng)而言,服務(wù)器推送事件是最佳的選擇。
企業(yè)信息發(fā)布系統(tǒng)的總體架構(gòu)如圖1所示,系統(tǒng)總共分5大模塊,依次說明如下:
(1) 基于MongoDB的數(shù)據(jù)存儲(chǔ)層:用于存儲(chǔ)系統(tǒng)的所有數(shù)據(jù),主要包括信息的數(shù)據(jù)模式定義存儲(chǔ)、各類型的信息數(shù)據(jù)存儲(chǔ)、信息模板內(nèi)容、用戶信息、權(quán)限信息等其他數(shù)據(jù)的存儲(chǔ);
(2) 數(shù)據(jù)模式定義管理層:定義信息的數(shù)據(jù)模式,即信息的屬性定義,主要包括數(shù)據(jù)模式的增、刪、改、查操作及對(duì)已定義數(shù)據(jù)模式的解析,是底層信息數(shù)據(jù)與前臺(tái)進(jìn)行可視化數(shù)據(jù)解析與映射的橋梁;
(3) 所見即所得的標(biāo)簽管理:該部分分為標(biāo)簽定義、標(biāo)簽解析及標(biāo)簽的管理,對(duì)于定義的信息類型,提供所見即所得方式的標(biāo)簽定義系統(tǒng),讓不具備編程基礎(chǔ)的用戶根據(jù)企業(yè)業(yè)務(wù)需求可以方便地定義各類標(biāo)簽,通過標(biāo)簽可視化地實(shí)現(xiàn)讀取存儲(chǔ)在MongoDB中的信息內(nèi)容、將信息內(nèi)容存儲(chǔ)在MongoDB中;
(4) 信息權(quán)限管理層:提供從信息標(biāo)簽和模板級(jí)別對(duì)數(shù)據(jù)權(quán)限的管理,實(shí)現(xiàn)不同用戶角色對(duì)相應(yīng)類型數(shù)據(jù)的訪問控制;
(5) 可自由編輯的模板管理:除系統(tǒng)內(nèi)置的模板外,用戶可依據(jù)業(yè)務(wù)需要定義不同的信息顯示模板,實(shí)現(xiàn)豐富的可視化效果。
圖1 系統(tǒng)整體架構(gòu)
本節(jié)針對(duì)圖1所示信息發(fā)布系統(tǒng)的每個(gè)核心模塊的實(shí)現(xiàn)進(jìn)行詳細(xì)說明。
3.1 基于MongoDB的數(shù)據(jù)存儲(chǔ)層
在MongoDB中,數(shù)據(jù)以JSON形式存儲(chǔ)的樣例如下,數(shù)據(jù)的查詢也是以JSON形式的命令執(zhí)行,因此,用戶使用非常簡(jiǎn)單方便。
{
″_id″:ObjectId(″55eaef6b6e313c30e07def5″),
″title″:″關(guān)于抗戰(zhàn)70周年放假的通知″,
″pub_time″:″2014-08-21 10:08:11″,
″author″:″行政部″,
″content″:″9月3日(周四)~9月5日(周六):放假,9月6日(周日):正常上班?!?/p>
}
對(duì)于信息發(fā)布系統(tǒng)中各類數(shù)據(jù)模式固定的數(shù)據(jù)類型如用戶信息、權(quán)限信息,MongoDB中的存儲(chǔ)與關(guān)系型數(shù)據(jù)庫的存儲(chǔ)基本相同,確定好數(shù)據(jù)模式后,把相應(yīng)的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)表中即可。
對(duì)于數(shù)據(jù)模式頻繁變化的信息類型、信息內(nèi)容的存儲(chǔ),傳統(tǒng)的關(guān)系型數(shù)據(jù)庫并未提供良好的解決方案,使用關(guān)系型數(shù)據(jù)庫存儲(chǔ)會(huì)非常復(fù)雜。而MongoDB因?yàn)榫邆鋽?shù)據(jù)模式自由擴(kuò)展的特性,非常適合本文的信息類型頻繁變化的應(yīng)用場(chǎng)景。在MongoDB中,數(shù)據(jù)表不需要在數(shù)據(jù)存儲(chǔ)之前進(jìn)行顯示的定義,而是在用戶進(jìn)行數(shù)據(jù)寫入的同時(shí)同步創(chuàng)建相應(yīng)的數(shù)據(jù)表。如前文所述,數(shù)據(jù)是使用JSON形式描述的,MongoDB會(huì)自動(dòng)分析用戶寫入數(shù)據(jù)中的數(shù)據(jù)字段,并同時(shí)創(chuàng)建相應(yīng)的數(shù)據(jù)表格(例如上述數(shù)據(jù)樣例是在未創(chuàng)建表的情況下寫入的,系統(tǒng)會(huì)自動(dòng)創(chuàng)建表)。另一方面,當(dāng)業(yè)務(wù)發(fā)生變化需要修改數(shù)據(jù)模式時(shí),也不需要顯示進(jìn)行表格數(shù)據(jù)模式的修改,系統(tǒng)同樣會(huì)依據(jù)用戶提供數(shù)據(jù)中的數(shù)據(jù)模式進(jìn)行字段的動(dòng)態(tài)添加或刪除。與上述樣例信息存儲(chǔ)于同一表中但增加了數(shù)據(jù)字段“tips”的數(shù)據(jù)如下:
{
″_id″:ObjectId(″55eaef6b6e3513c30e07cf5″),
″title″:″關(guān)于中秋節(jié)放假的通知″,
″pub_time″:″2015-09-06 09:33:21″,
″author″:″行政部″,
″content″:″9月26日(周六)~9月27日(周日):放假,9月28日(周一):正常上班?!?/p>
″tips″:″本次中秋節(jié)放假只有兩天″,
}
因此,對(duì)于本文的可能進(jìn)行頻繁變換的信息類型,直接把數(shù)據(jù)寫入MongoDB進(jìn)行存儲(chǔ)即可。當(dāng)然,在用戶進(jìn)行信息的存儲(chǔ)和訪問時(shí),需要知道信息的數(shù)據(jù)字段定義,此部分功能將由數(shù)據(jù)模式定義管理層進(jìn)行管理。
3.2 數(shù)據(jù)模式定義管理層
數(shù)據(jù)模式定義管理層的主要功能是對(duì)系統(tǒng)中的信息類型的數(shù)據(jù)模式提供定義入口和相應(yīng)數(shù)據(jù)的存儲(chǔ)。
數(shù)據(jù)模式可以看成是元數(shù)據(jù),即描述數(shù)據(jù)的數(shù)據(jù)。在本文中指信息類型的定義表,即每個(gè)信息類型需要展示的數(shù)據(jù)字段、這些數(shù)據(jù)字段的數(shù)據(jù)類型、數(shù)據(jù)字段的長(zhǎng)度、字段對(duì)應(yīng)的數(shù)據(jù)是否需要進(jìn)行索引等。
經(jīng)過總結(jié)和抽象可以得知數(shù)據(jù)模式定義表本身是固定的,如表1所示包含以下字段:唯一標(biāo)識(shí)、信息類型名、信息類型顯示名、信息需要展示字段列表。其中信息字段列表中每個(gè)元素都為JSON形式的字符串,包含:字段名、字段顯示名、字段類型、字段長(zhǎng)度、字段是否索引,如表2所示。
表1 信息類型數(shù)據(jù)模式定義表
表2 信息內(nèi)容定義表
基于以上MongoDB信息數(shù)據(jù)樣例,對(duì)應(yīng)的信息類型的數(shù)據(jù)模式定義表結(jié)構(gòu)如下:
{
″_id″:ObjectId(″55eaef6b6e313c30e07dcx5″),
″name″:″holiday_message″,
″display_name″:″放假通知″,
″fields″:
[
{
″name″:″title″,
″displayName″:″標(biāo)題″,
″dataType″:″3″,
″isIndexed″:″1″
},
{
″name″:″pub_time″,
″displayName″:″發(fā)布時(shí)間″,
″dataType″:″3″,
″isIndexed″:″0″
},
{
″name″:″author″,
″displayName″:″作者″,
″dataType″:″3″,
″isIndexed″:″0″
},
{
″name″:″content″,
″displayName″:″內(nèi)容″,
″dataType″:″3″,
″isIndexed″:″0″
}
]
}
3.3 標(biāo)簽系統(tǒng)
在傳統(tǒng)的數(shù)據(jù)管理模式下,信息內(nèi)容的存取需要用戶具備良好的服務(wù)器編程基礎(chǔ),Web顯示編程基礎(chǔ)和數(shù)據(jù)庫管理基礎(chǔ)才能完成;用戶需要完成與信息存儲(chǔ)系統(tǒng)的數(shù)據(jù)交互,包括信息讀取、信息添加與修改和信息的刪除、信息的顯示與分頁、以及信息內(nèi)容的檢索等;所有這些功能實(shí)現(xiàn)對(duì)于普通用戶而言是比較困難的,即使用戶具備良好的編程基礎(chǔ),也需要花費(fèi)大量的時(shí)間來實(shí)現(xiàn)。另一方面,當(dāng)信息的類型發(fā)生變化時(shí),又需要對(duì)信息的存取實(shí)現(xiàn)、信息的展示實(shí)現(xiàn)等進(jìn)行更改,這在頻繁改變的信息系統(tǒng)中是非常耗時(shí)的。
因此,本系統(tǒng)提供了一套所見即所得的標(biāo)簽定義體系,普通用戶可以通過在前臺(tái)定義標(biāo)簽實(shí)現(xiàn)信息數(shù)據(jù)的存取、信息的前端展示等功能,極大程度地降低了系統(tǒng)的使用門檻和用戶的工作量。
從本質(zhì)上而言,標(biāo)簽系統(tǒng)的核心功能為實(shí)現(xiàn)與服務(wù)器的數(shù)據(jù)存儲(chǔ)系統(tǒng)的數(shù)據(jù)交換。因此,標(biāo)簽系統(tǒng)的核心在于建立與服務(wù)器存儲(chǔ)系統(tǒng)的映射關(guān)系、實(shí)現(xiàn)瀏覽器端與服務(wù)器端的數(shù)據(jù)交互、提供瀏覽器端數(shù)據(jù)的顯示。具體而言,實(shí)現(xiàn)瀏覽器端與服務(wù)器進(jìn)行數(shù)據(jù)交換的關(guān)鍵技術(shù)和功能包括:
(1) 建立統(tǒng)一的數(shù)據(jù)格式標(biāo)準(zhǔn):保證用戶定義的標(biāo)簽所寫入和獲得的數(shù)據(jù)與服務(wù)器數(shù)據(jù)存儲(chǔ)系統(tǒng)中存儲(chǔ)的內(nèi)容保持一致,以便數(shù)據(jù)的正確解析;由于采用MongoDB作為存儲(chǔ)底層,本系統(tǒng)中統(tǒng)一使用MongoDB的JSON格式作為數(shù)據(jù)描述標(biāo)準(zhǔn)。
(2) 獲取服務(wù)器端的數(shù)據(jù)模式定義:用戶在定義標(biāo)簽時(shí),首先需要知道系統(tǒng)中定義了哪些信息類型,這些信息類型又包含哪些數(shù)據(jù)字段;知道了數(shù)據(jù)模式定義后,用戶便可定義數(shù)據(jù)標(biāo)簽所對(duì)應(yīng)的表格、所需要讀取的數(shù)據(jù)字段,并進(jìn)行相應(yīng)的查詢過濾條件、索引的定義。
(3) 瀏覽器發(fā)送的請(qǐng)求中包含的操作和數(shù)據(jù)解析機(jī)制:系統(tǒng)在接收到用戶定義標(biāo)簽對(duì)應(yīng)的數(shù)據(jù)請(qǐng)求后需要對(duì)請(qǐng)求中包含的操作、請(qǐng)求中包含的數(shù)據(jù)進(jìn)行解析,然后執(zhí)行相應(yīng)的操作命令,最后把相應(yīng)的操作結(jié)果按照約定的格式返回給用戶。
(4) 標(biāo)簽的前臺(tái)展示方式:包括用戶讀取的信息的展示方式以及用戶需要進(jìn)行信息發(fā)布時(shí)的輸入界面的展示方式;頁面的總體布局需要使用下方將說明的模板進(jìn)行規(guī)劃,標(biāo)簽的展示則需要對(duì)當(dāng)前標(biāo)簽的管理區(qū)域進(jìn)行可視化。
標(biāo)簽系統(tǒng)的工作流程如圖2所示,標(biāo)簽系統(tǒng)中主要包括兩類標(biāo)簽:信息展示標(biāo)簽和信息編輯標(biāo)簽。消息展示標(biāo)簽主要包含單值型標(biāo)簽和多值型標(biāo)簽,單值型標(biāo)簽即指僅讀取一條數(shù)據(jù)的標(biāo)簽(如展示一條信息的詳細(xì)信息),而多值型標(biāo)簽則是需要讀取一系列的消息(如展示信息列表)。
圖2 標(biāo)簽系統(tǒng)工作流程
1) 讀取數(shù)據(jù)模式與解析
用戶所定義的每一個(gè)標(biāo)簽對(duì)應(yīng)于服務(wù)器數(shù)據(jù)模式中的一個(gè)或多個(gè)表格(信息類型表格),因此用戶在定義標(biāo)簽時(shí),標(biāo)簽系統(tǒng)首先需要把服務(wù)器所定義的數(shù)據(jù)模式讀取并展示給用戶。信息類型定義表(表1)和信息內(nèi)容定義表(表2)存儲(chǔ)在MongoDB中,系統(tǒng)讀取出來后,把所有的信息類型展示給用戶選擇;用戶選擇信息類型后,系統(tǒng)即把所選信息類型的字段展示給用戶,用戶從中選擇需要顯示或修改數(shù)據(jù)的字段。
2) 生成數(shù)據(jù)讀取交互界面
用戶選擇好信息類型和該類型需要展示的字段后,系統(tǒng)會(huì)提供數(shù)據(jù)交互的操作界面并自動(dòng)生成數(shù)據(jù)交互的相關(guān)查詢腳本。對(duì)于信息展示標(biāo)簽,自動(dòng)生成數(shù)據(jù)讀取的查詢腳本,同時(shí)提供查詢條件的設(shè)置界面讓用戶選擇(例如查詢最近7天的放假消息);用戶可以通過生成的可視化交互界面設(shè)置查詢的字段和查詢的條件,查詢條件包括查詢滿足特定字段要求的數(shù)據(jù)、讀取數(shù)據(jù)的條數(shù)、數(shù)據(jù)的排序方式等;對(duì)于高級(jí)用戶,也可以通過直接編輯查詢腳本來設(shè)置查詢內(nèi)容及查詢條件。對(duì)于信息編輯標(biāo)簽,則生成用戶設(shè)置編輯數(shù)據(jù)的交互界面,用戶可以設(shè)置所需要顯示的字段、確定數(shù)據(jù)編輯的表單類型(文本框、文本域或HTML編輯器)、確定字段的排序順序等。
3) 設(shè)置顯示樣式
通過第2)步,已經(jīng)完成數(shù)據(jù)類型、數(shù)據(jù)字段、數(shù)據(jù)查詢條件(信息讀取標(biāo)簽)的設(shè)定,接下來需要確定數(shù)據(jù)或編輯界面的顯示形式。對(duì)于數(shù)據(jù)顯示標(biāo)簽,要設(shè)置標(biāo)簽最終所讀取出來的數(shù)據(jù)的展示形式;數(shù)據(jù)展示是通過HTML來描述的,因此用戶可以使用CSS來控制最終數(shù)據(jù)展示的樣式;由于在設(shè)置時(shí)數(shù)據(jù)還沒有讀取出來,因此需要通過設(shè)置占位符的方式來確定最終數(shù)據(jù)讀取出來后每個(gè)字段的數(shù)據(jù)放置的位置,多個(gè)字段的占位符序號(hào)以遞增的方式進(jìn)行計(jì)數(shù);對(duì)于字段數(shù)據(jù),還可以進(jìn)行一些簡(jiǎn)單的處理,包括設(shè)置顯示的最大長(zhǎng)度(如某些列表中由于空間關(guān)系不能把標(biāo)題全部展示而僅展示前面的一部分)、設(shè)置超鏈接等。以下為一個(gè)顯示標(biāo)簽的示例,其中“@_tag_value_*”為占位符,末位的序號(hào)代表查詢字段的序號(hào)。編輯標(biāo)簽與顯示標(biāo)簽類似,也通過HTML和CSS來設(shè)置編輯區(qū)域的顯示方式。
4) 數(shù)據(jù)讀取與顯示
此功能是對(duì)于顯示標(biāo)簽而言的,標(biāo)簽系統(tǒng)依據(jù)用戶所定義的查詢目標(biāo)和查詢條件等。首先從服務(wù)器的數(shù)據(jù)庫中找到相應(yīng)的數(shù)據(jù)庫和數(shù)據(jù)表,然后依據(jù)條件進(jìn)行數(shù)據(jù)的讀取操作,再把數(shù)據(jù)傳送到前臺(tái)。前臺(tái)得到數(shù)據(jù)后,首先對(duì)JSON形式的數(shù)據(jù)進(jìn)行解析,得到里邊的數(shù)據(jù)記錄、數(shù)據(jù)字段,然后與設(shè)置的查詢條件以及設(shè)置的顯示條件結(jié)合進(jìn)行解析,生成一條(單值型標(biāo)簽)或多條(多值型標(biāo)簽)數(shù)據(jù),并把相應(yīng)的字段填入相應(yīng)的占位符位置上。
5) 數(shù)據(jù)保存
此功能是對(duì)于編輯標(biāo)簽而言的,當(dāng)前臺(tái)用戶在系統(tǒng)依據(jù)標(biāo)簽設(shè)置生成的交互界面完成數(shù)據(jù)的編輯后,點(diǎn)擊保存時(shí),數(shù)據(jù)會(huì)傳送到后臺(tái),系統(tǒng)解析JSON形式的數(shù)據(jù)后,調(diào)用MongoDB的相關(guān)引擎執(zhí)行相應(yīng)數(shù)據(jù)表、相應(yīng)數(shù)據(jù)字段的保存工作。
用戶定義及使用一個(gè)信息展示標(biāo)簽的過程如下:
(1)用戶選定添加一個(gè)信息展示標(biāo)簽后,標(biāo)簽系統(tǒng)自動(dòng)從底層的數(shù)據(jù)模式定義管理層中獲得服務(wù)器的數(shù)據(jù)模式(即定義了哪些信息類型以及這些信息類型的數(shù)據(jù)字段)并顯示出來供用戶選擇;(2)用戶從這些數(shù)據(jù)模式中選取當(dāng)前需要展示的信息類型,系統(tǒng)會(huì)自動(dòng)解析得到所選擇信息類型的數(shù)據(jù)字段并自動(dòng)生成用戶選擇的界面;(3)用戶從解析到的數(shù)據(jù)字段中選取需要展示的數(shù)據(jù)字段,并設(shè)置查詢條件(如查詢多少條、時(shí)間范圍等)、分頁設(shè)置(每頁多少條記錄)等;(4)系統(tǒng)依據(jù)用戶選擇的信息類型、數(shù)據(jù)字段、查詢條件,系統(tǒng)自動(dòng)把用戶的設(shè)置轉(zhuǎn)換成查詢數(shù)據(jù)的SQL語句,把數(shù)據(jù)從存儲(chǔ)系統(tǒng)中查詢出來,同時(shí)對(duì)數(shù)據(jù)進(jìn)行解析,生成信息記錄;(5)用戶定義信息數(shù)據(jù)顯示的基本格式(HTML源碼、CSS樣式等),設(shè)置時(shí)使用統(tǒng)一的占位符代替數(shù)據(jù)的位置;(6)系統(tǒng)自動(dòng)把用戶定義的顯示格式中的點(diǎn)位符替換成之前步驟所讀取出來的數(shù)據(jù),如此便可以在客戶端進(jìn)行展示。
3.4 用戶可定義的模板機(jī)制
為豐富數(shù)據(jù)的可視化效果,對(duì)于不同的信息類型,用戶需要使用不同的展示方式,因此,系統(tǒng)需要提供靈活的可視化方式。本系統(tǒng)提供了用戶可自由定義模板的機(jī)制,為豐富的可視化提供了可能。
模板的主要功能在于對(duì)頁面的總體布局進(jìn)行規(guī)劃,頁面布局是Web開發(fā)的一個(gè)重要課題。對(duì)于普通用戶,從頭開始實(shí)現(xiàn)頁面是比較困難的,幸運(yùn)的是,已經(jīng)有許多框架提供了許多常用的布局模板,同時(shí)也提供了布局模板自定義的功能,具備這些功能的常見框架有:ExtJS、Apache Tiles和Elastic等。本文系統(tǒng)采用的是ExtJS框架,其豐富的內(nèi)置布局以及靈活的自定義布局功能,為本系統(tǒng)中的信息可視化提供了技術(shù)上實(shí)現(xiàn)的可能。
3.5 實(shí)時(shí)信息推送機(jī)制
為保證用戶實(shí)時(shí)地接收到系統(tǒng)所發(fā)布的信息,本系統(tǒng)基于HTML 5的服務(wù)器推送事件機(jī)制實(shí)現(xiàn)信息實(shí)時(shí)推送。
服務(wù)器推送事件的規(guī)范主要由服務(wù)器端與瀏覽器端之間的通信協(xié)議及在瀏覽器端可供 JavaScript 使用的 EventSource對(duì)象兩個(gè)部分組成。通信協(xié)議是基于純文本的簡(jiǎn)單協(xié)議,服務(wù)器端的響應(yīng)內(nèi)容類型是“text/event-stream”。服務(wù)器端的響應(yīng)內(nèi)容可以看做一個(gè)由不同事件組成的事件流。每個(gè)事件由類型、數(shù)據(jù)、可選的標(biāo)識(shí)符組成,每個(gè)事件的數(shù)據(jù)可能由多行組成。不同事件的內(nèi)容通過僅包含回車符和換行符的空行分隔。服務(wù)器推送事件數(shù)據(jù)樣例如下,對(duì)于每一行冒號(hào)(“:”)前面表示的是該行的類型,冒號(hào)后面則是對(duì)應(yīng)的值。
data:first event
data:second event
id:100
event:myevent
data:thid event
id:101
:this is a comment
data:fourth event
data:fourth event continue
服務(wù)器端實(shí)現(xiàn)推送事件只需要按照協(xié)議規(guī)定的格式,返回響應(yīng)內(nèi)容即可。本文使用 Java 作為服務(wù)器端的實(shí)現(xiàn)語言,具體實(shí)現(xiàn)基于開源的 jetty-eventsource-servlet 項(xiàng)目。
對(duì)于服務(wù)器端返回的響應(yīng),瀏覽器端需要在 JavaScript 中使用 EventSource 對(duì)象來進(jìn)行處理。EventSource 使用的是標(biāo)準(zhǔn)的事件監(jiān)聽器方式,只需要在EventSource對(duì)象上添加相應(yīng)的事件處理方法即可。
3.6 信息權(quán)限管理
由于數(shù)據(jù)與底層存儲(chǔ)系統(tǒng)的交互是通過標(biāo)簽來實(shí)現(xiàn)的,因此,本系統(tǒng)通過在標(biāo)簽層面進(jìn)行訪問控制,即把用戶角色與標(biāo)簽進(jìn)行關(guān)聯(lián)匹配。信息標(biāo)簽的權(quán)限分為信息讀取權(quán)限和信息的發(fā)送權(quán)限,在權(quán)限控制時(shí)分開處理。
另外,系統(tǒng)也提供了模板級(jí)別的權(quán)限控制,特定角色和權(quán)限的用戶方可使用特定的模板。在基于標(biāo)簽和模板的基礎(chǔ)上,權(quán)限控制的整體方案與常用的權(quán)限管理基本相同。
本系統(tǒng)的基于HTML5和JavaScript技術(shù)為用戶提供友好的可視化展示界面。
圖3為用戶已添加了信息類型分頁展示及信息類型的編輯界面,用戶可以對(duì)信息類型的字段進(jìn)行編輯、添加、刪除操作。
圖3 信息類型編輯
圖4展示了動(dòng)態(tài)標(biāo)簽的添加方法,用戶為標(biāo)簽命名,指定標(biāo)簽的類型(簡(jiǎn)單類型或用戶自定義的信息類型)、選擇標(biāo)簽存取的數(shù)據(jù)源、定義標(biāo)簽數(shù)據(jù)顯示的樣式等其他屬性,即可完成一個(gè)標(biāo)簽定義。
圖4 動(dòng)態(tài)標(biāo)簽定義
圖5為使用ExtJS框架自定義信息展示效果的工作區(qū),基于ExtJS框架用戶可以靈活、方便、所見既所得的定義信息的展示樣式。
圖5 信息展示模板定義
本系統(tǒng)已在本單位內(nèi)部及世貿(mào)集團(tuán)運(yùn)行一年多,具有上千用戶,基于該系統(tǒng)發(fā)布了大量信息,便于了企業(yè)信息發(fā)布的及時(shí)性,規(guī)范了企業(yè)各類信息發(fā)布系統(tǒng)的建設(shè),圖3-圖5就是該系統(tǒng)實(shí)際應(yīng)用效果。
企業(yè)信息發(fā)布系統(tǒng)作為企業(yè)對(duì)內(nèi)對(duì)外的門戶在企業(yè)的發(fā)展中占有重要位置,本文研究并實(shí)現(xiàn)了基于動(dòng)態(tài)標(biāo)簽技術(shù)的企業(yè)信息發(fā)布系統(tǒng)。實(shí)踐表明,使用該系統(tǒng)用戶可以方便、靈活的發(fā)布信息,通過簡(jiǎn)單的界面操作,用戶可以隨時(shí)增加信息類型,不需要重新編碼設(shè)計(jì)即可發(fā)布新的頻道,降低了企業(yè)建設(shè)和維護(hù)信息發(fā)布系統(tǒng)的人力、財(cái)力和時(shí)間,推動(dòng)了企業(yè)信息化的腳步。該信息發(fā)布系統(tǒng)具有以下特性:
良好的用戶透明性:用戶不需要懂任何編碼技術(shù)(HTML、JS、Mysql)即可以可見即可得方式定義信息展示樣式;
可擴(kuò)展性:企事業(yè)單位會(huì)根據(jù)企業(yè)發(fā)展、拓展了新的業(yè)務(wù)需要增加新的信息類型,此時(shí)不需要對(duì)信息發(fā)布系統(tǒng)進(jìn)行重新編碼設(shè)計(jì),用戶可以通過簡(jiǎn)單的界面操作增加新的信息類型,發(fā)布新類型的信息;
通用性:各企業(yè)可根據(jù)自身的情況定義自己的信息類型,建立自己的信息發(fā)布系統(tǒng),各個(gè)企業(yè)不需要單獨(dú)研發(fā)自己的信息發(fā)布系統(tǒng)。
[1] 姬一文,吳慶波,楊沙洲.一種服務(wù)器端模板引擎的改進(jìn)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用研究,2011,28(3):1077-1079,1087.
[2] 賴吉平,羅清.模版引擎與標(biāo)簽解析技術(shù)在內(nèi)容管理系統(tǒng)的運(yùn)用研究[J].中國(guó)電子商務(wù),2011(11):49.[3] 黃永慧,陳程凱.HTML5在移動(dòng)應(yīng)用開發(fā)上的應(yīng)用前景[J].計(jì)算機(jī)技術(shù)與發(fā)展,2013,23(7):207-210.
[4] 朱明,左珊珊,蘇厚勤.一種采用標(biāo)簽引擎技術(shù)信息發(fā)布系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2015,32(2):89-93.
[5] 南軼,李先國(guó).模板技術(shù)在內(nèi)容管理系統(tǒng)中的研究與應(yīng)用[J].微電子學(xué)與計(jì)算機(jī),2012,29(6):180-1854.
[6] 薩支欣.國(guó)內(nèi)外網(wǎng)站內(nèi)容管理系統(tǒng)比較[J].情報(bào)探索,2012(2):85-87.
[7] 葉曉俊,李海翔.企業(yè)信息移動(dòng)發(fā)布平臺(tái)的設(shè)計(jì)與開發(fā)[J].計(jì)算機(jī)集成制造系統(tǒng),2003,9(11):972-975.
[8] 成富.HTML5服務(wù)器推送事件實(shí)戰(zhàn)開發(fā)[EB/OL].(2013-09-15).http://www.uml.org.cn/html/201309133.asp.
[9] Chodorow K, Dirolf M. MongoDB: The Definitive Guide[M]. Sebastopol : O’Reilly Media, 2010.
DESIGN AND IMPLEMENTATION OF INFORMATION RELEASE SYSTEM BASED ON DYNAMIC TAG TECHNOLOGY
Li Yingna Wu Songyang Zhang Tao*Li Xun
(ThirdResearchInstituteofMinistryofPublicSecurity,Shanghai201204,China)
In the information age,information release system is widely used in various industries.The existing information release system can only publish the information which has been defined such as the enterprise dynamic news,time and attendance.When users want to publish undefined type of information,the enterprise needs to redesign the system which means existing information systems have poor scalability.In order to solve this problem,a new method based on dynamic tag technology is proposed which describes the design and implementation of the system.By using the dynamic tag technology based on MongoDB,the information release system can realize that user-define information types and users can add new information types at any time.The practice shows that the information release system has good user transparency and business expansion,reducing the cost,time and manpower for developing.
Dynamic tag technology MongoDB HTML5 Server Push
2015-11-06。國(guó)家信息安全專項(xiàng)項(xiàng)目(發(fā)改辦高技[2015]289號(hào))。李營(yíng)那,碩士,主研領(lǐng)域:軟件工程。吳松洋,副研究員。張濤,助理研究員。李勛,助理研究員。
TP3
A
10.3969/j.issn.1000-386x.2017.01.004