王錚清,劉壯峰
(舟山市氣象局,浙江舟山 316000)
內(nèi)容管理系統(tǒng)(CMS,Content Management System)主要用于管理多樣類型信息,在綜合門戶、電子商務(wù)、電子政務(wù)等方面都有廣泛的應(yīng)用。大量信息的增刪改及管理工作在早期是用手工代碼的方式進(jìn)行的,而現(xiàn)在一般是采用內(nèi)容管理系統(tǒng),這節(jié)省了大量的人力、物力和時間[1]。內(nèi)容管理系統(tǒng)的設(shè)計與應(yīng)用是企事業(yè)單位信息化建設(shè)的一個重點(diǎn)發(fā)展方向。在單位日常辦公中會有新聞稿件、公示公開、會議安排、處室發(fā)文等多種多樣的內(nèi)容,這些內(nèi)容通過即時通信工具、政務(wù)郵和共享網(wǎng)盤等不同平臺進(jìn)行分發(fā),職工獲取信息需要在不同平臺間進(jìn)行切換查找。通過內(nèi)容管理系統(tǒng),將不同平臺分發(fā)的內(nèi)容進(jìn)行歸集與整理,職工通過系統(tǒng)可以非常方便快捷地獲取信息。
系統(tǒng)出于開發(fā)成本的考慮,選擇用開源技術(shù)和免費(fèi)的開發(fā)工具進(jìn)行開發(fā)。開源技術(shù)不意味著可以隨意使用,系統(tǒng)在進(jìn)行開發(fā)時應(yīng)注意開源技術(shù)的許可證問題,避免出現(xiàn)法律風(fēng)險。王志強(qiáng)[2]將開源許可證根據(jù)限制條件的強(qiáng)弱分為了強(qiáng)copyleft型、弱copyleft 型和寬松型三類。在軟件分發(fā)過程中強(qiáng)copyleft 型要求分發(fā)產(chǎn)品使用與原作品相同的許可證,代表協(xié)議有GPL。弱copyleft 型限制了分發(fā)產(chǎn)品中使用該類型許可證代碼的更改,代表協(xié)議有LGPL。寬松型則允許分發(fā)產(chǎn)品使用任意許可證進(jìn)行分發(fā),代表協(xié)議有MIT。
系統(tǒng)出于單位使用的考慮源代碼需要閉源保存,在選擇開源技術(shù)時避開了使用強(qiáng)copyleft 許可證的技術(shù),選用了Go語言和Gin 框架進(jìn)行開發(fā),openGauss 數(shù)據(jù)庫進(jìn)行數(shù)據(jù)存儲,LayUI、TinyMCE 和Foundation 等前端技術(shù)。系統(tǒng)使用VsCode、Postman、Siege、PuTTY和FileZilla等工具進(jìn)行開發(fā)、測試和部署。
Go語言是美國谷歌公司開發(fā)的一款支持垃圾回收的功能的靜態(tài)強(qiáng)類型、編譯型、并發(fā)型編程語言。Go語言在語法上類似C 語言,其創(chuàng)作者之一Ken Thompson 也是C 語言的作者之一[3]。因此擁有一定C語言開發(fā)基礎(chǔ)的人員在短時間內(nèi)能夠輕松上手。Go 語言編寫的程序移植性強(qiáng),可以根據(jù)不同平臺直接編譯為該平臺下的可執(zhí)行文件,極大地方便了程序的維護(hù)和部署。
Gin框架是使用Go語言編寫的模塊化Web框架,是目前流行的Go 語言Web 框架之一,在知名代碼托管網(wǎng)站GitHub 上的星星數(shù)量超過了5.9萬。Gin框架將路由構(gòu)造為前綴樹,占用空間更加小,支持子路徑匹配[4]。Gin 框架的性能強(qiáng)勁,支持多種數(shù)據(jù)格式傳遞,接口封裝優(yōu)雅,使用起來方便友好。使用Gin框架進(jìn)行Web 開發(fā),不但提高了程序的性能,而且能夠大大縮短程序開發(fā)時間。
openGauss 是華為公司開發(fā)的性能強(qiáng)大、安全穩(wěn)定的開源關(guān)系型數(shù)據(jù)庫。openGauss 是目前流行的國產(chǎn)數(shù)據(jù)庫之一,采用了木蘭寬松許可證,與MySQL 采用的雙重授權(quán)(Dual Licensed)模式即只允許在遵循GPL 協(xié)議的項(xiàng)目中免費(fèi)使用,否則需要支付高額的許可費(fèi)用相比,做到了完全免費(fèi)開源使用。
openGauss 支持標(biāo)準(zhǔn)SQL 規(guī)范,擁有非常友好的中文參考文檔,有數(shù)據(jù)庫使用經(jīng)驗(yàn)的開發(fā)者可以很快上手。官方提供了Go語言的連接驅(qū)動和可視化管理工具Data Studio,極大地方便了開發(fā)、部署和后期管理維護(hù)。
在選取前端技術(shù)時,考慮到學(xué)習(xí)速度和開發(fā)進(jìn)度,采用了上手容易的模塊化前端框架LayUI。該框架對后端開發(fā)者相當(dāng)友好,提供了豐富的組件和樣例,在相當(dāng)短的時間內(nèi)能夠使用LayUI 組件編寫出精美的網(wǎng)頁。TinyMCE 是一款富文本編輯器,TinyMCE 相比于LayUI 自帶的富文本編輯器,功能更加強(qiáng)大,插件和接口更加豐富,在系統(tǒng)中主要用于文章的發(fā)布、編輯等功能。
MVC(Model-View-Con-troller) 是一種軟件設(shè)計模式,它將程序的數(shù)據(jù)輸入、處理和輸出三個過程分離為模型層、控制器層、視圖層三個核心部分,使得任一部分的修改都不會影響其他部分[5]?;贛VC模式開發(fā)的程序具有可維護(hù)能力強(qiáng)、代碼重用性高、低耦合等特性,在各類Web 開發(fā)中被廣泛應(yīng)用,成為經(jīng)典的軟件設(shè)計模式。Go 語言中程序通過包(package)進(jìn)行管理,main 包是所有Go 程序的總?cè)肟?,系統(tǒng)自定義了routes、controller 和model三個包來實(shí)現(xiàn)MVC設(shè)計模式。
MVC設(shè)計模式和系統(tǒng)的主要結(jié)構(gòu)如圖1所示。Gin框架下接口都是通過路由進(jìn)行管理的,routes 包用于管理本系統(tǒng)的路由。webcontent 文件夾用于存放HTML 模板,通過Gin 框架的LoadHTMLGlob()函數(shù)進(jìn)行加載。static 文件夾用于存放css、js、ico等可以公開的靜態(tài)文件,通過Gin框架的Static()函數(shù)進(jìn)行加載。MVC 設(shè)計模式共分為5 個步驟:1)發(fā)送HTTP 請求。系統(tǒng)通過routes包中的路由接受用戶請求并轉(zhuǎn)發(fā)至控制器層。2)處理業(yè)務(wù)。系統(tǒng)源碼中controller包對應(yīng)控制器層,用于對用戶的請求進(jìn)行處理。controller包中的函數(shù)對請求數(shù)據(jù)進(jìn)行解析,交由模型層處理。3)返回結(jié)果。系統(tǒng)源碼中model 包對應(yīng)模型層,用于與數(shù)據(jù)庫的交互、數(shù)據(jù)格式的轉(zhuǎn)換、數(shù)據(jù)處理等功能。upload 文件夾用于存放上傳的文件,config 文件夾用于存放數(shù)據(jù)庫及程序的配置文件,由model 包中的函數(shù)對文件夾中數(shù)據(jù)進(jìn)行操作。model包中函數(shù)對數(shù)據(jù)進(jìn)行處理,并返回控制器層。4)響應(yīng)操作。在controller 包中通過Gin 框架提供的templates方法對加載的HTML模板進(jìn)行渲染。5)返回結(jié)果。routes 包路由將controller包中渲染的結(jié)果返回給用戶。

