文章篇幅較長,慎入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引入線上頁面,作如下事情:
就這樣,立刻提供一個檔次
到這裏,文章就結束了,在工做過程當中,多去發現工做流程中,重複性的、本身不喜歡去處理但又不得不去處理的活兒,去思考如何經過工具、流程化去處理它們;讓事情變得簡單、可複製;這個思考和實現的過程,不只能提高你的設計和技術能力,同時也能增長公司對你的依賴性,走向升職加薪的路上。