类似掘金的【内容管理】功能应该如何设计?

1,838 阅读6分钟

前言

在许多设计或编辑功能的系统中,都存在着内容管理的概念。内容管理不仅需要考虑内容的发布功能,还需要考虑内容的编辑功能。以博客系统为例,博客系统的核心功能之一是内容的管理。在博客系统中,内容存在两种基本状态:编辑和发布。一般来说,维护好这两种状态即可满足需求。然而,如果内容作者希望内容存在多个版本,例如在创作过程中保存不同阶段的最佳版本,这就衍生出了内容的版本管理需求。那么,如何设计一个满足这些需求的内容管理功能呢?

提示

在这里我们可以暂停一下,拿出纸笔来设计一下,然后再继续阅读。你也可以将你的设计思路和想法分享在评论区,让大家一起学习和讨论。

分析

在内容管理中,草稿箱的功能是保存内容的编辑状态,但是单纯的草稿箱无法满足内容版本管理的需求。因此,我们需要引入版本(version)的概念来实现内容版本的控制。尽管Git等版本控制工具非常好用,但是直接集成到博客系统或其他业务系统可能会面临业务人员难以上手和集成成本过高的问题。因此,我们需要将Git的概念抽象并应用到内容管理中。

将内容管理的状态抽象为与Git相对应的概念:

  • 编辑态(edit):对应于本地的commit存储的内容。
  • 发布态(published):对应于push到远程仓库的内容。

读者所看到的内容都是已经发布态(published)的内容,可以将读者类比为远程仓库。作者可以多次编辑保存编辑态(edit)的内容,然后将多次保存的内容发布一次。对于Git来说,本地commit的内容就是草稿箱的内容,远程仓库的内容就是发布的内容。对于内容管理,编辑态(edit)就是草稿箱的内容,发布态(published)就是读者看到的内容。

分析主要的原因是:Git等工具对于业务人员上手困难、系统集成成本过高。

多版本

版本管理是Git的强项。通常情况下,如果需要同时存在多个版本,我们会为每个版本在Git上创建一个分支,每个分支都可以进行commit和push。在内容管理中,我们也可以类似地为每个版本的内容创建自己的“空间”,每个版本都有自己的编辑态(edit)和发布态(published)。那么用户看到的内容应该是哪个版本呢?答案是:主版本(主分支)上的发布态(published)内容。在获取文章列表时,博客只扫描主版本的发布态(published)内容,即读者可以看到的内容。

主空间和版本空间

为了实现上述功能,我们引入了主空间和版本空间的概念:

  • 主空间:供阅读者或内容列表扫描的空间。该空间中的内容分为编辑态和发布态。
  • 版本空间:供版本预览或版本列表扫描的空间。该空间中的内容也分为编辑态和发布态。

需要注意的是,编辑态的内容和发布态的内容并不一定一致。

功能实现

为了实现上述功能,我们需要实施以下关键动作:

  • 内容列表扫描:扫描主空间中所有发布态的内容,提供给访问者阅读。
  • 版本列表扫描:扫描版本空间中所有发布态的内容,提供给内容作者查看不同版本时阅读。
  • 编辑:编辑主空间中处于编辑态的内容。
  • 保存:将编辑态的内容持久化到主空间的编辑态。
  • 发布:将主空间中编辑态的内容快照到主空间的发布态。
  • 保存为版本:将主空间中编辑态的内容快照到版本空间的发布态和编辑态。
  • 版本编辑:编辑版本空间中处于编辑态的内容。
  • 版本保存:将版本空间中编辑态的内容持久化。
  • 版本发布:将版本空间中编辑态的内容快照到版本空间的发布态。
  • 应用此版本:将版本空间中发布态的内容快照到主空间的编辑态。

通过实施以上动作,我们可以实现内容的编辑、保存、发布以及版本的管理和切换,从而满足内容管理的需求。这样的设计能够使读者更好地理解和使用内容管理功能。如果对这个设计有任何问题或建议,欢迎在评论区留言。

设计与实现

数据库设计

我们可以使用以下数据库表来实现内容管理功能:

  • 文章(Articles)表:存储文章的基本信息,包括文章ID、标题、作者等。
  • 版本(Versions)表:存储每个版本的信息,包括版本ID、所属文章ID、编辑态(edit)和发布态(published)。
  • 主版本(Main Version)表:存储每个文章的主版本信息,包括文章ID和对应的发布态(published)版本ID。

关键动作的实现

下面是关键动作的实现示例:

  • 创建文章:当用户创建一篇新文章时,会在文章表中创建一条新记录,并在版本表中创建一个新版本,将该版本的编辑态(edit)和发布态(published)设置为初始状态。
  • 编辑文章:当用户编辑文章时,将更新版本表中对应版本的编辑态(edit)。
  • 发布文章:当用户准备发布文章时,将更新版本表中对应版本的发布态(published),并更新主版本表中对应文章的发布态(published)版本ID。

总结

  • 基于上述模式的内容管理,可以支持【草稿箱】功能的草稿编辑和正式文档的区分,并且同一内容的记录只有一条。
  • 基于主空间和版本空间的划分,可以做到版本内容的编辑与正式文档的编辑同时进行。版本的编辑不会影响到正式文档的预览,同一内容可以存在多个在编辑的版本。
  • 内容列表只需要关注主空间的发布态内容即可,无需做过多的逻辑过滤即可拿到发布的内容。