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

圖1 MVC設計模型和系統主要結構
系統在功能設計過程中充分考慮單位職工的各類需求,設計了用戶與授權、文章投稿、一周會議安排、領導動態和版塊文章等模塊,按照使用權限分為瀏覽者、使用者和管理者三個角色。主要模塊與各角色的功能如表1所示。

表1 系統主要功能表
根據系統的功能設計,數據庫設計了用戶信息表、登錄信息表、部門信息表、應用名稱表、個人應用表、領導動態表、工作計劃表、投稿文章表、投稿附件表、版塊信息表、版塊用戶表和版塊文件表等表格。在關系型數據庫中,數據庫表之間存在一對一、一對多、多對多和多對一的四種對應關系,系統數據庫中表關系如圖2所示。

圖2 數據庫表關系圖
根據系統的程序結構、功能及數據庫的設計,完成對系統功能及數據庫的實現,根據表1的設計,以瀏覽者角色為例,瀏覽主頁、會議安排等內容,在開發環境下系統實現效果如圖3所示。

圖3 開發環境下瀏覽者身份的系統實現效果圖
以用戶與授權模塊為例,使用者登錄后臺、授權模塊入口、找回賬號等內容,管理者對賬號的管理,在開發環境下系統實現效果如圖4和圖5所示。

圖4 開發環境下使用者的用戶授權模塊實現效果圖

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