圖1 MVC設(shè)計模型和系統(tǒng)主要結(jié)構(gòu)
系統(tǒng)在功能設(shè)計過程中充分考慮單位職工的各類需求,設(shè)計了用戶與授權(quán)、文章投稿、一周會議安排、領(lǐng)導(dǎo)動態(tài)和版塊文章等模塊,按照使用權(quán)限分為瀏覽者、使用者和管理者三個角色。主要模塊與各角色的功能如表1所示。

表1 系統(tǒng)主要功能表
根據(jù)系統(tǒng)的功能設(shè)計,數(shù)據(jù)庫設(shè)計了用戶信息表、登錄信息表、部門信息表、應(yīng)用名稱表、個人應(yīng)用表、領(lǐng)導(dǎo)動態(tài)表、工作計劃表、投稿文章表、投稿附件表、版塊信息表、版塊用戶表和版塊文件表等表格。在關(guān)系型數(shù)據(jù)庫中,數(shù)據(jù)庫表之間存在一對一、一對多、多對多和多對一的四種對應(yīng)關(guān)系,系統(tǒng)數(shù)據(jù)庫中表關(guān)系如圖2所示。

圖2 數(shù)據(jù)庫表關(guān)系圖
根據(jù)系統(tǒng)的程序結(jié)構(gòu)、功能及數(shù)據(jù)庫的設(shè)計,完成對系統(tǒng)功能及數(shù)據(jù)庫的實(shí)現(xiàn),根據(jù)表1的設(shè)計,以瀏覽者角色為例,瀏覽主頁、會議安排等內(nèi)容,在開發(fā)環(huán)境下系統(tǒng)實(shí)現(xiàn)效果如圖3所示。

