-
Notifications
You must be signed in to change notification settings - Fork 11
用户文章点赞功能实现
由于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攻击、服务端错误如何响应、以及逻辑优化等等很多,上边只是个人愚见,希望能帮到你。