Как отследить, что пользователь посещал сайт каждый день в течение Х дней? - PullRequest
7 голосов
/ 31 мая 2009

На переполнении стека появился новый значок. Значок " woot " присуждается пользователям, посещающим сайт каждый день в течение 30 дней. Как вы можете реализовать такую ​​функцию? Как можно самым простым способом отследить, что пользователь посещал сайт каждый день в течение X дней?

Я подумал о наличии двух полей - одно для отметки времени последнего входа в систему и другое для подсчета дней, когда пользователь постоянно посещал сайт. Логика заключается в том, чтобы сначала установить счетчик в 1, а также сохранить время входа в систему. При следующем входе в систему убедитесь, что с момента последнего входа в систему прошло не более одного дня, и увеличьте счетчик или установите его обратно на 1. Затем обновите поле отметки времени до текущей даты.

Можете ли вы сделать это проще?

Ответы [ 5 ]

4 голосов
/ 01 июня 2009

Вам необходимо иметь cookie-файл, поскольку люди не могут входить в систему каждый день - например, потому что они вошли в систему автоматически в течение 2 недель, или потому что они на вашем сайте делают что-то не остановитесь без сна и пообедайте на 50 часов :) Вы, вероятно, действительно хотите считать, когда пользователь заходит на сайт.

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

Указанный вами алгоритм явно очевиден: поскольку вы храните только целое число дней, вы пропускаете пользователя, который входит и выходит каждые 12 часов (ваш алгоритм будет считать количество дней равным 1)

Вот решение, которое я считаю наиболее чистым с двумя полями даты на пользователя в виде не требующего объяснения не объектно-ориентированного Python:

# user.beginStreak----user.lastStreak is the last interval when 
# user accessed the site continuously without breaks for more than 25h 

def onRegister (user):
    ...
    user.beginStreak = user.endStreak = time() # current time in seconds 
    ...

def onAccess (user): 
    ...
    if user.endStreak + 25*60*60 < time():
        user.beginStreak = time()
    user.endStreak = time()
    user.wootBadge = ( user.endStreak-user.beginStreak > 30*24*60*60 )
    ...

(Пожалуйста, прости мои навыки Pythonic, я академический и первый пользователь сайта)

Вы не можете выполнить эту задачу с переменной one . Я уверен, что кто-то может написать чистый аргумент, подтверждающий этот факт.

2 голосов
/ 01 июня 2009

На самом деле, если посещения члена находятся в базе данных SQL, вы можете сделать все это с помощью одного запроса SQL. Это также, вероятно, быстрее, чем передавать все данные клиентской программе, чтобы проверить их:

/*
    Find all members who visited at least once every day
  for 30 or more days.  --RBarryYoung, 2009-05-31
*/
;WITH
  cteVisitDays as (
    Select
      MemberID
    , DATEDIFF(dd,'2008-06-01',VisitTime) as VisitDay
     From tblMembersLog
     Where Not Exists( Select * From tblMemberTags T
    Where T.MemberID = tblMembersLog.MemberID
     And T.TagName = 'WOOT!' )
     Group By MemberID
        , DATEDIFF(dd,'2008-06-01',VisitTime)
    )
, cteVisitRunGroups as (
    Select 
      MemberID
    , VisitDay - Row_Number() Over(
            Partition By MemberID
            Order By VisitDay
        ) as RunGrouping
     From cteVisitDays
     )
SELECT Distinct
  MemberID
 From cteVistRunGroups
 Group By MemberId, RunGrouping
 Having COUNT(*) >= 30
1 голос
/ 31 мая 2009

Я второй подход Ропста. Пользовательская статистика, такая как время входа и т. Д., Обычно доступна в базе данных. Нам нужно извлечь определенные факты из имеющихся данных. Поэтому вместо того, чтобы иметь счетчик для каждого посещения и приращения, я бы предпочел пакетное задание, которое запускает данные для входа пользователя и публикует результаты за этот день.

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

1 голос
/ 31 мая 2009

Отслеживайте каждое посещение в вашей базе данных с отметкой времени (что вы, вероятно, уже делаете в любом случае). Затем создайте SQL-оператор и сгруппируйте результат по дням, а вы посчитаете количество посещений в этот день. В течение последних 30 дней запрещается посещение с 0 посещениями ...

0 голосов
/ 31 мая 2009

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

В этом случае я бы регистрировал каждое посещение или каждое действие (в зависимости от требований / места / и т. Д.), А затем записывал sproc или метод, который где-то проверял данные и возвращал true (соответствует критериям для значка) или false ( не соответствует критериям).

Единственный случай, когда я создал бы конкретную схему для хранения подобной информации, был, если требуемые вычисления занимали слишком много времени, либо из-за объема данных, либо из-за их сложности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...