|                                                                                                                                                                                                                                                                                                                                                                                                |  | <template>  <view class="page__view">
    <view class="main">		  <navbar title="活动详情" leftClick @leftClick="$utils.navigateBack" color="#191919" bgColor="transparent" />
      <view class="swiper">        <uv-swiper           :list="bannerList"           keyName="image"          indicator           indicatorMode="dot"          indicatorInactiveColor="rgba(255, 255, 255, 0.7)"           height="680rpx"         ></uv-swiper>      </view>
      <view class="summary">        <view class="card info">          <view class="card-header">{{ detail.title }}</view>          <view class="card-content">            <view class="desc">{{ detail.brief }}</view>            <view class="flex tags" v-if="tagList.length">              <view class="tag" v-for="(tag, tIdx) in tagList" :key="tIdx">                {{ tag }}              </view>            </view>            <view class="flex data">              <view class="flex price">                <view class="price-val">                  <text>¥</text>                  <text class="highlight">{{ priceInt }}</text>                  <text>{{ `${priceFrac}起` }}</text>                </view>                <view class="price-bef" v-if="detail.priceOrigin">¥<text>{{ detail.priceOrigin }}</text></view>              </view>              <view class="registered" v-if="detail.applyNum">                {{ `${detail.applyNum}人已报名` }}              </view>            </view>          </view>        </view>
        <view class="card">          <view class="card-header">选择团期</view>          <view class="card-content">            <timeOptionsSelect v-model="selectTime" :options="detail.dateList"></timeOptionsSelect>          </view>        </view>
        <view class="card comment">          <view class="flex card-header">            <view>评论</view>            <button class="flex btn" @click="jumpToCommentRecords">              <view>查看全部</view>              <image class="img" src="@/static/image/icon-arrow-right.png" mode="widthFix"></image>            </button>          </view>          <view class="card-content">            <commentList :list="commentList"></commentList>          </view>        </view>      </view>            <!-- <uv-sticky bgColor="#F3F3F3"> -->        <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>      <!-- </uv-sticky> -->      <view class="detail" v-if="displayContent">  			<uv-parse :content="displayContent"></uv-parse>      </view>
    </view>
		<view class="flex bottom">      <button plain class="flex flex-column btn btn-simple" open-type="contact">        <image class="icon" src="@/pages_order/static/product/icon-service.png" mode="widthFix"></image>        <view>客服</view>      </button>      <view class="flex operate">        <button class="flex btn btn-palin" @click="onCollect">{{ isCollected ? '移除收藏' : '收藏' }}</button>        <button class="flex btn btn-primary" @click="onBuy">立即购买</button>      </view>    </view>
    <orderInfoPopup ref="orderInfoPopup" :data="detail" @timeChange="selectTime = $event"></orderInfoPopup>
  </view></template>
<script>  import timeOptionsSelect from '@/pages_order/order/orderConfirm/timeOptionsSelect.vue'  import commentList from './commentList.vue'  import orderInfoPopup from '@/pages_order/order/orderConfirm/infoPopup.vue'
  export default {    components: {      timeOptionsSelect,      commentList,      orderInfoPopup,    },    data() {      return {        id: null,        detail: {},        next: 'createOrder', // createOrder | addCart
        commentList: [],        tabs: [          { name: '行程亮点' },          { name: '课程目标' },          { name: '详细行程' },        ],        current: 0,        selectTime: null,      }    },    computed: {			bannerList() {				const { image } = this.detail
				if (!image) {					return []				}
				return Array.isArray(image) ? image : image.split(',')			},      tagList() {        const { tagDetails } = this.detail || {}
        return tagDetails?.length ? tagDetails.split('、') : []      },      priceInt() {        return Math.floor(this.detail.priceDiscount)      },      priceFrac() {        let frac = this.detail.priceDiscount % this.priceInt        return frac > 0 ? frac.toFixed(2).slice(1) : ''      },      displayContent() {        const {          special,          target,          process,        } = this.detail
        if (this.current == 0) {          return special        } else if (this.current == 1) {          return target        } else if (this.current == 2) {          return process        }
        return ''      },      isCollected() {        return this.detail.isCollection == '1'      },    },    onLoad(arg) {      const { id } = arg
      this.id = id
      this.fetchDetail(id)      this.fetchComment(id)    },    methods: {      async fetchDetail(activityId) {
        try {          const result = await this.$fetch('queryActivityById', { activityId })
          this.detail = result        } catch (err) {
        }       },      async fetchComment(activityId) {        try {          const queryParams = {            pageNo: 1,            pageSize: 2,            activityId,          }          this.commentList = (await this.$fetch('queryCommentList', queryParams, true, null, true))?.records        } catch (err) {          console.log('fetchComment', err)        }
      },      async onCollect() {				let succ = await this.$store.dispatch('collect', this.id)        succ && this.fetchDetail(this.id)      },      onBuy() {        this.$refs.orderInfoPopup.open({ selectTime: this.selectTime })      },      jumpToCommentRecords() {        this.$utils.navigateTo(`/pages_order/comment/commentRecordsOfProduct?id=${this.id}`)      },			//点击tab栏
			clickTabs({ index }) {        this.current = index			},    },  }</script>
