| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411 |
- <template>
- <view class="follow">
- <mescroll-uni ref="mescrollRef" top="0" :height="height" @init="initMescroll" @down="downCallback"
- @up="upCallback" :down="downOption" :up="upOption">
- <block v-for="(item, index) in lists" :key="index">
- <view class="content-box">
- <!-- 内容头部信息 -->
- <router-link :to="'/bundle_b/pages/community_user/community_user?id=' + item.user.id">
- <view class="header flex row-between">
- <view class="flex">
- <!-- 头像 -->
- <u-image width="70" height="70" :src="item.user.avatar" borderRadius="50%"></u-image>
- <!-- 昵称 -->
- <text class="normal bold m-l-16">{{ item.user.nickname }}</text>
- </view>
- <view>
- <text class="muted">{{ item.create_time }}</text>
- </view>
- </view>
- </router-link>
- <!-- 内容媒体信息 -->
- <view class="swiper-container">
- <product-swiper :imgUrls="item.images" :autoplay="false" borderRadius="14"></product-swiper>
- </view>
- <!-- 提到的宝贝( 商品 ) -->
- <view class="goods-box bb flex row-between" @click="handleOpenGoods(item.id)"
- v-if="item.goods_data.length">
- <text class="nr lighter">查看TA提到的宝贝({{item.goods_data.length}})</text>
- <!-- <text class="tips xs">300+人评价</text> -->
- <view class="goods flex">
- <block v-for="(goodsItem, goodsIndex) in item.goods_data" :key="goodsItem.id">
- <u-image v-if="goodsIndex <= 2" :src="goodsItem.image" width="58" height="58"
- class="m-l-6"></u-image>
- </block>
- <u-icon name="arrow-right" class="m-l-10"></u-icon>
- </view>
- </view>
- <!-- 提到的店铺( 店铺 ) -->
- <view class="goods-box bb flex row-between" @click="handleOpenShop(item.id)"
- v-if="item.shop_data.length">
- <text class="nr lighter">查看TA提到的店铺({{item.shop_data.length}})</text>
- <!-- <text class="tips xs">300+人评价</text> -->
- <view class="goods flex">
- <block v-for="(shopItem, shopIndex) in item.shop_data" :key="shopIndex">
- <u-image v-if="shopIndex <= 2" :src="shopItem.logo" width="58" height="58"
- class="m-l-6"></u-image>
- </block>
- <u-icon name="arrow-right" class="m-l-10"></u-icon>
- </view>
- </view>
- <!-- 内容文字 -->
- <view class="content ">
- <view class="text" v-if="item.show">
- {{ item.beforeContent }}...
- <text class="primary nr m-l-20" @click="handleShowContent(index)">展开</text>
- </view>
- <view class="text" v-else>
- {{ item.content }}
- </view>
- <view class="tags" v-if="item.topic">
- <navigator hover-class="none"
- :url="'/bundle_b/pages/community_topic/community_topic?id=' + item.topic.id +'&name=' + item.topic.name">
- <text class="sm"># {{ item.topic.name }}</text>
- </navigator>
- </view>
- </view>
- <!-- 底部 -->
- <view class="footer flex row-between">
- <view>
- <button open-type="share" @click="handleShare(item)" class="flex-col col--center"
- hover-class="none">
- <image src="/static/images/icon_forward.png"></image>
- </button>
- </view>
- <view class="flex nr lighter">
- <view class="flex likes-box">
- <view class="likes" :class="item.is_like==0 ? 'leave':'entry'"
- @click="handleCommunityLike(item.is_like, item)">
- </view>
- <image class="m-l-30"></image>
- <text>{{ item.like }}</text>
- </view>
- <view class=" m-l-40" @click="handleOpenComment(item.id)">
- <image src="/static/images/icon_evaluate.png"></image>
- <text>{{ item.comment }}</text>
- </view>
- </view>
- </view>
- </view>
- </block>
- </mescroll-uni>
- <!-- 提到的商品 -->
- <community-goods v-model="showGoodsPopup" v-if="showGoodsPopup" :communityId="communityId"></community-goods>
- <!-- 提到的店铺 -->
- <community-shop v-model="showShopPopup" :communityId="communityId"></community-shop>
- <!-- 评论 -->
- <community-comment-popup v-model="showComment" v-if="showComment" :communityId="communityId">
- </community-comment-popup>
- <!-- #ifdef H5 -->
- <u-popup :custom-style="{'background': 'none'}" class="share-tips" v-model="showTips" mode="top">
- <view style="overflow: hidden;">
- <image src="/static/images/share_arrow.png" class="share-arrow" />
- <view class="white" style="text-align: center;margin-top: 280rpx;">
- <view class="bold lg">立即分享给好友吧</view>
- <view class="sm m-t-10">点击屏幕右上角将本页面分享给好友</view>
- </view>
- </view>
- </u-popup>
- <!-- #endif -->
- </view>
- </template>
- <script>
- import {
- getCommunityFollow,
- apiCommunityCommentLike
- } from '@/api/community.js';
- import {
- debounce
- } from "@/utils/tools.js"
- import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
- import MescrollMoreItemMixin from "@/components/mescroll-uni/mixins/mescroll-more-item.js";
- export default {
- mixins: [MescrollMixin, MescrollMoreItemMixin],
- props: {
- active: {
- type: Number
- }
- },
- data() {
- return {
- height: '',
- canReset: true,
- isLikes: false,
- communityId: '',
- upOption: {
- empty: {
- icon: '/static/images/follow_null.png',
- tip: '暂未关注任何种草官哦~', // 提示
- fixed: true,
- top: "200rpx",
- }
- },
- lists: [],
- show: false,
- showGoodsPopup: false,
- showShopPopup: false,
- showTips: false,
- showComment: false
- }
- },
- watch: {
- active() {
- uni.$emit('hasNew', 0)
- this.mescroll.resetUpScroll()
- }
- },
- created() {
- this.handleCommunityLike = debounce(this.handleCommunityLike, 100)
- uni.getSystemInfo({
- success: (res) => {
- this.height = res.windowHeight - 46 + 'px';
- }
- });
- },
- methods: {
- initMescroll(event) {
- this.isInit = true; // 标记为true
- this.mescroll = event;
- },
- // 获取
- async upCallback(page) {
- const index = this.current;
- const pageNum = page.num
- const pageSize = page.size
- getCommunityFollow({
- page_no: pageNum,
- page_size: pageSize,
- }).then(res => {
- // 如果是第一页需手动置空列表
- if (pageNum == 1) this.lists = []
- // 重置列表数据
- const hasNext = !!res.data.more;
- res.data.list = this.handleContent(res.data.list)
- this.lists = [...this.lists, ...res.data.list]
- this.mescroll.endSuccess(res.data.list.length, hasNext);
- }).catch((err) => {
- this.mescroll.endErr()
- })
- },
- // 处理打开商品推荐
- handleOpenGoods(id) {
- this.communityId = id;
- this.showGoodsPopup = true;
- },
- // 处理打开获取店铺推荐
- handleOpenShop(id) {
- this.communityId = id;
- this.showShopPopup = true;
- },
- // 处理内容超过固定长度或换行的就显示展开
- handleContent(list) {
- return list.filter(item => {
- if (item.content.indexOf('\n') > -1) {
- const arr = item.content.split('\n')
- if (arr.length >= 3) {
- item.show = true
- if (arr[0].length >= 25 || arr[1].length >= 25 || arr[2].length > 20) {
- item.beforeContent = item.content.slice(0, arr[0].length + arr[1].length + arr[2].length - 10)
- } else {
- item.beforeContent = item.content.slice(0, arr[0].length + arr[1].length + arr[
- 2].length - 10)
- }
- } else {
- if (item.content.length >= 70) {
- item.show = true
- item.beforeContent = item.content.slice(0, 70)
- }
- }
- } else {
- if (item.content.length >= 70) {
- item.show = true
- item.beforeContent = item.content.slice(0, 70)
- }
- }
- return true
- })
- },
- // 展开内容
- handleShowContent(index) {
- this.$set(this.lists[index], 'show', false)
- },
- // 处理分享
- handleShare(item) {
- // #ifdef MP
- this.$emit('share', item)
- // #endif
- // #ifdef H5
- this.showTips = true
- // #endif
- // #ifndef MP
- this.$store.commit('setCommunity', {
- ...item,
- url: 'bundle_b/pages/community_detail/community_detail'
- })
- this.$store.dispatch('communityShare')
- // #endif
- },
- // 点赞
- handleCommunityLike(status, item) {
- switch (status) {
- case 0:
- this.$set(item, 'like', item.like + 1)
- this.$set(item, 'is_like', 1)
- break;
- case 1:
- this.$set(item, 'like', item.like - 1)
- this.$set(item, 'is_like', 0)
- break;
- }
- apiCommunityCommentLike({
- id: item.id,
- status: status ? 0 : 1,
- type: 1
- }).then(res => {
- if (res.code === 1) {
- // 点赞文章时 其他页面的状态也需要更改
- uni.$emit('changeItem', {
- like: item.like,
- is_like: item.is_like,
- id: item.id
- })
- } else {
- // 不成功把它们改回去
- switch (status) {
- case 0:
- this.$set(item, 'like', item.like - 1)
- this.$set(item, 'is_like', 0)
- break;
- case 1:
- this.$set(item, 'like', item.like + 1)
- this.$set(item, 'is_like', 1)
- break;
- }
- this.$toast({
- title: res.msg
- })
- }
- })
- },
- // 打开评论
- handleOpenComment(id) {
- this.communityId = id;
- this.showComment = true;
- }
- }
- }
- </script>
- <style lang="scss" scoped>
- .content-box {
- padding-bottom: 20rpx;
- background-color: $-color-white;
- .bb {
- border-bottom: 1px solid #f2f2f2;
- }
- .header {
- font-size: 28rpx;
- padding: 20rpx 24rpx;
- }
- .swiper-container {
- padding: 0 20rpx;
- }
- .goods-box {
- padding: 15rpx 24rpx;
- .tips {
- padding: 0 10rpx;
- color: $-color-primary;
- border-radius: 20rpx;
- border: 1px solid $-color-primary;
- }
- }
- .content {
- padding: 24rpx;
- padding-bottom: 0;
- .text {
- white-space: pre-line;
- line-height: 48rpx;
- font-size: 28rpx;
- color: $-color-normal;
- }
- .tags {
- padding-top: 24rpx;
- text {
- margin-right: 20rpx;
- border-radius: 26rpx;
- padding: 8rpx 24rpx;
- color: $-color-primary;
- background: rgba($-color-primary, .1);
- }
- }
- }
- .footer {
- padding: 0 24rpx;
- image {
- width: 44rpx;
- height: 44rpx;
- vertical-align: middle;
- margin: 24rpx 6rpx;
- }
- // 点赞动画
- .likes-box {
- position: relative;
- .likes {
- z-index: 99;
- left: -36rpx;
- width: 120rpx;
- height: 120rpx;
- margin-right: 6rpx;
- position: absolute;
- background: url('@/static/images/likes.png') no-repeat;
- background-position: left;
- background-size: cover;
- }
- // 没点赞
- .leave {
- background-position: left;
- }
- // 点赞
- .entry {
- background-position: right;
- transition: background .6s steps(28);
- }
- }
- }
- }
- .share-tips .share-arrow {
- width: 140rpx;
- height: 250rpx;
- float: right;
- margin: 15rpx 31rpx 0 0;
- }
- </style>
|