Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >利用 leanCloud 实现点赞功能

利用 leanCloud 实现点赞功能

作者头像
2Broear
发布于 2024-03-12 02:18:01
发布于 2024-03-12 02:18:01
19300
代码可运行
举报
文章被收录于专栏:2B博客2B博客
运行总次数:0
代码可运行

点赞功能

社交平台的必备良药,谁谁谁什么时候给你点了个赞,点赞什么的貌似已经深入人心了。之前在 @火喵酱 的博客页面有看到说想用 leancloud 实现 do you like me 的点赞功能,之前没接触 leancloud 的 SDK 不知道咋搞,后来就不了了之,然后因为最近做了 valine 的最新评论排行,所以借这个风顺便来做个点赞功能~

点赞按钮

实践操作

和 valine 最新评论一样,首先需要引入 sdk 并初始化完成化后接入具体实现的代码即可(这个就不说了,上篇笔记里有写的)

实现思路

因为我要做的是页面点赞功能,所以可能会比 do you like me 那个稍稍多个步骤。这里再聊下思路,一般做点赞功能都是在本地点击计数之后再把数据上传到云端服务器,访问页面的时候直接根据页面拉取对应的数据填充即可。不过这里面有个读取和储存数据的操作,在 leancloud 文档里明确说到:

由于赞和转发的操作可能由多个客户端同时进行,直接在本地更新数字并保存到云端的做法极有可能导致差错。

所以 leancloud 官方提供了一个 increment 函数来实现“原子操作”跳过读取储存操作直接计数统计(已经试过了传统方法也是可行的,不过使用该函数会更简便)

具体实现

