我有一个用户可以写的<div contenteditable="true" />
,其长度几乎是无限的
div中的数据将在更改时保存,并在MySQL数据库中显示时间戳。
现在我的目标是在左侧有一个小注释,告诉用户何时创建文档的每个部分(分辨率应该是几天)。
现在,问题是:如何最好地保存信息(什么时候更改的部分)?
到目前为止,我考虑了以下两个看似可以改进的选项:
高度赞赏任何意见/建议/建议!
答案 0 :(得分:12)
您要实现的是源代码控制领域中称为“注释”或“责备”的功能(尽管您只需要更新日期而不是日期+作者或仅仅是作者)。
要做到这一点,你需要一种方法来制作差异(php-diff可以完成工作)并获得文本的版本。 有几种策略:
存储最新版本并仅保留增量(例如统一差异,我的偏好)
即时存储所有版本和计算增量
一旦你拥有了当前版本和增量列表(如果超过三十几个delta,你肯定可以缩短列表,让用户询问更多,如果非常重要)。您可以将增量组合在一起,这是注释阶段发生的位置,因为您可以记住每行的哪个版本。实际上编写非常简单(从最新版本开始,补丁中添加的所有行都是最新的,另一行需要解释,所以再次使用下一个补丁,直到你找到你想要处理的最古老的补丁,其余的行来自该版本或最早的行,因此可以使用一些标记“在...之前或之前”。
Google has a diff library for Javascript所以可以在用户机器上做所有艰苦的工作。他们也在这个库中有补丁部分。我没有找到注释/责备库。
答案 1 :(得分:4)
您可以采用的一种方法是使用表格来修改div
。您经常可以在此表中添加一个新条目,其中包含内容和时间戳,因此可以跟踪编辑的所有修订。然后,要找出更改的内容,您可以简单地比较两个条目,以找出已添加的内容,保持不变并删除。
答案 2 :(得分: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'中收集信息。这个过程又重新开始。