From 677b0d040a88a2a58c04dfa72260948f2e7257f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=98=8E=E6=98=8E?= <970899069@qq.com> Date: Fri, 22 Sep 2023 09:46:47 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=AD=E7=89=A9=E8=BD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/index.js | 6 +- api/interfaces/bag.js | 44 +++++ api/request.js | 4 +- app.json | 9 +- pages/bag/bag.js | 307 ++++++++++++++++++++++++++++++++ pages/bag/bag.json | 4 + pages/bag/bag.wxml | 63 +++++++ pages/bag/bag.wxss | 108 +++++++++++ pages/mall/details/details.js | 149 +++++++++------- pages/mall/details/details.wxml | 37 ++-- pages/mall/details/details.wxss | 149 ++++------------ project.private.config.json | 7 + static/icons/bag_more_icon.png | Bin 0 -> 3066 bytes static/icons/mobile_icon.png | Bin 0 -> 6480 bytes static/icons/null_icon.png | Bin 0 -> 10375 bytes 15 files changed, 686 insertions(+), 201 deletions(-) create mode 100644 api/interfaces/bag.js create mode 100644 pages/bag/bag.js create mode 100644 pages/bag/bag.json create mode 100644 pages/bag/bag.wxml create mode 100644 pages/bag/bag.wxss create mode 100644 static/icons/bag_more_icon.png create mode 100644 static/icons/mobile_icon.png create mode 100644 static/icons/null_icon.png diff --git a/api/index.js b/api/index.js index 774d756..49ce09b 100644 --- a/api/index.js +++ b/api/index.js @@ -36,6 +36,9 @@ import withdraw from "./interfaces/withdraw" // 售后服务 import refund from "./interfaces/refund" +// 购物袋 +import bag from "./interfaces/bag" + export default { auth, bank, @@ -47,5 +50,6 @@ export default { pay, idcard, withdraw, - refund + refund, + bag } \ No newline at end of file diff --git a/api/interfaces/bag.js b/api/interfaces/bag.js new file mode 100644 index 0000000..116bc70 --- /dev/null +++ b/api/interfaces/bag.js @@ -0,0 +1,44 @@ +/* + * 手太欠 + * 愿这世界都如故事里一样 美好而动人~ +*/ + +import { req } from "../request" + +// 购物车数量 +const count = () => req({ + url: "mall/carts/count" +}) + +// 加入购物车 +const add = data => req({ + url : "mall/carts", + method : "POST", + data +}) + +// 购物车列表 +const list = () => req({ + url: "mall/carts" +}) + +// 购物车数量变更 +const putNum = (cart_id, data) => req({ + url : "mall/carts/" + cart_id, + method : "PUT", + data +}) + +// 删除产品 +const del = cart_id => req({ + url : "mall/carts/" + cart_id, + method : "DELETE" +}) + +export default ({ + count, + add, + list, + putNum, + del +}) \ No newline at end of file diff --git a/api/request.js b/api/request.js index baffe03..1916203 100644 --- a/api/request.js +++ b/api/request.js @@ -7,9 +7,9 @@ import { errInfo } from './err' import { updToken } from './updateToken' // 正式地址 -const api = "https://api.xuanhuojk.com/api/" +// const api = "https://api.xuanhuojk.com/api/" // 测试地址 -// const api = "https://api.xhtest.douhuofalv.com/api/" +const api = "https://api.xhtest.douhuofalv.com/api/" const header = { "Accept" : "application/json" } diff --git a/app.json b/app.json index d5a9a92..7bde636 100644 --- a/app.json +++ b/app.json @@ -38,7 +38,8 @@ "pages/refund/info/info", "pages/refund/deliver/deliver", "pages/refund/logs/logs", - "pages/richText/richText" + "pages/richText/richText", + "pages/bag/bag" ], "window": { "backgroundTextStyle": "light", @@ -60,6 +61,12 @@ "iconPath": "/static/tabBarIcon/tabBar_01.png", "selectedIconPath": "/static/tabBarIcon/tabBar_selected_01.png" }, + { + "pagePath": "pages/bag/bag", + "text": "购物袋", + "iconPath": "/static/tabBarIcon/tabBar_01.png", + "selectedIconPath": "/static/tabBarIcon/tabBar_selected_01.png" + }, { "pagePath": "pages/user/index", "text": "我的", diff --git a/pages/bag/bag.js b/pages/bag/bag.js new file mode 100644 index 0000000..ff8e400 --- /dev/null +++ b/pages/bag/bag.js @@ -0,0 +1,307 @@ + +var goodsIndex = '', + sellerIndex = '' + +Page({ + /** + * 页面的初始数据 + */ + data: { + bags : [], // 购物车列表 + isUser : false, // 是否登录 + bagId : '', + allCheckbox : false, + bagNumber : 0, + allPrice : '0.00', + bagOrderLoading : false + }, + /** + * 生命周期函数 - 页面显示 + */ + onShow(){ + let token = wx.getStorageSync('token') || null + this.setData({ + isUser : token != null, + bagOrderLoading : false, + allCheckbox : false, + bagNumber : 0, + allPrice : '0.00', + bagId : '', + }) + + if(token != null){ + wx.showLoading({ + title: '加载中...', + mask : true + }) + wx.$api.bag.list().then(res => { + res.data.map(val => { + val.shop.mallState = false + val.items.map(val => { + val.state = false + }) + }) + this.setData({ + pagesLoding: false, + bags : res.data + }) + wx.hideLoading() + }) + } + }, + /** + * 商品数量加减 + */ + goodsNumber(e){ + goodsIndex = e.currentTarget.dataset.goods + sellerIndex = e.currentTarget.dataset.seller + + let goodsNumber = this.data.bags[sellerIndex].items[goodsIndex].qty + + if (e.currentTarget.dataset.type == 'plus'){ + goodsNumber = goodsNumber + 1 + }else{ + if (goodsNumber > 1){ + goodsNumber = goodsNumber - 1 + }else{ + wx.showToast({ + title : '商品数量不能小于1', + icon : 'none' + }) + return + } + } + this.setnumNumber(goodsIndex, sellerIndex, goodsNumber) + }, + /** + * 输入商品数量 + */ + goodsNumberInput(e){ + goodsIndex = e.currentTarget.dataset.goods + sellerIndex = e.currentTarget.dataset.seller + + let setnumNumber = this.data.bags[sellerIndex].items[goodsIndex].number, + inputValue = Number() + if (e.detail.value > 0){ + inputValue = Number(e.detail.value) + }else{ + wx.showToast({ + title : '商品数量不能小于1', + icon : 'none' + }) + inputValue = Number(setnumNumber) + } + this.setnumNumber(goodsIndex, sellerIndex, inputValue) + }, + /** + * 更新商品数量 + */ + setnumNumber(goodsIndex, sellerIndex, setnumNumber){ + wx.showLoading({ + title: '加载中', + }) + let atGoods = this.data.bags + wx.$api.bag.putNum(atGoods[sellerIndex].items[goodsIndex].cart_id, { + qty : setnumNumber, + sku_id: atGoods[sellerIndex].items[goodsIndex].sku_id + }).then(res => { + atGoods[sellerIndex].items[goodsIndex].qty = res.data + this.setData({ + bags: atGoods + }) + this.totalPrice() + wx.hideLoading() + }) + }, + /** + * 单选 + */ + checkbox(e){ + goodsIndex = e.currentTarget.dataset.goods + sellerIndex = e.currentTarget.dataset.seller + + console.log(e.currentTarget.dataset) + + let goodsList = this.data.bags, + checkbox = goodsList[sellerIndex].items[goodsIndex].state, + seller = goodsList[sellerIndex].items, + sellerLength = 0 + + goodsList[sellerIndex].items[goodsIndex].state = !checkbox + + for (let i in seller){ + if (seller[i].state){ + sellerLength++ + if (sellerLength == goodsList[sellerIndex].items.length){ + goodsList[sellerIndex].shop.mallState = true + } + }else{ + goodsList[sellerIndex].shop.mallState = false + this.setData({ + allCheckbox: false + }) + } + } + + this.allCheckbox('checkbox') + + this.setData({ + bags: goodsList + }) + + this.totalPrice() + }, + /** + * 店铺全选 + */ + sellerCheckbox(e){ + sellerIndex = e.currentTarget.dataset.seller + + let goodsList = this.data.bags, + allCheckbox = this.data.allCheckbox, + seller = goodsList[sellerIndex].shop.mallState, + sellerLengh = 0 + + goodsList[sellerIndex].shop.mallState = !seller + + for (let i in goodsList[sellerIndex].items){ + goodsList[sellerIndex].items[i].state = !seller + } + + for (let j in goodsList){ + if (goodsList[j].shop.mallState){ + sellerLengh++ + if (sellerLengh == goodsList.length){ + allCheckbox = true + }else{ + allCheckbox = false + } + } + } + + this.allCheckbox('checkbox') + + this.setData({ + bags : goodsList, + allCheckbox : allCheckbox + }) + + this.totalPrice() + }, + /** + * 全选 + */ + allCheckbox(type){ + let goodsLenght = 0, + allCheckbox = this.data.allCheckbox, + goodsList = this.data.bags + + if (type == 'checkbox'){ + for (let j in goodsList) { + if (goodsList[j].shop.mallState) { + goodsLenght++ + if (goodsLenght == goodsList.length) { + allCheckbox = true + } + } + } + }else{ + allCheckbox = !allCheckbox + for (var i in goodsList){ + goodsList[i].shop.mallState = allCheckbox + + for (let k in goodsList[i].items){ + goodsList[i].items[k].state = allCheckbox + } + } + } + this.setData({ + allCheckbox : allCheckbox, + bags : goodsList + }) + this.totalPrice() + }, + /** + * 计算价格 + */ + totalPrice() { + let bagNumber = 0, + allPrice = 0, + bagIdArr = [], + goodsList = this.data.bags + + for (var i in goodsList){ + for (let j in goodsList[i].items){ + if (goodsList[i].items[j].state){ + bagNumber = bagNumber + goodsList[i].items[j].qty + allPrice = allPrice + (goodsList[i].items[j].qty * goodsList[i].items[j].price) + bagIdArr.push(goodsList[i].items[j].cart_id) + } + } + } + this.setData({ + bagNumber : bagNumber, + allPrice : allPrice.toFixed(2), + bagId : bagIdArr.join(",") + }) + }, + /** + * 购物车提交 + */ + bagOrder(){ + this.setData({ + bagOrderLoading:true + }) + if (this.data.bagId != ''){ + + console.log('提交的数据id:' + this.data.bagId) + + // setTimeout(() => { + // this.setData({ + // bagOrderLoading: false + // }) + // }, 2000) + }else{ + wx.showToast({ + title : '请选择结算商品', + icon : 'none' + }) + + this.setData({ + bagOrderLoading: false + }) + } + }, + /** + * 菜单 + */ + actionSheet(e){ + goodsIndex = e.currentTarget.dataset.goods + sellerIndex = e.currentTarget.dataset.seller + + let goodsList = this.data.bags, + cartId = this.data.bags[sellerIndex].items[goodsIndex].cart_id + + wx.showActionSheet({ + itemList: ['删除'], + success : res=>{ + wx.showLoading({ + title: '加载中', + }) + wx.$api.bag.del(cartId).then(res => { + goodsList[sellerIndex].items.splice([goodsIndex],1) + if (goodsList[sellerIndex].items.length == 0){ + goodsList.splice([sellerIndex], 1) + } + this.setData({ + bags: goodsList + }) + this.totalPrice() + wx.showToast({ + title: '已删除' + }) + }) + } + }) + }, +}) \ No newline at end of file diff --git a/pages/bag/bag.json b/pages/bag/bag.json new file mode 100644 index 0000000..b67c440 --- /dev/null +++ b/pages/bag/bag.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "购物车" +} \ No newline at end of file diff --git a/pages/bag/bag.wxml b/pages/bag/bag.wxml new file mode 100644 index 0000000..6aca81d --- /dev/null +++ b/pages/bag/bag.wxml @@ -0,0 +1,63 @@ + + + + + + + + + 全选 + + + + + + + + + + + {{ bagList.shop.name }} + + + + + + + + {{item.name}} + {{item.sku_name}} + + ¥{{item.price}} + + - + + + + + + + + + + + + + + + + + 购物袋中暂无任何商品 + + + + + 未登录,无法获取您的购物车信息 + + + + + 合计¥{{allPrice}} + 共计{{bagNumber}}件,不含运费 + + + diff --git a/pages/bag/bag.wxss b/pages/bag/bag.wxss new file mode 100644 index 0000000..7ce7194 --- /dev/null +++ b/pages/bag/bag.wxss @@ -0,0 +1,108 @@ + +.content{ background: #f7f8f9; min-height: 100vh; } + + /* 工具栏 */ +.bag-header{ border-bottom: solid 1rpx #f1f1f1; padding: 25rpx 30rpx; overflow: hidden; position: fixed; width: 100%; top: 0; left: 0; box-sizing: border-box; line-height: 40rpx; } + +/* 购物车列表 */ +.bag-content{ padding: 90rpx 0 140rpx 0; background: #f7f8f9; } +.bag-content-mall{ background: white; margin-top: 30rpx; padding-bottom: 20rpx; } +.bag-content-mall-name{ line-height: 80rpx; padding: 0 30rpx; border-bottom: solid 1rpx #f1f1f1; } +.bag-content-mall-goods{ position: relative; padding: 20rpx 30rpx 0 30rpx; } + +.mall-good-cover{ + width: 148rpx; + height: 148rpx; + background: #f5f6fa; + vertical-align: top; +} + +.mall-good-content{ + position: absolute; + top: 20rpx; + left: 268rpx; + right: 96rpx; +} + +.mall-good-value{ + color: #747788; + font-size: 24rpx; + line-height: 40rpx; +} + +.mall-good-title{ + line-height: 40rpx; +} + +.mall-good-price{ + color: #e92344; + padding-top: 20rpx; + line-height: 48rpx; + font-weight: bold; + padding-right: 200rpx; + position: relative; +} + +.mall-good-number{ + display: flex; + position: absolute; + right: 0; + top: 18rpx; + width: 180rpx; + font-weight: normal; + text-align: center; + height: 50rpx; +} + +.mall-good-number-btn{ + width: 50rpx; +} + +.mall-good-number-input{ + flex: 1; + margin: 0 6rpx; + height: 50rpx; + line-height: 50rpx; +} + +.mall-good-number-input, +.mall-good-number-btn{ + background: #f5f6fa; + color: #464854; +} + +.mall-good-more{ + height: 148rpx; + line-height: 148rpx; + width: 36rpx; + padding: 0 30rpx; + position: absolute; + top: 20rpx; + right: 0; +} + +.mall-good-more image{ + width: 100%; + vertical-align: middle; +} + +/* footer */ +.bag-footer{ position: fixed; bottom: 0; left: 0; width: 100%; padding: 20rpx 300rpx 20rpx 30rpx; box-sizing: border-box; border-top: solid 1rpx #f1f1f1; } +.bag-footer, .bag-header{ background: white; z-index: 9; } +.bag-footer-price{ font-size: 32rpx; font-weight: bold; } +.bag-footer-price text{ color: #da2b54; } +.bag-footer-rests{ color: #747788; font-size: 26rpx; } +.bag-footer-rests, +.bag-footer-price{ line-height: 40rpx; } +.bag-footer-btn[size="mini"]{ position: absolute; right: 30rpx; top: 20rpx; width: 240rpx; height: 80rpx; line-height: 80rpx; border-radius: 40rpx; background: #da2b54; color: white; font-size: 32rpx; } +.bag-footer-btn::after{ border: none; } + +/* checkbox */ +.checkbox{ height: 40rpx; width: 40rpx; line-height: 40rpx; display: inline-block; padding-top: 54rpx; padding-right: 30rpx; } +.checkbox.sellerCheckbox, +.checkbox.allCheckbox{ padding-top: 0; } +.checkbox.allCheckbox{ padding-right: 10rpx; } +.checkbox checkbox{ vertical-align: top; margin-top: -2rpx; } +.checkbox checkbox .wx-checkbox-input{ background: white; border-radius: 50%; border:solid 3rpx #464854; height: 34rpx; width: 34rpx; } +.checkbox checkbox .wx-checkbox-input.wx-checkbox-input-checked{ background: #da2b54; border-color: #da2b54; } +.checkbox checkbox .wx-checkbox-input.wx-checkbox-input-checked:before{ top: 18rpx; right: 5rpx; color: white; line-height: 34rpx; text-align: center; width: 36rpx; height: 36rpx; font-size:36rpx; } diff --git a/pages/mall/details/details.js b/pages/mall/details/details.js index 4f45342..86b661e 100644 --- a/pages/mall/details/details.js +++ b/pages/mall/details/details.js @@ -11,20 +11,21 @@ Page({ data: { isFixedTop : 0, barHeight : getApp().globalData.barHeight, // 状态栏高度 - goodsId : '', // 商品id - goodsData : '', // 商品数据 - mallContent : '', // 商品详情 - skus : [], // 显示的规格-提交 + goodsId : '', // 商品id + goodsData : '', // 商品数据 + mallContent : '', // 商品详情 + skus : [], // 显示的规格-提交 skuid : '', - specselect : '', // 确认购买的规格 - selectSkusValues: '', // 默认选项 - valueId : '', // 选中规格id - valueIndex : '', // 选中规格下标index + specselect : '', // 确认购买的规格 + selectSkusValues: '', // 默认选项 + valueId : '', // 选中规格id + valueIndex : '', // 选中规格下标index specselectIndex : '', - qtyNumber : 1, // 产品数量 + qtyNumber : 1, // 产品数量 goodsSize : false, invite : '', - isParent : false, // 绑定邀请码 + isParent : false, // 绑定邀请码 + buyType : null // 购物方式 }, /** @@ -34,7 +35,9 @@ Page({ this.setData({ goodsId: options.id, }) - getApp().globalData.invite = options.invite || '' + if(getApp().globalData.invite == '' && options.invite){ + getApp().globalData.invite = options.invite + } }, /** @@ -85,8 +88,8 @@ Page({ mask : true }) wx.request({ - // url : 'https://api.xhtest.douhuofalv.com/api/mall/goods/' + this.data.goodsId, - url : 'https://api.xuanhuojk.com/api/mall/goods/' + this.data.goodsId, + url : 'https://api.xhtest.douhuofalv.com/api/mall/goods/' + this.data.goodsId, + // url : 'https://api.xuanhuojk.com/api/mall/goods/' + this.data.goodsId, header : { "Accept" : "application/json", "channel" : "client", @@ -120,21 +123,6 @@ Page({ }) } }) - // wx.$api.mall.goodsSee(this.data.goodsId).then(res => { - // this.setData({ - // goodsData : res.data, - // mallContent : res.data.content.replace(/\{ - // console.log(err) - // }).finally(() => { - // wx.hideLoading() - // }) }, /** @@ -228,9 +216,10 @@ Page({ /** * 规格弹出 */ - buyPop() { + buyPop(e) { this.setData({ - goodsSize: !this.data.goodsSize + goodsSize : !this.data.goodsSize, + buyType : e.currentTarget.dataset.type }) }, @@ -239,52 +228,86 @@ Page({ */ closeTap() { this.setData({ - goodsSize: false + goodsSize: false, + buyType : null }) }, /** - * 确认购买 + * 检查登录状态 */ buyTap() { - // 获取登录状态 - if(wx.getStorageSync("token") != ''){ - let { - sku_id, - stock - } = this.data.selectSkusValues; - if (stock > 0) { - this.setData({ - skuid : sku_id, - goodsSize : false - }) - // 是否有推荐人 - if(this.data.goodsData.has_parent) { - wx.navigateTo({ - url: '/pages/mall/confirm/confirm?skuId=' + sku_id + '&qty=' + this.data.qtyNumber || 1 - }) - return - } - // 显示绑定手机号弹窗 - this.setData({ - isParent: true - }) - } else { - uni.showToast({ - title: '当前商品库存不足', - icon: 'none', - mask: true, - duration: 2000 - }) + let token = wx.getStorageSync("token") || null + if(token != null){ + switch (this.data.buyType) { + case 'card': + this.orderCard() + break; + default: + this.orderBuy() + break; } - }else{ - // 去登录 wx.navigateTo({ url: "/pages/login/index" }) } }, + /** + * 立即购买 + */ + orderBuy(){ + let { sku_id, stock } = this.data.selectSkusValues; + if (stock > 0) { + this.setData({ + skuid : sku_id, + goodsSize : false + }) + // 是否有推荐人 + if(this.data.goodsData.has_parent) { + wx.navigateTo({ + url: '/pages/mall/confirm/confirm?skuId=' + sku_id + '&qty=' + this.data.qtyNumber || 1 + }) + return + } + // 显示绑定手机号弹窗 + this.setData({ + isParent: true + }) + } else { + uni.showToast({ + title: '当前商品库存不足', + icon: 'none', + mask: true, + duration: 2000 + }) + } + }, + /** + * 加入购物车 + */ + orderCard(){ + let { sku_id, stock } = this.data.selectSkusValues; + let qty = this.data.qtyNumber || 1 + if (stock <= 0) { + uni.showToast({ + title: '当前商品库存不足', + icon : 'none', + }) + return + } + wx.showLoading({ + title: '加载中...', + mask : true + }) + wx.$api.bag.add({ sku_id, qty }).then(res => { + wx.showToast({ + title: "已加入", + icon: "success" + }) + this.closeTap() + }) + }, /** * 监听页面滑动事件 diff --git a/pages/mall/details/details.wxml b/pages/mall/details/details.wxml index fe50e2c..a7e8f46 100644 --- a/pages/mall/details/details.wxml +++ b/pages/mall/details/details.wxml @@ -53,23 +53,23 @@ - - ¥{{goodsData.original_price}} - - + + - - - - - - ¥{{selectSkusValues.price}} - 剩余库存: {{selectSkusValues.stock}} - 当前商品库存不足 + + + + + + + + {{selectSkusValues.price}} + 剩余库存: {{selectSkusValues.stock}} + {{item.name}} @@ -88,12 +88,13 @@ + - - - 抱歉,商品库存不足了 ~ - - - + + diff --git a/pages/mall/details/details.wxss b/pages/mall/details/details.wxss index ab3db16..f818ab4 100644 --- a/pages/mall/details/details.wxss +++ b/pages/mall/details/details.wxss @@ -48,7 +48,6 @@ page { height: 100%; } -/* 产品 */ /* 产品详情 */ .goodsCont { padding: 30rpx; @@ -206,82 +205,51 @@ button.goodsInfo-share[size="mini"] { /* 底部 */ .footer { width: 100%; - height: 60px; background-color: #ffffff; + border-top-right-radius: 40rpx; + border-top-left-radius: 40rpx; position: fixed; left: 0; bottom: 0; + padding: 30rpx 20rpx 50rpx; z-index: 9; box-sizing: border-box; display: flex; } -.number { - flex: 1; - line-height: 60px; - color: #da2b54; - display: flex; - padding: 0 30rpx; - box-sizing: border-box; -} - -.number text { - font-size: 28rpx; - padding-top: 10rpx; -} - -.number-price { - padding: 0 5rpx; - font-size: 46rpx; -} - -.number-vip { - margin-left: 20rpx; - font-size: 26rpx; - color: #8d97a1; - padding-top: 6rpx; - box-sizing: border-box; -} - -.btn-disabled { - color: #FFFFFF; - line-height: 60px; - text-align: center; - border: none; - border-radius:0; - background-color: #da2b54; - padding: 0; - margin: 0; -} - -button[disabled]{ - padding: 0; - padding: 0; - height: 100rpx; - line-height: 60px; - color: white !important; - opacity: .8; - background-color: transparent !important; -} +button.btn-disabled[size="mini"]{ line-height: 90rpx; border-radius: 45rpx; background: #da2b54; color: white; font-size: 30rpx; width: calc(50% - 20rpx); } +button.btn-disabled.card[size="mini"]{ background: orange; } /* 规格弹出 */ +.goods-size-back { position: fixed; top: 0; left: 0; height: 100%; width: 100%; background: rgba(0, 0, 0, 0.3); z-index: 9; display: none; } +.goods-size-back.active { display: block; } +.goods-size-content { position: fixed; bottom: -100%; left: 0; width: 100%; background: white; z-index: 100; transition: all 0.2s; border-radius: 40rpx 40rpx 0 0;} +.goods-size-content.active { bottom: 0; } -/* 规格 */ -.goods-size-back { - position: fixed; - top: 0; - left: 0; - height: 100%; - width: 100%; - background: rgba(0, 0, 0, 0.3); - z-index: 9; - display: none; -} +.goods-size-flex{ display: flex; justify-content: space-between; align-items: flex-end; padding: 30rpx; position: relative; } +.goods-size-cover{ background: #f7f8f9; width: 188rpx; height: 188rpx; border-radius: 20rpx; } +.goods-size-info{ width: calc(100% - 188rpx); padding-left: 30rpx; } +.goods-size-price{ font-size: 44rpx; font-weight: bold; color: #da2b54; line-height: 60rpx; } +.goods-size-price text{ font-size: 80%; } +.goods-size-text{ font-size: 28rpx; color: gray; line-height: 50rpx; } -.goods-size-back.active { - display: block; -} +.goods-size-remove{ position: absolute; right: 30rpx; top: 30rpx; padding: 10rpx; } +.goods-size-close{ width: 38rpx; height: 38rpx; vertical-align: top; } + +.goods-size-tag { padding: 0 30rpx 30rpx; } +.goods-size-tag-text { background: #f5f6fa; color: #999; line-height: 50rpx; margin: 20rpx 20rpx 0 0; padding: 0 15rpx; display: inline-block; font-size: 24rpx; border-radius: 10rpx; } +.goods-size-tag-text.active { color: #fff; background: #da2b54; } +.goods-size-title{ font-weight: bold; line-height: 50rpx; font-size: 30rpx; } + +.goods-size-number { color: #747788; display: flex; align-items: center; justify-content: space-between; padding: 30rpx; } +.goods-number { display: flex; height: 48rpx; border-radius: 10rpx; } +.goods-number-btn { background-color: #f7f8f9; width: 48rpx; height: 48rpx; line-height: 44rpx; text-align: center; border-radius: 24rpx; font-size: 30rpx; font-weight: bold; } +.goods-number-input { width: 80rpx; text-align: center; height: 48rpx; } + +.goods-size-btn{ padding: 30rpx 30rpx 50rpx; } +.goods-size-btn button[size="default"]{ background: #da2b54; color: white; line-height: 90rpx; padding: 0; border-radius: 45rpx; width: 100%; margin: 0; } +/* .goods-size-content { position: fixed; @@ -300,9 +268,7 @@ button[disabled]{ top: 30rpx; } -.goods-size-content.active { - bottom: 0; -} + .goods-size-img { position: absolute; @@ -353,56 +319,7 @@ button[disabled]{ font-size: 26rpx; } -.goods-size-tag { - padding: 0 20rpx 20rpx 20rpx; -} -.goods-size-tag-text { - background: #f5f6fa; - color: #999; - margin: 20rpx 10rpx 0 10rpx; - line-height: 50rpx; - padding: 0 15rpx; - display: inline-block; - font-size: 24rpx; - border-radius: 10rpx; -} - -.goods-size-tag-text.active { - color: #fff; - background: #da2b54; -} - -.goods-size-number { - padding: 10rpx 30rpx 80rpx 30rpx; - line-height: 60rpx; - color: #747788; -} - -.goods-number { - display: flex; - float: right; - margin-top: 25rpx; - height: 48rpx; - border: 2rpx solid #d7d7d7; - border-radius: 10rpx; -} - -.goods-number-btn { - background-color: transparent; - width: 48rpx; - height: 48rpx; - line-height: 48rpx; - text-align: center; -} - -.goods-number-input { - width: 80rpx; - text-align: center; - height: 48rpx; - border-left: 2rpx solid #d7d7d7; - border-right: 2rpx solid #d7d7d7; -} .goods-size-btn button[size="default"] { text-align: center; @@ -418,7 +335,7 @@ button[disabled]{ .goods-size-btn view.active { background: #b8b8b8; -} +} */ /* 邀请码弹出 */ diff --git a/project.private.config.json b/project.private.config.json index 5a1307e..9cb3045 100644 --- a/project.private.config.json +++ b/project.private.config.json @@ -8,6 +8,13 @@ "condition": { "miniprogram": { "list": [ + { + "name": "购物车", + "pathName": "pages/bag/bag", + "query": "", + "launchMode": "default", + "scene": null + }, { "name": "朋友圈进入详情", "pathName": "pages/mall/details/details", diff --git a/static/icons/bag_more_icon.png b/static/icons/bag_more_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..47344e8375e32501824e1b89ed83d9c18f1e959d GIT binary patch literal 3066 zcmZ`*X*?9{*S>9K36pK?J1s~=kCZ(bWou+?$(DW1KDGu~N*LK1jD*r;D5XrYCHvS$ zku|$XgRxKczy9xs=Y2oCAI^PU_wSr@-Pe6Sorh*72JEbYtN;LZL)caL5!xIDiuu^l znam!2;|N&%Vb*~FuyOwlI*^;s4*;vNhn}99nY&+*U!c36zqp~Ep16O2pR0$r3jkpw zSo2V;3>u&21kHsLp*yrvnd2P;B&G1o?GWoC$P?iB0K%o+5}(A1;Nd-)53^{F9bkoF zlcoz#6WnwjCD|lf+*Vr_8!P<~6;54R+WoOxOU@_n^&opWQ75@%)8~sk!6kV774;#p zG*eh}M;(fu7dFW#4w)x5xiPf>u)=^0iw=6LwMX~H56}bufpgMaZBvJFHDFGOLcF%*ImX5cI+XQCWdnLt9TNyiwL)`hI{*|$SH25~tI-2J zQSNRAaU+Jp^ZgBzID7wi0*nqc60^ELeD^4S!N~k zbMmCPVPpoQo)Z8FZj-(osA-|e^RrX)u4HfOMoZCw*NUH{ro`&RLG5FDMgTGCrH3idN+vSuD*4jLQU`7E_xDrJkfv2C zZ_D#OTD5veFq1THLwUjz0Z;n$`0@eri~^akAEO~H%2eh(I<0Q z^@jlM=yiq1f^6vk;-;dEqydo8u$`tYM+drdN@f74{l$O#RVLJ^l^KAmg)wK}>Ks4u zg$Lirk^e=cwh>D2c9SSd=lU|MHM4LX@?f5!d&7ag`7rXJK`A z>ue-%dM8(wdKMxpI*a`JmPMe2)&TM~+pRJS&ayj*sF&9)-kZ(fSibX>4d6s9KI1M{ z^uR;mX=c4Q?ThQ}_hWaQ+219^Un@+272k5MZWTz8;A>TOS+&v~3_vhYj4(3S3w-U0cTIQ2&fn{%<7lm%T)8xyf4xVdhrK64fk8n_p>oi(+_gNq z{GXBVk@^v*rGO>ACCUgj*dMEnmB((X`>4}`S!yoU+^mVO84d3Jt@+KFf?QzP?A+v7 z7$+HQ`fL<$LVr^SsU)#~&Z{tAL<@K;sX4E7p`CwuJ@p`vRvt{fI!Sb|NpE&9CK(o= zBFHW$y3MGDK{Z|Re!@<8m7gwSURNBQJd{UEnoC+{>(6v&dgZ#-kgC1~b#=ANkKu># z9gC@#2J*cM9P5W`NB2_VU+CwzTu;83+?G9(9Z6)$HqNHupCU97NW>=M2i|b-HbtJ| zGid2;CS;j+B2PV!`0-VFUU_p!p3el&G*8-@{xh5Az9UMDdyA}#xr@h^E^Rq($!z&- z^@?-}bBPRI4!Rr}5ER@M;_Y8cDVb9FifhJwU9fZ$a(f<#T~~#^yn!Zi<%Hxw&3#HA zmHIvlCuYqFF4y#b__kS`_c?E@eAwsvc$Y>?RN1caxjdl`yRRBlosAWm)%3lt8Ek1@ zY12BItavBnj`f}0I#JX2`LYFr=Y85on{6lSh!GCzni?)UJqrw)t(x@D!k;D9zpR&> z(5RP+9*o9BAKxq3y}U!*Py5p_gC*%bfjARQ?8tMT61yYx@L;}rgNpf#vi6sr>jj}<>WHhXOZ(hokAIjowQl0?ZEX>UhjA#QgIc$!i0)4m)Sw|t=O>nU|^}Ofn*w^j}%>C+3W(o`` z*RS3Xj8`c3Db#pgNB#A<7%Or|#Gtbx;-14F;jZCv;b?O zrSTmzhNKzoVZ7{a+SR$~^%iJBgO-h|?P(qBKgnr!E4BU`k~F7Lnd%$m8WkD_(f<2W zus61T6c-wC$?{4?(1tPPGKu=_{*GtkK;Vx*KhD`bL)KAS7lo>QWyggHGBuljLbjHm zp{&bBV|L+bVQ=>8NA`ao-{Jgyzv`gUrO{{dk3*wF?^kP1DhEqq!9nKXx5TM_gD!&s zscTXxX;?8aA$GyKwYxnTQ>E`pxqCaK5r;@hU>SL0e|q;uuhrhr3fp#aZ$kwVw;n(( z!@W^&lWG&I?Llg+zT7MC8I7V6s5KL9bz+#)d)fzP>!cm$w$eURnkG5&U{8_uV0~An z|JjA3ZByJC1~&#ET;^yCjRRo&@CX+G2tE(MZwCO>p8^2&dt%>m4FI}RhF5iNg^etZ zRkFls^CwL8qK$={T1z^t_#`00a`7b{5X_viE?V!>3UZelsdk{-L%Dv2w1tJBjw$pN z>aeM}#~fp~`7i0C|4ZWd+>gjkJJvQ5M1hpHqpsM(OcW^i~|-ukiqvd6P@VoCiZz);`hYK5*t?0*0}%fr?H literal 0 HcmV?d00001 diff --git a/static/icons/mobile_icon.png b/static/icons/mobile_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..66d68576cb0d4954333eeeabd7ee250db8fdf2b3 GIT binary patch literal 6480 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