Domanda

C'è un nuovo badge su Stack Overflow. Il " woot " badge viene conferito ai utenti hanno visitato il sito ogni giorno per 30 giorni. Come è possibile implementare una funzione come questa? Come è possibile tenere traccia che un utente ha visitato il sito ogni giorno per X giorni nel modo più semplice?

ho pensato di avere due campi - uno per il timestamp dell'ultimo accesso, e un altro per contare i giorni sul utente visita continuamente il sito. La logica è prima impostare il contatore a 1, e memorizzare il tempo di accesso pure. Al successivo accesso, controllare se dopo l'ultimo accesso non più di un giorno passato, e incrementare il contatore, o impostare di nuovo a 1. E quindi aggiornare il campo timestamp alla data corrente.

Si può fare più semplice?

È stato utile?

Soluzione

Si ha bisogno di avere un cookie, dal momento che la gente potrebbe non login tutti i giorni - ad esempio perché vengono registrati automaticamente per 2 settimane, o perché sono sul tuo sito facendo le cose non -stop senza sonno e pranzo per 50 ore :) probabilmente vuole realmente contare quando l'utente accede al sito.

Ora, si potrebbe teoricamente registra ogni accesso ed eseguire query di database, come è stato suggerito in precedenza, ma si potrebbe pensare (come faccio io) che colpisce l'equilibrio storto tra utilità e la privacy + semplicità.

L'algoritmo specificato è carente in modo evidente: dal momento che si memorizzano solo numero intero di giorni, si perde l'utente che accede dentro e fuori ogni 12 ore (l'algoritmo manterrebbero il conteggio dei giorni come 1)

Ecco la soluzione che trovo ad essere pulito con due Data di campi per utente, in una sorta di non-oggetto Python orientato auto-esplicativo:

# 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 )
    ...

(Si prega di perdonare le mie capacità Pythonic, Sono un utente accademico e per la prima volta site)

Non si può fare questa operazione con un variabile. Sono sicuro che qualcuno può scrivere un argomento pulito dimostrando questo fatto.

Altri suggerimenti

In realtà, se le visite del Socio sono in un database SQL, si può fare il tutto con una singola query SQL. Questo è probabilmente anche più veloce di schlepping tutti i dati verso un programma client per controllare in ogni modo:

/*
    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

Traccia ogni visita nel database con un timestamp (che probabilmente già fare comunque). Quindi creare un'istruzione SQL e di gruppo il risultato per giorno, mentre si conta il numero di visite quel giorno. Nel periodo degli ultimi 30 giorni, non è permesso di avere una giornata 0-visit ...

I approccio secondo di ropstah. Statistiche utente come il tempo di accesso, ecc sono di solito disponibili nel database. Abbiamo bisogno di ricavare alcuni fatti fuori dei dati disponibili. Quindi, piuttosto che avere un contatore per ogni visita e incrementare roba, io preferirei un processo batch che viene eseguito sui dati di login degli utenti e pubblicare i risultati per quel giorno.

Ma una volta che un utente ed "woot", si potrebbe desiderare di smettere di calcolo "woot" ness per quell'utente. Altrimenti, c'è la possibilità di ottenere l'utente ogni giorno "wooted", fino a quando si incontra una giornata no-login. (Ma questo è un problema minore).

Se questa è l'unica cosa che si desidera registrare, quindi forse è una buona soluzione. Tuttavia, mi piace mantenere la logica e la registrazione separata, sia per aumentare la quantità di informazioni grezze a mia disposizione, così come permetto tweaking della logica senza rompere i dati esistenti.

In questo caso, vorrei registrare ogni visita o ogni azione (a seconda delle esigenze / spazio / etc), e poi scrivere uno sproc o di un metodo da qualche parte che ha verificato i dati e restituito vero (partite criteri di badge) o false ( non corrisponde criteri).

L'unico caso in cui vorrei creare uno schema specifico per contenere informazioni come che era, se i calcoli necessari preso troppo tempo, sia a causa della quantità di dati o la complessità della stessa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top