(十八)、首页点赞高亮显示的功能实现【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

2023/11/30 7:11:20

1,首页点赞高亮显示的逻辑

思路:首先,查询所有在首页index页面中展示的文章id,存为一个id数组;然后利用dbcloud command命令和文章id数组,统一查询文章点赞表;其中加上两个筛选条件(1,点赞表中的文章id如果存在于文章id数组中,2,点赞表中的用户id为当前登录用户id)。

1.1,首页中引入如下代码:
<script>
  import {
    store,
    mutations
  } from '@/uni_modules/uni-id-pages/common/store.js'
  const db = uniCloud.database();
  const dbCmd = db.command;
  
...其他代码省略
1.2 修改获取数据方法:
//获取首页列表数据
      getData() {
        let artTemp = db.collection("quanzi_articles").where(`delState != true`).field(
          "title,user_id,description,picurls,comment_count,like_count,view_count,publish_date").getTemp();
        let userTemp = db.collection("uni-id-users").field("_id,username,nickname,avatar_file").getTemp();
        db.collection(artTemp, userTemp).orderBy(this.navlist[this.navAction].type, "desc").get()
          .then(async res => {
            // console.log(res)
            let idArr = []
            let resDataArr = res.result.data

            if (store.hasLogin) {
              resDataArr.forEach(item => {
                idArr.push(item._id);
              })

              let likeRes = await db.collection("quanzi_like").where({
                article_id: dbCmd.in(idArr),
                user_id: uniCloud.getCurrentUserInfo().uid
              }).get()

              console.log(likeRes)
            }

            this.dataList = resDataArr
            // 骨架屏消失
            this.loadState = false
          })
      },

输出结果:
在这里插入图片描述

2,数组比对查询出点赞的列表进行高亮显示

2.1,点赞表中的文章id 与 文章表联表用户表中的文章id,两个结果数组做对比,找出文章表中点过赞的索引。
              likeRes.result.data.forEach(item => {
                let findIndex = resDataArr.findIndex(find => {
                  return item.article_id == find._id
                })
                console.log(findIndex)
                resDataArr[findIndex].isLike = true
              })
2.2,点过赞的索引输出:

在这里插入图片描述

2.3,在blog-item页面中添加如下代码:
 :class="item.isLike ? 'active' : ''"
      <!-- 点赞量 -->
      <view class="box" :class="item.isLike ? 'active' : ''" @click="goDetail">
        <text class="iconfont icon-a-106-xihuan"></text>
        <text>{{item.like_count ? item.like_count : '点赞'}}</text>
      </view>
2.4,效果:

在这里插入图片描述

3,实现无感点赞功能

3.1,blog-item页面中点赞盒子中加上点赞样式

添加点赞方法clickLike:

      <!-- 点赞量 -->
      <view class="box" :class="item.isLike ? 'active' : ''" @click="clickLike">
        <text class="iconfont icon-a-106-xihuan"></text>
        <text>{{item.like_count ? item.like_count : '点赞'}}</text>
      </view>
3.2,引入pagejson、store和tools公共类方法:
  import pageJson from "@/pages.json"
  import {
    giveName,
    giveAvatar,
    likeFun
  } from "../../utils/tools.js"
  import {
    store
  } from '@/uni_modules/uni-id-pages/common/store.js'
3.3,添加点赞方法:
      //点赞操作
      clickLike() {
        if (!store.hasLogin) {
          uni.showModal({
            title: "登录后才可进行后续操作",
            success: res => {
              if (res.confirm) {
                uni.navigateTo({
                  url: "/" + pageJson.uniIdRouter.loginPage
                })
              }
            }
          })
          return;
        }

        let time = Date.now();
        if (time - this.likeTime < 2000) {
          uni.showToast({
            title: "操作太频繁,请稍后...",
            icon: "none"
          })
          return;
        }
        this.likeTime = time;

        let like_count = this.item.like_count;
        this.item.isLike ? like_count-- : like_count++
        //this.item.isLike = !this.item.isLike;
        let isLike = !this.item.isLike;

        this.$emit("update:isLike", isLike)
        this.$emit("update:like_count", like_count)

        likeFun(this.item._id);

      },
      //单击图片
      clickPic(index) {
        uni.previewImage({
          urls: this.item.picurls,
          current: index
        })
      },

