[本时生活h5端]

This commit is contained in:
2023-06-21 17:19:58 +08:00
commit ebb9575bd0
284 changed files with 39689 additions and 0 deletions

515
pages/draw/choose.vue Normal file
View File

@@ -0,0 +1,515 @@
<template>
<view class="content">
<view class="borderBottom">
<view class="title">
<image class="title-img" src="/static/img/draw_choose.png"></image>
<view class="title-top">
选择商品兑换
</view>
</view>
<view class="choose">
<view class="choose-radio-group">
<radio-group class="choose-label" :class="{active : current == 1}" @change="(e) => radioChange(e,index,item)" v-for="(item, index) in goodsArr" :key="index">
<view class="choose-label-name">
<image class="choose-label-img" :src="item.cover"></image>
<view class="choose-label-text">
<view class="choose-label-title">
{{item.title}}
<text>基于能监测健康的手环</text>
</view>
<view class="choose-label-price">
<text></text>{{item.price}}
</view>
</view>
</view>
<radio class="radio" :value="String(item.exchagne_item_goods_id)" :checked="index == current"></radio>
</radio-group>
</view>
<view class="chooseForm">
<view class="site-input">
<label>收货人姓名</label>
<input class="campus-form-input" maxlength="4" type="text" placeholder="请输入收货人姓名" @input="getNameValue" name="name" placeholder-style="color:#c9c9c9;"></input>
</view>
<view class="site-input">
<label>收货人手机</label>
<input class="campus-form-input" maxlength="11" type="number" placeholder="请输入收货人手机号" @input="getTelValue" name="mobile" placeholder-style="color:#c9c9c9;"></input>
</view>
<!-- <view class="site-input">
<label>所在省份</label>
<picker @change="areasChange" :value="area.areaIndex" :range="area.areas" :range-key="'name'" name="province_id">
<view class="picker" v-if="area.areas[area.areaIndex]">
{{ area.areas[area.areaIndex].name }}
</view>
<image src="/static/icon/rightsArrow.png"></image>
</picker>
</view>
<view class="site-input">
<label>所在城市</label>
<picker @change="cityDrop" :value="city.cityIndex" :range="city.cityList" :range-key="'name'" class="conneColor" name="city_id">
<view class="picker" v-if="city.cityList[city.cityIndex]">
{{ city.cityList[city.cityIndex].name }}
</view>
<image src="/static/icon/rightsArrow.png"></image>
</picker>
</view>
<view class="site-input">
<label>所在区域</label>
<picker @change="regiDrop" :value="regi.regiIndex" :range="regi.regiList" :range-key="'name'" class="conneColor" name="district_id">
<view class="picker" v-if="regi.regiList[regi.regiIndex]">
{{ regi.regiList[regi.regiIndex].name }}
</view>
<image src="/static/icon/rightsArrow.png"></image>
</picker>
</view> -->
<view class="site-input">
<label>收货地址</label>
<input placeholder="请输入收货详细地址" name="address" @input="getAddressValue" placeholder-style="color:#c9c9c9;"></input>
</view>
</view>
</view>
</view>
<view class="chooseBuy">
<view class="chooseBuy-price">
{{goodTitle}}<text>{{goodPay == 0 ? '免费兑换' : '支付金额: ¥' + goodPrice}}</text>
</view>
<button type="default" class="chooseBuy-btn" @click="siteform">
兑换
</button>
</view>
</view>
</template>
<script>
import { exchanges, exchangesBuy } from '@/apis/interfaces/draw'
import { create, children } from '@/apis/interfaces/address'
import { getAuthUrl, wpayH5Info, h5Pay } from '@/apis/interfaces/rights'
const jweixin = require('jweixin-module'); //获取微信支付
export default {
data() {
return {
logId : '', //抽奖记录
tradeNo : '', //产品支付订单号
goodsArr : [], //产品列表
goodId : '', //产品id
goodTitle : '', //产品名称
goodPrice : '', //产品金额
goodPay : '', //产品是否支付
current : 0 , //支付下标
address : '', // 地址内容
name : '', // 姓名
mobile : '', // 手机号
// 省份选择
area: {
areas : [],
areaSn : '',
areaIndex : 0,
},
// 市级选择
city: {
cityList : [],
cityId : 0,
cityIndex : 0,
},
// 区域选择
regi: {
regiList : [],
regiId : 0,
regiIndex : 0,
}
}
},
// 生命周期函数--监听页面加载
onLoad(options) {
// 判断是否微信授权登录过 只有外部游览器才用到(支付需要授权微信环境)
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
// 获取商品选择
this.exchangesShow(options.id)
},
onShow() {
// 存储环境-用户抽奖活动
getApp().globalData.envType = 'drawEnv'
// 获取省信息
// this.getProvince()
},
methods: {
// 微信支付数据
wechatPayment() {
let status = navigator.userAgent.toLowerCase();
if (status.match(/MicroMessenger/i) == "micromessenger") {
// 微信浏览器-获取
this.wxBrowser();
}else {
// 普通浏览器(网址游览器)
this.outBrowser();
}
},
// 商品选择
exchangesShow(id){
exchanges(id).then(res=>{
this.logId = res.exchage_log_id
this.goodsArr = res.exchange_item.goods
this.goodId = res.exchange_item.goods[0].exchagne_item_goods_id
this.goodTitle = res.exchange_item.goods[0].title
this.goodPrice = res.exchange_item.goods[0].price
this.goodPay = res.exchange_item.goods[0].is_buy
})
},
// 支付方式选择
radioChange(evt, index, item) {
this.goodTitle = item.title
this.goodPay = item.is_buy
this.goodPrice = item.amount
this.current = index
this.goodId = evt.detail.value
},
// 省信息
getProvince() {
create().then(res=>{
let areaArr = res.provinces,
areaIndex = this.area.areaIndex
this.area.areaSn = areaArr[areaIndex].code
this.area.areas = areaArr
this.citylist(areaArr[areaIndex].code)
})
},
// 所在省份
areasChange(e) {
let area = this.area.areas,
index = e.detail.value,
atcode = area[index].code
if (index != this.area.areaIndex) {
this.area.areaIndex = index
this.area.areaSn = atcode
// 获取市级列表
this.citylist(atcode)
}
},
// 市级列表
citylist(code) {
children(code).then(res=>{
let cityArr = res
this.city.cityId = cityArr[0].code
this.city.cityList = cityArr
this.city.cityIndex = 0
this.regilist(cityArr[0].code)
})
},
// 市级下拉筛选
cityDrop(e) {
let city = this.city.cityList,
index = e.detail.value,
citycode = city[index].code
if (index != this.area.areaIndex) {
this.city.cityIndex = index
this.city.cityId = citycode
// 获取市级列表
this.regilist(citycode)
}
},
// 区列表
regilist(areaCode) {
children(areaCode).then(res=>{
this.regi.regiList = res
this.regi.regiId = res[0].code
this.regi.regiIndex = 0
})
},
// 区下拉筛选
regiDrop(e) {
let newIndex = e.detail.value
this.regi.regiIndex = newIndex
this.regi.regiId = this.regi.regiList[newIndex].code
},
// 获取用户名
getNameValue(e) {
this.name = e.detail.value
},
// 获取手机号
getTelValue(e) {
this.mobile = e.detail.value
},
// 获取详细地址
getAddressValue(e) {
this.address = e.detail.value
},
// 提交表单
siteform() {
exchangesBuy({
name : this.name,
mobile : this.mobile,
address : this.address,
activity_exchange_log_id: this.logId,
activity_exchange_item_goods_id: this.goodId,
qty : 1
}).then(res=>{
if(res.need_buy) {
this.tradeNo = res.trade_no
this.wxBrowser()
return
}
// 跳转兑换成功页
uni.redirectTo({
url: 'success'
})
}).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)
console.log("wechatPay")
jweixin.chooseWXPay({
timestamp: wechatPay.timeStamp,
nonceStr: wechatPay.nonceStr,
package: wechatPay.package,
signType: wechatPay.signType,
paySign: wechatPay.paySign,
success: payRes => {
console.log(payRes)
},
cancel: () =>{
}
})
})
})
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none'
})
if (!err.login) {
uni.reLaunch({
url: '/pages/draw/signin'
});
}
})
},
}
}
</script>
<style lang="scss">
.content {
padding: 30rpx 20rpx;
box-sizing: border-box;
}
.borderBottom {
border-bottom: 110rpx solid transparent;
}
.title {
position: relative;
width: 100%;
background-color: #2564ff;
height: 100rpx;
border-radius: 10rpx;
.title-img {
width: 100%;
height: 100%;
position: absolute;
height: 100rpx;
left: 0;
top: 0;
}
.title-top {
width: 100%;
height: 100%;
line-height: 100rpx;
position: absolute;
left: 0;
top: 0;
z-index: 9;
text-align: center;
font-size: 32rpx;
font-weight: 600;
color: #FFFFFF;
}
}
.choose {
margin: 30rpx -10rpx 0;
overflow: hidden;
.choose-radio-group {
overflow: hidden;
}
.choose-label {
width: calc(50% - 20rpx);
float: left;
margin: 0 10rpx;
border-radius: 10rpx;
background-color: #FFFFFF;
margin-bottom: 30rpx;
padding: 30rpx 20rpx;
box-sizing: border-box;
position: relative;
.choose-label-name {
.choose-label-img {
width: 100rpx;
height: 100rpx;
}
}
.radio {
position: absolute;
top: 20rpx;
right: 10rpx;
}
.choose-label-text {
margin-top: 20rpx;
font-weight: 600;
.choose-label-title {
margin-bottom: 30rpx;
font-size: 30rpx;
text {
font-weight: normal;
color: #bac0d7;
display: block;
font-size: 26rpx;
line-height: 54rpx;
}
}
.choose-label-price {
color: #fd7164;
font-size: 34rpx;
text {
font-size: 26rpx;
}
}
}
}
}
.chooseBuy {
position: fixed;
width: 100%;
height: 110rpx;
left: 0;
bottom: 0;
display: flex;
background-color: #FFFFFF;
padding: 30rpx;
box-sizing: border-box;
.chooseBuy-btn {
position: absolute;
right: 20rpx;
top: 26rpx;
background-color: #f24b44;
color: #FFFFFF;
height: 62rpx;
line-height: 60rpx;
margin: 0;
font-size: 28rpx;
padding: 0 35rpx;
}
.chooseBuy-name {
font-size: 32rpx;
line-height: 48rpx;
}
.chooseBuy-price {
font-size: 28rpx;
line-height: 50rpx;
color: #777b85;
text {
color: #f14646;
padding-left: 20rpx;
}
}
}
.chooseForm {
background-color: #FFFFFF;
margin: 0 15rpx;
border-radius: 10rpx;
.site-input {
font-size: 30rpx;
padding: 0 30rpx 0 220rpx;
box-sizing: border-box;
position: relative;
line-height: 100rpx;
min-height: 100rpx;
&::before {
position: absolute;
bottom: 0;
width: 100%;
left: 0rpx;
right: 0;
height: 1rpx;
content: "";
background: #e4e6f2;
}
&:last-child::before {
display: none;
}
label {
position: absolute;
left: 30rpx;
top: 0;
}
input {
font-size: 30rpx;
height: 110rpx;
}
image {
width: 38rpx;
height: 38rpx;
position: absolute;
right: 20rpx;
top: 32rpx;
}
}
}
</style>