<template>
|
|
<view class="waterfall-item" @click="handleClick">
|
|
<!-- 主图片 -->
|
|
<view class="main-image" v-if="mainImage">
|
|
<image :src="mainImage" mode="aspectFill" @click.stop="previewImage([mainImage])"></image>
|
|
<!-- 分类标签 -->
|
|
<view class="category-tag" v-if="item.classId_dictText">
|
|
#{{ item.classId_dictText }}
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 内容区域 -->
|
|
<view class="content">
|
|
<!-- 标题/内容 -->
|
|
<view class="title" v-if="item.title" v-html="formatContent(item.title)"></view>
|
|
|
|
<!-- 地址信息 -->
|
|
<view class="address" v-if="item.address">
|
|
<uv-icon name="map-pin" size="24rpx" color="#999"></uv-icon>
|
|
<text>{{ item.address }}</text>
|
|
</view>
|
|
|
|
<!-- 用户信息 -->
|
|
<view class="user-info">
|
|
<view class="user-avatar">
|
|
<image :src="item.userImage" mode="aspectFill" @click.stop="previewImage([item.userImage])"></image>
|
|
</view>
|
|
<view class="user-details">
|
|
<view class="username">{{ item.userName }}</view>
|
|
<view class="user-tags">
|
|
<text class="tag" v-if="item.sex" :style="{'background-color': sexColors[item.sex] || '#999'}">{{ item.sex }}</text>
|
|
<text class="tag" v-if="item.yearDate">{{ item.yearDate }}</text>
|
|
<text class="auth-tag" v-if="item.isContent">{{ item.isContent }}</text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 互动数据 -->
|
|
<view class="interaction">
|
|
<view class="interaction-item">
|
|
<uv-icon name="eye" size="24rpx" color="#999"></uv-icon>
|
|
<text>{{ item.isBrowse || 0 }}</text>
|
|
</view>
|
|
<view class="interaction-item">
|
|
<uv-icon name="chat" size="24rpx" color="#999"></uv-icon>
|
|
<text>{{ item.isComment || 0 }}</text>
|
|
</view>
|
|
<view class="interaction-item" @click.stop="handleLike">
|
|
<uv-icon name="thumb-up" size="24rpx" :color="isLiked ? '#ff4757' : '#999'"></uv-icon>
|
|
<text :style="{color: isLiked ? '#ff4757' : '#999'}">{{ item.isUp || 0 }}</text>
|
|
</view>
|
|
|
|
<!-- 发布时间 -->
|
|
<view class="publish-time">
|
|
{{ formatTime(item.createTime) }}
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
props: {
|
|
item: {
|
|
type: Object,
|
|
default: () => ({})
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
isLiked: false,
|
|
sexColors: {
|
|
'男': '#4A90E2',
|
|
'女': '#FF69B4',
|
|
'其他': '#999'
|
|
}
|
|
}
|
|
},
|
|
computed: {
|
|
// 主图片 - 优先显示微信图片,然后是第一张图片
|
|
mainImage() {
|
|
if (this.item.wxImage) {
|
|
return this.item.wxImage
|
|
}
|
|
if (this.item.image) {
|
|
const images = this.item.image.split(',').filter(img => img.trim())
|
|
return images.length > 0 ? images[0] : null
|
|
}
|
|
return null
|
|
}
|
|
},
|
|
methods: {
|
|
// 处理点击事件
|
|
handleClick() {
|
|
this.$emit('click', this.item)
|
|
},
|
|
|
|
// 处理点赞事件
|
|
handleLike() {
|
|
this.isLiked = !this.isLiked
|
|
this.$emit('like', this.item)
|
|
},
|
|
|
|
// 预览图片
|
|
previewImage(urls, current = 0) {
|
|
if (!urls || urls.length === 0) return
|
|
|
|
uni.previewImage({
|
|
urls: urls,
|
|
current: current
|
|
})
|
|
},
|
|
|
|
// 格式化内容
|
|
formatContent(content) {
|
|
if (!content) return ''
|
|
|
|
// 尝试使用全局utils,如果不存在则返回原内容
|
|
if (this.$utils && this.$utils.stringFormatHtml) {
|
|
return this.$utils.stringFormatHtml(content)
|
|
}
|
|
|
|
// 简单的HTML处理
|
|
return content.replace(/\n/g, '<br/>')
|
|
},
|
|
|
|
// 格式化时间
|
|
formatTime(timeStr) {
|
|
if (!timeStr) return ''
|
|
|
|
// 如果已经包含"发布",直接返回
|
|
if (timeStr.includes('发布')) {
|
|
return timeStr
|
|
}
|
|
|
|
// 简单的时间格式处理
|
|
const now = new Date()
|
|
const time = new Date(timeStr)
|
|
const diff = now - time
|
|
const days = Math.floor(diff / (1000 * 60 * 60 * 24))
|
|
|
|
if (days === 0) {
|
|
return '今天'
|
|
} else if (days === 1) {
|
|
return '昨天'
|
|
} else if (days < 7) {
|
|
return `${days}天前`
|
|
} else {
|
|
// 返回月-日格式
|
|
const month = time.getMonth() + 1
|
|
const day = time.getDate()
|
|
return `${month}-${day}`
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.waterfall-item {
|
|
background-color: #fff;
|
|
border-radius: 16rpx;
|
|
overflow: hidden;
|
|
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);
|
|
margin-bottom: 20rpx;
|
|
|
|
.main-image {
|
|
position: relative;
|
|
width: 100%;
|
|
|
|
image {
|
|
width: 100%;
|
|
height: 400rpx;
|
|
object-fit: cover;
|
|
}
|
|
|
|
.category-tag {
|
|
position: absolute;
|
|
top: 16rpx;
|
|
right: 16rpx;
|
|
background: rgba(255, 215, 0, 0.9);
|
|
color: #333;
|
|
padding: 8rpx 16rpx;
|
|
border-radius: 20rpx;
|
|
font-size: 22rpx;
|
|
font-weight: 500;
|
|
}
|
|
}
|
|
|
|
.content {
|
|
padding: 24rpx;
|
|
|
|
.title {
|
|
font-size: 28rpx;
|
|
line-height: 1.4;
|
|
color: #333;
|
|
margin-bottom: 16rpx;
|
|
display: -webkit-box;
|
|
-webkit-box-orient: vertical;
|
|
-webkit-line-clamp: 3;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.address {
|
|
display: flex;
|
|
align-items: center;
|
|
margin-bottom: 20rpx;
|
|
|
|
text {
|
|
font-size: 24rpx;
|
|
color: #666;
|
|
margin-left: 8rpx;
|
|
}
|
|
}
|
|
|
|
.user-info {
|
|
display: flex;
|
|
align-items: center;
|
|
margin-bottom: 20rpx;
|
|
|
|
.user-avatar {
|
|
width: 60rpx;
|
|
height: 60rpx;
|
|
border-radius: 30rpx;
|
|
overflow: hidden;
|
|
margin-right: 16rpx;
|
|
|
|
image {
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
}
|
|
|
|
.user-details {
|
|
flex: 1;
|
|
|
|
.username {
|
|
font-size: 26rpx;
|
|
color: #333;
|
|
font-weight: 500;
|
|
margin-bottom: 6rpx;
|
|
}
|
|
|
|
.user-tags {
|
|
display: flex;
|
|
align-items: center;
|
|
flex-wrap: wrap;
|
|
|
|
.tag {
|
|
font-size: 20rpx;
|
|
color: white;
|
|
background-color: #999;
|
|
padding: 4rpx 12rpx;
|
|
border-radius: 12rpx;
|
|
margin-right: 8rpx;
|
|
margin-bottom: 4rpx;
|
|
}
|
|
|
|
.auth-tag {
|
|
font-size: 20rpx;
|
|
color: white;
|
|
background-color: #ffd036;
|
|
padding: 4rpx 12rpx;
|
|
border-radius: 12rpx;
|
|
margin-right: 8rpx;
|
|
margin-bottom: 4rpx;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.interaction {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
|
|
.interaction-item {
|
|
display: flex;
|
|
align-items: center;
|
|
|
|
text {
|
|
font-size: 24rpx;
|
|
color: #999;
|
|
margin-left: 6rpx;
|
|
}
|
|
}
|
|
|
|
.publish-time {
|
|
font-size: 24rpx;
|
|
color: #999;
|
|
margin-left: auto;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|