(七)、首页列表数据渲染【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

news2024/11/18 12:18:28

1,获取首页列表数据

1.1在index页面中编写从数据库中获取首页列表数据的方法

      //获取首页列表数据
      getData() {
        let artTemp = db.collection("quanzi_articles").getTemp();
        let userTemp = db.collection("uni-id-users").field("_id,username,nickname,avatar_file").getTemp();
        db.collection(artTemp, userTemp).get()
          .then(res => {
            console.log(res)
            this.dataList = res.result.data
          })
      },

在onload中调用

    onLoad() {
      this.getData()
    },

控制台打印输出数据如下:
在这里插入图片描述

1.2过滤一下不需要的字段

        let artTemp = db.collection("quanzi_articles").field("title,user_id,description,picurls,comment_count,like_count,view_count,publish_date").getTemp();

1.3子组件渲染数据

父组件中的自定义子组件属性item

index.vue中

<blog-item :item = item></blog-item>

子组件blog-item.vue中
定义props来接收父组件传过来的值

 props: {
      item: {
        type: Object,
        default () {
          return {}
        }
      }
    },

1.4在…/…/utils/tools.js中封装一下两个方法 giveName和giveAvatar

//获取昵称
export function giveName(item) {
  return item.user_id[0].nickname || item.user_id[0].username || item.user_id[0].mobile || "请设置昵称"
}

//获取默认头像
export function giveAvatar(item) {
  return item.user_id[0]?.avatar_file?.url ?? '../../static/images/user-default.jpg'
}

1.5子组件blog-item完整代码

注:若在组件中引入tools.js中的方法,除了import,还需要在methods中调用一下方法才能生效。

<template>
  <view class="blogitem">
    <!-- 头部用户信息 -->
    <view class="head">
      <view class="userinfo">
        <!-- 右边头像 -->
        <view class="avatar">
          <image :src="giveAvatar(item)" mode="aspectFill"></image>
        </view>
        <!-- 右边用户名称 -->
        <view class="name">
          {{giveName(item)}}
        </view>
        <!-- 右边时间  定制格式化 -->
        <view class="time">
          <uni-dateformat :date="item.publish_date" format="MM月dd hh:mm" :threshold="[60000,3600000*24*30]">
          </uni-dateformat>
        </view>
      </view>
      <!-- 左边 三个点  更多 -->
      <view class="more" @click="clickMore">
        <text class="iconfont icon-ellipsis"></text>
      </view>
    </view>
    <!-- 中间内容 -->
    <view class="body">
      <!-- 上 标题 -->
      <view class="title">{{item.title}}</view>
      <!-- 中 内容 -->
      <view class="text">
        <view class="t">{{item.description}}</view>
      </view>
      <!-- 下 缩略图 -->
      <view class="piclist">
        <view class="pic" :class="picArr.length==1 ? 'only': ''" v-for="(pic,index) in item.picurls" :key="index">
          <image :src="pic" mode="aspectFill"></image>
        </view>
      </view>
    </view>
    <!-- 底部 信息内容 -->
    <view class="info">
      <!-- 游览量 -->
      <view class="box">
        <text class="iconfont icon-a-27-liulan"></text> <text>{{item.view_count}}</text>
      </view>
      <!-- 评论数 -->
      <view class="box">
        <text class="iconfont icon-a-5-xinxi"></text>
        <text>{{item.comment_count && item.comment_count>0 ? item.comment_count : '评论'}}</text>
      </view>
      <!-- 点赞量 -->
      <view class="box">
        <text class="iconfont icon-a-106-xihuan"></text>
        <text>{{item.like_count ? item.like_count : '点赞'}}</text>
      </view>
    </view>
  </view>
</template>

