将更改保存在带有时间戳的contentitable中


Save changes in contenteditable with timestamp

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

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

现在,问题是:我如何保存信息(何时更改了哪些部分)最好?

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

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

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

您想要实现的是源代码控制世界中称为" annotation "或"blame"的特性(尽管您只想要更新日期而不是日期+作者或简单的作者)。

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

  • 存储最新版本,只保留增量(如统一差异,我的首选)

  • 存储所有版本并动态计算增量

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

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

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

应该在用户提交信息时保存此信息。当用户想要查看信息时,几乎不需要进行任何计算。

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

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

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

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