You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
3.5 KiB

  1. <template>
  2. <view class="recent-reviews">
  3. <uni-card :is-shadow="false" padding="0" margin="10px">
  4. <view class="service-new-title" slot="title">
  5. <view class="service-new-title-left">
  6. <view class="service-new-flag"></view>
  7. <view>近期评价({{reviewCount}})</view>
  8. </view>
  9. </view>
  10. <view class="split-line"></view>
  11. <view class="recent-reviews-content">
  12. <view v-for="(item, index) in reviewList" :key="index" class="review-item">
  13. <view class="review-header">
  14. <view class="reviewer-info">
  15. <u-avatar :src="item.member.avatar || defaultAvatar" size="40" shape="circle"></u-avatar>
  16. <view class="reviewer-details">
  17. <view class="reviewer-name">{{item.member.nickname}}</view>
  18. <view class="review-date">{{item.createTime}}</view>
  19. </view>
  20. </view>
  21. <view class="rating-stars">
  22. <uni-rate :readonly="true" size="18" :value="item.num" />
  23. </view>
  24. </view>
  25. <view class="review-content">
  26. {{item.content}}
  27. </view>
  28. </view>
  29. <!-- 空状态 -->
  30. <view v-if="!reviewList || reviewList.length === 0" class="empty-state">
  31. <view class="empty-text">暂无评价</view>
  32. </view>
  33. </view>
  34. </uni-card>
  35. </view>
  36. </template>
  37. <script>
  38. export default {
  39. name: 'RecentReviews',
  40. props: {
  41. // 评价列表数据
  42. reviewList: {
  43. type: Array,
  44. default: () => []
  45. },
  46. // 默认头像
  47. defaultAvatar: {
  48. type: String,
  49. default: 'https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/banner/gold_people.png'
  50. },
  51. // 是否显示评价数量
  52. showCount: {
  53. type: Boolean,
  54. default: true
  55. }
  56. },
  57. computed: {
  58. // 计算评价数量
  59. reviewCount() {
  60. return this.reviewList ? this.reviewList.length : 0;
  61. }
  62. },
  63. methods: {
  64. // 点击评价项事件
  65. onReviewClick(review, index) {
  66. this.$emit('reviewClick', { review, index });
  67. },
  68. // 点击用户头像事件
  69. onAvatarClick(review, index) {
  70. this.$emit('avatarClick', { review, index });
  71. }
  72. }
  73. };
  74. </script>
  75. <style lang="scss" scoped>
  76. .recent-reviews {
  77. width: 100%;
  78. padding-bottom: 10px;
  79. .service-new-title {
  80. display: flex;
  81. font-weight: 500;
  82. font-size: 28rpx;
  83. color: #333333;
  84. line-height: 33rpx;
  85. margin: 42rpx 0 30rpx;
  86. justify-content: space-between;
  87. .service-new-title-left {
  88. display: flex;
  89. align-items: center;
  90. .service-new-flag {
  91. width: 8rpx;
  92. height: 32rpx;
  93. background: #FFBF60;
  94. border-radius: 30rpx;
  95. margin-right: 10rpx;
  96. }
  97. }
  98. }
  99. .split-line {
  100. width: 100%;
  101. height: 1rpx;
  102. background: #EFEFEF;
  103. }
  104. .recent-reviews-content {
  105. padding: 20rpx;
  106. .review-item {
  107. padding: 20rpx 0;
  108. border-bottom: 1rpx solid #EFEFEF;
  109. &:last-child {
  110. border-bottom: none;
  111. }
  112. .review-header {
  113. display: flex;
  114. justify-content: space-between;
  115. align-items: center;
  116. margin-bottom: 20rpx;
  117. .reviewer-info {
  118. display: flex;
  119. align-items: center;
  120. .reviewer-details {
  121. margin-left: 20rpx;
  122. .reviewer-name {
  123. font-size: 28rpx;
  124. font-weight: 500;
  125. color: #333333;
  126. line-height: 32rpx;
  127. }
  128. .review-date {
  129. font-size: 24rpx;
  130. color: #7D8196;
  131. margin-top: 8rpx;
  132. line-height: 28rpx;
  133. }
  134. }
  135. }
  136. .rating-stars {
  137. display: flex;
  138. align-items: center;
  139. }
  140. }
  141. .review-content {
  142. font-size: 28rpx;
  143. color: #333333;
  144. line-height: 40rpx;
  145. margin-left: 80rpx;
  146. }
  147. }
  148. .empty-state {
  149. padding: 60rpx 0;
  150. text-align: center;
  151. .empty-text {
  152. font-size: 28rpx;
  153. color: #7D8196;
  154. }
  155. }
  156. }
  157. }
  158. </style>