658 lines
24 KiB
Vue
658 lines
24 KiB
Vue
<template>
|
||
|
||
<view>
|
||
|
||
<!-- Main Start -->
|
||
<view class="content-box">
|
||
<!-- 审核失败 -->
|
||
<view class="audit flex" v-if="communityInfo.status == 2">
|
||
<image src="/bundle_b/static/icon_audit_fail.png"></image>
|
||
<view class="m-l-16 primary">
|
||
<view class="bold md ">审核失败</view>
|
||
<view class="xs m-t-6">{{ communityInfo.audit_remark_desc }}</view>
|
||
</view>
|
||
</view>
|
||
<!-- 审核中 -->
|
||
<view class="audit flex" v-if="communityInfo.status == 0">
|
||
<image src="/bundle_b/static/icon_under_review.png"></image>
|
||
<view class="m-l-16 primary">
|
||
<view class="bold md ">审核中</view>
|
||
<view class="xs m-t-6">{{ communityInfo.audit_remark_desc }}</view>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 内容头部信息 -->
|
||
<view class="header flex row-between">
|
||
<router-link :to="'/bundle_b/pages/community_user/community_user?id=' + communityInfo.user.id">
|
||
<view class="flex">
|
||
<!-- 头像 -->
|
||
<u-image width="70" height="70" :src="communityInfo.user.avatar" borderRadius="50%"></u-image>
|
||
<!-- 昵称 -->
|
||
<text class="normal bold m-l-16">{{ communityInfo.user.nickname }}</text>
|
||
</view>
|
||
</router-link>
|
||
<view class="flex">
|
||
<!-- 关注 -->
|
||
<button class="follow-btn br60" size="mini" @click="handleFollow(1)"
|
||
v-if="communityInfo.is_author==0 && communityInfo.is_follow==0">
|
||
<image src="/bundle_b/static/icon_follow.png"></image>
|
||
<text class="m-l-6 xs">关注</text>
|
||
</button>
|
||
<!-- 已关注 -->
|
||
<button class="followed-btn br60 sm" size="mini" @click="showFollowTips=true"
|
||
v-if="communityInfo.is_author==0 && communityInfo.is_follow==1">已关注</button>
|
||
<!-- 管理 -->
|
||
<button class="manage-btn br60" size="mini" @click="showManage=true"
|
||
v-if="communityInfo.is_author">管理</button>
|
||
|
||
<!-- 转发 -->
|
||
<button open-type="share" @click="handleShare" class="flex-col col--center" hover-class="none">
|
||
<image src="/bundle_b/static/icon_forward.png" class="share-img m-l-12"></image>
|
||
</button>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 内容媒体信息 -->
|
||
<view class="swiper-container">
|
||
<product-swiper :imgUrls="communityInfo.images" :autoplay="false" borderRadius="14"></product-swiper>
|
||
</view>
|
||
|
||
|
||
<!-- 提到的宝贝( 商品 ) -->
|
||
<view class="goods-box bb flex row-between" @click="showGoodsPopup=true"
|
||
v-if="communityInfo.goods_data.length">
|
||
<text class="nr lighter">查看TA提到的宝贝({{communityInfo.goods_data.length}})</text>
|
||
<!-- <text class="tips xs">300+人评价</text> -->
|
||
<view class="goods flex">
|
||
<block v-for="(goodsItem, goodsIndex) in communityInfo.goods_data" :key="goodsIndex">
|
||
<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="showShopPopup=true"
|
||
v-if="communityInfo.shop_data.length">
|
||
<text class="nr lighter">查看TA提到的店铺({{communityInfo.shop_data.length}})</text>
|
||
<!-- <text class="tips xs">300+人评价</text> -->
|
||
<view class="goods flex">
|
||
<block v-for="(shopItem, shopIndex) in communityInfo.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">
|
||
{{ communityInfo.content }}
|
||
</view>
|
||
<view class="tags" v-if="communityInfo.topic">
|
||
<navigator hover-class="none"
|
||
:url="'/bundle_b/pages/community_topic/community_topic?id=' + communityInfo.topic.id +'&name=' + communityInfo.topic.name">
|
||
<text># {{ communityInfo.topic.name }}</text>
|
||
</navigator>
|
||
</view>
|
||
<view class="xs muted">
|
||
{{ communityInfo.create_time || '2022-05-20 05:13:14' }}
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<!-- Main End -->
|
||
|
||
<!-- Comment Start -->
|
||
<view class="comment-box m-t-20 bg-white">
|
||
<view class="comment-title bb" id="comment">
|
||
评价 ({{ communityInfo.total_comment || '0' }}条)
|
||
</view>
|
||
|
||
<template v-if="isCommentLoading">
|
||
<view class="text-center flex row-center p-50">
|
||
<u-loading :color="colorConfig.primary" :size="40" mode="circle"></u-loading>
|
||
<text class="m-l-20">加载中</text>
|
||
</view>
|
||
</template>
|
||
|
||
<template v-else>
|
||
<view class="text-center p-50" v-if="!commentData.length">
|
||
<view class="flex row-center">
|
||
<u-image :src="'/static/images/news_null.png'" width="300" height="300"></u-image>
|
||
</view>
|
||
<view class="muted m-t-40">
|
||
还没有人评论呢, 快来抢沙发~
|
||
</view>
|
||
</view>
|
||
<template v-else>
|
||
<block v-for="(commentItem, commentIndex) in commentData" :key="commentItem.id">
|
||
<community-comment-list :comment="commentItem" @reply="onReply">
|
||
</community-comment-list>
|
||
</block>
|
||
<!-- 加载 -->
|
||
<view class="flex row-center primary nd p-50" v-if="more === 1 && loading">
|
||
<u-loading :color="colorConfig.primary" :size="40" mode="circle"></u-loading>
|
||
<text class="m-l-20">加载中</text>
|
||
</view>
|
||
<!-- 加载底部 -->
|
||
<view class="text-center muted nd p-50" v-else>
|
||
<text>没有更多了~</text>
|
||
</view>
|
||
</template>
|
||
</template>
|
||
</view>
|
||
<!-- Comment End -->
|
||
|
||
<!-- Footer Start -->
|
||
<view class="footer flex bg-white">
|
||
<view class="content-wrapper flex row-between">
|
||
<view class="flex-1 flex" @click="handleComment">
|
||
<view class="input nr muted">发表你的想法吧</view>
|
||
</view>
|
||
<view class="flex likes-box">
|
||
<view class="likes" :class="communityInfo.is_like ? 'entry':'leave'"
|
||
@click="handleLike(communityInfo.is_like)"></view>
|
||
<image class="m-l-30"></image>
|
||
<text>{{ communityInfo.like || '0' }}</text>
|
||
</view>
|
||
<view class="flex" @click="toComment">
|
||
<image src="/static/images/icon_evaluate.png" class="m-l-30"></image>
|
||
<text>{{ communityInfo.total_comment || '0' }}</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<!-- Footer End -->
|
||
|
||
<!-- 管理 -->
|
||
<u-action-sheet :list="manageList" v-model="showManage" @click="handleManage" safe-area-inset-bottom>
|
||
</u-action-sheet>
|
||
|
||
<!-- 取消关注 -->
|
||
<u-modal v-model="showFollowTips" :show-cancel-button="true" comfirm-text="取消关注" cancelText="再想想"
|
||
:confirm-color="colorConfig.primary" :show-title="false" @confirm="handleFollow(0)">
|
||
<view class="flex-col col-center tips-dialog" style="padding-top: 40rpx">
|
||
<image class="icon-lg" src="/static/images/icon_warning.png" />
|
||
<view style="margin:30rpx 0;">确认取消关注?</view>
|
||
</view>
|
||
</u-modal>
|
||
|
||
<!-- 提到的商品 -->
|
||
<community-goods v-model="showGoodsPopup" :communityId="communityInfo.id"></community-goods>
|
||
|
||
<!-- 提到的店铺 -->
|
||
<community-shop v-model="showShopPopup" :communityId="communityInfo.id"></community-shop>
|
||
|
||
<!-- 一级回复评论 -->
|
||
<community-comment v-model="showCommentPopup" :communityId="communityId" @change="changeComment">
|
||
</community-comment>
|
||
|
||
<!-- 二级回复评论 -->
|
||
<community-comment v-model="showCommentChildPopup" :communityId="communityId" :pid="childPid"
|
||
@change="changeCommentChild" :placeholder="childPlaceholder">
|
||
</community-comment>
|
||
|
||
<!-- 加载 -->
|
||
<loading-view v-if="isFirstLoading"></loading-view>
|
||
|
||
<!-- #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 {
|
||
apiCommunityDel,
|
||
getCommunityDetail,
|
||
apiCommunityFollow,
|
||
getCommunityCommentLists,
|
||
apiCommunityCommentLike
|
||
} from '@/api/community.js';
|
||
import {
|
||
getRect
|
||
} from '@/utils/tools'
|
||
export default {
|
||
data() {
|
||
return {
|
||
globalLike: false,
|
||
|
||
communityId: '',
|
||
communityInfo: {
|
||
user: {
|
||
avatar: '',
|
||
nickname: '',
|
||
id: null
|
||
},
|
||
goods_data: [],
|
||
shop_data: [],
|
||
topic: {
|
||
id: false,
|
||
name: ''
|
||
}
|
||
},
|
||
|
||
isFirstLoading: true, // 详情加载
|
||
isCommentLoading: true, // 评论加载
|
||
|
||
showManage: false, // 管理操作
|
||
manageList: [{ // 管理操作列表
|
||
text: '编辑',
|
||
color: '#333333',
|
||
fontSize: 32
|
||
}, {
|
||
text: '删除',
|
||
color: '#333333',
|
||
fontSize: 32
|
||
}],
|
||
showFollowTips: false, // 取消关注
|
||
showGoodsPopup: false, // 商品推荐弹窗
|
||
showShopPopup: false, // 店铺推荐弹窗
|
||
showTips: false, // 分享弹窗H5
|
||
|
||
showCommentPopup: false, // 评论弹窗
|
||
showCommentChildPopup: false, // 二级评论
|
||
childPid: '', // 选择二级评论回复ID
|
||
childIndex: '', // 选择的二级评论第几条
|
||
childPlaceholder: '', // 选择的二级评论回复人名字: 回复@xxx
|
||
|
||
toScrollArr: [], // 存储需要跳转到的滚动条高度 0-评论
|
||
commentData: [], // 评论数据
|
||
page: 1, // 评论分页页数
|
||
pageSize: 10, // 评论分页数量
|
||
more: 0, // 是否有下一页分页
|
||
loading: false, // 加载动画
|
||
}
|
||
},
|
||
onLoad() {
|
||
this.$nextTick(() => {
|
||
// 滚动到顶部,防止h5端出现问题
|
||
uni.pageScrollTo({
|
||
scrollTop: 0,
|
||
duration: 0,
|
||
});
|
||
getRect('#comment').then((res) => {
|
||
this.toScrollArr[0] = res.top
|
||
})
|
||
});
|
||
const options = this.$Route.query;
|
||
if (options && options.scene) {
|
||
const scene = strToParams(decodeURIComponent(options.scene));
|
||
options.id = scene.id;
|
||
}
|
||
this.communityId = options.id || '';
|
||
},
|
||
onShow() {
|
||
this.initCommunityDetail()
|
||
},
|
||
// 触底加载
|
||
onReachBottom() {
|
||
console.log('触底')
|
||
if (this.more) {
|
||
this.loading = true
|
||
this.getCommentData()
|
||
}
|
||
},
|
||
// 分享朋友
|
||
onShareAppMessage() {
|
||
return {
|
||
title: `${this.communityInfo.user.nickname},TA的内容超级棒`,
|
||
path: '/bundle_b/pages/community_detail/community_detail?id=' + this.communityId,
|
||
imageUrl: this.communityInfo.image
|
||
}
|
||
},
|
||
methods: {
|
||
// 初始化详情
|
||
initCommunityDetail() {
|
||
getCommunityDetail({
|
||
id: this.communityId
|
||
}).then(res => {
|
||
if (res.code == 1) {
|
||
this.communityInfo = res.data;
|
||
setTimeout(() => {
|
||
this.isFirstLoading && this.getCommentData()
|
||
this.isFirstLoading = false;
|
||
}, 600)
|
||
} else {
|
||
this.$toast({
|
||
title: res.msg
|
||
})
|
||
setTimeout(() => this.$Router.back(), 2000)
|
||
}
|
||
})
|
||
},
|
||
// 分享处理
|
||
handleShare() {
|
||
// #ifdef H5
|
||
this.showTips = true
|
||
// #endif
|
||
// #ifndef MP
|
||
this.$store.commit('setCommunity', {
|
||
...this.communityInfo,
|
||
url: 'bundle_b/pages/community_detail/community_detail'
|
||
})
|
||
this.$store.dispatch('communityShare')
|
||
// #endif
|
||
},
|
||
// 刷新评论 event 是子组件传参是否评论
|
||
changeComment(event) {
|
||
this.communityInfo.total_comment += 1
|
||
if (!event.hasOwnProperty('child')) {
|
||
event.child = []
|
||
}
|
||
this.commentData.unshift(event)
|
||
},
|
||
// 回复评论
|
||
onReply(event) {
|
||
this.childIndex = this.commentData.findIndex(item => item.id == event.parentId)
|
||
this.childPid = event.commentId
|
||
this.childPlaceholder = '回复@' + event.commentUserName;
|
||
this.showCommentChildPopup = true
|
||
},
|
||
// 改变添加子评论
|
||
changeCommentChild(event) {
|
||
this.commentData[this.childIndex].child.push(event)
|
||
},
|
||
// 获取评论
|
||
getCommentData() {
|
||
getCommunityCommentLists({
|
||
article_id: this.communityId,
|
||
page_no: this.page,
|
||
page_size: this.pageSize,
|
||
}).then(res => {
|
||
setTimeout(() => this.isCommentLoading = false, 500)
|
||
if (res.code == 1) {
|
||
res.data.list.forEach(item => {
|
||
item.loading = false
|
||
this.commentData.push(item)
|
||
})
|
||
if (res.data.more === 1) {
|
||
this.page += 1
|
||
}
|
||
this.more = res.data.more
|
||
this.loading = false
|
||
} else {
|
||
this.$toast({ title: res.msg })
|
||
}
|
||
})
|
||
},
|
||
// 处理需要回复的评论
|
||
handleComment() {
|
||
this.showCommentPopup = true;
|
||
},
|
||
// 管理文章
|
||
handleManage(index) {
|
||
// 编辑
|
||
switch (index) {
|
||
case 0:
|
||
this.$Router.push({
|
||
path: '/bundle_b/pages/published_works/published_works',
|
||
query: {
|
||
id: this.communityId
|
||
}
|
||
})
|
||
break;
|
||
case 1:
|
||
apiCommunityDel({
|
||
id: this.communityId
|
||
}).then(res => {
|
||
if (res.code == 1) {
|
||
this.$toast({
|
||
title: '删除成功'
|
||
})
|
||
setTimeout(() => this.$Router.back(), 1000)
|
||
}
|
||
});
|
||
break;
|
||
}
|
||
},
|
||
// 关注 | 取消关注
|
||
handleFollow(event) {
|
||
if (!this.isLogin) return this.$Router.push('/pages/login/login')
|
||
apiCommunityFollow({
|
||
follow_id: this.communityInfo.user.id,
|
||
status: event
|
||
}).then(res => {
|
||
this.$toast({
|
||
title: res.msg
|
||
})
|
||
this.initCommunityDetail()
|
||
})
|
||
},
|
||
// 点赞
|
||
handleLike(status) {
|
||
if (!this.isLogin) return this.$Router.push('/pages/login/login')
|
||
this.communityInfo.is_like = !status
|
||
apiCommunityCommentLike({
|
||
id: this.communityId,
|
||
status: status ? 0 : 1,
|
||
type: 1
|
||
}).then(res => {
|
||
if (res.code === 1) {
|
||
if (status) this.communityInfo.like -= 1
|
||
else this.communityInfo.like += 1
|
||
// 点赞文章时 其他页面的状态也需要更改
|
||
uni.$emit('changeItem', {
|
||
like: this.communityInfo.like,
|
||
is_like: this.communityInfo.is_like,
|
||
id: this.communityId
|
||
})
|
||
} else {
|
||
this.communityInfo.is_like = status
|
||
this.$toast({
|
||
title: res.msg
|
||
})
|
||
}
|
||
})
|
||
},
|
||
// 跳转到评论
|
||
toComment() {
|
||
uni.pageScrollTo({
|
||
scrollTop: this.toScrollArr[0],
|
||
duration: 200
|
||
});
|
||
}
|
||
},
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
.bb {
|
||
border-bottom: 1px solid $-color-border;
|
||
}
|
||
|
||
.content-box {
|
||
margin-bottom: 20rpx;
|
||
background-color: $-color-white;
|
||
|
||
// 审核
|
||
.audit {
|
||
padding: 20rpx 24rpx;
|
||
background-color: rgba($-color-primary, .1);
|
||
|
||
image {
|
||
width: 60rpx;
|
||
height: 60rpx;
|
||
}
|
||
}
|
||
|
||
// 头部-作者
|
||
.header {
|
||
font-size: 28rpx;
|
||
padding: 20rpx 24rpx;
|
||
|
||
// 更多
|
||
.share-img {
|
||
width: 60rpx;
|
||
height: 60rpx;
|
||
}
|
||
|
||
// 关注-按钮
|
||
.follow-btn {
|
||
width: 118rpx;
|
||
height: 48rpx;
|
||
line-height: 44rpx;
|
||
color: #FFFFFF;
|
||
padding: 0;
|
||
background: linear-gradient(90.00deg, #f95f2f 0%, #ff2c3c 100%);
|
||
|
||
image {
|
||
width: 30rpx;
|
||
height: 30rpx;
|
||
vertical-align: middle;
|
||
}
|
||
}
|
||
|
||
// 已关注-按钮
|
||
.followed-btn {
|
||
width: 118rpx;
|
||
height: 48rpx;
|
||
line-height: 44rpx;
|
||
color: #FFFFFF;
|
||
padding: 0;
|
||
background-color: #CCCCCC;
|
||
}
|
||
|
||
// 管理-按钮
|
||
.manage-btn {
|
||
width: 92rpx;
|
||
height: 48rpx;
|
||
line-height: 44rpx;
|
||
padding: 0;
|
||
border: 1px solid $-color-primary;
|
||
color: $-color-primary;
|
||
}
|
||
}
|
||
|
||
.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;
|
||
|
||
// 内容文字
|
||
.text {
|
||
white-space: pre-line;
|
||
line-height: 48rpx;
|
||
font-size: 28rpx;
|
||
color: $-color-normal;
|
||
}
|
||
|
||
// 标签
|
||
.tags {
|
||
padding: 24rpx 0;
|
||
|
||
text {
|
||
margin-right: 20rpx;
|
||
border-radius: 26rpx;
|
||
padding: 8rpx 24rpx;
|
||
color: $-color-primary;
|
||
background: rgba($-color-primary, .1);
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
.comment-box {
|
||
overflow: hidden;
|
||
padding-bottom: 140rpx;
|
||
|
||
.comment-title {
|
||
color: $-color-black;
|
||
padding: 28rpx 24rpx;
|
||
font-size: 30rpx;
|
||
}
|
||
}
|
||
|
||
// 底部
|
||
.footer {
|
||
width: 100%;
|
||
height: 92rpx;
|
||
z-index: 99;
|
||
position: fixed;
|
||
left: 0;
|
||
bottom: 0;
|
||
box-sizing: content-box;
|
||
padding-bottom: env(safe-area-inset-bottom);
|
||
box-shadow: 0 -4rpx 10rpx rgba(#000000, .1);
|
||
|
||
.content-wrapper {
|
||
width: 100%;
|
||
padding: 0 30rpx;
|
||
color: $-color-lighter;
|
||
font-size: 28rpx;
|
||
|
||
.input {
|
||
width: 100%;
|
||
border-radius: 30rpx;
|
||
background: #f8f8f8;
|
||
padding: 10rpx 30rpx;
|
||
}
|
||
|
||
image {
|
||
width: 44rpx;
|
||
height: 44rpx;
|
||
margin-right: 6rpx;
|
||
}
|
||
|
||
// 点赞动画
|
||
.likes-box {
|
||
position: relative;
|
||
|
||
.likes {
|
||
z-index: 999;
|
||
left: -10rpx;
|
||
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>
|