微信小程序基于云数据库实现点赞功能
微信小程序基于云数据库实现点赞功能
- 微信小程序基于云数据库实现点赞功能
- 小Tips
- 2022.04.27 更新
微信小程序基于云数据库实现点赞功能
首先你要开通云开发,然后点击数据库创建集合(这里我的集合是‘Books’),然后在集合里面添加数据,注意将集合对应的权限改为“自定义安全规则”
将安全规则自定义为“所有用户可读写”
思路如下:
- 利用云函数获取用户的openid
- 从数据库获取需要的like,like_num,like_people(放对应书籍id的点赞用户的openid)等数据,放入新建newList的数组中
- 在newList的like_people这个二维数组中遍历当前用户openid是否出现过,出现过则把该用户点赞过的书籍id放入新建iszan数组中
- 寻找iszan数组和newList数组中相同的id(我用的方法时间复杂度都是O(n²),有更好方法欢迎指导),有相同的则“点亮红心”
- 点赞事件:只需一个判断条件——①iszan数组中是否包含该书籍id或者②该书籍的like_people数组是否包含该用户openid,如果是的话就“取消点赞”,否则“点赞”
- 和后台交互,后台数据要同步,使用update
代码:
wxml
<block wx:for='{{newsList}}' wx:key="index"><view class='item-zan' bindtap='thumbsup' data-id='{{item._id}}'><image src='/images/like.png' style="width:60rpx;height:60rpx" wx:if="{{!item.like}}"></image><!--未点赞--><image src='/images/like_active.png' style="width:60rpx;height:60rpx" wx:else></image><!--点赞--><view style="margin-left:20rpx">{{item.like_num}}</view></view>
</block>
通过thumbsup事件完成点赞,把其中的like由false改为true(取消点赞则是相反)来显示
js
const db = wx.cloud.database()
const _ = db.command
const booksCollection = db.collection('Books')
Page({data: {newsList: [], //列表数据iszan: [], //点过赞的id集合like_people: [], //每个列表数据的点赞的用户集合openid: ''},//页面加载初始化列表数据onLoad: function () {let that = this;wx.cloud.callFunction({name: 'getOpenid',complete: res => { // 获取用户openidconsole.log('云函数获取到的openid: ', res.result.openid)that.setData({openid: res.result.openid})booksCollection.field({ //发送请求获取列表数据_id: true,like: true,like_num: true,like_people: true}).get({success: res => {that.setData({newsList: res.data})var iszan = that.data.iszan;for (var i = 0; i < res.data.length; i++) { //数据获取成功后,进行遍历,拿到所有已经点过赞的书籍idfor (let j = 0; j < res.data[i].like_people.length; j++) {if (res.data[i].like_people[j] == that.data.openid) { iszan.push(res.data[i]._id) //根据改用户的数据找到已经点赞的,把书籍id放入新建数组中}}}for (let i = 0; i < res.data.length; i++) {res.data[i].like = falsefor (let j = 0; j < iszan.length; j++) { //利用新建的iszan数组与list数组的id查找相同的书籍idif (res.data[i]._id == iszan[j]) { //双重循环遍历,有相同的id则点亮红心res.data[i].like = true}}}console.log(res.data)that.setData({iszan: this.data.iszan,newsList: res.data})wx.setStorageSync('zan', iszan);}})}})},// 点赞函数 获取对应idthumbsup: function (e) {var shareid = e.currentTarget.dataset.id;this.zan(shareid);},//点赞处理函数 zan: function (item_id) {var that = this;var cookie_id = wx.getStorageSync('zan') || []; //获取全部点赞的idvar openid = that.data.openidconsole.log(openid)for (var i = 0; i < that.data.newsList.length; i++) {if (that.data.newsList[i]._id == item_id) { //数据列表中找到对应的idvar num = that.data.newsList[i].like_num; //当前点赞数if (cookie_id.includes(item_id) ) { //已经点过赞了,取消点赞for (var j in cookie_id) {if (cookie_id[j] == item_id) {cookie_id.splice(j, 1); //删除取消点赞的id}}--num; //点赞数减1that.setData({[`newsList[${i}].like_num`]: num, //es6模板语法,常规写法报错[`newsList[${i}.].like`]: false //我的数据中like为'false'是未点赞})wx.setStorageSync('zan', cookie_id);wx.showToast({title: "取消点赞",icon: 'none'})this.data.newsList[i].like_people.pop(openid)} else { //点赞操作++num; //点赞数加1that.setData({[`newsList[${i}].like_num`]: num,[`newsList[${i}.].like`]: true})cookie_id.unshift(item_id); //新增赞的idwx.setStorageSync('zan', cookie_id);wx.showToast({title: "点赞成功",icon: 'none'})this.data.newsList[i].like_people.push(openid)}//和后台交互,后台数据要同步booksCollection.doc(item_id).update({data: {like: this.data.newsList[i].like,like_num: num,like_people: this.data.newsList[i].like_people},success: res => {console.log(res)}})}}}
})
小Tips
- 使用云函数获取用户id借鉴于 微信小程序开通云开发并利用云函数获取Openid
- 如果项目是使用服务器的话就需要把wx.cloud.callFunction()接口换成wx.request()即可。如是使用自搭服务器请参考↓,本文点赞功能主体也是借鉴于此 微信小程序列表点赞功能
2022.04.27 更新
这是以前菜鸡的我写的,现在抛开这篇文章来看这个需求,最好的实现方式是:
- 每个用户维护一个数组A,数组A的元素是书籍列表中已点赞的书籍的索引(数组下标);
- 拉取书籍列表后,前端根据数组A来判断每本书籍该用户是否点赞过。
思维导图如下:
之前的代码我就不删掉了,按照这个新思路欢迎大家自行重构代码
微信小程序基于云数据库实现点赞功能相关推荐
- 微信小程序基于云数据库简单实现帖子点赞功能。
思路: 1·用云函数或者app.js获取用户openid,在每个帖子里面like_people数组里添加点赞过该帖子的用户openid.获取帖子云数据存放到suju:[]里. 2·点击点赞按钮图标变换 ...
- 微信小程序 | 基于云数据库的许愿墙
CSDN话题挑战赛第2期 参赛话题:学习笔记 本实训项目以云开发的云数据库为基础,制作一个简易的许愿墙. 01.实训内容 本实训项目以云开发的云数据库为基础,制作一个简易的许愿墙,顾名思义" ...
- c语言京东购物系统,仿京东商城: 自主使用微信小程序实现的网上商城案例(包括前端和后台),利用了微信小程序的云数据库...
仿京东网上商城 介绍 自主使用微信小程序实现的仿京东网上商城案例(包括前端和后台),数据库利用了微信小程序的云数据库 软件架构 软件架构说明 数据库表设计 本系统数据库主要用了微信小程序自带的云数据库 ...
- 新手如何用微信小程序和云数据库做一个论坛?【帖子页】
新手小白用微信小程序和云数据库做一个论坛[帖子页] 先放个效果图 由于后面换了头像,所以评论的头像和发帖的头像不一样. 要做个同款论坛,首先需要用到云数据库.在微信开发者工具的左上角开通云开发就可以了 ...
- 通过微信小程序的云开发实现留言功能
通过微信小程序的云开发实现留言功能 index.wxml index.wxss index.js 微信小程序中用于解析date的util.js 授权页home.wxml home.wxss home. ...
- 微信小程序利用云开发实现评论功能
微信小程序利用云开发实现评论功能 如果喜欢可以给我一个关注. 一.微信小程序,评论功能的实现. 首先我们先布局,一个文章或者是商品,底下是评论, <!-- 商品详情 --> <vie ...
- 微信小程序-基于云开发实现社区项目(Demo版本的升级)
针对上一版 [微信小程序~云开发的实现的一个社区 Demo(完结~)] 项目的问题,做了问题修复和功能优化以及UI美化,起码整体界面效果看起来不那么"程序员"了.同时还新增了很多小 ...
- 微信小程序 连接云数据库(不使用云函数)进行 登录、注册、查询(包括模糊查询)快速实现 亲测可用
当连接MySQL的时候总是出现各种各样的小问题,可以选用微信小程序自带的云数据库 目 录 建立云数据库 建表 导入MySQL中的表 导出 导入 云数据库初始化 登录注册 注册功能 登录功能 查询(模糊 ...
- 微信小程序之云数据库增删改查
功能实现: tabbar导航栏 云数据库增删改查 一.效果图: 二.代码 app.json {"pages": ["pages/index/index",&qu ...
最新文章
- 如何在Rancher 2.2 Preview2上部署和管理多K8s集群应用 1
- 华为实验台ENSP安装与使用
- Calling JNI Functions with Java Object Arguments from the Command Line
- java可视化压缩_web可视化技术发展(1/6)
- echarts 怎么知道鼠标点击的哪根柱子
- 今天终于有自己的博客了!!!
- 用.net中的SqlBulkCopy类批量复制数据 (转载)
- Hibernate(一)——采用Hibernate框架开发环境搭建
- ubintu yum装mysql_Ubuntu 下安装Mysql centos8 下安装mysql8.0
- linux更改root密码_如何在Linux中更改root密码
- redis学习篇(九)-----高级特性之事务处理
- 突然发现到今天已经很难找到对底层理解这么透彻的人
- mysql中各种连接的区别
- 网站地图在线生成html,如何制作网站地图(sitemap.html和sitemap.xml)?
- 什么软件硬盘测试修复最好,什么软件检测、修复硬盘坏道最好?
- 关于VS2017配置OpenCV出现无法打开文件“opencv_ml249d.lib”的解决方案
- 快递行业面单打印解决方案-快宝云打印
- 电信光纤猫与无线路由器连接
- javascript 图片特效算法
- CSS3实现圆圈动态发光特效动画
热门文章
- 江苏高中计算机学业水平测试查询,2018年江苏高中学业水平考试成绩查询官方入口...
- ios xib 初始化高度_iOS xib自定义,高度减少64
- 从技术到管理,程序员如何实现螺旋上升?
- 极光推送Jpush的“appKey and masterSecret format is incorrect”问题修复
- [空间分析] DEM提取山脊线与山谷线
- i9500官方系统优化与S4系列充电相关问题的经验杂谈(5/26更新)
- java列出所有组合_关于Java中列出一组数据的所有组合算法
- php中align是什么意思,htmlalign属性是什么含义?html中的align属性设置方法介绍
- 流量记录和回放n2disk
- 有一堆共n枚硬币,其中一枚是假币,外观上无法区分,只知道假币的重量稍轻。要求仅使用一个天平,使用最少的重量比较次数找出假硬币。