<template> <div> <flexbox orient="vertical" :gutter="0"> <flexbox-item> <div class="flex-demo"> <div> <div class="meal_box"> <flexbox :gutter="0" class="select_title"> <flexbox-item :span="6"> <button @click="selfMeal" class="selfMeal" :class="{selectSelf:addressType==1}" :disabled="self_mention==0">自助取餐</button> </flexbox-item> <flexbox-item :span="6"> <button @click="deliveryMeal" class="deliveryMeal" :class="{selectDelivery:addressType==2}" :disabled="delivery==0">送货上门</button> </flexbox-item> </flexbox> <flexbox :gutter="0" class="selfDetail" v-if="addressType==1"> <flexbox-item :span="1"> <icon name="address" scale="2"></icon> </flexbox-item> <flexbox-item :span="10"> <div> <p>{{storeName.name}}</p> <div class="detailAddress">地址:{{storeName.address}}<span class="my_remark">{{storeName.address_detail}}</span></div> </div> </flexbox-item> </flexbox> <flexbox :gutter="0" class="deliveryDetail" v-if="addressType==2" @click.native="selectAddress"> <flexbox-item :span="1"> <icon name="address" scale="2"></icon> </flexbox-item> <flexbox-item :span="10"> <div v-if="addressItem"> <p><span class="my_remark">收货人:{{addressItem.name}}</span></p> <p><span class="my_remark">手机号:{{addressItem.phone}}</span></p> <div class="detailAddress"> <span class="my_remark"> 收货地址:{{addressItem.address}}{{addressItem.address_detail}} </span> </div> </div> <div v-else="!addressItem"> 请选择地址 </div> </flexbox-item> <flexbox-item :span="1"> <icon name="rightIcon" scale="3"></icon> </flexbox-item> </flexbox> </div> </div> </div> </flexbox-item> <flexbox-item> <scroller lock-x height="-295px"> <div class=""> <div v-for="list of shopCart.items"> <shopcart-item :good=item v-for="item of list"></shopcart-item> </div> </div> </scroller> </flexbox-item> <flexbox-item> <div class="choose_box"> <div class="my_card" @click="selectWechat"> <flexbox :gutter="0"> <flexbox-item :span="2" class="card_icon"> <p class="middle_icon"><icon name="wechatPay" scale="3"></icon></p> </flexbox-item> <flexbox-item :span="8"> <p>微信支付</p> </flexbox-item> <flexbox-item :span="2"> <p class="middle_icon" v-if="wechatCircle"><x-icon type="ios-circle-outline" size="26"></x-icon></p> <p class="middle_icon" v-if="wechatCheck"><x-icon type="ios-checkmark-outline" size="26"></x-icon></p> </flexbox-item> </flexbox> </div> <div class="my_card" @click="selectMyCard"> <flexbox :gutter="0"> <flexbox-item :span="2" class="card_icon"> <p class="middle_icon"><icon name="cardPay" scale="3"></icon></p> </flexbox-item> <flexbox-item :span="8"> <p>消费卡</p> </flexbox-item> <flexbox-item :span="2"> <p class="middle_icon" v-if="cardCircle"><x-icon type="ios-circle-outline" size="26"></x-icon></p> <p class="middle_icon" v-if="cardCheck"><x-icon type="ios-checkmark-outline" size="26"></x-icon></p> </flexbox-item> </flexbox> </div> <div class="blank_box"></div> </div> <popup v-model="chooseThisCard" position="bottom" max-height="50%"> <h4 class="card_title">请选择卡片</h4> <div v-for="(item,index) in cardInfo" class="card_item" @click="cardSelected(index,item)"> <flexbox :gutter="0"> <flexbox-item :span="2"> <div class="card_one_item"> <icon name="cardPay" scale="3"></icon> </div> </flexbox-item> <flexbox-item :span="8"> <p>{{item.name}} <span>({{item.card_code}})</span></p> </flexbox-item> <flexbox-item :span="2"> <p class="selected" v-if="showIcon(index)"><x-icon type="ios-checkmark-outline" size="30"></x-icon></p> <p v-if="otherCard(index)"><x-icon type="ios-circle-outline" size="30"></x-icon></p> </flexbox-item> </flexbox> </div> </popup> </flexbox-item> <flexbox-item> <div class="flex-demo menu-bottom" > <flexbox :gutter="0" class="bottom_order"> <flexbox-item :span="9"> <div class="money_box"> 合计:<span class="order_money">¥{{shopCart.totalMoney}}</span> </div> </flexbox-item> <flexbox-item :span="3"> <div class="payOrder" @click="payOrder">去支付</div> </flexbox-item> </flexbox> </div> </flexbox-item> </flexbox> </div> </template> <script> import { mapGetters } from 'vuex' import {Shopcart,ShopcartItem} from "../shopcart" import { Cell, Group,Popup,Flexbox, FlexboxItem, Scroller,XButton,XHeader,Selector} from 'vux' export default { data() { return { wechatCheck:true, wechatCircle:false, cardCheck:false, cardCircle:true, chooseThisCard:false, orderNo:'', addressItem:'', payType:1, } }, computed: { ...mapGetters([ 'shopCart', "storeCardInfo", "storeName", "addressType", "delivery", "self_mention", ]), }, created(){ this.getStorage() this.wechatConfig() this.getDefaultAddress() if(!this.storeCardInfo){ this.getCardInfo() }else{ this.cardInfo=this.storeCardInfo } if(!_global.customerId){ let $this=this setTimeout(()=>{ this.$vux.toast.show({ text: "新用户请绑定手机号", type:'cancel', onHide(){ $this.$router.push({path:"/binding"}) } },1000) }) } }, methods: { getStorage(){ let cartStorage = JSON.parse(window.sessionStorage.getItem('shopCart')) let storeStorage = JSON.parse(window.sessionStorage.getItem('storeName')) let deliveryStorage = JSON.parse(window.sessionStorage.getItem('delivery')) let selfStorage = JSON.parse(window.sessionStorage.getItem('self_mention')) let addressTypeStorage = JSON.parse(window.sessionStorage.getItem('addressType')) if(cartStorage){ this.$store.commit("saveShopCart",cartStorage) } if(storeStorage){ this.$store.commit("storageStore",storeStorage) } if(deliveryStorage){ this.$store.commit("delivery",deliveryStorage) } if(selfStorage){ this.$store.commit("selfMention",selfStorage) } if(addressTypeStorage){ this.$store.commit("saveAddressType",addressTypeStorage) } }, getDefaultAddress(){ this.$http.get('/shop/api/get-default-address',{ params:{ customerId:_global.customerId } }).then((response) => { if(response.data.status){ this.addressItem=response.data.data } }).catch((error)=>{ this.$vux.toast.show({ text: "网络异常", type: 'cancel' }) }) }, getCardInfo(){ this.$http.get('/shop/api/get-wx-user-customer',{ params:{ customerId:_global.customerId } }).then((response) => { if(response.data.status){ this.cardInfo=response.data.data; this.$store.commit('saveMyCard',this.cardInfo); }else{ this.$store.commit('saveMyCard',{}); } }).catch((error)=>{ this.$vux.toast.show({ text: "网络异常", type: 'cancel' }) }) }, selfMeal(){ this.$store.commit('saveAddressType',1); }, deliveryMeal(){ this.$store.commit('saveAddressType',2); }, selectAddress(){ this.$router.push({ name: 'addressList', params: {clickStatus: 1}}) }, /**选择微信&&消费卡的function */ selectMyCard(){ this.wechatCheck=false; this.wechatCircle=true; this.chooseThisCard=true; }, selectWechat(){ this.wechatCheck=true; this.wechatCircle=false; this.cardCheck=false; this.cardCircle=true; this.payType=1; }, /** 选择消费卡的function */ cardSelected(index,item){ this.cardIndex=index; this.chooseThisCard=false; this.cardCheck=true; this.cardCircle=false; this.currentItem=item; this.payType=2; }, showIcon(index){ if(index === this.cardIndex){ return true }else { return false; } }, otherCard(index){ if(index === this.cardIndex){ return false }else { return true; } }, /** 下面是跟支付有关的function*/ wechatConfig() { let urls = location.href.split('#')[0] let postData={ url:urls, mallId:_global.mallId } this.$http.post('/shop/api/js-sdk-config', postData).then((response) => { if (response.status === 200 && response.data.status === 1) { this.$wechat.config(JSON.parse(response.data.data)) } else { this.$vux.toast.show({ text: '微信参数错误', type: 'cancel' }) } }).catch(() => { this.$vux.toast.show({ text: "网络异常", type: 'cancel' }) }) }, validate(){ if(this.shopCart.num ==0 ){ return { code : 'error', msg: '您还没有购买商品~'} } if(!this.addressItem&&this.addressType=='2'){ return { code : 'error', msg: '请选择收货地址'} } if(!this.storeName&&this.addressType=='1'){ return { code : 'error', msg: '请选择收货地址'} } return {code :'success'} }, payOrder(){ let validResult=this.validate() if(validResult.code ==='error'){ this.$vux.toast.show({ text: validResult.msg, type: 'cancel' }) return false } var postAddress if(this.addressType==1){ postAddress=this.storeName }else{ postAddress=this.addressItem } let orderInfo={ shopCart:this.shopCart, address:postAddress.id, mallId:_global.mallId, customerId:_global.customerId, type:this.addressType, } this.$http.post('/shop/api/create-order',orderInfo).then((response) => { if(response.data.status){ this.orderNo=response.data.data if(this.payType==2){ this.cardPay() }else{ this.getWxApi() } }else{ this.$vux.toast.show({ text: response.data.message, type:'cancel' }) } }).catch((error)=>{ this.$vux.toast.show({ text: "网络异常", type: 'cancel' }) }) }, cardPay(){ let postCard={ type:1, orderNo:this.orderNo, cardCode:this.currentItem.card_code, customerId:_global.customerId, totalAmount:this.shopCart.totalMoney, } this.$http.post('/shop/api/pay-order',postCard).then((response) => { if(response.data.status){ this.$store.dispatch("emptyCart") this.$store.commit("saveItemIndex",'2') this.$store.commit("savePayType",'2') let $this=this this.$vux.toast.show({ text: '支付成功', type: 'success', onHide(){ $this.$router.push({path:'/orderList'}) } }) }else{ this.$vux.toast.show({ text: response.data.message, }) } }).catch((error)=>{ this.$vux.toast.show({ text: "网络异常", type:'cancel' }) }) }, wechatPay(config) { let $this= this this.$wechat.chooseWXPay({ timestamp: config.timestamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 nonceStr: config.nonceStr, // 支付签名随机串,不长于 32 位 package: config.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***) signType: config.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: config.paySign, // 支付签名 appId:config.appId, success: function (response) { // 支付成功后的回调函数 $this.$store.dispatch("emptyCart") $this.$store.commit("saveItemIndex",'2') $this.$store.commit("savePayType",'1') $this.$vux.toast.show({ text: '支付成功', type: 'success', onHide(){ $this.$router.push({path:'/orderList'}) } }) }, cancel: function (re) { $this.$vux.toast.show({ text: '支付已取消', type: 'cancel' }) } }); }, getWxApi(){ this.$http.post('/shop/api/wx-pay',{orderNo:this.orderNo}).then((response) => { if(response.data.status){ this.wechatPay(response.data.data) }else{ this.$vux.toast.show({ text: response.data.message, type:'cancel' }) } }).catch((error)=>{ this.$vux.toast.show({ text: "网络异常", type:'cancel' }) }) }, }, components: { Group, Cell, Flexbox, FlexboxItem, Scroller, XHeader, Popup, XButton, Selector, Shopcart,ShopcartItem }, } </script> <style lang="less"> body,html{ background: #F2F2F2; font-size: 14px; } .bottom_order{ line-height: 60px; height: 60px; box-sizing: border-box; font-size:18px; background: #fff; .money_box{ margin-left: 10px; height:60px; } .order_money{ color:#EB3D3D; font-size: 22px; } .payOrder{ text-align: center; background:#0c6; color:#fff; } } .my_remark{ display: inline-block; padding-left:10px; } .meal_box{ padding: 5px 10px; height:120px; background: #fff; } .selfDetail{ margin-top: 15px; .detailAddress{ color: #999; } } .deliveryDetail{ margin-top: 15px; .detailAddress{ color: #999; } } .select_title{ text-align: center; button{ padding: 2px 10px; min-width: 120px; text-align: center; line-height: 30px; display: inline-block; border: 1px solid #E4E4E4; color: #A1A1A1; background: #fff; } .selectSelf{ background: #EB3D3D; color: #fff; border:none; } .selectDelivery{ background: #EB3D3D; color: #fff; border:none; } .selfMeal{ float: right; } .deliveryMeal{ float: left; } } .vux-x-icon { fill: #09BB07; } .choose_box{ height: 105px; .middle_icon{ margin:12px 0 6px 0; } .card_icon{ text-align: center; } .my_card{ background: #fff; border-top: 1px solid #F2F2F2; } } .card_title{ line-height: 40px; text-align: center; background:#fff; font-weight:300; } .card_item{ background: #fff; border:1px solid #f2f2f2; padding:5px 10px; .card_one_item{ margin-top: 8px; } } </style>