在index页面中修改代码如下:

    <!-- 公共组件 博客内容 -->
    <view class="content">
      <view class="item" v-for="item in dataList">
        <blog-item @delEvent="P_delEvent" :item="item" :isLike.sync="item.isLike" :like_count.sync="item.like_count">
        </blog-item>
      </view>
    </view>

http://www.jnnr.cn/a/299654.html

相关文章

ArcGIS批量拼接大量栅格遥感影像:Mosaic工具

本文介绍在ArcGIS下属的ArcMap软件中&#xff0c;基于Mosaic工具&#xff0c;批量对大量栅格遥感影像文件加以拼接、镶嵌的方法。 在GIS应用中&#xff0c;我们时常需要对大量栅格遥感影像数据加以批量拼接的工作。这一步骤可以基于Python语言实现&#xff0c;具体可以参考文章…

产品新说 | 指标异常?怎么做能更好配合业务变化(一)

​ 背景&#xff1a; 企业业务运营的平稳&#xff0c;常常要依靠智能运维在后方保驾护航。熟悉运维的肯定都知道&#xff0c;在智能运维中有一环是通过监控指标来判断系统、云、业务应用、网络设备等运行的是否健康&#xff0c;以便及时排障维稳后台。在指标异常检测中&#xf…

小林coding

一、图解网络 问大家&#xff0c;为什么要有TCP/Ip网络模型&#xff1f; 对于同一台设备上的进程通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;对于不同设备上的进程通信&#xff0c;就需要有网络通信&#xff0c;而设备是…

LVGL Styles

LVGL StylesGet started按钮添加标签按钮添加风格滑动条值显示StylesSize stylesBackground stylesBorder stylesOutline stylesShadow stylesImage stylesArc stylesText stylesLine stylesGet started 按钮添加标签 /*** brief 按钮事件回调函数* param e */ void btn_eve…

模拟用户登录-课后程序(JAVA基础案例教程-黑马程序员编著-第五章-课后作业)

【案例5-3】 模拟用户登录 【案例介绍】 1.任务描述 在使用一些APP时&#xff0c;通常都需要填写用户名和密码。用户名和密码输入都正确才会登录成功&#xff0c;否则会提示用户名或密码错误。 本例要求编写一个程序&#xff0c;模拟用户登录。程序要求如下&#xff1a; 用…

SpringBoot整合Dubbo和Zookeeper

安装Zookeeper 下载地址&#xff1a;https://zookeeper.apache.org/releases.html#download 解压&#xff0c;然后运行bin目录里的zkService.cmd 将conf文件夹的zoo_sample.cfg复制一份改名为zoo.cfg 修改zoo.cfg配置&#xff0c;dataDir临时数据存储的位置&#xff0c;client…

TypeScript 学习笔记

最近在学 ts 顺便记录一下自己的学习进度&#xff0c;以及一些知识点的记录&#xff0c;可能不会太详细&#xff0c;主要是用来巩固和复习的&#xff0c;会持续更新 前言 想法 首先我自己想说一下自己在学ts之前&#xff0c;对ts的一个想法和印象&#xff0c;在我学习之前&a…

UL grant的分配(LCP)

欢迎关注同名微信公众号“modem协议笔记”。 UE有UL data时&#xff0c;会发送BSR的告知网络侧自己详细的请求&#xff0c;期望网络能够如期下发UL grant&#xff0c;正常情况下网络侧会给UE足够的UL grant去发送UL data&#xff0c;整个过程都会比较顺利。UE收到UL grant后&a…

新C++(9):谈谈,翻转那些事儿

"相信羁绊&#xff0c;相信微光&#xff0c;相信一切无常。"一、AVL树翻转那些事儿(1)什么是AVL树&#xff1f;在计算机科学中&#xff0c;AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1&#xff0c;所以它也被称为高度平衡树。…