<script>
  import {
    giveName,
    giveAvatar,
    likeFun
  } from "../../utils/tools.js"
  export default {
    name: "blog-item",
    props: {
      item: {
        type: Object,
        default () {
          return {}
        }
      }
    },
    data() {
      return {
        picArr: [1, 2, 3]
      };
    },
    onLoad() {

    },
    methods: {
      giveName,
      giveAvatar,
    }

  }
</script>

<style lang="scss">
  .blogitem {
    .head {
      display: flex;
      font-size: 32rpx;
      align-items: center;
      justify-content: space-between;

      .userinfo {
        display: flex;
        align-items: center;

        .avatar {
          width: 40rpx;
          height: 40rpx;
          border-radius: 50%;
          border-radius: 50%;
          overflow: hidden;

          image {
            width: 100%;
            height: 100%;
            display: block;
          }
        }

        .name {
          color: #222;
          padding-left: 10rpx;
        }

        .time {
          color: #888;
          font-size: 22rpx;
          padding-left: 20rpx;
        }
      }

      .more {
        padding: 5rpx;

        .iconfont {
          font-size: 50rpx;
          color: #888;
        }
      }
    }

    .body {
      padding: 15rpx 0 30rpx;

      .title {
        font-size: 44rpx;
        color: #000;
        font-weight: 600;
        text-align: justify;
        text-overflow: -o-ellipsis-lastline;
        overflow: hidden;
        text-overflow: ellipsis;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        line-clamp: 2;
        -webkit-box-orient: vertical;
      }

      .text {
        padding-top: 10rpx;
        padding-bottom: 10rpx;
        font-size: 30rpx;
        text-align: justify;
        color: #888;

        .t {
          text-overflow: -o-ellipsis-lastline;
          overflow: hidden;
          text-overflow: ellipsis;
          display: -webkit-box;
          -webkit-line-clamp: 2;
          line-clamp: 2;
          -webkit-box-orient: vertical;
        }
      }

      .piclist {
        display: flex;
        padding-top: 20rpx;

        .pic {
          width: 225rpx;
          height: 225rpx;
          margin-right: 6rpx;
          overflow: hidden;

          image {
            width: 100%;
            height: 100%;
          }

          &:first-child {
            border-radius: 20rpx 0 0 20rpx;
          }

          &:last-child {
            border-radius: 0 20rpx 20rpx 0;
          }

          &.only {
            border-radius: 20rpx;
          }
        }
      }
    }

    .info {
      display: flex;
      align-items: center;
      justify-content: space-around;
      font-size: 26rpx;
      color: #333;

      .box {
        display: flex;
        align-items: center;
        padding: 15rpx 0 5rpx;
        flex: 1;
        display: flex;
        justify-content: center;

        .iconfont {
          font-size: 40rpx;
          padding-right: 10rpx;
        }
      }

      .box.active {
        color: #0199FE
      }
    }
  }
</style>

2,缩略图游览priewimage和导航筛选

2.1子组件blog-item的image标签中添加点击事件

 <image  @click="clickPic(index)" :src="pic" mode="aspectFill"></image>

clickPic方法

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

效果:
在这里插入图片描述

2.1导航标签

首先在index.vue中定义两个值

        navAction: 0,
        navlist: [{
            name: "最新",
            type: "publish_date"
          },
          {
            name: "热门",
            type: "view_count",
            badge: {
              isDot: true
            }
          }
        ],

修改getdata方法

      //获取首页列表数据
      getData() {
        let artTemp = db.collection("quanzi_articles").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(res => {
            console.log(res)
            this.dataList = res.result.data
            // 骨架屏消失
            this.loadState = false
          })
      },

修改点击tab的方法

      //切换导航标签
      clickNav(e) {
        console.log(e)
        this.navAction = e.index
        this.getData()
      },

最新是按照发布日期排序显示,热门是按照阅读量排序显示。

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

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

相关文章

智慧校园人脸识别系统源码

