点赞功能

今天琢磨着搞了个点赞功能,因为考虑到个人网站没有根基,所以如果必须要登录才可以点赞的话那绝大部分人肯定转头就走。

如果不登录就可以点赞的话,就要动脑筋去防止刷赞了,我也去看过一些别的网站搞的投票功能,纯粹是以IP来控制,水的不能再水。

表设计如下:

用户ID  IP  浏览器信息  加上cookie  html5缓存  一共5重关卡  任何一关过不去  都点不了赞

流程从点赞的动作开始:

首先js写个变量isLike标志是否点过赞   初始化为否

点击赞图标后:

    $(‘body‘).on("click",‘#like‘,function(){
        if(false === isLike){
            var C=parseInt($("#likeCount").html()); //当前文章点赞数量
            $(this).css("background-position","");
            $(this).addClass("heartAnimation");//改变赞图标样式
            $("#likeCount").html(C+1);//更新文章数量+1
            $.ajax({
                type: "POST",
                dataType:"json",
                url: ‘{:\\think\\Url::build("Article/like")}‘,
                data: {id:id},//传入文章id
                success: function(result) {
                localStorage.setItem(‘like_local_‘+id,1);//html5缓存该文章以点过赞
                }
            });

            isLike = true;
        }
    });

注释也的很清楚了,无论后端如何处理 都视为点赞成功  该变的样式照常变   isLike置为true   ,站在用户的角度,既然这个赞图标是暗的,就证明可以点赞,如果点了赞提示失败,肯定要喷口水骂人的。点赞后将点赞记录缓存起来。

后端处理很简单,因个人网站定位,所以我会去判断是否是移动端,不是移动端直接跳过所有流程,这也算是第6重防作弊关卡。

流程为: 判断是否登录,上面的表结构已经贴出来了,user_id是非必填,如果登录则添加,没登录则不添加,浏览器信息 $_SERVER[‘HTTP_USER_AGENT‘]   ip用ip2long()函数包起来转成int  往数据库插  添加cookie 后端处理完成

接下来是解决 打开当前页面的时候,如何判断是否点过赞。

        //查询点赞信息
        $likeModel = new \app\index\model\Article_like();
        $likeInfo = $likeModel::all([‘article_id‘=>$id]);//查出该文章的所有点赞记录
        $is_like = 0;//是否点过赞

        $ip = ip2long(get_ip());
        $isLogin = $this->is_login();

        if(0 !== count($likeInfo)){
            //如果没有点赞记录 则不用走判断流程了
            if( 1 == Cookie::get("like_cookie_".$id) ){
                $is_like = 1;
            }else{
                //如果cookie没记录 再循环校验
                foreach($likeInfo as $k => $v){
                    if($isLogin && $v->user_id == $this->user_info[‘id‘]){
                        //如果已登录并且用户Id存在
                        $is_like = 1;
                    }

                    if($v->browser == $_SERVER[‘HTTP_USER_AGENT‘] || $v->ip == $ip ){
                        //如果浏览器信息存在或者IP存在
                        $is_like = 1;
                    }
                }
            }
        }

        $this->assign(‘is_like‘,$is_like);

 

流程走到前端后

判断is_like是1还是0   如果是0再把HTML5缓存校验一下    所有关卡都校验完之后  给点赞图标添加上合适的样式即可。

我这种玩法,已经接近于无缝可钻了。除非换IP 换浏览器 并且手动清理手机缓存 三者缺一不可  方可刷赞  否则滚粗

当用户登录的时候   再拿着用户登录的浏览器信息去点赞表里将相同的浏览器信息记录的user_id给添加上   。

本次杂耍结束,谢谢大家观看。

时间: 2024-08-06 08:38:39

点赞功能的相关文章

点评点赞功能的基本实现------个人观点

对于做这个功能的时候,我认为很简单,结果错误百出,我认为是notifyDataSetChanged()方法调用失败,结果打印日志,发现该方法被调用了. 然后我很费解,既然已经调用,为何不刷新出新的数据呢????最后的最后,当然是问度娘,度娘她告诉我,关于点赞功能的实现,她知道的其实并 不多,而点赞功能的效果动画确很精通.然后我尝试了几种方法: 1:在onResume()方法中重新绑定adapter,并调用notifyDataSetChanged()方法,结果连个鸡肋都不如,真是浪费感情. 2:然

JavaScript实现评论点赞功能