PX4之代码结构

PX4开源飞控是目前主流的开源飞控项目&#xff0c;被很多公司作为飞控开发的参考。也广泛被用于现在流行的evtol验证机的飞控&#xff0c;进行初步的飞行验证。可能大多数AAM以及UAM都离不开PX4。 项目代码可以从github下载 $ git clone --recursive GitHub - PX4/PX4-Autopil…

Fortinet推出新一代自研安全芯片,跨所有网络边缘加速网络与安全融合

专注网络与安全融合的全球网络安全领导者 Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;&#xff0c;近日宣布推出新一代自研安全芯片 FortiSP5&#xff0c;作为 Fortinet ASIC 技术的最新突破&#xff0c;有力推动了分布式网络边缘安全的重大飞跃。FortiSP5 源自 F…

【编程入门】应用市场(uni-app版)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目&#xff0c;使…

Vscode创建vue项目的详细步骤

目录 一、概述 操作的前提 二、操作步骤 一、概述 后端人员想在IDEA里面创建一个Vue的项目&#xff0c;但是这非常麻烦&#xff0c;用vscode这个前端专用软件创建就会非常快速。 操作的前提 1.安装vscode软件的步骤&#xff1a;vscode下载和安装教程和配置中文插件&#…

掌握MySQL分库分表(六)解决主键重复问题--Snowflake雪花算法

文章目录问题及需求常用ID解决方案数据库自增IDUUIDRedis发号器Snowflake雪花算法分布式 ID 生成算法Snowflake原理关于bit与byte雪花算法的位数Snowflake必须注意的地方全局唯⼀、不能重复保证各个系统时间一致Snowflake雪花算法实现雪花算法测试结果问题及需求 单库下⼀般使…

I.MX6ULL_Linux_系统篇(17) uboot分析-启动linux

bootz 启动 Linux 内核 images 全局变量 不管是 bootz 还是 bootm 命令&#xff0c;在启动 Linux 内核的时候都会用到一个重要的全局变量&#xff1a;images&#xff0c; images 在文件 cmd/bootm.c 中有如下定义&#xff1a; images 是 bootm_headers_t 类型的全局变量&…

最全es6数组方法

1.arr.push()从后面添加元素,返回值为添加完后的数组的长度 let arr [1,2,3,4,5] console.log(arr.push(5)) // 6 console.log(arr) // [1,2,3,4,5,5]2.arr.pop()从后面删除元素,只能是一个&#xff0c;返回值是删除的元素 let arr [1,2,3,4,5] console.log(arr.pop())//5 …

鼠标指针文件格式解析

鼠标指针文件格式解析 文章目录鼠标指针文件格式解析windowsico文件格式分析文件头&#xff1a;图像数据头段&#xff1a;图像数据段&#xff1a;Ani动态光标格式解析数据结构&#xff1a;anihseq **rate**LISTcur静态光标文件格式解析macOSLinuxwindows ico文件格式分析 是一…

信号量(上)

竞争是协作的特例&#xff0c;竞争关系是属于协作关系 信号量可以解决协作关系存在的问题&#xff0c;那么它也可以解决竞争关系存在的问题 信号量 信号量就是一个整数 先等待&#xff0c;然后再发送信号 p在荷兰语中代表测试 v在荷兰语代表增加 这个函数的执行流需要自己画&a…

弄懂 Websocket 你得知道的这 3 点

1. WebSocket原理 WebSocket同HTTP一样也是应用层的协议&#xff0c;但是它是一种双向通信协议&#xff0c;是建立在TCP之上的。 WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket API也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简…

网络编程之IP 地址的介绍

IP 地址的介绍学习目标能够说出IP 地址的作用1. IP 地址的概念IP 地址就是标识网络中设备的一个地址&#xff0c;好比现实生活中的家庭地址。网络中的设备效果图:2. IP 地址的表现形式说明:IP 地址分为两类&#xff1a; IPv4 和 IPv6IPv4 是目前使用的ip地址IPv6 是未来使用的i…
最新文章