2016-12-04 25 views
0

我希望你能幫助我。 :)防止多人編輯相同的表格

我有一個一次被多個用戶使用的laravel應用程序,他們都有可能在我們的系統中編輯一些項目。

我不想要的是有2人在同一時間編輯相同的形式。

如果發生這種情況,我想告訴其他用戶當前窗體已被鎖定並正在被用戶名編輯。

如果用戶然後離開或提交表單,然後表單打開供其他用戶使用。

我已簽出樂觀和悲觀鎖定,我不認爲這對我來說是正確的

我在想什麼做的,當時,正在編輯以創建表的唯一標識符,如果頁面上的用戶有標識符,我會鎖定所有其他的,但是如何知道用戶是否關閉了瀏覽器窗口?那麼所有其他用戶仍然無法訪問該頁面/表單?

你們會怎麼建議我去做這件事?

親切的問候 丹妮

+2

我會創建一個表來保存與表格有關的臨時數據。當用戶輸入表單ID 1時,我會將用戶ID,表單ID,輸入日期和最後修改日期添加到新表中。我會每2分鐘做一次ajax請求,只是爲了告訴服務器我仍然在工作,並更新表格。如果用戶在5分鐘內沒有發送任何內容,或者在這段時間內提交表單,我會從數據庫中刪除條目。通過這種方式,您可以驗證是否有人在嘗試訪問該表單時正在處理該表單。 – Phiter

+0

嗨@PhiterFernandes你爲什麼要創建一個臨時數據表?我不希望任何人在一次編輯時只有一個人,所以我正在考慮爲第一個用戶訪問頁面時創建一個視覺編號,如果用戶完成編輯或關閉瀏覽器窗口,我應該刪除視覺編號。但是我怎麼知道用戶是否關閉了瀏覽器窗口?親切的問候/ Dannie – user3502250

+0

CodeIgniter使用ci_sessions表,臨時用於存儲會話數據。如果它符合你的目的,這樣做完全可以。有了這個額外的表格,你可以控制多種形式。 – Phiter

回答

1

添加一個可空locked_to列到你的projects數據庫。然後在Project模型中將此字段添加到$dates數組中,以便它可以自動轉換爲Carbon實例。

當有人打開編輯項目只需將locked_to字段設置爲未來日期時,我認爲+5秒可能是一個不錯的選擇。編輯表單應每隔5秒發送一次Ajax請求,以保持項目在接下來的5秒內被鎖定。

當用戶保存項目更改時,鎖定將被停止,因爲不會發送ajax請求。在這種情況下,你也有一個領域,可以告訴你什麼時候該項目最後一次打開。

如果locked_to字段等於或大於new Carbon實例,用戶將無法編輯項目。

UPDATE - 更多信息

沒有必要清除此字段。如果用戶沒有完成編輯 - 他只是重新加載頁面,導航到其他頁面,關閉窗口或瀏覽器,死亡等... ajax鎖定將不再執行,所以在接下來的5秒內,當前編輯的項目將被解鎖 - locked_to字段將包含比當前更早的日期。

+0

感謝@Piotr如果用戶離開頁面或關閉瀏覽器窗口,如何刪除locked_to? – user3502250

+0

啊,所以你建議的是,用戶輸入表單,我創建locked_to字段在未來的時間,每5秒用戶在頁面上我發送ajax請求更新locked_to在未來,如果另一個用戶嘗試要訪問該頁面並且locked_to不會比當前時間舊,那麼用戶無法訪問?正確:) – user3502250

+0

我已經更新了我的答案。我希望這是明確的 – piotr

相關問題