|
|
|
|
@@ -80,117 +80,119 @@ export default {
|
|
|
|
|
methods: {
|
|
|
|
|
// 处理商品详情数据
|
|
|
|
|
async handleGoodsSkuData() {
|
|
|
|
|
// this.navbarData.title = this.goodsSkuDetail.goods_name.length > 9 ? this.goodsSkuDetail.goods_name.substr(0, 9) + "..." : this.goodsSkuDetail.goods_name;
|
|
|
|
|
//设置标题
|
|
|
|
|
// this.$langConfig.title(this.navbarData.title);
|
|
|
|
|
if (this.goodsSkuDetail.config) {
|
|
|
|
|
this.navbarData.navBarSwitch = this.goodsSkuDetail.config.nav_bar_switch;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.whetherCollection = this.goodsSkuDetail.is_collect; // 用户关注商品状态
|
|
|
|
|
|
|
|
|
|
this.modifyGoodsInfo();
|
|
|
|
|
|
|
|
|
|
// 初始化商品详情视图数据
|
|
|
|
|
if (this.$refs.goodsDetailView) this.$refs.goodsDetailView.init({
|
|
|
|
|
sku_id: this.skuId,
|
|
|
|
|
goods_id: this.goodsSkuDetail.goods_id,
|
|
|
|
|
preview: this.preview,
|
|
|
|
|
source_member: this.source_member,
|
|
|
|
|
posterParams: this.posterParams,
|
|
|
|
|
posterApi: this.posterApi,
|
|
|
|
|
shareUrl: this.shareUrl,
|
|
|
|
|
goodsRoute: this.goodsRoute,
|
|
|
|
|
isVirtual: this.goodsSkuDetail.is_virtual,
|
|
|
|
|
deliveryType: this.goodsSkuDetail.express_type,
|
|
|
|
|
whetherCollection: this.goodsSkuDetail.is_collect,
|
|
|
|
|
evaluateConfig: this.goodsSkuDetail.evaluate_config,
|
|
|
|
|
evaluateList: this.goodsSkuDetail.evaluate_list,
|
|
|
|
|
evaluateCount: this.goodsSkuDetail.evaluate_count
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
//媒体
|
|
|
|
|
if (this.goodsSkuDetail.video_url) this.switchMedia = "video";
|
|
|
|
|
|
|
|
|
|
if (!Array.isArray(this.goodsSkuDetail.sku_images)) {
|
|
|
|
|
if (this.goodsSkuDetail.sku_images) this.goodsSkuDetail.sku_images = this.goodsSkuDetail.sku_images.split(",");
|
|
|
|
|
else this.goodsSkuDetail.sku_images = [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 多规格时合并主图
|
|
|
|
|
if (this.goodsSkuDetail.goods_spec_format && this.goodsSkuDetail.goods_image) {
|
|
|
|
|
|
|
|
|
|
if (!Array.isArray(this.goodsSkuDetail.goods_image)) this.goodsSkuDetail.goods_image = this.goodsSkuDetail.goods_image.split(",");
|
|
|
|
|
|
|
|
|
|
this.goodsSkuDetail.sku_images = this.goodsSkuDetail.goods_image.concat(this.goodsSkuDetail.sku_images);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let maxHeight = '';
|
|
|
|
|
let systemInfo = uni.getSystemInfoSync();
|
|
|
|
|
this.goodsSkuDetail.goods_image_list.forEach((item, index) => {
|
|
|
|
|
if (typeof item.pic_spec == "string")
|
|
|
|
|
item.pic_spec = item.pic_spec.split('*');
|
|
|
|
|
|
|
|
|
|
let ratio = item.pic_spec[0] / systemInfo.windowWidth;
|
|
|
|
|
item.pic_spec[0] = item.pic_spec[0] / ratio;
|
|
|
|
|
item.pic_spec[1] = item.pic_spec[1] / ratio;
|
|
|
|
|
|
|
|
|
|
if (!maxHeight || maxHeight > item.pic_spec[1]) {
|
|
|
|
|
maxHeight = item.pic_spec[1];
|
|
|
|
|
// 鸿蒙兼容: 外层包 try/catch, 任何同步抛错都不会导致 page 整体空白
|
|
|
|
|
try {
|
|
|
|
|
if (this.goodsSkuDetail.config) {
|
|
|
|
|
this.navbarData.navBarSwitch = this.goodsSkuDetail.config.nav_bar_switch;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
this.goodsSkuDetail.swiperHeight = maxHeight + 'px';
|
|
|
|
|
|
|
|
|
|
this.goodsSkuDetail.unit = this.goodsSkuDetail.unit || this.$lang('unit.piece');
|
|
|
|
|
this.whetherCollection = this.goodsSkuDetail.is_collect; // 用户关注商品状态
|
|
|
|
|
|
|
|
|
|
// 当前商品SKU规格
|
|
|
|
|
if (this.goodsSkuDetail.sku_spec_format) this.goodsSkuDetail.sku_spec_format = JSON.parse(this.goodsSkuDetail.sku_spec_format);
|
|
|
|
|
this.modifyGoodsInfo();
|
|
|
|
|
|
|
|
|
|
// 商品属性
|
|
|
|
|
if (this.goodsSkuDetail.goods_attr_format) {
|
|
|
|
|
let goods_attr_format = JSON.parse(this.goodsSkuDetail.goods_attr_format);
|
|
|
|
|
this.goodsSkuDetail.goods_attr_format = this.$util.unique(goods_attr_format, "attr_id");
|
|
|
|
|
for (var i = 0; i < this.goodsSkuDetail.goods_attr_format.length; i++) {
|
|
|
|
|
for (var j = 0; j < goods_attr_format.length; j++) {
|
|
|
|
|
if (this.goodsSkuDetail.goods_attr_format[i].attr_id == goods_attr_format[j].attr_id && this.goodsSkuDetail.goods_attr_format[i].attr_value_id != goods_attr_format[j].attr_value_id) {
|
|
|
|
|
this.goodsSkuDetail.goods_attr_format[i].attr_value_name += "、" + goods_attr_format[j].attr_value_name;
|
|
|
|
|
// 初始化商品详情视图数据
|
|
|
|
|
if (this.$refs.goodsDetailView) this.$refs.goodsDetailView.init({
|
|
|
|
|
sku_id: this.skuId,
|
|
|
|
|
goods_id: this.goodsSkuDetail.goods_id,
|
|
|
|
|
preview: this.preview,
|
|
|
|
|
source_member: this.source_member,
|
|
|
|
|
posterParams: this.posterParams,
|
|
|
|
|
posterApi: this.posterApi,
|
|
|
|
|
shareUrl: this.shareUrl,
|
|
|
|
|
goodsRoute: this.goodsRoute,
|
|
|
|
|
isVirtual: this.goodsSkuDetail.is_virtual,
|
|
|
|
|
deliveryType: this.goodsSkuDetail.express_type,
|
|
|
|
|
whetherCollection: this.goodsSkuDetail.is_collect,
|
|
|
|
|
evaluateConfig: this.goodsSkuDetail.evaluate_config,
|
|
|
|
|
evaluateList: this.goodsSkuDetail.evaluate_list,
|
|
|
|
|
evaluateCount: this.goodsSkuDetail.evaluate_count
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
//媒体
|
|
|
|
|
if (this.goodsSkuDetail.video_url) this.switchMedia = "video";
|
|
|
|
|
|
|
|
|
|
if (!Array.isArray(this.goodsSkuDetail.sku_images)) {
|
|
|
|
|
if (this.goodsSkuDetail.sku_images) this.goodsSkuDetail.sku_images = this.goodsSkuDetail.sku_images.split(",");
|
|
|
|
|
else this.goodsSkuDetail.sku_images = [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 多规格时合并主图
|
|
|
|
|
if (this.goodsSkuDetail.goods_spec_format && this.goodsSkuDetail.goods_image) {
|
|
|
|
|
|
|
|
|
|
if (!Array.isArray(this.goodsSkuDetail.goods_image)) this.goodsSkuDetail.goods_image = this.goodsSkuDetail.goods_image.split(",");
|
|
|
|
|
|
|
|
|
|
this.goodsSkuDetail.sku_images = this.goodsSkuDetail.goods_image.concat(this.goodsSkuDetail.sku_images);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let maxHeight = '';
|
|
|
|
|
let systemInfo = uni.getSystemInfoSync();
|
|
|
|
|
this.goodsSkuDetail.goods_image_list.forEach((item, index) => {
|
|
|
|
|
if (typeof item.pic_spec == "string")
|
|
|
|
|
item.pic_spec = item.pic_spec.split('*');
|
|
|
|
|
|
|
|
|
|
let ratio = item.pic_spec[0] / systemInfo.windowWidth;
|
|
|
|
|
item.pic_spec[0] = item.pic_spec[0] / ratio;
|
|
|
|
|
item.pic_spec[1] = item.pic_spec[1] / ratio;
|
|
|
|
|
|
|
|
|
|
if (!maxHeight || maxHeight > item.pic_spec[1]) {
|
|
|
|
|
maxHeight = item.pic_spec[1];
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
this.goodsSkuDetail.swiperHeight = maxHeight + 'px';
|
|
|
|
|
|
|
|
|
|
this.goodsSkuDetail.unit = this.goodsSkuDetail.unit || this.$lang('unit.piece');
|
|
|
|
|
|
|
|
|
|
// 当前商品SKU规格
|
|
|
|
|
if (this.goodsSkuDetail.sku_spec_format) this.goodsSkuDetail.sku_spec_format = JSON.parse(this.goodsSkuDetail.sku_spec_format);
|
|
|
|
|
|
|
|
|
|
// 商品属性
|
|
|
|
|
if (this.goodsSkuDetail.goods_attr_format) {
|
|
|
|
|
let goods_attr_format = JSON.parse(this.goodsSkuDetail.goods_attr_format);
|
|
|
|
|
this.goodsSkuDetail.goods_attr_format = this.$util.unique(goods_attr_format, "attr_id");
|
|
|
|
|
for (var i = 0; i < this.goodsSkuDetail.goods_attr_format.length; i++) {
|
|
|
|
|
for (var j = 0; j < goods_attr_format.length; j++) {
|
|
|
|
|
if (this.goodsSkuDetail.goods_attr_format[i].attr_id == goods_attr_format[j].attr_id && this.goodsSkuDetail.goods_attr_format[i].attr_value_id != goods_attr_format[j].attr_value_id) {
|
|
|
|
|
this.goodsSkuDetail.goods_attr_format[i].attr_value_name += "、" + goods_attr_format[j].attr_value_name;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 商品SKU格式
|
|
|
|
|
if (this.goodsSkuDetail.goods_spec_format) this.goodsSkuDetail.goods_spec_format = JSON.parse(this.goodsSkuDetail.goods_spec_format);
|
|
|
|
|
// 商品SKU格式
|
|
|
|
|
if (this.goodsSkuDetail.goods_spec_format) this.goodsSkuDetail.goods_spec_format = JSON.parse(this.goodsSkuDetail.goods_spec_format);
|
|
|
|
|
|
|
|
|
|
// 商品详情
|
|
|
|
|
if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = (this.goodsSkuDetail.goods_content);
|
|
|
|
|
// if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = htmlParser(this.goodsSkuDetail.goods_content);
|
|
|
|
|
// 商品详情
|
|
|
|
|
if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = (this.goodsSkuDetail.goods_content);
|
|
|
|
|
// if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = htmlParser(this.goodsSkuDetail.goods_content);
|
|
|
|
|
|
|
|
|
|
//商品服务
|
|
|
|
|
if (this.goodsSkuDetail.goods_service) {
|
|
|
|
|
for (let i in this.goodsSkuDetail.goods_service) {
|
|
|
|
|
this.goodsSkuDetail.goods_service[i]['icon'] = this.goodsSkuDetail.goods_service[i]['icon'] ? JSON.parse(this.goodsSkuDetail.goods_service[i]['icon']) : '';
|
|
|
|
|
//商品服务
|
|
|
|
|
if (this.goodsSkuDetail.goods_service) {
|
|
|
|
|
for (let i in this.goodsSkuDetail.goods_service) {
|
|
|
|
|
this.goodsSkuDetail.goods_service[i]['icon'] = this.goodsSkuDetail.goods_service[i]['icon'] ? JSON.parse(this.goodsSkuDetail.goods_service[i]['icon']) : '';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.contactData = {
|
|
|
|
|
title: this.goodsSkuDetail.sku_name,
|
|
|
|
|
path: this.shareUrl,
|
|
|
|
|
img: this.$util.img(this.goodsSkuDetail.sku_image, {
|
|
|
|
|
size: 'big'
|
|
|
|
|
})
|
|
|
|
|
};
|
|
|
|
|
if (this.$refs.goodsPromotion) this.$refs.goodsPromotion.refresh(this.goodsSkuDetail.goods_promotion);
|
|
|
|
|
|
|
|
|
|
if (this.goodsRoute != '/pages_goods/detail') this.setPublicShare();
|
|
|
|
|
|
|
|
|
|
// this.getBarrageData();
|
|
|
|
|
// 性能优化: 商品表单(留言表单)仅在商品详情打开"立即留言"弹窗时才需要,
|
|
|
|
|
// 不再阻塞首次渲染。改为在后台并发请求, 用户真正打开弹窗时数据已就绪。
|
|
|
|
|
// 注意: 不再依赖 addonIsExist.form (后端可能未开启 form 插件, 但产品被设为"留言商品"(isinformation=2)
|
|
|
|
|
// 仍需展示留言表单), 始终尝试加载, getGoodsForm 内部已对失败分支兜底空数组。
|
|
|
|
|
this._goodsFormPromise = this.getGoodsForm();
|
|
|
|
|
// 不 await, 释放主流程; 调用方需要时可 await this._goodsFormPromise
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.error('handleGoodsSkuData failed:', e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.contactData = {
|
|
|
|
|
title: this.goodsSkuDetail.sku_name,
|
|
|
|
|
path: this.shareUrl,
|
|
|
|
|
img: this.$util.img(this.goodsSkuDetail.sku_image, {
|
|
|
|
|
size: 'big'
|
|
|
|
|
})
|
|
|
|
|
};
|
|
|
|
|
if (this.$refs.goodsPromotion) this.$refs.goodsPromotion.refresh(this.goodsSkuDetail.goods_promotion);
|
|
|
|
|
|
|
|
|
|
if (this.goodsRoute != '/pages_goods/detail') this.setPublicShare();
|
|
|
|
|
|
|
|
|
|
// this.getBarrageData();
|
|
|
|
|
// 性能优化: 商品表单(留言表单)仅在商品详情打开"立即留言"弹窗时才需要,
|
|
|
|
|
// 不再阻塞首次渲染。改为在后台并发请求, 用户真正打开弹窗时数据已就绪。
|
|
|
|
|
// 注意: 不再依赖 addonIsExist.form (后端可能未开启 form 插件, 但产品被设为"留言商品"(isinformation=2)
|
|
|
|
|
// 仍需展示留言表单), 始终尝试加载, getGoodsForm 内部已对失败分支兜底空数组。
|
|
|
|
|
this._goodsFormPromise = this.getGoodsForm();
|
|
|
|
|
// 不 await, 释放主流程; 调用方需要时可 await this._goodsFormPromise
|
|
|
|
|
},
|
|
|
|
|
/**
|
|
|
|
|
* 刷新商品详情数据
|
|
|
|
|
|