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

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 (十八)、首页点赞高亮显示的功能实现【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/135725.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!