王铮清,刘壮峰
(舟山市气象局,浙江舟山 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,让系统变得更加美观。内容管理系统的设计、部署和使用,极大地方便了用户获取各类信息,促进了单位信息化的发展。