Files
lucky_shop/components/ns-goods-sku/ns-goods-sku-index.vue
ZF sun 2337e3cacf refactor: 将项目内硬编码文本替换为多语言调用
统一替换所有页面和组件中的硬编码字符串为 $lang 多语言方法调用,提升项目国际化适配能力
2026-06-22 14:04:13 +08:00

234 lines
6.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="goods-sku">
<ns-login ref="login"></ns-login>
<!-- sku选择 -->
<ns-goods-sku v-if="goodsDetail.goods_id" ref="goodsSku" :goods-id="goodsDetail.goods_id"
:goods-detail="goodsDetail" :max-buy="goodsDetail.max_buy" :min-buy="goodsDetail.min_buy"
@refresh="refreshGoodsSkuDetail"></ns-goods-sku>
</view>
</template>
<script>
// 商品SKU
export default {
name: 'ns-goods-sku-index',
data() {
return {
timeout: {},
isRepeat: false,
goodsDetail: {}
};
},
created() { },
methods: {
/**
* 添加购物车
* @param {Object} config 购物车事件(detail-详情,cart-加入购物车)
* @param {Object} data 商品项
*/
addCart(config, data, event) {
if (!this.storeToken) {
this.$refs.login.open(this.$util.INDEX_PAGE_URL);
return;
}
if (config == "detail" || data.is_virtual) {
this.$util.redirectTo('/pages_goods/detail', {
goods_id: data.goods_id
});
return false;
}
// 多规格
if (data.goods_spec_format) {
this.multiSpecificationGoods(data);
} else {
this.singleSpecificationGoods(data, event);
}
},
/**
* 单规格
* @param {Object} data 商品项
*/
singleSpecificationGoods(data, event) {
let cart =
this.cartList['goods_' + data.goods_id] && this.cartList['goods_' + data.goods_id]['sku_' + data
.sku_id
] ?
this.cartList['goods_' + data.goods_id]['sku_' + data.sku_id] :
null;
let cartNum = cart ? cart.num : 0;
let api = cart && cart.cart_id ? '/api/cart/edit' : '/api/cart/add';
let minBuy = data.min_buy > 0 ? data.min_buy : 1;
let num = cartNum >= minBuy ? cartNum : minBuy;
let _num = num;
if (cart && cart.cart_id) {
_num = _num + (data.min_buy > 0 ? data.min_buy : 1)
}
let cart_id = cart ? cart.cart_id : 0;
if (_num > parseInt(data.stock)) {
this.$util.showToast({
title: this.$lang('sku.stockInsufficient')
});
return;
}
if (data.is_limit && data.max_buy && _num > parseInt(data.max_buy)) {
this.$util.showToast({
title: this.$lang('sku.maxBuyPerPerson') + data.max_buy + (data.unit || this.$lang('sku.unit'))
});
return;
}
if (cart) {
this.cartList['goods_' + data.goods_id]['sku_' + data.sku_id].num = _num;
} else {
// 如果商品第一次添加,则初始化数据
if (!this.cartList['goods_' + data.goods_id]) {
this.cartList['goods_' + data.goods_id] = {};
}
let discount_price = data.discount_price;
if (data.member_price > 0 && Number(data.member_price) <= Number(data.discount_price)) {
discount_price = data.member_price;
}
this.cartList['goods_' + data.goods_id]['sku_' + data.sku_id] = {
cart_id,
goods_id: data.goods_id,
sku_id: data.sku_id,
num: _num,
discount_price
};
}
if (this.isRepeat) return;
this.isRepeat = true;
this.$emit('addCart', event.currentTarget.id);
this.$api.sendRequest({
url: api,
data: {
cart_id,
sku_id: data.sku_id,
num: _num
},
success: res => {
this.isRepeat = false;
if (res.code == 0) {
if (cart_id == 0) {
this.cartList['goods_' + data.goods_id]['sku_' + data.sku_id].cart_id =
res.data;
}
this.$util.showToast({
title: this.$lang('sku.addToCartSuccess')
});
this.$store.commit('setCartChange');
this.$store.dispatch('cartCalculate');
this.$emit("cartListChange", this.cartList);
} else {
this.$util.showToast({
title: res.message
});
}
}
});
},
/**
* 多规格
* @param {Object} data 商品项
*/
multiSpecificationGoods(data) {
this.$api.sendRequest({
url: '/api/goodssku/getInfoForCategory',
data: {
sku_id: data.sku_id
},
success: res => {
if (res.code >= 0) {
let item = res.data;
item.unit = item.unit || '件';
if (item.sku_images) item.sku_images = item.sku_images.split(',');
else item.sku_images = [];
// 多规格时合并主图
if (item.goods_spec_format && item.goods_image) {
item.goods_image = item.goods_image.split(',');
item.sku_images = item.goods_image.concat(item.sku_images);
}
// 当前商品SKU规格
if (item.sku_spec_format) item.sku_spec_format = JSON.parse(item.sku_spec_format);
// 商品SKU格式
if (item.goods_spec_format) item.goods_spec_format = JSON.parse(item.goods_spec_format);
// 限时折扣
if (item.promotion_type == 1) {
item.discountTimeMachine = this.$util.countDown(item.end_time - res.timestamp);
}
if (item.promotion_type == 1 && item.discountTimeMachine) {
if (item.member_price > 0 && Number(item.member_price) <= Number(item.discount_price)) {
item.show_price = item.member_price;
} else {
item.show_price = item.discount_price;
}
} else if (item.member_price > 0) {
item.show_price = item.member_price;
} else {
item.show_price = item.price;
}
this.goodsDetail = item;
this.$nextTick(() => {
if (this.$refs.goodsSku) {
this.$refs.goodsSku.show("join_cart", (res) => {
let goods = this.cartList['goods_' + res.goods_id];
let cart = null;
if (goods && goods['sku_' + res.sku_id]) {
cart = goods['sku_' + res.sku_id];
}
if (cart) {
this.cartList['goods_' + res.goods_id]['sku_' + res.sku_id].num = res.num;
} else {
// 如果商品第一次添加,则初始化数据
if (!this.cartList['goods_' + res.goods_id]) {
this.cartList['goods_' + res.goods_id] = {};
}
this.cartList['goods_' + res.goods_id]['sku_' + res.sku_id] = {
cart_id: res.cart_id,
goods_id: res.goods_id,
sku_id: res.sku_id,
num: res.num,
discount_price: res.discount_price
};
}
this.$store.dispatch('cartCalculate');
this.$emit("cartListChange", this.cartList);
// 加入购物车动效
setTimeout(() => {
this.$store.commit('setCartChange');
}, 100);
});
}
});
}
}
});
},
refreshGoodsSkuDetail(data) {
this.goodsDetail = Object.assign({}, this.goodsDetail, data);
}
}
};
</script>