文章篇幅较长,慎入javascript
随着网络应用的丰富和发展,网站每每不能迅速跟进大量信息衍生及业务模式变革的脚步,经常须要花费许多时间、人力和物力来处理信息更新和维护工做。 ——引自「百科」html
小公司、小网站因人员、技术问题,在内容管理处理上处于「食之无味弃之惋惜」的一种状况:内容维护会常常打乱开发人员节奏,可是又没有精力去思考投入统一去解决相似问题。前端
开始以前,咱们先看下小网站通常会存在哪些内容须要维护配置:vue
遇到这些内容维护,好的小公司可能会一开始就同步创建一个配置发布管理功能,其余的可能由于工期赶就代码写死,经过发布解决,发布频繁了才去作配置发布管理功能。java
抓狂
做为一个有追求的攻城狮,这样的重复性工做应该主动拒绝,经过工具或者流程去改善生活git
在很早之前,内容管理就成为一个重要的应用领域,而且伴随着时间、技术的推移,CMS的功能也变得愈来愈强大。github
CMS简单来讲就是内容管理系统(Content Management System),主要解决用户网站建设与信息发布中常见的问题和需求,运营同窗能够经过它进行网站内容新增、修改、审核发布,提升信息发布效率和准确性;其技术核心思想是分离内容的管理和设计。web
篇幅缘由,这里并不想去对比和介绍业界相关的系统,只是想大概介绍下相关类型数据库
不对外
从小公司的诉求和运营的专业水平来看,相似云凤蝶这样的基于组件化搭建页面的CMS平台,其操做成本高,另外组件开发、维护成本也很高,小公司也很难有业务发展需求,能够沉淀出本身的组件模块。因此除非一开始就不打算投入网站服务建设,只是简单得搭个网站门面,才会使用相似可视化建站服务。json
下面的篇幅咱们仍是以实现「传统CMS系统」为目标,去考虑如何作得更好
那么小网站对内容管理又有哪些诉求呢?
- 上篇文章提到的jsonschema-form-vue - 自动生成表单库,就能快速生成体验一致的表单;
- 经过抽象将内容表设计成一套统一结构,一方面避免每种配置都建表,另外一方面也容易提供统一API;
- 关于正确性保障,能够经过 预览 -> 审核发布流程 提早保障;
不过虽然保证了内容配置管理,可是文章一开始提到的「新闻公共」、「帮助」、「关于咱们」这些内容类似、字段一致的页面,难道每次都要建立相似的配置管理,而后在web应用建立相关页面,再发布应用吗?
- 须要提供一套页面模板机制,经过复制页面模板,快速复制同类型页面以及跟它关联的内容配置;经过这种关联关系,应用只要经过路由
pageId
去查询页面相关的内容,便可避免发布
基于诉求,先明确解决小网站内容管理须要完成的目标
经过内容,对数据模型进行抽象,主要分红如下三层:
最底层组件,它包含了基于 jsonschema-form-vue的表单相关配置,可使用版本管理,让配置升级更安全。
{
id: Schema.Types.ObjectId,
name: String, // 配置名称
version: String, // 版本号
jsonSchema: String, // JSONSchema
definition: String, // Form Definition
histories: Array, // 历史记录
author: String, // 用户
createdAt: Date, // 建立时间
modifiedAt: Date // 修改时间
}
复制代码
模块是运营内容编辑单元,基于组件表单配置去生成表单,能够保存草稿和发布数据,用于预览和线上内容
{
id: Schema.Types.ObjectId,
name: String, // 模块名称
title: String, // 模块标题
siteId: Schema.Types.ObjectId, // 所属站点ID
pageId: Schema.Types.ObjectId, // 页面ID
componentId: Schema.Types.ObjectId, // 组件ID
componentVersion: String, // 组件版本号
model: {}, // 配置数据
draft: {}, // 配置草稿
status: Number, // 状态 0: 配置更新, 1: 内容更新, 2: 发布审核
online: Boolean,
histories: Array, // 历史记录
author: String, // 用户
createdAt: Date, // 建立时间
modifiedAt: Date // 修改时间
}
复制代码
为何不把表单配置直接放模块,而是增长组件这一层? 这主要是由于模块和组件是「多对一」的关系,一个表单配置可能会被用到多个模块;另外上面提到的类似页面,会复制出类似模块,若是将表单配置放在模块表中,会存在重复数据,后续也很难同步配置升级
页面就是浏览器中看到页面,主要用来保存模块的关联关系,一个页面可能存在多个独立模块
{
id: Schema.Types.ObjectId,
name: String, // 页面名称
url: String, // 页面url
realUrl: String, // 页面实际url
useRoute: Boolean, // 是否启用路由规则
router: String, // 路由规则
siteId: Schema.Types.ObjectId, // 所属站点ID
modules: String, // 模块
owner: String, // 用户
createdAt: Date, // 建立时间
modifiedAt: Date // 修改时间
}
复制代码
为何有url又有实际url?这主要考虑后面的「可视化编辑」功能,须要去请求真实页面,因此在页面复制发布时,须要基于「页面路由」生成实际url
由于数据模型的核心是配置和内容,因此选用了文档型数据库
MongoDB
抽象了数据模型,先经过设计看下CMS须要提供哪些功能
设计上,CMS遵循如下几点原则:
因此:
Web应用接入只要改动如下几点:
?preview=true
则实时请求CMS草稿数据;moduleId
标识经过流程能够更清楚了解CMS的功能
建立内容模块,引用相应的组件配置(内容模块才是运营内容维护单元);若是有初始数据,能够帮运营填入;复制moduleId
到web应用中调用相应方法获取CMS数据;而后,发布web应用后,开发的工做就完成了,之后的内容维护都交由运营同窗。
运营同窗维护模块内容,有两种方式: 3.1 经过模块名查找模块进行编辑 3.2 经过页面编辑进行可视化编辑,见下面
内容编辑确认无误后,进行保存预览
预览确认没有问题后,审核发布,内容上线
到这里,CMS最基本的功能已经完成了;不再用由于文案内容改动,须要进行应用发布重启了
接下来的篇幅最后介绍「页面复制」和「可视化编辑」功能
上文提到的新闻公告、关于咱们,或者一些风格相似的活动页面,须要提供快捷复制建立新页面,而后修改页面内容便可。
主要思考以下:
pageId
获取数据接口,这样相似页面能够经过路由规则params或query
来获取对应页面数据渲染;最后必须来点看起来科技感满满的功能来个收尾,以提供该CMS系统的档次,直接跟前沿接轨。
在具有了模块编辑功能后,可视化编辑就是如何获取编辑的数据并实时渲染页面预览,同时预览页面可识别可编辑模块,并表现出本身能被编辑,引发运营点击修改的欲望:
moduleId
,而后经过规则识别在CMS系统中引入「可视化编辑.js」,CMS在编辑时经过iframe引入线上页面,作如下事情:
就这样,立刻提供一个档次
到这里,文章就结束了,在工做过程当中,多去发现工做流程中,重复性的、本身不喜欢去处理但又不得不去处理的活儿,去思考如何经过工具、流程化去处理它们;让事情变得简单、可复制;这个思考和实现的过程,不只能提高你的设计和技术能力,同时也能增长公司对你的依赖性,走向升职加薪的路上。