通过分析评论功能的逻辑关系,学会如何使用JavaScript实现评论.回复.点赞等各种功能 1.学会JavaScript处理日期和时间. 2.掌握Dom操作中的添加/删除子节点方法. 3.使用setTimeout设置定时器. 4.使用clearTimeout清除定时器以及事件代理的运用. 效果图: 1)实现删除分享内容功能 利用事件代理实现点击关闭按钮删除分享内容. 删除事件: 利用事件代理功能,在父元素节点上添加事件,以减少代码量和系统运行负荷. 事件代理的时候,使用事件对象中的srcElem

点赞功能实现 $(tag).css('属性', '样式')

1. 创建标签 document.createElement() 2.$(tag).css('属性', 样式) 赋予标签属性样式 3.设置定时器 改变位置 大小 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .container{ padding:

微信点赞功能测试用例

测试用例: ①点赞和取消点赞功能 ②点赞是否按时间顺序显示 ③点赞是否正确显示昵称或备注 ④点赞之后是否还能评论 ⑤弱网络的情况下点赞能否实时更新 ⑥点赞时有短信或电话进来,能否显示点赞情况 ⑦点赞的人是否在可见分组里 ⑧点赞之后共同好友的点赞和评论是否会提醒你 原文地址:https://www.cnblogs.com/shallwebegin/p/11621991.html

全栈项目|小书架|服务器端-NodeJS+Koa2 实现点赞功能

效果图 接口分析 通过上面的效果图可以看出,点赞入口主要是在书籍的详情页面. 而书籍详情页面,有以下几个功能是和点赞有关的: 获取点赞状态 点赞 取消点赞 所以项目中理论上与点赞相关的接口就以上三个. 点赞 model 的设计 既然明确了接口数量,那么下一步就是设计接口对应的model,通过model生成表格like,里面存放点赞数据. 那么需要存在哪些点赞数据呢? 这里简单分析后,记录一条点赞信息只需要保存以下的信息即可: 点赞 id 书籍 id 用户 id created_at delete

Drupal7 实现like(点赞)功能

尝试了好几个模块做下总结: 1. Like Dislike Buttons 好处:代码实现简单,一看就懂,开启后无需任何配置,自动在node底部显示like和unlike的小手.而且模版改起来也容易. 坏处:可配置项太少,就一个Vote denied message的文本框,就是不允许点like的自定义内容. 2. Like & Dislike 好处:可以针对哪个content type和comment生效 坏处:模版图片少,上面说可以对users类型启用该功能,但是没找到配置项. 3. lik

IOS开发-项目实战-点赞功能的实现

实现思路: 1.每一条新闻就是一个cell,在cell上添加点赞按钮. 2.让cell的控制器成为自定义cell的代理,将点击了哪一个cell放在代理方法中传出去. 3.并将这条新闻的ID和当前用户的ID上传服务器. 4.此时要考虑每个用户只能点击一次,且当用户再次点击的时候,取消点赞(定义一个BOOL变量存储用户的点击次数).则将上传的数据取出来,做判断,如果取出来有数据,说明用户点击过,没有数据那就存储到网络.再次点击,将请求下来的数据,即BOOL变量存储为NO,即取消点赞. 5.到这里就要

Redis应用2-Redis实现开发者头条页面点赞功能

开发者头条是一个资源丰富的程序猿学习网站.当网站发布新的咨询的时候,内容优秀的咨询总是会被点赞.今天就利用Redis实现这个小小的功能. 为什么使用Redis而不是Mysql实现? Redis 和 Mysql应用场景不同. 从效率来说: Redis的数据存放在内存,所以速度快但是会受到内存空间限制. MySQL存放在硬盘,在速度上肯定没有Redis快,但是存放的数据量要多的多. 从功能来说: Redis是一个K-V数据库,同时还支持List/Hash/Set/Sorted Set等几个简单数据结

Python学习---抽屉框架分析[点赞功能/文件上传分析]0317

点赞功能分析 前台传递过来新闻id[new_id]和session[session内有用户ID和用户之间的信息]到后台 后台News数据库内用户和新闻是多对多的关系,查看第三张表中的内容,判读用户Id所对应的信息里有没有new_id,如果有则remove[取消点赞],否则增加一条点赞 obj = News.objects.get(new_id=id) b = obj.favor.filter(uid=request.session['uid']).count() if b: obj.remove