(十)、通过云对象修改阅读量+点赞功能的实现【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

news2024/12/27 14:39:29

1,通过云对象importObj修改阅读量

1.1 新建云对象

在这里插入图片描述

在这里插入图片描述

1.2 云对象中写自增自减方法

封装云对象utilsObj中的自增自减方法,方法名取为operation,传递4个参数。

// 云对象教程: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj
// jsdoc语法提示教程:https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/129
const db = uniCloud.database();
const dbCmd = db.command;
module.exports = {
  _before: function() { // 通用预处理器

  },
  /**
   * @param {Object} table 数据表
   * @param {Object} attr 属性字段
   * @param {Object} id 
   * @param {Object} num  1自增 -1自减
   */
  async operation(table, attr, id, num) {
    let obj = {}
    obj[attr] = dbCmd.inc(num);
    return await db.collection(table).doc(id).update(obj)
  }
}
1.3 detail页面中引入云对象

在script中引入云对象

const utilsObj = uniCloud.importObject("utilsObj", {
    customUI: true
  });

methods中封装修改阅读量方法,调用云对象中的operation方法。

      //修改阅读量
      readUpdate() {
        utilsObj.operation("quanzi_articles", "view_count", this.artid, 1).then(res => {
          console.log(res);
        })
      },

onload中调用readupdate方法,测试一下:

后台显示更新一次成功。
在这里插入图片描述
在这里插入图片描述

2,点赞的功能实现

2.1 创建点赞表

创建点赞表的schema.json

在这里插入图片描述
在这里插入图片描述
quanzi_like.schema.json

{
  "bsonType": "object",
  "required": ["article_id", "user_id"],
  "permission": {
    "read": true,
    "create": "auth.uid != null",
    "update": "doc.user_id == auth.uid",
    "delete": "doc.user_id == auth.uid"
  },
  "properties": {
    "_id": {
      "description": "存储文档 ID(文章 ID),系统自动生成"
    },
    "article_id": {
      "bsonType": "string",
      "description": "文章ID",
      "foreignKey": "quanzi_articles._id"
    },
    "user_id": {
      "bsonType": "string",
      "description": "评论者ID,参考`uni-id-users` 表",
      "forceDefaultValue": {
        "$env": "uid"
      },
      "foreignKey": "uni-id-users._id"
    },
    "publish_date": {
      "bsonType": "timestamp",
      "title": "点赞时间",
      "description": "点赞时间",
      "defaultValue": {
        "$env": "now"
      }
    },
    "ip": {
      "bsonType": "string",
      "description": "评论发表时 IP 地址",
      "forceDefaultValue": {
        "$env": "clientIP"
      }
    }
  },
  "version": "0.0.1"
}


2.2 添加@clic点击事件
          <!-- 点赞 -->
          <view class="btn"  @click="clickLike">
            <text class="iconfont icon-good-fill"></text>
            <text v-if="detailObj.like_count">{{detailObj.like_count}}</text>
          </view>

点赞点击方法

      //点击点赞方法
      clickLike() {
        db.collection('quanzi_like').add({
          article_id: this.artid

        }).then(res => {
          console.log(res)
        })
      }

查看数据库中article_like中已经增加了一条记录
在这里插入图片描述

2.3 避免重复点赞的处理

修改clickLike方法:
首先查询点赞表中 当前登录用户和当前文章的记录数,如果已经当前用户已经点赞了当前文章,查询到的数量应该为1,否则为0;然后通过count进行判断,避免当前登录用户重复点赞当前文章。

      //点击点赞方法
      async clickLike() {

        let count = await db.collection("quanzi_like").where(`article_id=="${this.artid}" && user_id==$cloudEnv_uid`)
          .count()
        console.log(count)
        if (count.result.total) {

        } else {
          db.collection("quanzi_like").add({
            article_id: this.artid
          })
        }
      }
2.4 取消点赞操作

修改clickLike方法:

    //点击点赞方法
      async clickLike() {
        // 查询数量
        let count = await db.collection("quanzi_like").where(`article_id=="${this.artid}" && user_id==$cloudEnv_uid`)
          .count()
        console.log(count)
        //total为1,点赞过 进行取消点赞操作 去数据库删除点赞记录
        if (count.result.total) {
          //删除点赞记录
          db.collection("quanzi_like").where(`article_id=="${this.artid}" && user_id==$cloudEnv_uid`)
            .remove();
        } else { //total为0,没有点赞过,数据库新增点赞记录 
          //新增点赞记录
          db.collection("quanzi_like").add({
            article_id: this.artid
          })
        }
      }