圖3 開發(fā)環(huán)境下瀏覽者身份的系統(tǒng)實(shí)現(xiàn)效果圖
以用戶與授權(quán)模塊為例,使用者登錄后臺、授權(quán)模塊入口、找回賬號等內(nèi)容,管理者對賬號的管理,在開發(fā)環(huán)境下系統(tǒng)實(shí)現(xiàn)效果如圖4和圖5所示。

圖4 開發(fā)環(huán)境下使用者的用戶授權(quán)模塊實(shí)現(xiàn)效果圖

圖5 開發(fā)環(huán)境下管理者的用戶授權(quán)模塊實(shí)現(xiàn)效果圖
系統(tǒng)主程序和數(shù)據(jù)庫部署在本單位的虛擬化集群中,虛擬化集群具有部署和運(yùn)維簡單方便且集中,資源能夠動態(tài)化分配,能耗和使用成本低廉等特性,在單位信息化建設(shè)中被廣泛應(yīng)用。單位早就部署了虛擬化主機(jī),通過向單位網(wǎng)絡(luò)管理部門申請,獲得一臺空白的虛擬機(jī)。在該虛擬機(jī)中安裝openEuler操作系統(tǒng),該操作系統(tǒng)在安裝過程中提供了openGauss 一鍵部署功能,免去了創(chuàng)建用戶、安裝依賴和配置環(huán)境變量等通過源碼編譯部署的步驟,極大的方便了部署操作。
openGauss 的數(shù)據(jù)及配置文件默認(rèn)安裝在/var/lib/opengauss/data 目錄下,在系統(tǒng)分區(qū)時應(yīng)注意分配好相應(yīng)的空間。操作系統(tǒng)安裝完成后默認(rèn)創(chuàng)建了opengauss 用戶用于數(shù)據(jù)庫的管理,同時也配置好了數(shù)據(jù)庫的開機(jī)自啟動,僅需簡單的配置便可以使用。首先通過SSH登錄到新安裝的操作系統(tǒng),初始化數(shù)據(jù)庫,創(chuàng)建新數(shù)據(jù)庫用戶并授予權(quán)限,然后修改pg_hba.conf 文件,設(shè)置允許連接的主機(jī)和數(shù)據(jù)庫,這樣就可以使用可視化的數(shù)據(jù)庫管理工具對數(shù)據(jù)庫進(jìn)行管理,值得注意的是openGauss采用了sha256的加密形式,最后按照實(shí)際情況修改postgresql.conf 文件中的最大允許連接數(shù)量,完成數(shù)據(jù)庫的配置。通過可視化管理工具連接數(shù)據(jù)庫,將開發(fā)環(huán)境中按照表關(guān)系圖設(shè)計的數(shù)據(jù)庫結(jié)構(gòu)轉(zhuǎn)移到生產(chǎn)環(huán)境,并配置好定期備份。
Go語言開發(fā)的程序部署簡單方便,無需其他運(yùn)行環(huán)境,在運(yùn)行環(huán)境建立相應(yīng)的用戶和目錄并進(jìn)行授權(quán),通過SFTP 協(xié)議將編譯好的程序文件和靜態(tài)文件拷貝至相應(yīng)的目錄下,配置好進(jìn)程守護(hù)和開機(jī)自啟動,即可完成主程序的部署。
本文介紹了基于Go 語言開發(fā)了一套穩(wěn)定易用,用戶和權(quán)限管理靈活的內(nèi)容管理系統(tǒng),實(shí)現(xiàn)了單位內(nèi)容信息的發(fā)布與獲取。系統(tǒng)開發(fā)和使用成本低廉,采用了開源技術(shù)進(jìn)行開發(fā),大大降低了對于商用軟件的依賴。系統(tǒng)采用了MVC 設(shè)計模式,拓展靈活,可維護(hù)能力強(qiáng),系統(tǒng)的B/S架構(gòu)使得用戶不需要安裝客戶端,通過瀏覽器直接訪問系統(tǒng),獲取信息更加方便快捷。系統(tǒng)在前端方面仍然有較大提升空間,下一步將對系統(tǒng)的前端進(jìn)行美化和提升,運(yùn)用現(xiàn)在流行的Vue 框架和UI 庫,替換目前使用的LayUI,讓系統(tǒng)變得更加美觀。內(nèi)容管理系統(tǒng)的設(shè)計、部署和使用,極大地方便了用戶獲取各類信息,促進(jìn)了單位信息化的發(fā)展。