| <template> | |
|   <view class="card info" :style="style"> | |
|     <view class="card-header">{{ product.title }}</view> | |
|     <view class="card-content"> | |
|       <view class="row desc">{{ product.brief }}</view> | |
|       <view class="flex row tags" v-if="tagList.length"> | |
|         <view class="tag" v-for="(tag, tIdx) in tagList" :key="tIdx"> | |
|           {{ tag }} | |
|         </view> | |
|       </view> | |
|       <view class="flex row time"> | |
|         <view class="time-item"> | |
|           <view class="time-item-value">{{ $dayjs(productPackage.startDate).format('MM月DD日') }}</view> | |
|           <view class="time-item-label">出发日期</view> | |
|         </view> | |
|         <view class="flex time-total"> | |
|           <view class="time-total-line"></view> | |
|           <view class="time-total-value">{{ `${days}天` }}</view> | |
|           <view class="time-total-line"></view> | |
|         </view> | |
|         <view class="time-item"> | |
|           <view class="time-item-value">{{ $dayjs(productPackage.endDate).format('MM月DD日') }}</view> | |
|           <view class="time-item-label">结束日期</view> | |
|         </view> | |
|       </view> | |
|     </view> | |
|   </view> | |
| </template> | |
| 
 | |
| <script> | |
|   export default { | |
|     props: { | |
|       data: { | |
|         type: Object, | |
|         default() { | |
|           return {} | |
|         } | |
|       }, | |
|       style: { | |
|         type: String, | |
|         default: '' | |
|       } | |
|     }, | |
|     computed: { | |
|       product() { | |
|         return this.data?.product || {} | |
|       }, | |
|       tagList() { | |
|         const { tagDetails } = this.product || {} | |
| 
 | |
|         return tagDetails?.length ? tagDetails.split('、') : [] | |
|       }, | |
|       productPackage() { | |
|         const { time, product } = this.data || {} | |
|         const { dateList } = product || {} | |
| 
 | |
|         return dateList?.find?.(item => item.id === time) || {} | |
|       }, | |
|       days() { | |
|         console.log('productPackage', this.productPackage) | |
|         const { startDate, endDate } = this.productPackage | |
| 
 | |
|         return this.$dayjs(endDate).diff(this.$dayjs(startDate), 'day') | |
|       }, | |
|     }, | |
|     watch: { | |
|       data: { | |
|         handler(val) { | |
|           console.log('watch data', val) | |
|         }, | |
|         deep: true, | |
|         immediate: true | |
|       }, | |
|     }, | |
|   } | |
| </script> | |
| 
 | |
| <style scoped lang="scss"> | |
| 
 | |
|   .card { | |
|     width: 100%; | |
|     padding: 32rpx; | |
|     font-family: PingFang SC; | |
|     font-weight: 400; | |
|     line-height: 1.4; | |
|     box-sizing: border-box; | |
|     background: #FFFFFF; | |
|     border-radius: 24rpx; | |
| 
 | |
|     &-header { | |
|       font-family: PingFang SC; | |
|       font-weight: 500; | |
|       font-size: 32rpx; | |
|       line-height: 1.4; | |
|       color: #181818; | |
|     } | |
| 
 | |
|     &-content { | |
|     } | |
|   } | |
| 
 | |
|   .row { | |
|     margin-top: 16rpx; | |
|   } | |
| 
 | |
| 
 | |
|   .desc { | |
|     font-size: 26rpx; | |
|     white-space: pre-wrap; | |
|     color: #8B8B8B; | |
|   } | |
| 
 | |
|   .tags { | |
|     justify-content: flex-start; | |
|     flex-wrap: wrap; | |
|     gap: 16rpx; | |
| 
 | |
|     .tag { | |
|       padding: 2rpx 14rpx; | |
|       font-family: PingFang SC; | |
|       font-weight: 400; | |
|       font-size: 24rpx; | |
|       line-height: 1.4; | |
|       color: #00A9FF; | |
|       background: #E9F8FF; | |
|       border: 2rpx solid #00A9FF; | |
|       border-radius: 8rpx; | |
|     } | |
|   } | |
| 
 | |
|   .time { | |
|     justify-content: space-between; | |
| 
 | |
|     &-item { | |
|       &-value { | |
|         font-size: 32rpx; | |
|         font-weight: 500; | |
|         color: #000000; | |
|       } | |
| 
 | |
|       &-label { | |
|         margin-top: 4rpx; | |
|         font-size: 26rpx; | |
|         color: #8B8B8B; | |
|       } | |
|     } | |
| 
 | |
|     &-total { | |
|       &-line { | |
|         width: 64rpx; | |
|         height: 2rpx; | |
|         background: #8B8B8B; | |
|       } | |
| 
 | |
|       &-value { | |
|         padding: 6rpx 22rpx; | |
|         font-size: 26rpx; | |
|         color: #8B8B8B; | |
|         border: 2rpx solid #8B8B8B; | |
|         border-radius: 26rpx; | |
|       } | |
|     } | |
|   } | |
| </style> |