3,修改点赞样式

3.1 三表联查

三表对应关系
在这里插入图片描述
三表联查,修改detail.vue中的getdata方法

      //联表查询获取数据
      getData() {
        let artTemp = db.collection('quanzi_articles').where(`_id =="${this.artid}"`).getTemp()
        let userTemp = db.collection('uni-id-users').field("_id,username,nickname,avatar_file").getTemp()
        let likeTemp = db.collection("quanzi_like").getTemp(); //.where(`article_id=="${this.artid}" && user_id==$cloudEnv_uid`)

        db.collection(artTemp, userTemp, likeTemp).get({
          getOne: true
        }).then(res => {
          console.log(res)
          //如果文章id不存在
          if (!res.result.data) {
            this.errFun();
            return;
          }
          this.loadState = false
          this.detailObj = res.result.data
        }).catch(err => {
          this.errFun();
        })
      }

打印输出结果:
在这里插入图片描述
注:如果没有点赞记录,_id.quanzi_like数组长度为0 。

3.2 判断用户是否点赞

对点赞数据库的操作(quanzi_like)
添加过滤条件

        let likeTemp = db.collection("quanzi_like").where(`article_id=="${this.artid}" && user_id==$cloudEnv_uid`)
          .getTemp();

定义islike并且将自定义属性islike追加到对象detailObj中。

          //是否点过赞   如果没有点赞记录,_id.quanzi_like数组长度为0 反正为1
          let isLike = res.result.data._id.quanzi_like.length ? true : false;
          res.result.data.isLike = isLike;
          this.detailObj = res.result.data
3.3 对点赞数量进行增减

对文章数据库的操作(quanzi_articles)

修改clicklike方法:

//点击点赞方法
      async clickLike() {
        // 查询数量
        let count = await db.collection("quanzi_like").where(`article_id=="${this.artid}" && user_id==$cloudEnv_uid`)
          .count()
        console.log(count)
        //total为1,点赞过 进行取消点赞操作 去数据库删除点赞记录
        if (count.result.total) {
          //删除点赞记录
          db.collection("quanzi_like").where(`article_id=="${this.artid}" && user_id==$cloudEnv_uid`)
            .remove();
          utilsObj.operation("quanzi_articles", "like_count", this.artid, -1)
        } else { //total为0,没有点赞过,数据库新增点赞记录
          //新增点赞记录
          db.collection("quanzi_like").add({
            article_id: this.artid
          })
          utilsObj.operation("quanzi_articles", "like_count", this.artid, 1)
        }
      }
3.4 对点赞优化无感操作

自动显示交互界面
取消自动展示的交互提示界面

  const utilsObj = uniCloud.importObject("utilsObj",{
    customUI: true // 取消自动展示的交互提示界面
  });

点赞优化无感操作
对clicklike方法进行添加如下代码:

      //点击点赞方法
      async clickLike() {
        this.detailObj.isLike ? this.detailObj.like_count-- : this.detailObj.like_count++;
        this.detailObj.isLike = !this.detailObj.isLike

		//省略其他
        }
3.4 恶意盗刷点赞的处理

问题如下图:
在这里插入图片描述
解决方案:
限制两次点赞之间的时间不能小于1秒或者2秒。

      //点击点赞方法
      async clickLike() {

        //限制两次点赞之间的时间不能小于2秒
        let time = Date.now();
        if (time - this.likeTime < 2000) {
          uni.showToast({
            title: "操作太频繁,请稍后...",
            icon: "none"
          })
          return;
        }

        this.detailObj.isLike ? this.detailObj.like_count-- : this.detailObj.like_count++;
        this.detailObj.isLike = !this.detailObj.isLike
        
        this.likeTime = time;

		//省略其他
        }
        

动态设置当前页面的标题 参考链接
在getdata方法中,添加如下代码:

          uni.setNavigationBarTitle({
            title: this.detailObj.title
          })

4,封装发送网络请求的点赞方法

4.1 公共工具类tools.js封装点赞方法

…utils/tools.js 方法名likeFun

