|  | @@ -1,431 +1,446 @@
 | 
	
		
			
				|  |  | -import request from '@/helpers/request'
 | 
	
		
			
				|  |  | -import { browser, moneyFormat } from '@/helpers/utils'
 | 
	
		
			
				|  |  | -import {
 | 
	
		
			
				|  |  | -  Swipe,
 | 
	
		
			
				|  |  | -  SwipeItem,
 | 
	
		
			
				|  |  | -  Image,
 | 
	
		
			
				|  |  | -  CellGroup,
 | 
	
		
			
				|  |  | -  Cell,
 | 
	
		
			
				|  |  | -  ImagePreview,
 | 
	
		
			
				|  |  | -  RadioGroup,
 | 
	
		
			
				|  |  | -  Radio,
 | 
	
		
			
				|  |  | -  Tag,
 | 
	
		
			
				|  |  | -  Row,
 | 
	
		
			
				|  |  | -  Col,
 | 
	
		
			
				|  |  | -  Sticky,
 | 
	
		
			
				|  |  | -  ActionBar,
 | 
	
		
			
				|  |  | -  ActionBarButton,
 | 
	
		
			
				|  |  | -  ActionBarIcon,
 | 
	
		
			
				|  |  | -  Icon,
 | 
	
		
			
				|  |  | -  Badge,
 | 
	
		
			
				|  |  | -  Toast,
 | 
	
		
			
				|  |  | -  Popup,
 | 
	
		
			
				|  |  | -  SubmitBar,
 | 
	
		
			
				|  |  | -  Card
 | 
	
		
			
				|  |  | -} from 'vant'
 | 
	
		
			
				|  |  | -import { defineComponent } from 'vue'
 | 
	
		
			
				|  |  | -import styles from './index.module.less'
 | 
	
		
			
				|  |  | -import iconShopCart from '../images/icon-shop-cart.png'
 | 
	
		
			
				|  |  | -import AddGoodsCart from '../modal/add-goods-cart'
 | 
	
		
			
				|  |  | -import ColHeader from '@/components/col-header'
 | 
	
		
			
				|  |  | -import iconShare from '../images/icon-share.svg'
 | 
	
		
			
				|  |  | -import ColShare from '@/components/col-share'
 | 
	
		
			
				|  |  | -import { state } from '@/state'
 | 
	
		
			
				|  |  | -import { useEventTracking } from '@/helpers/hooks'
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -export default defineComponent({
 | 
	
		
			
				|  |  | -  name: 'goods-detail',
 | 
	
		
			
				|  |  | -  data() {
 | 
	
		
			
				|  |  | -    const query = this.$route.query
 | 
	
		
			
				|  |  | -    return {
 | 
	
		
			
				|  |  | -      id: query.id,
 | 
	
		
			
				|  |  | -      albumPics: [] as any[],
 | 
	
		
			
				|  |  | -      product: {} as Record<string | number | symbol, any>,
 | 
	
		
			
				|  |  | -      radio: 0,
 | 
	
		
			
				|  |  | -      skuStockListTemp: [],
 | 
	
		
			
				|  |  | -      detailMobileHtml: '',
 | 
	
		
			
				|  |  | -      loading: false,
 | 
	
		
			
				|  |  | -      addGoodsShow: false,
 | 
	
		
			
				|  |  | -      selectGoodsItem: {},
 | 
	
		
			
				|  |  | -      cartCount: 0,
 | 
	
		
			
				|  |  | -      showType: 'cart',
 | 
	
		
			
				|  |  | -      shareShow: false // 分享弹窗
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  computed: {
 | 
	
		
			
				|  |  | -    skuStockList() {
 | 
	
		
			
				|  |  | -      // 处理规格
 | 
	
		
			
				|  |  | -      const product = this.product
 | 
	
		
			
				|  |  | -      const skuStockList: any =
 | 
	
		
			
				|  |  | -        this.skuStockListTemp.length > 0
 | 
	
		
			
				|  |  | -          ? this.skuStockListTemp
 | 
	
		
			
				|  |  | -          : [
 | 
	
		
			
				|  |  | -              {
 | 
	
		
			
				|  |  | -                id: -1,
 | 
	
		
			
				|  |  | -                price: product.price,
 | 
	
		
			
				|  |  | -                pic: product.pic,
 | 
	
		
			
				|  |  | -                stock: product.stock,
 | 
	
		
			
				|  |  | -                spData: null
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | -            ]
 | 
	
		
			
				|  |  | -      skuStockList.forEach((item: any) => {
 | 
	
		
			
				|  |  | -        if (item.spData) {
 | 
	
		
			
				|  |  | -          const spData = JSON.parse(item.spData)
 | 
	
		
			
				|  |  | -          item.spDataJson = spData.reduce((spDataJson, value) => {
 | 
	
		
			
				|  |  | -            spDataJson += value.value
 | 
	
		
			
				|  |  | -            return spDataJson
 | 
	
		
			
				|  |  | -          }, '')
 | 
	
		
			
				|  |  | -          item.sku = spData
 | 
	
		
			
				|  |  | -            .reduce((sku, value) => {
 | 
	
		
			
				|  |  | -              sku.push(`${value.key}: ${value.value}`)
 | 
	
		
			
				|  |  | -              return sku
 | 
	
		
			
				|  |  | -            }, [])
 | 
	
		
			
				|  |  | -            .join(',')
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -          item.spDataJson = '默认'
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      })
 | 
	
		
			
				|  |  | -      return skuStockList
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    getPrice() {
 | 
	
		
			
				|  |  | -      let item = this.skuStockList.filter(n => n.id == this.radio) as any
 | 
	
		
			
				|  |  | -      if (item && Array.isArray(item) && item.length) {
 | 
	
		
			
				|  |  | -        return item[0].price
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      return 0
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    shareUrl() {
 | 
	
		
			
				|  |  | -      // 分享链接
 | 
	
		
			
				|  |  | -      const productId = this.product.id as any
 | 
	
		
			
				|  |  | -      if (browser().isApp) {
 | 
	
		
			
				|  |  | -        return `${location.origin}/teacher/#/shareMall?bizId=${productId}&userId=${state.user.data.userId}&userType=${state.platformType}`
 | 
	
		
			
				|  |  | -      } else {
 | 
	
		
			
				|  |  | -        return `${location.origin}/teacher.html#/shareMall?bizId=${productId}&userId=${state.user.data.userId}&userType=${state.platformType}`
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  async mounted() {
 | 
	
		
			
				|  |  | -    try {
 | 
	
		
			
				|  |  | -      this.loading = true
 | 
	
		
			
				|  |  | -      const res = await request.get(
 | 
	
		
			
				|  |  | -        `/api-mall-portal/product/detail/${this.id}`
 | 
	
		
			
				|  |  | -      )
 | 
	
		
			
				|  |  | -      this.loading = false
 | 
	
		
			
				|  |  | -      const result = res.data || {}
 | 
	
		
			
				|  |  | -      this.albumPics = [result.product.pic]
 | 
	
		
			
				|  |  | -        .concat(result.product.albumPics.split(','))
 | 
	
		
			
				|  |  | -        .filter(n => n)
 | 
	
		
			
				|  |  | -      this.product = result.product
 | 
	
		
			
				|  |  | -      this.skuStockListTemp = result.skuStockList || []
 | 
	
		
			
				|  |  | -      if (this.skuStockListTemp.length) {
 | 
	
		
			
				|  |  | -        let len = this.skuStockListTemp.length
 | 
	
		
			
				|  |  | -        for (let i = 0; i < len; i++) {
 | 
	
		
			
				|  |  | -          let item = this.skuStockListTemp[i] as any
 | 
	
		
			
				|  |  | -          if (item.stock >= 0) {
 | 
	
		
			
				|  |  | -            this.radio = item.id
 | 
	
		
			
				|  |  | -            break
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      this.detailMobileHtml = result.product.detailMobileHtml
 | 
	
		
			
				|  |  | -    } catch {}
 | 
	
		
			
				|  |  | -    this.getCartCount()
 | 
	
		
			
				|  |  | -    useEventTracking('商品详情')
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  methods: {
 | 
	
		
			
				|  |  | -    onPreview(index: number) {
 | 
	
		
			
				|  |  | -      // 图片预览
 | 
	
		
			
				|  |  | -      ImagePreview({
 | 
	
		
			
				|  |  | -        images: this.albumPics,
 | 
	
		
			
				|  |  | -        startPosition: index,
 | 
	
		
			
				|  |  | -        closeable: true,
 | 
	
		
			
				|  |  | -        className: styles.imagesOverlayWrap
 | 
	
		
			
				|  |  | -      })
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    onShowImg(target: any) {
 | 
	
		
			
				|  |  | -      const { localName } = target.srcElement
 | 
	
		
			
				|  |  | -      if (localName !== 'img') {
 | 
	
		
			
				|  |  | -        return
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      let startPosition = 0
 | 
	
		
			
				|  |  | -      const domList = document.querySelectorAll('.msgWrap img')
 | 
	
		
			
				|  |  | -      let imgList = Array.from(domList).map((item: any, index: number) => {
 | 
	
		
			
				|  |  | -        if (target.srcElement == item) {
 | 
	
		
			
				|  |  | -          startPosition = index
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        return item.src
 | 
	
		
			
				|  |  | -      })
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      ImagePreview({
 | 
	
		
			
				|  |  | -        images: imgList,
 | 
	
		
			
				|  |  | -        startPosition: startPosition,
 | 
	
		
			
				|  |  | -        closeable: true,
 | 
	
		
			
				|  |  | -        className: styles.imagesOverlayWrap
 | 
	
		
			
				|  |  | -      })
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    onShowCart(type = 'cart') {
 | 
	
		
			
				|  |  | -      this.selectGoodsItem = {
 | 
	
		
			
				|  |  | -        price: this.product.pic,
 | 
	
		
			
				|  |  | -        stock: this.product.stock,
 | 
	
		
			
				|  |  | -        skuStockList: this.skuStockListTemp.length
 | 
	
		
			
				|  |  | -          ? this.skuStockListTemp
 | 
	
		
			
				|  |  | -          : undefined,
 | 
	
		
			
				|  |  | -        brandName: this.product.brandName,
 | 
	
		
			
				|  |  | -        productCategoryId: this.product.productCategoryId,
 | 
	
		
			
				|  |  | -        name: this.product.name,
 | 
	
		
			
				|  |  | -        productSn: this.product.productSn,
 | 
	
		
			
				|  |  | -        productSubTitle: this.product.subTitle,
 | 
	
		
			
				|  |  | -        id: this.product.id
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      this.showType = type
 | 
	
		
			
				|  |  | -      // 打开购物弹框
 | 
	
		
			
				|  |  | -      this.addGoodsShow = true
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    onBuy() {
 | 
	
		
			
				|  |  | -      // 购买
 | 
	
		
			
				|  |  | -      if (!this.radio) {
 | 
	
		
			
				|  |  | -        return Toast('请选择规格')
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      console.log(true)
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    async getCartCount() {
 | 
	
		
			
				|  |  | -      try {
 | 
	
		
			
				|  |  | -        let { code, data } = await request.get('/api-mall-portal/cart/list')
 | 
	
		
			
				|  |  | -        if (code === 200) {
 | 
	
		
			
				|  |  | -          this.cartCount = data.length
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      } catch (err) {}
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  render() {
 | 
	
		
			
				|  |  | -    const product = this.product
 | 
	
		
			
				|  |  | -    const selectSku = this.skuStockList.find((n: any) => n.id === this.radio)
 | 
	
		
			
				|  |  | -    const sharePic = this.product.pic + '?v=' + Date.now()
 | 
	
		
			
				|  |  | -    return (
 | 
	
		
			
				|  |  | -      <div class={styles.goodsDetail}>
 | 
	
		
			
				|  |  | -        <ColHeader
 | 
	
		
			
				|  |  | -          v-slots={{
 | 
	
		
			
				|  |  | -            right: () => (
 | 
	
		
			
				|  |  | -              <div
 | 
	
		
			
				|  |  | -                class={styles.shareBtn}
 | 
	
		
			
				|  |  | -                onClick={() => (this.shareShow = true)}
 | 
	
		
			
				|  |  | -              >
 | 
	
		
			
				|  |  | -                <Icon name={iconShare} size={14} color="#666" />
 | 
	
		
			
				|  |  | -                <span style={{ marginLeft: '3px' }}>分享</span>
 | 
	
		
			
				|  |  | -              </div>
 | 
	
		
			
				|  |  | -            )
 | 
	
		
			
				|  |  | -          }}
 | 
	
		
			
				|  |  | -        />
 | 
	
		
			
				|  |  | -        <Swipe
 | 
	
		
			
				|  |  | -          class={styles.swipe}
 | 
	
		
			
				|  |  | -          lazyRender
 | 
	
		
			
				|  |  | -          v-slots={{
 | 
	
		
			
				|  |  | -            indicator: (item: any) =>
 | 
	
		
			
				|  |  | -              item.total > 1 && (
 | 
	
		
			
				|  |  | -                <div class={styles['custom-indicator']}>
 | 
	
		
			
				|  |  | -                  {(item.active || 0) + 1} / {item.total}
 | 
	
		
			
				|  |  | -                </div>
 | 
	
		
			
				|  |  | -              )
 | 
	
		
			
				|  |  | -          }}
 | 
	
		
			
				|  |  | -        >
 | 
	
		
			
				|  |  | -          {this.albumPics.map((item: string, index: number) => (
 | 
	
		
			
				|  |  | -            <SwipeItem>
 | 
	
		
			
				|  |  | -              <Image
 | 
	
		
			
				|  |  | -                class={styles.swipeItemImg}
 | 
	
		
			
				|  |  | -                src={item}
 | 
	
		
			
				|  |  | -                onClick={() => this.onPreview(index)}
 | 
	
		
			
				|  |  | -                fit="cover"
 | 
	
		
			
				|  |  | -              />
 | 
	
		
			
				|  |  | -            </SwipeItem>
 | 
	
		
			
				|  |  | -          ))}
 | 
	
		
			
				|  |  | -        </Swipe>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        <CellGroup border={false} class={[styles.goodsHead, 'mb12']}>
 | 
	
		
			
				|  |  | -          <Cell
 | 
	
		
			
				|  |  | -            center
 | 
	
		
			
				|  |  | -            border={false}
 | 
	
		
			
				|  |  | -            v-slots={{
 | 
	
		
			
				|  |  | -              title: () => (
 | 
	
		
			
				|  |  | -                <div class={styles.priceGroup}>
 | 
	
		
			
				|  |  | -                  <span class={styles.price}>
 | 
	
		
			
				|  |  | -                    <i>¥</i>
 | 
	
		
			
				|  |  | -                    {moneyFormat(this.getPrice)}
 | 
	
		
			
				|  |  | -                  </span>
 | 
	
		
			
				|  |  | -                  {/* <del class={styles.delPrice}>
 | 
	
		
			
				|  |  | -                    ¥{moneyFormat(product.originalPrice)}
 | 
	
		
			
				|  |  | -                  </del> */}
 | 
	
		
			
				|  |  | -                </div>
 | 
	
		
			
				|  |  | -              )
 | 
	
		
			
				|  |  | -              // default: () => <div class={styles.stock}>销量4件</div>
 | 
	
		
			
				|  |  | -            }}
 | 
	
		
			
				|  |  | -          />
 | 
	
		
			
				|  |  | -          <Cell
 | 
	
		
			
				|  |  | -            center
 | 
	
		
			
				|  |  | -            border={false}
 | 
	
		
			
				|  |  | -            title={product.name}
 | 
	
		
			
				|  |  | -            titleClass={[styles.goodsName, 'van-ellipsis']}
 | 
	
		
			
				|  |  | -          />
 | 
	
		
			
				|  |  | -        </CellGroup>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        <Row class={[styles.row, 'mb12']}>
 | 
	
		
			
				|  |  | -          <Col span={4} class={styles.col}>
 | 
	
		
			
				|  |  | -            规格
 | 
	
		
			
				|  |  | -          </Col>
 | 
	
		
			
				|  |  | -          <Col span={20}>
 | 
	
		
			
				|  |  | -            {selectSku ? (
 | 
	
		
			
				|  |  | -              <div class={styles.selectWrap}>
 | 
	
		
			
				|  |  | -                {selectSku.stock <= 0
 | 
	
		
			
				|  |  | -                  ? `当前款式暂时缺货`
 | 
	
		
			
				|  |  | -                  : `已选择 ${selectSku.spDataJson}`}
 | 
	
		
			
				|  |  | -              </div>
 | 
	
		
			
				|  |  | -            ) : (
 | 
	
		
			
				|  |  | -              <div>请选择 规格</div>
 | 
	
		
			
				|  |  | -            )}
 | 
	
		
			
				|  |  | -            <RadioGroup
 | 
	
		
			
				|  |  | -              class={styles['radio-group']}
 | 
	
		
			
				|  |  | -              modelValue={this.radio}
 | 
	
		
			
				|  |  | -              onUpdate:modelValue={val => (this.radio = val)}
 | 
	
		
			
				|  |  | -            >
 | 
	
		
			
				|  |  | -              {this.skuStockList.map((item: any) => {
 | 
	
		
			
				|  |  | -                const isActive = item.id === this.radio
 | 
	
		
			
				|  |  | -                const type = isActive ? 'primary' : 'default'
 | 
	
		
			
				|  |  | -                return (
 | 
	
		
			
				|  |  | -                  <Badge
 | 
	
		
			
				|  |  | -                    position="top-right"
 | 
	
		
			
				|  |  | -                    content={item.stock <= 0 ? '缺货' : ''}
 | 
	
		
			
				|  |  | -                    color={'#999999'}
 | 
	
		
			
				|  |  | -                    class={styles.badge}
 | 
	
		
			
				|  |  | -                    offset={[-20, 0]}
 | 
	
		
			
				|  |  | -                  >
 | 
	
		
			
				|  |  | -                    <Radio
 | 
	
		
			
				|  |  | -                      class={styles.radio}
 | 
	
		
			
				|  |  | -                      name={item.id}
 | 
	
		
			
				|  |  | -                      disabled={item.stock <= 0}
 | 
	
		
			
				|  |  | -                      onClick={() => {
 | 
	
		
			
				|  |  | -                        // 判断是否有库存
 | 
	
		
			
				|  |  | -                        if (item.stock <= 0) {
 | 
	
		
			
				|  |  | -                          return
 | 
	
		
			
				|  |  | -                        }
 | 
	
		
			
				|  |  | -                        this.radio = item.id
 | 
	
		
			
				|  |  | -                      }}
 | 
	
		
			
				|  |  | -                    >
 | 
	
		
			
				|  |  | -                      <Tag size="large" plain={isActive} type={type}>
 | 
	
		
			
				|  |  | -                        {item.spDataJson}
 | 
	
		
			
				|  |  | -                      </Tag>
 | 
	
		
			
				|  |  | -                    </Radio>
 | 
	
		
			
				|  |  | -                  </Badge>
 | 
	
		
			
				|  |  | -                )
 | 
	
		
			
				|  |  | -              })}
 | 
	
		
			
				|  |  | -            </RadioGroup>
 | 
	
		
			
				|  |  | -          </Col>
 | 
	
		
			
				|  |  | -        </Row>
 | 
	
		
			
				|  |  | -        {this.detailMobileHtml && (
 | 
	
		
			
				|  |  | -          <div class={[styles.section]}>
 | 
	
		
			
				|  |  | -            <div class={styles.detail}>
 | 
	
		
			
				|  |  | -              <span>图文详情</span>
 | 
	
		
			
				|  |  | -            </div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            <div
 | 
	
		
			
				|  |  | -              class={[styles.photoDetail, 'msgWrap']}
 | 
	
		
			
				|  |  | -              onClick={this.onShowImg}
 | 
	
		
			
				|  |  | -              v-html={this.detailMobileHtml}
 | 
	
		
			
				|  |  | -            ></div>
 | 
	
		
			
				|  |  | -          </div>
 | 
	
		
			
				|  |  | -        )}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        {!this.loading && (
 | 
	
		
			
				|  |  | -          <>
 | 
	
		
			
				|  |  | -            <SubmitBar
 | 
	
		
			
				|  |  | -              class={styles.actionBar}
 | 
	
		
			
				|  |  | -              safe-area-inset-bottom
 | 
	
		
			
				|  |  | -              v-slots={{
 | 
	
		
			
				|  |  | -                button: () => (
 | 
	
		
			
				|  |  | -                  <div class={styles.buyGroup}>
 | 
	
		
			
				|  |  | -                    <ActionBarButton
 | 
	
		
			
				|  |  | -                      type="primary"
 | 
	
		
			
				|  |  | -                      class={styles.addCertBtn}
 | 
	
		
			
				|  |  | -                      text="加入购物车"
 | 
	
		
			
				|  |  | -                      onClick={() => this.onShowCart()}
 | 
	
		
			
				|  |  | -                    />
 | 
	
		
			
				|  |  | -                    <ActionBarButton
 | 
	
		
			
				|  |  | -                      type="primary"
 | 
	
		
			
				|  |  | -                      text="立即购买"
 | 
	
		
			
				|  |  | -                      onClick={() => this.onShowCart('cartConfirm')}
 | 
	
		
			
				|  |  | -                    />
 | 
	
		
			
				|  |  | -                  </div>
 | 
	
		
			
				|  |  | -                )
 | 
	
		
			
				|  |  | -              }}
 | 
	
		
			
				|  |  | -            >
 | 
	
		
			
				|  |  | -              <Badge
 | 
	
		
			
				|  |  | -                content={this.cartCount}
 | 
	
		
			
				|  |  | -                showZero={false}
 | 
	
		
			
				|  |  | -                onClick={() => {
 | 
	
		
			
				|  |  | -                  this.$router.push('/cart')
 | 
	
		
			
				|  |  | -                }}
 | 
	
		
			
				|  |  | -              >
 | 
	
		
			
				|  |  | -                <Icon name={iconShopCart} size={30} />
 | 
	
		
			
				|  |  | -              </Badge>
 | 
	
		
			
				|  |  | -            </SubmitBar>
 | 
	
		
			
				|  |  | -          </>
 | 
	
		
			
				|  |  | -        )}
 | 
	
		
			
				|  |  | -        <Popup
 | 
	
		
			
				|  |  | -          show={this.addGoodsShow}
 | 
	
		
			
				|  |  | -          closeable
 | 
	
		
			
				|  |  | -          position="bottom"
 | 
	
		
			
				|  |  | -          round
 | 
	
		
			
				|  |  | -          onClose={() => {
 | 
	
		
			
				|  |  | -            this.addGoodsShow = false
 | 
	
		
			
				|  |  | -          }}
 | 
	
		
			
				|  |  | -        >
 | 
	
		
			
				|  |  | -          <AddGoodsCart
 | 
	
		
			
				|  |  | -            show={this.addGoodsShow}
 | 
	
		
			
				|  |  | -            onGetCartCount={() => this.getCartCount()}
 | 
	
		
			
				|  |  | -            item={this.selectGoodsItem}
 | 
	
		
			
				|  |  | -            defaultRadio={this.radio}
 | 
	
		
			
				|  |  | -            showType={this.showType}
 | 
	
		
			
				|  |  | -          />
 | 
	
		
			
				|  |  | -        </Popup>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        <Popup
 | 
	
		
			
				|  |  | -          style={{ background: 'transparent' }}
 | 
	
		
			
				|  |  | -          show={this.shareShow}
 | 
	
		
			
				|  |  | -          onClose={() => (this.shareShow = false)}
 | 
	
		
			
				|  |  | -        >
 | 
	
		
			
				|  |  | -          <ColShare
 | 
	
		
			
				|  |  | -            shareUrl={this.shareUrl}
 | 
	
		
			
				|  |  | -            teacherId={state.user.data.userId}
 | 
	
		
			
				|  |  | -            shareType="mall"
 | 
	
		
			
				|  |  | -          >
 | 
	
		
			
				|  |  | -            <div class={styles.shareWrap}>
 | 
	
		
			
				|  |  | -              <div class={styles.shareLeft}>
 | 
	
		
			
				|  |  | -                <img
 | 
	
		
			
				|  |  | -                  crossorigin="anonymous"
 | 
	
		
			
				|  |  | -                  class={styles.sharePic}
 | 
	
		
			
				|  |  | -                  src={sharePic}
 | 
	
		
			
				|  |  | -                ></img>
 | 
	
		
			
				|  |  | -              </div>
 | 
	
		
			
				|  |  | -              <div class={styles.shareRight}>
 | 
	
		
			
				|  |  | -                <div class={styles.shareShopTitle}>{this.product.name}</div>
 | 
	
		
			
				|  |  | -                {selectSku ? (
 | 
	
		
			
				|  |  | -                  <div class={styles.shareShopDes}>{selectSku.sku}</div>
 | 
	
		
			
				|  |  | -                ) : null}
 | 
	
		
			
				|  |  | -                <div class={styles.shareShopValue}>
 | 
	
		
			
				|  |  | -                  <span class={styles.shareShopPrice}>
 | 
	
		
			
				|  |  | -                    {moneyFormat(this.getPrice)}
 | 
	
		
			
				|  |  | -                  </span>
 | 
	
		
			
				|  |  | -                </div>
 | 
	
		
			
				|  |  | -              </div>
 | 
	
		
			
				|  |  | -              {/* <Card
 | 
	
		
			
				|  |  | -                price={this.getPrice}
 | 
	
		
			
				|  |  | -                desc={selectSku.sku}
 | 
	
		
			
				|  |  | -                title={this.product.name}
 | 
	
		
			
				|  |  | -                thumb={this.product.pic}
 | 
	
		
			
				|  |  | -              /> */}
 | 
	
		
			
				|  |  | -            </div>
 | 
	
		
			
				|  |  | -          </ColShare>
 | 
	
		
			
				|  |  | -        </Popup>
 | 
	
		
			
				|  |  | -      </div>
 | 
	
		
			
				|  |  | -    )
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -})
 | 
	
		
			
				|  |  | +import request from '@/helpers/request'
 | 
	
		
			
				|  |  | +import { browser, moneyFormat } from '@/helpers/utils'
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +  Swipe,
 | 
	
		
			
				|  |  | +  SwipeItem,
 | 
	
		
			
				|  |  | +  Image,
 | 
	
		
			
				|  |  | +  CellGroup,
 | 
	
		
			
				|  |  | +  Cell,
 | 
	
		
			
				|  |  | +  ImagePreview,
 | 
	
		
			
				|  |  | +  RadioGroup,
 | 
	
		
			
				|  |  | +  Radio,
 | 
	
		
			
				|  |  | +  Tag,
 | 
	
		
			
				|  |  | +  Row,
 | 
	
		
			
				|  |  | +  Col,
 | 
	
		
			
				|  |  | +  Sticky,
 | 
	
		
			
				|  |  | +  ActionBar,
 | 
	
		
			
				|  |  | +  ActionBarButton,
 | 
	
		
			
				|  |  | +  ActionBarIcon,
 | 
	
		
			
				|  |  | +  Icon,
 | 
	
		
			
				|  |  | +  Badge,
 | 
	
		
			
				|  |  | +  Toast,
 | 
	
		
			
				|  |  | +  Popup,
 | 
	
		
			
				|  |  | +  SubmitBar,
 | 
	
		
			
				|  |  | +  Card
 | 
	
		
			
				|  |  | +} from 'vant'
 | 
	
		
			
				|  |  | +import { defineComponent } from 'vue'
 | 
	
		
			
				|  |  | +import styles from './index.module.less'
 | 
	
		
			
				|  |  | +import iconShopCart from '../images/icon-shop-cart.png'
 | 
	
		
			
				|  |  | +import AddGoodsCart from '../modal/add-goods-cart'
 | 
	
		
			
				|  |  | +import ColHeader from '@/components/col-header'
 | 
	
		
			
				|  |  | +import iconShare from '../images/icon-share.svg'
 | 
	
		
			
				|  |  | +import ColShare from '@/components/col-share'
 | 
	
		
			
				|  |  | +import { state } from '@/state'
 | 
	
		
			
				|  |  | +import { useEventTracking } from '@/helpers/hooks'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export default defineComponent({
 | 
	
		
			
				|  |  | +  name: 'goods-detail',
 | 
	
		
			
				|  |  | +  data() {
 | 
	
		
			
				|  |  | +    const query = this.$route.query
 | 
	
		
			
				|  |  | +    return {
 | 
	
		
			
				|  |  | +      id: query.id,
 | 
	
		
			
				|  |  | +      albumPics: [] as any[],
 | 
	
		
			
				|  |  | +      product: {} as Record<string | number | symbol, any>,
 | 
	
		
			
				|  |  | +      radio: 0,
 | 
	
		
			
				|  |  | +      skuStockListTemp: [],
 | 
	
		
			
				|  |  | +      detailMobileHtml: '',
 | 
	
		
			
				|  |  | +      loading: false,
 | 
	
		
			
				|  |  | +      addGoodsShow: false,
 | 
	
		
			
				|  |  | +      selectGoodsItem: {},
 | 
	
		
			
				|  |  | +      cartCount: 0,
 | 
	
		
			
				|  |  | +      showType: 'cart',
 | 
	
		
			
				|  |  | +      shareShow: false // 分享弹窗
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  computed: {
 | 
	
		
			
				|  |  | +    skuStockList() {
 | 
	
		
			
				|  |  | +      // 处理规格
 | 
	
		
			
				|  |  | +      const product = this.product
 | 
	
		
			
				|  |  | +      const skuStockList: any =
 | 
	
		
			
				|  |  | +        this.skuStockListTemp.length > 0
 | 
	
		
			
				|  |  | +          ? this.skuStockListTemp
 | 
	
		
			
				|  |  | +          : [
 | 
	
		
			
				|  |  | +              {
 | 
	
		
			
				|  |  | +                id: -1,
 | 
	
		
			
				|  |  | +                price: product.price,
 | 
	
		
			
				|  |  | +                pic: product.pic,
 | 
	
		
			
				|  |  | +                stock: product.stock,
 | 
	
		
			
				|  |  | +                spData: null
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            ]
 | 
	
		
			
				|  |  | +      skuStockList.forEach((item: any) => {
 | 
	
		
			
				|  |  | +        if (item.spData) {
 | 
	
		
			
				|  |  | +          const spData = JSON.parse(item.spData)
 | 
	
		
			
				|  |  | +          item.spDataJson = spData.reduce((spDataJson, value) => {
 | 
	
		
			
				|  |  | +            spDataJson += value.value
 | 
	
		
			
				|  |  | +            return spDataJson
 | 
	
		
			
				|  |  | +          }, '')
 | 
	
		
			
				|  |  | +          item.sku = spData
 | 
	
		
			
				|  |  | +            .reduce((sku, value) => {
 | 
	
		
			
				|  |  | +              sku.push(`${value.key}: ${value.value}`)
 | 
	
		
			
				|  |  | +              return sku
 | 
	
		
			
				|  |  | +            }, [])
 | 
	
		
			
				|  |  | +            .join(',')
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          item.spDataJson = '默认'
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +      return skuStockList
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    getPrice() {
 | 
	
		
			
				|  |  | +      const item = this.skuStockList.filter(n => n.id == this.radio) as any
 | 
	
		
			
				|  |  | +      if (item && Array.isArray(item) && item.length) {
 | 
	
		
			
				|  |  | +        return item[0].price
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      return 0
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    shareUrl() {
 | 
	
		
			
				|  |  | +      // 分享链接
 | 
	
		
			
				|  |  | +      const productId = this.product.id as any
 | 
	
		
			
				|  |  | +      if (browser().isApp) {
 | 
	
		
			
				|  |  | +        return `${location.origin}/teacher/#/shareMall?bizId=${productId}&userId=${state.user.data.userId}&userType=${state.platformType}&p=tenant`
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        return `${location.origin}/teacher.html#/shareMall?bizId=${productId}&userId=${state.user.data.userId}&userType=${state.platformType}&p=tenant`
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    platformStatus() {
 | 
	
		
			
				|  |  | +      const userInfo = state.user.data as any
 | 
	
		
			
				|  |  | +      // 是机构学生 并且 是机构老师分享
 | 
	
		
			
				|  |  | +      const query = this.$route.query
 | 
	
		
			
				|  |  | +      return userInfo.tenantId > 0 && query.p == 'tenant'
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  async mounted() {
 | 
	
		
			
				|  |  | +    try {
 | 
	
		
			
				|  |  | +      this.loading = true
 | 
	
		
			
				|  |  | +      const res = await request.get(
 | 
	
		
			
				|  |  | +        `/api-mall-portal/product/detail/${this.id}`
 | 
	
		
			
				|  |  | +      )
 | 
	
		
			
				|  |  | +      this.loading = false
 | 
	
		
			
				|  |  | +      const result = res.data || {}
 | 
	
		
			
				|  |  | +      this.albumPics = [result.product.pic]
 | 
	
		
			
				|  |  | +        .concat(result.product.albumPics.split(','))
 | 
	
		
			
				|  |  | +        .filter(n => n)
 | 
	
		
			
				|  |  | +      this.product = result.product
 | 
	
		
			
				|  |  | +      this.skuStockListTemp = result.skuStockList || []
 | 
	
		
			
				|  |  | +      if (this.skuStockListTemp.length) {
 | 
	
		
			
				|  |  | +        const len = this.skuStockListTemp.length
 | 
	
		
			
				|  |  | +        for (let i = 0; i < len; i++) {
 | 
	
		
			
				|  |  | +          const item = this.skuStockListTemp[i] as any
 | 
	
		
			
				|  |  | +          if (item.stock >= 0) {
 | 
	
		
			
				|  |  | +            this.radio = item.id
 | 
	
		
			
				|  |  | +            break
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      this.detailMobileHtml = result.product.detailMobileHtml
 | 
	
		
			
				|  |  | +    } catch {}
 | 
	
		
			
				|  |  | +    this.getCartCount()
 | 
	
		
			
				|  |  | +    useEventTracking('商品详情')
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  methods: {
 | 
	
		
			
				|  |  | +    onPreview(index: number) {
 | 
	
		
			
				|  |  | +      // 图片预览
 | 
	
		
			
				|  |  | +      ImagePreview({
 | 
	
		
			
				|  |  | +        images: this.albumPics,
 | 
	
		
			
				|  |  | +        startPosition: index,
 | 
	
		
			
				|  |  | +        closeable: true,
 | 
	
		
			
				|  |  | +        className: styles.imagesOverlayWrap
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    onShowImg(target: any) {
 | 
	
		
			
				|  |  | +      const { localName } = target.srcElement
 | 
	
		
			
				|  |  | +      if (localName !== 'img') {
 | 
	
		
			
				|  |  | +        return
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      let startPosition = 0
 | 
	
		
			
				|  |  | +      const domList = document.querySelectorAll('.msgWrap img')
 | 
	
		
			
				|  |  | +      const imgList = Array.from(domList).map((item: any, index: number) => {
 | 
	
		
			
				|  |  | +        if (target.srcElement == item) {
 | 
	
		
			
				|  |  | +          startPosition = index
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return item.src
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      ImagePreview({
 | 
	
		
			
				|  |  | +        images: imgList,
 | 
	
		
			
				|  |  | +        startPosition: startPosition,
 | 
	
		
			
				|  |  | +        closeable: true,
 | 
	
		
			
				|  |  | +        className: styles.imagesOverlayWrap
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    onShowCart(type = 'cart') {
 | 
	
		
			
				|  |  | +      this.selectGoodsItem = {
 | 
	
		
			
				|  |  | +        price: this.product.pic,
 | 
	
		
			
				|  |  | +        stock: this.product.stock,
 | 
	
		
			
				|  |  | +        skuStockList: this.skuStockListTemp.length
 | 
	
		
			
				|  |  | +          ? this.skuStockListTemp
 | 
	
		
			
				|  |  | +          : undefined,
 | 
	
		
			
				|  |  | +        brandName: this.product.brandName,
 | 
	
		
			
				|  |  | +        productCategoryId: this.product.productCategoryId,
 | 
	
		
			
				|  |  | +        name: this.product.name,
 | 
	
		
			
				|  |  | +        productSn: this.product.productSn,
 | 
	
		
			
				|  |  | +        productSubTitle: this.product.subTitle,
 | 
	
		
			
				|  |  | +        id: this.product.id
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      this.showType = type
 | 
	
		
			
				|  |  | +      // 打开购物弹框
 | 
	
		
			
				|  |  | +      this.addGoodsShow = true
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    onBuy() {
 | 
	
		
			
				|  |  | +      // 购买
 | 
	
		
			
				|  |  | +      if (!this.radio) {
 | 
	
		
			
				|  |  | +        return Toast('请选择规格')
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      console.log(true)
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    async getCartCount() {
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        const { code, data } = await request.get('/api-mall-portal/cart/list')
 | 
	
		
			
				|  |  | +        if (code === 200) {
 | 
	
		
			
				|  |  | +          this.cartCount = data.length
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      } catch (err) {}
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  render() {
 | 
	
		
			
				|  |  | +    const product = this.product
 | 
	
		
			
				|  |  | +    const selectSku = this.skuStockList.find((n: any) => n.id === this.radio)
 | 
	
		
			
				|  |  | +    const sharePic = this.product.pic + '?v=' + Date.now()
 | 
	
		
			
				|  |  | +    return (
 | 
	
		
			
				|  |  | +      <div class={styles.goodsDetail}>
 | 
	
		
			
				|  |  | +        <ColHeader
 | 
	
		
			
				|  |  | +          v-slots={{
 | 
	
		
			
				|  |  | +            right: () => (
 | 
	
		
			
				|  |  | +              <div
 | 
	
		
			
				|  |  | +                class={styles.shareBtn}
 | 
	
		
			
				|  |  | +                onClick={() => (this.shareShow = true)}
 | 
	
		
			
				|  |  | +              >
 | 
	
		
			
				|  |  | +                <Icon name={iconShare} size={14} color="#666" />
 | 
	
		
			
				|  |  | +                <span style={{ marginLeft: '3px' }}>分享</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            )
 | 
	
		
			
				|  |  | +          }}
 | 
	
		
			
				|  |  | +        />
 | 
	
		
			
				|  |  | +        <Swipe
 | 
	
		
			
				|  |  | +          class={styles.swipe}
 | 
	
		
			
				|  |  | +          lazyRender
 | 
	
		
			
				|  |  | +          v-slots={{
 | 
	
		
			
				|  |  | +            indicator: (item: any) =>
 | 
	
		
			
				|  |  | +              item.total > 1 && (
 | 
	
		
			
				|  |  | +                <div class={styles['custom-indicator']}>
 | 
	
		
			
				|  |  | +                  {(item.active || 0) + 1} / {item.total}
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              )
 | 
	
		
			
				|  |  | +          }}
 | 
	
		
			
				|  |  | +        >
 | 
	
		
			
				|  |  | +          {this.albumPics.map((item: string, index: number) => (
 | 
	
		
			
				|  |  | +            <SwipeItem>
 | 
	
		
			
				|  |  | +              <Image
 | 
	
		
			
				|  |  | +                class={styles.swipeItemImg}
 | 
	
		
			
				|  |  | +                src={item}
 | 
	
		
			
				|  |  | +                onClick={() => this.onPreview(index)}
 | 
	
		
			
				|  |  | +                fit="cover"
 | 
	
		
			
				|  |  | +              />
 | 
	
		
			
				|  |  | +            </SwipeItem>
 | 
	
		
			
				|  |  | +          ))}
 | 
	
		
			
				|  |  | +        </Swipe>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <CellGroup border={false} class={[styles.goodsHead, 'mb12']}>
 | 
	
		
			
				|  |  | +          <Cell
 | 
	
		
			
				|  |  | +            center
 | 
	
		
			
				|  |  | +            border={false}
 | 
	
		
			
				|  |  | +            v-slots={{
 | 
	
		
			
				|  |  | +              title: () => (
 | 
	
		
			
				|  |  | +                <div class={styles.priceGroup}>
 | 
	
		
			
				|  |  | +                  <span class={styles.price}>
 | 
	
		
			
				|  |  | +                    <i>¥</i>
 | 
	
		
			
				|  |  | +                    {moneyFormat(this.getPrice)}
 | 
	
		
			
				|  |  | +                  </span>
 | 
	
		
			
				|  |  | +                  {/* <del class={styles.delPrice}>
 | 
	
		
			
				|  |  | +                    ¥{moneyFormat(product.originalPrice)}
 | 
	
		
			
				|  |  | +                  </del> */}
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              )
 | 
	
		
			
				|  |  | +              // default: () => <div class={styles.stock}>销量4件</div>
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  | +          />
 | 
	
		
			
				|  |  | +          <Cell
 | 
	
		
			
				|  |  | +            center
 | 
	
		
			
				|  |  | +            border={false}
 | 
	
		
			
				|  |  | +            title={product.name}
 | 
	
		
			
				|  |  | +            titleClass={[styles.goodsName, 'van-ellipsis']}
 | 
	
		
			
				|  |  | +          />
 | 
	
		
			
				|  |  | +        </CellGroup>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <Row class={[styles.row, 'mb12']}>
 | 
	
		
			
				|  |  | +          <Col span={4} class={styles.col}>
 | 
	
		
			
				|  |  | +            规格
 | 
	
		
			
				|  |  | +          </Col>
 | 
	
		
			
				|  |  | +          <Col span={20}>
 | 
	
		
			
				|  |  | +            {selectSku ? (
 | 
	
		
			
				|  |  | +              <div class={styles.selectWrap}>
 | 
	
		
			
				|  |  | +                {selectSku.stock <= 0
 | 
	
		
			
				|  |  | +                  ? `当前款式暂时缺货`
 | 
	
		
			
				|  |  | +                  : `已选择 ${selectSku.spDataJson}`}
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            ) : (
 | 
	
		
			
				|  |  | +              <div>请选择 规格</div>
 | 
	
		
			
				|  |  | +            )}
 | 
	
		
			
				|  |  | +            <RadioGroup
 | 
	
		
			
				|  |  | +              class={styles['radio-group']}
 | 
	
		
			
				|  |  | +              modelValue={this.radio}
 | 
	
		
			
				|  |  | +              onUpdate:modelValue={val => (this.radio = val)}
 | 
	
		
			
				|  |  | +            >
 | 
	
		
			
				|  |  | +              {this.skuStockList.map((item: any) => {
 | 
	
		
			
				|  |  | +                const isActive = item.id === this.radio
 | 
	
		
			
				|  |  | +                const type = isActive ? 'primary' : 'default'
 | 
	
		
			
				|  |  | +                return (
 | 
	
		
			
				|  |  | +                  <Badge
 | 
	
		
			
				|  |  | +                    position="top-right"
 | 
	
		
			
				|  |  | +                    content={item.stock <= 0 ? '缺货' : ''}
 | 
	
		
			
				|  |  | +                    color={'#999999'}
 | 
	
		
			
				|  |  | +                    class={styles.badge}
 | 
	
		
			
				|  |  | +                    offset={[-20, 0]}
 | 
	
		
			
				|  |  | +                  >
 | 
	
		
			
				|  |  | +                    <Radio
 | 
	
		
			
				|  |  | +                      class={styles.radio}
 | 
	
		
			
				|  |  | +                      name={item.id}
 | 
	
		
			
				|  |  | +                      disabled={item.stock <= 0}
 | 
	
		
			
				|  |  | +                      onClick={() => {
 | 
	
		
			
				|  |  | +                        // 判断是否有库存
 | 
	
		
			
				|  |  | +                        if (item.stock <= 0) {
 | 
	
		
			
				|  |  | +                          return
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        this.radio = item.id
 | 
	
		
			
				|  |  | +                      }}
 | 
	
		
			
				|  |  | +                    >
 | 
	
		
			
				|  |  | +                      <Tag size="large" plain={isActive} type={type}>
 | 
	
		
			
				|  |  | +                        {item.spDataJson}
 | 
	
		
			
				|  |  | +                      </Tag>
 | 
	
		
			
				|  |  | +                    </Radio>
 | 
	
		
			
				|  |  | +                  </Badge>
 | 
	
		
			
				|  |  | +                )
 | 
	
		
			
				|  |  | +              })}
 | 
	
		
			
				|  |  | +            </RadioGroup>
 | 
	
		
			
				|  |  | +          </Col>
 | 
	
		
			
				|  |  | +        </Row>
 | 
	
		
			
				|  |  | +        {this.detailMobileHtml && (
 | 
	
		
			
				|  |  | +          <div class={[styles.section]}>
 | 
	
		
			
				|  |  | +            <div class={styles.detail}>
 | 
	
		
			
				|  |  | +              <span>图文详情</span>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            <div
 | 
	
		
			
				|  |  | +              class={[styles.photoDetail, 'msgWrap']}
 | 
	
		
			
				|  |  | +              onClick={this.onShowImg}
 | 
	
		
			
				|  |  | +              v-html={this.detailMobileHtml}
 | 
	
		
			
				|  |  | +            ></div>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        )}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        {!this.loading && (
 | 
	
		
			
				|  |  | +          <>
 | 
	
		
			
				|  |  | +            <SubmitBar
 | 
	
		
			
				|  |  | +              class={styles.actionBar}
 | 
	
		
			
				|  |  | +              safe-area-inset-bottom
 | 
	
		
			
				|  |  | +              v-slots={{
 | 
	
		
			
				|  |  | +                button: () => (
 | 
	
		
			
				|  |  | +                  <div class={styles.buyGroup}>
 | 
	
		
			
				|  |  | +                    <ActionBarButton
 | 
	
		
			
				|  |  | +                      type="primary"
 | 
	
		
			
				|  |  | +                      class={styles.addCertBtn}
 | 
	
		
			
				|  |  | +                      text="加入购物车"
 | 
	
		
			
				|  |  | +                      disabled={this.platformStatus}
 | 
	
		
			
				|  |  | +                      onClick={() => this.onShowCart()}
 | 
	
		
			
				|  |  | +                    />
 | 
	
		
			
				|  |  | +                    <ActionBarButton
 | 
	
		
			
				|  |  | +                      type="primary"
 | 
	
		
			
				|  |  | +                      text="立即购买"
 | 
	
		
			
				|  |  | +                      disabled={this.platformStatus}
 | 
	
		
			
				|  |  | +                      onClick={() => this.onShowCart('cartConfirm')}
 | 
	
		
			
				|  |  | +                    />
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                )
 | 
	
		
			
				|  |  | +              }}
 | 
	
		
			
				|  |  | +            >
 | 
	
		
			
				|  |  | +              <Badge
 | 
	
		
			
				|  |  | +                content={this.cartCount}
 | 
	
		
			
				|  |  | +                showZero={false}
 | 
	
		
			
				|  |  | +                onClick={() => {
 | 
	
		
			
				|  |  | +                  if (this.platformStatus) {
 | 
	
		
			
				|  |  | +                    return
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                  this.$router.push('/cart')
 | 
	
		
			
				|  |  | +                }}
 | 
	
		
			
				|  |  | +              >
 | 
	
		
			
				|  |  | +                <Icon
 | 
	
		
			
				|  |  | +                  name={iconShopCart}
 | 
	
		
			
				|  |  | +                  size={30}
 | 
	
		
			
				|  |  | +                  class={this.platformStatus && styles.cartDisabled}
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +              </Badge>
 | 
	
		
			
				|  |  | +            </SubmitBar>
 | 
	
		
			
				|  |  | +          </>
 | 
	
		
			
				|  |  | +        )}
 | 
	
		
			
				|  |  | +        <Popup
 | 
	
		
			
				|  |  | +          show={this.addGoodsShow}
 | 
	
		
			
				|  |  | +          closeable
 | 
	
		
			
				|  |  | +          position="bottom"
 | 
	
		
			
				|  |  | +          round
 | 
	
		
			
				|  |  | +          onClose={() => {
 | 
	
		
			
				|  |  | +            this.addGoodsShow = false
 | 
	
		
			
				|  |  | +          }}
 | 
	
		
			
				|  |  | +        >
 | 
	
		
			
				|  |  | +          <AddGoodsCart
 | 
	
		
			
				|  |  | +            show={this.addGoodsShow}
 | 
	
		
			
				|  |  | +            onGetCartCount={() => this.getCartCount()}
 | 
	
		
			
				|  |  | +            item={this.selectGoodsItem}
 | 
	
		
			
				|  |  | +            defaultRadio={this.radio}
 | 
	
		
			
				|  |  | +            showType={this.showType}
 | 
	
		
			
				|  |  | +          />
 | 
	
		
			
				|  |  | +        </Popup>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <Popup
 | 
	
		
			
				|  |  | +          style={{ background: 'transparent' }}
 | 
	
		
			
				|  |  | +          show={this.shareShow}
 | 
	
		
			
				|  |  | +          onClose={() => (this.shareShow = false)}
 | 
	
		
			
				|  |  | +        >
 | 
	
		
			
				|  |  | +          <ColShare
 | 
	
		
			
				|  |  | +            shareUrl={this.shareUrl}
 | 
	
		
			
				|  |  | +            teacherId={state.user.data.userId}
 | 
	
		
			
				|  |  | +            shareType="mall"
 | 
	
		
			
				|  |  | +          >
 | 
	
		
			
				|  |  | +            <div class={styles.shareWrap}>
 | 
	
		
			
				|  |  | +              <div class={styles.shareLeft}>
 | 
	
		
			
				|  |  | +                <img
 | 
	
		
			
				|  |  | +                  crossorigin="anonymous"
 | 
	
		
			
				|  |  | +                  class={styles.sharePic}
 | 
	
		
			
				|  |  | +                  src={sharePic}
 | 
	
		
			
				|  |  | +                ></img>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +              <div class={styles.shareRight}>
 | 
	
		
			
				|  |  | +                <div class={styles.shareShopTitle}>{this.product.name}</div>
 | 
	
		
			
				|  |  | +                {selectSku ? (
 | 
	
		
			
				|  |  | +                  <div class={styles.shareShopDes}>{selectSku.sku}</div>
 | 
	
		
			
				|  |  | +                ) : null}
 | 
	
		
			
				|  |  | +                <div class={styles.shareShopValue}>
 | 
	
		
			
				|  |  | +                  <span class={styles.shareShopPrice}>
 | 
	
		
			
				|  |  | +                    {moneyFormat(this.getPrice)}
 | 
	
		
			
				|  |  | +                  </span>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +              {/* <Card
 | 
	
		
			
				|  |  | +                price={this.getPrice}
 | 
	
		
			
				|  |  | +                desc={selectSku.sku}
 | 
	
		
			
				|  |  | +                title={this.product.name}
 | 
	
		
			
				|  |  | +                thumb={this.product.pic}
 | 
	
		
			
				|  |  | +              /> */}
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          </ColShare>
 | 
	
		
			
				|  |  | +        </Popup>
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    )
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +})
 |