用户文章点赞功能实现 - ZJH9Rondo/Blog-Node GitHub Wiki

Blog点赞及收藏管理实现

由于Blog是整体由后端模板引擎 jade 进行渲染展示,所以这里的逻辑实现可能和前后端分离的实现有所差异,但并不影响对具体实现的理解,这里所说的差异主要还是在页面事件触发、渲染以及数据通信上。

1.点赞功能这里是如何设计的?大型复杂平台又是如何实现和管理数据的?

  • 首先,该小型群博平台不会出现用户量大,短时间数据库大量并发操作的问题,这里实现点赞功能主要还是解决基本的逻辑设计和数据管理问题,客户端页面逻辑是这样实现的:
	   if user
          button.mini.ui.button.favourite(user='#{user._id}',post='#{post._id}')
            -var status = false
            -var favourite = post.favourite
            -for(var k in favourite){
                if user._id === favourite[k]
                -status = true
            -}
            if status
              i.thumbs.outline.up.red.icon
            else
              i.thumbs.outline.up.icon
            span #{post.favourite_count}
	// 这里如果不明白,你需要去看看jade的语法及实现

首先,这里的实现比较蠢,因为是实现的是在服务端进行渲染的时候,需要对查询到的数据进行多次完全遍历,来进行渲染,并且没有做分页处理,数据增大之后,可能会延长页面加载时间,这里有很大的优化空间;这里的实现是在服务端渲染的时候,手动生成Dom的自定义attribute,存储结点对应的用户 _id 值和文章的 _id 值,在后端模板引擎生成页面时,会对返回的 Post 列表进行遍历,判断当前文章的一个点赞计数,以及对应的当前登录用户 是否有过点赞记录,从而渲染对应的数据状态;我这里是限于服务端渲染的前提下,自己设计的实现逻辑,很多地方都有不妥,望指正。这里着重说一下大型平台的实现和管理方式。

微博是如何实现点赞操作和超大状态数据管理的

这里所说的东西,对于这一块的理解,无论是对于现在还是以后的工作,都会让你有一个不一样的认知出发点;大平台最大的问题就是数据量庞大,及超大用户量的并发操作,这里的讨论只设计逻辑,不讨论数据库的设计等方面;数据量一大,用户并发访问高峰,很容易出现数据不一致的问题,这里在我一开始做的时候,是考虑到用 redis 做缓存的,这样可是避免频繁操作数据库,使用缓存加快响应速度,出于不会面临此类场景的问题,就放弃了(其实是嫌麻烦。。。);并且大平台的数据库也不像我们写的这种玩具,设计的如此简单,里面的关系错综复杂,如何管理,这块可以看一本书 《Mongodb权威指南》,应该就是这本书,我之前有看,后边就有讲的很详细,不仅有关于用户量大后降低复杂度、以及复杂后的用户评论功能管理等等。

2.服务端设计,先看代码

	// 文章点赞接口
router.get('/favourite',function (req,res,next){
 /**
 * 这里接口设计不要学我!!!
 * 你想想打开控制台 user._id post._id 全在,很容易被人恶意使用
 * 这块参数可以配置 https 最快最便捷的解决方法
 * 或者使用 参数加解密 来保证基本的安全 
 */ 
  var user = req.query.user,
      post = req.query.post;
  
  /**
  * 这里就是数据库查询的操作
  * 根据查询值返回相应的状态码
  */
  PostModel.getPostById(post).then(function (result){
    var favourites = result.favourite,
        flag = false;

    if(favourites === null){
      flag = false;
    }else{
      for(var i=0;i < favourites.length; i++){
        if(user === favourites[i]){
          flag = true;
        }
      }
    }

    if(flag){
      PostModel.unfavourite(post,user).then(function (result){
        var count = -1;
        PostModel.favourite_count(post,count).then(function (result){
          var status = {
            "favourite": 'success',
            "count": count
          };

          return res.json(status);
        });
      });
    }else{
      PostModel.favourite(post,user).then(function (result){
        var count = 1;
        PostModel.favourite_count(post,count).then(function (result){
          var status = {
            "favourite": 'failed',
            "count": count
          };

          return res.json(status);
        });
      });
    }
  });
});

上边是简单的接口实现,说实话,只能作为一个基本参照看,实际项目开发要处理的问题很多,如何避免sql注入、xss攻击、服务端错误如何响应、以及逻辑优化等等很多,上边只是个人愚见,希望能帮到你。