从零打造一款轻量且天然支持SSR的CMS系统——simpleCMS

简介: 2年前笔者开发了一款基于 nodejs 的全栈开源 cms 系统 XPCMS, 主要是为了解决技术开发者搭建自身内容平台的局限以及降低使用成本, 虽然1.0版本已经完成, 但是从整体部署和二次开发的便捷度上还是存在很多缺点, 更加适合有一定技术能力的开发者来使用.为了解决 XPCMS 的不足, 去年笔者和朋友特地开发了一款轻量便捷的内容管理系统——simpleCMS, 目前已在 github 上开源, 且能同时适配PC端和移动端.

网络异常,图片无法展示
|


2年前笔者开发了一款基于 nodejs 的全栈开源 cms 系统 XPCMS, 主要是为了解决技术开发者搭建自身内容平台的局限以及降低使用成本, 虽然1.0版本已经完成, 但是从整体部署和二次开发的便捷度上还是存在很多缺点, 更加适合有一定技术能力的开发者来使用.

为了解决 XPCMS 的不足, 去年笔者和朋友特地开发了一款轻量便捷的内容管理系统——simpleCMS, 目前已在 github 上开源, 且能同时适配PC端和移动端.


目前市面上已经有很多成熟的 cms 系统, 比如 worldPress, 博客系统 hexo, 对于技术开发者来说使用和部署很简单, 但是定制和自定义扩展方面, 却需要一定的技术门槛和开发成本.


基于以上一些痛点和局限, 我们开发了一款简单易用, 且天然支持服务端渲染(SSR)的全栈 cms 系统, 方便大家轻松定制自己的博客网站. 笔者接下来就来带大家一起分析 simpleCMS 的功能和技术实现.


技术架构和实现方案



为了降低大家的使用和部署成本, 我们采用了如下技术实现:


  • 服务层: koa2 + nodejs + jsonSchema(当然其中还使用了很多nodejs中间件)
  • 前台页面: pug(结合nodejs实现前后端同构, 且天然的ssr)
  • 后台管理: umi3.0 + react + antd + axios + typescript(当然还用了很多前端插件, 比如富文本, md编辑器)
  • 系统/服务器相关: linux / pm2 / nginx


基本架构模式如下图所示:



网络异常,图片无法展示
|


系统页面架构图:


网络异常,图片无法展示
|


功能分析



接下来笔者就来介绍 simpleCMS 的功能点. 我们先来分析一下后台管理系统.


后台管理系统功能分析



后台管理系统是动态博客系统必备的模块, 它能很方便的管理我们的网站数据. 这里笔者先来带大家看一下后台管理系统的基本模块:


  • 登录页面
  • 数据大盘
  • 内容管理
  • 页面配置
  • 广告配置
  • 用户信息管理
  • 多语言支持


以上是 cms 管理系统必备的模块, 这里我们基本上采用react hooks 来写, 具体页面如下:


  1. 登录页面


网络异常,图片无法展示
|


2. 数据大盘


网络异常,图片无法展示
|


3. 文章管理


网络异常,图片无法展示
|


4. 内容编辑


网络异常,图片无法展示
|


5. 多语言支持


网络异常,图片无法展示
|


其他页面就不一一展示了, 感兴趣的朋友可以体验一下. 主要技术采用 umi + antd + react + typescript 实现, 感兴趣可以在 github 上参考学习.


前台基本功能分析



前台主要是我们的博客网站, 这里采用 pug 这个模版引擎来实现, 交互功能使用大家最熟悉的jquery.前台基本模块有:


  • 博客首页
  • 文章列表页
  • 文章详情页


对应的交互功能有点赞, 评论, 文章搜索功能等, 基本页面如下:


  1. 首页


网络异常,图片无法展示
|


2. 列表页


网络异常,图片无法展示
|


3. 详情页


网络异常,图片无法展示
|


4. 评论和点赞


网络异常,图片无法展示
|


由于pug模版引擎适合做一些展示型的网站, 所以非常适合用在cms系统中, 我们也可以使用ejs等模版引擎.


技术实现细节



由于整个cms 系统是一个完整的技术闭环, 数据流转都是相关的, 这里笔者主要总结一下实现一个cms的技术细节.


  • 数据统计功能实现 —— 采用nodejs定时任务(node-schedule)
  • 富文本和md编辑器实现
  • 后台多语言实现方案
  • 内容管理流程设计
  • pug 模版和数据交互
  • jsonSchema 数据结构设计
  • 手写简单加密解密算法
  • 跨域解决方案以及用户权限设计
  • pm2管理node进程以及做负载均衡
  • 多进程场景下的并发锁设计


数据统计功能实现



数据统计主要是统计网站的pv, 单篇文章阅读量和点赞量, 为了更好的进行分析我们需要对单日的数据进行统计和存库, 具体实现就是利用定时任务在一天结束前进行数据的统计, 这里我们用 node-schedule来实现, 具体使用方式笔者也在之前的文章中做了介绍, 感兴趣可以参考一下.


网络异常,图片无法展示
|


基本使用如下:


letschedule=require('node-schedule');
lettestJob=schedule.scheduleJob('42 * * * *', function(){
console.log('将在未来的每个时刻的42分时执行此代码, 比如22:42, 23:42');
});

富文本和md编辑器方案实现



这里我们用的富文本组件是braft,  功能和可扩展性基本满足业务需求, md编辑器是程序员写博客的基本方式, 这里主要采用了for-editor, 其次就是对其进行了二次封装来实现支持剪切板功能.


