From 34590d9f729e14fd2fb7ea5e97d245cf3578390d Mon Sep 17 00:00:00 2001 From: zhangmanman <994797151@qq.com> Date: Wed, 30 Jun 2021 09:06:58 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=9B=B4=E6=96=B0]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/interfaces/user.js | 8 +- pages/car/index.js | 272 +++++++++++++++++++++- pages/car/index.wxml | 174 +++++++++++++- pages/car/index.wxss | 449 ++++++++++++++++++++++++++++++++++++- pages/order/order.js | 2 + pages/rights/rights.js | 10 +- static/img/carSite_add.png | Bin 0 -> 2241 bytes static/img/car_site.png | Bin 0 -> 2677 bytes static/img/car_state.png | Bin 0 -> 1629 bytes 9 files changed, 900 insertions(+), 15 deletions(-) create mode 100644 static/img/carSite_add.png create mode 100644 static/img/car_site.png create mode 100644 static/img/car_state.png diff --git a/api/interfaces/user.js b/api/interfaces/user.js index 0d0d979..3e3a9e0 100644 --- a/api/interfaces/user.js +++ b/api/interfaces/user.js @@ -53,7 +53,10 @@ const unicom = (mobile, channel, code) => req({url: "unicom/get", method: "POST" const merchant_card = (coupon_id) => req({url: "coupons/merchant_card", method: "GET", data:{coupon_id : coupon_id}}) // 获取商家券信息 -const washcarBuy = () => req({url: "washcar/create"}) +const washcarBuy = (welfare_id, right_id, qty, address_id) => req({url: "washcar/create", data:{welfare_id : welfare_id, right_id : right_id, qty : qty, address_id : address_id || ''}}) + +// 收银台提交 +const washcarCreate = (welfare_id, right_id, qty, address_id, is_deliver) => req({url: "washcar/create", method: "POST", data:{welfare_id : welfare_id, right_id : right_id, qty : qty, address_id : address_id || '', is_deliver : is_deliver}}) export default({ index, @@ -73,5 +76,6 @@ export default({ send, unicom, merchant_card, - washcarBuy + washcarBuy, + washcarCreate }) diff --git a/pages/car/index.js b/pages/car/index.js index 9b12f68..401d12e 100644 --- a/pages/car/index.js +++ b/pages/car/index.js @@ -8,15 +8,42 @@ Page({ * 页面的初始数据 */ data: { - + rightId : '', //权益id + welfareId : '', //活动id + address : '', //默认地址 + allAddress : '', //收货地址列表 + detail : '', //权益详情 + amount : '', //总金额 + moreAmount : '', //产品金额 + platIndex : 0, //选择提交方式下标 + isdeliver : -1, + platformCp : [], //选择提交数组 + num : 1, //购买的数量 + content : '', //内容介绍 + notification: '', //重要提示 + remark : '', //使用须知 + score : '', //应付总积分 + freight : '', //运费 + noticeShow : false, //须知显示状态 + addressShow : false, //收货地址显示 + payWayIndex : 0, + payWay :[ + {value: 0, name: "微信支付"} + // {value: 1, name: "沃钱包支付"} + ] }, /** * 生命周期函数--监听页面加载 */ onLoad (options) { - console.log(options) - // this.couponInfo() + this.setData({ + rightId : options.right_id, + welfareId: options.welfare_id + }) + + // 获取卡券列表 + this.couponInfo() }, /** @@ -30,8 +57,243 @@ Page({ * 卡券列表 */ couponInfo() { - wx.$api.user.washcarBuy().then(res=>{ - console.log(res) + wx.$api.user.washcarBuy(this.data.welfareId, this.data.rightId, this.data.num, this.data.address.id).then(res=>{ + let obj = res.data.detail.express + let defGet = res.data.detail.def_get + let arr = new Array + arr = Object.keys(obj).map(val=>{ + return { ...obj[val], ...{key: val} } + }) + + if(this.data.isdeliver == -1){ + if(res.data.detail.type == 'physical') { + this.setData({ + isdeliver : res.data.detail.def_get + }) + } + if(res.data.detail.type == 'virtual') this.setData({isdeliver : 1}) + } + + this.setData({ + address : res.data.address, + allAddress : res.data.all_address, + detail : res.data.detail, + num : res.data.qty, + freight : res.data.freight, + platformCp : arr, + amount : res.data.total, + moreAmount : res.data.amount, + score : res.data.score, + remark : res.data.detail.remark.replace(/\{ + if(!err.login){ + wx.showModal({ + title : '用户登录已过期', + content : '请重新登录', + showCancel : false, + success : res => { + if (res.confirm) { + wx.redirectTo({ + url: '/pages/login/login' + }) + } + } + }) + } + }) + }, + + /** + * 须知展开收起状态 + */ + noticeTap() { + this.setData({ + noticeShow : !this.data.noticeShow + }) + }, + + /** + * 收货地址弹出 + */ + addressTap() { + this.setData({ + addressShow : !this.data.addressShow + }) + }, + + /** + * 选择收货地址 + */ + selectAddress(e){ + let new_addressId = e.currentTarget.dataset.id, + addressId = this.data.address.id + if (new_addressId != addressId) { + this.setData({ + address : e.currentTarget.dataset.index, + addressShow : false + }) + }else{ + this.setData({ + addressShow : false + }) + } + + // 获取卡券列表 + this.couponInfo() + }, + + /** + * 支付选择 + */ + payBind(e) { + this.setData({ + payWayIndex: e.detail.value + }) + }, + + /** + * 商品数量加减 + */ + goodsNumber(e){ + let num = this.data.num + if (e.currentTarget.dataset.type == 'plus'){ + num ++; + }else{ + if (num > 1){ + num --; + }else{ + wx.showToast({ + title : '商品数量不能小于1', + icon : 'none' + }) + } + } + this.setData({ + num : num + }) + + // 获取详情 + this.couponInfo() + }, + + /** + * 选择提交方式 + */ + platBind(e) { + this.setData({ + platIndex : e.detail.value, + isdeliver : this.data.platformCp[e.detail.value].value + }) + // 获取详情 + this.couponInfo() + }, + + /** + * 支付提交 + */ + submitOrder() { + if(this.data.isdeliver.length == 0) { + this.setData({ + isdeliver: this.data.detail.def_get + }) + } + let right_id = this.data.rightId, + welfare_id = this.data.welfareId, + address_id = this.data.address.id, + is_deliver = this.data.isdeliver, + qty = this.data.num + + wx.$api.user.washcarCreate(welfare_id, right_id, qty, address_id, is_deliver).then(res=>{ + let dataUrl = '', //定义接口来源名称 + type = res.data.type //订单来源 + // welfare为福利活动购买 + if(type == 'welfare') dataUrl = wx.$api.index.fridayInfo(welfare_id, address_id, is_deliver) + + // right为权益购买 + if(type == 'right') dataUrl = wx.$api.index.rightStore(right_id, address_id, is_deliver, qty) + + // 第一步接口调取 + dataUrl.then(dataRes=>{ + let payUrl = '', //定义接口来源名称 + Newtype = dataRes.data.type //订单来源 + // welfare为福利活动购买 + if(Newtype == 'welfare') payUrl = wx.$api.index.fridayPay(dataRes.data.trade_no) + + // right为权益购买 + if(Newtype == 'right') payUrl = wx.$api.index.wechat(dataRes.data.trade_no) + + // 第一步接口调取 + payUrl.then(payEes=>{ + let payInfo = JSON.parse(payEes.data) + wx.requestPayment({ + timeStamp: payInfo.timeStamp, + nonceStr : payInfo.nonceStr, + package : payInfo.package, + paySign : payInfo.paySign, + signType : payInfo.signType, + success : res=>{ + if(res.errMsg == "requestPayment:ok"){ + wx.showToast({ + title: '支付成功', + icon : 'success' + }) + if(Newtype == 'welfare'){ + setTimeout(()=>{ + if(this.data.isdeliver == 1) { + wx.reLaunch({ + url: '/pages/order/order?orderType=welfareGoods' + }) + } else { + wx.reLaunch({ + url: '/pages/order/order?orderType=welfare' + }) + } + },3000) + } + if(Newtype == 'right'){ + setTimeout(()=>{ + if(this.data.isdeliver == 1) { + wx.reLaunch({ + url: '/pages/order/order?orderType=rightsCoupons' + }) + } else { + wx.reLaunch({ + url: '/pages/order/order?orderType=rights' + }) + } + },3000) + } + } + }, + fail : res=>{ + if(Newtype == 'welfare'){ + if(this.data.isdeliver == 1) { + wx.reLaunch({ + url: '/pages/order/order?orderType=welfareGoods&stateType=unpay' + }) + } else { + wx.reLaunch({ + url: '/pages/order/order?orderType=welfare&stateType=unpay' + }) + } + } + if(Newtype == 'right'){ + if(this.data.isdeliver == 1) { + wx.reLaunch({ + url: '/pages/order/order?orderType=rightsCoupons&stateType=unpay' + }) + } else { + wx.reLaunch({ + url: '/pages/order/order?orderType=rights&stateType=unpay' + }) + } + } + } + }) + }) + }) }) } }) \ No newline at end of file diff --git a/pages/car/index.wxml b/pages/car/index.wxml index 1065238..8c1e3e1 100644 --- a/pages/car/index.wxml +++ b/pages/car/index.wxml @@ -1,2 +1,172 @@ - -pages/car/index.wxml + + + + 等待买家付款 + 请您尽快下单购买 + + + + + + + + + + + + {{address.name}} {{address.mobile}} + + {{address.all_address}} + + + + + 暂无收货地址 + + + + + + + + + {{detail.type == 'virtual' ? '券' : '实'}} + + + + + {{detail.title}} + + + 数量:x{{num}} + + + + + + + + + + {{detail.attribute.form_price}} + + + ¥{{moreAmount}} + + + + {{detail.attribute.form_type}} + ¥{{score}} + + + {{detail.attribute.form_pay}} + ¥{{amount}} + + + + 运费 + + + ¥{{freight}} + + + + + + + + + 购买数量 + + + - + {{num}} + + + + + + + + + + 请选择提交方式 + + + + {{platformCp[platIndex].name}} + + + + + + + + + + + 请选择支付方式 + + + + {{payWay[payWayIndex].name}} + + + + + + + 支付方式 + {{payWay[payWayIndex].name}} + + + + + + + + + 购买前请仔细阅读使用须知、内容介绍 + + + + + 购买须知 + + + + + 内容介绍 + + + + + + + + + + 实际付款¥{{amount}} + 立即购买 + + + + + + + 请选择收货地址 + 新增收货地址 + + + + + {{item.name}} + {{item.mobile}} + + + {{item.all_address}} + + 选择地址 + + + \ No newline at end of file diff --git a/pages/car/index.wxss b/pages/car/index.wxss index 367ebdc..207d27e 100644 --- a/pages/car/index.wxss +++ b/pages/car/index.wxss @@ -1 +1,448 @@ -/* pages/car/index.wxss */ \ No newline at end of file +/* 下单状态 */ +.state { + background: #2e71e3; + padding: 30rpx 100rpx 60rpx; + width: 100%; + box-sizing: border-box; + color: #fff; + font-size: 26rpx; + display: flex; +} + +.state-title { + flex: 1; + font-size: 32rpx; +} + +.state-title text { + opacity:.8; + display: block; + font-size: 28rpx; + margin-top: 10rpx; +} + +.state-img { + width: 70rpx; + height: 70rpx; + margin-top: 10rpx; +} + +/* 默认地址 */ +.content { + padding: 0 30rpx; + box-sizing: border-box; + width: 100%; + border-bottom: solid transparent 120rpx; +} + +.site { + background-color: #fff; + margin-top: -30rpx; + border-radius: 10rpx; + padding: 30rpx; + box-sizing: border-box; + box-shadow: 0 0 10rpx rgba(0, 0, 0, .1); +} + +.siteTips { + text-align: center; +} + +.siteTips-tips { + color: #2e71e3; + border: #2e71e3 2rpx solid; + display: inline-block; + font-size: 28rpx; + line-height: 70rpx; + padding: 0 20rpx; + text-align: center; + margin: 0 auto; +} + +.siteTips-tips image { + width: 32rpx; + height: 32rpx; + vertical-align: -5rpx; + padding-right: 10rpx; +} + +.siteCont { + display: flex; + position: relative; +} + +.siteCont-right { + width: calc(100% - 70rpx); + margin-left: 30rpx; +} + +.state-arrow { + position: absolute; + right: 0; + top: 24rpx; + width: 34rpx; + height: 34rpx; +} + +.siteCont-site { + width: 40rpx; + height: 40rpx; + margin-top: 24rpx; +} + +.site-text { + margin-bottom: 10rpx; +} + +.site-text text { + padding-left: 10rpx; + color: #999; + font-size: 28rpx; +} + +.site-all { + font-size: 26rpx; +} + +.goods { + width: 100%; + background-color: #fff; + border-radius: 10rpx; + padding: 30rpx; + box-sizing: border-box; + box-shadow: 0 0 10rpx rgba(0, 0, 0, .1); + margin: 30rpx 0; +} + +.goods-content { + position: relative; +} + +.goods-cont { + position: absolute; + left: 0; + top: 0; + width: 100%; + padding-left: 150rpx; + box-sizing: border-box; +} + +.goods-title { + margin: 10rpx 0 20rpx; + font-weight: 600; + font-size: 30rpx; +} + +.goods-qty { + color: #999; + font-size: 28rpx; +} + +.goods-cover { + position: relative; + width: 130rpx; + height: 130rpx; +} + +.goods-image { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.goods-type { + position: absolute; + z-index: 2; + left: 15rpx; + top: 15rpx; + font-size: 24rpx; + background-color: #5d69fb; + color: #fff; + border-radius: 50rpx; + height: 36rpx; + line-height: 34rpx; + padding: 0 6rpx; +} + +.goods-type.active { + background-color: #fb5d64; +} + +.goods-type text { + transform: scale(.9); + display: inline-block; +} + +/* 规格 */ +.label { + background-color: #fff; + border-radius: 10rpx; + padding: 10rpx 30rpx; + width: 100%; + box-sizing: border-box; + box-shadow: 0 0 10rpx rgba(0, 0, 0, .1); + margin-bottom: 30rpx; + position: relative; +} + +.labelList { + display: flex; + line-height: 80rpx; + font-size: 28rpx; +} + +.labelList-label { + flex: 1; +} + +.rightsLabel-range { + display: flex; + color: #000; +} + +.rightsLabel-row { + width: 38rpx; + height: 38rpx; + margin: 20rpx 0 0 6rpx; +} + +.rightsAdd { + display: flex; + padding-top: 14rpx; +} + +.rightsAdd-btn { + background: #eaeaea; + color: #535353; + border-radius: 50%; + text-align: center; + width: 50rpx; + height: 50rpx; + line-height: 45rpx; + font-size: 40rpx; + font-weight: 600; +} + +.rightsAdd-input { + width: 60rpx; + text-align: center; + font-size: 28rpx; + line-height: 50rpx; +} + +/* 购买 */ +.buy { + position: fixed; + width: 100%; + left: 0; + bottom: 0; + height: 100rpx; + line-height: 100rpx; + background-color: #fff; +} + +.buy-price { + background-color: #f1cb4c; + color: #8d5226; + width: calc(100% - 240rpx); + position: absolute; + left: 0; + top: 0; + height: 100%; + padding-left: 50rpx; + box-sizing: border-box; + font-weight: 600; + font-size: 32rpx; +} + +.buy-price text { + font-size: 42rpx; +} + +.buy .buy-btn { + background-color: #2e71e3; + color: #fff; + position: absolute; + right: 0; + top: 0; + width: 240rpx; + text-align: center; + height: 100%; +} + +/* 购买须知 */ +.notice { + background: white; + margin: 30rpx 0; + border-radius: 10rpx; + padding: 10rpx 0; + box-sizing: border-box; + box-shadow: 0 0 30rpx rgba(0,0,0,.15); + padding: 20rpx; +} + +.noticeTitle { + display: flex; +} + +.noticeTitle-flex { + flex: 1; + display: flex; + font-size: 28rpx; + line-height: 46rpx; +} + +.noticeTitle-img { + width: 46rpx; + height: 46rpx; + margin-right: 20rpx; +} + +.noticeText { + font-size: 26rpx; + height: 0; + overflow: hidden; +} + +.noticeText.active { + height: auto; +} + +.noticeText-top { + margin: 30rpx 0 10rpx; + font-weight: 600; +} + +.noticeText-cont { + line-height: 60rpx; +} + +.noticeTitle-row { + width: 46rpx; + height: 46rpx; +} + +.noticeTitle-row.active { + transform: rotate(90deg); +} + +/* 选择收货地址 */ +.addressBack { + position: fixed; + left: 0; + bottom: 0; + background: rgba(0, 0, 0, .4); + z-index: 10; + width: 100%; + height: 100%; + display: none; +} + +.addressBack.active { + display: block; +} + +.addressCont { + position: fixed; + left: 0; + bottom: -1000%; + transition: .2s; + background: #fff; + z-index: 11; + width: 100%; +} + +.addressCont.active { + bottom: 0; +} + +.addressCont-title { + height: 90rpx; + line-height: 90rpx; + display: flex; + padding: 0 30rpx; + box-sizing: border-box; + font-size: 28rpx; + font-weight: 600; +} + +.addressCont-left { + flex: 1; +} + +.addressCont-right { + color: #309ded; +} + +.header-classify { + white-space: nowrap; + box-sizing: border-box; + height: 600rpx; +} + +.addressCont-list { + padding: 30rpx 20rpx; + box-sizing: border-box; + font-size: 30rpx; + overflow: hidden; + position: relative; +} + +.addressCont-top { + display: flex; + margin-bottom: 10rpx; +} + +.addressCont-name { + font-weight: 600; +} + +.addressCont-text { + color: #666; + width: calc(100% - 160rpx); +} + +.addressCont-list:last-child { + border: none; +} + +.address-tool { + display: flex; + float: right; +} + +.address-tool-btn { + font-size: 24rpx; + margin-top: 20rpx; + border: 2rpx solid #666; + color: #666; + border-radius: 6rpx; + text-align: center; + height: 50rpx; + line-height: 50rpx; + padding: 0 20rpx; + margin-right: 20rpx; + display: flex; +} + +.address-tool-btn-del { + color: #dfae2e; + border-color: #dfae2e; +} + +.address-tool-icon { + width: 120rpx; + height: 54rpx; + line-height: 54rpx; + border-radius: 4rpx; + text-align: center; + color: #fff; + position: absolute; + top: 45rpx; + right: 10rpx; + background: #dfae2e; + transform: scale(.9, .9); + font-size: 24rpx; +} \ No newline at end of file diff --git a/pages/order/order.js b/pages/order/order.js index dbfaf24..aa77f57 100644 --- a/pages/order/order.js +++ b/pages/order/order.js @@ -26,6 +26,8 @@ Page({ orderType: options.orderType, stateType: options.stateType }) + + console.log(options.orderType) }, onShow() { diff --git a/pages/rights/rights.js b/pages/rights/rights.js index 461f4ef..b40a71d 100644 --- a/pages/rights/rights.js +++ b/pages/rights/rights.js @@ -118,11 +118,11 @@ Page({ content : '请重新登录', showCancel : false, success : res => { - if (res.confirm) { - wx.redirectTo({ - url: '/pages/login/login' - }) - } + if (res.confirm) { + wx.redirectTo({ + url: '/pages/login/login' + }) + } } }) } diff --git a/static/img/carSite_add.png b/static/img/carSite_add.png new file mode 100644 index 0000000000000000000000000000000000000000..9bed061346f1accfdc2f04dcf8d407809282df0d GIT binary patch literal 2241 zcmV;y2tN0TP)2(oXf?cX zu#G*#brj6yYL3=9BzvnYJ#7;O`_lkmQTeHgBR#{j_-51g3|NUQ@%= z3V}R8U_vEMFVPX{6X3TL&-!R<i6DL{S1WR&{=Wd@aZ)vI2ttoKMxwI@mVxOt~v+*N~#fU(!%SRv5Z( zQ@J+0nmOikkhclW$ce;&RLVwR>Z2#e)%To@yH^4cIm4=&8>3H7`fs_8ZTUbr{tU?< zW)>42QC(e7i5>r{PF1n2eITyPn8HCL;hm0lrtH771cF-p=Kvpbomdt^u~v0sB~C|@ zfNjga%3P`lw&h?6M)FF1IP zM-$!#I|}It_`~K(g~+b92p=$X@0Lozk8}iVdrew=i3j{$HbaC9W4d=onm{0I?j&)$ zQ*dXDPIZEtW0jH^sT%0_FAQqtDS+dgT4*;S>OE{~mKvqo{FHX%kzw$BRQD~Z6u7H5 z@&tfj*xU-@e#gg!=s53Ko0Yvg?CRg9aGw!TpS>Ij*mpB3@tb`98*fTvvFJ$=$xY_?Mh!OFW_0XdY+Xb|v+Iu|R7l^wB&@M}!>o|@T} zZQ@5LUq^#LKr^=ySn3q;F+=xFN?)ggnrU}84?6{yI$K*m@uLkBx`z{mktZ|YEO&73$PZ$yJMrE*(gfYBLz>oCd{u*Bx_; z$jgTA%N&q{Uub4%=1o;V_9kf0{zYnUh_zmQtW<}tTp(=jA@NmbW7rne)$f;U!b~sk>XHbg1v4|44mbSi6cB7SbniozKV+0cJ?)VJEwRzPbvhV!8M^n5 z!5H$6*PYPq%NZo4^VsUCUA+I7SDh^vPC4>+-#f8B)lT5sIeH(adTM9p^Ihv^MgWar<5tewK2VMd*!u}&h>j?UyA|zg}?tJ=s;EVqGIoGMG3ft?e9*kSAaEx zSHdO&k#;Idd$h%CKT8$)2!o--O(5H~WPvN9I&y-0#aG;3@^e=ItOh z5D1j&sEFLVB3NtaYIej~s@;kRWQk~IfWQI>765V!$m&uYJ8#Wz66mljbi`WKk{bT9 zccD_ixH6f!r8OIb3bE|GZWPc5i2VrB3HygiB1OczMfN5l>V~IqA0HwdUnvSvGnF65ej*!&Y%^-vSVg!q+Xs{FGux*&${n>hqaUv1$C&vQ z*KzpvgW|OE^^J3ih)B4*B6XK#>XNJbPFLOck8j`4|Sg=j+$=k53MLXOO9} zjWG-cGYzJa!nCXZ@@r_I{hs5dOlTKth#UchgYl430%G}Vy^8f0?y_5BKCOD z&@@3HkjSN`34!pmolJJxJ~p0%@FT)~Bm}Jh4}e&32``y1B1n7@Z*>XU{qi*m0e=gD z_W2_IN-BazhX;Z}0PcbGaATt}?(nU6B*p{d?uBuMW6>BK3XMZyaBdhZ0gWeMJmBvh zgf^Ox6Hf>uQQpPUo_rCB5F{X=P-3wdDaIi|VFC(+$Kz3GEDDQt(<0nNseFhfapQ{| z-Ybv*5nIR=KwOXyUshzrf%_p}gf`Q^O5h1T$nr(++N5n5O2QJLFi7-rN$-I)+W&|0 zcpuOrC=B>J-~TBrVx|fJR2U!v_Y2wD!Nof)hY}D1g#Zfzg-j4ke&0oUA_#$^L{I<^ z41_!F;qp14SmgW`PNNZm`67tLX9K|`UxZcw$>nkgo@fk-;zjZxc?Ec3Fyw6kWRklV zne0v`;V9eic=z{Q63E`q1NhK;F6VEq=SR8APT&c&kx77%djQ~2gdh+8wqgSJ_HTmY)M`kS^Jfh4i*(61hf39q11+|MJw$Vs=}Lc<#X5bB~?#y}fO1Wo5

`VnVI>{I@h>ThKBJiuO23%=g-=H>}q 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