我有一个laravel应用程序,正在使用多个用户在一次,他们都有可能在我们的系统中编辑一些项目。
我不想要的是有2个人同时编辑同一个表单。
如果发生这种情况,我想告诉其他用户当前表单已锁定,正在由用户名编辑。
如果用户随后离开或提交该表单,则该表单将被打开以供其他用户使用。
我已 checkout 乐观锁定和悲观锁定,我认为这不适合我
我想做的是在表中创建一个唯一的标识符,这是正在编辑的,如果页面上的用户有标识符,我会锁定所有其他,但我怎么知道,如果用户关闭浏览器窗口?然后所有其他用户仍然无法访问页面/表单?
"你们觉得我该怎么做"
3条答案
按热度按时间kninwzqo1#
在
projects
数据库中添加一个可以为空的locked_to
列。然后在Project
模型中将此字段添加到$dates
数组中,以便它可以自动转换为Carbon
示例。当有人打开项目编辑只是设置
locked_to
字段为未来的日期,我认为+5秒可能是一个很好的选择。编辑形式应发送 AJAX 请求每5秒保持项目锁定为未来5秒。当用户保存项目更改时,锁定将停止,因为没有 AJAX 请求将被发送。在这种情况下,您也有字段,可能会告诉您该项目是什么时候最后一次打开。
如果
locked_to
字段等于或大于new Carbon
示例,用户将无法编辑项目。更新-更多信息
没有必要清除此字段。如果用户没有完成编辑-他只是重新加载页面,导航到其他页面,关闭窗口或浏览器,死亡等.. AJAX 锁定将不会再执行,所以在接下来的5秒内,当前编辑的项目将被解锁-
locked_to
字段将包含比当前更早的日期。kmpatx3s2#
如果用户保持页面打开放dead man switch提示“你还在吗”,没有用户输入将导致页面停止5秒 AJAX 刷新,从而允许新用户访问。
如果用户第二天返回并单击Yes,只需刷新页面,检查是否其他人还没有锁定并发出警报,相应地发出警报,但如果没有,重新启动 AJAX 5秒计时器。
fruv7luv3#
解决此问题的常用方法是在数据库表中使用锁定机制来跟踪当前正在编辑表单的用户。您可以在表中创建一个新列,用于跟踪表单的状态(例如,锁定、解锁)以及正在编辑表单的用户。
当用户想要编辑表单时,您可以检查表单的状态,如果表单处于未锁定状态,您可以将其状态更新为锁定状态,并将用户信息存储在表中。
当用户提交或离开表单时,您可以将状态更新回未锁定。
要处理用户关闭浏览器窗口的情况,可以为锁定设置超时,如果在一定时间后锁定仍然存在,则可以自动释放它。
此外,您可以实现一个后台进程(例如cron作业),定期检查并释放任何过期的锁。