国际化方案



多语言主要使用的react-intl, 由于umi 对其有很好的集成, 所以说我们只需要搭建基本的多语言规则即可. 比如在项目目录里建立locales文件夹, 然后存放zh(中文)/en(英文)文件即可, 基本的代码如下:


// locales/en/userexportdefault {
simpleCMS_DESC: 'Easy to use CMS system, help everyone to have their own website blog.',
CopyrightText: 'SimpleCMS r&d team',
}
// locales/zh/userexportdefault {
simpleCMS_DESC: '简单易用的cms系统, 助力每个人都能拥有自己的网站博客。',
CopyrightText: 'SimpleCMS 研发团队'}

如果对多语言实现方案感兴趣的, 可以参考simpleCMS源码.


后期会继续写对应的文章来介绍具体的实现方案, 感兴趣可以持续关注和交流.

github地址: 传送门


simpleCMS开发伙伴





目录
相关文章
|
存储 Java 调度
开发踩坑记录之二:谨慎使用Spring中的@Scheduled注解
在一些业务场景中需要执行定时操作来完成一些周期性的任务,比如每隔一周删除一周前的某些历史数据以及定时进行某项检测任务等等。在日常开发中比较简单的实现方式就是使用Spring的@Scheduled(具体使用方法不再赘述)注解。但是在修改服务器时间时会导致定时任务不执行情况的发生,解决的办法是当修改服务器时间后,将服务进行重启就可以避免此现象的发生。本文将主要探讨服务器时间修改导致@Scheduled注解失效的原因,同时找到在修改服务器时间后不重启服务的情况下,定时任务仍然正常执行的方法。 @Scheduled失效原因分析 解析流程图 使用新的方法
开发踩坑记录之二:谨慎使用Spring中的@Scheduled注解
|
传感器 IDE 物联网
ESP8266接入阿里云物联网平台上传温湿度数据
本文章使用NodeMCU(ESP8266)开发板和SHTC3温湿度传感器接入阿里云物联网(IoT)平台,并上传读取到的温湿度数据。
23409 6
ESP8266接入阿里云物联网平台上传温湿度数据
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
763 17
|
JavaScript 索引
炸裂!Vue3 中使用 Hook 实现按住 Shift 快速勾选el-table 功能,太丝滑了!
炸裂!Vue3 中使用 Hook 实现按住 Shift 快速勾选el-table 功能,太丝滑了!
炸裂!Vue3 中使用 Hook 实现按住 Shift 快速勾选el-table 功能,太丝滑了!
|
JavaScript 数据可视化 图形学
iCraft Editor - 助你轻松绘制出色的立体架构图
iCraft Editor是一款创新工具,专为绘制立体架构图设计,带来直观且吸引人的3D视觉体验。它简化了复杂系统的表达,支持自由旋转与缩放,让用户从多角度审视设计。简洁界面与丰富图形库让操作变得简单快捷,即使是新手也能迅速上手。iCraft Editor支持子场景嵌套及外部模型导入,适用于软件架构设计、系统部署维护等多种场景,提升沟通效率。无需编程基础,即可在线免费使用,轻松实现复杂设计的可视化。开启3D新视角,让您的创意无限延伸![官网](https://icraft.gantcloud.com)
3309 1
iCraft Editor - 助你轻松绘制出色的立体架构图
|
Ubuntu Devops 云计算
ubuntu docker-compose编排容器并且设置自启动
使用Docker Compose编排容器并设置为Ubuntu系统的自启动服务,不仅优化了应用的部署流程,也提升了运行时的可管理性和可靠性。通过上述步骤,您可以轻松实现这一目标。维护此类服务时,记得定期检查和更新您的 `docker-compose.yml`文件,确保所有的服务都符合当前的业务需求和技术标准。在云计算和微服务架构不断演进的今天,掌握Docker Compose等工具对于DevOps和软件工程师来说,变得尤为重要。
1353 3
基于simulink的模糊PID控制器建模与仿真,并对比PID控制器
在MATLAB 2022a的Simulink中,构建了模糊PID和标准PID控制器模型,对比两者控制输出。模糊控制器采用模糊逻辑处理误差和误差变化率,通过模糊化、推理和去模糊化调整PID参数。模糊PID能更好地应对非线性和不确定性,而标准PID虽然简单易实现,但对复杂系统控制可能不足。通过仿真分析,可选择适合的控制器类型。
|
存储 网络协议 网络架构
|
域名解析 IDE Java
在 Maven 项目中运行 JUnit 5 测试用例
本文为大家演示了如何如何编写JUnit 5测试用例以及在Maven项目中运行JUnit 5测试用例的过程。
3540 0
在 Maven 项目中运行 JUnit 5 测试用例
|
JavaScript 前端开发 API
用Python和Vue构建内容管理系统(CMS):一步步指南
【4月更文挑战第10天】本文介绍了如何使用Python的Django框架和前端的Vue.js构建内容管理系统(CMS)。Django提供后端支持,遵循MTV模式,Vue.js则用于创建数据驱动的用户界面。步骤包括环境准备、Django项目与应用创建、定义数据模型、创建API接口、搭建Vue项目、集成Django与Vue、性能优化及部署上线。这种结合充分利用两者优势,实现高效、可扩展的CMS解决方案,适应未来智能化、个性化的趋势。
1073 0