@malen132

Ограничение работы 2 пользователей на одном сайте?

Добрый вечер, тут такой вопрос вставл, есть одностраничник, страница закрытой (по логину заход). Там выводится много user на react.js. Их тут же можно редактировать (форма очень большая, обширная).

Вопрос, если будут 2 человека менять в одно время (допустим 1 человек одного user, другой человек другого user), могут быть последсвия и как првоерить можно?
  • Вопрос задан
  • 123 просмотра
Решения вопроса 2
@rPman
направления решения задачи многопользовательского редактирования:

- нулевое, самое злобное для клиентов, выдавать ошибку, при попытке сохранить документ, если его редактировали, обновлять форму и предлагать ввести все заново, реализуется полем 'last modified time', которое загружается на форму и отправляется с запросом на обновление, если сервер видит их разными - писать ошибку.

- первое простое и тоже 'не правильное', запретить конфликты в принципе, т.е. на форме кнопка - начать редактировать, режим удерживается пока форма открыта, отключается автоматом по таймауту, при сохранении ну или по нажатию соответствующей кнопки.
Рекомендуется показывать, кто в данный момент заблокировал форму и дать возможность как то пообщаться с человеком (если таймаут большой)

- второе посложнее, редактировать одновременно нескольким разрешать, но при нажатии 'сохранить' сообщать о том что эта форма была изменена другим и показать в интерфейсе на что именно (показывать для полей формы два значения - ваше новое и чужие изменения. Сложность реализации в том что если редактировать форму могут больше двух человек, то начнется ад разруливания конфликтов. Особенно сложно, если форма не просто линейный набор полей а сложная часть базы данных, со списками, подформами и т.п.
не рекомендую этот вариант, если формы сложные, но для простых, почему нет

- третье, наилучшее в современных реалиях, применять изменения и выводить их в тот же момент как они вносятся на форму, как документы google docs, видно в какой ячейке какой пользователь сейчас поставил курсор, можно даже подсвечивать цветами, с затуханием. Рекомендуется, как ни странно достаточно проста в реализации, если интерфейс client side javascript а не генерация html на сервере.

Все три способа требуют оперативную информацию о наличии блокировок пользователями, что реализуется с помощью вебсокет
Ответ написан
Комментировать
vabka
@vabka
Токсичный шарпист
Это классическая задача на конкурентный доступ к одному ресурсу.
Варианта три:
1. Дать возможность редактировать форму в реальном времени, как это делает miro и google docs, но тут возникает много других сложных проблем.
2. Ввести понятие "ревизии" в форму. И при сохранении клиент будет передавать номер ревизии, на которой основаны его изменения.
Если при этом на сервере ревизия уже новая - клиенту она передаётся, и он должен поправить у себя номер ревизии.
Так делает, например Azure Devops
3. Когда пользователь работает над формой - он накладывает блокировку на форму. Информация о блокировке сохраняется в БД, и другие пользователи не могут редактировать, пока на объекте стоит чужая блокировка.
Так делает 1С
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Everybody_Lies
Последствия будут - кто последний того и тапки.
Добавьте в стейт флаг isEditable, и при нажатии на кнопку редактировать проверяйте, работает ли кто то с этим формой или нет
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы