2012-04-05 9 views
16

Estoy buscando implementar algo similar a las insignias stackoverflow. también podría equipararlos a los logros en los juegos.distintivos/logros

pero no estoy seguro cómo diseñar la base de datos/código/seguimiento para ellos.

consigo lo que debería hacer por insignias tales como:

Altruista × 1456 primera recompensa que otorgará de forma manual en la pregunta de otra persona

porque son un evento de una sola vez, pero la forma de manejar otros tales como:

× analítica 16389 visitado cada sección del FAQ
electorado × 1783 votado en 600 preguntas y 25% o más del total de los votos están en preguntas Franco × 188 Publicado 10 mensajes en el chat que fueron protagonizadas por 10 usuarios diferentes

etc ...

cómo manejarlos, cómo mantener seguimiento del progreso de cada uno, etc ... ¿hay algún tutorial o algo que pueda ayudarme a encontrar un patrón de diseño para ellos?

Respuesta

17

Para los ejemplos dados, hay esencialmente dos mecanismos que va a necesitar.

No sé cómo se hace en SO, esto es solo una sugerencia de solución.

Echemos un vistazo a 'Analítica' primero. Tendrá que grabar mediante un simple indicador cuando un usuario visite un área particular en las Preguntas frecuentes. Imaginemos una tabla DB con un campo para cada sección de preguntas frecuentes y una identificación de usuario. Esto comienza como "N" (o 0, o como quiera que represente su bandera). Cuando un usuario visita esa área, usted llama al código para cambiar ese campo a "Y". Cuando todos los campos son "Y", puede otorgar esa insignia.

En cuanto a 'electorate' y 'Outspoken', puede recuperar esta información mediante una consulta sobre sus datos existentes, suponiendo que las consultas en cuestión no son demasiado onerosas. Deberá considerar cuándo ejecutar estos controles. Esto esencialmente se reduce a dos opciones.

1) Cuando se lleva a cabo la acción que podría obtener un distintivo otorgado (es decir, la sección visita del FAQ, votaciones sobre cualquier cuestión, pregunta protagonizadas por otra persona)

2) Periódicamente (por horas, días, etc.) ejecuta un control de todas tus insignias con los datos actuales.

Tenga en cuenta que las insignias son unidireccionales en Stackoverflow, por lo que si quiere ser equivalente, entonces no tiene que considerar la lógica para las insignias de 'no adjudicación'.

+0

Creo que lo entiendo ahora. parece fácil: P solo un problema: usted dice que 'analítico' usar una tabla db, pero habrá muchas tales insignias similares y ¿cómo podría hacer para cada una de ellas? debería usar una tabla diferente para cada insignia, ¿o hay alguna forma de unificar esto en una sola mesa? de lo contrario, podría terminar con muchas tablas db, una para cada tipo de insignia ... pero gracias a la respuesta, me ayuda mucho a empezar en la dirección correcta. Por cierto, tu 2 significa que las insignias no se otorgan en el momento en que se logran, ¿verdad? y sí, no habrá desagravio. – b0x0rz

+1

La forma en que implemente la tabla depende de usted.Podría tener una tabla de 4 columnas con user_id, badge_id, badge_acheivement_id, flag - Esto lo haría escalable a múltiples distintivos. Y sí, eso significa que no se otorgarán en el momento en que se lograron. –

+0

por supuesto :) gracias. Creo que esto resuelve todos mis problemas. Supongo que programar las comprobaciones con bastante frecuencia es una posibilidad de reducir el lapso de tiempo entre "ganar" la insignia y la insignia que se muestra. – b0x0rz