//点赞操作数据库的方法   
export async function likeFun(artid) {
  let count = await db.collection("quanzi_like")
    .where(`article_id=="${artid}" && user_id==$cloudEnv_uid`).count()
  if (count.result.total) {
    db.collection("quanzi_like").where(`article_id=="${artid}" && user_id==$cloudEnv_uid`)
      .remove();
    utilsObj.operation("quanzi_articles", "like_count", artid, -1)

  } else {
    db.collection("quanzi_like").add({
      article_id: artid
    })
    utilsObj.operation("quanzi_articles", "like_count", artid, 1)
  }
}
4.2 修改detail.vue中的点赞点击方法

首先页面中引入js

  import {
    likeFun
  } from "../../utils/tools.js"

修改点赞clicklike方法:

      //点击点赞方法
      async clickLike() {
        //限制两次点赞之间的时间不能小于2秒
        let time = Date.now();
        if (time - this.likeTime < 2000) {
          uni.showToast({
            title: "操作太频繁,请稍后...",
            icon: "none"
          })
          return;
        }
        this.detailObj.isLike ? this.detailObj.like_count-- : this.detailObj.like_count++;
        this.detailObj.isLike = !this.detailObj.isLike
        this.likeTime = time;
        //调用点赞方法
        likeFun(this.artid);
      }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/350538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

火山引擎数智平台的这款产品,正在帮助 APP 提升用户活跃度

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 你有没有关注过 APP 给你推送的消息&#xff1f; 出于提升用户活跃度的考虑&#xff0c;APP 会定期在应用内面向用户进行内通推送&#xff0c;推送形式既包括 APP …

查看jdk安装路径,在windows上实现多个java jdk的共存解决办法,安装java19后终端乱码的解决

查看jdk安装路径&#xff0c; 在windows上实现多个java jdk的共存解决办法&#xff0c; 安装java19后终端乱码的解决 目录 一、查看jdk&#xff08;java开发工具包&#xff09;安装路径的方法 二、在windows上实现多个java jdk的共存 &#xff08;1&#xff09;、安装好多…

【数据宝应用场景】智慧工地哪些场景需要用到哪些大数据?

近几年来&#xff0c;我国施工安全管理日趋严格&#xff0c;人力成本逐渐提升&#xff0c;人力成本压力逐渐增加&#xff0c;通过大数据、物联网、云计算和智能设备等软硬件信息化技术能有效提升工地的生产效率、管理效率等&#xff0c;实现工地的数字化、精细化、智慧化管理&a…

WGCNA | 值得你深入学习的生信分析方法!~(网状分析-第四步-模块的功能注释)

1写在前面 前面我们用WGCNA分析得到多个模块&#xff0c;其中有一些模块和我们感兴趣的表型或者临床特征是相关的。&#x1f973; 接着就是要做模块的富集分析了&#xff0c;帮助我们了解这些模块的基因都有哪些已知的功能&#xff0c;涉及到哪些通路&#xff0c;在哪些疾病中最…

贪心算法-蓝桥杯

一、贪心算法的优缺点优点&#xff1a;1.容易理解:生活常见。2.操作简单:在每一步都选局部最优。3.效率高: 复杂度常常是O(1)的。缺点&#xff1a;1.局部最优不一定是全局最优。二、例子: 最少硬币问题硬币面值1、2、5。支付13元&#xff0c;要求硬币数量最少。贪心法: (1) 5元…

工程项目管理系统源码之工程项目管理系统面临的挑战

​ ​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 ​系统定义 工程项目管理企业不直接与该工程项目的总承包…

电商项目之电子账户的收单模式

文章目录1 问题背景2 前言3 什么是电子账户支付方式4 什么是收单模式5 电子账户有哪些收单模式5.1 Direct Pay模式5.2 Auth Capture模式5.3 ESCOW模式6 区别1 问题背景 笔者从事电商开发有1年多&#xff0c;对接了10几个信用卡支付方式&#xff0c;也接触了像PayPal这种电子账户…

零基础学习测试还是开发?

软件测试作为IT行业的刚需职位&#xff0c;其实是非常适合0基础的小白同学加入学习的但是具体选择测试还是开发还是要看你个人的兴趣爱好以及学习能力&#xff0c;对哪个感兴趣&#xff0c;哪个能学的会就选择哪个就可以了 平时说起程序员印象中大都是做Java、做前端、做后端&…

春招Leetcode刷题日记-D4-双指针算法-滑动窗口快慢指针

D4-双指针算法-滑动窗口&&快慢指针快慢指针算力扣141. 环形链表思路代码力扣142. 环形链表 II思路代码滑动窗口力扣76. 最小覆盖子串思路代码力扣424. 替换后的最长重复字符思路代码快慢指针算 快慢指针算法&#xff0c;多用于链表当中&#xff0c;常见的如&#xff1…