智慧校园人脸识别系统源码 技术架构&#xff1a; 后端&#xff1a;Java 框架&#xff1a;springboot 前端页面&#xff1a;vue element-ui 小程序&#xff1a;小程序原生开发 电子班牌&#xff1a;Java Android 源码有演示&#xff0c;可正常上线运营可授权。 随着智慧校…

在成都的哪个培训机构学习Java好呢?

自从小课06年进入成都这个IT培训市场以来&#xff0c;短短十几年&#xff0c;招过很多学员&#xff0c;也见证过很多机构的起起落落。心中有万分的感慨&#xff0c;总结下来有这几点分享给大家&#xff0c;在选择培训机构时能看清本质&#xff0c;找到适合自己靠谱的机构学Java…

Go大道至简之抓取网页

目录前期准备环境教程浏览器启动命令启动Rod启动浏览器Rod自动查找浏览器路径并启动输入和点击、Enter动作多页面抓取前期准备 环境 Go版本大于等于1.18Go模块源更换&#xff0c;加速模块下载go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,directRod模块 Rod…

4年经验来面试20K的测试岗,连基础都不会,还不如招应届生。

公司前段时间缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。 看简历很多都是3、4年工作经验&#xf…

chatGPT做了这么一道数学题,我陷入了沉思

已知 2cos23cosasina−3sin2a1,并且a∈(−32π,−π)2cos^{2}3cosasina-3sin^{2}a1 ,并且a\in(-\frac{3}{2}\pi,-\pi) 2cos23cosasina−3sin2a1,并且a∈(−23​π,−π) 求 2sin(π−a)−3sin(π2a))4sina−9cosa\frac{2sin(\pi-a)-3sin(\frac{\pi}{2}a))}{4sina-9cosa} 4sina−…

Sage X3 ERP的称重插件帮助食品和化工企业实现精细化管理

目录 需要称重插件管理的行业客户 Sage X3 ERP称重插件管理的两个关键单位 Sage X3 ERP称重插件的特色 Sage X3 ERP称重插件管理的重要性 需要称重插件管理的行业客户 术语“实际重量”表示在销售和运输时捕获的物品重量。生产销售家禽、肥料、钢材或任何其他需要跟踪实…

【Spark分布式内存计算框架——Spark SQL】4. DataFrame(上)

3.1 DataFrame是什么 在Spark中&#xff0c;DataFrame是一种以RDD为基础的分布式数据集&#xff0c;类似于传统数据库中的二维表格。DataFrame与RDD的主要区别在于&#xff0c;前者带有schema元信息&#xff0c;即DataFrame所表示的二维表数据集的每一列都带有名称和类型。 使…

chatGPT 配合excel /maxscript使用_初试

EXCEL 配合chatGPT方法一&#xff1a;利用excel的開發工具1打開excel的VB编辑器&#xff1a;如果頂部菜單上沒有看到開發工具&#xff0c;需要先按下面步驟打開開發工具&#xff1a;這樣按上面步驟就可以打開excel的開發工具~ 然後點擊VB~ 2让chatGPT帮忙写脚本在chatGPT上提问…

Tomcat是如何隔离Web应用的

Tomcat通过自定义的类加载器WebAppClassLoader打破了双亲委托机制&#xff0c;目的就是为了优化加载Web应用目录下的类。Tomcat 作为 Servlet 容器&#xff0c;它负责加载我们Servlet 类&#xff0c;此外它还负责加载 Servlet 所依赖的 JAR 包。并且Tomcat 本身也是也是一个 Ja…

petalinux 2020.2 离线编译

链接&#xff1a;[https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools.html] 2、在ubuntu下安装必要运行库。 1、sudo apt-get install iproute2 gawk python3 python 2、sudo apt-get install build-essential gcc gi…

第七届蓝桥杯省赛——8冰雹数(递归)

题目&#xff1a;任意给定一个正整数N&#xff0c;如果是偶数&#xff0c;执行&#xff1a; N / 2如果是奇数&#xff0c;执行&#xff1a; N * 3 1生成的新的数字再执行同样的动作&#xff0c;循环往复。通过观察发现&#xff0c;这个数字会一会儿上升到很高&#xff0c;一会…

