【问题标题】:Prevent multiple people from editing the same form防止多人编辑同一个表单
【发布时间】:2016-12-04 19:53:54
【问题描述】:

我有一个同时被多个用户使用的 laravel 应用程序,他们都可以在我们的系统中编辑一些项目。

我不希望有 2 个人同时编辑同一个表单。

如果发生这种情况,我想告诉其他用户当前表单已被锁定并且正在由用户名编辑。

如果用户随后离开或提交表单,则该表单将打开以供其他用户使用。

我检查了乐观和悲观锁定,我认为这对我来说不正确

我想做的是在表中创建一个唯一标识符,该标识符正在被编辑,如果页面上的用户具有标识符,我将锁定所有其他标识符,但我怎么知道如果用户关闭浏览器窗口?那么所有其他用户仍然无法访问页面/表单?

你们建议我怎么做?

【问题讨论】:

  • 我会创建一个表来保存与表单表相关的临时数据。当用户输入表单 ID 1 时,我会将用户 ID、表单 ID、输入日期和上次修改日期添加到新表中。我会每 2 分钟或其他时间发出一个 ajax 请求,只是为了告诉服务器我仍在处理表单,并更新表格。如果用户在 5 分钟内没有发送任何内容,或者在这段时间内提交表单,我将从数据库中删除该条目。这样,您可以在尝试访问表单时验证是否有人正在处理表单。
  • 嗨@PhiterFernandes 你为什么要制作一个临时数据表?我不希望任何人一次编辑一个人,所以我正在考虑为第一个用户在访问页面时创建一个视觉编号,如果用户完成编辑 og 关闭浏览器窗口,我会删除视觉编号.但是我怎么知道用户是否关闭了浏览器窗口?亲切的问候/丹尼
  • CodeIgniter 使用 ci_sessions 表,用于临时存储会话数据。如果它符合您的目的,那么这样做是完全可以的。使用这个额外的表格,您可以控制多个表格。
  • Oki @PhiterFernandes 因此,如果我理解正确,如果临时表中存在具有某些 userID 和 FormID 的行,我将表单锁定给其他用户,你能举个例子,你应该如何删除用户关闭浏览器窗口时的临时行?
  • 如果他关闭浏览器窗口,你无法知道。您可以制定例行程序或每 5 分钟运行一次的程序,并验证其中一条记录是否已过期。在最坏的情况下,表格将被锁定 9:59 分钟,没有人使用它。

标签: php forms laravel


【解决方案1】:

将可空的 locked_to 列添加到您的 projects 数据库。然后在Project 模型中将此字段添加到$dates 数组中,以便它可以自动转换为Carbon 实例。

当有人打开项目进行编辑时,只需将 locked_to 字段设置为未来日期,我认为 +5 秒可能是一个不错的选择。编辑表单应每 5 秒发送一次 ajax 请求,以在接下来的 5 秒内保持项目锁定。

当用户保存项目更改时,将停止锁定,因为不会发送任何 ajax 请求。在这种情况下,您还有一个字段可以告诉您上次打开项目的时间。

如果locked_to 字段等于或大于new Carbon 实例,用户将无法编辑项目。

更新 - 更多信息

无需清除此字段。如果用户没有完成编辑 - 他只是重新加载页面,导航到其他页面,关闭窗口或浏览器,死亡等......用于锁定的 ajax 将不再执行,因此在接下来的 5 秒内,当前编辑的项目将被解锁- locked_to 字段将包含比当前日期更早的日期。

【讨论】:

  • 感谢@Piotr,如果用户离开页面或关闭浏览器窗口,您将如何删除locked_to?
  • 啊,所以你的建议是,用户输入表单我创建locked_to 字段,其中时间是未来,用户在页面上每5秒我发送一个更新locked_to的ajax请求未来,如果另一个用户尝试访问该页面并且locked_to 不比当前时间更早,那么用户无法访问?正确:)
  • 嗨@piotr,我完全理解:) 我已经在Linkedin 上添加了你,你有我可以写的邮件吗,我在丹麦有一家网络公司,我们正在寻找开发人员?切你有兴趣吗?
猜你喜欢
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多