From 4789476b3fe734b4366ce72079330cea32a4997d Mon Sep 17 00:00:00 2001 From: tj <1378534974@qq.com> Date: 星期五, 06 六月 2025 18:04:20 +0800 Subject: [PATCH] 1.评论 --- components/comment/comment-item.vue | 295 ++++++++++++++++++++++++++++++---------------------------- 1 files changed, 154 insertions(+), 141 deletions(-) diff --git a/components/comment/comment-item.vue b/components/comment/comment-item.vue index b905df7..5278054 100644 --- a/components/comment/comment-item.vue +++ b/components/comment/comment-item.vue @@ -1,161 +1,174 @@ <template> - <view class="comment-item"> - <view class="comment-item-header"> - <view class="comment-item-header-left"> - <view class="avatar"> - <up-avatar :src="avatar" size="50rpx" shape="circle" /> + <view class="comment-item"> + <view class="comment-item-header"> + <view class="comment-item-header-left"> + <view class="avatar"> + <up-avatar :src="avatar" size="50rpx" shape="circle" /> + </view> + <view class="comment-content"> + <view class="author"> + <text class="nickname">{{ nickname }}</text> + <view v-if="isAuthor" class="author-flag">作者</view> </view> - <view class="comment-content"> - <view class="author"> - <text class="nickname">{{ nickname }}</text> - <view v-if="isAuthor" class="author-flag">作者</view> - </view> - <view class="comment-content-text"> - <text>{{ content }}</text> - <up-album :urls="images" multipleSize="180rpx" singleSize="500rpx" /> - <text class="date">{{ date }}</text> - <text class="address">{{ address }}</text> - <text class="reply" @click="onReply">回复</text> - </view> - </view> - <view class="comment-opeartor"> - <up-icon name="heart" size="30rpx" /> - <view class="comment-opeartor-heart-number">{{ likes }}</view> + <view class="comment-content-text"> + <text>{{ content }}</text> + <up-album :urls="images" multipleSize="180rpx" singleSize="500rpx" /> + <text class="date">{{ date }}</text> + <text class="address">{{ address }}</text> + <text class="reply" @click="onReply">回复</text> </view> </view> - </view> - - <!-- 子评论区域 --> - <view class="sub-comment"> - <comment-sub-item - avatar="https://img.yzcdn.cn/vant/cat.jpeg" - nickname="图墙精选" - :isAuthor="true" - content="如果路线里全是常规景区,没一个特殊的点位..." - :images="urls2" - date="2天前" - address="湖北" - :likes="30" - @reply="emitReply" - /> + <view class="comment-opeartor"> + <up-icon name="heart" size="30rpx" /> + <view class="comment-opeartor-heart-number">{{ likes }}</view> + </view> </view> </view> - </template> - - <script setup lang="ts"> - import { ref, onMounted } from 'vue' - interface Props { - avatar: string - nickname: string - isAuthor: boolean - content: string - images: string[] - date: string - address: string - likes: number + + <!-- 子评论区域 --> + <view class="sub-comment"> + <comment-sub-item + v-for="(item, index) in child" + :avatar="item.picture" + :nickname="item.commentUserName" + :isAuthor="item.createBy === filmInfo.createBy" + :content="item.content" + :images="getImageList(item)" + :date="item.createTime" + address="湖北" + :likes="item.likeCount" + @reply="emitReply" + :filmInfo="filmInfo" + /> + </view> + </view> +</template> + +<script setup lang="ts"> +import { ref, onMounted } from 'vue' +import { CommentDTO } from '@/types/index' +interface Props { + avatar: string + nickname: string + isAuthor: boolean + content: string + images: string[] + date: string + address: string + likes: number + child: CommentDTO[] + filmInfo: CommentDTO +} + +const props = defineProps<Props>() + +const emit = defineEmits<{ + (e: 'reply'): void +}>() + + +const getImageList = (item: any): string[] => { + if (!item || !item.filmPictures || typeof item.filmPictures !== 'string') { + return []; } - - const props = defineProps<Props>() - - const emit = defineEmits<{ - (e: 'reply'): void - }>() - - const urls2 = ref<string[]>([ - 'https://img.yzcdn.cn/vant/cat.jpeg', - 'https://img.yzcdn.cn/vant/cat.jpeg', - 'https://img.yzcdn.cn/vant/cat.jpeg', - 'https://img.yzcdn.cn/vant/cat.jpeg', - 'https://img.yzcdn.cn/vant/cat.jpeg' - ]) - - const onReply = () => { - emit('reply') + + try { + const pictures = JSON.parse(item.filmPictures); + return Array.isArray(pictures) ? pictures.map((p: any) => p.url) : []; + } catch (e) { + console.error('filmPictures JSON parse error:', e, item.filmPictures); + return []; } - - const emitReply = () => { - emit('reply') - } - </script> - - <style lang="scss" scoped> - .comment-item { - .comment-item-header { +}; + + +const onReply = () => { + emit('reply') +} + +const emitReply = () => { + emit('reply') +} +</script> + +<style lang="scss" scoped> +.comment-item { + .comment-item-header { + display: flex; + align-items: center; + + .comment-item-header-left { display: flex; - align-items: center; - - .comment-item-header-left { + width: 100%; + + .avatar { + margin-right: 10rpx; + } + + .comment-content { + width: 92%; display: flex; - width: 100%; - - .avatar { - margin-right: 10rpx; - } - - .comment-content { - width: 92%; + flex-direction: column; + + .author { display: flex; - flex-direction: column; - - .author { - display: flex; - align-items: center; - - .nickname { - font-size: 30rpx; - color: #858585; - } - - .author-flag { - font-size: 18rpx; - color: #ff4d4f; - font-weight: bold; - border-radius: 50rpx; - padding: 5rpx 10rpx; - background-color: rgba(219, 19, 22, 0.219); - margin-left: 10rpx; - height: 25rpx; - } + align-items: center; + + .nickname { + font-size: 30rpx; + color: #858585; } - - .comment-content-text { - margin-top: 10rpx; - font-size: 26rpx; - letter-spacing: 1rpx; - line-height: 1.5; - - .date, - .address { - font-size: 20rpx; - padding: 10rpx; - color: #858585; - } - - .reply { - font-size: 24rpx; - padding: 10rpx; - color: #2979ff; - } + + .author-flag { + font-size: 18rpx; + color: #ff4d4f; + font-weight: bold; + border-radius: 50rpx; + padding: 5rpx 10rpx; + background-color: rgba(219, 19, 22, 0.219); + margin-left: 10rpx; + height: 25rpx; } } - - .comment-opeartor { - display: flex; - flex-direction: column; - align-items: flex-start; - - .comment-opeartor-heart-number { - text-align: center; + + .comment-content-text { + margin-top: 10rpx; + font-size: 26rpx; + letter-spacing: 1rpx; + line-height: 1.5; + + .date, + .address { font-size: 20rpx; + padding: 10rpx; + color: #858585; + } + + .reply { + font-size: 24rpx; + padding: 10rpx; + color: #2979ff; } } } - } - - .sub-comment { - margin-left: 60rpx; - margin-top: 10rpx; + + .comment-opeartor { + display: flex; + flex-direction: column; + align-items: flex-start; + + .comment-opeartor-heart-number { + width: 100%; + text-align: center; + font-size: 20rpx; + } + } } } - </style> - \ No newline at end of file + + .sub-comment { + margin-left: 60rpx; + margin-top: 10rpx; + } +} +</style> \ No newline at end of file -- Gitblit v1.9.3