<style scoped lang="scss">  .page__view {    width: 100vw;    min-height: 100vh;	  background: linear-gradient(#DAF3FF, #F3F3F3 500rpx, #F3F3F3);    position: relative;  }
  .main {    width: 100vw;    // padding: calc(var(--status-bar-height) + 120rpx) 0 198rpx 0;
    padding-bottom: 198rpx;    box-sizing: border-box;	}
  .swiper {    /deep/ .uv-swiper-indicator__wrapper__dot,    /deep/ .uv-swiper-indicator__wrapper__dot--active {      width: 30rpx;    }
    /deep/ .uv-swiper-indicator__wrapper__dot--active {      background: linear-gradient(to right, #21FEEC, #019AF9);    }  }
  .summary {    width: 100%;    padding: 40rpx 32rpx;    box-sizing: border-box;  }
  .card {    width: 100%;    padding: 32rpx;    box-sizing: border-box;    background: #FFFFFF;    border-radius: 24rpx;
    & + & {      margin-top: 40rpx;    }
    &-header {      font-family: PingFang SC;      font-weight: 500;      font-size: 32rpx;      line-height: 1.4;      color: #181818;    }
    &-content {      margin-top: 16rpx;    }
    &.info {
      .desc {        font-size: 26rpx;        white-space: pre-wrap;        color: #8B8B8B;      }
      .tags {        margin-top: 16rpx;        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;        }      }
      .data {        margin-top: 16rpx;        justify-content: space-between;      }
      .price {        justify-content: flex-start;        align-items: baseline;        column-gap: 6rpx;
        &-val {          font-size: 24rpx;          font-weight: 500;          color: #FF4800;
          .highlight {            font-size: 48rpx;          }        }
        &-bef {          text-decoration: line-through;          font-size: 24rpx;          color: #8B8B8B;        }      }
      .registered {        padding: 2rpx 10rpx;        font-weight: 500;        font-size: 30rpx;        color: #FF4800;        border: 2rpx solid #FF4800;        border-radius: 4rpx;      }
    }
    &.comment {
      .card-header {        justify-content: space-between;      }
			.btn {				column-gap: 4rpx;				font-size: 24rpx;				color: #8B8B8B;
				.img {					width: 32rpx;					height: auto;				}			}    }
  }
  .detail {    // font-size: 0;
  }
	.bottom {		position: fixed;		left: 0;		bottom: 0;    z-index: 999;    justify-content: space-between;    column-gap: 16rpx;		width: 100vw;		// height: 198rpx;
		padding: 24rpx 40rpx 0 40rpx;		padding-bottom: calc(env(safe-area-inset-bottom) + 24rpx);		background: #FFFFFF;		box-sizing: border-box;
    .btn-simple {      border: none;      font-family: PingFang SC;      font-weight: 400;      font-size: 22rpx;      line-height: 1.1;      color: #999999;
      .icon {        width: 52rpx;        height: auto;        margin-bottom: 4rpx;      }    }
    .operate {      justify-content: flex-end;      column-gap: 16rpx;            .btn {        font-size: 36rpx;        font-weight: 500;        border-radius: 41rpx;        line-height: 1.4;
        &-palin {          padding: 14rpx 46rpx;          color: #252545;          border: 2rpx solid #252545;        }
        &-primary {          padding: 14rpx 62rpx;          color: #FFFFFF;          background: linear-gradient(to right, #21FEEC, #019AF9);          border: 2rpx solid #00A9FF;        }      }
    }	}
</style>
 |