| <template> | |
|   <view class="page__view highlight"> | |
| 
 | |
|     <!-- 导航栏 --> | |
| 		<navbar title="活动详情" leftClick @leftClick="$utils.navigateBack" /> | |
| 
 | |
|     <view class="tabs"> | |
|       <uv-tabs  | |
|         :list="tabs"  | |
|         :scrollable="false"  | |
|         lineColor="#00A9FF" | |
|         lineWidth="48rpx" | |
|         lineHeight="4rpx" | |
|         :activeStyle="{ | |
|           'font-family': 'PingFang SC', | |
|           'font-weight': 500, | |
|           'font-size': '32rpx', | |
|           'line-height': 1.4, | |
|           'color': '#00A9FF', | |
|         }"  | |
|         :inactiveStyle="{ | |
|           'font-family': 'PingFang SC', | |
|           'font-weight': 400, | |
|           'font-size': '32rpx', | |
|           'line-height': 1.4, | |
|           'color': '#191919', | |
|         }"  | |
|         @click="clickTabs" | |
|       ></uv-tabs> | |
|     </view> | |
| 
 | |
|     <scroll-view type="custom" scroll-y="true" :scroll-into-view="scrollIntoView" class="scroll-view"> | |
|       <view class="scroll-view-content"> | |
| 
 | |
|         <view class="cover-img"> | |
|           <image class="img" src="@/static/image/temp-20.png" mode="aspectFill"></image> | |
|         </view> | |
| 
 | |
|         <view class="section" id="highlights"> | |
|           <view class="flex section-header"> | |
|             <view class="flex"> | |
|               <view class="flex icon"> | |
|                 <image class="img" src="@/static/image/icon-mark.png" mode="widthFix"></image> | |
|               </view> | |
|               <view>活动掠影</view> | |
|             </view> | |
|             <view class="btn btn-mark" @click="onMark">标记有我</view> | |
|           </view> | |
|           <view class="section-content highlights"> | |
|             <view class="highlights-item" v-for="(image, idx) in detail.highlights" :key="idx"> | |
|               <image class="img" :src="image" mode="scaleToFill"></image> | |
|             </view> | |
|           </view> | |
|         </view> | |
| 
 | |
|         <view class="section" id="thoughts"> | |
|           <view class="section-header">学员心得</view> | |
|           <view class="section-content thoughts"> | |
|             <view class="card" v-for="item in detail.thoughts" :key="item.id"> | |
|               <commentCard :data="item" @change="onCommentChange"></commentCard> | |
|             </view> | |
|           </view> | |
|         </view> | |
|  | |
|         <view class="section report" id="report"> | |
|           <view class="section-header">行后报告</view> | |
|           <view class="section-content report"> | |
|             <!-- todo --> | |
|           </view> | |
|         </view> | |
|  | |
|       </view> | |
|  | |
|     </scroll-view> | |
|  | |
|     <markPopup ref="markPopup"></markPopup> | |
|      | |
| 		<view class="flex bottom"> | |
|       <button class="flex btn btn-palin" @click="jumpToPoster">生成海报</button> | |
|       <button class="flex btn btn-primary" @click="onApplyEmail">申请邮件</button> | |
|     </view> | |
|   </view> | |
| </template> | |
|  | |
| <script> | |
|   import commentCard from '@/pages_order/comment/commentCard.vue' | |
|   import markPopup from '@/pages_order/growing/activity/markPopup.vue' | |
|  | |
|   export default { | |
|     components: { | |
|       commentCard, | |
|       markPopup, | |
|     }, | |
|     data() { | |
|       return { | |
|         id: null, | |
|         tabs: [ | |
|           { id: 'highlights', name: '活动掠影' }, | |
|           { id: 'thoughts', name: '学员心得' }, | |
|           { id: 'report', name: '行后报告' }, | |
|         ], | |
|         current: 0, | |
|         detail: {}, | |
|         scrollIntoView: null, | |
|       } | |
|     }, | |
|     onLoad(arg) { | |
|       const { id } = arg | |
|       this.id = id | |
|  | |
|       this.getData() | |
|     }, | |
|     methods: { | |
|       async getData() { | |
|  | |
|         try { | |
|           const result = await this.$fetch('queryExperienceById', { recordId: this.id }) | |
|           const { image, thoughts } = result | |
|            | |
|           this.detail = { | |
|             highlights: image?.split?.(',') || [], | |
|             // todo: check key | |
|             thoughts, | |
|             // todo: check key about "行后报告" | |
|           } | |
|         } catch (err) { | |
|  | |
|         } | |
|  | |
|         return | |
|         // todo | |
|  | |
|         this.detail = { | |
|           highlights: [ | |
|             '/pages_order/static/temp-38.png', | |
|             '/pages_order/static/temp-38.png', | |
|             '/pages_order/static/temp-38.png', | |
|             '/pages_order/static/temp-38.png', | |
|             '/pages_order/static/temp-38.png', | |
|             '/pages_order/static/temp-38.png', | |
|             '/pages_order/static/temp-38.png', | |
|             '/pages_order/static/temp-38.png', | |
|             '/pages_order/static/temp-38.png', | |
|           ], | |
|           thoughts: [], | |
|         } | |
|       }, | |
| 			//点击tab栏 | |
| 			clickTabs({ index }) { | |
|         this.current = index | |
|         this.scrollIntoView = this.tabs[this.current].id | |
| 			}, | |
|       onCommentChange() { | |
|         // todo: refresh comment list | |
|       }, | |
|       jumpToPoster() { | |
|         // todo | |
|       }, | |
|       onApplyEmail() { | |
| 			  this.$utils.navigateTo(`/pages_order/growing/activity/applyEmail?id=${this.id}`) | |
|       }, | |
|       onMark() { | |
|         this.$refs.markPopup.open(this.id) | |
|       }, | |
|     }, | |
|   } | |
| </script> | |
|  | |
| <style scoped lang="scss"> | |
| 
 | |
