|
|
- <template>
- <view class="comment-list" v-if="comments && comments.length > 0">
- <view class="comment-header">
- <view class="comment-icon">💬</view>
- <text class="comment-count">评论</text>
- </view>
-
- <view class="comment-container">
- <view
- class="comment-item"
- v-for="(comment, index) in comments"
- :key="index"
- >
- <view class="comment-user">
- <image
- class="user-avatar"
- :src="comment.userHead || '/static/image/center/default-avatar.png'"
- @click.stop="previewImage([comment.userHead])"
- mode="aspectFill"
- ></image>
- <view class="comment-content">
- <view class="user-info">
- <text class="username">{{ comment.userName }}</text>
- <text class="comment-time">{{ formatTime(comment.createTime) }}</text>
- </view>
- <view class="comment-text" v-html="$utils.stringFormatHtml(comment.userValue)">
- </view>
-
- <!-- 评论图片 -->
- <view class="comment-images" v-if="getCommentImages(comment).length > 0">
- <view
- class="comment-image"
- v-for="(img, imgIndex) in getCommentImages(comment)"
- :key="imgIndex"
- @click.stop="previewImage(getCommentImages(comment), imgIndex)"
- >
- <image :src="img" mode="aspectFill"></image>
- </view>
- </view>
- </view>
- </view>
- </view>
-
- <!-- 查看更多评论按钮 -->
- <view
- class="more-btn"
- v-if="hasMoreComments"
- @click="goToDetail"
- >
- <text>查看更多评论</text>
- <text class="more-icon">→</text>
- </view>
- </view>
- </view>
- </template>
-
- <script>
- export default {
- name: 'CommentList',
- props: {
- comments: {
- type: Array,
- default: () => []
- },
- hasMoreComments: {
- type: Boolean,
- default: false
- }
- },
- data() {
- return {
-
- }
- },
- computed: {
-
- },
- methods: {
- goToDetail() {
- this.$emit('goToDetail')
- },
-
- getCommentImages(comment) {
- if (!comment.userImage) {
- return []
- }
- return comment.userImage.split(',').filter(img => img.trim())
- },
-
- formatTime(time) {
- if (!time) return ''
-
- // 如果时间已经包含"发布",直接返回
- if (time.includes && time.includes('发布')) {
- return time
- }
-
- // 使用dayjs格式化时间戳
- if (typeof time === 'number' || (typeof time === 'string' && /^\d+$/.test(time))) {
- const timestamp = Number(time)
- const now = this.$dayjs()
- const commentTime = this.$dayjs(timestamp)
-
- // 计算时间差
- const diffMinutes = now.diff(commentTime, 'minute')
- const diffHours = now.diff(commentTime, 'hour')
- const diffDays = now.diff(commentTime, 'day')
-
- if (diffMinutes < 1) {
- return '刚刚'
- } else if (diffMinutes < 60) {
- return `${diffMinutes}分钟前`
- } else if (diffHours < 24) {
- return `${diffHours}小时前`
- } else if (diffDays < 7) {
- return `${diffDays}天前`
- } else {
- return commentTime.format('MM-DD HH:mm')
- }
- }
-
- // 否则添加"发布"后缀
- return time + '发布'
- },
-
- previewImage(images, current = 0) {
- if (!images || images.length === 0) return
-
- uni.previewImage({
- urls: images,
- current: current
- })
- }
- }
- }
- </script>
-
- <style scoped lang="scss">
- .comment-list {
- margin-top: 20rpx;
- background-color: #f8f8f8;
- border-radius: 12rpx;
- overflow: hidden;
-
- .comment-header {
- display: flex;
- align-items: center;
- padding: 20rpx 30rpx 15rpx;
- background-color: #f0f0f0;
- border-bottom: 1rpx solid #e5e5e5;
-
- .comment-icon {
- font-size: 28rpx;
- margin-right: 10rpx;
- }
-
- .comment-count {
- font-size: 26rpx;
- color: #666;
- font-weight: 500;
- }
- }
-
- .comment-container {
- padding: 0 30rpx 20rpx;
-
- .comment-item {
- padding: 20rpx 0;
- border-bottom: 1rpx solid #f0f0f0;
-
- &:last-child {
- border-bottom: none;
- }
-
- .comment-user {
- display: flex;
- align-items: flex-start;
-
- .user-avatar {
- width: 60rpx;
- height: 60rpx;
- border-radius: 50%;
- margin-right: 20rpx;
- flex-shrink: 0;
- }
-
- .comment-content {
- flex: 1;
-
- .user-info {
- display: flex;
- align-items: center;
- margin-bottom: 8rpx;
-
- .username {
- font-size: 26rpx;
- color: #576b95;
- font-weight: 500;
- margin-right: 20rpx;
- }
-
- .comment-time {
- font-size: 22rpx;
- color: #999;
- }
- }
-
- .comment-text {
- font-size: 28rpx;
- color: #333;
- line-height: 1.5;
- word-break: break-all;
- margin-bottom: 10rpx;
- }
-
- .comment-images {
- display: flex;
- flex-wrap: wrap;
- margin-top: 15rpx;
-
- .comment-image {
- margin-right: 10rpx;
- margin-bottom: 10rpx;
-
- image {
- width: 100rpx;
- height: 100rpx;
- border-radius: 8rpx;
- }
- }
- }
- }
- }
- }
-
- .expand-btn {
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 15rpx 0;
- margin-top: 10rpx;
- color: #576b95;
- font-size: 26rpx;
-
- .expand-icon {
- margin-left: 10rpx;
- font-size: 20rpx;
- }
- }
-
- .more-btn {
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 15rpx 0;
- margin-top: 10rpx;
- color: #576b95;
- font-size: 26rpx;
- background-color: #f5f5f5;
- border-radius: 8rpx;
-
- .more-icon {
- margin-left: 10rpx;
- font-size: 24rpx;
- }
- }
- }
- }
- </style>
|