9

私は<div contenteditable="true" />、ユーザーが書き込める、長さがほぼ無制限の を持っています。
div 内のデータは、変更時にタイムスタンプとともに MySQL データベースに保存されます。

ここでの目標は、ドキュメントの各部分がいつ作成されたかをユーザーに知らせる小さなメモを左側に表示することです (解決は日単位で行う必要があります)。

さて、問題は、情報 (いつ、どの部分が変更されたか) を保存するにはどうすればよいかということです。

これまでのところ、次のオプションを検討しましたが、どちらも改善可能と思われます。

  1. ユーザーがドキュメントの最後にあるサイトにアクセスするたびに、フラグを挿入します (たとえば、編集の開始を格納するクラスとデータ属性を持つ空のスパン)。このフラグは、save スクリプトが呼び出されたときにデータベースに保存されます。このオプションを使用すると、側面に日付を簡単に表示できます。空のスパンと同じ高さに配置すると、スパンが日付を教えてくれます。欠点は次のとおりです。ユーザーが誤ってタイムスタンプ スパンを削除する可能性があり、ユーザーが長い間ウィンドウを閉じない場合、新しいタイム スパン スパンが挿入されません (これはおそらく X 分ごとに新しいタイム スタンプ スパンを挿入することで回避できるため、削除部分はより関連性が高い)
  2. データが保存スクリプトに渡されるたびに文字列差分比較を実行し、タイムスタンプ付きの差分のみを保存しようとしています。次に、ページがロードされたら、すべてのパーツを正しい順序でまとめ、Javascript で日付のメモを正しい場所に配置します。+ 古いパーツを変更すると、2 つのパーツが 1 つになる可能性があります。全体として、このオプションは非常に複雑に聞こえます。

入力/アイデア/提案は大歓迎です!

4

3 に答える 3

4

ユーザーが情報を送信するときに、この情報を保存する必要があります。ユーザーが情報を見たいと思った瞬間に、計算はほとんど必要ありません。

バックエンドで 2 つのテーブルを作成します。1 つのテーブルで、それを「currentdocs」と呼びましょう。常に最新バージョンのデータを保存します。ユーザーがドキュメントをロードすると、すべての情報がこのテーブル「currentdocs」から取得されます。もう 1 つのテーブルでは、それを「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 に答える
4

それを行う 1 つの方法は、div. 時々、コンテンツとタイムスタンプを含む新しいエントリをこのテーブルに追加して、編集のすべてのリビジョンを追跡できます。次に、何が変更されたかを調べるには、2 つのエントリを単純に比較して、追加されたもの、変更されていないもの、および削除されたものを確認します。

于 2013-04-06T10:11:20.887 に答える