2016-12-04 32 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

相关问题