我正在编写一个具有用于编辑文档的用户界面的 Web 应用程序。实现像维基百科这样可以查看文档编辑的历史功能的最佳方法是什么?
4 回答
那么您将不得不存储当前文档和存档更改以进行比较。通常主文档是数据库中的一个,然后保存时的旧版本将保存到另一个存档数据库或服务。
然后你可以拉出最新和最新的存档版本,并与差异算法进行比较。
Python 有一个 diff 算法工具 difflib:http ://docs.python.org/library/difflib.html 还有一个目录和文件比较工具:http ://docs.python.org/library/filecmp.html#module-filecmp
许多其他语言也有差异算法实现。
您可以只存储更改时的增量,然后像 Subversion 之类的 Berkley DB 一样重新创建,但我建议为简单起见,只需保存内容的副本,然后比较每个最新内容或用户选择的内容。
使用版本控制系统作为您的基础(将每个版本保存到 vcs 中),它们将更改存储在增量中。然后您可以使用它们的差异功能来获取差异,但是您必须解析输出。例如,在 git 中,您可以通过简单地将它们的哈希作为参数提供给git-diff来从两个不同的修订版中获取输出。
也就是说,如果您不愿意使用现有系统。
在不知道您使用的是什么框架和其他东西的情况下,这是一个很难很好回答的问题。
您是否使用数据库进行存储?假设pages
您的数据库中有一个表,为什么不创建一个pages_versions
表来保存旧版本?
将任何内容保存到pages
表中时,首先将副本插入到pages_versions
. 检索旧版本将不会比通过任何其他一对多关系加载数据更困难。此时,您可以使用彩色差异或诸如此类的东西来美化数据。
我相信一些框架现在支持使用版本控制系统作为存储后端,因此这也可能值得研究。
您是指后端设置,还是突出显示个别更改的前端?
我不能帮你做前端,但是......
如果是后端,您需要的是:
- 带有say、id 和title 列的“文档”表。
- 一个“版本”表,其中包含 document_id (FK)、body_text、edit_date、author、version 列
- 在您的应用程序中,首先在文档表中创建一个新的文档引用,然后将数据作为新版本存储在版本表中。当用户更新旧文档时,将使用 document_id 中相同的文档引用创建新版本。
(我想我可能没有很好地解释这一点,很抱歉!)
顺便说一句,如果您使用的是 Rails,那么有几个插件可以为您完成大部分工作。Acts_As_Versioned 是第一个想到的。