加入购物车,购物车数量,购物车列表,购物车删除

msb_beta
ch 3 years ago
parent 92014b93cc
commit 8b68af9ad7

@ -2,19 +2,19 @@
* @Author: ch
* @Date: 2022-03-17 16:38:39
* @LastEditors: ch
* @LastEditTime: 2022-04-02 09:58:50
* @LastEditTime: 2022-04-06 09:59:52
* @Description: file content
*/
import {ToAsyncAwait, MsbRequest} from '@/common/utils';
import orderList from '@/mock/orderList'
const BASE_URL = '/uc'
const ApiGetCurrentUser = () =>
ToAsyncAwait(MsbRequest.get('/user/current'));
ToAsyncAwait(MsbRequest.get(`${BASE_URL}/user/current`));
const ApiPutUser = (data) =>
ToAsyncAwait(MsbRequest.put('/user/', data))
ToAsyncAwait(MsbRequest.put(`${BASE_URL}/user/`, data))
export {
// 获取当前登录用户信息
ApiGetCurrentUser,

@ -0,0 +1,38 @@
/*
* @Author: ch
* @Date: 2022-04-06 10:14:03
* @LastEditors: ch
* @LastEditTime: 2022-04-06 15:49:07
* @Description: file content
*/
import {ToAsyncAwait, MsbRequest} from '@/common/utils';
const BASE_URL = '/mall/product';
/**
* 设置购物车数量
* @param {id,number} data
*/
export const ApiPutCartNum = (data) =>
ToAsyncAwait(MsbRequest.put(`${BASE_URL}/shoppingCart/number`, data));
/**
* 往购物车中添加商品
* @param {prodcutId, productSkuId, number} data
*/
export const ApiPutAddCart = (data) =>
ToAsyncAwait(MsbRequest.put(`${BASE_URL}/shoppingCart/increase`, data));
/**
* 删除购物车中的商品
* @param {idList} data
*/
export const ApiDeleteCartGoods = (data) =>
ToAsyncAwait(MsbRequest.delete(`${BASE_URL}/shoppingCart?idList=${data.idList}`, data));
/**
* 获取购物车列表
*/
export const ApiGetCartList = () =>
ToAsyncAwait(MsbRequest.get(`${BASE_URL}/shoppingCart`));

@ -1,7 +0,0 @@
/*
* @Author: ch
* @Date: 2022-03-17 16:38:26
* @LastEditors: ch
* @LastEditTime: 2022-03-17 16:38:26
* @Description: file content
*/

@ -2,26 +2,27 @@
* @Author: ch
* @Date: 2022-04-02 09:54:53
* @LastEditors: ch
* @LastEditTime: 2022-04-02 15:17:20
* @LastEditTime: 2022-04-06 10:15:32
* @Description: file content
*/
import {ToAsyncAwait, MsbRequest} from '@/common/utils';
const BASE_URL = '/mall/product';
/**
* 获取商品瀑布流
* @param {*} params
*/
export const ApiGetGoodsList = (params) =>
ToAsyncAwait(MsbRequest.get('/app/product/page', params));
ToAsyncAwait(MsbRequest.get(`${BASE_URL}/app/product/page`, params));
/**
* 获取商品详情
* @param {*} params
*/
export const ApiGetGoodsDetail = (params) =>
ToAsyncAwait(MsbRequest.get(`/app/product/${params.id}`));
ToAsyncAwait(MsbRequest.get(`${BASE_URL}/app/product/${params.id}`));
/**
* 获取商品sku信息
* @param {*} productId
*/
export const ApiGetGoodsSkus = (params) =>
ToAsyncAwait(MsbRequest.get('/app/product/sku',params));
ToAsyncAwait(MsbRequest.get(`${BASE_URL}/app/product/sku`,params));

@ -2,28 +2,23 @@
* @Author: ch
* @Date: 2022-03-17 16:37:45
* @LastEditors: ch
* @LastEditTime: 2022-04-02 09:58:40
* @LastEditTime: 2022-04-06 10:02:29
* @Description: file content
*/
import {MsbRequest, ToAsyncAwait} from '@/common/utils';
/**
* 获取测试信息
* @param {*} params
*/
export const ApiGetBannerData = (params) =>
ToAsyncAwait(MsbRequest.get('/edu-course/carousel/app',params));
const BASE_URL = '/uc';
/**
* 登录
* @param {*} data
*/
export const ApiPostLogin = (data) => ToAsyncAwait(MsbRequest.post('/user/login', data));
export const ApiPostLogin = (data) => ToAsyncAwait(MsbRequest.post(`${BASE_URL}/user/login`, data));
/**
* 获取手机验证码
* @param {*} params
*/
export const ApiGetCode = (params) => ToAsyncAwait(MsbRequest.get('/user/login/verificationCode', params));
export const ApiGetCode = (params) => ToAsyncAwait(MsbRequest.get(`${BASE_URL}/user/login/verificationCode`, params));

@ -2,49 +2,51 @@
* @Author: ch
* @Date: 2022-03-29 17:38:17
* @LastEditors: ch
* @LastEditTime: 2022-04-02 09:58:29
* @LastEditTime: 2022-04-06 10:01:40
* @Description: file content
*/
import {ToAsyncAwait, MsbRequest} from '@/common/utils';
const BASE_URL = '/mall/trade';
/**
* 获取订单
* @param {*} params
*/
export const ApiGetOrderList = (params) =>
ToAsyncAwait(MsbRequest.get('/app/tradeOrder/page', params));
ToAsyncAwait(MsbRequest.get(`${BASE_URL}/app/tradeOrder/page`, params));
/**
* 获取预订单
* @param {*} data
*/
export const ApiGetBeforeOrder = (data) =>
ToAsyncAwait(MsbRequest.get('/app/tradeOrder/buyAdvanceOrder', data));
ToAsyncAwait(MsbRequest.get(`${BASE_URL}/app/tradeOrder/buyAdvanceOrder`, data));
/**
* 订单详情
* @param {*} id
*/
export const ApiGetOrderDetail = (id) =>
ToAsyncAwait(MsbRequest.get(`/app/tradeOrder/${id}`));
ToAsyncAwait(MsbRequest.get(`${BASE_URL}/app/tradeOrder/${id}`));
/**
* 提交订单
* @param {*} data
*/
export const ApiPostSubmitOrder = (data) =>
ToAsyncAwait(MsbRequest.post('/app/tradeOrder/submitOrder', data));
ToAsyncAwait(MsbRequest.post(`${BASE_URL}/app/tradeOrder/submitOrder`, data));
/**
* 取消订单
* @param {*} data
*/
export const ApiPutCancelOrder = (data) =>
ToAsyncAwait(MsbRequest.post('/app/tradeOrder/cancel', data));
ToAsyncAwait(MsbRequest.post(`${BASE_URL}/app/tradeOrder/cancel`, data));
/**
* 获取支付参数
* @param {*} data
*/
export const ApiPostWxPay = (data) =>
ToAsyncAwait(MsbRequest.post('/pay/wxPay/app', data));
ToAsyncAwait(MsbRequest.post(`${BASE_URL}/pay/wxPay/app`, data));

@ -86,7 +86,7 @@ class MsbUniRequest {
put(url, data, header){
return this.method({method : 'PUT', url, data, header});
}
delete(url, data){
delete(url, data, header){
return this.method({method : 'DELETE', url, data, header});
}
}

@ -75,17 +75,17 @@
},
"devServer" : {
"proxy" : {
"/user/" : {
"target": "http://192.168.10.251:4500/"
"/uc/" : {
"target": "http://192.168.10.20:8090/"
},
"/app/tradeOrder/" : {
"target": "http://192.168.10.109:4001/"
"/mall/trade/" : {
"target": "http://192.168.10.20:8090/"
},
"/pay/" : {
"target": "http://192.168.10.109:4001/"
"target": "http://192.168.10.20:8090/"
},
"/app/product/" : {
"target" : "http://192.168.10.67:4002/"
"/mall/product/" : {
"target" : "http://192.168.10.20:8090/"
}
}
}

@ -2,41 +2,49 @@
<view class="container">
<!-- 页面顶部 -->
<UiPageHeader :back="true">
<template slot="title">
<text>购物车</text>
<text v-if="total">({{total}})</text>
</template>
<template slot="operation" v-if="list.length">
<template slot="custom">
<view>
<text>购物车</text>
<text v-if="list.length">({{list.length}})</text>
</view>
<view v-if="mode == 'normal'" class="head--edit" @click="handleToggleMode"></view>
<view v-else class="head--finsh" @click="handleToggleMode"></view>
</template>
</UiPageHeader>
<u-loadmore v-if="isLoading" status="loading" />
<!-- 购物车数据为空 -->
<BsEmpty v-if="!list.length && !isLoading" class="empty"
tips="去挑点喜欢的好货吧~">
<image slot="icon" class="empty--icon" src="@/static/goods/cart.png"></image>
<view slot="btn" class="empty--btn" @click="$Router.push('/')"></view>
</BsEmpty>
<!-- 购物车商品列表 -->
<view v-if="list.length" class="cart-list">
<view v-else class="cart-list">
<view class="cart-item" v-for="(item, index) in list" :key="index"
@click="onTargetGoods(item.goods_id)">
@click="$Router.push(`goodsDetail?id=${item.id}`)">
<label class="cart-item--radio" @click.stop="handleCheckItem(item.id)">
<radio class="radio" color="#FF875B"
:checked="checkedIds.length ? checkedIds.find(i => i === item.id) : false" />
:checked="checkedIds.length ? checkedIds.includes(item.id) : false" />
</label>
<image class="cart-item--image" :src="item.goods.goods_image" mode="scaleToFill"></image>
<image class="cart-item--image" :src="item.product.mainPicture" mode="scaleToFill"></image>
<view class="cart-item--content">
<view class="cart-item--title"><text>{{ item.goods.goods_name }}</text></view>
<view class="cart-item--title"><text>{{ item.product.name }}</text></view>
<view class="cart-item--props">
<view class="cart-item--props-item" v-for="(props, idx) in item.goods.skuInfo.goods_props" :key="idx">
<text>{{ props.value.name }}</text>
<view class="cart-item--props-item" >
<text>{{ item.productSku.name }}</text>
</view>
</view>
<view class="cart-item--footer">
<view class="cart-item--price">
<text class="unit"></text>
<text class="value">{{ item.goods.skuInfo.goods_price }}</text>
<text class="value">{{ item.productSku.sellPrice }}</text>
</view>
<view class="cart-item--stepper">
<u-number-box :min="1" button-size="40rpx" bgColor="#F5F6FA"
:value="item.goods_num" @change="onChangeStepper($event, item)" >
:value="item.number" :max="item.maxBuyNum" @change="onChangeStepper($event, item)" >
<text slot="minus" class="cart-item--stepper-icon">-</text>
<!-- <text slot="input" class="cart-item--stepper-input">{{item.goods_num}}</text> -->
<text slot="plus" class="cart-item--stepper-icon">+</text>
</u-number-box>
</view>
@ -44,19 +52,16 @@
</view>
</view>
</view>
<!-- 购物车数据为空 -->
<BsEmpty v-if="!list.length" class="empty"
tips="去挑点喜欢的好货吧~">
<image slot="icon" class="empty--icon" src="@/static/goods/cart.png"></image>
<view slot="btn" class="empty--btn" @click="onTargetIndex"></view>
</BsEmpty>
<view class="title">为您推荐</view>
<BsGoodsGroup></BsGoodsGroup>
<template v-if="!isLoading">
<view class="title">为您推荐</view>
<BsGoodsGroup></BsGoodsGroup>
</template>
<!-- 底部操作栏 -->
<view v-if="!list.length" class="footer">
<view v-if="list.length" class="footer">
<label class="all-radio" @click="handleCheckAll">
<radio class="radio" color="#fa2209" :checked="checkedIds.length > 0 && checkedIds.length === list.length" />
<radio class="radio" color="#fa2209"
:checked="checkedIds.length > 0 && checkedIds.length === list.length" />
<text>全选</text>
</label>
<view class="total-info">
@ -71,12 +76,12 @@
<!-- dev:下面的disabled条件使用checkedIds.join方式判断 -->
<!-- dev:通常情况下vue项目使用checkedIds.length更合理, 但是length属性在微信小程序中不起作用 -->
<view v-if="mode == 'normal'" class="btn-item btn-main" :class="{ disabled: checkedIds.length === 0 }"
@click="handleOrder()">
<text>去结算 {{ checkedIds.length > 0 ? `(${checkedIds.length})` : '' }}</text>
@click="handleOrder()">
<text>去结算 {{ checkedIds.length > 0 ? `(${checkedIds.length})` : '' }}</text>
</view>
<view v-if="mode == 'edit'" class="btn-item btn-main" :class="{ disabled: !checkedIds.length }"
@click="handleDelete()">
<text>删除</text>
@click="handleDelete()">
<text>删除</text>
</view>
</view>
</view>
@ -84,203 +89,208 @@
</view>
</template>
<script>
import { debounce } from '@/common/utils/utils';
import BsEmpty from '@/components/BsEmpty.vue';
import BsGoodsGroup from '@/components/BsGoodsGroup.vue';
import cartData from '@/mock/cart.json'
<script>import { Debounce } from '@/common/utils';
import BsEmpty from '@/components/BsEmpty.vue';
import BsGoodsGroup from '@/components/BsGoodsGroup.vue';
import UiPageHeader from '../../components/UiPageHeader.vue';
import {ApiGetCartList, ApiPutCartNum, ApiDeleteCartGoods} from '@/common/api/cart';
const CartIdsIndex = 'CartIds'
const CartIdsIndex = 'CartIds'
export default {
export default {
components: {
BsEmpty,
BsGoodsGroup,
UiPageHeader
BsEmpty,
BsGoodsGroup,
UiPageHeader
},
data() {
return {
//
isLoading: true,
// : normal edit
mode: 'normal',
//
list: [],
//
total: null,
// ID
checkedIds: [],
//
totalPrice: '0.00'
}
return {
//
isLoading: true,
// : normal edit
mode: 'normal',
//
list: [],
//
total: null,
// ID
checkedIds: [],
}
},
watch: {
//
checkedIds: {
handler(val) {
//
this.onCalcTotalPrice()
//
uni.setStorageSync(CartIdsIndex, val)
},
immediate: false
},
//
total(val) {
//
// setCartTotalNum(val)
// setCartTabBadge()
}
//
checkedIds: {
handler(val) {
//
console.log(val);
uni.setStorageSync(CartIdsIndex, val)
},
immediate: false
}
},
computed : {
totalPrice(){
const checkedList = this.list.filter(item => this.checkedIds.includes(item.id));
let tempPrice = 0;
checkedList.forEach(item => {
// , 便 ()
const unitPrice = item.productSku.sellPrice * 100
tempPrice += unitPrice * item.number
});
return (tempPrice / 100).toFixed(2)
}
},
/**
* 生命周期函数--监听页面显示
*/
onShow(options) {
//
// checkLogin() ? this.getCartList() : this.isLoading = false
this.isLoading = false
//
this.checkedIds = uni.getStorageSync(CartIdsIndex)
//
this.getCartList();
this.isLoading = false
//
this.checkedIds = uni.getStorageSync(CartIdsIndex)
},
methods: {
// ()
onCalcTotalPrice() {
const app = this
//
const checkedList = app.list.filter(item => app.checkedIds.length ? app.checkedIds.find(i => i === item.id) : false)
//
let tempPrice = 0;
checkedList.forEach(item => {
// , 便 ()
const unitPrice = item.goods.skuInfo.goods_price * 100
tempPrice += unitPrice * item.goods_num
})
app.totalPrice = (tempPrice / 100).toFixed(2)
},
//
getCartList() {
const app = this
app.isLoading = true
// CartApi.list()
// .then(result => {
// app.list = result.data.list
// app.total = result.data.cartTotal
// // checkedIdsID
// app.onClearInvalidId()
// })
// .finally(() => app.isLoading = false)
},
// checkedIdsID
onClearInvalidId() {
const app = this
const listIds = app.list.map(item => item.id)
app.checkedIds = listIds.filter(val => checkedIds.indexOf(val) > -1)
},
//
handleToggleMode() {
this.mode = this.mode == 'normal' ? 'edit' : 'normal'
},
//
onChangeStepper({ value }, item) {
//
if (item.goods_num == value) return
//
if (!item.debounceHandle) {
item.oldValue = item.goods_num
item.debounceHandle = debounce(this.onUpdateCartNum, 500)
}
//
item.goods_num = value
// ()
item.debounceHandle(item, item.oldValue, value)
},
//
onUpdateCartNum(item, oldValue, newValue) {
const app = this
// CartApi.update(item.goods_id, item.goods_sku_id, newValue)
// .then(result => {
// //
// app.total = result.data.cartTotal
// //
// app.onCalcTotalPrice()
// //
// item.debounceHandle = null
// })
// .catch(err => {
// //
// item.goods_num = oldValue
// setTimeout(() => app.$toast(err.errMsg), 10)
// })
},
//
onTargetGoods(goodsId) {
this.$navTo('pages/goods/detail', { goodsId })
},
// ,
onTargetIndex() {
this.$navTo('pages/index/index')
},
//
handleCheckItem(cartId) {
const { checkedIds } = this
const index = checkedIds.findIndex(id => id === cartId)
index < 0 ? checkedIds.push(cartId) : checkedIds.splice(index, 1)
},
//
handleCheckAll() {
const { checkedIds, list } = this
this.checkedIds = checkedIds.length === list.length ? [] : list.map(item => item.id)
},
//
handleOrder() {
const app = this
app.$Router.push({path : '/orderSubmit', query:{mode: 'cart', ids : '1,2,3'}})
if (app.checkedIds.length) {
const cartIds = app.checkedIds.join()
app.$Router.push('orderSubmit', { mode: 'cart', cartIds })
}
},
/**
* 获取购物车商品列表
*/
async getCartList() {
this.isLoading = true;
const {error, result} = await ApiGetCartList();
if(error){
uni.$u.toast(error.message);
return false;
}
this.list = result.map(item => {
const singleBuyLimit = item.product.singleBuyLimit;
const stock = item.productSku.stock;
const maxBuyNum = singleBuyLimit ? Math.min(singleBuyLimit, stock || 1) : stock
return {
...item,
maxBuyNum
}
});
this.onClearInvalidId();
this.isLoading = false;
},
/**
* 清除checkedIds中无效的ID
*/
onClearInvalidId() {
// const app = this
// const listIds = app.list.map(item => item.id)
this.checkedIds = this.checkedIds.filter(i => this.list.findIndex(item => item.id === i));
// listIds.filter(val => checkedIds.indexOf(val) > -1)
},
/**
* 切换当前模式
*/
handleToggleMode() {
this.mode = this.mode == 'normal' ? 'edit' : 'normal'
},
/**
* 监听步进器更改事件
*/
onChangeStepper({ value }, item) {
//
if (item.number == value) {
uni.$u.toast('数量不能再少了');
return false
}
//
if (!item.debounceHandle) {
item.oldValue = item.number
item.debounceHandle = Debounce(this.updateCartNum, 500)
}
//
item.number = value
// ()
item.debounceHandle(item, item.oldValue, value);
},
/**
* 提交更新购物车数量
*/
async updateCartNum(item, oldValue, newValue) {
const {error, result} = await ApiPutCartNum({
id : item.id,
number : item.number
});
if(error){
this.$toast(error.message);
item.number = item.sku;
return false;
}
if(result.isBeyondMaxLimit){
uni.$u.toast('数量超出范围');
item.number = result.canSetShoppingCartNumber;
return false;
}
},
//
handleDelete() {
const app = this
if (!app.checkedIds.length) {
return false
/**
* 选中商品
*/
handleCheckItem(cartId) {
const { checkedIds } = this
const index = checkedIds.findIndex(id => id === cartId)
index < 0 ? checkedIds.push(cartId) : checkedIds.splice(index, 1)
},
/**
* 全选事件
*/
handleCheckAll() {
const { checkedIds, list } = this
this.checkedIds = checkedIds.length === list.length ? [] : list.map(item => item.id)
},
/**
* 结算选中的商品
*/
handleOrder() {
const ids = this.checkedIds;
if (ids.length) {
app.$Router.push('orderSubmit', { mode: 'cart', ids:ids.join(',') })
}
},
/**
* 删除选中的商品
*/
handleDelete() {
const ids = this.checkedIds;
if (!ids.length) {
return false
}
uni.showModal({
title: '友情提示',
content: '您确定要删除该商品吗?',
showCancel: true,
success:async ()=> {
const {error} = await ApiDeleteCartGoods({idList : ids.join(',')});
if(error){
uni.$u.toast(error.message);
return false;
}
this.list = this.list.filter(item => !ids.includes(item.id));
// this.checkedIds = [];
this.onClearInvalidId();
}
})
}
uni.showModal({
title: '友情提示',
content: '您确定要删除该商品吗?',
showCancel: true,
success({ confirm }) {
//
confirm && app.onClearCart()
}
})
},
//
onClearCart() {
const app = this
// CartApi.clear(app.checkedIds)
// .then(result => app.getCartList())
}
}
}
}
</script>
<style>

@ -2,11 +2,11 @@
* @Author: ch
* @Date: 2022-03-24 11:30:55
* @LastEditors: ch
* @LastEditTime: 2022-04-02 18:10:15
* @LastEditTime: 2022-04-06 14:24:05
* @Description: file content
-->
<template>
<u-popup :show="value" round="24rpx">
<u-popup :show="visible" round="24rpx">
<view class="sku-popup">
<view class="product-info">
<image class="product-img" src="https://msb-edu-dev.oss-cn-beijing.aliyuncs.com/test/1.png"/>
@ -30,15 +30,16 @@
<text>数量</text>
<text>有货</text>
</view>
<u-number-box :min="1" :max="curSku.stock" button-size="40rpx" bgColor="#F5F6FA"
:value="curNum" >
<u-number-box :min="1" :max="maxBuyNum" button-size="40rpx" bgColor="#F5F6FA"
v-model="curBuyNum" >
<text slot="minus" class="cart-item--stepper-icon">-</text>
<text slot="plus" class="cart-item--stepper-icon">+</text>
</u-number-box>
</view>
<view class="footer">
<UiButton>加入购物</UiButton>
<UiButton @click="addCart"></UiButton>
<UiButton>立即购买</UiButton>
<UiButton>确认</UiButton>
</view>
</view>
@ -47,14 +48,15 @@
<script>
import UiButton from '../../../components/UiButton.vue';
import {ApiPutAddCart} from '@/common/api/cart';
export default {
components: { UiButton },
props: {
// true false
value: {
Type: Boolean,
default: false,
visible : {
type : Boolean,
default : false
},
// 1: 2: 3:
mode: {
@ -77,7 +79,7 @@ export default {
// props
attributeGroupList : [],
//
curNum : 1,
curBuyNum : 1,
};
},
watch : {
@ -107,6 +109,16 @@ export default {
return activeAttr ? activeAttr.symbol : ''
}).filter(i => i);
return this.skuInfo.find(i => i.attributeSymbolList === skuSymbolList.join(',')) || {};
},
/**
* 最大可购买数量
* 1有限购则对比限购跟库存取最小值
* 2没限购取库存
*/
maxBuyNum(){
const singleBuyLimit = this.goodsInfo.singleBuyLimit;
const stock = this.curSku.stock;
return singleBuyLimit ? Math.min(singleBuyLimit, stock || 1) : stock;
}
},
methods: {
@ -133,7 +145,7 @@ export default {
return false;
}
// 1
this.curNum = 1;
this.curBuyNum = 1;
//
this.attributeGroupList[groupIndex].attributes.forEach(item =>{
@ -158,8 +170,29 @@ export default {
}
})
})
},
/**
* 加入购物车
*/
async addCart(){
const {error, result} = await ApiPutAddCart({
productSkuId : this.curSku.skuId,
productId : this.goodsInfo.id,
number : this.curBuyNum
});
if(error){
uni.$u.toast(error.message);
return false;
}
this.$Router.push('/cart');
},
/**
* 立即购买
*/
buyNow(){
}
},
}
};
</script>

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-03-23 17:27:21
* @LastEditors: ch
* @LastEditTime: 2022-04-02 16:21:43
* @LastEditTime: 2022-04-06 09:47:06
* @Description: file content
-->
<template>
@ -20,7 +20,7 @@
<Service></Service>
<u-cell label="选择" :border="false" isLink @click="onShowSkuPopup()"></u-cell>
<SkuPopup v-model="showSkuPopup" :mode="skuMode" :goodsInfo="goods" :skuInfo="skuInfo" @addCart="onAddCart" ></SkuPopup>
<SkuPopup v-model="selectedSkuInfo" :visible="showSkuPopup" :mode="skuMode" :goodsInfo="goods" :skuInfo="skuInfo" @addCart="onAddCart" ></SkuPopup>
</view>
<view class="goods-desc">
<mp-html :content="goods.content"/>
@ -53,7 +53,11 @@ export default {
skuInfo : [],
showSkuPopup : false,
// sku 1: 2: 3:
skuMode : 1
skuMode : 1,
selectedSkuInfo : {
sku : '',
num : 1
}
}
},
onLoad(){

Loading…
Cancel
Save