Java锁相关知识

目录 线程安全 对象头Mark 偏向锁 轻量级锁 减少锁持有时间 减小锁粒度 锁分离 锁粗化 锁消除 无锁自旋锁 线程安全 多线程访问ArrayList 多线程网站统计访问人数,是否需要精确统计&#xff1f;如果不需要&#xff0c;可以不进行加锁 public static List<Integ…

ROS2 humble安装-chatgpt版本

如果按照chatgpt版本可能不合适。请一定要参考官网。ROS (Robot Operating System) 是一个开源的机器人操作系统&#xff0c;提供了一系列软件库和工具&#xff0c;用于构建机器人应用程序。以下是在 Ubuntu 系统中安装 ROS Humble 的详细步骤和方法&#xff1a;首先&#xff0…

网络安全入门必备:渗透常用命令速查手册

系统信息 arch #显示机器的处理器架构(1) uname -m #显示机器的处理器架构(2) uname -r #显示正在使用的内核版本 dmidecode -q #显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda #罗列一个磁盘的架构特性 hdparm -tT /dev/sda #在磁盘…

CMake系列:正确使用多配置编译系统

目录 常见错误 问题现象 正确做法 if指令应该什么时候使用 活学活用 把IF指令用于多配置编译系统是很多初学者容易犯下的错误。这篇文章启示性的教你如何正确理解、使用CMake的多配置编译系统。 常见错误 以Debug和Release配置有不同的宏定义为例&#xff0c;如下所示&a…

大数据选股智能推荐系统V1.0-1

很长时间没有发布博客了&#xff0c;这段时间个人确实有点忙。另外一方面在这段时间我也没有闲着。自己研发了一套大数据选股的智能推荐系统。废话不说&#xff0c;我们先来看这套系统&#xff1a;登录页面&#xff1a;&#xff08;技术点&#xff1a;验证码的生成&#xff09;…

webrtc QOS笔记一 Neteq直方图算法浅读

webrtc QOS笔记一 Neteq直方图算法浅读 文章目录webrtc QOS笔记一 Neteq直方图算法浅读Histogram Algorithm获取目标延迟遗忘因子曲线Histogram Algorithm DelayManager::Update()->Histogram::Add() 会根据计算的iat_packet(inter arrival times, 实际包间间隔 / 打包时长…

基于SpringBoot的在线课程管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…

哈尔滨工业大学2020届面向服务复习笔记

目录 一、面向服务架构SOA 1.SOA概念 SOA所解决的问题 SOA的特性 SOA的特征 SOA组成要素 2.SOA服务设计原则 3.SOA协作模式 4.SOMA开发方法 SOMA生命周期 敏捷开发 服务外包与众包 5.ESB原理与机制 ESB解决的问题 ESB的功能 ESB关键技术 ESB的优势 6.服务组…

【Opencv--形态学操作】膨胀、腐蚀、开/闭操作:cv2.morphologyEx、cv2.erode、cv2.dilate

【Opencv–形态学操作】膨胀、腐蚀、开/闭操作 文章目录【Opencv--形态学操作】膨胀、腐蚀、开/闭操作1. 介绍2. 形态学操作2.1 腐蚀和膨胀2.1.1 腐蚀2.1.2 膨胀2.1.3 代码示例2.2 开/闭操作2.2.1 开操作2.2.2 闭操作2.2.3 代码示例2.3 礼帽和黑帽2.3.1 礼帽运算2.3.2 黑帽运算…

恭喜! SelectDB 五位开发者成为 Apache Doris 新晋 PMC 成员和 Committer!

近期&#xff0c;通过 Apache Doris 项目管理委员会的推荐与投票&#xff0c;Apache Doris 社区正式迎来了 2 位新晋 PMC 成员 和 8 位新晋 Committer 的加入。值得关注的是&#xff0c;2 位新晋 PMC 成员均来自 SelectDB&#xff0c;分别是衣国垒&#xff08;yiguolei&#xf…

【蓝桥杯集训4】双指针专题(6 / 6)

目录 3768. 字符串删减 - 滑动窗口ac 799. 最长连续不重复子序列 - 滑动窗口 800. 数组元素的目标和 - 二分ac 2816. 判断子序列 - 双指针 1238. 日志统计 - 滑动窗口 1240. 完全二叉树的权值 - 双指针 1、前缀和 - 通过了 5/12个数据 2、双指针 3768. 字符串删减 -…