海外问卷调查怎么做?手把手教会你如何薅老外的羊毛

问卷调查相信大家都不陌生。许多组织在推出新项目或新产品之前&#xff0c;会对全社会进行问卷调查&#xff0c;调查消费者或受众对产品的期望和价格的接受范围。东哥今天给大家介绍的就是海外问卷调查项目&#xff0c;外国人的羊毛&#xff0c;带你们薅定了&#xff01;参与海…

基于ArgoCD实现k8s环境下的持续部署

什么是 argo CD Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. Argo CD是一个基于Kubernetes的声明式的GitOps工具。 这里我们引入了一个新的概念&#xff0c; 什么是GitOps GitOps是以Git为基础&#xff0c;使用CI/CD来更新运行在云原生环境…

电脑资料如何转移到新电脑?教你3种数据迁移技巧

当下&#xff0c;电脑越来越普及&#xff0c;更换频率也越来越高。当我们购买新电脑&#xff0c;需要将旧电脑上的文件资料迁移到新电脑上&#xff0c;方便使用&#xff0c;电脑资料如何转移到新电脑&#xff1f;其实我们完全可以自己解决哦&#xff0c;下面一起来看下电脑资料…

VMware 修复了三个身份认证绕过漏洞

Bleeping Computer 网站披露&#xff0c;VMware 近期发布了安全更新&#xff0c;以解决 Workspace ONE Assist 解决方案中的三个严重漏洞&#xff0c;分别追踪为 CVE-2022-31685&#xff08;认证绕过&#xff09;、CVE-2022-31686 &#xff08;认证方法失败&#xff09;和 CVE-…

python应用之小麦生育期气象因子计算——基于pandas库

背景 本次介绍一下python的pandas包操作Excel&#xff08;或者CSV等&#xff09;&#xff0c;应用情景是计算不同站点小麦多年生育期内的气象因子的特征&#xff08;积温、降雨、辐射等&#xff09; 主要涉及以下知识点&#xff1a; 儒略日转换数据框值获取与字符串加法基于que…

.md文件转.pdf文件

一、安装VS code vscode是一个轻量级的、可扩展性十分强的开发编辑器。过程略&#xff0c;比较简单。 二、安装插件Markdown PDF 直接 install 就可以了。 我这里出现了安装失败的情景&#xff0c;这时候可以通过它给的提示&#xff0c;安转markdown-pdf 的 .vsix 文件&#…

数据分析与SAS学习笔记2

SAS在企业使用的情况&#xff1a; SAS是一个很昂贵的商业软件。在企业中使用SAS比较多&#xff0c;在企业界中是比较流行&#xff0c;在学术界使用R比较多。 SAS简介&#xff1a;统计分析系统 处理生物分析数据。 SAS成为统计领域的国际标准软件&#xff0c;服务全球50000多家…

顶象业务安全大讲堂全新升级,挖洞大神喊你来get 挖洞秘籍啦!

CSDN直播间&#xff1a; 红队外网打点与情报收集策略——「业务安全大讲堂第二季第1期」https://live.csdn.net/room/dingxiangtech/rBN4xrOp 顶象业务安全大讲堂第二季将于2月23日重磅回归&#xff0c;本季业务安全大讲堂继续以业务安全为主题&#xff0c;为大家带来业务安全…

网络渗透之信息搜集

网络渗透之信息搜集一、信息搜集1.1 概念1.2 分类1.3 收集那些信息二、域名信息收集2.1 域名介绍2.2 域名分类2.3 域名信息查询- whois2.3.1 whois2.3.2 whois查询2.3.3 whois查询方法2.4 域名信息收集-备案信息三、子域名信息收集四、IP地址信息收集4.1 IP反查域名4.2 域名查询…