Реализация функции истории а-ля Википедия - PullRequest
2 голосов
/ 12 июня 2009

Я пишу веб-приложение с пользовательским интерфейсом для редактирования документов. Каков наилучший способ реализовать функцию истории, например, в Википедии, где можно просматривать изменения в документе?

Ответы [ 4 ]

3 голосов
/ 12 июня 2009

Ну, вам нужно будет сохранить текущий документ и архивировать изменения для сравнения. Обычно основным документом является тот, который находится в базе данных, тогда более старые версии при сохранении сохраняются в другой архивной базе данных или службе.

Затем вы можете получить последнюю и последнюю архивную версию и сравнить ее с алгоритмом сравнения.

В Python есть инструмент diff для алгоритма difflib: http://docs.python.org/library/difflib.html Также инструмент сравнения каталогов и файлов: http://docs.python.org/library/filecmp.html#module-filecmp

Многие другие языки также имеют реализации алгоритма сравнения.

Вы можете просто сохранить дельты при изменении и воссоздать, как в Berkley DB, как Subversion, но я для простоты рекомендую просто сохранить копию содержимого, затем сравнить каждую из последних или выбранную пользователем.

1 голос
/ 12 июня 2009

Используйте систему управления версиями в качестве основы (сохраняйте каждую версию в виде vcs), они хранят изменения в дельтах. Затем вы можете использовать их функции сравнения, чтобы получить различия, но тогда вам придется анализировать вывод. В git, например, вы можете получить выходные данные из двух разных ревизий, просто присвоив их хэш в качестве параметра git-diff .

То есть, если вы не желаете использовать существующую систему.

0 голосов
/ 12 июня 2009

Вы имеете в виду настройку внутреннего интерфейса или интерфейс с выделенными отдельными изменениями?

Я не могу помочь вам с битом переднего конца, но ...

Если это серверная часть, то вам нужно:

  1. таблица документов со столбцами скажем, идентификатором и заголовком.
  2. таблица версий с колонками для document_id (FK), body_text, edit_date, author, version
  3. В вашем приложении сначала создается новая ссылка на документ в таблице документов, затем данные сохраняются как новая версия в таблице версий. Когда пользователь обновляет старый документ, создается новая версия с той же ссылкой на документ в document_id.

(Я думаю, что я, вероятно, не очень хорошо объяснил это, так что извините за это!)

Кстати, если вы используете Rails, есть несколько плагинов, которые сделают большую часть этого за вас. Acts_As_Versioned - первое, что приходит на ум.

0 голосов
/ 12 июня 2009

Не зная, какие рамки и что вы используете, на этот вопрос сложно ответить хорошо.

Используете ли вы базу данных для хранения? Допустим, в вашей базе данных есть таблица pages, почему бы не создать таблицу pages_versions для хранения старых ревизий?

При сохранении чего-либо в таблицу pages сначала вставьте копию в pages_versions. Извлечение старых версий в таком случае будет не более сложным, чем загрузка данных через любые другие отношения. На этом этапе вы можете украсить данные с помощью цветного сравнения или еще чего-нибудь еще.

Я полагаю, что некоторые фреймворки теперь поддерживают использование системы контроля версий в качестве бэкэнда хранилища, так что, возможно, также стоит исследовать.

...