前端 mobile :商品 H5

pull/1/head
YunaiV 2019-03-27 00:24:10 +08:00
parent cfd9d770d6
commit a019ac275d
2 changed files with 238 additions and 150 deletions

View File

@ -21,3 +21,13 @@ export function getProductSpuPage(cid, pageNo, pageSize) {
} }
}); });
} }
export function getProductSpuInfo(id) {
return request({
url: 'product-api/users/spu/info',
method: 'get',
params: {
id,
}
});
}

View File

@ -2,63 +2,64 @@
<div class="goods"> <div class="goods">
<headerNav title="商品详情"/> <headerNav title="商品详情"/>
<van-swipe class="goods-swipe" :autoplay="3000"> <van-swipe class="goods-swipe" :autoplay="3000">
<van-swipe-item v-for="thumb in goods.thumb" :key="thumb"> <van-swipe-item v-for="thumb in spu.picUrls" :key="thumb">
<img :src="thumb" > <img :src="thumb" >
</van-swipe-item> </van-swipe-item>
</van-swipe> </van-swipe>
<van-cell-group> <van-cell-group>
<van-cell> <van-cell>
<span class="goods-price">{{ formatPrice(goods.price) }}</span> <span class="goods-price">{{ formatPrice(initialSku.price) }}</span>
<span class="goods-market-price">{{ formatPrice(goods.market_price) }}</span> <!--<span class="goods-market-price">{{ formatPrice(goods.market_price) }}</span>-->
<div class="goods-title">{{ goods.title }}</div> <div class="goods-title">{{ spu.name }}</div>
<div class="goods-subtit">{{goods.subtitle}}</div> <div class="goods-subtit">{{spu.sellPoint}}</div>
</van-cell> </van-cell>
<van-cell @click="onClickShowTag" class="goods-tag" > <!--<van-cell @click="onClickShowTag" class="goods-tag" >-->
<template slot="title" style="font-size:10px;"> <!--<template slot="title" style="font-size:10px;">-->
<img src="https://haitao.nos.netease.com/ba8a4c2fdaa54f82a45261293c116af61419663676663i46n3jlh10028.png"/> <!--<img src="https://haitao.nos.netease.com/ba8a4c2fdaa54f82a45261293c116af61419663676663i46n3jlh10028.png"/>-->
<span >挪威品牌</span> <!--<span >挪威品牌</span>-->
<img src="https://haitao.nosdn2.127.net/13bd59e6e29a4f06b278c586629e690d.png" /> <!--<img src="https://haitao.nosdn2.127.net/13bd59e6e29a4f06b278c586629e690d.png" />-->
<span >跨境商品</span> <!--<span >跨境商品</span>-->
<van-icon name="passed" color="red" /> <!--<van-icon name="passed" color="red" />-->
<span >次日达</span> <!--<span >次日达</span>-->
<van-icon name="passed" color="red" /> <!--<van-icon name="passed" color="red" />-->
<span >自提</span> <!--<span >自提</span>-->
<van-icon name="passed" color="red" /> <!--<van-icon name="passed" color="red" />-->
<span >闪电退款</span> <!--<span >闪电退款</span>-->
<van-icon name="passed" color="red" /> <!--<van-icon name="passed" color="red" />-->
<span >前海保税仓</span> <!--<span >前海保税仓</span>-->
<van-icon name="passed" color="red" /> <!--<van-icon name="passed" color="red" />-->
<span >七天无理由退货拆封后不支持</span> <!--<span >七天无理由退货拆封后不支持</span>-->
</template> <!--</template>-->
</van-cell> <!--</van-cell> -->
</van-cell-group> </van-cell-group>
<van-cell-group class="goods-cell-group">
<van-cell is-link @click="showPromotion" >
<template slot="title">
<span style="margin-right: 10px;">领券</span>
<van-tag type="danger" mark style="margin-right: 5px;">满180减30</van-tag>
<van-tag type="danger" mark style="margin-right: 5px;">满300减100</van-tag>
</template>
</van-cell>
<van-cell is-link @click="showPromotion" > <!--<van-cell-group class="goods-cell-group">-->
<template slot="title"> <!--<van-cell is-link @click="showPromotion" >-->
<span style="margin-right: 10px;">促销</span> <!--<template slot="title">-->
<van-tag type="danger" style="margin-right: 5px;">多买优惠</van-tag> <!--<span style="margin-right: 10px;">领券</span>-->
<van-tag type="danger" style="margin-right: 5px;">满减</van-tag> <!--<van-tag type="danger" mark style="margin-right: 5px;">满180减30</van-tag>-->
<van-tag type="danger" style="margin-right: 5px;">限购</van-tag> <!--<van-tag type="danger" mark style="margin-right: 5px;">满300减100</van-tag>-->
</template> <!--</template>-->
</van-cell> <!--</van-cell>-->
</van-cell-group> <!---->
<!--<van-cell is-link @click="showPromotion" >-->
<!--<template slot="title">-->
<!--<span style="margin-right: 10px;">促销</span>-->
<!--<van-tag type="danger" style="margin-right: 5px;">多买优惠</van-tag>-->
<!--<van-tag type="danger" style="margin-right: 5px;">满减</van-tag>-->
<!--<van-tag type="danger" style="margin-right: 5px;">限购</van-tag>-->
<!--</template>-->
<!--</van-cell>-->
<!--</van-cell-group>-->
<van-cell-group class="goods-cell-group"> <van-cell-group class="goods-cell-group">
<van-cell is-link @click="showSku" > <van-cell is-link @click="showSku" >
<template slot="title"> <template slot="title">
<span style="margin-right: 10px;">已选</span> <span style="margin-right: 10px;">已选</span>
<span >10件装</span> <span>{{ formatSkuText(initialSku) }}</span>
</template> </template>
</van-cell> </van-cell>
@ -66,7 +67,7 @@
<div class="goods-info"> <div class="goods-info">
<p class="goods-info-title" >图文详情</p> <p class="goods-info-title" >图文详情</p>
<div v-html="goods.info"></div> <div v-html="spu.description"></div>
</div> </div>
<van-goods-action> <van-goods-action>
@ -83,88 +84,89 @@
立即购买 立即购买
</van-goods-action-big-btn> </van-goods-action-big-btn>
</van-goods-action> </van-goods-action>
<van-actionsheet v-model="show" title="促销" style="font-size:14px;">
<van-cell is-link @click="sorry" > <!--<van-actionsheet v-model="show" title="促销" style="font-size:14px;">-->
<template slot="title"> <!---->
<van-tag type="danger">多买优惠</van-tag> <!--<van-cell is-link @click="sorry" >-->
<span> 满2件总价打9折</span> <!--<template slot="title">-->
</template> <!--<van-tag type="danger">多买优惠</van-tag>-->
</van-cell> <!--<span> 满2件总价打9折</span>-->
<van-cell is-link @click="sorry" > <!--</template>-->
<template slot="title"> <!--</van-cell>-->
<van-tag type="danger">满减</van-tag> <!--<van-cell is-link @click="sorry" >-->
<span> 满100元减50元</span> <!--<template slot="title">-->
</template> <!--<van-tag type="danger">满减</van-tag>-->
</van-cell> <!--<span> 满100元减50元</span>-->
<van-cell is-link @click="sorry" > <!--</template>-->
<template slot="title"> <!--</van-cell>-->
<van-tag type="danger">限购</van-tag> <!--<van-cell is-link @click="sorry" >-->
<span> 购买不超过5件时享受单件价8.00超出数量以结算价为准</span> <!--<template slot="title">-->
</template> <!--<van-tag type="danger">限购</van-tag>-->
</van-cell> <!--<span> 购买不超过5件时享受单件价8.00超出数量以结算价为准</span>-->
</van-actionsheet> <!--</template>-->
<!--</van-cell>-->
<!--</van-actionsheet>-->
<van-actionsheet v-model="showTag" title="服务说明" style="font-size:14px;"> <!--<van-actionsheet v-model="showTag" title="服务说明" style="font-size:14px;">-->
<!---->
<!--<van-cell>-->
<!--<template slot="title">-->
<!--<van-icon name="passed" color="red" style="margin-right: 10px;" />-->
<!--<span >次日达</span>-->
<!--<div style="margin-left: 24px;font-size:10px;color:#7d7d7d;">指定时间前下单次日送达</div>-->
<!--</template>-->
<!--</van-cell>-->
<!--<van-cell>-->
<!--<template slot="title">-->
<!--<van-icon name="passed" color="red" style="margin-right: 10px;" />-->
<!--<span >自提</span>-->
<!--<div style="margin-left: 24px;font-size:10px;color:#7d7d7d;">我们提供多种自提服务包括自提点自助提货柜移动自提车等服务</div>-->
<!--</template>-->
<!--</van-cell>-->
<!--<van-cell>-->
<!--<template slot="title">-->
<!--<van-icon name="passed" color="red" style="margin-right: 10px;" />-->
<!--<span >闪电退款</span>-->
<!--<div style="margin-left: 24px;font-size:10px;color:#7d7d7d;">签收7天内退货的提供先退款后退货服务</div>-->
<!--</template>-->
<!--</van-cell>-->
<!--<van-cell>-->
<!--<template slot="title">-->
<!--<van-icon name="passed" color="red" style="margin-right: 10px;" />-->
<!--<span >七天无理由退货拆封后不支持</span>-->
<!--<div style="margin-left: 24px;font-size:10px;color:#7d7d7d;">七天无理由退货拆封后不支持</div>-->
<!--</template>-->
<!--</van-cell>-->
<!--<van-cell>-->
<!--<template slot="title">-->
<!--<van-icon name="passed" color="red" style="margin-right: 10px;" />-->
<!--<span >前海保税仓</span>-->
<!--<div style="margin-left: 24px;font-size:10px;color:#7d7d7d;">本商品由前海保税仓发货</div>-->
<!--</template>-->
<!--</van-cell>-->
<!--</van-actionsheet>-->
<van-cell>
<template slot="title">
<van-icon name="passed" color="red" style="margin-right: 10px;" />
<span >次日达</span>
<div style="margin-left: 24px;font-size:10px;color:#7d7d7d;">指定时间前下单次日送达</div>
</template>
</van-cell>
<van-cell>
<template slot="title">
<van-icon name="passed" color="red" style="margin-right: 10px;" />
<span >自提</span>
<div style="margin-left: 24px;font-size:10px;color:#7d7d7d;">我们提供多种自提服务包括自提点自助提货柜移动自提车等服务</div>
</template>
</van-cell>
<van-cell>
<template slot="title">
<van-icon name="passed" color="red" style="margin-right: 10px;" />
<span >闪电退款</span>
<div style="margin-left: 24px;font-size:10px;color:#7d7d7d;">签收7天内退货的提供先退款后退货服务</div>
</template>
</van-cell>
<van-cell>
<template slot="title">
<van-icon name="passed" color="red" style="margin-right: 10px;" />
<span >七天无理由退货拆封后不支持</span>
<div style="margin-left: 24px;font-size:10px;color:#7d7d7d;">七天无理由退货拆封后不支持</div>
</template>
</van-cell>
<van-cell>
<template slot="title">
<van-icon name="passed" color="red" style="margin-right: 10px;" />
<span >前海保税仓</span>
<div style="margin-left: 24px;font-size:10px;color:#7d7d7d;">本商品由前海保税仓发货</div>
</template>
</van-cell>
</van-actionsheet>
<van-sku <van-sku
v-model="showBase" v-model="showBase"
:sku="skuData.sku" :sku="vanSku"
:goods="skuData.goods_info" :initial-sku="initialSku"
:goods-id="skuData.goods_id" :goods="vanSpu"
:hide-stock="skuData.sku.hide_stock" :goods-id="spu.id"
:quota="skuData.quota" :hide-stock="hideStock"
:quota-used="skuData.quota_used"
reset-stepper-on-hide
reset-selected-sku-on-hide
disable-stepper-input
:close-on-click-overlay="closeOnClickOverlay" :close-on-click-overlay="closeOnClickOverlay"
:message-config="messageConfig" @stepper-change="stepperChange"
:custom-sku-validator="customSkuValidator" @sku-selected="skuSelected"
@buy-clicked="onBuyClicked" @buy-clicked="onBuyClicked"
@add-cart="onAddCartClicked" @add-cart="onAddCartClicked"
/> />
<!--:quota="skuData.quota"-->
</div> </div>
</template> </template>
<script> <script>
import skuData from '../../data/sku'; import skuData from '../../data/sku';
import { getProductSpuInfo } from '../../api/product';
export default { export default {
components: { components: {
@ -172,6 +174,23 @@ export default {
data() { data() {
this.skuData = skuData; this.skuData = skuData;
return { return {
spu: {}, //
vanSku: {
tree: [], //
list: [], // sku
},
// TODO sku title picture
vanSpu: {
title: '',
picture: '',
},
initialSku: { // sku
//
// price
// quantity
},
attrValueMap: new Map(), //
show:false, show:false,
showTag:false, showTag:false,
goods: { goods: {
@ -187,47 +206,40 @@ export default {
], ],
info:'<p style="text-align:center;"><img src="https://haitao.nosdn2.127.net/ac19460151ee4d95a6657202bcfc653c1531470912089jjjq8ml410763.jpg" ></p><p style="text-align:center;"><img src="https://haitao.nos.netease.com/2a91cfad22404e5498d347672b1440301531470912182jjjq8mnq10764.jpg" ></p><p style="text-align:center;"><img src="https://haitao.nos.netease.com/caddd5a213de4c1cb1347c267e8275731531470912412jjjq8mu410765.jpg" ></p>', info:'<p style="text-align:center;"><img src="https://haitao.nosdn2.127.net/ac19460151ee4d95a6657202bcfc653c1531470912089jjjq8ml410763.jpg" ></p><p style="text-align:center;"><img src="https://haitao.nos.netease.com/2a91cfad22404e5498d347672b1440301531470912182jjjq8mnq10764.jpg" ></p><p style="text-align:center;"><img src="https://haitao.nos.netease.com/caddd5a213de4c1cb1347c267e8275731531470912412jjjq8mu410765.jpg" ></p>',
}, },
showBase: false, showBase: false, // sku
showCustom: false, closeOnClickOverlay: true, //
showStepper: false, hideStock: true, //
closeOnClickOverlay: true,
initialSku: {
s1: '30349',
s2: '1193'
},
customSkuValidator: (component) => {
return '请选择xxx';
},
customStepperConfig: {
quotaText: '单次限购100件',
stockFormatter: (stock) => `剩余${stock}`,
handleOverLimit: (data) => {
const { action, limitType, quota } = data;
if (action === 'minus') {
this.$toast('至少选择一件商品');
} else if (action === 'plus') {
if (limitType === LIMIT_TYPE.QUOTA_LIMIT) {
this.$toast(`限购${quota}`);
} else {
this.$toast('库存不够了~~');
}
}
}
},
messageConfig: {
uploadImg: (file, img) => {
return new Promise(resolve => {
setTimeout(() => resolve(img), 1000);
});
},
uploadMaxSize: 3
}
}; };
}, },
methods: { methods: {
formatPrice(data) { formatPrice(data) {
return '¥' + (data / 100).toFixed(2); return '¥' + (data / 100).toFixed(2);
}, },
formatSkuText(data) { // sku
let text = '';
for (let prop in data) {
if (prop.indexOf('attr_') === 0) {
text = text + this.attrValueMap.get(data[prop]) + ' ';
}
}
text = text + 'x ' + data.quantity + ' 件';
return text;
},
stepperChange(value) { // sku
this.initialSku.quantity = value;
},
skuSelected({skuValue, selectedSku, selectedSkuComb}) { // sku
console.log(skuValue);
console.log(selectedSku);
console.log(selectedSkuComb);
this.initialSku = {
...selectedSkuComb,
quantity: 1,
};
},
onClickCart() { onClickCart() {
this.$router.push('/cart'); this.$router.push('/cart');
}, },
@ -237,7 +249,7 @@ export default {
showPromotion() { showPromotion() {
this.show=true; this.show=true;
}, },
showSku(){ showSku() { // sku
this.showBase=true; this.showBase=true;
}, },
onClickShowTag(){ onClickShowTag(){
@ -249,7 +261,73 @@ export default {
onAddCartClicked(data) { onAddCartClicked(data) {
this.$toast(JSON.stringify(data)); this.$toast(JSON.stringify(data));
}, },
},
mounted() {
let id = this.$route.params.id; //
let response = getProductSpuInfo(id);
response.then(data => {
// spu
this.spu = data;
// vanSku
let vanSku = {
tree: [],
list: [],
};
for (let i = 0; i < data.skus.length; i++) {
let sku = data.skus[i];
// list sku
let skuVO = {
id: sku.id, // skuId
price: sku.price, //
stock_num: sku.quantity // sku
};
for (let j = 0; j < sku.attrs.length; j++) {
let attr = sku.attrs[j];
skuVO['attr_' + attr.attrId] =attr.attrValueId;
}
vanSku.list.push(skuVO);
// tree
for (let j = 0; j < sku.attrs.length; j++) {
let attr = sku.attrs[j];
let attrVO;
for (let k = 0; k < vanSku.tree.length; k++) {
if (attr.attrName === vanSku.tree[k].k) {
attrVO = vanSku.tree[k];
break;
}
}
if (!attrVO) { //
attrVO = {
k: attr.attrName, // skuKeyName
v: [],
k_s: 'attr_' + attr.attrId,
};
vanSku.tree.push(attrVO);
}
let attrValueFound = false; //
for (let k = 0; k < attrVO.v.length; k++) {
if (attr.attrValueId === attrVO.v[k].id) {
attrValueFound = true;
break;
}
}
if (!attrValueFound) {
attrVO.v.push({
id: attr.attrValueId, // skuValueId id
name: attr.attrValueName, // skuValueName
});
}
// attrValueMap
this.attrValueMap.set(attr.attrValueId, attr.attrValueName);
}
}
// debugger;
this.vanSku = vanSku;
//
// TODO sku
this.initialSku = vanSku.list[0];
this.initialSku.quantity = 1;
});
} }
}; };
</script> </script>