Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Логирование работы пользователя (https://javascript.ru/forum/misc/85286-logirovanie-raboty-polzovatelya.html)

savsoft 08.06.2023 14:16

Логирование работы пользователя
 
Всем привет.

Поставили задачу сделать логирование работы пользователя.

Вход и выход с сайта это понятно.
Но как учитывать простои (например 15 минут бездействия) и сделать автоматический выход с сайта по таймауту, например 30 минут бездействия.

Что-то типа
Пользователь 1 Заход на сайт дата/время
Пользователь 1 Бездействие с дата/время по дата/время всего минут
Пользователь 1 Выход по бездействию с дата/время по дата/время всего минут

Толкните в нужном направлении, что использовать.

Спасибо

ksa 08.06.2023 17:28

Цитата:

Сообщение от savsoft
Но как учитывать простои (например 15 минут бездействия) и сделать автоматический выход с сайта по таймауту, например 30 минут бездействия.

Например таким образом...
Определяем пару переменных и функций глобально.

let desc1, desc2
function ping() {
	if (desc1) clearTimeout(desc1)
	desc1 = setTimeout(_ => {
		console.log('Простой...')
		ping()
	}, 15 * 60 * 1000)
}
function out() {
	if (desc2) clearTimeout(desc2)
	desc2 = setTimeout(_ => {
		console.log('Разлогинить...')
		out()
	}, 30 * 60 * 1000)
}
ping()
out()

Если есть какое-то "значимое" действие - в обработчиках запускаем обе эти функции...

savsoft 08.06.2023 20:16

Цитата:

Сообщение от ksa (Сообщение 552324)
Например таким образом...
Определяем пару переменных и функций глобально.

Если есть какое-то "значимое" действие - в обработчиках запускаем обе эти функции...

А разве обновление страницы не будет сбрасывать переменные?
И что будет, если простой 20 минут?

ksa 09.06.2023 09:41

Цитата:

Сообщение от savsoft
А разве обновление страницы не будет сбрасывать переменные?

Тут встречный вопрос - обновление страницы не считается "активностью на странице"?

Если и на такое хочешь реагировать - записывай информацию в тот же localStorage... При загрузке страницы ее читай... Корректируй таймауты...
Далее по той же схеме. :)

Цитата:

Сообщение от savsoft
И что будет, если простой 20 минут?

Ничего не будет.
На 15-ти минутах залогируется "простой" и потом такое же действие будет выполнено еще через 15 минут.

ksa 09.06.2023 09:49

savsoft, можно пойти другим путем...

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

voraa 09.06.2023 10:10

Активностью пользователя можно считать события mousemove, keypress, scroll.
Поставить обработчик этих событий на document/window.
В обработчике вычисляем интервал от времени предыдущего события до текущего, ставим setTimeout на 30 мин для выхода. (сняв предыдущий).
Если вычисленный интервал был больше 15 мин, то сообщаем о простое.
Если срабатывает таймер, то разлогиниваемся.

savsoft 09.06.2023 11:20

Цитата:

Сообщение от ksa (Сообщение 552331)
Ничего не будет.
На 15-ти минутах залогируется "простой" и потом такое же действие будет выполнено еще через 15 минут.

Нужно показывать реальный простой, пусть с точностью 30 секунд.

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

Через каждые 30 секунд выполнять функцию, которая через ajax делает запрос в базу данных и смотрит разницу с последним рабочим действием, и при необходимости (простой больше 15 минут) фиксирует в базе простой, который длится до следующего рабочего действия. Если простой больше 30 минут, то разлогиниться.

При закрытии вкладки или браузера тоже фиксация и разлогиниться. Тут еще не разобрался как обработать обновление страницы и открытие вкладок/ссылок. Нужно реагировать только на закрытие вкладки/браузера.

Нет ли в такой схеме подводных камней.

Спасибо.


Часовой пояс GMT +3, время: 04:37.