9

我有一个<div contenteditable="true" />用户可以写的,长度几乎是无限的。
div 中的数据在 MySQL 数据库中以时间戳保存。

现在我的目标是在左侧有一个小注释,告诉用户文档的每个部分何时创建(分辨率应该以天为单位)。

现在,问题是:我怎样才能最好地保存信息(什么部分发生了变化)?

到目前为止,我考虑了以下选项,它们似乎都可以改进:

  1. 每次用户访问文档末尾的站点时,我都会插入一个标志(例如,带有类和存储编辑开始的数据属性的空跨度)。然后在调用保存脚本时将此标志保存到数据库中。这个选项可以很容易地在侧面显示日期 - 我只需将它们放在与空跨度相同的高度,跨度告诉我日期。缺点是:用户可能会意外删除时间戳跨度,并且如果用户长时间不关闭窗口,则不会插入新的时间跨度(这可以通过每 X 分钟插入新的时间戳跨度来避免,因此删除部分是更相关)
  2. 每次将数据传递到保存脚本时都尝试进行字符串差异比较,并且仅使用时间戳保存差异。然后,当页面加载时,将所有部分按正确的顺序放在一起,并在 Javascript 中将日期注释放在正确的位置。虽然这对我来说听起来像是很多开销 + 当旧部分被更改时,两个部分可能会合二为一,等等。总而言之,这些选项听起来非常复杂。

非常感谢任何输入/想法/建议!

4

3 回答 3

12

您要实现的是源代码控制世界中称为“注释”或“责备”的功能(尽管您只需要更新日期而不是日期+作者或简单的作者)。

要正确地做到这一点,您需要一种方法来制作差异(php-diff可能会完成这项工作)并获取文本的版本。有几种策略:

  • 存储最新版本并仅保留增量(例如统一差异,我的偏好)

  • 即时存储所有版本并计算增量

一旦你有了当前版本和 deltas 列表(如果超过几十个 deltas,你绝对可以缩短列表,让用户询问更多是否真的很重要)。您将增量组合在一起,这是注释阶段发生的地方,因为您可以记住每行来自哪个版本。编写其实很简单(从最新开始,补丁中添加的所有行都是最新的,其他需要解释,所以从下一个补丁重新开始,直到你到达你想要处理的最古老的补丁,其余行来自该版本或最早的版本,因此可以使用一些标记为“在或之前”的标志)。

Google 有一个用于 Javascript 的 diff 库,因此可以在用户机器上完成所有艰苦的工作。他们在这个库中也有补丁部分。我没有找到注释/责备库。

于 2013-04-11T08:04:22.717 回答
4

您可以做到这一点的一种方法是为div. 每隔一段时间,您可以在此表中添加一个新条目,其中包含内容和时间戳,因此可以跟踪所有编辑修订。然后,要找出更改的内容,您可以简单地比较两个条目以找出添加、保持不变和删除的内容。

于 2013-04-06T10:11:20.887 回答
4

当用户提交信息时,您应该保存此信息。用户想要查看信息的那一刻,应该几乎没有任何计算。

在后端创建两个表。在一个表中,我们称之为“currentdocs”,您始终存储最新版本的数据。当用户加载文档时,所有信息都来自这个表'currentdocs'。在另一个表中,我们称它为“docsintime”,您保存每个新的保存。它有一个指向“currentdocs”表的外键,您可以通过选择具有该外键的最大 id 来找到该表“docsintime”中的最后一行。一个 select 语句可以是这样的:

select id from docsintime where cur_key = x order desc limit 1;

在这两个表中,您是否为每个相关部分存储了它已更改的最新时间戳。

保存新文档时,您会在“docsintime”表中获得上次保存的版本。您将所有相关部分与该记录中的数据进行比较。如果没有差异,则将相关部分的时间戳复制到要保存的新记录中。如果它确实不同,那么您是否为该相关部分创建一个新的时间戳。比较之后,您是否将新记录保存在两个表“currentdocs”和“docsintime”中。您更新表“currentdocs”并在表“docsintime”中插入一条新记录。只有使用新文档,您才能在表“currentdocs”中进行插入。对于该文档的下一个请求,您只需从“currentdocs”表中收集信息。这个过程重新开始。

于 2013-04-09T16:00:01.037 回答