|   .tabs { | |
|     background: #D8F2FF; | |
|   } | |
| 
 | |
|   .scroll-view { | |
|     $tab-height: 44px; | |
|     $bottom-height: 73px; | |
|     height: calc(100vh - env(safe-area-inset-bottom) - #{$bottom-height} - #{$tab-height} - #{$navbar-height} - var(--status-bar-height) - 20rpx); | |
| 
 | |
|     &-content { | |
|       padding: 32rpx; | |
|     } | |
|   } | |
| 
 | |
|   .cover-img { | |
|     width: 100%; | |
|     height: 348rpx; | |
|     border-radius: 12rpx; | |
|     overflow: hidden; | |
| 
 | |
|     .img { | |
|       width: 100%; | |
|       height: 100%; | |
|     } | |
|   } | |
| 
 | |
|   .section { | |
|     margin-top: 32rpx; | |
| 
 | |
|     &-header { | |
|       justify-content: space-between; | |
|       font-size: 36rpx; | |
|       font-weight: 600; | |
|       color: #080808; | |
| 
 | |
|       .icon { | |
|         margin-right: 24rpx; | |
|         width: 36rpx; | |
|         height: 36rpx; | |
|         background: #080808; | |
|         border-radius: 50%; | |
|         overflow: hidden; | |
|        | |
|         .img { | |
|           width: 24rpx; | |
|           height: auto; | |
|         } | |
|       } | |
| 
 | |
|       .btn-mark { | |
|         padding: 6rpx 22rpx; | |
|         font-family: PingFang SC; | |
|         font-size: 28rpx; | |
|         font-weight: 500; | |
|         line-height: 1.5; | |
|         color: #FFFFFF; | |
|         background: linear-gradient(to right, #21FEEC, #019AF9); | |
|         border: 2rpx solid #00A9FF; | |
|         border-radius: 30rpx; | |
|       }  | |
|     } | |
| 
 | |
|     &-content { | |
| 
 | |
|     } | |
|   } | |
| 
 | |
|   .highlights { | |
|     margin-top: 18rpx; | |
|     display: grid; | |
|     grid-template-columns: repeat(3, 1fr); | |
|     gap: 16rpx; | |
| 
 | |
|     &-item { | |
|       min-width: 0; | |
|       border: 2rpx solid #CDCDCD; | |
|       border-radius: 12rpx; | |
|       overflow: hidden; | |
| 
 | |
|       .img { | |
|         width: 100%; | |
|         height: 304rpx; | |
|       } | |
|     } | |
|   } | |
| 
 | |
|   .thoughts { | |
|     margin-top: 24rpx; | |
| 
 | |
|     .card + .card { | |
|       margin-top: 24rpx; | |
|     } | |
|   } | |
| 
 | |
|   .report { | |
|     margin-top: 24rpx; | |
|   } | |
| 
 | |
| 	.bottom { | |
| 		position: fixed; | |
| 		left: 0; | |
| 		bottom: 0; | |
|     z-index: 999; | |
|     justify-content: space-between; | |
|     column-gap: 32rpx; | |
| 		width: 100vw; | |
| 		padding: 32rpx 40rpx; | |
| 		padding-bottom: calc(env(safe-area-inset-bottom) + 32rpx); | |
| 		background: #FFFFFF; | |
| 		box-sizing: border-box; | |
| 
 | |
|     .btn { | |
|       flex: 1; | |
|       font-size: 36rpx; | |
|       font-weight: 500; | |
|       border-radius: 41rpx; | |
|       line-height: 1.4; | |
| 
 | |
|       &-palin { | |
|         padding: 14rpx 0; | |
|         color: #252545; | |
|         border: 2rpx solid #252545; | |
|       } | |
| 
 | |
|       &-primary { | |
|         padding: 14rpx 0; | |
|         color: #FFFFFF; | |
|         background: linear-gradient(to right, #21FEEC, #019AF9); | |
|         border: 2rpx solid #00A9FF; | |
|       } | |
|     } | |
| 
 | |
| 	} | |
| </style> |