Files
ysdH5/pages/draw/right.vue
2023-06-21 17:19:58 +08:00

798 lines
25 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view>
<!-- 按钮 -->
<view class="newrightsBtn" @click="payment">
<view class="rightsBtn-text">
<view class="rightsBtn-text-num">{{rightData.num}}件商品 </view>
<view>实付<text>{{rightData.total}}</text></view>
</view>
<button :disabled="disabled">立即购买</button>
</view>
<!-- 重要提示 -->
<view class="rightsPoint">
<view class="rightsPoint-cont">
<view class="rightsPoint-top">
<image src="/static/icon/Point_icon.png"></image>
<text>重要提示</text>
</view>
<view class="rightsPoint-text" :class="{active : pointMoreShow}">
<rich-text :nodes="notice.notification"></rich-text>
</view>
<view class="pointMore" bindtap="pointMoreTap">
<text>{{pointMoreShow == true ? '收起' : '展开'}}</text>
<image :src="pointMoreShow == true ? '/static/img/pointMore-up.png' : '/static/img/pointMore.png'">
</image>
</view>
</view>
</view>
<!-- 卡券 -->
<view style="padding-bottom: 220px">
<view class="cont">
<view class="contBack">
<image class="classBack" src="https://card.ysd-bs.com/storage/materials/2022/05/13/class_back_02.png" mode="scaleToFill"></image>
<view class="classCircle"></view>
<view class="rightsCont">
<scroll-view scroll-x class="welfareCont-top" scroll-with-animation>
<view class="welfareCont-list-img" v-for="(item, index) in rightData.detail.logos" :key="index">
<image :src="item" mode="aspectFill"></image>
</view>
</scroll-view>
<view class="nowrap rightsCont-btn">
{{rightData.detail.title}}
</view>
</view>
</view>
</view>
<!-- 数量 -->
<view class="rightsNumber">
<image class="rightsGoods-img" :src="rightData.detail.goods_cover" mode="widthFix"></image>
<view class="rightsGoods">
<view class="nowrap rightsGoods-text">
{{ rightData.detail.title }}
</view>
<view class="rightsGoods-price">
<view class="rightsGoods-number">{{ rightData.detail.amount }}</view>
<!-- <view class="rightsAdd">
<view class="rightsAdd-btn rightsAdd-remove" :class="{active : rightData.num != 1}" @click="goodsNumber('remove')">-</view>
<input class="rightsAdd-input" :data-num="rightData.num" :value="rightData.num" type="number" disabled=""></input>
<view class="rightsAdd-btn rightsAdd-plus" :class="{active : rightData.num != 1}">+</view>
</view> -->
</view>
</view>
</view>
<!-- 购买须知 -->
<view class="notice">
<view class="noticeTitle" @click="noticeTap">
<view class="noticeTitle-flex">
<image class="noticeTitle-img" src="/static/icon/notice_icon.png"></image>
购买前请仔细阅读使用须知内容介绍
</view>
<image class="noticeTitle-row" :class="{active : notice.noticeShow}" src="/static/icon/rightsArrow.png"></image>
</view>
<view class="noticeText" :class="{active : notice.noticeShow}">
<!-- <view class="noticeText-top">购买须知</view> -->
<view class="noticeText-cont" v-if="notice.remark">
<rich-text :nodes="notice.remark"></rich-text>
</view>
<!-- <view class="noticeText-top">内容介绍</view> -->
<view class="noticeText-cont" v-if="notice.content">
<rich-text :nodes="notice.content"></rich-text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import { exchangesBuy } from '@/apis/interfaces/draw'
import { activityBuy } from '@/apis/interfaces/draw'
import { getAuthUrl, wpayH5Info, h5Pay } from '@/apis/interfaces/rights'
const jweixin = require('jweixin-module'); //获取微信支付
export default {
data() {
return {
tradeNo : '' , //订单
rightData: {
detail : '', // 权益内容
logId : '', // 权益id
addressSee : '', // 收货地址
num : 1, // 购买数量
moreAmount : '', // 产品总金额
freight : '', // 运费
total : '' // 总金额
},
notice : {
remark : '', // 购买须知
content : '', // 内容介绍
noticeShow : true ,// 购买须知状态
notification: ''
},
buyWay : {
platformCp : [], // 选择提交数组
platIndex : 0, // 选择提交方式下标
isdeliver : -1 // 选择提交方式
},
address : {
allAddress : [], // 收货地址列表
addressShow : false // 地址显示状态
},
disabled : false, //购买按钮状态
pointMoreShow : false,
}
},
// 生命周期函数--监听页面加载
onLoad(options) {
this.rightData.logId = options.luck_id
// 判断是否微信授权登录过 只有外部游览器才用到(支付需要授权微信环境)
let status = navigator.userAgent.toLowerCase();
if (status.match(/MicroMessenger/i) == "micromessenger" && !options.code) {
let locationUrl = window.location.pathname.substr(1) + window.location.search
getAuthUrl(locationUrl).then(res=> {
window.location.href = res
})
}
this.openid = options.openid || ''
this.code = options.code || '' //用code换取oppid
},
// 生命周期函数--监听页面显示
onShow() {
// 存储环境-抽奖活动
getApp().globalData.envType = 'drawEnv'
// 获取详情
this.rightsInfo();
},
methods: {
// 详情
rightsInfo() {
activityBuy({activity_exchange_log_id: this.rightData.logId, qty: 1}).then(res => {
this.rightData.detail = res.detail
this.rightData.moreAmount = res.amount
this.rightData.total = res.total
this.rightData.freight = res.freight
this.rightData.addressSee = res.address
this.address.allAddress = res.all_address
this.notice.remark = res.detail.remark.replace(/\<img/gi, '<img style="max-width:100%;height:auto;display:block;"')
this.notice.content = res.detail.content.replace(/\<img/gi, '<img style="max-width:100%;height:auto;display:block;"')
this.notice.notification = res.detail.notification.replace(/\<img/gi, '<img style="max-width:100%;height:auto;display:block;"')
}).catch(err => {})
},
// 须知展开收起状态
noticeTap() {
this.notice.noticeShow = !this.notice.noticeShow
},
// 收银台跳转
payment() {
exchangesBuy({
name : '',
mobile : '',
address : '',
activity_exchange_item_goods_id: '',
activity_exchange_log_id: this.rightData.logId,
qty : 1
}).then(res=>{
this.tradeNo = res.trade_no
this.wxBrowser()
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none'
})
});
},
// 当支付环境为微信游览器情况下
wxBrowser() {
wpayH5Info({
url: location.href.split('#')[0],
list:'chooseWXPay'
}).then(wechatConfig => {
let wxConfig = JSON.parse(wechatConfig)
jweixin.config({
appId: wxConfig.appId,
debug: false,
jsApiList: wxConfig.jsApiList,
signature: wxConfig.signature,
nonceStr: wxConfig.nonceStr,
timestamp: wxConfig.timestamp
})
jweixin.ready(() => {
let wechaUrl = 'payments/wechat'
h5Pay(wechaUrl, {
channel: 'h5',
trade_no: this.tradeNo,
code: this.code
}).then(wechatRes => {
let wechatPay = JSON.parse(wechatRes)
jweixin.chooseWXPay({
timestamp: wechatPay.timeStamp,
nonceStr: wechatPay.nonceStr,
package: wechatPay.package,
signType: wechatPay.signType,
paySign: wechatPay.paySign,
success: payRes => {
// 支付成功
uni.redirectTo({
url: 'order?type=paid'
})
},
cancel: () =>{
// 取消支付
uni.redirectTo({
url: 'order?type=unpay'
})
}
})
})
})
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none'
})
if (!err.login) {
uni.reLaunch({
url: '/pages/draw/signin'
});
}
})
},
/**
* 重要提示显示
*/
pointMoreTap() {
this.pointMoreShow = !this.pointMoreShow
}
}
}
</script>
<style lang="scss" scoped>
page {
background-color: #eeeeee;
}
/* 权益内容 */
.cont {
width: 100%;
overflow: hidden;
.contBack {
position: relative;
width: 200%;
height: 340rpx;
left: -50%;
text-align: center;
background: #000000;
border-radius: 0 0 100% 100%;
overflow: hidden;
.classBack {
position: absolute;
left: 28%;
right: 30%;
width: 44%;
top: 40rpx;
}
}
.classCircle::after,
.contBack::before {
position: absolute;
border-radius: 50%;
content: '';
z-index: 1;
background-color: rgba(255,255,255,.1);
}
.classCircle::after {
left: 20%;
top: -20rpx;
width: 260rpx;
height: 260rpx;
}
.contBack::before {
right: 20%;
top: 55%;
width: 300rpx;
height: 300rpx;
}
.rightsCont {
position: absolute;
z-index: 3;
left: calc(28% - 2rpx);
right: calc(30% - 2rpx);
width: calc(44% + 4rpx);
top: 50rpx;
.welfareCont-top{
white-space: nowrap;
flex-direction: row;
align-items: center;
justify-content: space-around;
width: 100%;
padding: 0 10rpx;
box-sizing: border-box;
margin: 50rpx 0 20rpx;
height: 120rpx;
.welfareCont-list-img {
border-radius: 50%;
width: 120rpx;
height: 120rpx;
display: inline-block;
margin: 0 15rpx;
overflow: hidden;
image {
width: 100%;
height: 100%;
}
}
}
.rightsCont-btn {
background: rgba(255, 255, 0255, .4);
width: 100%;
line-height: 70rpx;
font-size: 40rpx;
font-weight: 600;
color: #000000;
padding: 0 20rpx;
box-sizing: border-box;
}
}
}
// 数量
.rightsNumber {
background-color: #ffffff;
position: relative;
padding: 40rpx;
box-sizing: border-box;
.rightsGoods-img {
width: 160rpx;
height: 160rpx;
border-radius: 10rpx;
}
.rightsGoods {
position: absolute;
left: 0;
top: 0;
width: 100%;
padding: 60rpx 40rpx 0 230rpx;
box-sizing: border-box;
.rightsGoods-text {
font-size: 36rpx;
margin-bottom: 35rpx;
font-weight: 600;
}
.rightsGoods-price {
display: flex;
.rightsGoods-number {
flex: 1;
font-size: 34rpx;
text {
font-size: 28rpx;
}
}
.rightsAdd {
display: flex;
.rightsAdd-btn {
border-radius: 4rpx;
text-align: center;
width: 50rpx;
height: 50rpx;
line-height: 45rpx;
font-size: 40rpx;
font-weight: 600;
}
.rightsAdd-remove {
background: #f8f8f8;
color: #d9d9d9;
}
.rightsAdd-remove.active,
.rightsAdd-plus {
background: #e8e4e5;
color: #6b6768;
}
.rightsAdd-input {
width: 100rpx;
text-align: center;
font-size: 28rpx;
line-height: 50rpx;
}
}
}
}
}
// 地址
.rightsList,
.notice,
.detailsStore {
background: white;
padding: 10rpx 0;
box-sizing: border-box;
}
.rightsLabel,
.rightsLabel-pay {
display: flex;
padding: 20rpx 40rpx;
color: #6c6c6c;
font-weight: 600;
font-size: 30rpx;
}
.rightsLabel-left {
flex: 1;
color: #747d86;
.rightsLabel-row {
width: 42rpx;
height: 42rpx;
}
}
.rightsLabel-range {
display: flex;
color: #000;
font-weight: 600;
}
.rightsLabel-address {
display: flex;
position: relative;
margin: 10rpx 0;
padding: 25rpx 40rpx;
&::after,
&::before {
position: absolute;
content: '';
left: 30rpx;
width: calc(100% - 60rpx);
height: 2rpx;
background-color: #bfbfbf;
}
&::after {
top: 0;
}
&::before {
bottom: 0;
}
.rightsLabel-row {
margin-top: 30rpx;
}
.rightsLabel-icon {
width: 70rpx;
height: 70rpx;
margin-top: 14rpx;
}
.rightsLabel-right {
width: calc(100% - 80rpx);
margin-left: 10rpx;
display: flex;
font-size: 28rpx;
.rightsLabel-address-text {
flex: 1;
color: #000000;
.rightsLabel-address-name {
display: flex;
font-size: 32rpx;
margin-bottom: 10rpx;
.rightsLabel-address-tel {
padding-left: 30rpx;
color: #959595;
}
}
}
}
}
.rightsLabel-row {
width: 42rpx;
height: 42rpx;
margin: 0 0 0 6rpx;
}
// 购买须知
.notice {
background: white;
padding: 30rpx 20rpx;
box-sizing: border-box;
.noticeTitle {
display: flex;
.noticeTitle-flex {
flex: 1;
display: flex;
font-size: 30rpx;
line-height: 46rpx;
.noticeTitle-img {
width: 46rpx;
height: 46rpx;
margin-right: 20rpx;
}
}
.noticeTitle-row {
width: 46rpx;
height: 46rpx;
&.active {
transform: rotate(90deg);
}
}
}
.noticeText {
font-size: 26rpx;
height: 0;
overflow: hidden;
&.active {
height: auto;
}
.noticeText-top {
margin: 30rpx 0 10rpx;
font-weight: 600;
}
.noticeText-cont {
line-height: 60rpx;
}
}
}
.newrightsBtn {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 160rpx;
z-index: 9;
background: #fff;
padding: 30rpx;
box-sizing: border-box;
display: flex;
.rightsBtn-text {
flex: 1;
font-weight: 600;
font-size: 30rpx;
.rightsBtn-text-num {
font-size: 30rpx;
margin-bottom: 10rpx;
}
text {
font-size: 38rpx;
color: #fe2d55;
}
}
button {
width: 280rpx !important;
background-color: #000000;
color: #ffffff;
border-radius: 80rpx;
height: 100rpx;
line-height: 100rpx;
padding: 0;
margin: 0;
}
}
// 选择收货地址
.addressBack {
position: fixed;
left: 0;
bottom: 0;
background: rgba(0, 0, 0, .4);
z-index: 10;
width: 100%;
height: 100%;
display: none;
&.active {
display: block;
}
}
.addressCont {
position: fixed;
left: 0;
bottom: -1000%;
transition: .2s;
background: #fff;
z-index: 11;
width: 100%;
&.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;
position: relative;
&::after {
position: absolute;
content: '';
top: 0;
left: 0;
width: 100%;
height: 2rpx;
background: #f3f3f3;
}
.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;
&::after {
position: absolute;
content: '';
left: 0;
bottom: 0;
width: 100%;
height: 2rpx;
background: #f3f3f3;
}
.addressCont-top {
display: flex;
margin-bottom: 10rpx;
.addressCont-name {
font-weight: 600;
}
}
.addressCont-text {
color: #666;
width: calc(100% - 160rpx);
}
.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;
}
}
}
}
.rightsPoint {
position: fixed;
left: 0;
bottom: 160rpx;
background: #eeeeee;
z-index: 9;
width: 100%;
padding: 20rpx 20rpx 10rpx;
box-sizing: border-box;
}
.rightsPoint-cont {
width: 100%;
background: #eeeeee;
border-radius: 10rpx;
position: relative;
max-height: 50vh;
overflow-y: scroll;
}
.rightsPoint-top {
font-size: 28rpx;
display: flex;
padding: 0 20rpx 20rpx;
box-sizing: border-box;
font-weight: 600;
}
.rightsPoint-top image {
width: 36rpx;
height: 36rpx;
margin-right: 10rpx;
}
.rightsPoint-text {
padding: 0 20rpx;
box-sizing: border-box;
font-size: 24rpx;
line-height: 44rpx;
height: 90rpx;
transition: height 25s;
overflow: hidden;
}
.rightsPoint-text.active {
height: auto;
transition: 2s;
}
.rightsPoint-text view {
position: relative;
padding-left: 40rpx;
}
.rightsPoint-text view::after {
position: absolute;
content: '';
left: 10rpx;
top: 20rpx;
background: #000;
width: 10rpx;
height: 10rpx;
border-radius: 50%;
}
.rightsPoint-bolck {
position: absolute;
top: 0;
left: 0;
height: calc(100% - 40rpx);
}
.pointMore {
text-align: center;
width: 100%;
background: #eeeeee;
height: 80rpx;
line-height: 82rpx;
position: relative;
margin-top: 10rpx;
}
.pointMore::after {
position: absolute;
content: '';
left: 0;
top: 0;
width: 100%;
height: 2rpx;
background: #f2ecde;
}
.pointMore text {
font-size: 28rpx;
color: #c38e00;
animation: dong 1.8s infinite;
display: inline-block;
}
.pointMore image {
width: 30rpx;
height: 30rpx;
margin-left: 4rpx;
vertical-align: -4rpx;
animation: dong 1.8s infinite;
}
@keyframes dong {
0% {
transform: translate(0px, 0px);
}
50% {
transform: translate(0px, -6rpx);
}
100% {
transform: translate(0px, 0px);
}
}
</style>