|
|
- <template>
- <view class="page">
- <!-- 导航栏 -->
- <navbar title="商品支付" leftClick @leftClick="$utils.navigateBack" color="#fff" />
-
- <view class="content">
-
- <!-- 商品详情 -->
- <productCard :data="payOrderProduct[0]" :readonly="true"></productCard>
- <!-- <view class="product-item" v-for="item in payOrderProduct" :key="item.id">
- <view class="img-box">
- <image :src="item.image" mode="aspectFill"></image>
- </view>
-
- <view class="server-info">
- <view class="server-title">{{ item.title }}</view>
-
- <view class="texture">
- 材质:{{ item.subText }}
- </view>
-
- <view class="stepper">
- <uv-number-box button-size="60" v-model="item.num"></uv-number-box>
- </view>
-
- <view class="sales-volume">
- <view class="desc">已售出 {{ item.payNum }}单</view>
- </view>
- </view>
- </view> -->
-
- <view class="card payment">
- <uv-radio-group v-model="payMethod">
- <view class="flex payment-item">
- <image class="icon" src="../static/createOrder/icon-wx.png" mode="widthFix"></image>
- <text class="label">微信支付</text>
- <uv-radio :name="0" activeColor="#84A73F" size="39rpx" icon-size="39rpx"/>
- </view>
- <view class="flex payment-item">
- <image class="icon" src="../static/createOrder/icon-account.png" mode="widthFix"></image>
- <text class="label">账户余额<text class="desc">{{ `(余额:¥${riceInfo.balance || 0})` }}</text></text>
- <uv-radio :name="1" activeColor="#84A73F" size="39rpx" icon-size="39rpx"/>
- </view>
- </uv-radio-group>
- </view>
-
- </view>
-
- <template v-if="false">
-
- <!-- 优惠券 -->
- <view @click="openCoupon" class="cell-item">
- <view class="cell-item-left">
- <image src="@/pages_order/static/createOrder/coupon.png" mode="widthFix" class="cell-icon"></image>
- <view class="user-name">优惠券</view>
- <view class="descript">(¥{{ coupon.money || 0}})</view>
- </view>
- <view class="cell-item-right">
- <!-- <radio color="#E3441A" :value="2" :checked="coupon.id" /> -->
- </view>
- </view>
-
- <!-- 提示 -->
- <view class="hint"
- v-if="payOrderProduct[0] && payOrderProduct[0].orderDetails">
- {{ payOrderProduct[0].orderDetails }}
- </view>
-
- <!-- 用户协议 -->
- <view class="agreement">
- <radio color="#E3441A" @click="agreement = !agreement" :checked="agreement" />
- 本人已同意<text @click="$refs.popup.open('user_xy')">《用户使用协议》</text>
- </view>
-
- <!-- 下单 -->
- <view class="submit">
- <view class="price">
- <view>
- <text style="color: #000;">合计</text>
- ¥<text style="font-size: 18px;
- font-weight: 600;">{{ totalPrice }}</text>元
- </view>
- </view>
- <view class="btn" @click="submit">
- 立即支付
- </view>
- </view>
-
- </template>
-
- <!-- 优惠券选择-->
- <uv-popup ref="couponPopup" :round="30">
- <couponList ref="couponList" height="60vh" @select="selectCoupon" />
- </uv-popup>
-
- <configPopup ref="popup"></configPopup>
-
- </view>
- </template>
-
- <script>
- import productCard from '@/components/product/productCard.vue'
-
- import addressList from '../components/address/addressList.vue'
- import couponList from '@/components/couponList/couponList.vue'
-
- import {
- mapState
- } from 'vuex'
-
- export default {
- components: {
- productCard,
-
- addressList,
- couponList
- },
- data() {
- return {
- address: {
- name: '请选择地址',
- address: '',
- },
- addressTotal: 0,
- remark: '',
- num: 1,
- agreement: false,
- coupon: {},
- payMethod : 0,
- isGive : 0,
- type : '',
- titleMap : {
- def : '确认订单',
- give : '送礼清单',
- },
- multiNum: 2, // 多人礼包人数
- multiMinNum: 2, // 最小人数
- multiMaxNum: 100, // 最大人数
- }
- },
- computed: {
- totalPrice() {
- let price = 0
-
- this.payOrderProduct.forEach(n => {
- price += n.price * n.num
- })
-
- if (this.coupon.id) {
- price -= this.coupon.money
- }
-
- return Number(price).toFixed(2)
- },
- ...mapState(['userInfo', 'payOrderProduct']),
- },
- onLoad(args) {
- this.type = args.type || 'def'
- if(this.type == 'give'){
- this.isGive = 1
- }
- this.$store.commit('getUserInfo')
- },
- onShow() {
- // todo
- return
- this.getAddressList()
- this.getCouponList()
- },
- methods: {
- // 打开
- getAddressList() {
- // 获取地址列表
- this.$refs.addressList.getAddressList().then(res => {
- this.addressTotal = res.total
- if (this.addressTotal != 0) {
- this.address = res.records[0]
- }
- })
- },
- //获取优惠券列表
- getCouponList() {
- this.$refs.couponList.getCouponList()
- },
- // 打开选择地址
- openAddress() {
- if (this.addressTotal == 0) {
- return uni.navigateTo({
- url: '/pages_order/mine/address?type=back'
- })
- }
- this.$refs.addressPopup.open('bottom')
- },
- // 选择地址
- selectAddress(e) {
- this.address = e
- this.$refs.addressPopup.close()
- },
- // 打开优惠券选择
- openCoupon() {
- if (this.addressTotal == 0) {
- return uni.navigateTo({
- url: '/pages_order/mine/address?type=back'
- })
- }
- this.$refs.couponPopup.open('bottom')
- },
- // 选择优惠券
- selectCoupon(e) {
- //判断优惠券限制
- let {
- useMoney
- } = e
- let productTotalPrice = 0
- this.payOrderProduct.forEach(item => {
- productTotalPrice += item.price
- })
- if (productTotalPrice < useMoney) {
- return uni.showToast({
- title: `此优惠券需要满${useMoney}使用`,
- icon: "none"
- })
- }
- this.coupon = e
- this.$refs.couponPopup.close()
- },
-
- submit() {
-
- let addressId = this.address.id
-
- if (!addressId) {
- uni.showToast({
- title: '请选择地址',
- icon: 'none'
- })
- return
- }
-
- if (!this.agreement) {
- uni.showToast({
- title: '请先同意使用协议',
- icon: 'none'
- })
- return
- }
-
- let data = {}
- let api = ''
-
- // 不是送礼
- if(this.type != 'give'){
-
- let list = []
- this.payOrderProduct.forEach(n => {
- list.push({
- num: n.num,
- shopId: n.shopId || n.id,
- })
- })
- data = {
- addressId,
- payType : this.payMethod,
- list: JSON.stringify(list),
- }
-
- api = 'createSumOrder'
-
- this.deleteCart(this.payOrderProduct.map(n => n.id).join(','))
-
- } else { //体验、常规商品
- data = {
- addressId,
- num: this.payOrderProduct[0].num,
- shopId: this.payOrderProduct[0].id,
- payType : this.payMethod,
- isGive : this.isGive,
- memberNum : 1,
- }
- api = 'createOrder'
- }
-
- if(this.coupon.id){
- data.couponId = this.coupon.id
- }
- if(this.isGive == 2){
- data.memberNum = this.multiNum
- }
-
- this.$api(api, data, res => {
- if (res.code == 200) {
-
- if(this.payMethod == 1){
- // uni.showToast({
- // title: '下单成功',
- // icon: 'none'
- // })
- this.paySuccess(res)
- return
- }
-
- uni.requestPaymentWxPay(res)
- .then(e => {
- uni.showToast({
- title: '下单成功',
- icon: 'none'
- })
-
- this.paySuccess(res)
- }).catch(n => {
- setTimeout(uni.redirectTo, 700, {
- url: '/pages/index/order'
- })
- })
-
- }
- })
- },
- paySuccess(res){
- if(this.type == 'def'){
- setTimeout(uni.redirectTo, 700, {
- url: '/pages/index/order'
- })
- }else{
- setTimeout(uni.redirectTo, 700, {
- url: `/pages_order/order/instantGift?id=${res.message}`
- })
- }
- },
- // 删除购物车
- deleteCart(ids) {
- this.$api('deleteCart', {
- ids
- })
- },
- }
- }
- </script>
-
- <style scoped lang="scss">
- .page {
- overflow: auto;
- padding-bottom: 300rpx;
-
- /deep/ .nav-bar__view {
- padding-bottom: 190rpx;
- background-image: linear-gradient(#84A73F, #D8FF8F);
- }
-
- .content {
- position: absolute;
- z-index: 999;
-
- transform: translateY(-118rpx);
-
- width: 100vw;
- padding: 0 13rpx;
- box-sizing: border-box;
- }
-
- /deep/ .product-card__view {
- // margin: 0 13rpx;
- padding: 27rpx 25rpx;
- // width: calc(100vw - 13rpx*2);
- width: 100%;
- box-sizing: border-box;
- // transform: translateY(-50%);
-
- .img {
- width: 184rpx;
- height: 184rpx;
- }
-
- .title {
- margin-bottom: 14rpx;
- }
-
- .price {
- margin-top: 15rpx;
- }
-
- .sales {
- margin-top: 15rpx;
- }
- }
-
- .bac {
- width: 100%;
- height: 100px;
- background: $uni-color;
- }
-
- .give-type {
- background: #fff;
- border-radius: 20rpx;
- padding: 30rpx;
- margin-bottom: 20rpx;
-
- .tab-box {
- display: flex;
- justify-content: space-between;
-
- .tab-item {
- width: 30%;
- background: #F8F8F8;
- border-radius: 20rpx;
- padding: 20rpx;
- text-align: center;
-
- text {
- display: block;
-
- &.desc {
- font-size: 24rpx;
- color: #999;
- margin-top: 10rpx;
- }
- }
-
- &.active {
- background: rgba($uni-color, 0.1);
- color: $uni-color;
-
- .desc {
- color: $uni-color;
- }
- }
- }
- }
-
- .tips {
- margin-top: 20rpx;
- font-size: 26rpx;
- color: #999;
- display: flex;
- align-items: center;
- justify-content: space-between;
-
- .guide {
- color: $uni-color;
- text-decoration: underline;
- }
- }
- }
-
- .box {
- padding: 20rpx;
- margin-top: -150rpx;
-
- // 商品详情
- .product-item {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- justify-content: space-between;
- background: white;
- border-radius: 15rpx;
- box-sizing: border-box;
- padding: 25rpx;
- margin: 20rpx 0rpx;
-
- .img-box {
- width: 200rpx;
- height: 200rpx;
- background: #ccc;
- border-radius: 10rpx;
- overflow: hidden;
-
- image {
- width: 100%;
- height: 100%;
- }
- }
-
- .server-info {
- width: calc(100% - 200rpx);
- box-sizing: border-box;
- padding: 10rpx 20rpx;
- display: flex;
- flex-direction: column;
- justify-content: space-around;
-
- .server-title {
- font-size: 34rpx;
- }
-
- .texture {
- color: #B8B8B8;
- margin: 10rpx 0rpx;
- }
-
- .stepper {
- margin-bottom: 10rpx;
-
- &::v-deep .uv-number-box__input {
- color: $uni-color !important;
- width: 100rpx !important;
- }
- }
-
- .sales-volume {
- display: flex;
- align-items: center;
- color: #B8B8B8;
- font-size: 26rpx;
-
- image {
- width: 25rpx;
- height: 25rpx;
- }
-
- }
-
- }
- }
-
- //cell单元格(地址)
- .cell-item {
- display: flex;
- justify-content: space-between;
- align-items: center;
- background: white;
- border-radius: 20rpx;
- padding: 20rpx;
- box-sizing: border-box;
-
- .cell-item-left {
- display: flex;
- align-items: center;
- width: 90%;
-
- .cell-icon {
- width: 40rpx;
- }
-
- .user-name,
- .user-address {
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- width: 150rpx;
- padding-left: 20rpx;
- box-sizing: border-box;
- }
-
- .descript {
- color: #888888;
- }
-
- .user-address {
- width: calc(100% - 230rpx);
- }
- }
-
- .cell-item-right {
- width: 10%;
- display: flex;
- justify-content: flex-end;
-
- .stepper {
- display: flex;
- align-items: center;
-
- text {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 44rpx;
- height: 44rpx;
-
- &.minus, &.plus {
- background: #F8F8F8;
- border-radius: 50%;
- font-size: 32rpx;
-
- &.disabled {
- color: #ccc;
- }
- }
-
- &.num {
- margin: 0 20rpx;
- color: $uni-color;
- font-size: 28rpx;
- }
- }
- }
- }
- }
-
- .cell-list {
- margin: 20rpx 0rpx;
- border-radius: 20rpx;
- overflow: hidden;
-
- .cell-item {
- border-radius: 0rpx;
- }
- }
-
- // 提示
- .hint {
- font-size: 26rpx;
- margin-top: 80rpx;
- color: #BFBFBF;
- }
-
- // 用户协议
- .agreement {
- display: flex;
- justify-content: center;
- align-items: center;
- padding: 10px 0;
-
- .van-checkbox {
- margin-right: 5rpx;
- }
-
- text {
- color: $uni-color;
- }
- }
-
- // 下单
- .submit {
- position: fixed;
- bottom: 0;
- left: 0;
- width: 100%;
- height: 60px;
- background-color: #fff;
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .price {
- color: #F39637;
- padding: 0 20px;
- }
-
- .btn {
- background: $uni-color;
- color: white;
- width: 120px;
- height: 45px;
- border-radius: 23px;
- font-size: 16px;
- display: flex;
- justify-content: center;
- align-items: center;
- }
- }
- }
-
- //新增地址按钮
- .add-btn {
- width: 100%;
-
- .button-submit {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 596rpx;
- height: 90rpx;
- background: #E3441A;
- border-radius: 46rpx;
-
- margin: 20rpx auto;
-
- font-size: 28rpx;
- font-family: PingFang SC, PingFang SC-Regular;
- font-weight: 400;
- text-align: center;
- color: #ffffff;
- }
- }
- .multi-box, .lucky-box {
- background: #fff;
- border-radius: 20rpx;
- padding: 30rpx;
- margin-bottom: 20rpx;
-
- .title {
- font-size: 28rpx;
- font-weight: 500;
- margin-bottom: 20rpx;
- }
- }
-
- .multi-box {
- .stepper {
- display: flex;
- align-items: center;
- justify-content: center;
-
- text {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 60rpx;
- height: 60rpx;
-
- &.minus, &.plus {
- background: #F8F8F8;
- border-radius: 50%;
- font-size: 36rpx;
-
- &.disabled {
- color: #ccc;
- }
- }
-
- &.num {
- margin: 0 40rpx;
- color: $uni-color;
- font-size: 32rpx;
- }
- }
- }
- }
-
- .lucky-box {
- .tips-list {
- .tip-item {
- font-size: 26rpx;
- color: #666;
- line-height: 2;
- }
- }
- }
- }
-
-
-
- .payment {
- margin-top: 23rpx;
- padding: 22rpx 42rpx 34rpx 41rpx;
- color: #000000;
- font-size: 28rpx;
-
- &-item {
- width: 100%;
-
- & + & {
- margin-top: 38rpx;
- }
- }
-
- .icon {
- width: 46rpx;
- height: auto;
- margin-right: 18rpx;
- }
-
- .label {
- flex: 1;
- }
-
- .desc {
- color: #999999;
- }
- }
- </style>
|