From 62d73ef052c590cf7fc0ef59ffbee04a455ababa Mon Sep 17 00:00:00 2001 From: xy <271556543@qq.com> Date: Fri, 7 Feb 2025 18:05:56 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/http.api.js | 17 +- package_sub/pages/Shop/Order.vue | 595 +++++++++++++- package_sub/pages/Shop/ProductDetail.vue | 949 +++++++++++++++++++++-- package_sub/pages/Shop/ProductList.vue | 4 + package_sub/pages/Shop/Reply.vue | 224 ++++++ package_sub/static/Shop/yishouxing.png | Bin 0 -> 8434 bytes pages.json | 6 + 7 files changed, 1713 insertions(+), 82 deletions(-) create mode 100644 package_sub/pages/Shop/Reply.vue create mode 100644 package_sub/static/Shop/yishouxing.png diff --git a/common/http.api.js b/common/http.api.js index 3c6dc2c..131b39b 100644 --- a/common/http.api.js +++ b/common/http.api.js @@ -42,8 +42,11 @@ let apiApp = { // 用户商城订单 userOrders: '/api/mobile/user/orders', userOrdersDetail: '/api/mobile/user/orders-detail', - - + // 购物车 + cartIndex: '/api/mobile/cart/index', + cartShow: '/api/mobile/cart/show', + cartSave: '/api/mobile/cart/save', + cartDestroy: '/api/mobile/cart/destroy', hospital: '/api/mobile/hospital/hospital', banner: '/api/mobile/other/banner', @@ -98,6 +101,13 @@ const install = (Vue, vm) => { const hospitalList = (params = {}) => vm.$u.get(apiApp.hospital, params) const banner = (params = {}) => vm.$u.get(apiApp.banner, params) + // end + // 购物车 + const cartList = (params = {}) => vm.$u.get(apiApp.cartIndex, params) + const cartShow = (params = {}) => vm.$u.get(apiApp.cartShow, params) + const cartSave = (params = {}) => vm.$u.post(apiApp.cartSave, params) + const cartDestroy = (params = {}) => vm.$u.get(apiApp.cartDestroy, params) + // end vm.$u.api = { @@ -122,7 +132,8 @@ const install = (Vue, vm) => { userAddress,userAddressShow,userAddressSave,userAddressDestroy, // 用户商城订单 userOrders,userOrdersDetail, - + // 购物车 + cartList, cartSave, cartShow, cartDestroy }; } diff --git a/package_sub/pages/Shop/Order.vue b/package_sub/pages/Shop/Order.vue index 0d799ea..054b954 100644 --- a/package_sub/pages/Shop/Order.vue +++ b/package_sub/pages/Shop/Order.vue @@ -1,23 +1,608 @@ diff --git a/package_sub/pages/Shop/ProductDetail.vue b/package_sub/pages/Shop/ProductDetail.vue index 1bb1130..8898b6a 100644 --- a/package_sub/pages/Shop/ProductDetail.vue +++ b/package_sub/pages/Shop/ProductDetail.vue @@ -1,12 +1,21 @@ @@ -65,106 +345,297 @@ export default { data() { return { + scrollTop: 0, + swiperIndex: 0, + showType: false, detail: {}, form: { - product_id: '', - product_sku_id: '' + num: 1, + product_id: "", + product_sku_id: "", }, tabs: [ { - text: '宝贝', - targetClass: 'price' + text: "宝贝", + targetClass: "content", }, { - text: '评价', - targetClass: 'comment' + text: "评价", + targetClass: "comment", }, { - text: '详情', - targetClass: 'detail' + text: "详情", + targetClass: "detail", }, { - text: '推荐', - targetClass: 'recommend' - } + text: "推荐", + targetClass: "recommend", + }, ], tabHeight: null, currentTab: 0, + + recommendPro: [], + timer: null, + cartNum: 0, + + commentList: [], + isSkuSubmit: false, + isImmediateBuy: false, }; }, computed: { - backTop() { - return (getApp().globalData.navbarHeight ?? 40) + 'px' + menuButtonLeft() { + return ( + uni.getSystemInfoSync().windowWidth - + uni.getMenuButtonBoundingClientRect().left + ); + }, + tabTop() { + return uni.getMenuButtonBoundingClientRect().bottom; }, swiper() { - return this.detail?.product_images?.map(i => i.image?.url) || [] + return this.detail?.product_images?.map((i) => i.image?.url) || []; }, productSku() { - return this.detail?.product_skus?.find(sku => sku.id === this.form.product_sku_id) - } + return this.detail?.product_skus?.find( + (sku) => sku.id === this.form.product_sku_id + ); + }, }, methods: { + toDetail(item) { + this.$u.route({ + url: '/package_sub/pages/Shop/ProductDetail', + params: { + id: item.id + } + }) + }, // 获取一个目标元素的高度 getElRect(elClass, dataVal) { return new Promise((resolve, reject) => { const query = uni.createSelectorQuery().in(this); - query.select('.' + elClass).fields({ - rect: true - }, res => { - // 如果节点尚未生成,res值为null,循环调用执行 - if (!res) { - setTimeout(() => { - this.getElRect(elClass); - }, 10); - return; - } - if(dataVal) { - this['dataVal'] = res.top; - } + query + .select("." + elClass) + .fields( + { + rect: true, + }, + (res) => { + // 如果节点尚未生成,res值为null,循环调用执行 + if (!res) { + setTimeout(() => { + this.getElRect(elClass); + }, 10); + return; + } + if (dataVal) { + this["dataVal"] = res.top; + } - resolve(res.top); - }).exec(); - }) + resolve(res.top); + } + ) + .exec(); + }); + }, + async getCartNum() { + try { + const res = await this.$u.api.cartList({ + page: 1, + page_size: 1, + }); + this.cartNum = res.total; + } catch (err) {} + }, + async getComment() { + this.commentList = [ + { + id: 1, + name: "叶轻眉", + date: "12-25 18:58", + contentText: + "我不信伊朗会没有后续反应,美国肯定会为今天的事情付出代价的", + url: "https://cdn.uviewui.com/uview/template/SmilingDog.jpg", + allReply: 12, + likeNum: 33, + isLike: false, + replyList: [ + { + name: "uview", + contentStr: + "uview是基于uniapp的一个UI框架,代码优美简洁,宇宙超级无敌彩虹旋转好用,用它!", + }, + { + name: "粘粘", + contentStr: + "今天吃什么,明天吃什么,晚上吃什么,我只是一只小猫咪为什么要烦恼这么多", + }, + ], + }, + { + id: 2, + name: "叶轻眉1", + date: "01-25 13:58", + contentText: + "我不信伊朗会没有后续反应,美国肯定会为今天的事情付出代价的", + allReply: 0, + likeNum: 11, + isLike: false, + url: "https://cdn.uviewui.com/uview/template/niannian.jpg", + }, + { + id: 3, + name: "叶轻眉2", + date: "03-25 13:58", + contentText: + "我不信伊朗会没有后续反应,美国肯定会为今天的事情付出代价的", + allReply: 0, + likeNum: 21, + isLike: false, + url: "../../../static/logo.png", + replyList: [ + { + name: "uview", + contentStr: + "uview是基于uniapp的一个UI框架,代码优美简洁,宇宙超级无敌彩虹旋转好用,用它!", + }, + { + name: "豆包", + contentStr: "想吃冰糖葫芦粘豆包,但没钱5555.........", + }, + ], + }, + { + id: 4, + name: "叶轻眉3", + date: "06-20 13:58", + contentText: + "我不信伊朗会没有后续反应,美国肯定会为今天的事情付出代价的", + url: "https://cdn.uviewui.com/uview/template/SmilingDog.jpg", + allReply: 0, + likeNum: 150, + isLike: false, + }, + ]; + }, + async getRecommendPro() { + try { + const res = await this.$u.api.productList({ + page: 1, + page_size: 6, + sort_name: "sort", + }); + this.recommendPro = res.list?.data; + } catch (err) {} }, async pageScrollHandle() { try { - if(true) { - const rect = await Promise.all(this.tabs.map((tab, index) => this.getElRect(tab.targetClass))) - console.log(345, rect) - this.tabHeight = rect + if (!this.tabHeight) { + const rect = await Promise.all( + this.tabs.map((tab, index) => this.getElRect(tab.targetClass)) + ); + this.tabHeight = rect; } } catch (err) { - console.error(err) + console.error(err); } }, + tabClick(index) { + this.currentTab = index; + uni.pageScrollTo({ + scrollTop: this.tabHeight[index] + 1, + }); + }, back() { this.$u.route({ - type: 'back' - }) + type: "back", + }); }, async getDetail(id) { try { const res = await this.$u.api.productDetail({ - id - }) - this.detail = res.detail - if (res.detail?.product_skus?.length > 0) { - this.form['product_sku_id'] = res.detail.product_skus[0].id - } + id, + }); + this.detail = res.detail; + // if (res.detail?.product_skus?.length > 0) { + // this.form["product_sku_id"] = res.detail.product_skus[0].id; + // } + this.$nextTick((_) => { + setTimeout((_) => { + this.pageScrollHandle(); + }, 500); + }); } catch (err) { - console.error(err) + console.error(err); } - } + }, + async confirm() { + try { + if (this.isSkuSubmit) { + if (!this.form.product_sku_id) { + this.$refs.uToast.show({ + title: "请选择产品规格", + type: "warning", + }); + return + } + if (!this.form.num) { + this.$refs.uToast.show({ + title: "请选择产品数量", + type: "warning", + }); + return + } + const res = await this.$u.api.cartSave(this.form); + this.$refs.uToast.show({ + title: "已加入购物车", + type: "success", + }); + this.getCartNum(); + } + if (this.isImmediateBuy) { + } + this.showType = false; + } catch (err) {} + }, + }, + created() { + this.getRecommendPro(); + this.getCartNum(); + this.getComment(); }, onLoad(option) { if (option.id) { - this.getDetail(option.id) + this.form.product_id = option.id; + this.getDetail(option.id); } }, - onPageScroll(e) { - this.pageScrollHandle() + onPageScroll({ scrollTop }) { + if (this.timer) return; + this.timer = setTimeout(() => { + // 节流 + this.timer = null; + this.scrollTop = scrollTop; + if (scrollTop < this.tabHeight[1]) { + this.currentTab = 0; + } else if ( + scrollTop >= this.tabHeight[1] && + scrollTop - this.tabTop - 86 < this.tabHeight[2] + ) { + this.currentTab = 1; + } else if ( + scrollTop - this.tabTop - 86 >= this.tabHeight[2] && + scrollTop - this.tabTop - 86 < this.tabHeight[3] + ) { + this.currentTab = 2; + } else { + this.currentTab = 3; + } + }, 100); }, -} +}; diff --git a/package_sub/pages/Shop/ProductList.vue b/package_sub/pages/Shop/ProductList.vue index 60c6097..59dd576 100644 --- a/package_sub/pages/Shop/ProductList.vue +++ b/package_sub/pages/Shop/ProductList.vue @@ -251,6 +251,10 @@ export default { font-weight: normal; font-size: 24rpx; color: $u-main-color; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + max-width: 180rpx; } .item-container { diff --git a/package_sub/pages/Shop/Reply.vue b/package_sub/pages/Shop/Reply.vue new file mode 100644 index 0000000..b0211fd --- /dev/null +++ b/package_sub/pages/Shop/Reply.vue @@ -0,0 +1,224 @@ + + + + + diff --git a/package_sub/static/Shop/yishouxing.png b/package_sub/static/Shop/yishouxing.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f9d33ca226fb5cb4add4ae1f475bd6ac6f038c GIT binary patch literal 8434 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 z56mri