Estoy tratando de crear un sitio web que contenga publicaciones, así que tengo un enlace "Leer más" que expande el contenido allí y allí solo como quora. ¿Cómo puedo saber el número total de veces que se ha hecho clic para poder mostrar las vistas?
Estoy usando nodejs, express y mongodb como servidor.
Este es mi archivo hbs (manillar) con ese enlace para leer más
<p class="startPara">{{stripTags (truncate body 200)}}<span class="dots" >... </span></p> <span class="content"> <p>{{stripTags (truncate body 400)}}</p> </span> <a onclick="readMoreFunction(this)" class="buttonReadMore" >Read more</a> </div>Este es mi archivo hbs principal que ejecuta todas las etiquetas js de su script
<script> function readMoreFunction(el) { var parent = el.closest(".wrapper") var dots = parent.querySelector(".dots"); var contentText = parent.querySelector(".content"); var btnText = parent.querySelector(".buttonReadMore"); var startPara=parent.querySelector(".startPara"); btnText.style.display = "none"; startPara.style.display= "none"; dots.style.display = "none"; contentText.style.display = "inline"; } </script>Ahora, un usuario único hace clic en cada publicación, por lo que solo incrementar una variable no ayudará.
Entonces, dígame cómo calcular la cantidad total de veces que se hizo clic en ese enlace para una publicación específica y luego cómo comunicarlo a la base de datos para que pueda mostrarlo en la página web.
Me imagino que necesitaría tener una propiedad de 'vistas' en su publicación en MongoDB.
Podría servir los primeros 400 caracteres para cada publicación en su solicitud de API getPosts .
Hacer clic en leer más podría llamar a getPost(id) en su API, devolviendo la carga completa de la publicación, durante ese proceso podría incrementar las vistas de publicación en uno.
Además, como @tobiv sugiere en los comentarios, podría tener un código que garantice que solo se cuenten los clics de visitantes únicos.
Almacene un objeto en la sesión de los espectadores y la columna db llamada 'viewed_posts'. Use el objeto para determinar si vieron una publicación o no.
if (typeof(req.session.viewed_posts[post_id]) == 'undefined') { req.session.viewed_posts[post_id] = 1; //update session //increment post count in posts table with post id //update 'viewed_posts' column with new session } //select postCuando el objeto en 'viewed_posts' sea demasiado grande (por ejemplo, 3000 publicaciones vistas), elimínelo. Si el espectador promedio lee 2 publicaciones únicas al día, pasarán 4,5 años hasta que la segunda vista única PUEDE ocurrir en la misma publicación.
Aunque esto no garantiza la unicidad para siempre (todavía mucho tiempo), es mucho más eficiente porque...
Evitas una tabla de vistas por completo
El recuento de vistas en la tabla de publicaciones es un solo número (sin búsqueda)
El espectador no tiene que buscar en una tabla para ver si ya vio una publicación. Solo tienen que referirse a su sesión.
Use varchar (x) Y la identificación incrementada NO el uuid para almacenar el objeto.
O (mi forma preferida)
Vaya a la inversa y almacene un objeto en la fila de la publicación, selecciónelo, analícelo, verifique si está allí, si no está allí, insértese a sí mismo y en el cliente, use object.keys para obtener cuántas vistas tiene la publicación. Cuando el objeto es demasiado grande, elimine los pares de valores clave que son los más antiguos e incremente un conteo por uno en otra columna (agregue claves y conteo) O deje de agregar pares de valores clave.
O
use una cláusula de unión cuando seleccione con la tabla de vistas
select * from posts as p LEFT JOIN views as v ON p.post_id = post_id AND p.post_id = v.post_id AND v.view_id = my_id LIMIT 2 //if the result length is 1, insert self into views //if the result length is 2, you know that you have already viewed (don't insert) //select post view count and return result[0] from above with countO
no use una tabla de unión con vistas
post = select * from posts where post_id = post_id if_viewed = select COUNT(*) from views where post_id = post_id AND view_id = my_id (if count is 0 insert into views) post_views = select COUNT(*) from views WHERE post_id = post_id //return post and post_viewsSiendo realistas, este es un tema muy complejo.
Ingenuo: haga clic en el botón para enviar un ping al punto final de back-end dedicado que actualiza la base de datos. Piense en múltiples clics (porque el usuario está aburrido), otras formas de leer publicaciones completas, etc.
Práctico: considere Google Analytics y tal.
No: cuente las solicitudes en el servidor. Los navegadores hacen cosas raras (solicitudes de verificación previa, vistas previas diferentes, etc.). El número de solicitudes puede no corresponder al número de vistas.