From 8e2e817a4d4b58e9ae0d597504e19c40873c472f Mon Sep 17 00:00:00 2001 From: ZF sun <34314687@qq.com> Date: Fri, 26 Dec 2025 15:23:28 +0800 Subject: [PATCH] =?UTF-8?q?chore(=E7=BB=84=E4=BB=B6):=20=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E6=96=B9=E6=A1=88=E5=AE=9E=E6=96=BD=E5=8F=AF?= =?UTF-8?q?=E8=A1=8C=E6=80=A7=E6=9C=80=E9=AB=98=E7=9A=84=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/goods-detail-view/detail.js | 465 ++++++++++++++++++ .../goods-detail-view/goods-detail-view.vue | 455 +++++++++++++++++ .../ns-goods-action-button.vue | 96 ++++ .../ns-goods-action-icon.vue | 146 ++++++ .../ns-goods-action/ns-goods-action.vue | 33 ++ .../ns-goods-promotion/ns-goods-promotion.vue | 125 +++++ pages_goods/detail.vue | 10 +- pages_tool/article/list.vue | 2 +- pages_tool/components/ns-adv/ns-adv.vue | 120 +++++ pages_tool/files/list.vue | 2 +- pages_tool/goods/brand.vue | 2 +- 11 files changed, 1448 insertions(+), 8 deletions(-) create mode 100644 pages_goods/components/goods-detail-view/detail.js create mode 100644 pages_goods/components/goods-detail-view/goods-detail-view.vue create mode 100644 pages_goods/components/ns-goods-action-button/ns-goods-action-button.vue create mode 100644 pages_goods/components/ns-goods-action-icon/ns-goods-action-icon.vue create mode 100644 pages_goods/components/ns-goods-action/ns-goods-action.vue create mode 100644 pages_goods/components/ns-goods-promotion/ns-goods-promotion.vue create mode 100644 pages_tool/components/ns-adv/ns-adv.vue diff --git a/pages_goods/components/goods-detail-view/detail.js b/pages_goods/components/goods-detail-view/detail.js new file mode 100644 index 0000000..45a3720 --- /dev/null +++ b/pages_goods/components/goods-detail-view/detail.js @@ -0,0 +1,465 @@ +// 商品详情业务 +import { + Weixin +} from '@/common/js/wx-jssdk.js'; + +export default { + data() { + return { + skuId: 0, + goodsId: 0, + isIphoneX: false, //判断手机是否是iphoneX以上 + whetherCollection: 0, + + //是否开启预览,0:不开启,1:开启 + preview: 0, + videoContext: '', + + // 媒体,图片,视频 + + // 解决每个商品SKU图片数量不同时,无法切换到第一个,导致轮播图显示不出来 + swiperInterval: 1, + swiperAutoplay: false, + swiperCurrent: 1, + switchMedia: 'img', + + //评价 + goodsEvaluate: [{ + member_headimg: '', + member_name: '', + content: '', + images: [], + create_time: 0, + sku_name: '' + }], + evaluateConfig: { + evaluate_audit: 1, + evaluate_show: 0, + evaluate_status: 1 + }, + + // 是否可分享到好物圈 + goodsCircle: false, + service: null, + shareUrl: '', // 分享链接 + source_member: 0, //分享人的id + isCommunity: false, //社群弹窗 + + poster: "-1", //海报 + posterMsg: "", //海报错误信息 + posterHeight: 0, + posterParams: {}, //海报所需参数 + goodsRoute: '', + posterApi: '', + goodsAttrShow: false, // 商品属性是否展开 + + //门店列表 + storeList: { + data: [], + page: 1, + page_size: 10 + }, + isShowStore: false, + latitude: null, // 纬度 + longitude: null, // 经度 + evaluateCount: 0, // 商品评论数量 + deliveryType: null, // 配送方式 + isVirtual: 0 //是否为虚拟商品 + } + }, + created() { + this.isIphoneX = this.$util.uniappIsIPhoneX(); + + if (this.location) { + this.latitude = this.location.latitude; + this.longitude = this.location.longitude; + } else { + this.$util.getLocation(); + } + this.getStoreData(); + }, + watch: { + location: function (nVal) { + if (nVal) { + this.latitude = nVal.latitude; + this.longitude = nVal.longitude; + this.getStoreData(); + } + } + }, + methods: { + init(params) { + this.skuId = params.sku_id; + this.goodsId = params.goods_id; + this.preview = params.preview; + this.source_member = params.source_member; + this.whetherCollection = params.whetherCollection; + this.posterParams = params.posterParams; + + this.shareUrl = params.shareUrl; + this.goodsRoute = params.goodsRoute; + this.posterApi = params.posterApi; + this.isVirtual = params.isVirtual; + this.deliveryType = params.deliveryType; + this.evaluateConfig = params.evaluateConfig; + + if (this.evaluateConfig.evaluate_show == 1) { + //商品评论 + this.getGoodsEvaluate(params.evaluateList); + this.evaluateCount = params.evaluateCount; + } + + for (let k in this.deliveryType) { + if (k == 'store') { + this.isShowStore = true; + } + } + + this.getService(); + + this.videoContext = uni.createVideoContext('goodsVideo'); + + // #ifdef MP-WEIXIN + this.goodsSyncToGoodsCircle(); + // #endif + + }, + swiperChange(e) { + this.swiperCurrent = e.detail.current + 1; + }, + + //-------------------------------------服务------------------------------------- + + openMerchantsServicePopup() { + this.$refs.merchantsServicePopup.open(); + }, + closeMerchantsServicePopup() { + this.$refs.merchantsServicePopup.close(); + }, + + //-------------------------------------门店列表------------------------------------- + openStoreListPopup() { + this.$refs.storeListPopup.open(); + }, + closeStoreListPopup() { + this.$refs.storeListPopup.close(); + }, + getStoreData() { + //门店列表 + let data = { + page: this.storeList.page, + page_size: this.storeList.page_size + }; + if (this.latitude && this.longitude) { + data.latitude = this.latitude; + data.longitude = this.longitude; + } + this.$api.sendRequest({ + url: '/api/store/page', + data: data, + success: res => { + if (this.storeList.page == 1) this.storeList.data == []; + if (res.code >= 0 && res.data) { + this.storeList.data = this.storeList.data.concat(res.data.list); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + }, + selectStore(item) { + this.$util.redirectTo('/pages_tool/store/detail', { + store_id: item.store_id + }); + this.closeStoreListPopup(); + }, + //-------------------------------------属性------------------------------------- + + switchGoodsAttr() { + this.goodsAttrShow = !this.goodsAttrShow; + }, + //-------------------------------------评价------------------------------------- + //商品评论列表 + getGoodsEvaluate(list) { + if (list) { + this.goodsEvaluate = list; + this.goodsEvaluate.forEach((item, index) => { + if (this.goodsEvaluate[index].images) this.goodsEvaluate[index].images = this.goodsEvaluate[index].images.split(","); + if (this.goodsEvaluate[index].is_anonymous == 1) this.goodsEvaluate[index].member_name = this.goodsEvaluate[index].member_name.replace(this.goodsEvaluate[index].member_name.substring(1, this.goodsEvaluate[index].member_name.length - 1), '***') + }) + // if (this.goodsEvaluate.images) this.goodsEvaluate.images = this.goodsEvaluate.images.split(","); + // if (this.goodsEvaluate.is_anonymous == 1) this.goodsEvaluate.member_name = this.goodsEvaluate.member_name.replace( + // this.goodsEvaluate.member_name.substring(1, this.goodsEvaluate.member_name.length - 1), '***') + } + }, + // 预览评价图片 + previewEvaluate(index, img_index, field) { + var paths = []; + for (let i = 0; i < this.goodsEvaluate[index][field].length; i++) { + paths.push(this.$util.img(this.goodsEvaluate[index][field][i])); + } + uni.previewImage({ + current: img_index, + urls: paths + }); + }, + //-------------------------------------关注------------------------------------- + async collection() { + if (this.preview) return; // 开启预览,禁止任何操作和跳转 + + if (this.storeToken) { + + //未关注添加关注 + if (this.whetherCollection == 0) { + let res = await this.$api.sendRequest({ + url: "/api/goodscollect/add", + data: { + sku_id: this.skuId, + goods_id: this.goodsSkuDetail.goods_id, + sku_name: this.goodsSkuDetail.sku_name, + sku_price: this.goodsSkuDetail.show_price, + sku_image: this.goodsSkuDetail.sku_image + }, + async: false, + }); + var data = res.data; + if (data > 0) { + this.whetherCollection = 1; + } + } else { + //已关注取消关注 + let res = await this.$api.sendRequest({ + url: "/api/goodscollect/delete", + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + async: false, + }); + var data = res.data; + if (data > 0) { + this.whetherCollection = 0; + } + } + return this.whetherCollection; + } else { + if (this.source_member) { + this.$refs.login.open(this.shareUrl + '&source_member=' + this.source_member); + } else { + this.$refs.login.open(this.shareUrl); + } + } + }, + //-------------------------------------分享------------------------------------- + // 打开分享弹出层 + openSharePopup() { + this.$refs.sharePopup.open(); + }, + // 关闭分享弹出层 + closeSharePopup() { + this.$refs.sharePopup.close(); + }, + copyUrl() { + let text = this.$config.h5Domain + this.shareUrl; + if (this.memberInfo && this.memberInfo.member_id) text += '&source_member=' + this.memberInfo.member_id; + this.$util.copy(text, () => { + this.closeSharePopup(); + }); + }, + + //-------------------------------------海报------------------------------------- + // 打开海报弹出层 + openPosterPopup() { + this.getGoodsPoster(); + this.$refs.sharePopup.close(); + }, + // 关闭海报弹出层 + closePosterPopup() { + this.$refs.posterPopup.close(); + this.poster = '' + }, + //生成海报 + getGoodsPoster() { + uni.showLoading({ + 'title': '海报生成中...' + }) + //活动海报信息 + if (this.memberInfo && this.memberInfo.member_id) this.posterParams.source_member = this.memberInfo.member_id; + + this.$api.sendRequest({ + url: this.posterApi, + data: { + page: this.goodsRoute, + qrcode_param: JSON.stringify(this.posterParams) + }, + success: res => { + if (res.code == 0) { + this.$refs.posterPopup.open(); + this.poster = res.data.path + "?time=" + new Date().getTime(); + } else { + this.posterMsg = res.message; + this.$util.showToast({ + title: res.message + }) + } + uni.hideLoading(); + }, + fail: err => { + uni.hideLoading(); + } + }); + }, + // 预览图片 + previewMedia(index) { + var paths = []; + for (let i = 0; i < this.goodsSkuDetail.sku_images.length; i++) { + paths.push(this.$util.img(this.goodsSkuDetail.sku_images[i], { + size: 'big' + })); + } + uni.previewImage({ + current: index, + urls: paths, + // longPressActions: { + // itemList: ['发送给朋友', '保存图片', '关注'], + // success: function(data) { + // console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片'); + // }, + // fail: function(err) { + // console.log(err.errMsg); + // } + // } + }); + }, + swiperImageError(index) { + this.goodsSkuDetail.sku_images[index] = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + // #ifdef MP || APP-PLUS + //小程序中保存海报 + saveGoodsPoster() { + let url = this.$util.img(this.poster); + uni.downloadFile({ + url: url, + success: (res) => { + if (res.errMsg == "downloadFile:ok") { + uni.saveImageToPhotosAlbum({ + filePath: res.tempFilePath, + success: () => { + this.$util.showToast({ + title: "保存成功" + }); + }, + fail: (err) => { + this.$util.showToast({ + title: "保存失败,请稍后重试" + }); + } + }); + } + }, + fail: (err) => { + this.$util.showToast({ + title: "保存失败,请稍后重试" + }); + } + }); + }, + // #endif + //售后保障查询 + getService() { + this.$api.sendRequest({ + url: '/api/goods/aftersale', + success: res => { + if (res.code == 0 && res.data) { + this.service = res.data; + } + } + }); + }, + + // #ifdef MP-WEIXIN + /** + * 将商品同步到微信圈子 + */ + goodsSyncToGoodsCircle() { + this.$api.sendRequest({ + url: '/goodscircle/api/goods/sync', + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + if (res.code == 0) { + this.goodsCircle = true; + } + } + }) + }, + /** + * 将商品推荐到微信圈子 + */ + openBusinessView() { + if (wx.openBusinessView) { + wx.openBusinessView({ + businessType: 'friendGoodsRecommend', + extraData: { + product: { + item_code: this.goodsSkuDetail.goods_id, + title: this.goodsSkuDetail.sku_name, + image_list: this.goodsSkuDetail.sku_images.map((ele) => { + return this.$util.img(ele); + }) + } + }, + success: function (res) { + console.log('success', res); + }, + fail: function (res) { + console.log('fail', res); + } + }) + } + }, + // #endif + toEvaluateDetail(id) { + this.$util.redirectTo('/pages_tool/goods/evaluate', { + goods_id: id + }); + }, + showImg(e) { + //拿到图片的路径里面的内容放在我们数组中 + let contentimg = e.target.dataset.nodes; + let arrImg = []; + for (var i = 0; i < contentimg.length; i++) { + var img = contentimg[i].children; + if (Array.isArray(img)) { + for (var j = 0; j < img.length; j++) { + if (img[j].attrs && img[j].name == "img") { + if (img[j].attrs.src) { + arrImg.push(img[j].attrs.src) + } + } + } + } + } + //最后一步就是把我们的所有图片放在预览的api中就可以了 + uni.previewImage({ + current: arrImg, + urls: arrImg, + }) + }, + + //-------------------------------------社群------------------------------------- + + //添加福利群 + onCommunity() { + this.isCommunity = true + }, + onCloseCommunity() { + this.isCommunity = false + }, + + } + +} \ No newline at end of file diff --git a/pages_goods/components/goods-detail-view/goods-detail-view.vue b/pages_goods/components/goods-detail-view/goods-detail-view.vue new file mode 100644 index 0000000..7590573 --- /dev/null +++ b/pages_goods/components/goods-detail-view/goods-detail-view.vue @@ -0,0 +1,455 @@ + + + + + + \ No newline at end of file diff --git a/pages_goods/components/ns-goods-action-button/ns-goods-action-button.vue b/pages_goods/components/ns-goods-action-button/ns-goods-action-button.vue new file mode 100644 index 0000000..7798141 --- /dev/null +++ b/pages_goods/components/ns-goods-action-button/ns-goods-action-button.vue @@ -0,0 +1,96 @@ + + + + + \ No newline at end of file diff --git a/pages_goods/components/ns-goods-action-icon/ns-goods-action-icon.vue b/pages_goods/components/ns-goods-action-icon/ns-goods-action-icon.vue new file mode 100644 index 0000000..f958edd --- /dev/null +++ b/pages_goods/components/ns-goods-action-icon/ns-goods-action-icon.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/pages_goods/components/ns-goods-action/ns-goods-action.vue b/pages_goods/components/ns-goods-action/ns-goods-action.vue new file mode 100644 index 0000000..4e9e0f5 --- /dev/null +++ b/pages_goods/components/ns-goods-action/ns-goods-action.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/pages_goods/components/ns-goods-promotion/ns-goods-promotion.vue b/pages_goods/components/ns-goods-promotion/ns-goods-promotion.vue new file mode 100644 index 0000000..d102e84 --- /dev/null +++ b/pages_goods/components/ns-goods-promotion/ns-goods-promotion.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/pages_goods/detail.vue b/pages_goods/detail.vue index 101ce3f..6e7048c 100644 --- a/pages_goods/detail.vue +++ b/pages_goods/detail.vue @@ -522,18 +522,18 @@ + + \ No newline at end of file diff --git a/pages_tool/files/list.vue b/pages_tool/files/list.vue index d850b08..9c40ad4 100644 --- a/pages_tool/files/list.vue +++ b/pages_tool/files/list.vue @@ -68,7 +68,7 @@ } }, components: { - nsAdv: () => import('@/components/ns-adv/ns-adv.vue'), + nsAdv: () => import('@/pages_tool/components/ns-adv/ns-adv.vue'), nsEmpty: () => import('@/components/ns-empty/ns-empty.vue'), loadingCover: () => import('@/components/loading-cover/loading-cover.vue') }, diff --git a/pages_tool/goods/brand.vue b/pages_tool/goods/brand.vue index 4ba5448..33e5334 100644 --- a/pages_tool/goods/brand.vue +++ b/pages_tool/goods/brand.vue @@ -26,7 +26,7 @@