首先我们在 leancloud 控制台创建一个自定义名称的 class 数据(比如: likeCount ,然后构建对象

需要手动创建 class 类!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   var URL = location.pathname,  //获取纯 url 防止重复筛选
        el = document.getElementById("counter"),  //写入元素
        el_ = document.getElementById("like");  //点击元素

    const likeCount = AV.Object.extend("likeCount"),  //为 AV.Object 创建子类
          likeDemo = new likeCount(),  //为该类创建一个新实例
          getCounter = new AV.Query("likeCount"),  //使用 AV.Object 的构造器
          getCount = getCounter.equalTo("url",URL);  //用于筛选指定 url 的 like 计数

完成后进行初始化获取计数判断是否有数据存在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getCount.find().then(results => {
    getCount.find().then(results => {
        //成功返回数据=>获取云端计数=>写入到元素 || 返回空数据=>写入到元素
        results.length>=1 ? el.innerHTML = results[0].attributes.num : el.innerHTML = 0;
    });
});

初始化获取后创建模拟点击函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   el_.onclick=function(){  //元素点击函数
        getCount.find().then(results => {
            if(results.length>=1){  //成功返回数据(已创建对象,更新 num 数据)
                let countNUM = results[0].attributes.num,  //获取云端计数
                    objId = results[0].id;  //获取当前页面 id
                countNUM++;  //本地计数++
                el.innerHTML = countNUM;  //写入本地计数到元素
                const increase = AV.Object.createWithoutData('likeCount', objId);  //获取当前页面 id 的云端对象
                increase.increment('num', 1);  //使用 increment 函数更新云端对象的 num 属性
                //储存(更新)对象到云端
                increase.save().then(increase => {
                    console.log("Update Successfully.");
                }, error => {
                    console.log("Update Error.")
                })
            }else{  //返回空数据(未创建对象,第一次创建num+url)
                let countNUM = 0,  //初始化本地计数
                    countURL = URL;  //获取当前 url
                countNUM++;  //本地计数++
                el.innerHTML = countNUM;  //写入本地计数到元素
                //储存 num(本地计数) 和 url(当前url) 对象到云端
                likeDemo.save({
                    'num': countNUM,
                    'url': countURL
                }).then(result => {
                    console.log("Save Successfully.");
                }, error => {
                    console.log("Save Error.")
                })
            }
        })
    }

最后在执行代码前不要忘了判断一下 el_ 元素是否存在,如果不存在表示当前页面不需要获取 likeCount 数量则不发送请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   if(el_!=null && el_!=undefined){
        //..
    }

其他

以上代码写入 SDK 初始化后运行就可以正常获取不同页面的点赞次数了,数据创建后会在 leancloud 控制台显示,如下

其实拿到信息还可以通过点赞数量创建热门文章(还可以加个 pageview 实现页面访问量)具体实现方式和最新评论差不多,喜欢就做(页尾会拓展一个集成统计页面访问)

一个 num 一个 url

问题修复

期间遇到不少问题,在文档里又没说明白,让人属实脑壳疼,400/400各种报错,在这也做个简单的记录以免再踩坑。

获取不到 class 404

出现这个问题的根本在构造对象完成后,没有进行数据储存操作,导致 SDK 没有自动创建我们指定的 class。解决方案很简单,在控制台手动创建一个同名称的 class 或在完成构造对象后发起一个储存请求,该请求会自动创建 class

推荐第一种方案,因为我现在也还没解决这个问题/笑哭

获取不到 class

错误的数据写入类型 400

这个问题困扰了我好久,因为正常写入 String 类型都是可以的,当我把 num 以 Number 类型写入就会报错写入失败,找半天没找到原因最后发现原来是创建 class 之后第一次储存的类型会一直保留(比如查询到空数据,然后第一次写入 num 为 String 类型,第二次写入 Number 类型就不行了..)

解决方案也很简单,第二次写入类型要和第一次写入类型相同(当时找半天没找到原因我是直接把 num 转成 string 类型储存了233)

第二次写入 undefined 了

相关链接

LeanCloud 官方文档

拓展

分享功能已经完善的差不多了(目前点赞和海报生成暂未开放仅限测试页面目前已全站开放,欢迎测试报bug~)下次聊下如何设置博主显示和置顶评论以及利用 html2canvas+qrcodejs 生成文章分享海报~

上面有写到利用该方法统计页面访问量的情况,简单列一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var URI = location,
    URL = URI.pathname,
    el = document.getElementById("counter"),
    el_ = document.getElementById("like"),
    els = document.getElementById("viewer"),
    COUNTER = AV.Object.extend("COUNTER"),
    countDemo = new COUNTER(),
    getCounter = new AV.Query("COUNTER"),
    urlCheck = getCounter.equalTo("url",URL);
//定义数据储存函数
const saveAttr=(like,view)=>{
    let countURL = URL;
    countDemo.save({
        'like': like,
        'view': view,
        'url': countURL
    }).then(result => {
        console.log("Save Successfully.")
    }, error => {
        console.log("Save Error.")
    })
},
//定义数据更新函数
updateAttr=(id,attr,num)=>{
    let increase = AV.Object.createWithoutData('COUNTER', id);
    increase.increment(attr, num);
    increase.save().then(increase => {
        console.log("Update Successfully.")
    }, error => {
        console.log("Update Error.")
    })
};
// 首次(刷新)访问页面执行 query.view+like autoCheck
urlCheck.find().then(results => {
    if(results.length>=1){
        //返回有数据时
        let upAttr = 'view',  //需要获取的数据属性名
            objId = results[0].id,  //云端id
            viewNum = results[0].attributes.view,  //获取云端 view 数据
            likeNum = results[0].attributes.like;  //获取云端 like 数据
        viewNum++;  //更新 view 数据
        el!=null&&likeNum!=undefined ? el.innerHTML=likeNum : el.innerHTML=0;   //满足条件写入元素
        updateAttr(objId,upAttr,1);  //调用数据更新函数发送到云端
        els!=null ? els.innerHTML = viewNum : false;  //update之后执行(即使没有找到可用计数器也能记录并发送数据)
    }else{
        //返回空数据时
        var likeNum = viewNum = 0;  //第一次访问(刷新)页面初始化 view/like
        el.innerHTML = likeNum;  //写入空数据到元素
        viewNum++;  //更新 view 数据
        els!=null ? els.innerHTML = viewNum : false;  //满足条件写入元素
        saveAttr(likeNum,viewNum)  //调用数据储存函数发送到云端
    }
});
//点击按钮执行 query.like Click
var timer;
el_.onclick=function(){
    clearTimeout(timer);
    timer = setTimeout(function(){
        urlCheck.find().then(results => {
            if(results.length>=1){
                //返回有数据时
                let upAttr = 'like',  //需要获取的数据属性名
                    objId = results[0].id,  //云端id
                    likeNum = results[0].attributes.like;  //获取云端 like 数据
                //likeNum==undefined ? likeNum=0 : likeNum;  //判断 like 数据是否未定义再执行(已废除,第一次访问页面会初始化点击次数)
                likeNum++;  //更新 like 数据
                el.innerHTML=likeNum;  //写入数据到元素
                updateAttr(objId,upAttr,1) //调用数据更新函数发送到云端
            }else{
                console.log("data init error!")
                /*/返回空数据时(已废除,首次访问页面即可完成数据初始化)
                var likeNum = 0,
                    viewNum;
                likeNum++;
                el.innerHTML = likeNum;
                saveAttr(likeNum,viewNum)  //调用数据储存函数发送到云端*/
            }
        })
    }, 1000);
}

以上代码正确配置后无报错应该如下图所示。

view数据实时更新 / like数据点击更新

以上,有问题评论区留言。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/06/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Valine 实现评论“撤回”重新编辑
说到消息“撤回”,应该能想到 qq 或者微信提供的消息撤回功能,应该算是互联网上的一剂后悔药,这样做不仅能减少评论错误,还能极大程度提升用户使用体验,这两全其美的事情何乐而不为,可我们修改的对象 Valine 一如既往的没有提供这些人性化的功能,所以我们还得和以前一样看看文档写写 bug 才能把功能捣鼓出来..(想法来自 @Zsedczy 的评论重新编辑和撤销删除)
2Broear
2024/03/12
1620
Valine 实现评论“撤回”重新编辑
Valine 获取最新评论解决方案
这是个比较好用的功能,不管是用户还是管理员都可以即时看到最新评论并作出回应。只可惜 valine 官方并没有开发这么一个功能,秉承着自己动手丰衣足食的想法,也算是在 @Lee 的一篇 leanCloud 文章的启发下才有了使用 leanCloud 实现最新评论的思路。
2Broear
2024/03/12
1230
利用 leancloud 记录 referrer 访问来源
最近 leancloud 后台记录了部分页面访问是从 pages 目录来访的,这个目录是之前还没使用二级域名 blog 前使用的,后面加了 blog 之后就不再用 pages 目录来访问页面了,现在想要了解访问 pages 目录的源头都在哪里(一般在谷歌)一般来说,通过前端统计信息比较有限,我们想要拿到一部分访问者的信息需要一些特定的 api ,比如访问 ip 地段,用户基本访问源等等,这里主要聊下如何将获取到的信息储存到 leancloud 数组内。
2Broear
2024/03/12
2110
利用 leancloud 记录 referrer 访问来源
引入基于LCloud的页面访问统计到Hexo博客中
由于本主题(Volantis)使用的 Valine 暂时仍然无法正常开启 Counter 页面计数,所以,在单一页面上展示出该页面的访问量就成了一个问题。不蒜子是个解决方式,但其加载巨慢而且仍属于个人维护、并不稳定。所以综合到最后,选择采用 LeanCloud 来完成这一功能。其主要思路就是访问页面时到对应的 LeanCloud 数据表中更新访问次数。不过暂时只能记录PV值。
ZONGLYN
2020/06/29
2.1K0
引入基于LCloud的页面访问统计到Hexo博客中
【红隼书签】自定义光影、自定义背景、亮度和主题功能
Part1用Vue3.0 开发一款导入浏览器书签的在线书签 🤵介绍(取名) 👉👉👉【红隼书签】是一款简洁的在线书签导航网站。 名字的由来其实是,本着保护动物,爱护动物的初心,想到起一个鸟类的名称,其实最开始想了很多名字,小詹书签,麻雀书签等。 图片 但是听起来都不够响亮。后来想了一个食肉的,有点凶猛的又有点呆萌的鸟类的名字,红隼【英文翻译:kestrel】,点个赞。于是就有了这个名字啦,但是听起来也是不错的。于是开发计划开始啦。 😀数据来源(印象中文) 他的默认数据为我选的是印象中文的web导航数据;其实我
微芒不朽
2023/04/23
3830
【红隼书签】自定义光影、自定义背景、亮度和主题功能
应对LeanCloud对于处理性能的限制
最近一直想如何才能统计资源分享页面里的资源的下载次数,由于是直接放的资源链接,即点击即可获取,所以没有所谓的拦截页面进行统计,同时作为静态博客也几乎没有带数据存储的动态扩展能力,这时想到了用LeanCloud来实现下载的计数,最后基本实现了这个想法,有兴趣的可以去资源分享里看看效果。
ZONGLYN
2019/08/08
1.5K0
【红隼书签】一款简洁的在线书签导航网站
?介绍(取名) ???【红隼书签】是一款简洁的在线书签导航网站。 名字的由来其实是,本着保护动物,爱护动物的初心,想到起一个鸟类的名称,其实最开始想了很多名字,小詹书签,麻雀书签等。 但是听起来都不够
微芒不朽
2021/07/10
1.8K0
JavaScript进阶教程(5)-一文让你搞懂作用域链和闭包
在JS中变量可以分为局部变量和全局变量,对于变量不熟悉的可以看一下我这篇文章:搞懂JavaScript全局变量与局部变量,看这篇文章就够了 作用域就是变量的使用范围,分为局部作用域和全局作用域,局部变量的使用范围为局部作用域,全局变量的使用范围是全局作用域。在 ECMAScript 2015 引入let 关键字之前,js中没有块级作用域---即在JS中一对花括号({})中定义的变量,依然可以在花括号外面使用。
AlbertYang
2020/09/16
3360
JavaScript进阶教程(5)-一文让你搞懂作用域链和闭包
后端人眼中的Vue(四)
​ Vue的生命周期指的是Vue实例在页面中创建到销毁整个过程。Vue提供了在各个生命周期的钩子,钩子也叫Vue生命周期函数。这些生命周期函数是伴随着Vue实例创建、销毁的过程中自动触发的(不需要人为手动触发)。Vue实例生命周期有三个阶段:
上分如喝水
2023/01/11
2760
后端人眼中的Vue(四)
19.Vuex详细使用说明-一篇文章涵盖所有知识点
不管是Vue,还是 React,都需要管理状态(state),比如组件之间都有共享状态的需要。 什么是共享状态? 比如一个组件需要使用另一个组件的状态,或者一个组件需要改变另一个组件的状态,都是共享状态。
用户7798898
2021/05/10
1.7K0
19.Vuex详细使用说明-一篇文章涵盖所有知识点
【图文教程】前端程序员的利器,如何使用LeanCloud存储和更新你的静态页面数据?
Serverless 云开发是现在的大热门和趋势,各大云服务厂商都已经支持 FaaS(函数即服务) 云开发方式,微信小程序云开发是典型的例子。
张张
2019/12/23
2.5K0
【图文教程】前端程序员的利器,如何使用LeanCloud存储和更新你的静态页面数据?
Taro 小程序开发大型实战(八):尝鲜 LeanCloud Serverless 云服务
欢迎继续阅读《Taro 小程序开发大型实战》系列,前情回顾: 熟悉的 React,熟悉的 Hooks[1]:我们用 React 和 Hooks 实现了一个非常简单的添加帖子的原型 多页面跳转和 Taro UI 组件库[2]:我们用 Taro 自带的路由功能实现了多页面跳转,并用 Taro UI 组件库升级了应用界面 实现微信和支付宝多端登录[3]:实现了微信、支付宝以及普通登录和退出登录 使用 Hooks 版的 Redux 实现大型应用状态管理(上篇)[4]:使用 Hooks 版的 Redux 实现了 us
一只图雀
2020/04/07
8930
实现一个自己的MVVM
vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的,那么vue是如果进行数据劫持的,我们可以先来看一下通过控制台输出一个定义在vue初始化数据上的对象:
前端迷
2019/12/05
5490
实现一个自己的MVVM
Hcode网站的搭建日记(四)Ajax实现阅读量统计
在静态网页可以不刷新重载网页实现以下功能,特别是有设置缓存的静态网站,可以动态执行所需要的更新,避免一些不必要资源的再次加载,可以增加浏览器的访问速度,增加客户浏览体验度。 Ajax技术的一些运用实例如下:
HcodeBlogger
2020/07/14
6640
Hcode网站的搭建日记(四)Ajax实现阅读量统计
前端常考vue面试题(必备)_2023-03-15
computed 内部实现了一个惰性的 watcher,也就是 computed watcher,computed watcher 不会立刻求值,同时持有一个 dep 实例。
yyds2026
2023/03/15
1.1K0
Fluid -24- Leancloud 失效解决方案 —— 自建站点 PV UV 统计
修改 fluid 主题配置文件 Hexo/_config.fluid.yml,加入新的文章浏览计数来源,我起名叫 vvdpostpvuv
为为为什么
2022/09/22
1.1K0
Fluid -24- Leancloud 失效解决方案 —— 自建站点 PV UV 统计
Typecho实现文章点赞功能
应 @森木志姥爷 要挟!特此水一篇折腾记录-Typecho实现文章点赞,当时也懒得记录,现在觉得有必要记录一下。
若志奕鑫
2021/12/23
1.8K0
2022前端经典vue面试题(持续更新中)
一个SPA应用的路由需要解决的问题是 页面跳转内容改变同时不刷新 ,同时路由还需要以插件形式存在,所以:
bb_xiaxia1998
2022/09/16
1K0
修复 Valine 评论泄漏隐私问题
这个问题在我20年刚开始使用 valine 作为评论的时候就有了,不过当时的作者貌似并没有理会这个问题(原因应该是设计的时候就没有考虑进去这些东西,导致修改的话会更替掉一些东西),评论的隐私信息无非就是ip和邮件,主要还是邮件,一般来说ip默认是关闭的,不过就邮件来说这个东西在评论里只是拿来调用 gravatar 头像和回复邮件提醒用的,我看作者都没所谓我也就没太关注这个,但邮件的确算个人隐私。
2Broear
2024/03/12
1460
修复 Valine 评论泄漏隐私问题
滴滴前端一面常考vue面试题(持续更新中)_2023-03-13
简而言之,就是先转化成AST树,再得到的render函数返回VNode(Vue的虚拟DOM节点),详细步骤如下:
用户10358241
2023/03/13
8510
推荐阅读
相关推荐
Valine 实现评论“撤回”重新编辑
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验