You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
419 lines
10 KiB
419 lines
10 KiB
<template>
|
|
<view class="app column">
|
|
<view class="main-wrap" :class="{show: loaded}">
|
|
<view class="addr-sec" @click="navTo('/pages/address/list?choose=1&id='+addr.id)">
|
|
<view v-if="!addr._id" class="addr-empty row fill">
|
|
<text class="mix-icon icon-dizhi"></text>
|
|
<text>请选择收货地址</text>
|
|
</view>
|
|
<view v-else class="addr-wrap">
|
|
<text class="mix-icon icon-dizhi"></text>
|
|
<view class="con column">
|
|
<text class="addr">{{ addr.address.address }} {{ addr.address.room }}</text>
|
|
<text class="name">{{ addr.name }} {{ addr.mobile }}</text>
|
|
</view>
|
|
</view>
|
|
<text class="mix-icon icon-you"></text>
|
|
<image class="bg" src="/static/icon/addr-line.png"></image>
|
|
</view>
|
|
<!-- 商品列表 -->
|
|
<view class="goods-sec">
|
|
<product-list :list="data.products"></product-list>
|
|
</view>
|
|
<!-- 价格信息 -->
|
|
<view class="price-sec">
|
|
<view class="cell row">
|
|
<text class="tit fill">商品金额</text>
|
|
<text class="price">¥{{ goodsTotal | price(2) }}</text>
|
|
</view>
|
|
<view class="cell row">
|
|
<text class="tag">满</text>
|
|
<text class="tit fill">订单满减</text>
|
|
<text class="price" :class="{red: fullReductionMoney > 0}">-¥{{ fullReductionMoney || 0 }}</text><!-- red -->
|
|
</view>
|
|
<view class="cell row" @click="showCouponPopup">
|
|
<text class="tag red">券</text>
|
|
<text class="tit fill">优惠券</text>
|
|
<text v-if="data.coupons.length === 0" class="price disabled">暂无可用</text>
|
|
<template v-else>
|
|
<text v-if="curCoupon._id" class="price red">-¥{{ curCoupon.coupon_money }}</text>
|
|
<text v-else class="price red" style="font-weight: normal;">请选择优惠券</text>
|
|
<text class="mix-icon icon-you"></text>
|
|
</template>
|
|
</view>
|
|
<view class="cell row">
|
|
<text class="tit fill">配送费</text>
|
|
<text class="price">¥0</text>
|
|
</view>
|
|
<view class="total row b-t">
|
|
<text class="price">¥{{ payTotal | price(2)}}</text>
|
|
</view>
|
|
</view>
|
|
<view class="remarks column">
|
|
<text class="title">订单备注:</text>
|
|
<textarea class="input" auto-height v-model="remarks" placeholder="选填,合理需求我们会尽量满足 .." placeholder-style="color: #999" />
|
|
</view>
|
|
<!-- 底部栏 -->
|
|
<view class="bot-fill-view"></view>
|
|
<view class="bottom row">
|
|
<view class="fill">
|
|
<text class="tip">实付款:</text>
|
|
<text class="price fill">¥{{ payTotal | price(2) }}</text>
|
|
</view>
|
|
<view class="btn center" @click="createOrder">
|
|
<text>提交订单</text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<!-- 优惠券弹窗 -->
|
|
<coupon-select ref="couponSelect" :list="data.coupons" @confirm="onCheckCoupon"></coupon-select>
|
|
|
|
<mix-loading v-if="isLoading" :type="loaded ? 1: 2" :mask="true"></mix-loading>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import productList from './components/product-list.vue'
|
|
import couponSelect from './components/coupon-select.vue'
|
|
export default {
|
|
components: {
|
|
productList,
|
|
couponSelect
|
|
},
|
|
data() {
|
|
return {
|
|
remarks: '', //备注
|
|
addr: {},//地址信息
|
|
data: {
|
|
products: [],
|
|
coupons: []
|
|
},
|
|
curCoupon: {},
|
|
payTotal: 0, //支付价格
|
|
fullReductionMoney: 0, //满减金额
|
|
}
|
|
},
|
|
computed: {
|
|
//商品总价
|
|
goodsTotal(){
|
|
if(this.data.products.length === 0){
|
|
return 0;
|
|
}
|
|
let total = 0;
|
|
this.data.products.forEach(item=> {
|
|
total += item.price * item.number;
|
|
})
|
|
return total;
|
|
}
|
|
},
|
|
onLoad(options) {
|
|
if(options.type === 'cart'){
|
|
//购物车结算
|
|
this.createType = 'cart';
|
|
this.cartIds = options.ids;
|
|
}else{
|
|
this.createType = 'buyNow';
|
|
this.buyData = JSON.parse(options.data);
|
|
}
|
|
this.loadData();
|
|
},
|
|
methods: {
|
|
async loadData(){
|
|
const operation = this.createType === 'cart' ? 'getCartConfirmData': 'getBuyNowConfirmData';
|
|
const sendData = this.createType === 'cart' ? {
|
|
ids: this.cartIds.split(',')
|
|
} : this.buyData;
|
|
const res = await this.$request('order', operation, sendData, {showLoading: true})
|
|
this.addr = res.data.address;
|
|
this.data = res.data;
|
|
|
|
console.log(JSON.parse(JSON.stringify(res.data)));
|
|
|
|
this.getOrderPayPrice();
|
|
},
|
|
//计算订单价格
|
|
async getOrderPayPrice(){
|
|
const res = await this.$request('order', 'getOrderPayPrice', {
|
|
goods_price: this.goodsTotal,
|
|
address_id: this.addr._id || '',
|
|
coupon_id: this.curCoupon._id || ''
|
|
}, {showLoading: this.payTotal > 0})
|
|
this.payTotal = res.pay_price || 0;
|
|
this.fullReductionMoney = res.full_reduction_money;
|
|
},
|
|
//创建订单
|
|
createOrder(){
|
|
this.$util.throttle(async ()=>{
|
|
if(!this.addr._id){
|
|
this.$util.msg('请选择收货地址');
|
|
return;
|
|
}
|
|
this.isLoading = true;
|
|
const data = this.getCreateData();
|
|
const operation = this.createType === 'cart' ? 'addByCart': 'addBuyNow';
|
|
const res = await this.$request('order', operation, data);
|
|
this.isLoading = false;
|
|
console.log(JSON.parse(JSON.stringify(res)));
|
|
if(res.status === 1){
|
|
if(this.createType === 'cart'){
|
|
uni.$emit('refreshCart');//刷新购物车
|
|
this.$store.dispatch('getCartCount');//刷新购物车数量个
|
|
}
|
|
uni.redirectTo({
|
|
url: '/pages/wallet/pay?data=' + JSON.stringify({
|
|
sourcePage: 'createOrder',
|
|
...res.data
|
|
})
|
|
})
|
|
}else{
|
|
this.$util.msg(res.msg);
|
|
}
|
|
})
|
|
},
|
|
//获取创建订单参数
|
|
getCreateData(){
|
|
const data = {
|
|
remarks: this.remarks,
|
|
address: this.addr,
|
|
coupon_id: this.curCoupon._id || '',
|
|
// #ifdef H5
|
|
source_type: 1,
|
|
// #endif
|
|
// #ifdef APP-PLUS
|
|
source_type: 2,
|
|
// #endif
|
|
// #ifdef MP-WEIXIN
|
|
source_type: 3,
|
|
// #endif
|
|
}
|
|
//购物车结算
|
|
if(this.createType === 'cart'){
|
|
data.ids = this.cartIds.split(',');
|
|
}else{
|
|
data.product = this.data.products[0]
|
|
}
|
|
return data;
|
|
},
|
|
//设置收货地址
|
|
setAddress(addr){
|
|
this.addr = addr;
|
|
this.getOrderPayPrice();
|
|
},
|
|
//打开优惠券弹窗
|
|
showCouponPopup(){
|
|
if(this.data.coupons.length > 0){
|
|
this.$refs.couponSelect.curCoupon = this.curCoupon;
|
|
this.$refs.couponSelect.open();
|
|
}
|
|
},
|
|
//优惠券选择回调
|
|
onCheckCoupon(curCoupon){
|
|
this.curCoupon = curCoupon;
|
|
this.getOrderPayPrice();
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
page{
|
|
background-color: #f7f7f7;
|
|
}
|
|
</style>
|
|
<style scoped lang="scss">
|
|
.b-b:after{
|
|
left: 4rpx;
|
|
right: 4rpx;
|
|
border-color: #ececec;
|
|
}
|
|
.app{
|
|
padding: 16rpx 24rpx 20rpx;
|
|
}
|
|
.main-wrap{
|
|
opacity: 0;
|
|
transition: .2s;
|
|
|
|
&.show{
|
|
opacity: 1;
|
|
}
|
|
}
|
|
.addr-sec{
|
|
display: flex;
|
|
padding: 20rpx;
|
|
background-color: #fff;
|
|
border-radius: 10rpx;
|
|
position: relative;
|
|
overflow: hidden;
|
|
|
|
.addr-empty{
|
|
margin: 16rpx 0 24rpx;
|
|
font-size: 30rpx;
|
|
color: #666;
|
|
|
|
.icon-dizhi{
|
|
transform: translateY(0rpx);
|
|
margin-right: 16rpx;
|
|
}
|
|
}
|
|
.addr-wrap{
|
|
display: flex;
|
|
flex: 1;
|
|
}
|
|
.icon-dizhi{
|
|
transform: translateY(6rpx);
|
|
font-size: 32rpx;
|
|
color: $base-color;
|
|
}
|
|
.icon-you{
|
|
flex-shrink: 0;
|
|
transform: translateY(50%);
|
|
position: relative;
|
|
top: -14rpx;
|
|
font-size: 26rpx;
|
|
color: #999;
|
|
}
|
|
.con{
|
|
flex: 1;
|
|
padding: 0 80rpx 10rpx 20rpx;;
|
|
}
|
|
.addr{
|
|
margin-bottom: 16rpx;
|
|
font-size: 30rpx;
|
|
color: #333;
|
|
line-height: 1.4;
|
|
font-weight: 700;
|
|
}
|
|
.name{
|
|
font-size: 28rpx;
|
|
color: #999;
|
|
}
|
|
.bg{
|
|
position: absolute;
|
|
left: 0;
|
|
bottom: 0;
|
|
width: 100%;
|
|
height: 4rpx;
|
|
}
|
|
}
|
|
.goods-sec{
|
|
margin-top: 16rpx;
|
|
background-color: #fff;
|
|
border-radius: 10rpx 10rpx 0 0;
|
|
overflow: hidden;
|
|
}
|
|
.price-sec{
|
|
padding-top: 14rpx;
|
|
border-radius: 0 0 10rpx 10rpx;
|
|
background-color: #fff;
|
|
|
|
.cell{
|
|
height: 68rpx;
|
|
padding: 0 24rpx;
|
|
font-size: 26rpx;
|
|
color: #333;
|
|
}
|
|
.price{
|
|
font-weight: 700;
|
|
|
|
&.red{
|
|
color: $base-color;
|
|
}
|
|
&.disabled{
|
|
color: #999;
|
|
font-weight: normal;
|
|
}
|
|
}
|
|
.total{
|
|
justify-content: flex-end;
|
|
height: 80rpx;
|
|
padding-right: 20rpx;
|
|
margin-top: 16rpx;
|
|
font-size: 30rpx;
|
|
color: #333;
|
|
|
|
.price:before{
|
|
content: '小计:';
|
|
font-weight: normal;
|
|
}
|
|
}
|
|
.tag{
|
|
padding: 6rpx 8rpx;
|
|
margin-right: 8rpx;
|
|
font-size: 20rpx;
|
|
color: #fff;
|
|
border-radius: 8rpx;
|
|
background-color: orange;
|
|
|
|
&.red{
|
|
background-color: $base-color;
|
|
}
|
|
}
|
|
.icon-you{
|
|
margin-left: 8rpx;
|
|
font-size: 20rpx;
|
|
color: #999;
|
|
}
|
|
}
|
|
.remarks{
|
|
padding: 24rpx 24rpx;
|
|
margin-top: 16rpx;
|
|
border-radius: 12rpx;
|
|
background-color: #fff;
|
|
|
|
.title{
|
|
margin-bottom: 24rpx;
|
|
font-size: 30rpx;
|
|
color: #333;
|
|
font-weight: 700;
|
|
}
|
|
.input{
|
|
flex: 1;
|
|
min-height: 140rpx;
|
|
font-size: 28rpx;
|
|
color: #333;
|
|
}
|
|
}
|
|
.bot-fill-view{
|
|
width: 100%;
|
|
height: 100rpx;
|
|
box-sizing: content-box;
|
|
padding-bottom: constant(safe-area-inset-bottom);
|
|
padding-bottom: env(safe-area-inset-bottom);
|
|
}
|
|
.bottom{
|
|
position: fixed;
|
|
left: 0;
|
|
bottom: 0;
|
|
z-index: 90;
|
|
width: 100%;
|
|
height: 100rpx;
|
|
background-color: #fff;
|
|
box-shadow: 0 -2rpx 10rpx 0 rgba(0,0,0,.06);
|
|
box-sizing: content-box;
|
|
padding-bottom: constant(safe-area-inset-bottom);
|
|
padding-bottom: env(safe-area-inset-bottom);
|
|
|
|
.tip{
|
|
margin-left: 24rpx;
|
|
font-size: 28rpx;
|
|
color: #999;
|
|
}
|
|
.price{
|
|
margin-right: 30rpx;
|
|
font-size: 36rpx;
|
|
color: $base-color;
|
|
font-weight: 700;
|
|
text-align: right;
|
|
}
|
|
.btn{
|
|
min-width: 180rpx;
|
|
height: 70rpx;
|
|
padding: 0 26rpx;
|
|
margin-right: 20rpx;
|
|
border-radius: 100rpx;
|
|
background-color: $base-color;
|
|
font-size: 30rpx;
|
|
color: #fff;
|
|
}
|
|
}
|
|
</style>
|