diff --git a/common/js/goods_detail_base.js b/common/js/goods_detail_base.js index fafe255..e634676 100644 --- a/common/js/goods_detail_base.js +++ b/common/js/goods_detail_base.js @@ -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 }, /** * 刷新商品详情数据 diff --git a/components-diy/diy-category.vue b/components-diy/diy-category.vue index b3db41b..f4af85f 100644 --- a/components-diy/diy-category.vue +++ b/components-diy/diy-category.vue @@ -170,8 +170,8 @@ --> - + diff --git a/components/ns-form/ns-form.vue b/components/ns-form/ns-form.vue index aff63e7..8738d3f 100644 --- a/components/ns-form/ns-form.vue +++ b/components/ns-form/ns-form.vue @@ -1,6 +1,6 @@