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}}
+
+ -
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 购物袋中暂无任何商品
+
+
+
+
+ 未登录,无法获取您的购物车信息
+
+
+
+
+
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 @@
-
-
-
-
-
- ¥{{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
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
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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